Aggregate count variations (#9304)

Closes https://github.com/twentyhq/private-issues/issues/222

---------

Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
Marie
2025-01-02 17:35:05 +01:00
committed by GitHub
parent 0f1458cbe9
commit 5d857fbfb5
43 changed files with 650 additions and 203 deletions

View File

@ -0,0 +1,15 @@
import { FieldMetadataType } from 'src/types/FieldMetadataType';
import { getSubfieldForAggregateOperation } from 'src/utils/aggregateOperations/getSubFieldForAggregateOperation.util';
import { isCompositeFieldMetadataType } from 'src/utils/aggregateOperations/isCompositeFieldMetadataType.util';
import { capitalize } from 'src/utils/strings/capitalize';
export const getColumnNameForAggregateOperation = (
fieldName: string,
fieldType: FieldMetadataType,
) => {
if (!isCompositeFieldMetadataType(fieldType)) {
return fieldName;
}
return `${fieldName}${capitalize(getSubfieldForAggregateOperation(fieldType) as string)}`;
};

View File

@ -0,0 +1,29 @@
import { FieldMetadataType } from 'src/types/FieldMetadataType';
import { isCompositeFieldMetadataType } from 'src/utils/aggregateOperations/isCompositeFieldMetadataType.util';
export const getSubfieldForAggregateOperation = (
fieldType: FieldMetadataType,
) => {
if (!isCompositeFieldMetadataType(fieldType)) {
return undefined;
} else {
switch (fieldType) {
case FieldMetadataType.CURRENCY:
return 'amountMicros';
case FieldMetadataType.FULL_NAME:
return 'lastName';
case FieldMetadataType.ADDRESS:
return 'addressStreet1';
case FieldMetadataType.LINKS:
return 'primaryLinkLabel';
case FieldMetadataType.ACTOR:
return 'workspaceMemberId';
case FieldMetadataType.EMAILS:
return 'primaryEmail';
case FieldMetadataType.PHONES:
return 'primaryPhoneNumber';
default:
throw new Error(`Unsupported composite field type: ${fieldType}`);
}
}
};

View File

@ -0,0 +1,3 @@
export * from './getColumnNameForAggregateOperation.util';
export * from './getSubFieldForAggregateOperation.util';

View File

@ -0,0 +1,22 @@
import { FieldMetadataType } from 'src/types/FieldMetadataType';
export const isCompositeFieldMetadataType = (
type: FieldMetadataType,
): type is
| FieldMetadataType.CURRENCY
| FieldMetadataType.FULL_NAME
| FieldMetadataType.ADDRESS
| FieldMetadataType.LINKS
| FieldMetadataType.ACTOR
| FieldMetadataType.EMAILS
| FieldMetadataType.PHONES => {
return [
FieldMetadataType.CURRENCY,
FieldMetadataType.FULL_NAME,
FieldMetadataType.ADDRESS,
FieldMetadataType.LINKS,
FieldMetadataType.ACTOR,
FieldMetadataType.EMAILS,
FieldMetadataType.PHONES,
].includes(type);
};

View File

@ -0,0 +1,7 @@
import { isNonEmptyString } from '@sniptt/guards';
export const capitalize = (stringToCapitalize: string) => {
if (!isNonEmptyString(stringToCapitalize)) return '';
return stringToCapitalize[0].toUpperCase() + stringToCapitalize.slice(1);
};