[DASHBOARDS] Add split multi-value fields setting for charts (#17907)
closes https://github.com/twentyhq/twenty/issues/17890 https://github.com/user-attachments/assets/dbf2ebe6-c2da-44d0-846e-d7fa9fac5f43
This commit is contained in:
+1
@@ -6,6 +6,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m
|
||||
export type GroupByRegularField = {
|
||||
fieldMetadata: FlatFieldMetadata;
|
||||
subFieldName?: string;
|
||||
shouldUnnest?: boolean;
|
||||
};
|
||||
|
||||
export type GroupByDateField = {
|
||||
|
||||
+46
-1
@@ -3,7 +3,10 @@ import {
|
||||
ObjectRecordGroupByDateGranularity,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
import { type GroupByDateField } from 'src/engine/api/common/common-query-runners/types/group-by-field.types';
|
||||
import {
|
||||
type GroupByDateField,
|
||||
type GroupByRegularField,
|
||||
} from 'src/engine/api/common/common-query-runners/types/group-by-field.types';
|
||||
import { getGroupByExpression } from 'src/engine/api/common/common-query-runners/utils/get-group-by-expression.util';
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
|
||||
@@ -23,6 +26,16 @@ const buildGroupByDateField = (
|
||||
...overrides,
|
||||
});
|
||||
|
||||
const buildGroupByRegularField = (
|
||||
overrides: Partial<GroupByRegularField> = {},
|
||||
): GroupByRegularField => ({
|
||||
fieldMetadata: {
|
||||
type: FieldMetadataType.MULTI_SELECT,
|
||||
name: 'tags',
|
||||
} as FlatFieldMetadata,
|
||||
...overrides,
|
||||
});
|
||||
|
||||
describe('getGroupByExpression', () => {
|
||||
const columnNameWithQuotes = '"company"."createdAt"';
|
||||
|
||||
@@ -126,4 +139,36 @@ describe('getGroupByExpression', () => {
|
||||
expect(result).not.toContain('AT TIME ZONE');
|
||||
});
|
||||
});
|
||||
|
||||
describe('array unnest handling', () => {
|
||||
const arrayColumnNameWithQuotes = '"company"."tags"';
|
||||
|
||||
it('should unnest array fields when split mode is enabled', () => {
|
||||
const groupByField = buildGroupByRegularField({
|
||||
shouldUnnest: true,
|
||||
});
|
||||
|
||||
const result = getGroupByExpression({
|
||||
groupByField,
|
||||
columnNameWithQuotes: arrayColumnNameWithQuotes,
|
||||
});
|
||||
|
||||
expect(result).toBe(
|
||||
`UNNEST(CASE WHEN CARDINALITY(${arrayColumnNameWithQuotes}) > 0 THEN ${arrayColumnNameWithQuotes} ELSE ARRAY[${arrayColumnNameWithQuotes}[1]] END)`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should keep plain column expression when split mode is disabled', () => {
|
||||
const groupByField = buildGroupByRegularField({
|
||||
shouldUnnest: false,
|
||||
});
|
||||
|
||||
const result = getGroupByExpression({
|
||||
groupByField,
|
||||
columnNameWithQuotes: arrayColumnNameWithQuotes,
|
||||
});
|
||||
|
||||
expect(result).toBe(arrayColumnNameWithQuotes);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+4
@@ -30,6 +30,10 @@ export const getGroupByExpression = ({
|
||||
if (
|
||||
!(isGroupByDateField(groupByField) || isGroupByRelationField(groupByField))
|
||||
) {
|
||||
if ('shouldUnnest' in groupByField && groupByField.shouldUnnest) {
|
||||
return `UNNEST(CASE WHEN CARDINALITY(${columnNameWithQuotes}) > 0 THEN ${columnNameWithQuotes} ELSE ARRAY[${columnNameWithQuotes}[1]] END)`;
|
||||
}
|
||||
|
||||
return columnNameWithQuotes;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user