@finos/legend-application-query 13.6.9 → 13.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/lib/application/LegendQueryApplicationConfig.d.ts +1 -0
  2. package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendQueryApplicationConfig.js +2 -0
  4. package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
  5. package/lib/components/Core_LegendQueryApplicationPlugin.d.ts +3 -2
  6. package/lib/components/Core_LegendQueryApplicationPlugin.d.ts.map +1 -1
  7. package/lib/components/Core_LegendQueryApplicationPlugin.js +157 -4
  8. package/lib/components/Core_LegendQueryApplicationPlugin.js.map +1 -1
  9. package/lib/components/QueryEditor.d.ts.map +1 -1
  10. package/lib/components/QueryEditor.js +9 -2
  11. package/lib/components/QueryEditor.js.map +1 -1
  12. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.d.ts +2 -2
  13. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.d.ts.map +1 -1
  14. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js +38 -10
  15. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js.map +1 -1
  16. package/lib/index.css +1 -1
  17. package/lib/package.json +1 -1
  18. package/lib/stores/LegendQueryApplicationPlugin.d.ts +4 -3
  19. package/lib/stores/LegendQueryApplicationPlugin.d.ts.map +1 -1
  20. package/lib/stores/LegendQueryApplicationPlugin.js +0 -1
  21. package/lib/stores/LegendQueryApplicationPlugin.js.map +1 -1
  22. package/lib/stores/QueryEditorStore.d.ts +13 -2
  23. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  24. package/lib/stores/QueryEditorStore.js +135 -30
  25. package/lib/stores/QueryEditorStore.js.map +1 -1
  26. package/lib/stores/data-space/DataSpaceQueryCreatorStore.d.ts +2 -1
  27. package/lib/stores/data-space/DataSpaceQueryCreatorStore.d.ts.map +1 -1
  28. package/lib/stores/data-space/DataSpaceQueryCreatorStore.js +8 -12
  29. package/lib/stores/data-space/DataSpaceQueryCreatorStore.js.map +1 -1
  30. package/lib/stores/data-space/DataSpaceQuerySetupState.d.ts +1 -0
  31. package/lib/stores/data-space/DataSpaceQuerySetupState.d.ts.map +1 -1
  32. package/lib/stores/data-space/DataSpaceQuerySetupState.js +1 -0
  33. package/lib/stores/data-space/DataSpaceQuerySetupState.js.map +1 -1
  34. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.d.ts +3 -1
  35. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.d.ts.map +1 -1
  36. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.js +41 -24
  37. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.js.map +1 -1
  38. package/package.json +8 -8
  39. package/src/application/LegendQueryApplicationConfig.ts +3 -0
  40. package/src/components/Core_LegendQueryApplicationPlugin.tsx +281 -7
  41. package/src/components/QueryEditor.tsx +25 -1
  42. package/src/components/__test-utils__/QueryEditorComponentTestUtils.tsx +62 -24
  43. package/src/stores/LegendQueryApplicationPlugin.tsx +6 -5
  44. package/src/stores/QueryEditorStore.ts +254 -53
  45. package/src/stores/data-space/DataSpaceQueryCreatorStore.ts +17 -28
  46. package/src/stores/data-space/DataSpaceQuerySetupState.ts +1 -0
  47. package/src/stores/data-space/DataSpaceTemplateQueryCreatorStore.ts +73 -51
@@ -15,9 +15,9 @@
15
15
  */
16
16
 
17
17
  import {
18
+ type QuerySetupActionConfiguration,
18
19
  LegendQueryApplicationPlugin,
19
20
  QuerySetupActionTag,
20
- type QuerySetupActionConfiguration,
21
21
  } from '../stores/LegendQueryApplicationPlugin.js';
22
22
  import packageJson from '../../package.json' with { type: 'json' };
23
23
  import type { QuerySetupLandingPageStore } from '../stores/QuerySetupStore.js';
@@ -50,10 +50,10 @@ import {
50
50
  LEGEND_QUERY_ROUTE_PATTERN,
51
51
  } from '../__lib__/LegendQueryNavigation.js';
52
52
  import {
53
- ActionAlertActionType,
54
- ActionAlertType,
55
53
  type ApplicationPageEntry,
56
54
  type LegendApplicationSetup,
55
+ ActionAlertActionType,
56
+ ActionAlertType,
57
57
  } from '@finos/legend-application';
58
58
  import { CloneQueryServiceSetup } from './CloneQueryServiceSetup.js';
59
59
  import { QueryProductionizerSetup } from './QueryProductionizerSetup.js';
@@ -65,9 +65,11 @@ import {
65
65
  generateDataSpaceQuerySetupRoute,
66
66
  } from '../__lib__/DSL_DataSpace_LegendQueryNavigation.js';
67
67
  import {
68
- QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS,
68
+ type QueryBuilderState,
69
69
  type QueryBuilderHeaderActionConfiguration,
70
70
  type QueryBuilderMenuActionConfiguration,
71
+ type QueryBuilderPropagateExecutionContextChangeHelper,
72
+ QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS,
71
73
  } from '@finos/legend-query-builder';
72
74
  import {
73
75
  ExistingQueryEditorStore,
@@ -75,18 +77,48 @@ import {
75
77
  } from '../stores/QueryEditorStore.js';
76
78
  import {
77
79
  DataSpaceQueryBuilderState,
80
+ DataSpacesDepotRepository,
78
81
  generateDataSpaceTemplateQueryPromotionRoute,
79
82
  } from '@finos/legend-extension-dsl-data-space/application';
80
- import { RuntimePointer } from '@finos/legend-graph';
83
+ import {
84
+ createGraphBuilderReport,
85
+ GRAPH_MANAGER_EVENT,
86
+ LegendSDLC,
87
+ PackageableElementPointerType,
88
+ resolvePackagePathAndElementName,
89
+ RuntimePointer,
90
+ V1_EngineRuntime,
91
+ V1_Mapping,
92
+ V1_PackageableElementPointer,
93
+ V1_PackageableRuntime,
94
+ V1_PureGraphManager,
95
+ } from '@finos/legend-graph';
81
96
  import { LegendQueryTelemetryHelper } from '../__lib__/LegendQueryTelemetryHelper.js';
82
- import { StoreProjectData } from '@finos/legend-server-depot';
83
- import { buildUrl } from '@finos/legend-shared';
97
+ import { resolveVersion, StoreProjectData } from '@finos/legend-server-depot';
98
+ import {
99
+ ActionState,
100
+ assertErrorThrown,
101
+ buildUrl,
102
+ getNullableFirstEntry,
103
+ guaranteeNonNullable,
104
+ guaranteeType,
105
+ LogEvent,
106
+ StopWatch,
107
+ uniq,
108
+ } from '@finos/legend-shared';
84
109
  import { parseProjectIdentifier } from '@finos/legend-storage';
85
110
  import { QueryEditorExistingQueryHeader } from './QueryEditor.js';
86
111
  import { DataSpaceTemplateQueryCreatorStore } from '../stores/data-space/DataSpaceTemplateQueryCreatorStore.js';
87
112
  import { createViewSDLCProjectHandler } from '../stores/data-space/DataSpaceQueryBuilderHelper.js';
88
113
  import { DataSpaceQueryCreatorStore } from '../stores/data-space/DataSpaceQueryCreatorStore.js';
89
114
  import { configureCodeEditorComponent } from '@finos/legend-lego/code-editor';
115
+ import {
116
+ resolveUsableDataSpaceClasses,
117
+ V1_DataSpace,
118
+ V1_DataSpaceExecutionContext,
119
+ } from '@finos/legend-extension-dsl-data-space/graph';
120
+ import { flowResult } from 'mobx';
121
+ import { LEGEND_QUERY_APP_EVENT } from '../__lib__/LegendQueryEvent.js';
90
122
 
91
123
  export class Core_LegendQueryApplicationPlugin extends LegendQueryApplicationPlugin {
92
124
  static NAME = packageJson.extensions.applicationQueryPlugin;
@@ -725,4 +757,246 @@ export class Core_LegendQueryApplicationPlugin extends LegendQueryApplicationPlu
725
757
  },
726
758
  };
727
759
  }
760
+
761
+ getExtraQueryBuilderPropagateExecutionContextChangeHelper?(): QueryBuilderPropagateExecutionContextChangeHelper[] {
762
+ return [
763
+ (
764
+ queryBuilderState: QueryBuilderState,
765
+ isGraphBuildingNotRequired?: boolean,
766
+ ): (() => Promise<void>) | undefined => {
767
+ /**
768
+ * Propagation after changing the execution context:
769
+ * - The mapping will be updated to the mapping of the execution context
770
+ * - The runtime will be updated to the default runtime of the execution context
771
+ * - If no class is chosen, try to choose a compatible class
772
+ * - If the chosen class is compatible with the new selected execution context mapping, do nothing, otherwise, try to choose a compatible class
773
+ */
774
+ const propagateExecutionContextChange = async (): Promise<void> => {
775
+ const dataSpaceQueryBuilderState = guaranteeType(
776
+ queryBuilderState,
777
+ DataSpaceQueryBuilderState,
778
+ );
779
+ const mapping =
780
+ dataSpaceQueryBuilderState.executionContext.mapping.value;
781
+ const mappingModelCoverageAnalysisResult =
782
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult?.mappingToMappingCoverageResult?.get(
783
+ mapping.path,
784
+ );
785
+ const editorStore = (
786
+ queryBuilderState.workflowState
787
+ .actionConfig as QueryBuilderActionConfig_QueryApplication
788
+ ).editorStore;
789
+ if (
790
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult &&
791
+ mappingModelCoverageAnalysisResult
792
+ ) {
793
+ if (
794
+ !isGraphBuildingNotRequired &&
795
+ dataSpaceQueryBuilderState.isLightGraphEnabled
796
+ ) {
797
+ const supportBuildMinimalGraph =
798
+ editorStore.applicationStore.config.options
799
+ .TEMPORARY__enableMinimalGraph;
800
+ if (
801
+ editorStore.enableMinialGraphForDataSpaceLoadingPerformance &&
802
+ supportBuildMinimalGraph
803
+ ) {
804
+ try {
805
+ const stopWatch = new StopWatch();
806
+ const graph =
807
+ dataSpaceQueryBuilderState.graphManagerState.createNewGraph();
808
+ const graph_buildReport = createGraphBuilderReport();
809
+ const graphManager = guaranteeType(
810
+ dataSpaceQueryBuilderState.graphManagerState.graphManager,
811
+ V1_PureGraphManager,
812
+ );
813
+ // Create dummy mappings and runtimes
814
+ // TODO?: these stubbed mappings and runtimes are not really useful that useful, so either we should
815
+ // simplify the model here or potentially refactor the backend analytics endpoint to return these as model
816
+ const mappingModels = uniq(
817
+ Array.from(
818
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.executionContextsIndex.values(),
819
+ ).map((context) => context.mapping),
820
+ ).map((m) => {
821
+ const _mapping = new V1_Mapping();
822
+ const [packagePath, name] =
823
+ resolvePackagePathAndElementName(m.path);
824
+ _mapping.package = packagePath;
825
+ _mapping.name = name;
826
+ return graphManager.elementProtocolToEntity(_mapping);
827
+ });
828
+ const runtimeModels = uniq(
829
+ Array.from(
830
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.executionContextsIndex.values(),
831
+ )
832
+ .map((context) => context.defaultRuntime)
833
+ .concat(
834
+ Array.from(
835
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.executionContextsIndex.values(),
836
+ ).flatMap((val) => val.compatibleRuntimes),
837
+ ),
838
+ ).map((r) => {
839
+ const runtime = new V1_PackageableRuntime();
840
+ const [packagePath, name] =
841
+ resolvePackagePathAndElementName(r.path);
842
+ runtime.package = packagePath;
843
+ runtime.name = name;
844
+ runtime.runtimeValue = new V1_EngineRuntime();
845
+ return graphManager.elementProtocolToEntity(runtime);
846
+ });
847
+ // The DataSpace entity is excluded from AnalyticsResult.Json to reduce the JSON size
848
+ // because all its information can be found in V1_DataSpaceAnalysisResult.
849
+ // Therefore, we are building a simple v1_DataSpace entity based on V1_DataSpaceAnalysisResult.
850
+ const dataspaceProtocol = new V1_DataSpace();
851
+ dataspaceProtocol.name =
852
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.name;
853
+ dataspaceProtocol.package =
854
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.package;
855
+ dataspaceProtocol.supportInfo =
856
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.supportInfo;
857
+ dataspaceProtocol.executionContexts = Array.from(
858
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult
859
+ .executionContextsIndex,
860
+ ).map(([key, execContext]) => {
861
+ const contextProtocol = new V1_DataSpaceExecutionContext();
862
+ contextProtocol.name = execContext.name;
863
+ contextProtocol.title = execContext.title;
864
+ contextProtocol.description = execContext.description;
865
+ contextProtocol.mapping = new V1_PackageableElementPointer(
866
+ PackageableElementPointerType.MAPPING,
867
+ execContext.mapping.path,
868
+ );
869
+ contextProtocol.defaultRuntime =
870
+ new V1_PackageableElementPointer(
871
+ PackageableElementPointerType.RUNTIME,
872
+ execContext.defaultRuntime.path,
873
+ );
874
+ return contextProtocol;
875
+ });
876
+ dataspaceProtocol.defaultExecutionContext =
877
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.defaultExecutionContext.name;
878
+ dataspaceProtocol.title =
879
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.title;
880
+ dataspaceProtocol.description =
881
+ dataSpaceQueryBuilderState.dataSpaceAnalysisResult.description;
882
+ const dataspaceEntity =
883
+ graphManager.elementProtocolToEntity(dataspaceProtocol);
884
+
885
+ const graphEntities = guaranteeNonNullable(
886
+ mappingModelCoverageAnalysisResult.entities,
887
+ )
888
+ .concat(mappingModels)
889
+ .concat(runtimeModels)
890
+ .concat(dataspaceEntity)
891
+ // NOTE: if an element could be found in the graph already it means it comes from system
892
+ // so we could rid of it
893
+ .filter(
894
+ (el) =>
895
+ !graph.getNullableElement(el.path, false) &&
896
+ !el.path.startsWith('meta::'),
897
+ );
898
+ let option;
899
+ if (
900
+ dataSpaceQueryBuilderState.dataSpaceRepo instanceof
901
+ DataSpacesDepotRepository
902
+ ) {
903
+ option = new LegendSDLC(
904
+ dataSpaceQueryBuilderState.dataSpaceRepo.project.groupId,
905
+ dataSpaceQueryBuilderState.dataSpaceRepo.project.artifactId,
906
+ resolveVersion(
907
+ dataSpaceQueryBuilderState.dataSpaceRepo.project
908
+ .versionId,
909
+ ),
910
+ );
911
+ }
912
+ await dataSpaceQueryBuilderState.graphManagerState.graphManager.buildGraph(
913
+ graph,
914
+ graphEntities,
915
+ ActionState.create(),
916
+ option
917
+ ? {
918
+ origin: option,
919
+ }
920
+ : {},
921
+ graph_buildReport,
922
+ );
923
+ dataSpaceQueryBuilderState.graphManagerState.graph = graph;
924
+ const dependency_buildReport = createGraphBuilderReport();
925
+ // report
926
+ stopWatch.record(
927
+ GRAPH_MANAGER_EVENT.INITIALIZE_GRAPH__SUCCESS,
928
+ );
929
+ const graphBuilderReportData = {
930
+ timings:
931
+ dataSpaceQueryBuilderState.applicationStore.timeService.finalizeTimingsRecord(
932
+ stopWatch,
933
+ ),
934
+ dependencies: dependency_buildReport,
935
+ dependenciesCount:
936
+ dataSpaceQueryBuilderState.graphManagerState.graph
937
+ .dependencyManager.numberOfDependencies,
938
+ graph: graph_buildReport,
939
+ };
940
+ editorStore.logBuildGraphMetrics(graphBuilderReportData);
941
+ dataSpaceQueryBuilderState.applicationStore.logService.info(
942
+ LogEvent.create(
943
+ GRAPH_MANAGER_EVENT.INITIALIZE_GRAPH__SUCCESS,
944
+ ),
945
+ graphBuilderReportData,
946
+ );
947
+ } catch (error) {
948
+ assertErrorThrown(error);
949
+ editorStore.applicationStore.logService.error(
950
+ LogEvent.create(LEGEND_QUERY_APP_EVENT.GENERIC_FAILURE),
951
+ error,
952
+ );
953
+ editorStore.graphManagerState.graph =
954
+ editorStore.graphManagerState.createNewGraph();
955
+ await flowResult(editorStore.buildFullGraph());
956
+ }
957
+ } else {
958
+ editorStore.graphManagerState.graph =
959
+ editorStore.graphManagerState.createNewGraph();
960
+ await flowResult(editorStore.buildFullGraph());
961
+ }
962
+ }
963
+ dataSpaceQueryBuilderState.explorerState.mappingModelCoverageAnalysisResult =
964
+ mappingModelCoverageAnalysisResult;
965
+ }
966
+ const compatibleClasses = resolveUsableDataSpaceClasses(
967
+ dataSpaceQueryBuilderState.dataSpace,
968
+ mapping,
969
+ dataSpaceQueryBuilderState.graphManagerState,
970
+ dataSpaceQueryBuilderState,
971
+ );
972
+ dataSpaceQueryBuilderState.changeMapping(mapping);
973
+ dataSpaceQueryBuilderState.changeRuntime(
974
+ new RuntimePointer(
975
+ dataSpaceQueryBuilderState.executionContext.defaultRuntime,
976
+ ),
977
+ );
978
+ // if there is no chosen class or the chosen one is not compatible
979
+ // with the mapping then pick a compatible class if possible
980
+ if (
981
+ !dataSpaceQueryBuilderState.class ||
982
+ !compatibleClasses.includes(dataSpaceQueryBuilderState.class)
983
+ ) {
984
+ const possibleNewClass = getNullableFirstEntry(compatibleClasses);
985
+ if (possibleNewClass) {
986
+ dataSpaceQueryBuilderState.changeClass(possibleNewClass);
987
+ }
988
+ }
989
+ dataSpaceQueryBuilderState.explorerState.refreshTreeData();
990
+ };
991
+ if (
992
+ queryBuilderState instanceof DataSpaceQueryBuilderState &&
993
+ queryBuilderState.workflowState.actionConfig instanceof
994
+ QueryBuilderActionConfig_QueryApplication
995
+ ) {
996
+ return propagateExecutionContextChange;
997
+ }
998
+ return undefined;
999
+ },
1000
+ ];
1001
+ }
728
1002
  }
@@ -605,6 +605,12 @@ export const QueryEditor = observer(() => {
605
605
  !engineConfig.useClientRequestPayloadCompression,
606
606
  );
607
607
 
608
+ const toggleEnableMinialGraphForDataSpaceLoadingPerformance = (): void => {
609
+ editorStore.setEnableMinialGraphForDataSpaceLoadingPerformance(
610
+ !editorStore.enableMinialGraphForDataSpaceLoadingPerformance,
611
+ );
612
+ };
613
+
608
614
  const TEMPORARY__toggleLightDarkMode = (): void => {
609
615
  applicationStore.layoutService.setColorTheme(
610
616
  applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
@@ -629,7 +635,11 @@ export const QueryEditor = observer(() => {
629
635
  applicationStore.alertUnhandledError,
630
636
  );
631
637
  applicationStore.releaseNotesService.updateViewedVersion();
632
- }, [editorStore, applicationStore]);
638
+ }, [
639
+ editorStore,
640
+ applicationStore,
641
+ editorStore.enableMinialGraphForDataSpaceLoadingPerformance,
642
+ ]);
633
643
 
634
644
  return (
635
645
  <div className="query-editor">
@@ -676,6 +686,20 @@ export const QueryEditor = observer(() => {
676
686
  Compress request payload
677
687
  </MenuContentItemLabel>
678
688
  </MenuContentItem>
689
+ <MenuContentItem
690
+ onClick={
691
+ toggleEnableMinialGraphForDataSpaceLoadingPerformance
692
+ }
693
+ >
694
+ <MenuContentItemIcon>
695
+ {editorStore.enableMinialGraphForDataSpaceLoadingPerformance ? (
696
+ <CheckIcon />
697
+ ) : null}
698
+ </MenuContentItemIcon>
699
+ <MenuContentItemLabel>
700
+ Enable minimal graph
701
+ </MenuContentItemLabel>
702
+ </MenuContentItem>
679
703
  </MenuContent>
680
704
  }
681
705
  >
@@ -25,12 +25,15 @@ import { createMock, createSpy } from '@finos/legend-shared/test';
25
25
  import {
26
26
  type GraphManagerState,
27
27
  type RawMappingModelCoverageAnalysisResult,
28
+ type QueryInfo,
28
29
  Query,
29
30
  LightQuery,
30
31
  RawLambda,
31
- PackageableElementExplicitReference,
32
32
  QueryExplicitExecutionContext,
33
33
  QueryDataSpaceExecutionContext,
34
+ PackageableElementExplicitReference,
35
+ QueryDataSpaceExecutionContextInfo,
36
+ QueryExplicitExecutionContextInfo,
34
37
  } from '@finos/legend-graph';
35
38
  import { DepotServerClient } from '@finos/legend-server-depot';
36
39
  import {
@@ -104,7 +107,7 @@ export const TEST__provideMockedQueryEditorStore = (customization?: {
104
107
 
105
108
  export const TEST__setUpQueryEditor = async (
106
109
  MOCK__editorStore: ExistingQueryEditorStore,
107
- entities: Entity[],
110
+ entities: PlainObject<Entity>[],
108
111
  lambda: RawLambda,
109
112
  mappingPath: string,
110
113
  runtimePath: string,
@@ -142,7 +145,7 @@ export const TEST__setUpQueryEditor = async (
142
145
  await graphManagerState.initializeSystem();
143
146
  await graphManagerState.graphManager.buildGraph(
144
147
  graphManagerState.graph,
145
- entities,
148
+ entities as unknown as Entity[],
146
149
  graphManagerState.graphBuildState,
147
150
  );
148
151
 
@@ -162,13 +165,36 @@ export const TEST__setUpQueryEditor = async (
162
165
  );
163
166
  query.executionContext = execContext;
164
167
  query.content = 'some content';
168
+
169
+ const execContextInfo = new QueryExplicitExecutionContextInfo();
170
+ execContextInfo.mapping = mappingPath;
171
+ execContextInfo.runtime = runtimePath;
172
+
173
+ const queryInfo: QueryInfo = {
174
+ name: TEST_QUERY_NAME,
175
+ id: TEST_QUERY_ID,
176
+ versionId: '0.0.0',
177
+ groupId: 'test.group',
178
+ artifactId: 'test-artifact',
179
+ executionContext: execContextInfo,
180
+ content: 'some content',
181
+ isCurrentUserQuery: true,
182
+ };
183
+
165
184
  createSpy(
166
185
  MOCK__editorStore.depotServerClient,
167
186
  'getProject',
168
187
  ).mockResolvedValue(projectData);
188
+ createSpy(
189
+ MOCK__editorStore.depotServerClient,
190
+ 'getEntities',
191
+ ).mockResolvedValue(entities);
169
192
  createSpy(graphManagerState.graphManager, 'getLightQuery').mockResolvedValue(
170
193
  lightQuery,
171
194
  );
195
+ createSpy(graphManagerState.graphManager, 'getQueryInfo').mockResolvedValue(
196
+ queryInfo,
197
+ );
172
198
  createSpy(
173
199
  graphManagerState.graphManager,
174
200
  'pureCodeToLambda',
@@ -222,16 +248,22 @@ export const TEST__setUpQueryEditor = async (
222
248
 
223
249
  export const TEST__setUpDataSpaceExistingQueryEditor = async (
224
250
  MOCK__editorStore: ExistingQueryEditorStore,
225
- v1_dataspaceAnalyticsResult: PlainObject<V1_DataSpaceAnalysisResult>,
251
+ V1_dataspaceAnalyticsResult: PlainObject<V1_DataSpaceAnalysisResult>,
226
252
  dataSpacePath: string,
227
253
  executionContext: string,
228
254
  lambda: RawLambda,
229
255
  mappingPath: string,
230
- entities: Entity[],
256
+ entities: PlainObject<Entity>[],
257
+ buildWithMinimalGraph = false,
231
258
  ): Promise<{
232
259
  renderResult: RenderResult;
233
260
  queryBuilderState: QueryBuilderState;
234
261
  }> => {
262
+ if (buildWithMinimalGraph) {
263
+ MOCK__editorStore.applicationStore.config.options.TEMPORARY__enableMinimalGraph =
264
+ true;
265
+ }
266
+
235
267
  const projectData = {
236
268
  id: 'test-id',
237
269
  groupId: 'test.group',
@@ -259,11 +291,6 @@ export const TEST__setUpDataSpaceExistingQueryEditor = async (
259
291
  });
260
292
 
261
293
  await graphManagerState.initializeSystem();
262
- await graphManagerState.graphManager.buildGraph(
263
- graphManagerState.graph,
264
- entities,
265
- graphManagerState.graphBuildState,
266
- );
267
294
 
268
295
  const query = new Query();
269
296
  query.name = lightQuery.name;
@@ -278,6 +305,22 @@ export const TEST__setUpDataSpaceExistingQueryEditor = async (
278
305
  execContext.executionKey = executionContext;
279
306
  query.executionContext = execContext;
280
307
  query.content = 'some content';
308
+
309
+ const execContextInfo = new QueryDataSpaceExecutionContextInfo();
310
+ execContextInfo.dataSpacePath = dataSpacePath;
311
+ execContextInfo.executionKey = executionContext;
312
+
313
+ const queryInfo: QueryInfo = {
314
+ name: TEST_QUERY_NAME,
315
+ id: TEST_QUERY_ID,
316
+ versionId: '0.0.0',
317
+ groupId: 'test.group',
318
+ artifactId: 'test-artifact',
319
+ executionContext: execContextInfo,
320
+ content: 'some content',
321
+ isCurrentUserQuery: true,
322
+ };
323
+
281
324
  createSpy(
282
325
  MOCK__editorStore.depotServerClient,
283
326
  'getProject',
@@ -285,7 +328,7 @@ export const TEST__setUpDataSpaceExistingQueryEditor = async (
285
328
  createSpy(
286
329
  MOCK__editorStore.depotServerClient,
287
330
  'getEntities',
288
- ).mockResolvedValue([]);
331
+ ).mockResolvedValue(buildWithMinimalGraph ? [] : entities);
289
332
  createSpy(
290
333
  MOCK__editorStore.depotServerClient,
291
334
  'getIndexedDependencyEntities',
@@ -294,6 +337,10 @@ export const TEST__setUpDataSpaceExistingQueryEditor = async (
294
337
  MOCK__editorStore.depotServerClient,
295
338
  'getEntitiesByClassifier',
296
339
  ).mockResolvedValue([]);
340
+ createSpy(
341
+ MOCK__editorStore.depotServerClient,
342
+ 'getGenerationContentByPath',
343
+ ).mockResolvedValue(JSON.stringify(V1_dataspaceAnalyticsResult));
297
344
  createSpy(graphManagerState.graphManager, 'getLightQuery').mockResolvedValue(
298
345
  lightQuery,
299
346
  );
@@ -308,10 +355,9 @@ export const TEST__setUpDataSpaceExistingQueryEditor = async (
308
355
  createSpy(graphManagerState.graphManager, 'getQuery').mockResolvedValue(
309
356
  query,
310
357
  );
311
- createSpy(
312
- MOCK__editorStore.depotServerClient,
313
- 'getGenerationContentByPath',
314
- ).mockResolvedValue('');
358
+ createSpy(graphManagerState.graphManager, 'getQueryInfo').mockResolvedValue(
359
+ queryInfo,
360
+ );
315
361
  createSpy(graphManagerState.graphManager, 'surveyDatasets').mockResolvedValue(
316
362
  [],
317
363
  );
@@ -325,20 +371,12 @@ export const TEST__setUpDataSpaceExistingQueryEditor = async (
325
371
  );
326
372
  const dataspaceAnalyticsResult =
327
373
  await graphManagerExtension.buildDataSpaceAnalytics(
328
- v1_dataspaceAnalyticsResult,
374
+ V1_dataspaceAnalyticsResult,
329
375
  graphManagerState.graphManager.pluginManager.getPureProtocolProcessorPlugins(),
330
376
  );
331
377
  createSpy(graphManagerExtension, 'analyzeDataSpace').mockResolvedValue(
332
378
  dataspaceAnalyticsResult,
333
379
  );
334
- const mappingAnalyticsResult =
335
- dataspaceAnalyticsResult.mappingToMappingCoverageResult?.get(mappingPath);
336
- if (mappingAnalyticsResult) {
337
- createSpy(
338
- graphManagerState.graphManager,
339
- 'analyzeMappingModelCoverage',
340
- ).mockResolvedValue(mappingAnalyticsResult);
341
- }
342
380
 
343
381
  MOCK__editorStore.buildGraph = createMock();
344
382
  graphManagerState.graphManager.initialize = createMock();
@@ -15,17 +15,18 @@
15
15
  */
16
16
 
17
17
  import { LegendApplicationPlugin } from '@finos/legend-application';
18
- import type { Query } from '@finos/legend-graph';
19
18
  import type {
20
- QueryBuilderState,
21
19
  QueryBuilder_LegendApplicationPlugin_Extension,
20
+ QueryBuilderState,
22
21
  } from '@finos/legend-query-builder';
22
+ import type React from 'react';
23
23
  import type { LegendQueryPluginManager } from '../application/LegendQueryPluginManager.js';
24
- import {
25
- type ExistingQueryEditorStore,
26
- type QueryEditorStore,
24
+ import type {
25
+ ExistingQueryEditorStore,
26
+ QueryEditorStore,
27
27
  } from './QueryEditorStore.js';
28
28
  import type { QuerySetupLandingPageStore } from './QuerySetupStore.js';
29
+ import type { Query } from '@finos/legend-graph';
29
30
 
30
31
  export enum QuerySetupActionTag {
31
32
  PRODUCTIONIZATION = 'Productionization',