@finos/legend-query-builder 4.15.24 → 4.15.26

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 (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