@finos/legend-query-builder 4.15.25 → 4.15.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. package/lib/components/QueryBuilder.d.ts.map +1 -1
  2. package/lib/components/QueryBuilder.js +2 -2
  3. package/lib/components/QueryBuilder.js.map +1 -1
  4. package/lib/components/data-cube/QueryBuilderDataCube.d.ts +7 -3
  5. package/lib/components/data-cube/QueryBuilderDataCube.d.ts.map +1 -1
  6. package/lib/components/data-cube/QueryBuilderDataCube.js +11 -15
  7. package/lib/components/data-cube/QueryBuilderDataCube.js.map +1 -1
  8. package/lib/components/result/QueryBuilderResultPanel.js +2 -2
  9. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  10. package/lib/index.css +1 -17
  11. package/lib/index.css.map +1 -1
  12. package/lib/index.d.ts +1 -0
  13. package/lib/index.d.ts.map +1 -1
  14. package/lib/index.js +1 -0
  15. package/lib/index.js.map +1 -1
  16. package/lib/package.json +1 -1
  17. package/lib/stores/QueryBuilderState.d.ts +4 -2
  18. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  19. package/lib/stores/QueryBuilderState.js +16 -5
  20. package/lib/stores/QueryBuilderState.js.map +1 -1
  21. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.d.ts +3 -3
  22. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.d.ts.map +1 -1
  23. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js +11 -7
  24. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js.map +1 -1
  25. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.d.ts +2 -2
  26. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.d.ts.map +1 -1
  27. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.js +0 -1
  28. package/lib/stores/data-cube/QueryBuilderDataCubeEngineHelper.js.map +1 -1
  29. package/package.json +5 -5
  30. package/src/components/QueryBuilder.tsx +6 -3
  31. package/src/components/data-cube/QueryBuilderDataCube.tsx +31 -27
  32. package/src/components/result/QueryBuilderResultPanel.tsx +2 -2
  33. package/src/index.ts +1 -0
  34. package/src/stores/QueryBuilderState.ts +19 -5
  35. package/src/stores/data-cube/QueryBuilderDataCubeEngine.ts +21 -13
  36. package/src/stores/data-cube/QueryBuilderDataCubeEngineHelper.ts +1 -2
@@ -88,7 +88,7 @@ import { onChangeFetchStructureImplementation } from '../stores/fetch-structure/
88
88
  import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
89
89
  import { QUERY_BUILDER_DOCUMENTATION_KEY } from '../__lib__/QueryBuilderDocumentation.js';
90
90
  import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
91
- import { QueryBuilderDataCubeDialog } from './data-cube/QueryBuilderDataCube.js';
91
+ import { QueryDataCubeViewer } from './data-cube/QueryBuilderDataCube.js';
92
92
 
93
93
  const QueryBuilderPostGraphFetchPanel = observer(
94
94
  (props: { graphFetchState: QueryBuilderGraphFetchTreeState }) => {
@@ -1138,8 +1138,11 @@ export const QueryBuilder = observer(
1138
1138
  </Modal>
1139
1139
  </Dialog>
1140
1140
  )}
1141
- {queryBuilderState.isCubeEnabled && (
1142
- <QueryBuilderDataCubeDialog queryBuilderState={queryBuilderState} />
1141
+ {queryBuilderState.dataCubeEngine && (
1142
+ <QueryDataCubeViewer
1143
+ engine={queryBuilderState.dataCubeEngine}
1144
+ close={() => queryBuilderState.setDataCubeEngine(undefined)}
1145
+ />
1143
1146
  )}
1144
1147
  </div>
1145
1148
  {queryBuilderState.workflowState.showStatusBar ? (
@@ -15,7 +15,6 @@
15
15
  */
16
16
 
17
17
  import { DataCube } from '@finos/legend-data-cube';
18
- import type { QueryBuilderState } from '../../stores/QueryBuilderState.js';
19
18
  import { observer } from 'mobx-react-lite';
20
19
  import {
21
20
  clsx,
@@ -25,56 +24,61 @@ import {
25
24
  ModalFooterButton,
26
25
  TimesIcon,
27
26
  } from '@finos/legend-art';
28
- import { createDataCubeEngineFromQueryBuilder } from '../../stores/data-cube/QueryBuilderDataCubeEngineHelper.js';
27
+ import type { QueryBuilderDataCubeEngine } from '../../stores/data-cube/QueryBuilderDataCubeEngine.js';
29
28
 
30
- const QueryBuilderDataCube = observer(
31
- (props: { queryBuilderState: QueryBuilderState }) => {
32
- const { queryBuilderState } = props;
33
- const engine = createDataCubeEngineFromQueryBuilder(queryBuilderState);
34
-
35
- if (!engine) {
36
- return null;
37
- }
38
- return <DataCube engine={engine} />;
39
- },
40
- );
41
-
42
- export const QueryBuilderDataCubeDialog = observer(
43
- (props: { queryBuilderState: QueryBuilderState }) => {
44
- const { queryBuilderState } = props;
45
- const closeModal = () => queryBuilderState.setIsCubeEnabled(false);
29
+ export const QueryDataCubeViewer = observer(
30
+ (props: {
31
+ engine: QueryBuilderDataCubeEngine;
32
+ close: () => void;
33
+ options?: {
34
+ fullScreen: boolean;
35
+ };
36
+ }) => {
37
+ const { engine, close, options } = props;
46
38
  return (
47
39
  <Dialog
48
40
  open={true}
49
- onClose={closeModal}
41
+ onClose={close}
50
42
  classes={{
51
43
  root: 'editor-modal__root-container',
52
44
  container: 'editor-modal__container',
53
- paper: 'editor-modal__content',
45
+ paper: clsx('editor-modal__content', {
46
+ 'query-builder-data-cube__dialog__container__content':
47
+ options?.fullScreen,
48
+ }),
54
49
  }}
55
50
  >
56
51
  <Modal
57
52
  darkMode={false}
58
- className={clsx('editor-modal query-builder-data-cube__dialog')}
53
+ className={clsx('editor-modal query-builder-data-cube__dialog', {
54
+ 'query-builder-data-cube__dialog--expanded': options?.fullScreen,
55
+ })}
59
56
  >
60
57
  <div className="query-builder-data-cube__dialog__header">
61
58
  <div className="query-builder-data-cube__dialog__header__actions">
62
59
  <button
63
60
  className="query-builder-data-cube__dialog__header__action"
64
61
  tabIndex={-1}
65
- onClick={closeModal}
62
+ onClick={close}
66
63
  title="Close"
67
64
  >
68
65
  <TimesIcon />
69
66
  </button>
70
67
  </div>
71
68
  </div>
72
- <div className="query-builder-data-cube__dialog__content">
73
- <QueryBuilderDataCube queryBuilderState={queryBuilderState} />
69
+ <div
70
+ className={clsx('query-builder-data-cube__dialog__content', {
71
+ 'query-builder-data-cube__dialog__content-full':
72
+ options?.fullScreen,
73
+ })}
74
+ >
75
+ <DataCube engine={engine} />
74
76
  </div>
75
- <ModalFooter>
76
- <ModalFooterButton onClick={closeModal}>Close</ModalFooterButton>
77
- </ModalFooter>
77
+ {!options?.fullScreen && (
78
+ <ModalFooter>
79
+ <ModalFooterButton onClick={close}>Close</ModalFooterButton>
80
+ </ModalFooter>
81
+ )}
78
82
  </Modal>
79
83
  </Dialog>
80
84
  );
@@ -421,13 +421,13 @@ export const QueryBuilderResultPanel = observer(
421
421
  ) {
422
422
  queryParametersState.parameterValuesEditorState.open(
423
423
  (): Promise<void> => {
424
- queryBuilderState.setIsCubeEnabled(true);
424
+ queryBuilderState.openDataCubeEngine();
425
425
  return Promise.resolve();
426
426
  },
427
427
  PARAMETER_SUBMIT_ACTION.DATA_CUBE,
428
428
  );
429
429
  } else {
430
- queryBuilderState.setIsCubeEnabled(true);
430
+ queryBuilderState.openDataCubeEngine();
431
431
  }
432
432
  };
433
433
  const cancelQuery = applicationStore.guardUnhandledError(() =>
package/src/index.ts CHANGED
@@ -30,6 +30,7 @@ export {
30
30
  QueryBuilder_LegendApplicationPlugin,
31
31
  } from './components/QueryBuilder_LegendApplicationPlugin.js';
32
32
  export { QueryBuilderNavigationBlocker } from './components/QueryBuilderNavigationBlocker.js';
33
+ export { QueryDataCubeViewer } from './components/data-cube/QueryBuilderDataCube.js';
33
34
  export { QueryBuilder } from './components/QueryBuilder.js';
34
35
  export { QUERY_BUILDER_COMPONENT_ELEMENT_ID } from './components/QueryBuilderComponentElement.js';
35
36
  export {
@@ -110,6 +110,8 @@ import { QueryBuilderChangeHistoryState } from './QueryBuilderChangeHistoryState
110
110
  import { type QueryBuilderWorkflowState } from './query-workflow/QueryBuilderWorkFlowState.js';
111
111
  import { type QueryChatState } from './QueryChatState.js';
112
112
  import type { QueryBuilder_LegendApplicationPlugin_Extension } from './QueryBuilder_LegendApplicationPlugin_Extension.js';
113
+ import type { QueryBuilderDataCubeEngine } from './data-cube/QueryBuilderDataCubeEngine.js';
114
+ import { createDataCubeEngineFromQueryBuilder } from './data-cube/QueryBuilderDataCubeEngineHelper.js';
113
115
 
114
116
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type
115
117
  export interface QueryableSourceInfo {}
@@ -162,7 +164,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
162
164
  isCheckingEntitlments = false;
163
165
  isCalendarEnabled = false;
164
166
  isLocalModeEnabled = false;
165
- isCubeEnabled = false;
167
+ dataCubeEngine: QueryBuilderDataCubeEngine | undefined;
166
168
  INTERNAL__enableInitializingDefaultSimpleExpressionValue = false;
167
169
 
168
170
  lambdaWriteMode = QUERY_BUILDER_LAMBDA_WRITER_MODE.STANDARD;
@@ -215,7 +217,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
215
217
  queryChatState: observable,
216
218
  isQueryChatOpened: observable,
217
219
  isLocalModeEnabled: observable,
218
- isCubeEnabled: observable,
220
+ dataCubeEngine: observable,
219
221
  getAllFunction: observable,
220
222
  lambdaWriteMode: observable,
221
223
  INTERNAL__enableInitializingDefaultSimpleExpressionValue: observable,
@@ -229,7 +231,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
229
231
  setShowParametersPanel: action,
230
232
  setIsEditingWatermark: action,
231
233
  setIsCalendarEnabled: action,
232
- setIsCubeEnabled: action,
234
+ setDataCubeEngine: action,
235
+ openDataCubeEngine: action,
233
236
  setIsCheckingEntitlments: action,
234
237
  setClass: action,
235
238
  setIsQueryChatOpened: action,
@@ -412,8 +415,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
412
415
  this.isLocalModeEnabled = val;
413
416
  }
414
417
 
415
- setIsCubeEnabled(val: boolean): void {
416
- this.isCubeEnabled = val;
418
+ setDataCubeEngine(val: QueryBuilderDataCubeEngine | undefined): void {
419
+ this.dataCubeEngine = val;
417
420
  }
418
421
 
419
422
  setInternalize(val: QueryBuilderInternalizeState | undefined): void {
@@ -466,6 +469,17 @@ export abstract class QueryBuilderState implements CommandRegistrar {
466
469
  return !this.unsupportedQueryState.rawLambda;
467
470
  }
468
471
 
472
+ openDataCubeEngine(): void {
473
+ try {
474
+ this.setDataCubeEngine(createDataCubeEngineFromQueryBuilder(this));
475
+ } catch (error) {
476
+ assertErrorThrown(error);
477
+ this.applicationStore.notificationService.notifyError(
478
+ `Unable to open data cube in query builder`,
479
+ );
480
+ }
481
+ }
482
+
469
483
  registerCommands(): void {
470
484
  this.applicationStore.commandService.registerCommand({
471
485
  key: QUERY_BUILDER_COMMAND_KEY.COMPILE,
@@ -29,6 +29,7 @@ import {
29
29
  type PureModel,
30
30
  type V1_ValueSpecification,
31
31
  type ParameterValue,
32
+ LAMBDA_PIPE,
32
33
  } from '@finos/legend-graph';
33
34
  import {
34
35
  _elementPtr,
@@ -46,7 +47,7 @@ import { guaranteeType, isNonNullable, LogService } from '@finos/legend-shared';
46
47
 
47
48
  class QueryBuilderDataCubeSource extends DataCubeSource {
48
49
  mapping?: string | undefined;
49
- runtime!: string;
50
+ runtime: string | undefined;
50
51
  }
51
52
 
52
53
  export class QueryBuilderDataCubeEngine extends DataCubeEngine {
@@ -55,14 +56,14 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
55
56
  readonly selectInitialQuery: RawLambda;
56
57
  readonly mappingPath: string | undefined;
57
58
  readonly parameterValues: ParameterValue[] | undefined;
58
- readonly runtimePath: string;
59
+ readonly runtimePath: string | undefined;
59
60
  _parameters: object | undefined;
60
61
 
61
62
  constructor(
62
63
  selectQuery: RawLambda,
63
64
  parameterValues: ParameterValue[] | undefined,
64
65
  mappingPath: string | undefined,
65
- runtimePath: string,
66
+ runtimePath: string | undefined,
66
67
  graphManagerState: GraphManagerState,
67
68
  ) {
68
69
  super();
@@ -146,8 +147,12 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
146
147
  await this.graphState.graphManager.lambdaToPureCode(lambda);
147
148
  const offset = queryString.length;
148
149
  const codeBlock = queryString + code;
150
+ const finalCode = codeBlock.substring(
151
+ codeBlock.indexOf(LAMBDA_PIPE) + LAMBDA_PIPE.length,
152
+ codeBlock.length,
153
+ );
149
154
  const result = await this.graphState.graphManager.getCodeComplete(
150
- codeBlock,
155
+ finalCode,
151
156
  this.graph,
152
157
  offset,
153
158
  );
@@ -177,7 +182,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
177
182
  );
178
183
  }
179
184
 
180
- private async getRelationalType(query: RawLambda): Promise<RelationType> {
185
+ async getRelationalType(query: RawLambda): Promise<RelationType> {
181
186
  const relationType =
182
187
  await this.graphState.graphManager.getLambdaRelationType(
183
188
  query,
@@ -200,7 +205,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
200
205
  await this.graphState.graphManager.valueSpecificationToPureCode(
201
206
  V1_serializeValueSpecification(baseQuery, []),
202
207
  );
203
- const fullQuery = code + queryString;
208
+ const fullQuery = queryString + code;
204
209
  return this.getRelationalType(
205
210
  await this.graphState.graphManager.pureCodeToLambda(fullQuery),
206
211
  );
@@ -242,13 +247,16 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
242
247
  source: DataCubeSource,
243
248
  ): V1_AppliedFunction | undefined {
244
249
  if (source instanceof QueryBuilderDataCubeSource) {
245
- return _function(
246
- DataCubeFunction.FROM,
247
- [
248
- source.mapping ? _elementPtr(source.mapping) : undefined,
249
- _elementPtr(source.runtime),
250
- ].filter(isNonNullable),
251
- );
250
+ const appendFromFunc = Boolean(source.mapping ?? source.runtime);
251
+ return appendFromFunc
252
+ ? _function(
253
+ DataCubeFunction.FROM,
254
+ [
255
+ source.mapping ? _elementPtr(source.mapping) : undefined,
256
+ source.runtime ? _elementPtr(source.runtime) : undefined,
257
+ ].filter(isNonNullable),
258
+ )
259
+ : undefined;
252
260
  }
253
261
  return undefined;
254
262
  }
@@ -14,7 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { type DataCubeEngine } from '@finos/legend-data-cube';
18
17
  import {
19
18
  QUERY_BUILDER_LAMBDA_WRITER_MODE,
20
19
  type QueryBuilderState,
@@ -25,7 +24,7 @@ import { buildExecutionParameterValues } from '../shared/LambdaParameterState.js
25
24
 
26
25
  export const createDataCubeEngineFromQueryBuilder = (
27
26
  queryBuilderState: QueryBuilderState,
28
- ): DataCubeEngine | undefined => {
27
+ ): QueryBuilderDataCubeEngine | undefined => {
29
28
  const runtime =
30
29
  queryBuilderState.executionContextState.runtimeValue instanceof
31
30
  RuntimePointer