From e7857d7fa36732be4d21e8da5572efa40101eab8 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Wed, 6 Mar 2024 13:59:42 +0100 Subject: [PATCH] Improve performance on findMany queries (#4334) * Improve performance on findMany queries * Fix --- .../modules/activities/hooks/useActivities.ts | 1 + .../useMapFieldMetadataToGraphQLQuery.ts | 123 ++++++++---------- .../cache/hooks/useAddRecordInCache.ts | 2 +- .../useGenerateFindDuplicateRecordsQuery.ts | 2 +- ...anyRecordsForMultipleMetadataItemsQuery.ts | 2 +- .../hooks/useGenerateFindManyRecordsQuery.ts | 2 +- .../hooks/useGenerateFindOneRecordQuery.ts | 2 +- packages/twenty-front/tsconfig.app.json | 5 +- packages/twenty-front/tsup.ui.index.tsx | 2 +- 9 files changed, 64 insertions(+), 77 deletions(-) diff --git a/packages/twenty-front/src/modules/activities/hooks/useActivities.ts b/packages/twenty-front/src/modules/activities/hooks/useActivities.ts index 0806cece8..78283f883 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useActivities.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useActivities.ts @@ -69,6 +69,7 @@ export const useActivities = ({ useFindManyRecords({ skip: skipActivities, objectNameSingular: CoreObjectNameSingular.Activity, + depth: 3, filter, orderBy: activitiesOrderByVariables, onCompleted: useRecoilCallback( diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts index 7c775d4ad..9ceb18892 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts @@ -10,17 +10,11 @@ export const useMapFieldMetadataToGraphQLQuery = () => { const mapFieldMetadataToGraphQLQuery = ({ field, - maxDepthForRelations = 2, - onlyTypenameAndIdOnDeepestRelationFields = false, + depth = 2, }: { field: FieldMetadataItem; - maxDepthForRelations?: number; - onlyTypenameAndIdOnDeepestRelationFields?: boolean; + depth?: number; }): any => { - if (maxDepthForRelations <= 0) { - return ''; - } - // TODO: parse const fieldType = field.type as FieldType; @@ -50,26 +44,23 @@ export const useMapFieldMetadataToGraphQLQuery = () => { (field.toRelationMetadata as any)?.fromObjectMetadata?.id, ); - let subfieldQuery = ''; - - if (maxDepthForRelations > 0) { - subfieldQuery = `${(relationMetadataItem?.fields ?? []) - .map((field) => - mapFieldMetadataToGraphQLQuery({ - field, - maxDepthForRelations: maxDepthForRelations - 1, - onlyTypenameAndIdOnDeepestRelationFields, - }), - ) - .join('\n')}`; + if (depth > 1) { + return `${field.name} + { + __typename + id + ${(relationMetadataItem?.fields ?? []) + .map((field) => + mapFieldMetadataToGraphQLQuery({ + field, + depth: depth - 1, + }), + ) + .join('\n')} + }`; + } else { + return ''; } - - return `${field.name} - { - __typename - id - ${subfieldQuery} - }`; } else if ( fieldType === 'RELATION' && field.toRelationMetadata?.relationType === 'ONE_TO_ONE' @@ -80,26 +71,23 @@ export const useMapFieldMetadataToGraphQLQuery = () => { (field.toRelationMetadata as any)?.fromObjectMetadata?.id, ); - let subfieldQuery = ''; - - if (maxDepthForRelations > 0) { - subfieldQuery = `${(relationMetadataItem?.fields ?? []) - .map((field) => - mapFieldMetadataToGraphQLQuery({ - field, - maxDepthForRelations: maxDepthForRelations - 1, - onlyTypenameAndIdOnDeepestRelationFields, - }), - ) - .join('\n')}`; + if (depth > 1) { + return `${field.name} + { + __typename + id + ${(relationMetadataItem?.fields ?? []) + .map((field) => + mapFieldMetadataToGraphQLQuery({ + field, + depth: depth - 1, + }), + ) + .join('\n')} + }`; + } else { + return ''; } - - return `${field.name} - { - __typename - id - ${subfieldQuery} - }`; } else if ( fieldType === 'RELATION' && field.fromRelationMetadata?.relationType === 'ONE_TO_MANY' @@ -110,30 +98,27 @@ export const useMapFieldMetadataToGraphQLQuery = () => { (field.fromRelationMetadata as any)?.toObjectMetadata?.id, ); - let subfieldQuery = ''; - - if (maxDepthForRelations > 0) { - subfieldQuery = `${(relationMetadataItem?.fields ?? []) - .map((field) => - mapFieldMetadataToGraphQLQuery({ - field, - maxDepthForRelations: maxDepthForRelations - 1, - onlyTypenameAndIdOnDeepestRelationFields, - }), - ) - .join('\n')}`; - } - - return `${field.name} - { - edges { - node { - __typename - id - ${subfieldQuery} + if (depth > 1) { + return `${field.name} + { + edges { + node { + __typename + id + ${(relationMetadataItem?.fields ?? []) + .map((field) => + mapFieldMetadataToGraphQLQuery({ + field, + depth: depth - 1, + }), + ) + .join('\n')} + } } - } - }`; + }`; + } else { + return ''; + } } else if (fieldType === 'LINK') { return ` ${field.name} diff --git a/packages/twenty-front/src/modules/object-record/cache/hooks/useAddRecordInCache.ts b/packages/twenty-front/src/modules/object-record/cache/hooks/useAddRecordInCache.ts index afc2af6e5..46a908f1f 100644 --- a/packages/twenty-front/src/modules/object-record/cache/hooks/useAddRecordInCache.ts +++ b/packages/twenty-front/src/modules/object-record/cache/hooks/useAddRecordInCache.ts @@ -36,7 +36,7 @@ export const useAddRecordInCache = ({ .map((field) => mapFieldMetadataToGraphQLQuery({ field, - maxDepthForRelations: MAX_QUERY_DEPTH_FOR_CACHE_INJECTION, + depth: MAX_QUERY_DEPTH_FOR_CACHE_INJECTION, }), ) .join('\n')} diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindDuplicateRecordsQuery.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindDuplicateRecordsQuery.ts index 0f5911b71..eaf214934 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindDuplicateRecordsQuery.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindDuplicateRecordsQuery.ts @@ -29,7 +29,7 @@ export const useGenerateFindDuplicateRecordsQuery = () => { .map((field) => mapFieldMetadataToGraphQLQuery({ field, - maxDepthForRelations: depth, + depth, }), ) .join('\n')} diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.ts index 3ae1bf241..2874d32e3 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.ts @@ -74,7 +74,7 @@ export const useGenerateFindManyRecordsForMultipleMetadataItemsQuery = ({ .map((field) => mapFieldMetadataToGraphQLQuery({ field, - maxDepthForRelations: depth, + depth, }), ) .join('\n')} diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsQuery.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsQuery.ts index 46cd279fc..623a0416c 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsQuery.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindManyRecordsQuery.ts @@ -31,7 +31,7 @@ export const useGenerateFindManyRecordsQuery = () => { .map((field) => mapFieldMetadataToGraphQLQuery({ field, - maxDepthForRelations: depth, + depth, }), ) .join('\n')} diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindOneRecordQuery.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindOneRecordQuery.ts index 7134cfea9..e4f7b41c2 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindOneRecordQuery.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateFindOneRecordQuery.ts @@ -28,7 +28,7 @@ export const useGenerateFindOneRecordQuery = () => { .map((field) => mapFieldMetadataToGraphQLQuery({ field, - maxDepthForRelations: depth, + depth, }), ) .join('\n')} diff --git a/packages/twenty-front/tsconfig.app.json b/packages/twenty-front/tsconfig.app.json index 98eac967e..b64e99dc1 100644 --- a/packages/twenty-front/tsconfig.app.json +++ b/packages/twenty-front/tsconfig.app.json @@ -9,7 +9,8 @@ "**/*.spec.tsx", "**/*.test.tsx", "jest.config.ts", - "tsup.config.ts" + "tsup.config.ts", + "tsup.ui.index.tsx" ], - "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] } diff --git a/packages/twenty-front/tsup.ui.index.tsx b/packages/twenty-front/tsup.ui.index.tsx index 4c43d40a5..a2943a2d0 100644 --- a/packages/twenty-front/tsup.ui.index.tsx +++ b/packages/twenty-front/tsup.ui.index.tsx @@ -28,7 +28,7 @@ export * from './src/modules/ui/input/button/components/FloatingButtonGroup' export * from './src/modules/ui/input/button/components/FloatingIconButton' export * from './src/modules/ui/input/button/components/FloatingIconButtonGroup' export * from './src/modules/ui/input/button/components/LightButton' -export * from '@/ui/navigation/link/components/ActionLink.tsx' +export * from './src/modules/ui/navigation/link/components/ActionLink.tsx' export * from './src/modules/ui/input/button/components/LightIconButton' export * from './src/modules/ui/input/button/components/MainButton' export * from './src/modules/ui/input/button/components/RoundedIconButton'