Skip to content

Commit 0fd6085

Browse files
Prevent querying too much on worklow index page (#14916)
## Performance short term fix Done in this PR: workflowVersions and workflowRuns are heavy object. I'm preventing loading their data when they are loaded as relations. This will reduce the work on backend ## Long term fix Todo: We should make sure workflow data is ligher
1 parent 5300ec5 commit 0fd6085

File tree

7 files changed

+55
-32
lines changed

7 files changed

+55
-32
lines changed

packages/twenty-front/src/modules/object-record/graphql/utils/generateDepthOneRecordGqlFields.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
12
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
23
import { isDefined } from 'twenty-shared/utils';
34

@@ -17,7 +18,17 @@ export const generateDepthOneRecordGqlFields = ({
1718
[field.settings.joinColumnName]: true,
1819
}
1920
: {}),
20-
[field.name]: true,
21+
[field.name]:
22+
// TODO: Remove once we have made the workflows lighter
23+
(objectMetadataItem.nameSingular ===
24+
CoreObjectNameSingular.Workflow ||
25+
objectMetadataItem.nameSingular ===
26+
CoreObjectNameSingular.WorkflowVersion ||
27+
objectMetadataItem.nameSingular ===
28+
CoreObjectNameSingular.WorkflowRun) &&
29+
(field.name === 'versions' || field.name === 'runs')
30+
? { id: true, name: true }
31+
: true,
2132
};
2233
},
2334
{},

packages/twenty-front/src/modules/object-record/record-calendar/components/RecordIndexCalendarDataLoaderEffect.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
33
import { useRecordCalendarContextOrThrow } from '@/object-record/record-calendar/contexts/RecordCalendarContext';
44
import { RecordCalendarComponentInstanceContext } from '@/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext';
55
import { recordCalendarSelectedRecordIdsComponentSelector } from '@/object-record/record-calendar/states/selectors/recordCalendarSelectedRecordIdsComponentSelector';
6-
import { useRecordFieldGqlFields } from '@/object-record/record-field/hooks/useRecordTableRecordGqlFields';
6+
import { useRecordFieldGqlFields } from '@/object-record/record-field/hooks/useRecordFieldGqlFields';
77
import { useFindManyRecordIndexTableParams } from '@/object-record/record-index/hooks/useFindManyRecordIndexTableParams';
88
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
99
import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadata
22
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
33
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
44
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
5+
import { type RecordGqlFields } from '@/object-record/graphql/types/RecordGqlFields';
56
import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields';
67
import { generateDepthOneWithoutRelationsRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneWithoutRelationsRecordGqlFields';
78
import { visibleRecordFieldsComponentSelector } from '@/object-record/record-field/states/visibleRecordFieldsComponentSelector';
@@ -37,38 +38,50 @@ export const useRecordFieldGqlFields = ({
3738
objectMetadataItem,
3839
});
3940

40-
const gqlFieldsList = Object.fromEntries(
41-
visibleRecordFields.flatMap((recordField) => {
42-
const fieldMetadataItem: FieldMetadataItem | undefined =
43-
fieldMetadataItemByFieldMetadataItemId[recordField.fieldMetadataItemId];
41+
const gqlFieldsList: RecordGqlFields = Object.fromEntries(
42+
visibleRecordFields.flatMap(
43+
(recordField): [string, boolean | RecordGqlFields][] => {
44+
const fieldMetadataItem: FieldMetadataItem | undefined =
45+
fieldMetadataItemByFieldMetadataItemId[
46+
recordField.fieldMetadataItemId
47+
];
4448

45-
if (!isDefined(fieldMetadataItem)) {
46-
throw new Error(
47-
`Field ${recordField.fieldMetadataItemId} is missing, please refresh the page. If the problem persists, please contact support.`,
48-
);
49-
}
49+
if (!isDefined(fieldMetadataItem)) {
50+
throw new Error(
51+
`Field ${recordField.fieldMetadataItemId} is missing, please refresh the page. If the problem persists, please contact support.`,
52+
);
53+
}
5054

51-
const isMorphRelation =
52-
fieldMetadataItem.type === FieldMetadataType.MORPH_RELATION;
55+
// TODO: remove this once we have made the workflowVersion lighter
56+
if (
57+
fieldMetadataItem.name === 'versions' ||
58+
fieldMetadataItem.name === 'workflowVersion'
59+
) {
60+
return [[fieldMetadataItem.name, { id: true, name: true }]];
61+
}
5362

54-
if (!isMorphRelation) {
55-
return [[fieldMetadataItem.name, true]];
56-
}
63+
const isMorphRelation =
64+
fieldMetadataItem.type === FieldMetadataType.MORPH_RELATION;
5765

58-
if (!isDefined(fieldMetadataItem.morphRelations)) {
59-
throw new Error(
60-
`Field ${fieldMetadataItem.name} is missing, please refresh the page. If the problem persists, please contact support.`,
61-
);
62-
}
66+
if (!isMorphRelation) {
67+
return [[fieldMetadataItem.name, true]];
68+
}
6369

64-
return fieldMetadataItem.morphRelations.map((morphRelation) => [
65-
morphRelation.sourceFieldMetadata.name,
66-
true,
67-
]);
68-
}),
70+
if (!isDefined(fieldMetadataItem.morphRelations)) {
71+
throw new Error(
72+
`Field ${fieldMetadataItem.name} is missing, please refresh the page. If the problem persists, please contact support.`,
73+
);
74+
}
75+
76+
return fieldMetadataItem.morphRelations.map((morphRelation) => [
77+
morphRelation.sourceFieldMetadata.name,
78+
true,
79+
]);
80+
},
81+
),
6982
);
7083

71-
const recordGqlFields: Record<string, any> = {
84+
return {
7285
...allDepthOneWithoutRelationsRecordGqlFields,
7386
...gqlFieldsList,
7487
noteTargets: generateDepthOneRecordGqlFields({
@@ -78,6 +91,4 @@ export const useRecordFieldGqlFields = ({
7891
objectMetadataItem: taskTargetObjectMetadataItem,
7992
}),
8093
};
81-
82-
return recordGqlFields;
8394
};

packages/twenty-front/src/modules/object-record/record-index/hooks/useRecordIndexTableFetchMore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
22
import { useLazyFindManyRecords } from '@/object-record/hooks/useLazyFindManyRecords';
3-
import { useRecordFieldGqlFields } from '@/object-record/record-field/hooks/useRecordTableRecordGqlFields';
3+
import { useRecordFieldGqlFields } from '@/object-record/record-field/hooks/useRecordFieldGqlFields';
44
import { useFindManyRecordIndexTableParams } from '@/object-record/record-index/hooks/useFindManyRecordIndexTableParams';
55

66
export const useRecordIndexTableFetchMore = (objectNameSingular: string) => {

packages/twenty-front/src/modules/object-record/record-index/hooks/useRecordIndexTableQuery.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
22
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
3-
import { useRecordFieldGqlFields } from '@/object-record/record-field/hooks/useRecordTableRecordGqlFields';
3+
import { useRecordFieldGqlFields } from '@/object-record/record-field/hooks/useRecordFieldGqlFields';
44
import { useFindManyRecordIndexTableParams } from '@/object-record/record-index/hooks/useFindManyRecordIndexTableParams';
55
import { SIGN_IN_BACKGROUND_MOCK_COMPANIES } from '@/sign-in-background-mock/constants/SignInBackgroundMockCompanies';
66
import { useShowAuthModal } from '@/ui/layout/hooks/useShowAuthModal';

packages/twenty-front/src/modules/workflow/hooks/useActiveWorkflowVersionsWithManualTrigger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export const useActiveWorkflowVersionsWithManualTrigger = ({
5353
const { records } = useFindManyRecords<
5454
Pick<
5555
ManualTriggerWorkflowVersion,
56-
'id' | '__typename' | 'trigger' | 'status' | 'workflowId'
56+
'id' | '__typename' | 'status' | 'workflowId' | 'trigger'
5757
> & {
5858
workflow: Workflow;
5959
}

packages/twenty-front/src/modules/workflow/hooks/useWorkflowWithCurrentVersion.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { isDefined } from 'twenty-shared/utils';
1010
export const useWorkflowWithCurrentVersion = (
1111
workflowId: string | undefined,
1212
): WorkflowWithCurrentVersion | undefined => {
13+
// TODO: we should only load the data for the current version
1314
const { record: workflow } = useFindOneRecord<Workflow>({
1415
objectNameSingular: CoreObjectNameSingular.Workflow,
1516
objectRecordId: workflowId,

0 commit comments

Comments
 (0)