0f1cf0e4e9
## Context This PR introduces a first aggregation for a composite field ## Test <img width="1074" alt="Screenshot 2024-11-15 at 15 37 05" src="https://github.com/user-attachments/assets/db2563f9-26b7-421f-9431-48fc13bce49e">
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { SelectQueryBuilder } from 'typeorm';
|
|
|
|
import { AggregationField } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-available-aggregations-from-object-fields.util';
|
|
import { formatColumnNameFromCompositeFieldAndSubfield } from 'src/engine/twenty-orm/utils/format-column-name-from-composite-field-and-subfield.util';
|
|
import { isDefined } from 'src/utils/is-defined';
|
|
|
|
export class ProcessAggregateHelper {
|
|
public addSelectedAggregatedFieldsQueriesToQueryBuilder = ({
|
|
selectedAggregatedFields,
|
|
queryBuilder,
|
|
}: {
|
|
selectedAggregatedFields: Record<string, AggregationField>;
|
|
queryBuilder: SelectQueryBuilder<any>;
|
|
}) => {
|
|
queryBuilder.select([]);
|
|
|
|
for (const [aggregatedFieldName, aggregatedField] of Object.entries(
|
|
selectedAggregatedFields,
|
|
)) {
|
|
if (
|
|
!isDefined(aggregatedField?.fromField) ||
|
|
!isDefined(aggregatedField?.aggregationOperation)
|
|
) {
|
|
continue;
|
|
}
|
|
|
|
const columnName = formatColumnNameFromCompositeFieldAndSubfield(
|
|
aggregatedField.fromField,
|
|
aggregatedField.fromSubField,
|
|
);
|
|
const operation = aggregatedField.aggregationOperation;
|
|
|
|
queryBuilder.addSelect(
|
|
`${operation}("${columnName}")`,
|
|
`${aggregatedFieldName}`,
|
|
);
|
|
}
|
|
};
|
|
}
|