@finos/legend-extension-dsl-data-space 10.1.17 → 10.1.19

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/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.d.ts.map +1 -1
  2. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.js +4 -3
  3. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.js.map +1 -1
  4. package/lib/components/query/DataSpaceAdvancedSearchModal.d.ts.map +1 -1
  5. package/lib/components/query/DataSpaceAdvancedSearchModal.js +7 -2
  6. package/lib/components/query/DataSpaceAdvancedSearchModal.js.map +1 -1
  7. package/lib/components/query/DataSpaceQueryBuilder.d.ts +4 -1
  8. package/lib/components/query/DataSpaceQueryBuilder.d.ts.map +1 -1
  9. package/lib/components/query/DataSpaceQueryBuilder.js +31 -22
  10. package/lib/components/query/DataSpaceQueryBuilder.js.map +1 -1
  11. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts.map +1 -1
  12. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.js +10 -0
  13. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.js.map +1 -1
  14. package/lib/components/studio/DataSpaceQueryAction.d.ts +22 -0
  15. package/lib/components/studio/DataSpaceQueryAction.d.ts.map +1 -0
  16. package/lib/components/studio/DataSpaceQueryAction.js +29 -0
  17. package/lib/components/studio/DataSpaceQueryAction.js.map +1 -0
  18. package/lib/index.css +1 -1
  19. package/lib/package.json +7 -7
  20. package/lib/stores/query/DataSpaceAdvancedSearchState.d.ts.map +1 -1
  21. package/lib/stores/query/DataSpaceAdvancedSearchState.js +12 -9
  22. package/lib/stores/query/DataSpaceAdvancedSearchState.js.map +1 -1
  23. package/lib/stores/query/DataSpaceInfo.d.ts +3 -3
  24. package/lib/stores/query/DataSpaceInfo.d.ts.map +1 -1
  25. package/lib/stores/query/DataSpaceQueryBuilderState.d.ts +12 -7
  26. package/lib/stores/query/DataSpaceQueryBuilderState.d.ts.map +1 -1
  27. package/lib/stores/query/DataSpaceQueryBuilderState.js +79 -43
  28. package/lib/stores/query/DataSpaceQueryBuilderState.js.map +1 -1
  29. package/lib/stores/query/DataSpaceQueryCreatorStore.d.ts.map +1 -1
  30. package/lib/stores/query/DataSpaceQueryCreatorStore.js +8 -7
  31. package/lib/stores/query/DataSpaceQueryCreatorStore.js.map +1 -1
  32. package/lib/stores/query/DataSpaceQuerySetupStore.d.ts +2 -2
  33. package/lib/stores/query/DataSpaceQuerySetupStore.d.ts.map +1 -1
  34. package/lib/stores/query/DataSpaceQuerySetupStore.js +6 -6
  35. package/lib/stores/query/DataSpaceQuerySetupStore.js.map +1 -1
  36. package/package.json +19 -19
  37. package/src/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.tsx +18 -7
  38. package/src/components/query/DataSpaceAdvancedSearchModal.tsx +23 -26
  39. package/src/components/query/DataSpaceQueryBuilder.tsx +82 -48
  40. package/src/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.tsx +10 -0
  41. package/src/components/studio/DataSpaceQueryAction.tsx +34 -0
  42. package/src/stores/query/DataSpaceAdvancedSearchState.ts +19 -28
  43. package/src/stores/query/DataSpaceInfo.ts +3 -3
  44. package/src/stores/query/DataSpaceQueryBuilderState.ts +131 -73
  45. package/src/stores/query/DataSpaceQueryCreatorStore.ts +23 -16
  46. package/src/stores/query/DataSpaceQuerySetupStore.ts +11 -5
  47. package/tsconfig.json +1 -0
@@ -33,7 +33,7 @@ import {
33
33
  ModalHeaderActions,
34
34
  } from '@finos/legend-art';
35
35
  import { generateGAVCoordinates } from '@finos/legend-storage';
36
- import { debounce } from '@finos/legend-shared';
36
+ import { debounce, guaranteeNonNullable } from '@finos/legend-shared';
37
37
  import { flowResult } from 'mobx';
38
38
  import { observer } from 'mobx-react-lite';
39
39
  import { useEffect, useMemo, useRef, useState } from 'react';
@@ -81,32 +81,29 @@ export const DataSpaceAdvancedSearchModal = observer(
81
81
  };
82
82
  const formatDataSpaceOptionLabel = (
83
83
  option: DataSpaceOption,
84
- ): React.ReactNode => (
85
- <div
86
- className="data-space-advanced-search__dialog__option"
87
- title={`${option.label} - ${
88
- option.value.path
89
- } - ${generateGAVCoordinates(
90
- option.value.groupId,
91
- option.value.artifactId,
92
- option.value.versionId,
93
- )}`}
94
- >
95
- <div className="data-space-advanced-search__dialog__option__label">
96
- {option.label}
97
- </div>
98
- <div className="data-space-advanced-search__dialog__option__path">
99
- {option.value.path}
100
- </div>
101
- <div className="data-space-advanced-search__dialog__option__gav">
102
- {generateGAVCoordinates(
103
- option.value.groupId,
104
- option.value.artifactId,
105
- option.value.versionId,
106
- )}
84
+ ): React.ReactNode => {
85
+ const groupId = guaranteeNonNullable(option.value.groupId);
86
+ const artifactId = guaranteeNonNullable(option.value.artifactId);
87
+ const versionId = guaranteeNonNullable(option.value.versionId);
88
+ return (
89
+ <div
90
+ className="data-space-advanced-search__dialog__option"
91
+ title={`${option.label} - ${
92
+ option.value.path
93
+ } - ${generateGAVCoordinates(groupId, artifactId, versionId)}`}
94
+ >
95
+ <div className="data-space-advanced-search__dialog__option__label">
96
+ {option.label}
97
+ </div>
98
+ <div className="data-space-advanced-search__dialog__option__path">
99
+ {option.value.path}
100
+ </div>
101
+ <div className="data-space-advanced-search__dialog__option__gav">
102
+ {generateGAVCoordinates(groupId, artifactId, versionId)}
103
+ </div>
107
104
  </div>
108
- </div>
109
- );
105
+ );
106
+ };
110
107
 
111
108
  // search text
112
109
  const debouncedLoadDataSpaces = useMemo(
@@ -30,7 +30,10 @@ import {
30
30
  } from '@finos/legend-art';
31
31
  import { observer } from 'mobx-react-lite';
32
32
  import { useApplicationStore } from '@finos/legend-application';
33
- import type { DataSpaceQueryBuilderState } from '../../stores/query/DataSpaceQueryBuilderState.js';
33
+ import {
34
+ DataSpaceQueryBuilderState,
35
+ resolveUsableDataSpaceClasses,
36
+ } from '../../stores/query/DataSpaceQueryBuilderState.js';
34
37
  import {
35
38
  buildRuntimeValueOption,
36
39
  getRuntimeOptionFormatter,
@@ -38,32 +41,22 @@ import {
38
41
  } from '@finos/legend-query-builder';
39
42
  import {
40
43
  type Runtime,
41
- type GraphManagerState,
42
- type Mapping,
43
- getMappingCompatibleClasses,
44
44
  getMappingCompatibleRuntimes,
45
45
  PackageableElementExplicitReference,
46
46
  RuntimePointer,
47
- Class,
48
- Package,
49
- getDescendantsOfPackage,
50
47
  } from '@finos/legend-graph';
51
48
  import type { DataSpaceInfo } from '../../stores/query/DataSpaceInfo.js';
52
49
  import { generateGAVCoordinates } from '@finos/legend-storage';
53
50
  import { useEffect, useMemo, useState } from 'react';
54
- import {
55
- debounce,
56
- filterByType,
57
- guaranteeType,
58
- uniq,
59
- } from '@finos/legend-shared';
51
+ import { debounce, guaranteeType } from '@finos/legend-shared';
60
52
  import { flowResult } from 'mobx';
61
- import type {
53
+ import {
62
54
  DataSpace,
63
- DataSpaceExecutionContext,
55
+ type DataSpaceExecutionContext,
64
56
  } from '../../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
65
57
  import { DataSpaceIcon } from '../DSL_DataSpace_Icon.js';
66
58
  import { DataSpaceAdvancedSearchModal } from './DataSpaceAdvancedSearchModal.js';
59
+ import type { EditorStore } from '@finos/legend-application-studio';
67
60
 
68
61
  export type DataSpaceOption = {
69
62
  label: string;
@@ -80,11 +73,15 @@ export const formatDataSpaceOptionLabel = (
80
73
  ): React.ReactNode => (
81
74
  <div
82
75
  className="query-builder__setup__data-space__option"
83
- title={`${option.label} - ${option.value.path} - ${generateGAVCoordinates(
84
- option.value.groupId,
85
- option.value.artifactId,
86
- option.value.versionId,
87
- )}`}
76
+ title={`${option.label} - ${option.value.path} - ${
77
+ option.value.groupId && option.value.artifactId && option.value.versionId
78
+ ? generateGAVCoordinates(
79
+ option.value.groupId,
80
+ option.value.artifactId,
81
+ option.value.versionId,
82
+ )
83
+ : ''
84
+ }`}
88
85
  >
89
86
  <div className="query-builder__setup__data-space__option__label">
90
87
  {option.label}
@@ -93,34 +90,21 @@ export const formatDataSpaceOptionLabel = (
93
90
  {option.value.path}
94
91
  </div>
95
92
  <div className="query-builder__setup__data-space__option__gav">
96
- {generateGAVCoordinates(
97
- option.value.groupId,
98
- option.value.artifactId,
99
- option.value.versionId,
100
- )}
93
+ {option.value.groupId &&
94
+ option.value.artifactId &&
95
+ option.value.versionId && (
96
+ <>
97
+ {generateGAVCoordinates(
98
+ option.value.groupId,
99
+ option.value.artifactId,
100
+ option.value.versionId,
101
+ )}
102
+ </>
103
+ )}
101
104
  </div>
102
105
  </div>
103
106
  );
104
107
 
105
- const resolveDataSpaceClasses = (
106
- dataSpace: DataSpace,
107
- mapping: Mapping,
108
- graphManagerState: GraphManagerState,
109
- ): Class[] => {
110
- if (dataSpace.elements?.length) {
111
- const dataSpaceElements = dataSpace.elements.map((ep) => ep.element.value);
112
- return uniq([
113
- ...dataSpaceElements.filter(filterByType(Class)),
114
- ...dataSpaceElements
115
- .filter(filterByType(Package))
116
- .map((_package) => Array.from(getDescendantsOfPackage(_package)))
117
- .flat()
118
- .filter(filterByType(Class)),
119
- ]);
120
- }
121
- return getMappingCompatibleClasses(mapping, graphManagerState.usableClasses);
122
- };
123
-
124
108
  type ExecutionContextOption = {
125
109
  label: string;
126
110
  value: DataSpaceExecutionContext;
@@ -154,9 +138,9 @@ const DataSpaceQueryBuilderSetupPanelContent = observer(
154
138
  label:
155
139
  queryBuilderState.dataSpace.title ?? queryBuilderState.dataSpace.name,
156
140
  value: {
157
- groupId: queryBuilderState.groupId,
158
- artifactId: queryBuilderState.artifactId,
159
- versionId: queryBuilderState.versionId,
141
+ groupId: queryBuilderState.projectInfo?.groupId,
142
+ artifactId: queryBuilderState.projectInfo?.artifactId,
143
+ versionId: queryBuilderState.projectInfo?.versionId,
160
144
  title: queryBuilderState.dataSpace.title,
161
145
  name: queryBuilderState.dataSpace.name,
162
146
  path: queryBuilderState.dataSpace.path,
@@ -241,7 +225,7 @@ const DataSpaceQueryBuilderSetupPanelContent = observer(
241
225
  });
242
226
 
243
227
  // class
244
- const classes = resolveDataSpaceClasses(
228
+ const classes = resolveUsableDataSpaceClasses(
245
229
  queryBuilderState.dataSpace,
246
230
  queryBuilderState.executionContext.mapping.value,
247
231
  queryBuilderState.graphManagerState,
@@ -408,3 +392,53 @@ export const renderDataSpaceQueryBuilderSetupPanelContent = (
408
392
  queryBuilderState={queryBuilderState}
409
393
  />
410
394
  );
395
+
396
+ export const queryDataSpace = async (
397
+ dataSpace: DataSpace,
398
+ editorStore: EditorStore,
399
+ ): Promise<void> => {
400
+ const embeddedQueryBuilderState = editorStore.embeddedQueryBuilderState;
401
+ await flowResult(
402
+ embeddedQueryBuilderState.setEmbeddedQueryBuilderConfiguration({
403
+ setupQueryBuilderState: () => {
404
+ const queryBuilderState = new DataSpaceQueryBuilderState(
405
+ editorStore.applicationStore,
406
+ editorStore.graphManagerState,
407
+ editorStore.depotServerClient,
408
+ dataSpace,
409
+ dataSpace.defaultExecutionContext,
410
+ (dataSpaceInfo: DataSpaceInfo) => {
411
+ queryBuilderState.dataSpace = guaranteeType(
412
+ queryBuilderState.graphManagerState.graph.getElement(
413
+ dataSpaceInfo.path,
414
+ ),
415
+ DataSpace,
416
+ );
417
+ queryBuilderState.setExecutionContext(
418
+ queryBuilderState.dataSpace.defaultExecutionContext,
419
+ );
420
+ queryBuilderState.propagateExecutionContextChange(
421
+ queryBuilderState.dataSpace.defaultExecutionContext,
422
+ );
423
+ },
424
+ false,
425
+ undefined,
426
+ undefined,
427
+ undefined,
428
+ undefined,
429
+ undefined,
430
+ editorStore.applicationStore.config.options.queryBuilderConfig,
431
+ );
432
+ queryBuilderState.setExecutionContext(
433
+ dataSpace.defaultExecutionContext,
434
+ );
435
+ queryBuilderState.propagateExecutionContextChange(
436
+ dataSpace.defaultExecutionContext,
437
+ );
438
+ return queryBuilderState;
439
+ },
440
+ actionConfigs: [],
441
+ disableCompile: true,
442
+ }),
443
+ );
444
+ };
@@ -56,6 +56,7 @@ import {
56
56
  DataSpacePreviewAction,
57
57
  } from './DataSpacePreviewAction.js';
58
58
  import type { PureGrammarTextSuggestion } from '@finos/legend-lego/code-editor';
59
+ import { DataSpaceQueryAction } from './DataSpaceQueryAction.js';
59
60
 
60
61
  const DATA_SPACE_ELEMENT_TYPE = 'DATA SPACE';
61
62
  const DATA_SPACE_ELEMENT_PROJECT_EXPLORER_DND_TYPE =
@@ -81,6 +82,15 @@ export class DSL_DataSpace_LegendStudioApplicationPlugin
81
82
 
82
83
  override getExtraExplorerContextMenuItemRendererConfigurations(): ExplorerContextMenuItemRendererConfiguration[] {
83
84
  return [
85
+ {
86
+ key: 'data-space-query',
87
+ renderer: (editorStore, element) => {
88
+ if (element instanceof DataSpace) {
89
+ return <DataSpaceQueryAction dataSpace={element} />;
90
+ }
91
+ return undefined;
92
+ },
93
+ },
84
94
  {
85
95
  key: 'data-space-preview',
86
96
  renderer: (editorStore, element) => {
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { MenuContentItem } from '@finos/legend-art';
18
+ import { observer } from 'mobx-react-lite';
19
+ import type { DataSpace } from '../../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
20
+ import { useEditorStore } from '@finos/legend-application-studio';
21
+ import { queryDataSpace } from '../query/DataSpaceQueryBuilder.js';
22
+
23
+ export const DataSpaceQueryAction = observer(
24
+ (props: { dataSpace: DataSpace }) => {
25
+ const { dataSpace } = props;
26
+ const editorStore = useEditorStore();
27
+ const buildQuery = editorStore.applicationStore.guardUnhandledError(
28
+ async () => {
29
+ await queryDataSpace(dataSpace, editorStore);
30
+ },
31
+ );
32
+ return <MenuContentItem onClick={buildQuery}>Query...</MenuContentItem>;
33
+ },
34
+ );
@@ -32,6 +32,7 @@ import {
32
32
  type PlainObject,
33
33
  ActionState,
34
34
  assertErrorThrown,
35
+ guaranteeNonNullable,
35
36
  } from '@finos/legend-shared';
36
37
  import { action, flow, flowResult, makeObservable, observable } from 'mobx';
37
38
  import { DSL_DataSpace_getGraphManagerExtension } from '../../graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.js';
@@ -157,16 +158,15 @@ export class DataSpaceAdvancedSearchState {
157
158
  *loadDataSpace(dataSpace: DataSpaceInfo): GeneratorFn<void> {
158
159
  this.loadDataSpaceState.inProgress();
159
160
  this.loadDataSpaceState.setMessage(`Initializing...`);
160
-
161
161
  try {
162
+ const groupId = guaranteeNonNullable(dataSpace.groupId);
163
+ const artifactId = guaranteeNonNullable(dataSpace.artifactId);
164
+ const versionId = guaranteeNonNullable(dataSpace.versionId);
162
165
  // fetch project
163
166
  this.loadDataSpaceState.setMessage(`Fetching project...`);
164
167
  const project = StoreProjectData.serialization.fromJson(
165
168
  (yield flowResult(
166
- this.depotServerClient.getProject(
167
- dataSpace.groupId,
168
- dataSpace.artifactId,
169
- ),
169
+ this.depotServerClient.getProject(groupId, artifactId),
170
170
  )) as PlainObject<StoreProjectData>,
171
171
  );
172
172
  // analyze data space
@@ -177,13 +177,13 @@ export class DataSpaceAdvancedSearchState {
177
177
  () =>
178
178
  retrieveProjectEntitiesWithDependencies(
179
179
  project,
180
- dataSpace.versionId,
180
+ versionId,
181
181
  this.depotServerClient,
182
182
  ),
183
183
  () =>
184
184
  retrieveAnalyticsResultCache(
185
185
  project,
186
- dataSpace.versionId,
186
+ versionId,
187
187
  dataSpace.path,
188
188
  this.depotServerClient,
189
189
  ),
@@ -192,45 +192,36 @@ export class DataSpaceAdvancedSearchState {
192
192
  this.dataSpaceViewerState = new DataSpaceViewerState(
193
193
  this.applicationStore,
194
194
  this.graphManagerState,
195
- dataSpace.groupId,
196
- dataSpace.artifactId,
197
- dataSpace.versionId,
195
+ groupId,
196
+ artifactId,
197
+ versionId,
198
198
  analysisResult,
199
199
  {
200
200
  retrieveGraphData: () =>
201
201
  new GraphDataWithOrigin(
202
- new LegendSDLC(
203
- dataSpace.groupId,
204
- dataSpace.artifactId,
205
- dataSpace.versionId,
206
- ),
202
+ new LegendSDLC(groupId, artifactId, versionId),
207
203
  ),
208
204
  queryDataSpace: (executionContextKey: string) =>
209
205
  generateDataSpaceQueryCreatorRoute(
210
- dataSpace.groupId,
211
- dataSpace.artifactId,
212
- dataSpace.versionId,
206
+ groupId,
207
+ artifactId,
208
+ versionId,
213
209
  analysisResult.path,
214
210
  executionContextKey,
215
211
  ),
216
212
  viewProject: (path: string | undefined) =>
217
- this.viewProject(
218
- dataSpace.groupId,
219
- dataSpace.artifactId,
220
- dataSpace.versionId,
221
- path,
222
- ),
213
+ this.viewProject(groupId, artifactId, versionId, path),
223
214
  viewSDLCProject: (path: string | undefined) =>
224
- this.viewSDLCProject(dataSpace.groupId, dataSpace.artifactId, path),
215
+ this.viewSDLCProject(groupId, artifactId, path),
225
216
  queryClass: (_class: Class): void => {
226
217
  this.proceedToCreateQuery(_class);
227
218
  },
228
219
  openServiceQuery: (servicePath: string): void =>
229
220
  this.applicationStore.navigationService.navigator.visitAddress(
230
221
  generateServiceQueryCreatorRoute(
231
- dataSpace.groupId,
232
- dataSpace.artifactId,
233
- dataSpace.versionId,
222
+ groupId,
223
+ artifactId,
224
+ versionId,
234
225
  servicePath,
235
226
  ),
236
227
  ),
@@ -22,9 +22,9 @@ import { isString } from '@finos/legend-shared';
22
22
  import { extractEntityNameFromPath } from '@finos/legend-storage';
23
23
 
24
24
  export interface DataSpaceInfo {
25
- groupId: string;
26
- artifactId: string;
27
- versionId: string;
25
+ groupId: string | undefined;
26
+ artifactId: string | undefined;
27
+ versionId: string | undefined;
28
28
  title: string | undefined;
29
29
  name: string;
30
30
  path: string;