@finos/legend-query-builder 4.15.24 → 4.15.26

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 +2 -2
  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 +9 -6
  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 +1 -1
  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 +16 -16
  36. package/src/stores/data-cube/QueryBuilderDataCubeEngineHelper.ts +1 -2
@@ -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,
@@ -46,7 +46,7 @@ import { guaranteeType, isNonNullable, LogService } from '@finos/legend-shared';
46
46
 
47
47
  class QueryBuilderDataCubeSource extends DataCubeSource {
48
48
  mapping?: string | undefined;
49
- runtime!: string;
49
+ runtime: string | undefined;
50
50
  }
51
51
 
52
52
  export class QueryBuilderDataCubeEngine extends DataCubeEngine {
@@ -55,14 +55,14 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
55
55
  readonly selectInitialQuery: RawLambda;
56
56
  readonly mappingPath: string | undefined;
57
57
  readonly parameterValues: ParameterValue[] | undefined;
58
- readonly runtimePath: string;
58
+ readonly runtimePath: string | undefined;
59
59
  _parameters: object | undefined;
60
60
 
61
61
  constructor(
62
62
  selectQuery: RawLambda,
63
63
  parameterValues: ParameterValue[] | undefined,
64
64
  mappingPath: string | undefined,
65
- runtimePath: string,
65
+ runtimePath: string | undefined,
66
66
  graphManagerState: GraphManagerState,
67
67
  ) {
68
68
  super();
@@ -110,7 +110,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
110
110
  const columns = (await this.getRelationalType(this.selectInitialQuery))
111
111
  .columns;
112
112
  const query = new DataCubeQuery();
113
- query.query = `|~[${columns.map((e) => `'${e.name}'`)}]->select()`;
113
+ query.query = `~[${columns.map((e) => `'${e.name}'`)}]->select()`;
114
114
  const source = new QueryBuilderDataCubeSource();
115
115
  source.sourceColumns = columns;
116
116
  source.mapping = this.mappingPath;
@@ -129,10 +129,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
129
129
  private buildRawLambdaFromValueSpec(query: V1_Lambda): RawLambda {
130
130
  const json = guaranteeType(
131
131
  V1_deserializeRawValueSpecification(
132
- V1_serializeValueSpecification(
133
- query.body[0] as V1_ValueSpecification,
134
- [],
135
- ),
132
+ V1_serializeValueSpecification(query, []),
136
133
  ),
137
134
  V1_RawLambda,
138
135
  );
@@ -180,7 +177,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
180
177
  );
181
178
  }
182
179
 
183
- private async getRelationalType(query: RawLambda): Promise<RelationType> {
180
+ async getRelationalType(query: RawLambda): Promise<RelationType> {
184
181
  const relationType =
185
182
  await this.graphState.graphManager.getLambdaRelationType(
186
183
  query,
@@ -245,13 +242,16 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
245
242
  source: DataCubeSource,
246
243
  ): V1_AppliedFunction | undefined {
247
244
  if (source instanceof QueryBuilderDataCubeSource) {
248
- return _function(
249
- DataCubeFunction.FROM,
250
- [
251
- source.mapping ? _elementPtr(source.mapping) : undefined,
252
- _elementPtr(source.runtime),
253
- ].filter(isNonNullable),
254
- );
245
+ const appendFromFunc = Boolean(source.mapping ?? source.runtime);
246
+ return appendFromFunc
247
+ ? _function(
248
+ DataCubeFunction.FROM,
249
+ [
250
+ source.mapping ? _elementPtr(source.mapping) : undefined,
251
+ source.runtime ? _elementPtr(source.runtime) : undefined,
252
+ ].filter(isNonNullable),
253
+ )
254
+ : undefined;
255
255
  }
256
256
  return undefined;
257
257
  }
@@ -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