@finos/legend-query-builder 1.0.6 → 2.0.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 (71) hide show
  1. package/lib/application/QueryBuilderEvent.d.ts +7 -7
  2. package/lib/application/QueryBuilderEvent.d.ts.map +1 -1
  3. package/lib/application/QueryBuilderEvent.js +7 -7
  4. package/lib/application/QueryBuilderEvent.js.map +1 -1
  5. package/lib/components/QueryBuilder.js +1 -1
  6. package/lib/components/QueryBuilder.js.map +1 -1
  7. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  8. package/lib/components/QueryBuilderResultPanel.js +13 -2
  9. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  10. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +2 -2
  11. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
  12. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts +3 -2
  13. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  14. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +53 -13
  15. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  16. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  17. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +3 -2
  18. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  19. package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts +1 -0
  20. package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts.map +1 -1
  21. package/lib/graphManager/QueryBuilderSupportedFunctions.js +1 -0
  22. package/lib/graphManager/QueryBuilderSupportedFunctions.js.map +1 -1
  23. package/lib/index.css +2 -2
  24. package/lib/index.css.map +1 -1
  25. package/lib/package.json +7 -7
  26. package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
  27. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  28. package/lib/stores/QueryBuilderStateBuilder.js +8 -1
  29. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  30. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
  31. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  32. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  33. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts.map +1 -1
  34. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js +3 -2
  35. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js.map +1 -1
  36. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +49 -1
  37. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  38. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +126 -0
  39. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  40. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.d.ts +1 -0
  41. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.d.ts.map +1 -1
  42. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js +85 -4
  43. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js.map +1 -1
  44. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.d.ts +3 -2
  45. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.d.ts.map +1 -1
  46. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js +96 -14
  47. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js.map +1 -1
  48. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
  49. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  50. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +6 -0
  51. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  52. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +1 -0
  53. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
  54. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +10 -1
  55. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
  56. package/package.json +14 -14
  57. package/src/application/QueryBuilderEvent.ts +7 -7
  58. package/src/components/QueryBuilder.tsx +1 -1
  59. package/src/components/QueryBuilderResultPanel.tsx +16 -1
  60. package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +2 -2
  61. package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +240 -5
  62. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +8 -5
  63. package/src/graphManager/QueryBuilderSupportedFunctions.ts +1 -0
  64. package/src/stores/QueryBuilderStateBuilder.ts +20 -0
  65. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +2 -0
  66. package/src/stores/fetch-structure/QueryBuilderFetchStructureState.ts +3 -2
  67. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +158 -0
  68. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts +258 -4
  69. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.ts +166 -24
  70. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +7 -0
  71. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +14 -1
@@ -15,20 +15,37 @@
15
15
  */
16
16
 
17
17
  import {
18
+ type ValueSpecification,
19
+ type LambdaFunction,
20
+ type PureModel,
18
21
  extractElementNameFromPath,
19
22
  GenericType,
20
23
  GenericTypeExplicitReference,
21
24
  matchFunctionName,
22
25
  PrimitiveInstanceValue,
23
26
  SimpleFunctionExpression,
24
- type ValueSpecification,
25
- type LambdaFunction,
26
27
  GraphFetchTreeInstanceValue,
27
28
  PrimitiveType,
29
+ InstanceValue,
30
+ Multiplicity,
31
+ PackageableElementExplicitReference,
32
+ SUPPORTED_FUNCTIONS,
33
+ PURE_SERIALIZE_CONFIG_CLASS,
34
+ CollectionInstanceValue,
35
+ KeyExpressionInstanceValue,
36
+ KeyExpression,
28
37
  } from '@finos/legend-graph';
29
- import { guaranteeNonNullable, guaranteeType } from '@finos/legend-shared';
38
+ import {
39
+ UnsupportedOperationError,
40
+ guaranteeNonNullable,
41
+ guaranteeType,
42
+ } from '@finos/legend-shared';
30
43
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../graphManager/QueryBuilderSupportedFunctions.js';
31
- import type { QueryBuilderGraphFetchTreeState } from './QueryBuilderGraphFetchTreeState.js';
44
+ import {
45
+ GraphFetchExternalFormatSerializationState,
46
+ GraphFetchPureSerializationState,
47
+ type QueryBuilderGraphFetchTreeState,
48
+ } from './QueryBuilderGraphFetchTreeState.js';
32
49
  import { isGraphFetchTreeDataEmpty } from './QueryBuilderGraphFetchTreeUtil.js';
33
50
 
34
51
  const appendTakeLimit = (
@@ -79,6 +96,67 @@ const appendTakeLimit = (
79
96
  return lambda;
80
97
  };
81
98
 
99
+ export const buildPureSerializationConfig = (
100
+ config: Record<PropertyKey, boolean>,
101
+ graph: PureModel,
102
+ ): SimpleFunctionExpression => {
103
+ const configClass = graph.getClass(PURE_SERIALIZE_CONFIG_CLASS);
104
+ const newFunction = new SimpleFunctionExpression(
105
+ extractElementNameFromPath(SUPPORTED_FUNCTIONS.NEW),
106
+ );
107
+ // build instance
108
+ const instance = new InstanceValue(Multiplicity.ONE, undefined);
109
+ instance.values[0] = PackageableElementExplicitReference.create(configClass);
110
+ // build values
111
+ const primitiveInstance = new PrimitiveInstanceValue(
112
+ GenericTypeExplicitReference.create(new GenericType(PrimitiveType.STRING)),
113
+ );
114
+ primitiveInstance.values = [''];
115
+ const pureConfigCollection = new CollectionInstanceValue(
116
+ Multiplicity.ONE,
117
+ undefined,
118
+ );
119
+ configClass.properties.forEach((classProperty) => {
120
+ const property = Object.getOwnPropertyNames(config).find(
121
+ (p) => p === classProperty.name,
122
+ );
123
+ if (property) {
124
+ const keyExpressionInstance = new KeyExpressionInstanceValue();
125
+ // key expression
126
+ const keyInstance = new PrimitiveInstanceValue(
127
+ GenericTypeExplicitReference.create(
128
+ new GenericType(PrimitiveType.STRING),
129
+ ),
130
+ );
131
+ keyInstance.values = [property];
132
+ // primitive
133
+ const keyPrimitiveInstance = new PrimitiveInstanceValue(
134
+ GenericTypeExplicitReference.create(
135
+ new GenericType(classProperty.genericType.value.rawType),
136
+ ),
137
+ );
138
+ keyPrimitiveInstance.values = [config[property]];
139
+ const keyExpression = new KeyExpression(
140
+ keyInstance,
141
+ keyPrimitiveInstance,
142
+ false,
143
+ );
144
+ keyExpressionInstance.values = [keyExpression];
145
+ pureConfigCollection.values.push(keyExpressionInstance);
146
+ }
147
+ });
148
+ pureConfigCollection.multiplicity = new Multiplicity(
149
+ pureConfigCollection.values.length,
150
+ pureConfigCollection.values.length,
151
+ );
152
+ newFunction.parametersValues = [
153
+ instance,
154
+ primitiveInstance,
155
+ pureConfigCollection,
156
+ ];
157
+ return newFunction;
158
+ };
159
+
82
160
  export const appendGraphFetch = (
83
161
  graphFetchTreeState: QueryBuilderGraphFetchTreeState,
84
162
  lambdaFunction: LambdaFunction,
@@ -97,30 +175,94 @@ export const appendGraphFetch = (
97
175
  `Can't build graph-fetch tree expression: preceding expression is not defined`,
98
176
  );
99
177
 
100
- // build graph-fetch tree
101
- if (
102
- graphFetchTreeState.treeData &&
103
- !isGraphFetchTreeDataEmpty(graphFetchTreeState.treeData)
178
+ const seriaizationState = graphFetchTreeState.serializationState;
179
+ if (seriaizationState instanceof GraphFetchPureSerializationState) {
180
+ // build graph-fetch tree
181
+ if (
182
+ graphFetchTreeState.treeData &&
183
+ !isGraphFetchTreeDataEmpty(graphFetchTreeState.treeData)
184
+ ) {
185
+ const graphFetchInstance = new GraphFetchTreeInstanceValue();
186
+ graphFetchInstance.values = [graphFetchTreeState.treeData.tree];
187
+ const serializeFunction = new SimpleFunctionExpression(
188
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.SERIALIZE),
189
+ );
190
+ const graphFetchFunc = new SimpleFunctionExpression(
191
+ graphFetchTreeState.isChecked
192
+ ? extractElementNameFromPath(
193
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH_CHECKED,
194
+ )
195
+ : extractElementNameFromPath(
196
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH,
197
+ ),
198
+ );
199
+ graphFetchFunc.parametersValues = [
200
+ precedingExpression,
201
+ graphFetchInstance,
202
+ ];
203
+ serializeFunction.parametersValues = [graphFetchFunc, graphFetchInstance];
204
+ if (seriaizationState.config) {
205
+ const configFunction = buildPureSerializationConfig(
206
+ seriaizationState.config as unknown as Record<PropertyKey, boolean>,
207
+ graphFetchTreeState.queryBuilderState.graphManagerState.graph,
208
+ );
209
+ serializeFunction.parametersValues.push(configFunction);
210
+ }
211
+ lambdaFunction.expressionSequence[0] = serializeFunction;
212
+ }
213
+ } else if (
214
+ seriaizationState instanceof GraphFetchExternalFormatSerializationState
104
215
  ) {
105
- const graphFetchInstance = new GraphFetchTreeInstanceValue();
106
- graphFetchInstance.values = [graphFetchTreeState.treeData.tree];
107
- const serializeFunction = new SimpleFunctionExpression(
108
- extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.SERIALIZE),
216
+ const externalizeFunction = new SimpleFunctionExpression(
217
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.EXTERNALIZE),
109
218
  );
110
- const graphFetchFunc = new SimpleFunctionExpression(
111
- graphFetchTreeState.isChecked
112
- ? extractElementNameFromPath(
113
- QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH_CHECKED,
114
- )
115
- : extractElementNameFromPath(
116
- QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH,
117
- ),
219
+ const mainGraphTree = graphFetchTreeState.treeData;
220
+ const externalizeTree = seriaizationState.treeData;
221
+ if (
222
+ mainGraphTree &&
223
+ externalizeTree &&
224
+ !isGraphFetchTreeDataEmpty(mainGraphTree) &&
225
+ !isGraphFetchTreeDataEmpty(externalizeTree)
226
+ ) {
227
+ // 0th param
228
+ const graphFetchInstance = new GraphFetchTreeInstanceValue();
229
+ graphFetchInstance.values = [mainGraphTree.tree];
230
+ const graphFetchFunc = new SimpleFunctionExpression(
231
+ graphFetchTreeState.isChecked
232
+ ? extractElementNameFromPath(
233
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH_CHECKED,
234
+ )
235
+ : extractElementNameFromPath(
236
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH,
237
+ ),
238
+ );
239
+ graphFetchFunc.parametersValues = [
240
+ precedingExpression,
241
+ graphFetchInstance,
242
+ ];
243
+ // 1st param
244
+ const bindingInstance = new InstanceValue(Multiplicity.ONE, undefined);
245
+ bindingInstance.values = [
246
+ PackageableElementExplicitReference.create(
247
+ seriaizationState.targetBinding,
248
+ ),
249
+ ];
250
+ // 2nd parameter
251
+ const xtGraphFetchInstance = new GraphFetchTreeInstanceValue();
252
+ xtGraphFetchInstance.values = [externalizeTree.tree];
253
+ // build externalize
254
+ externalizeFunction.parametersValues = [
255
+ graphFetchFunc,
256
+ bindingInstance,
257
+ xtGraphFetchInstance,
258
+ ];
259
+ lambdaFunction.expressionSequence[0] = externalizeFunction;
260
+ }
261
+ } else {
262
+ throw new UnsupportedOperationError(
263
+ `Unsupported serialization state ${seriaizationState.getLabel()}`,
118
264
  );
119
- graphFetchFunc.parametersValues = [precedingExpression, graphFetchInstance];
120
- serializeFunction.parametersValues = [graphFetchFunc, graphFetchInstance];
121
- lambdaFunction.expressionSequence[0] = serializeFunction;
122
265
  }
123
-
124
266
  // build result set modifier: i.e. preview limit
125
267
  if (options?.isBuildingExecutionQuery) {
126
268
  appendTakeLimit(lambdaFunction, queryBuilderState.resultState.previewLimit);
@@ -135,6 +135,7 @@ export class QueryBuilderTDSState
135
135
  addColumn: action,
136
136
  moveColumn: action,
137
137
  replaceColumn: action,
138
+ initialize: action,
138
139
  setShowPostFilterPanel: action,
139
140
  setShowWindowFuncPanel: action,
140
141
  convertDerivationProjectionObjects: flow,
@@ -294,6 +295,12 @@ export class QueryBuilderTDSState
294
295
  );
295
296
  }
296
297
 
298
+ override initialize(): void {
299
+ this.queryBuilderState.filterState.setShowPanel(true);
300
+ this.setShowPostFilterPanel(false);
301
+ this.setShowWindowFuncPanel(false);
302
+ }
303
+
297
304
  isColumnInUse(tdsCol: QueryBuilderTDSColumnState): boolean {
298
305
  return Boolean(
299
306
  [
@@ -23,7 +23,7 @@ import {
23
23
  uniq,
24
24
  type Hashable,
25
25
  } from '@finos/legend-shared';
26
- import { action, makeObservable, observable } from 'mobx';
26
+ import { action, computed, makeObservable, observable } from 'mobx';
27
27
  import { QUERY_BUILDER_HASH_STRUCTURE } from '../../../../graphManager/QueryBuilderHashUtils.js';
28
28
  import { DEFAULT_LAMBDA_VARIABLE_NAME } from '../../../QueryBuilderConfig.js';
29
29
  import type { QueryBuilderProjectionColumnDragSource } from '../projection/QueryBuilderProjectionColumnState.js';
@@ -333,6 +333,7 @@ export class QueryBuilderWindowState implements Hashable {
333
333
  makeObservable(this, {
334
334
  windowColumns: observable,
335
335
  editColumn: observable,
336
+ validationIssues: computed,
336
337
  addWindowColumn: action,
337
338
  removeColumn: action,
338
339
  moveColumn: action,
@@ -346,6 +347,18 @@ export class QueryBuilderWindowState implements Hashable {
346
347
  return !this.windowColumns.length;
347
348
  }
348
349
 
350
+ get validationIssues(): string[] | undefined {
351
+ const hasDuplicatedWindowColumns = this.windowColumns.some(
352
+ (column) =>
353
+ this.windowColumns.filter((c) => c.columnName === column.columnName)
354
+ .length > 1,
355
+ );
356
+ if (hasDuplicatedWindowColumns) {
357
+ return ['Query has duplicated window columns'];
358
+ }
359
+ return undefined;
360
+ }
361
+
349
362
  get referencedTDSColumns(): QueryBuilderTDSColumnState[] {
350
363
  return uniq(this.windowColumns.map((c) => c.referencedTDSColumns).flat());
351
364
  }