@finos/legend-extension-dsl-data-space 10.3.85 → 10.4.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 (34) hide show
  1. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.d.ts +1 -1
  2. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.d.ts.map +1 -1
  3. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.js +4 -3
  4. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.js.map +1 -1
  5. package/lib/components/query-builder/DataSpaceQueryBuilder.d.ts.map +1 -1
  6. package/lib/components/query-builder/DataSpaceQueryBuilder.js +20 -6
  7. package/lib/components/query-builder/DataSpaceQueryBuilder.js.map +1 -1
  8. package/lib/components/query-builder/DataSpaceQueryBuilderTemplateQueryPanelContent.js +1 -1
  9. package/lib/components/query-builder/DataSpaceQueryBuilderTemplateQueryPanelContent.js.map +1 -1
  10. package/lib/graph-manager/index.d.ts +1 -0
  11. package/lib/graph-manager/index.d.ts.map +1 -1
  12. package/lib/graph-manager/index.js +1 -0
  13. package/lib/graph-manager/index.js.map +1 -1
  14. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.d.ts +6 -2
  15. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  16. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  17. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts +15 -3
  18. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  19. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js +185 -48
  20. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  21. package/lib/index.css +1 -1
  22. package/lib/package.json +1 -1
  23. package/lib/stores/query-builder/DataSpaceQueryBuilderState.d.ts +5 -11
  24. package/lib/stores/query-builder/DataSpaceQueryBuilderState.d.ts.map +1 -1
  25. package/lib/stores/query-builder/DataSpaceQueryBuilderState.js +19 -30
  26. package/lib/stores/query-builder/DataSpaceQueryBuilderState.js.map +1 -1
  27. package/package.json +7 -7
  28. package/src/components/DSL_DataSpace_LegendApplicationPlugin.tsx +6 -8
  29. package/src/components/query-builder/DataSpaceQueryBuilder.tsx +40 -9
  30. package/src/components/query-builder/DataSpaceQueryBuilderTemplateQueryPanelContent.tsx +1 -1
  31. package/src/graph-manager/index.ts +4 -0
  32. package/src/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.ts +19 -1
  33. package/src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.ts +359 -79
  34. package/src/stores/query-builder/DataSpaceQueryBuilderState.ts +32 -40
@@ -19,6 +19,8 @@ import {
19
19
  type AbstractPureGraphManager,
20
20
  type PureProtocolProcessorPlugin,
21
21
  type MappingModelCoverageAnalysisResult,
22
+ type GraphManagerOperationReport,
23
+ type FunctionAnalysisInfo,
22
24
  PureModel,
23
25
  V1_PureGraphManager,
24
26
  PureClientVersion,
@@ -36,8 +38,13 @@ import {
36
38
  V1_deserializePackageableElement,
37
39
  QueryDataSpaceExecutionContextInfo,
38
40
  V1_RemoteEngine,
41
+ LegendSDLC,
42
+ PackageableElementPointerType,
43
+ V1_PackageableElementPointer,
44
+ V1_ConcreteFunctionDefinition,
45
+ V1_buildFunctionInfoAnalysis,
39
46
  } from '@finos/legend-graph';
40
- import type { Entity } from '@finos/legend-storage';
47
+ import type { Entity, ProjectGAVCoordinates } from '@finos/legend-storage';
41
48
  import {
42
49
  type PlainObject,
43
50
  ActionState,
@@ -56,6 +63,7 @@ import {
56
63
  } from '../../../../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
57
64
  import {
58
65
  V1_DataSpace,
66
+ V1_DataSpaceExecutionContext,
59
67
  V1_DataSpaceSupportCombinedInfo,
60
68
  V1_DataSpaceSupportEmail,
61
69
  V1_DataSpaceTemplateExecutable,
@@ -96,6 +104,7 @@ import {
96
104
  V1_DataSpaceFunctionPointerExecutableInfo,
97
105
  } from './engine/analytics/V1_DataSpaceAnalysis.js';
98
106
  import { getDiagram } from '@finos/legend-extension-dsl-diagram/graph';
107
+ import { resolveVersion } from '@finos/legend-server-depot';
99
108
 
100
109
  const ANALYZE_DATA_SPACE_TRACE = 'analyze data space';
101
110
  const TEMPORARY__TDS_SAMPLE_VALUES__DELIMETER = '-- e.g.';
@@ -219,6 +228,112 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
219
228
  );
220
229
  }
221
230
 
231
+ retrieveExecutionContextFromTemplateQueryId(
232
+ dataSpaceAnalysisResult: PlainObject<V1_DataSpaceAnalysisResult>,
233
+ templateQueryId: string,
234
+ plugins: PureProtocolProcessorPlugin[],
235
+ ): string | undefined {
236
+ const analysisResult = V1_deserializeDataSpaceAnalysisResult(
237
+ dataSpaceAnalysisResult,
238
+ plugins,
239
+ );
240
+ let execContext = undefined;
241
+ const info = analysisResult.executables.find(
242
+ (ex) => ex.info?.id === templateQueryId,
243
+ )?.info;
244
+ if (info) {
245
+ execContext =
246
+ info.executionContextKey ?? analysisResult.defaultExecutionContext;
247
+ }
248
+ return execContext;
249
+ }
250
+
251
+ async analyzeDataSpaceCoverage(
252
+ dataSpacePath: string,
253
+ entitiesRetriever: () => Promise<Entity[]>,
254
+ entitiesWithClassifierRetriever: () => Promise<
255
+ [PlainObject<Entity>[], PlainObject<Entity>[]]
256
+ >,
257
+ cacheRetriever?: () => Promise<PlainObject<DataSpaceAnalysisResult>>,
258
+ actionState?: ActionState,
259
+ graphReport?: GraphManagerOperationReport | undefined,
260
+ pureGraph?: PureModel | undefined,
261
+ executionContext?: string | undefined,
262
+ mappingPath?: string | undefined,
263
+ projectInfo?: ProjectGAVCoordinates,
264
+ templateQueryId?: string,
265
+ ): Promise<DataSpaceAnalysisResult> {
266
+ const cacheResult = cacheRetriever
267
+ ? await this.fetchDataSpaceAnalysisFromCache(cacheRetriever, actionState)
268
+ : undefined;
269
+ const engineClient = guaranteeType(
270
+ this.graphManager.engine,
271
+ V1_RemoteEngine,
272
+ 'analyzeDataSpaceCoverage is only supported by remote engine',
273
+ ).getEngineServerClient();
274
+ let analysisResult: PlainObject<V1_DataSpaceAnalysisResult>;
275
+ let cachedAnalysisResult;
276
+ if (cacheResult) {
277
+ cachedAnalysisResult = V1_deserializeDataSpaceAnalysisResult(
278
+ cacheResult,
279
+ this.graphManager.pluginManager.getPureProtocolProcessorPlugins(),
280
+ );
281
+ }
282
+ if (
283
+ cacheResult &&
284
+ cachedAnalysisResult?.executionContexts.every(
285
+ (e) =>
286
+ e.mappingModelCoverageAnalysisResult?.model !== undefined ||
287
+ cachedAnalysisResult.mappingToMappingCoverageResult?.get(e.mapping)
288
+ ?.model !== undefined,
289
+ )
290
+ ) {
291
+ analysisResult = cacheResult;
292
+ } else {
293
+ actionState?.setMessage('Fetching project entities and dependencies...');
294
+ const entities = await entitiesRetriever();
295
+ actionState?.setMessage('Analyzing data space...');
296
+ analysisResult = await engineClient.postWithTracing<
297
+ PlainObject<V1_DataSpaceAnalysisResult>
298
+ >(
299
+ engineClient.getTraceData(ANALYZE_DATA_SPACE_TRACE),
300
+ `${engineClient._pure()}/analytics/dataSpace/coverage`,
301
+ {
302
+ clientVersion: V1_PureGraphManager.DEV_PROTOCOL_VERSION,
303
+ dataSpace: dataSpacePath,
304
+ model: {
305
+ _type: V1_PureModelContextType.DATA,
306
+ elements: entities.map((entity) => entity.content),
307
+ },
308
+ },
309
+ {},
310
+ undefined,
311
+ undefined,
312
+ { enableCompression: true },
313
+ );
314
+ }
315
+ const plugins =
316
+ this.graphManager.pluginManager.getPureProtocolProcessorPlugins();
317
+ return this.buildDataSpaceAnalytics(
318
+ analysisResult,
319
+ plugins,
320
+ graphReport,
321
+ pureGraph,
322
+ executionContext
323
+ ? executionContext
324
+ : templateQueryId
325
+ ? this.retrieveExecutionContextFromTemplateQueryId(
326
+ analysisResult,
327
+ templateQueryId,
328
+ plugins,
329
+ )
330
+ : undefined,
331
+ mappingPath,
332
+ projectInfo,
333
+ entitiesWithClassifierRetriever,
334
+ );
335
+ }
336
+
222
337
  async retrieveDataSpaceAnalysisFromCache(
223
338
  cacheRetriever: () => Promise<PlainObject<DataSpaceAnalysisResult>>,
224
339
  actionState?: ActionState,
@@ -255,11 +370,78 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
255
370
  return cacheResult;
256
371
  }
257
372
 
373
+ // build function analysis info by fetching functions within this project from metadata when building minimal graph
374
+ async processFunctionForMinimalGraph(
375
+ entitiesWithClassifierRetriever: () => Promise<
376
+ [PlainObject<Entity>[], PlainObject<Entity>[]]
377
+ >,
378
+ graph: PureModel,
379
+ dataSpaceAnalysisResult: DataSpaceAnalysisResult,
380
+ plugins: PureProtocolProcessorPlugin[],
381
+ ): Promise<void> {
382
+ const [functionEntities, dependencyFunctionEntities]: [
383
+ PlainObject<Entity>[],
384
+ PlainObject<Entity>[],
385
+ ] = await entitiesWithClassifierRetriever();
386
+ const functionProtocols = functionEntities.map((func) =>
387
+ guaranteeType(
388
+ V1_deserializePackageableElement(
389
+ (func.entity as Entity).content,
390
+ plugins,
391
+ ),
392
+ V1_ConcreteFunctionDefinition,
393
+ ),
394
+ );
395
+ const dependencyFunctionProtocols = dependencyFunctionEntities.map((func) =>
396
+ guaranteeType(
397
+ V1_deserializePackageableElement(
398
+ (func.entity as Entity).content,
399
+ plugins,
400
+ ),
401
+ V1_ConcreteFunctionDefinition,
402
+ ),
403
+ );
404
+ const functionInfos = V1_buildFunctionInfoAnalysis(
405
+ functionProtocols,
406
+ graph,
407
+ );
408
+ const dependencyFunctionInfos = V1_buildFunctionInfoAnalysis(
409
+ dependencyFunctionProtocols,
410
+ graph,
411
+ );
412
+ if (functionInfos.length > 0) {
413
+ const functionInfoMap = new Map<string, FunctionAnalysisInfo>();
414
+ functionInfos.forEach((funcInfo) => {
415
+ functionInfoMap.set(funcInfo.functionPath, funcInfo);
416
+ });
417
+ dataSpaceAnalysisResult.functionInfos = functionInfoMap;
418
+ }
419
+ if (dependencyFunctionInfos.length > 0) {
420
+ const dependencyFunctionInfoMap = new Map<string, FunctionAnalysisInfo>();
421
+ functionInfos.forEach((funcInfo) => {
422
+ dependencyFunctionInfoMap.set(funcInfo.functionPath, funcInfo);
423
+ });
424
+ dataSpaceAnalysisResult.dependencyFunctionInfos =
425
+ dependencyFunctionInfoMap;
426
+ }
427
+ }
428
+
258
429
  async buildDataSpaceAnalytics(
259
- json: PlainObject<V1_DataSpaceAnalysisResult>,
430
+ analytics: PlainObject<V1_DataSpaceAnalysisResult>,
260
431
  plugins: PureProtocolProcessorPlugin[],
432
+ graphReport?: GraphManagerOperationReport | undefined,
433
+ pureGraph?: PureModel | undefined,
434
+ executionContext?: string | undefined,
435
+ mappingPath?: string | undefined,
436
+ projectInfo?: ProjectGAVCoordinates,
437
+ entitiesWithClassifierRetriever?: () => Promise<
438
+ [PlainObject<Entity>[], PlainObject<Entity>[]]
439
+ >,
261
440
  ): Promise<DataSpaceAnalysisResult> {
262
- const analysisResult = V1_deserializeDataSpaceAnalysisResult(json, plugins);
441
+ const analysisResult = V1_deserializeDataSpaceAnalysisResult(
442
+ analytics,
443
+ plugins,
444
+ );
263
445
  const result = new DataSpaceAnalysisResult();
264
446
  result.name = analysisResult.name;
265
447
  result.package = analysisResult.package;
@@ -306,26 +488,30 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
306
488
  // NOTE: we will relax the check and not throw here for unknown support info type
307
489
  }
308
490
 
309
- // create an empty graph
310
- const systemModel = new SystemModel(
311
- this.graphManager.pluginManager.getPureGraphPlugins(),
312
- );
313
- const coreModel = new CoreModel(
314
- this.graphManager.pluginManager.getPureGraphPlugins(),
315
- );
316
- await this.graphManager.buildSystem(
317
- coreModel,
318
- systemModel,
319
- ActionState.create(),
320
- {},
321
- );
322
- systemModel.initializeAutoImports();
323
- const graph = new PureModel(
324
- coreModel,
325
- systemModel,
326
- this.graphManager.pluginManager.getPureGraphPlugins(),
327
- );
328
-
491
+ let graphEntities;
492
+ let graph: PureModel;
493
+ let minialGraph = false;
494
+ if (pureGraph) {
495
+ graph = pureGraph;
496
+ } else {
497
+ // create an empty graph
498
+ const extensionElementClasses =
499
+ this.graphManager.pluginManager.getPureGraphPlugins();
500
+ const systemModel = new SystemModel(extensionElementClasses);
501
+ const coreModel = new CoreModel(extensionElementClasses);
502
+ await this.graphManager.buildSystem(
503
+ coreModel,
504
+ systemModel,
505
+ ActionState.create(),
506
+ {},
507
+ );
508
+ systemModel.initializeAutoImports();
509
+ graph = new PureModel(
510
+ coreModel,
511
+ systemModel,
512
+ this.graphManager.pluginManager.getPureGraphPlugins(),
513
+ );
514
+ }
329
515
  // Create dummy mappings and runtimes
330
516
  // TODO?: these stubbed mappings and runtimes are not really useful that useful, so either we should
331
517
  // simplify the model here or potentially refactor the backend analytics endpoint to return these as model
@@ -355,55 +541,142 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
355
541
  return runtime;
356
542
  });
357
543
 
358
- // prepare the model context data
359
- const graphEntities = analysisResult.model.elements
360
- // NOTE: this is a temporary hack to fix a problem with data space analytics
361
- // where the classes for properties are not properly surveyed
362
- // We need to wait for the actual fix in backend to be merged and released
363
- // See https://github.com/finos/legend-engine/pull/836
364
- .concat(
365
- uniq(
366
- analysisResult.model.elements.flatMap((element) => {
367
- if (element instanceof V1_Class) {
368
- return element.derivedProperties
369
- .map((prop) => prop.returnType)
370
- .concat(element.properties.map((prop) => prop.type));
371
- }
372
- return [];
373
- }),
374
- )
375
- // make sure to not include types already returned by the analysis
376
- .filter(
377
- (path) =>
378
- !analysisResult.model.elements
379
- .map((el) => el.path)
380
- .includes(path),
381
- )
382
- .map((path) => {
383
- const [pkgPath, name] = resolvePackagePathAndElementName(path);
384
- if (!pkgPath) {
385
- // exclude package-less elements (i.e. primitive types)
386
- return undefined;
387
- }
388
- const _class = new V1_Class();
389
- _class.name = name;
390
- _class.package = pkgPath;
391
- return _class;
392
- })
393
- .filter(isNonNullable),
394
- )
395
- .concat(mappingModels)
396
- .concat(runtimeModels)
397
- // NOTE: if an element could be found in the graph already it means it comes from system
398
- // so we could rid of it
399
- .filter((el) => !graph.getNullableElement(el.path, false))
400
- .map((el) => this.graphManager.elementProtocolToEntity(el));
401
-
402
- await this.graphManager.buildGraph(
403
- graph,
404
- graphEntities,
405
- ActionState.create(),
544
+ // The DataSpace entity is excluded from AnalyticsResult.Json to reduce the JSON size
545
+ // because all its information can be found in V1_DataSpaceAnalysisResult.
546
+ // Therefore, we are building a simple v1_DataSpace entity based on V1_DataSpaceAnalysisResult.
547
+ const dataspaceEntity = new V1_DataSpace();
548
+ dataspaceEntity.name = analysisResult.name;
549
+ dataspaceEntity.package = analysisResult.package;
550
+ dataspaceEntity.supportInfo = analysisResult.supportInfo;
551
+ dataspaceEntity.executionContexts = analysisResult.executionContexts.map(
552
+ (execContext) => {
553
+ const contextProtocol = new V1_DataSpaceExecutionContext();
554
+ contextProtocol.name = execContext.name;
555
+ contextProtocol.title = execContext.title;
556
+ contextProtocol.description = execContext.description;
557
+ contextProtocol.mapping = new V1_PackageableElementPointer(
558
+ PackageableElementPointerType.MAPPING,
559
+ execContext.mapping,
560
+ );
561
+ contextProtocol.defaultRuntime = new V1_PackageableElementPointer(
562
+ PackageableElementPointerType.RUNTIME,
563
+ execContext.defaultRuntime,
564
+ );
565
+ return contextProtocol;
566
+ },
406
567
  );
568
+ dataspaceEntity.defaultExecutionContext =
569
+ analysisResult.defaultExecutionContext;
570
+ dataspaceEntity.title = analysisResult.title;
571
+ dataspaceEntity.description = analysisResult.description;
572
+
573
+ const resolvedMappingPath =
574
+ mappingPath ??
575
+ analysisResult.executionContexts.find(
576
+ (value) =>
577
+ value.name ===
578
+ (executionContext ?? analysisResult.defaultExecutionContext),
579
+ )?.mapping;
580
+ let pmcd;
581
+ if (resolvedMappingPath) {
582
+ const mappingModelCoverageAnalysisResult =
583
+ analysisResult.mappingToMappingCoverageResult?.get(resolvedMappingPath);
584
+ pmcd = mappingModelCoverageAnalysisResult?.model;
585
+ }
586
+ if (pmcd && projectInfo) {
587
+ graphEntities = pmcd.elements
588
+ .concat(mappingModels)
589
+ .concat(runtimeModels)
590
+ .concat(dataspaceEntity)
591
+ // NOTE: if an element could be found in the graph already it means it comes from system
592
+ // so we could rid of it
593
+ .filter((el) => !graph.getNullableElement(el.path, false))
594
+ .map((el) => this.graphManager.elementProtocolToEntity(el));
595
+ await this.graphManager.buildGraph(
596
+ graph,
597
+ graphEntities,
598
+ ActionState.create(),
599
+ {
600
+ origin: new LegendSDLC(
601
+ projectInfo.groupId,
602
+ projectInfo.artifactId,
603
+ resolveVersion(projectInfo.versionId),
604
+ ),
605
+ },
606
+ graphReport,
607
+ );
608
+ if (entitiesWithClassifierRetriever) {
609
+ try {
610
+ await this.processFunctionForMinimalGraph(
611
+ entitiesWithClassifierRetriever,
612
+ graph,
613
+ result,
614
+ plugins,
615
+ );
616
+ } catch {
617
+ //do nothing
618
+ }
619
+ }
620
+ minialGraph = true;
621
+ } else {
622
+ const elements = analysisResult.model.elements
623
+ // NOTE: this is a temporary hack to fix a problem with data space analytics
624
+ // where the classes for properties are not properly surveyed
625
+ // We need to wait for the actual fix in backend to be merged and released
626
+ // See https://github.com/finos/legend-engine/pull/836
627
+ .concat(
628
+ uniq(
629
+ analysisResult.model.elements.flatMap((element) => {
630
+ if (element instanceof V1_Class) {
631
+ return element.derivedProperties
632
+ .map((prop) => prop.returnType)
633
+ .concat(element.properties.map((prop) => prop.type));
634
+ }
635
+ return [];
636
+ }),
637
+ )
638
+ // make sure to not include types already returned by the analysis
639
+ .filter(
640
+ (path) =>
641
+ !analysisResult.model.elements
642
+ .map((el) => el.path)
643
+ .includes(path),
644
+ )
645
+ .map((path) => {
646
+ const [pkgPath, name] = resolvePackagePathAndElementName(path);
647
+ if (!pkgPath) {
648
+ // exclude package-less elements (i.e. primitive types)
649
+ return undefined;
650
+ }
651
+ const _class = new V1_Class();
652
+ _class.name = name;
653
+ _class.package = pkgPath;
654
+ return _class;
655
+ })
656
+ .filter(isNonNullable),
657
+ )
658
+ .concat(mappingModels)
659
+ .concat(runtimeModels);
660
+ const alreadyContainsDataspace = elements.find(
661
+ (e) => e.path === dataspaceEntity.path,
662
+ );
663
+ let allElements = elements;
664
+ if (!alreadyContainsDataspace) {
665
+ allElements = elements.concat(dataspaceEntity);
666
+ }
667
+ // prepare the model context data
668
+ graphEntities = allElements
669
+ // NOTE: if an element could be found in the graph already it means it comes from system
670
+ // so we could rid of it
671
+ .filter((el) => !graph.getNullableElement(el.path, false))
672
+ .map((el) => this.graphManager.elementProtocolToEntity(el));
673
+
674
+ await this.graphManager.buildGraph(
675
+ graph,
676
+ graphEntities,
677
+ ActionState.create(),
678
+ );
679
+ }
407
680
 
408
681
  const mappingToMappingCoverageResult = new Map<
409
682
  string,
@@ -414,7 +687,11 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
414
687
  ([key, value]) => {
415
688
  mappingToMappingCoverageResult.set(
416
689
  key,
417
- V1_buildModelCoverageAnalysisResult(value, graph.getMapping(key)),
690
+ V1_buildModelCoverageAnalysisResult(
691
+ value,
692
+ this.graphManager,
693
+ graph.getMapping(key),
694
+ ),
418
695
  );
419
696
  },
420
697
  );
@@ -455,6 +732,7 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
455
732
  context.mapping,
456
733
  V1_buildModelCoverageAnalysisResult(
457
734
  context.mappingModelCoverageAnalysisResult,
735
+ this.graphManager,
458
736
  contextAnalysisResult.mapping,
459
737
  ),
460
738
  );
@@ -586,13 +864,15 @@ export class V1_DSL_DataSpace_PureGraphManagerExtension extends DSL_DataSpace_Pu
586
864
  });
587
865
 
588
866
  // diagrams
589
- result.diagrams = analysisResult.diagrams.map((diagramProtocol) => {
590
- const diagram = new DataSpaceDiagramAnalysisResult();
591
- diagram.title = diagramProtocol.title;
592
- diagram.description = diagramProtocol.description;
593
- diagram.diagram = getDiagram(diagramProtocol.diagram, graph);
594
- return diagram;
595
- });
867
+ result.diagrams = (minialGraph ? [] : analysisResult.diagrams).map(
868
+ (diagramProtocol) => {
869
+ const diagram = new DataSpaceDiagramAnalysisResult();
870
+ diagram.title = diagramProtocol.title;
871
+ diagram.description = diagramProtocol.description;
872
+ diagram.diagram = getDiagram(diagramProtocol.diagram, graph);
873
+ return diagram;
874
+ },
875
+ );
596
876
 
597
877
  // executables
598
878
  result.executables = analysisResult.executables.map(
@@ -34,7 +34,6 @@ import {
34
34
  Package,
35
35
  QueryDataSpaceExecutionContext,
36
36
  elementBelongsToPackage,
37
- RuntimePointer,
38
37
  } from '@finos/legend-graph';
39
38
  import {
40
39
  type DepotServerClient,
@@ -47,7 +46,6 @@ import {
47
46
  ActionState,
48
47
  assertErrorThrown,
49
48
  filterByType,
50
- getNullableFirstEntry,
51
49
  } from '@finos/legend-shared';
52
50
  import { action, flow, makeObservable, observable } from 'mobx';
53
51
  import { renderDataSpaceQueryBuilderSetupPanelContent } from '../../components/query-builder/DataSpaceQueryBuilder.js';
@@ -88,11 +86,34 @@ export const resolveUsableDataSpaceClasses = (
88
86
  dataSpace: DataSpace,
89
87
  mapping: Mapping,
90
88
  graphManagerState: GraphManagerState,
89
+ queryBuilderState?: DataSpaceQueryBuilderState,
91
90
  ): Class[] => {
92
- const compatibleClasses = getMappingCompatibleClasses(
91
+ let compatibleClasses = getMappingCompatibleClasses(
93
92
  mapping,
94
93
  graphManagerState.usableClasses,
95
94
  );
95
+ const mappingModelCoverageAnalysisResult =
96
+ queryBuilderState?.dataSpaceAnalysisResult?.mappingToMappingCoverageResult?.get(
97
+ mapping.path,
98
+ );
99
+ if (
100
+ // This check is to make sure that we have `info` field present in `MappedEntity` which
101
+ // contains information about the mapped class path
102
+ mappingModelCoverageAnalysisResult?.mappedEntities.some(
103
+ (m) => m.info !== undefined,
104
+ )
105
+ ) {
106
+ const compatibleClassPaths =
107
+ mappingModelCoverageAnalysisResult.mappedEntities.map(
108
+ (e) => e.info?.classPath,
109
+ );
110
+ const uniqueCompatibleClasses = compatibleClassPaths.filter(
111
+ (val, index) => compatibleClassPaths.indexOf(val) === index,
112
+ );
113
+ compatibleClasses = graphManagerState.graph.classes.filter((c) =>
114
+ uniqueCompatibleClasses.includes(c.path),
115
+ );
116
+ }
96
117
  if (dataSpace.elements?.length) {
97
118
  const elements = dataSpace.elements;
98
119
  return compatibleClasses.filter((_class) => {
@@ -335,7 +356,7 @@ export class DataSpacesDepotRepository extends DataSpacesBuilderRepoistory {
335
356
  }
336
357
 
337
358
  export class DataSpaceQueryBuilderState extends QueryBuilderState {
338
- readonly onDataSpaceChange: (val: DataSpaceInfo) => void;
359
+ readonly onDataSpaceChange: (val: DataSpaceInfo) => Promise<void>;
339
360
  readonly onExecutionContextChange?:
340
361
  | ((val: DataSpaceExecutionContext) => void)
341
362
  | undefined;
@@ -351,6 +372,7 @@ export class DataSpaceQueryBuilderState extends QueryBuilderState {
351
372
  executionContext!: DataSpaceExecutionContext;
352
373
  showRuntimeSelector = false;
353
374
  isTemplateQueryDialogOpen = false;
375
+ isLightGraphEnabled!: boolean;
354
376
  displayedTemplateQueries: DataSpaceExecutableAnalysisResult[] | undefined;
355
377
 
356
378
  constructor(
@@ -360,8 +382,9 @@ export class DataSpaceQueryBuilderState extends QueryBuilderState {
360
382
  actionConfig: QueryBuilderActionConfig,
361
383
  dataSpace: DataSpace,
362
384
  executionContext: DataSpaceExecutionContext,
385
+ isLightGraphEnabled: boolean,
363
386
  dataSpaceRepo: DataSpacesBuilderRepoistory | undefined,
364
- onDataSpaceChange: (val: DataSpaceInfo) => void,
387
+ onDataSpaceChange: (val: DataSpaceInfo) => Promise<void>,
365
388
  dataSpaceAnalysisResult?: DataSpaceAnalysisResult | undefined,
366
389
  onExecutionContextChange?:
367
390
  | ((val: DataSpaceExecutionContext) => void)
@@ -377,10 +400,12 @@ export class DataSpaceQueryBuilderState extends QueryBuilderState {
377
400
  executionContext: observable,
378
401
  showRuntimeSelector: observable,
379
402
  isTemplateQueryDialogOpen: observable,
403
+ isLightGraphEnabled: observable,
380
404
  displayedTemplateQueries: observable,
381
405
  setExecutionContext: action,
382
406
  setShowRuntimeSelector: action,
383
407
  setTemplateQueryDialogOpen: action,
408
+ setIsLightGraphEnabled: action,
384
409
  intialize: flow,
385
410
  });
386
411
 
@@ -425,41 +450,8 @@ export class DataSpaceQueryBuilderState extends QueryBuilderState {
425
450
  this.showRuntimeSelector = val;
426
451
  }
427
452
 
428
- /**
429
- * Propagation after changing the execution context:
430
- * - The mapping will be updated to the mapping of the execution context
431
- * - The runtime will be updated to the default runtime of the execution context
432
- * - If no class is chosen, try to choose a compatible class
433
- * - If the chosen class is compatible with the new selected execution context mapping, do nothing, otherwise, try to choose a compatible class
434
- */
435
- propagateExecutionContextChange(
436
- executionContext: DataSpaceExecutionContext,
437
- ): void {
438
- const mapping = executionContext.mapping.value;
439
- this.changeMapping(mapping);
440
- const mappingModelCoverageAnalysisResult =
441
- this.dataSpaceAnalysisResult?.mappingToMappingCoverageResult?.get(
442
- mapping.path,
443
- );
444
- if (mappingModelCoverageAnalysisResult) {
445
- this.explorerState.mappingModelCoverageAnalysisResult =
446
- mappingModelCoverageAnalysisResult;
447
- }
448
- this.changeRuntime(new RuntimePointer(executionContext.defaultRuntime));
449
-
450
- const compatibleClasses = resolveUsableDataSpaceClasses(
451
- this.dataSpace,
452
- mapping,
453
- this.graphManagerState,
454
- );
455
- // if there is no chosen class or the chosen one is not compatible
456
- // with the mapping then pick a compatible class if possible
457
- if (!this.class || !compatibleClasses.includes(this.class)) {
458
- const possibleNewClass = getNullableFirstEntry(compatibleClasses);
459
- if (possibleNewClass) {
460
- this.changeClass(possibleNewClass);
461
- }
462
- }
453
+ setIsLightGraphEnabled(val: boolean): void {
454
+ this.isLightGraphEnabled = val;
463
455
  }
464
456
 
465
457
  override buildFunctionAnalysisInfo():