First step of https://github.com/twentyhq/twenty/issues/6868 Adds min.., max.. queries for DATETIME fields adds min.., max.., avg.., sum.. queries for NUMBER fields (count distinct operation and composite fields such as CURRENCY handling will be dealt with in a future PR) <img width="1422" alt="Capture d’écran 2024-11-06 à 15 48 46" src="https://github.com/user-attachments/assets/4bcdece0-ad3e-4536-9720-fe4044a36719"> --------- Co-authored-by: Charles Bochet <charles@twenty.com> Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
@ -1,8 +1,8 @@
|
||||
import {
|
||||
ObjectRecordFilter,
|
||||
ObjectRecordOrderBy,
|
||||
OrderByDirection,
|
||||
RecordFilter,
|
||||
RecordOrderBy,
|
||||
} from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface';
|
||||
} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface';
|
||||
|
||||
import {
|
||||
GraphqlQueryRunnerException,
|
||||
@ -11,14 +11,14 @@ import {
|
||||
import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types';
|
||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/utils/generate-object-metadata-map.util';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
|
||||
export const computeCursorArgFilter = (
|
||||
cursor: Record<string, any>,
|
||||
orderBy: RecordOrderBy,
|
||||
fieldMetadataMap: FieldMetadataMap,
|
||||
orderBy: ObjectRecordOrderBy,
|
||||
fieldMetadataMapByName: FieldMetadataMap,
|
||||
isForwardPagination = true,
|
||||
): RecordFilter[] => {
|
||||
): ObjectRecordFilter[] => {
|
||||
const cursorKeys = Object.keys(cursor ?? {});
|
||||
const cursorValues = Object.values(cursor ?? {});
|
||||
|
||||
@ -39,7 +39,7 @@ export const computeCursorArgFilter = (
|
||||
...buildWhereCondition(
|
||||
cursorKeys[subConditionIndex],
|
||||
cursorValues[subConditionIndex],
|
||||
fieldMetadataMap,
|
||||
fieldMetadataMapByName,
|
||||
'eq',
|
||||
),
|
||||
};
|
||||
@ -68,18 +68,18 @@ export const computeCursorArgFilter = (
|
||||
|
||||
return {
|
||||
...whereCondition,
|
||||
...buildWhereCondition(key, value, fieldMetadataMap, operator),
|
||||
} as RecordFilter;
|
||||
...buildWhereCondition(key, value, fieldMetadataMapByName, operator),
|
||||
} as ObjectRecordFilter;
|
||||
});
|
||||
};
|
||||
|
||||
const buildWhereCondition = (
|
||||
key: string,
|
||||
value: any,
|
||||
fieldMetadataMap: FieldMetadataMap,
|
||||
fieldMetadataMapByName: FieldMetadataMap,
|
||||
operator: string,
|
||||
): Record<string, any> => {
|
||||
const fieldMetadata = fieldMetadataMap[key];
|
||||
const fieldMetadata = fieldMetadataMapByName[key];
|
||||
|
||||
if (!fieldMetadata) {
|
||||
throw new GraphqlQueryRunnerException(
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import {
|
||||
Record as IRecord,
|
||||
RecordOrderBy,
|
||||
} from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface';
|
||||
ObjectRecord,
|
||||
ObjectRecordOrderBy,
|
||||
} from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface';
|
||||
import { FindManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
|
||||
|
||||
import {
|
||||
@ -24,9 +24,9 @@ export const decodeCursor = (cursor: string): CursorData => {
|
||||
}
|
||||
};
|
||||
|
||||
export const encodeCursor = <ObjectRecord extends IRecord = IRecord>(
|
||||
objectRecord: ObjectRecord,
|
||||
order: RecordOrderBy | undefined,
|
||||
export const encodeCursor = <T extends ObjectRecord = ObjectRecord>(
|
||||
objectRecord: T,
|
||||
order: ObjectRecordOrderBy | undefined,
|
||||
): string => {
|
||||
const orderByValues: Record<string, any> = {};
|
||||
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
import {
|
||||
GraphqlQueryRunnerException,
|
||||
GraphqlQueryRunnerExceptionCode,
|
||||
} from 'src/engine/api/graphql/graphql-query-runner/errors/graphql-query-runner.exception';
|
||||
import { ObjectMetadataMapItem } from 'src/engine/metadata-modules/utils/generate-object-metadata-map.util';
|
||||
|
||||
export const getObjectMetadataOrThrow = (
|
||||
objectMetadataMap: Record<string, any>,
|
||||
objectName: string,
|
||||
): ObjectMetadataMapItem => {
|
||||
const objectMetadata = objectMetadataMap[objectName];
|
||||
|
||||
if (!objectMetadata) {
|
||||
throw new GraphqlQueryRunnerException(
|
||||
`Object metadata not found for ${objectName}`,
|
||||
GraphqlQueryRunnerExceptionCode.OBJECT_METADATA_NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
return objectMetadata;
|
||||
};
|
||||
@ -1,7 +1,7 @@
|
||||
import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface';
|
||||
|
||||
import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||
import { ObjectMetadataMap } from 'src/engine/metadata-modules/utils/generate-object-metadata-map.util';
|
||||
import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
|
||||
import {
|
||||
deduceRelationDirection,
|
||||
RelationDirection,
|
||||
@ -9,7 +9,7 @@ import {
|
||||
|
||||
export const getRelationObjectMetadata = (
|
||||
fieldMetadata: FieldMetadataInterface,
|
||||
objectMetadataMap: ObjectMetadataMap,
|
||||
objectMetadataMaps: ObjectMetadataMaps,
|
||||
) => {
|
||||
const relationMetadata = getRelationMetadata(fieldMetadata);
|
||||
|
||||
@ -20,8 +20,8 @@ export const getRelationObjectMetadata = (
|
||||
|
||||
const referencedObjectMetadata =
|
||||
relationDirection === RelationDirection.TO
|
||||
? objectMetadataMap[relationMetadata.fromObjectMetadataId]
|
||||
: objectMetadataMap[relationMetadata.toObjectMetadataId];
|
||||
? objectMetadataMaps.byId[relationMetadata.fromObjectMetadataId]
|
||||
: objectMetadataMaps.byId[relationMetadata.toObjectMetadataId];
|
||||
|
||||
if (!referencedObjectMetadata) {
|
||||
throw new Error(
|
||||
|
||||
Reference in New Issue
Block a user