@finos/legend-application-query 13.5.56 → 13.6.1

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 (65) hide show
  1. package/lib/__lib__/LegendQueryNavigation.d.ts +1 -0
  2. package/lib/__lib__/LegendQueryNavigation.d.ts.map +1 -1
  3. package/lib/__lib__/LegendQueryNavigation.js +1 -0
  4. package/lib/__lib__/LegendQueryNavigation.js.map +1 -1
  5. package/lib/components/CloneQueryServiceSetup.d.ts.map +1 -1
  6. package/lib/components/CloneQueryServiceSetup.js +6 -2
  7. package/lib/components/CloneQueryServiceSetup.js.map +1 -1
  8. package/lib/components/Core_LegendQueryApplicationPlugin.js +4 -4
  9. package/lib/components/Core_LegendQueryApplicationPlugin.js.map +1 -1
  10. package/lib/components/CreateMappingQuerySetup.d.ts.map +1 -1
  11. package/lib/components/CreateMappingQuerySetup.js +6 -2
  12. package/lib/components/CreateMappingQuerySetup.js.map +1 -1
  13. package/lib/components/LegendQueryWebApplication.d.ts.map +1 -1
  14. package/lib/components/LegendQueryWebApplication.js +5 -30
  15. package/lib/components/LegendQueryWebApplication.js.map +1 -1
  16. package/lib/components/QueryEditor.d.ts.map +1 -1
  17. package/lib/components/QueryEditor.js +8 -8
  18. package/lib/components/QueryEditor.js.map +1 -1
  19. package/lib/components/QueryEdtiorExistingQueryVersionRevertModal.d.ts.map +1 -1
  20. package/lib/components/QueryEdtiorExistingQueryVersionRevertModal.js +1 -1
  21. package/lib/components/QueryEdtiorExistingQueryVersionRevertModal.js.map +1 -1
  22. package/lib/components/UpdateExistingServiceQuerySetup.js +1 -1
  23. package/lib/components/UpdateExistingServiceQuerySetup.js.map +1 -1
  24. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.d.ts.map +1 -1
  25. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js +3 -1
  26. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js.map +1 -1
  27. package/lib/components/data-cube/ExistingQueryDataCubeViewer.d.ts +22 -0
  28. package/lib/components/data-cube/ExistingQueryDataCubeViewer.d.ts.map +1 -0
  29. package/lib/components/data-cube/ExistingQueryDataCubeViewer.js +44 -0
  30. package/lib/components/data-cube/ExistingQueryDataCubeViewer.js.map +1 -0
  31. package/lib/components/data-cube/ExistingQueryEditorStoreProviderProvider.d.ts +23 -0
  32. package/lib/components/data-cube/ExistingQueryEditorStoreProviderProvider.d.ts.map +1 -0
  33. package/lib/components/data-cube/ExistingQueryEditorStoreProviderProvider.js +30 -0
  34. package/lib/components/data-cube/ExistingQueryEditorStoreProviderProvider.js.map +1 -0
  35. package/lib/components/data-space/DataSpaceQueryCreator.d.ts.map +1 -1
  36. package/lib/components/data-space/DataSpaceQueryCreator.js +3 -3
  37. package/lib/components/data-space/DataSpaceQueryCreator.js.map +1 -1
  38. package/lib/components/data-space/DataSpaceQuerySetup.js +1 -1
  39. package/lib/components/data-space/DataSpaceQuerySetup.js.map +1 -1
  40. package/lib/components/data-space/DataSpaceTemplateQueryCreator.d.ts.map +1 -1
  41. package/lib/components/data-space/DataSpaceTemplateQueryCreator.js +4 -3
  42. package/lib/components/data-space/DataSpaceTemplateQueryCreator.js.map +1 -1
  43. package/lib/index.css +1 -1
  44. package/lib/package.json +6 -5
  45. package/lib/stores/data-cube/ExistingQueryDataCubeViewer.d.ts +30 -0
  46. package/lib/stores/data-cube/ExistingQueryDataCubeViewer.d.ts.map +1 -0
  47. package/lib/stores/data-cube/ExistingQueryDataCubeViewer.js +59 -0
  48. package/lib/stores/data-cube/ExistingQueryDataCubeViewer.js.map +1 -0
  49. package/package.json +17 -16
  50. package/src/__lib__/LegendQueryNavigation.ts +1 -0
  51. package/src/components/CloneQueryServiceSetup.tsx +10 -2
  52. package/src/components/Core_LegendQueryApplicationPlugin.tsx +4 -4
  53. package/src/components/CreateMappingQuerySetup.tsx +10 -2
  54. package/src/components/LegendQueryWebApplication.tsx +35 -80
  55. package/src/components/QueryEditor.tsx +24 -10
  56. package/src/components/QueryEdtiorExistingQueryVersionRevertModal.tsx +1 -3
  57. package/src/components/UpdateExistingServiceQuerySetup.tsx +1 -1
  58. package/src/components/__test-utils__/QueryEditorComponentTestUtils.tsx +14 -2
  59. package/src/components/data-cube/ExistingQueryDataCubeViewer.tsx +67 -0
  60. package/src/components/data-cube/ExistingQueryEditorStoreProviderProvider.tsx +56 -0
  61. package/src/components/data-space/DataSpaceQueryCreator.tsx +4 -6
  62. package/src/components/data-space/DataSpaceQuerySetup.tsx +1 -1
  63. package/src/components/data-space/DataSpaceTemplateQueryCreator.tsx +10 -6
  64. package/src/stores/data-cube/ExistingQueryDataCubeViewer.ts +98 -0
  65. package/tsconfig.json +3 -0
@@ -279,7 +279,11 @@ const CreateMappingQuerySetupContent = observer(() => {
279
279
  !projectOptions.length
280
280
  }
281
281
  isLoading={setupStore.loadProjectsState.isInProgress}
282
- onChange={onProjectOptionChange}
282
+ onChange={(option: ProjectOption | null) => {
283
+ onProjectOptionChange(option).catch(
284
+ applicationStore.alertUnhandledError,
285
+ );
286
+ }}
283
287
  value={selectedProjectOption}
284
288
  placeholder={projectSelectorPlaceholder}
285
289
  isClearable={true}
@@ -297,7 +301,11 @@ const CreateMappingQuerySetupContent = observer(() => {
297
301
  options={versionOptions}
298
302
  disabled={!setupStore.currentProject}
299
303
  isLoading={fetchSelectedProjectVersionsStatus.isInProgress}
300
- onChange={onVersionOptionChange}
304
+ onChange={(option: VersionOption | null) => {
305
+ onVersionOptionChange(option).catch(
306
+ applicationStore.alertUnhandledError,
307
+ );
308
+ }}
301
309
  value={selectedVersionOption}
302
310
  placeholder={
303
311
  fetchSelectedProjectVersionsStatus.isInProgress
@@ -25,9 +25,8 @@ import {
25
25
  import {
26
26
  BrowserEnvironmentProvider,
27
27
  Route,
28
- Switch,
28
+ Routes,
29
29
  generateExtensionUrlPattern,
30
- type TEMPORARY__ReactRouterComponentType,
31
30
  } from '@finos/legend-application/browser';
32
31
  import {
33
32
  LegendQueryFrameworkProvider,
@@ -41,6 +40,7 @@ import { flowResult } from 'mobx';
41
40
  import { LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN } from '../__lib__/DSL_DataSpace_LegendQueryNavigation.js';
42
41
  import { DataSpaceTemplateQueryCreator } from './data-space/DataSpaceTemplateQueryCreator.js';
43
42
  import { DataSpaceQueryCreator } from './data-space/DataSpaceQueryCreator.js';
43
+ import { ExistingQueryDataCubeViewer } from './data-cube/ExistingQueryDataCubeViewer.js';
44
44
 
45
45
  const LegendQueryWebApplicationRouter = observer(() => {
46
46
  const applicationStore = useLegendQueryApplicationStore();
@@ -58,117 +58,72 @@ const LegendQueryWebApplicationRouter = observer(() => {
58
58
  return (
59
59
  <div className="app">
60
60
  {baseStore.initState.hasCompleted && (
61
- <Switch>
61
+ <Routes>
62
62
  <Route
63
- exact={true}
64
63
  path={LEGEND_QUERY_ROUTE_PATTERN.DEFAULT}
65
- component={
66
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
67
- DataSpaceQueryCreator as TEMPORARY__ReactRouterComponentType
68
- }
64
+ element={<DataSpaceQueryCreator />}
69
65
  />
70
66
  <Route
71
- exact={true}
72
67
  path={LEGEND_QUERY_ROUTE_PATTERN.EDIT_EXISTING_QUERY_SETUP}
73
- component={
74
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
75
- EditExistingQuerySetup as TEMPORARY__ReactRouterComponentType
76
- }
68
+ element={<EditExistingQuerySetup />}
77
69
  />
78
70
 
79
71
  <Route
80
- exact={true}
81
- path={[
82
- generateExtensionUrlPattern(
83
- LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN.TEMPLATE_QUERY,
84
- ),
85
- ]}
86
- component={
87
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
88
- DataSpaceTemplateQueryCreator as TEMPORARY__ReactRouterComponentType
89
- }
72
+ path={generateExtensionUrlPattern(
73
+ LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN.TEMPLATE_QUERY,
74
+ )}
75
+ element={<DataSpaceTemplateQueryCreator />}
90
76
  />
91
77
 
92
78
  <Route
93
- exact={true}
94
79
  path={LEGEND_QUERY_ROUTE_PATTERN.SETUP}
95
- component={
96
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
97
- QuerySetupLandingPage as TEMPORARY__ReactRouterComponentType
98
- }
80
+ element={<QuerySetupLandingPage />}
99
81
  />
100
82
 
101
83
  <Route
102
- exact={true}
103
84
  path={LEGEND_QUERY_ROUTE_PATTERN.CREATE_MAPPING_QUERY_SETUP}
104
- component={
105
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
106
- CreateMappingQuerySetup as TEMPORARY__ReactRouterComponentType
107
- }
85
+ element={<CreateMappingQuerySetup />}
108
86
  />
109
87
  <Route
110
- exact={true}
111
88
  path={LEGEND_QUERY_ROUTE_PATTERN.EDIT_EXISTING_QUERY}
112
- component={
113
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
114
- ExistingQueryEditor as TEMPORARY__ReactRouterComponentType
115
- }
89
+ element={<ExistingQueryEditor />}
90
+ />
91
+ <Route
92
+ path={LEGEND_QUERY_ROUTE_PATTERN.DATA_CUBE_EXISTING_QUERY}
93
+ element={<ExistingQueryDataCubeViewer />}
116
94
  />
117
95
  <Route
118
- exact={true}
119
96
  path={LEGEND_QUERY_ROUTE_PATTERN.CREATE_FROM_SERVICE_QUERY}
120
- component={
121
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
122
- ServiceQueryCreator as TEMPORARY__ReactRouterComponentType
123
- }
97
+ element={<ServiceQueryCreator />}
124
98
  />
125
99
  <Route
126
- exact={true}
127
100
  path={LEGEND_QUERY_ROUTE_PATTERN.CREATE_FROM_MAPPING_QUERY}
128
- component={
129
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
130
- MappingQueryCreator as TEMPORARY__ReactRouterComponentType
131
- }
101
+ element={<MappingQueryCreator />}
132
102
  />
103
+
133
104
  {/* LEGACY DATA SPACE */}
134
105
  <Route
135
- exact={true}
136
- path={[
137
- generateExtensionUrlPattern(
138
- LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN.SETUP,
139
- ),
140
- ]}
141
- component={
142
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
143
- DataSpaceQueryCreator as TEMPORARY__ReactRouterComponentType
144
- }
106
+ path={generateExtensionUrlPattern(
107
+ LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN.SETUP,
108
+ )}
109
+ element={<DataSpaceQueryCreator />}
145
110
  />
146
111
 
147
112
  <Route
148
- exact={true}
149
- path={[
150
- generateExtensionUrlPattern(
151
- LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN.CREATE,
152
- ),
153
- ]}
154
- component={
155
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
156
- DataSpaceQueryCreator as TEMPORARY__ReactRouterComponentType
157
- }
113
+ path={generateExtensionUrlPattern(
114
+ LEGACY_DATA_SPACE_QUERY_ROUTE_PATTERN.CREATE,
115
+ )}
116
+ element={<DataSpaceQueryCreator />}
158
117
  />
159
118
 
160
- {extraApplicationPageEntries.map((entry) => (
161
- <Route
162
- key={entry.key}
163
- exact={true}
164
- path={entry.addressPatterns.map(generateExtensionUrlPattern)}
165
- component={
166
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
167
- entry.renderer as TEMPORARY__ReactRouterComponentType
168
- }
169
- />
170
- ))}
171
- </Switch>
119
+ {extraApplicationPageEntries.flatMap((entry) =>
120
+ entry.addressPatterns
121
+ .map(generateExtensionUrlPattern)
122
+ .map((path) => (
123
+ <Route key={entry.key} path={path} element={entry.renderer()} />
124
+ )),
125
+ )}
126
+ </Routes>
172
127
  )}
173
128
  </div>
174
129
  );
@@ -89,7 +89,11 @@ import {
89
89
  import { LATEST_VERSION_ALIAS } from '@finos/legend-server-depot';
90
90
  import { buildVersionOption, type VersionOption } from './QuerySetup.js';
91
91
  import { QueryEditorExistingQueryVersionRevertModal } from './QueryEdtiorExistingQueryVersionRevertModal.js';
92
- import { debounce, compareSemVerVersions } from '@finos/legend-shared';
92
+ import {
93
+ debounce,
94
+ compareSemVerVersions,
95
+ guaranteeNonNullable,
96
+ } from '@finos/legend-shared';
93
97
  import { LegendQueryInfo } from './LegendQueryAppInfo.js';
94
98
  import { QueryEditorDataspaceInfoModal } from './data-space/DataSpaceInfo.js';
95
99
  import { DataSpaceQueryBuilderState } from '@finos/legend-extension-dsl-data-space/application';
@@ -422,9 +426,7 @@ const QueryEditorExistingQueryInfoModal = observer(
422
426
  const selectedVersionOption = updateState.queryVersionId
423
427
  ? buildVersionOption(updateState.queryVersionId)
424
428
  : buildVersionOption(query.versionId);
425
- const onVersionOptionChange = async (
426
- option: VersionOption | null,
427
- ): Promise<void> => {
429
+ const onVersionOptionChange = (option: VersionOption | null) => {
428
430
  if (option?.value && option.value !== updateState.queryVersionId) {
429
431
  updateState.setQueryVersionId(option.value);
430
432
  }
@@ -816,7 +818,9 @@ const processQueryParams = (
816
818
  export const ExistingQueryEditor = observer(() => {
817
819
  const applicationStore = useApplicationStore();
818
820
  const params = useParams<ExistingQueryEditorPathParams>();
819
- const queryId = params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.QUERY_ID];
821
+ const queryId = guaranteeNonNullable(
822
+ params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.QUERY_ID],
823
+ );
820
824
  const queryParams =
821
825
  applicationStore.navigationService.navigator.getCurrentLocationParameters();
822
826
  const processed = processQueryParams(queryParams);
@@ -839,8 +843,12 @@ export const ExistingQueryEditor = observer(() => {
839
843
  export const ServiceQueryCreator = observer(() => {
840
844
  const applicationStore = useApplicationStore();
841
845
  const parameters = useParams<ServiceQueryCreatorPathParams>();
842
- const gav = parameters[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.GAV];
843
- const servicePath = parameters[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.SERVICE_PATH];
846
+ const gav = guaranteeNonNullable(
847
+ parameters[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.GAV],
848
+ );
849
+ const servicePath = guaranteeNonNullable(
850
+ parameters[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.SERVICE_PATH],
851
+ );
844
852
  const executionKey =
845
853
  applicationStore.navigationService.navigator.getCurrentLocationParameterValue(
846
854
  LEGEND_QUERY_QUERY_PARAM_TOKEN.SERVICE_EXECUTION_KEY,
@@ -859,9 +867,15 @@ export const ServiceQueryCreator = observer(() => {
859
867
 
860
868
  export const MappingQueryCreator = observer(() => {
861
869
  const params = useParams<MappingQueryCreatorPathParams>();
862
- const gav = params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.GAV];
863
- const mappingPath = params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.MAPPING_PATH];
864
- const runtimePath = params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.RUNTIME_PATH];
870
+ const gav = guaranteeNonNullable(
871
+ params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.GAV],
872
+ );
873
+ const mappingPath = guaranteeNonNullable(
874
+ params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.MAPPING_PATH],
875
+ );
876
+ const runtimePath = guaranteeNonNullable(
877
+ params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.RUNTIME_PATH],
878
+ );
865
879
 
866
880
  return (
867
881
  <MappingQueryCreatorStoreProvider
@@ -49,9 +49,7 @@ export const QueryEditorExistingQueryVersionRevertModal = observer(
49
49
  const selectedVersionOption = queryVersion
50
50
  ? buildVersionOption(queryVersion)
51
51
  : null;
52
- const onVersionOptionChange = async (
53
- option: VersionOption | null,
54
- ): Promise<void> => {
52
+ const onVersionOptionChange = (option: VersionOption | null) => {
55
53
  if (option?.value && option.value !== queryVersion) {
56
54
  setQueryVersion(option.value);
57
55
  }
@@ -131,7 +131,7 @@ const UpdateExistingServiceQuerySetupContent = observer(() => {
131
131
  <SearchIcon />
132
132
  </div>
133
133
  <CustomSelectorInput
134
- ref={serviceSearchRef}
134
+ inputRef={serviceSearchRef}
135
135
  className="query-setup__wizard__selector"
136
136
  options={serviceOptions}
137
137
  isLoading={setupStore.loadServicesState.isInProgress}
@@ -44,6 +44,11 @@ import {
44
44
  import { LegendQueryFrameworkProvider } from '../LegendQueryFrameworkProvider.js';
45
45
  import { TEST__BrowserEnvironmentProvider } from '@finos/legend-application/test';
46
46
  import { Core_LegendQueryApplicationPlugin } from '../Core_LegendQueryApplicationPlugin.js';
47
+ import { Route, Routes } from '@finos/legend-application/browser';
48
+ import {
49
+ generateExistingQueryEditorRoute,
50
+ LEGEND_QUERY_ROUTE_PATTERN,
51
+ } from '../../__lib__/LegendQueryNavigation.js';
47
52
 
48
53
  const TEST_QUERY_ID = 'test-query-id';
49
54
  export const TEST_QUERY_NAME = 'MyTestQuery';
@@ -170,9 +175,16 @@ export const TEST__setUpQueryEditor = async (
170
175
 
171
176
  const renderResult = render(
172
177
  <ApplicationStoreProvider store={MOCK__editorStore.applicationStore}>
173
- <TEST__BrowserEnvironmentProvider>
178
+ <TEST__BrowserEnvironmentProvider
179
+ initialEntries={[generateExistingQueryEditorRoute(lightQuery.id)]}
180
+ >
174
181
  <LegendQueryFrameworkProvider>
175
- <ExistingQueryEditor />
182
+ <Routes>
183
+ <Route
184
+ path={LEGEND_QUERY_ROUTE_PATTERN.EDIT_EXISTING_QUERY}
185
+ element={<ExistingQueryEditor />}
186
+ />
187
+ </Routes>
176
188
  </LegendQueryFrameworkProvider>
177
189
  </TEST__BrowserEnvironmentProvider>
178
190
  </ApplicationStoreProvider>,
@@ -0,0 +1,67 @@
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 { useApplicationStore } from '@finos/legend-application';
18
+ import { observer } from 'mobx-react-lite';
19
+ import {
20
+ LEGEND_QUERY_ROUTE_PATTERN_TOKEN,
21
+ type ExistingQueryEditorPathParams,
22
+ } from '../../__lib__/LegendQueryNavigation.js';
23
+ import { useParams } from '@finos/legend-application/browser';
24
+ import {
25
+ ExistingQueryDataCubeEditorStoreProvider,
26
+ useExistingQueryDataCubeEditorStore,
27
+ } from './ExistingQueryEditorStoreProviderProvider.js';
28
+ import { useEffect } from 'react';
29
+ import { flowResult } from 'mobx';
30
+ import { DataCube, DataCubeProvider } from '@finos/legend-data-cube';
31
+ import { QueryBuilderDataCubeApplicationEngine } from '@finos/legend-query-builder';
32
+ import { guaranteeNonNullable } from '@finos/legend-shared';
33
+
34
+ export const DataCubeWrapper = observer(() => {
35
+ const applicationStore = useApplicationStore();
36
+ const store = useExistingQueryDataCubeEditorStore();
37
+
38
+ useEffect(() => {
39
+ flowResult(store.initialize()).catch(applicationStore.alertUnhandledError);
40
+ }, [applicationStore, store]);
41
+
42
+ if (!store.engine) {
43
+ return null;
44
+ }
45
+ const _appEngine = new QueryBuilderDataCubeApplicationEngine(
46
+ applicationStore,
47
+ );
48
+
49
+ return (
50
+ <DataCubeProvider application={_appEngine} engine={store.engine}>
51
+ <DataCube />
52
+ </DataCubeProvider>
53
+ );
54
+ });
55
+
56
+ export const ExistingQueryDataCubeViewer = observer(() => {
57
+ const params = useParams<ExistingQueryEditorPathParams>();
58
+ const queryId = guaranteeNonNullable(
59
+ params[LEGEND_QUERY_ROUTE_PATTERN_TOKEN.QUERY_ID],
60
+ );
61
+
62
+ return (
63
+ <ExistingQueryDataCubeEditorStoreProvider queryId={queryId}>
64
+ <DataCubeWrapper />
65
+ </ExistingQueryDataCubeEditorStoreProvider>
66
+ );
67
+ });
@@ -0,0 +1,56 @@
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 { createContext, useContext } from 'react';
18
+ import { useLocalObservable } from 'mobx-react-lite';
19
+ import { ExistingQueryDataCubeEditorStore } from '../../stores/data-cube/ExistingQueryDataCubeViewer.js';
20
+ import {
21
+ useLegendQueryApplicationStore,
22
+ useLegendQueryBaseStore,
23
+ } from '../LegendQueryFrameworkProvider.js';
24
+ import { guaranteeNonNullable } from '@finos/legend-shared';
25
+
26
+ export const ExistingQueryDataCubeEditorStoreContext = createContext<
27
+ ExistingQueryDataCubeEditorStore | undefined
28
+ >(undefined);
29
+
30
+ export const ExistingQueryDataCubeEditorStoreProvider: React.FC<{
31
+ children: React.ReactNode;
32
+ queryId: string;
33
+ }> = ({ children, queryId }) => {
34
+ const applicationStore = useLegendQueryApplicationStore();
35
+ const baseStore = useLegendQueryBaseStore();
36
+ const store = useLocalObservable(
37
+ () =>
38
+ new ExistingQueryDataCubeEditorStore(
39
+ applicationStore,
40
+ baseStore.depotServerClient,
41
+ queryId,
42
+ ),
43
+ );
44
+ return (
45
+ <ExistingQueryDataCubeEditorStoreContext.Provider value={store}>
46
+ {children}
47
+ </ExistingQueryDataCubeEditorStoreContext.Provider>
48
+ );
49
+ };
50
+
51
+ export const useExistingQueryDataCubeEditorStore =
52
+ (): ExistingQueryDataCubeEditorStore =>
53
+ guaranteeNonNullable(
54
+ useContext(ExistingQueryDataCubeEditorStoreContext),
55
+ `Can't find query editor store in context`,
56
+ );
@@ -88,14 +88,12 @@ const DataSpaceQueryCreatorStoreProvider: React.FC<{
88
88
 
89
89
  export const DataSpaceQueryCreator = observer(() => {
90
90
  const applicationStore = useApplicationStore();
91
- const parameters = useParams<DataSpaceQueryCreatorPathParams | undefined>();
92
- const gav = parameters?.[DATA_SPACE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.GAV];
91
+ const parameters = useParams<DataSpaceQueryCreatorPathParams>();
92
+ const gav = parameters[DATA_SPACE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.GAV];
93
93
  const dataSpacePath =
94
- parameters?.[DATA_SPACE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.DATA_SPACE_PATH];
94
+ parameters[DATA_SPACE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.DATA_SPACE_PATH];
95
95
  const executionContext =
96
- parameters?.[
97
- DATA_SPACE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.EXECUTION_CONTEXT
98
- ];
96
+ parameters[DATA_SPACE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.EXECUTION_CONTEXT];
99
97
  const runtimePath =
100
98
  applicationStore.navigationService.navigator.getCurrentLocationParameterValue(
101
99
  DATA_SPACE_QUERY_CREATOR_QUERY_PARAM_TOKEN.RUNTIME_PATH,
@@ -82,7 +82,7 @@ const DataSpaceQuerySetupSetupPanelContent = observer(
82
82
  </label>
83
83
  <CustomSelectorInput
84
84
  inputId="query-builder__setup__data-space-selector"
85
- ref={dataSpaceSearchRef}
85
+ inputRef={dataSpaceSearchRef}
86
86
  className="panel__content__form__section__dropdown query-builder__setup__config-group__item__selector"
87
87
  options={dataSpaceOptions}
88
88
  isLoading={queryBuilderState.loadDataSpacesState.isInProgress}
@@ -28,6 +28,7 @@ import {
28
28
  type DataSpaceTemplateQueryCreatorPathParams,
29
29
  } from '../../__lib__/DSL_DataSpace_LegendQueryNavigation.js';
30
30
  import { QueryEditor } from '../QueryEditor.js';
31
+ import { guaranteeNonNullable } from '@finos/legend-shared';
31
32
 
32
33
  const DataSpaceTemplateQueryCreatorStoreProvider: React.FC<{
33
34
  children: React.ReactNode;
@@ -59,16 +60,19 @@ const DataSpaceTemplateQueryCreatorStoreProvider: React.FC<{
59
60
 
60
61
  export const DataSpaceTemplateQueryCreator = observer(() => {
61
62
  const parameters = useParams<DataSpaceTemplateQueryCreatorPathParams>();
62
- const gav =
63
- parameters[DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.GAV];
64
- const dataSpacePath =
63
+ const gav = guaranteeNonNullable(
64
+ parameters[DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.GAV],
65
+ );
66
+ const dataSpacePath = guaranteeNonNullable(
65
67
  parameters[
66
68
  DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.DATA_SPACE_PATH
67
- ];
68
- const templateQueryId =
69
+ ],
70
+ );
71
+ const templateQueryId = guaranteeNonNullable(
69
72
  parameters[
70
73
  DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.TEMPLATE_QUERY_ID
71
- ];
74
+ ],
75
+ );
72
76
 
73
77
  return (
74
78
  <DataSpaceTemplateQueryCreatorStoreProvider
@@ -0,0 +1,98 @@
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 type { DepotServerClient } from '@finos/legend-server-depot';
18
+ import type { LegendQueryApplicationStore } from '../LegendQueryBaseStore.js';
19
+ import {
20
+ GraphManagerState,
21
+ type RawLambda,
22
+ type QueryInfo,
23
+ } from '@finos/legend-graph';
24
+ import { DEFAULT_TAB_SIZE } from '@finos/legend-application';
25
+ import { assertErrorThrown, type GeneratorFn } from '@finos/legend-shared';
26
+ import { QueryBuilderDataCubeEngine } from '@finos/legend-query-builder';
27
+
28
+ export class ExistingQueryDataCubeEditorStore {
29
+ readonly applicationStore: LegendQueryApplicationStore;
30
+ readonly depotServerClient: DepotServerClient;
31
+ readonly graphManagerState: GraphManagerState;
32
+ readonly queryId: string;
33
+ engine: QueryBuilderDataCubeEngine | undefined;
34
+
35
+ constructor(
36
+ applicationStore: LegendQueryApplicationStore,
37
+ depotServerClient: DepotServerClient,
38
+ queryId: string,
39
+ ) {
40
+ this.applicationStore = applicationStore;
41
+ this.depotServerClient = depotServerClient;
42
+ this.graphManagerState = new GraphManagerState(
43
+ applicationStore.pluginManager,
44
+ applicationStore.logService,
45
+ );
46
+ this.queryId = queryId;
47
+ }
48
+
49
+ *initialize(): GeneratorFn<void> {
50
+ try {
51
+ // initialize the graph manager
52
+ yield this.graphManagerState.graphManager.initialize(
53
+ {
54
+ env: this.applicationStore.config.env,
55
+ tabSize: DEFAULT_TAB_SIZE,
56
+ clientConfig: {
57
+ baseUrl: this.applicationStore.config.engineServerUrl,
58
+ queryBaseUrl: this.applicationStore.config.engineQueryServerUrl,
59
+ enableCompression: true,
60
+ },
61
+ },
62
+ {
63
+ tracerService: this.applicationStore.tracerService,
64
+ },
65
+ );
66
+ const queryInfo = (yield this.graphManagerState.graphManager.getQueryInfo(
67
+ this.queryId,
68
+ )) as unknown as QueryInfo;
69
+ const content = queryInfo.content;
70
+ const execConext =
71
+ (yield this.graphManagerState.graphManager.resolveQueryInfoExecutionContext(
72
+ queryInfo,
73
+ () =>
74
+ this.depotServerClient.getVersionEntities(
75
+ queryInfo.groupId,
76
+ queryInfo.artifactId,
77
+ queryInfo.versionId,
78
+ ),
79
+ )) as { mapping: string | undefined; runtime: string };
80
+ const lambda =
81
+ (yield this.graphManagerState.graphManager.pureCodeToLambda(
82
+ content,
83
+ )) as unknown as RawLambda;
84
+ const engine = new QueryBuilderDataCubeEngine(
85
+ lambda,
86
+ execConext.mapping,
87
+ execConext.runtime,
88
+ this.graphManagerState,
89
+ );
90
+ this.engine = engine;
91
+ } catch (error) {
92
+ assertErrorThrown(error);
93
+ this.applicationStore.notificationService.notifyError(
94
+ `Unable to initialize cube with query ${this.queryId}: ${error.message}`,
95
+ );
96
+ }
97
+ }
98
+ }
package/tsconfig.json CHANGED
@@ -73,6 +73,7 @@
73
73
  "./src/stores/QuerySetupStore.ts",
74
74
  "./src/stores/UpdateExistingServiceQuerySetupStore.ts",
75
75
  "./src/stores/__test-utils__/LegendQueryApplicationTestUtils.ts",
76
+ "./src/stores/data-cube/ExistingQueryDataCubeViewer.ts",
76
77
  "./src/stores/data-space/DataSpaceQueryBuilderHelper.ts",
77
78
  "./src/stores/data-space/DataSpaceQueryCreatorStore.ts",
78
79
  "./src/stores/data-space/DataSpaceQuerySetupState.ts",
@@ -93,6 +94,8 @@
93
94
  "./src/components/QuerySetup.tsx",
94
95
  "./src/components/UpdateExistingServiceQuerySetup.tsx",
95
96
  "./src/components/__test-utils__/QueryEditorComponentTestUtils.tsx",
97
+ "./src/components/data-cube/ExistingQueryDataCubeViewer.tsx",
98
+ "./src/components/data-cube/ExistingQueryEditorStoreProviderProvider.tsx",
96
99
  "./src/components/data-space/DataSpaceInfo.tsx",
97
100
  "./src/components/data-space/DataSpaceQueryCreator.tsx",
98
101
  "./src/components/data-space/DataSpaceQuerySetup.tsx",