@finos/legend-query-builder 4.14.30 → 4.14.31

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 (110) hide show
  1. package/lib/components/QueryBuilder.d.ts +1 -1
  2. package/lib/components/QueryBuilder.d.ts.map +1 -1
  3. package/lib/components/QueryBuilder.js +36 -3
  4. package/lib/components/QueryBuilder.js.map +1 -1
  5. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +1 -1
  6. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
  7. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  8. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +5 -10
  9. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
  10. package/lib/graph/QueryBuilderMetaModelConst.d.ts +3 -0
  11. package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
  12. package/lib/graph/QueryBuilderMetaModelConst.js +5 -0
  13. package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
  14. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +4 -1
  15. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
  16. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +1 -0
  17. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
  18. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +51 -3
  19. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
  20. package/lib/index.css +17 -1
  21. package/lib/index.css.map +1 -1
  22. package/lib/index.d.ts +1 -1
  23. package/lib/index.d.ts.map +1 -1
  24. package/lib/index.js +1 -1
  25. package/lib/index.js.map +1 -1
  26. package/lib/package.json +1 -1
  27. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  28. package/lib/stores/QueryBuilderResultState.js +1 -0
  29. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  30. package/lib/stores/QueryBuilderState.d.ts +4 -1
  31. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  32. package/lib/stores/QueryBuilderState.js +12 -1
  33. package/lib/stores/QueryBuilderState.js.map +1 -1
  34. package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
  35. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  36. package/lib/stores/QueryBuilderStateBuilder.js +33 -4
  37. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  38. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts +5 -0
  39. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  40. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +1 -1
  41. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
  42. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
  43. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  44. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  45. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts +2 -1
  46. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts.map +1 -1
  47. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js +7 -0
  48. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js.map +1 -1
  49. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +1 -0
  50. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  51. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +4 -0
  52. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  53. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.d.ts +2 -0
  54. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.d.ts.map +1 -0
  55. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.js +2 -0
  56. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.js.map +1 -0
  57. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
  58. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  59. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +4 -0
  60. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  61. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts +4 -3
  62. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
  63. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +35 -3
  64. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
  65. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts +2 -9
  66. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  67. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +45 -36
  68. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  69. package/{src/stores/workflow/QueryBuilderWorkFlowState.ts → lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts} +5 -12
  70. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts.map +1 -0
  71. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js +55 -0
  72. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js.map +1 -0
  73. package/lib/stores/{workflow → query-workflow}/QueryBuilderWorkFlowState.d.ts +12 -0
  74. package/lib/stores/query-workflow/QueryBuilderWorkFlowState.d.ts.map +1 -0
  75. package/lib/stores/{workflow → query-workflow}/QueryBuilderWorkFlowState.js +18 -0
  76. package/lib/stores/query-workflow/QueryBuilderWorkFlowState.js.map +1 -0
  77. package/lib/stores/workflows/FunctionQueryBuilderState.d.ts +1 -1
  78. package/lib/stores/workflows/FunctionQueryBuilderState.d.ts.map +1 -1
  79. package/lib/stores/workflows/MappingQueryBuilderState.d.ts +1 -1
  80. package/lib/stores/workflows/MappingQueryBuilderState.d.ts.map +1 -1
  81. package/lib/stores/workflows/ServiceQueryBuilderState.d.ts +1 -1
  82. package/lib/stores/workflows/ServiceQueryBuilderState.d.ts.map +1 -1
  83. package/package.json +3 -3
  84. package/src/components/QueryBuilder.tsx +77 -2
  85. package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +1 -1
  86. package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +29 -29
  87. package/src/graph/QueryBuilderMetaModelConst.ts +7 -0
  88. package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +3 -3
  89. package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +122 -1
  90. package/src/index.ts +1 -1
  91. package/src/stores/QueryBuilderResultState.ts +1 -0
  92. package/src/stores/QueryBuilderState.ts +17 -1
  93. package/src/stores/QueryBuilderStateBuilder.ts +65 -5
  94. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +5 -0
  95. package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -1
  96. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -0
  97. package/src/stores/fetch-structure/QueryBuilderFetchStructureState.ts +15 -0
  98. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +5 -0
  99. package/src/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.ts +0 -0
  100. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +5 -0
  101. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +76 -2
  102. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +90 -81
  103. package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.ts +108 -0
  104. package/src/stores/query-workflow/QueryBuilderWorkFlowState.ts +64 -0
  105. package/src/stores/workflows/FunctionQueryBuilderState.ts +1 -1
  106. package/src/stores/workflows/MappingQueryBuilderState.ts +1 -1
  107. package/src/stores/workflows/ServiceQueryBuilderState.ts +1 -1
  108. package/tsconfig.json +3 -1
  109. package/lib/stores/workflow/QueryBuilderWorkFlowState.d.ts.map +0 -1
  110. package/lib/stores/workflow/QueryBuilderWorkFlowState.js.map +0 -1
@@ -28,6 +28,7 @@ import {
28
28
  V1_RawLambda,
29
29
  VariableExpression,
30
30
  PrimitiveInstanceValue,
31
+ ColSpecArrayInstance,
31
32
  } from '@finos/legend-graph';
32
33
  import {
33
34
  assertNonNullable,
@@ -44,7 +45,10 @@ import {
44
45
  QUERY_BUILDER_SUPPORTED_FUNCTIONS,
45
46
  QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS,
46
47
  } from '../../../../graph/QueryBuilderMetaModelConst.js';
47
- import type { QueryBuilderState } from '../../../QueryBuilderState.js';
48
+ import {
49
+ QUERY_BUILDER_LAMBDA_WRITER_MODE,
50
+ type QueryBuilderState,
51
+ } from '../../../QueryBuilderState.js';
48
52
  import { QueryBuilderValueSpecificationProcessor } from '../../../QueryBuilderStateBuilder.js';
49
53
  import {
50
54
  extractNullableNumberFromInstanceValue,
@@ -59,11 +63,74 @@ import {
59
63
  import { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
60
64
  import { SortColumnState } from '../QueryResultSetModifierState.js';
61
65
 
66
+ export const processTypedTDSProjectExpression = (
67
+ expression: SimpleFunctionExpression,
68
+ queryBuilderState: QueryBuilderState,
69
+ parentLambda: LambdaFunction,
70
+ ): void => {
71
+ // check parameters
72
+ assertTrue(
73
+ expression.parametersValues.length === 2,
74
+ `Can't process project() expression: project() expects 2 arguments`,
75
+ );
76
+ // update fetch-structure
77
+ queryBuilderState.fetchStructureState.changeImplementation(
78
+ FETCH_STRUCTURE_IMPLEMENTATION.TABULAR_DATA_STRUCTURE,
79
+ );
80
+
81
+ // check preceding expression
82
+ const precedingExpression = guaranteeType(
83
+ expression.parametersValues[0],
84
+ SimpleFunctionExpression,
85
+ `Can't process project() expression: only support project() immediately following an expression`,
86
+ );
87
+ assertTrue(
88
+ matchFunctionName(precedingExpression.functionName, [
89
+ QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS.GET_ALL,
90
+ QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS.GET_ALL_VERSIONS,
91
+ QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS.GET_ALL_VERSIONS_IN_RANGE,
92
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.FILTER,
93
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.WATERMARK,
94
+ ]),
95
+ `Can't process project() expression: only support project() immediately following either getAll(), filter(), or forWatermark()`,
96
+ );
97
+ QueryBuilderValueSpecificationProcessor.process(
98
+ precedingExpression,
99
+ parentLambda,
100
+ queryBuilderState,
101
+ );
102
+ // check columns
103
+ const classInstance = expression.parametersValues[1];
104
+ assertType(
105
+ classInstance,
106
+ ColSpecArrayInstance,
107
+ `Can't process project() expression: project() expects argument #1 to be a ColSpecArrayInstance`,
108
+ );
109
+ queryBuilderState.setLambdaWriteMode(
110
+ QUERY_BUILDER_LAMBDA_WRITER_MODE.TYPED_FETCH_STRUCTURE,
111
+ );
112
+ QueryBuilderValueSpecificationProcessor.processChild(
113
+ classInstance,
114
+ expression,
115
+ parentLambda,
116
+ queryBuilderState,
117
+ );
118
+ };
119
+
62
120
  export const processTDSProjectExpression = (
63
121
  expression: SimpleFunctionExpression,
64
122
  queryBuilderState: QueryBuilderState,
65
123
  parentLambda: LambdaFunction,
66
124
  ): void => {
125
+ if (expression.parametersValues.length === 2) {
126
+ processTypedTDSProjectExpression(
127
+ expression,
128
+ queryBuilderState,
129
+ parentLambda,
130
+ );
131
+
132
+ return;
133
+ }
67
134
  // update fetch-structure
68
135
  queryBuilderState.fetchStructureState.changeImplementation(
69
136
  FETCH_STRUCTURE_IMPLEMENTATION.TABULAR_DATA_STRUCTURE,
@@ -142,6 +209,7 @@ export const processTDSProjectExpression = (
142
209
 
143
210
  export const processTDSProjectionColumnPropertyExpression = (
144
211
  expression: AbstractPropertyExpression,
212
+ columnName: string | undefined,
145
213
  queryBuilderState: QueryBuilderState,
146
214
  ): void => {
147
215
  if (
@@ -200,7 +268,9 @@ export const processTDSProjectionColumnPropertyExpression = (
200
268
  );
201
269
 
202
270
  tdsState.addColumn(columnState, { skipSorting: true });
203
-
271
+ if (columnName) {
272
+ columnState.setColumnName(columnName);
273
+ }
204
274
  // NOTE: technically we should set the lambda parameter name when we process
205
275
  // the lambda, not when we process the lambda body like this, but that requires
206
276
  // some setup, so it's easier to do it here. The validation of this should have
@@ -211,6 +281,7 @@ export const processTDSProjectionColumnPropertyExpression = (
211
281
 
212
282
  export const processTDSProjectionDerivationExpression = (
213
283
  value: INTERNAL__UnknownValueSpecification,
284
+ columnName: string | undefined,
214
285
  parentExpression: SimpleFunctionExpression,
215
286
  queryBuilderState: QueryBuilderState,
216
287
  ): void => {
@@ -236,6 +307,9 @@ export const processTDSProjectionDerivationExpression = (
236
307
  new RawLambda(rawLambdaProtocol.parameters, rawLambdaProtocol.body),
237
308
  );
238
309
  projectionState.addColumn(columnState, { skipSorting: true });
310
+ if (columnName) {
311
+ columnState.setColumnName(columnName);
312
+ }
239
313
  }
240
314
  };
241
315
 
@@ -45,10 +45,14 @@ import {
45
45
  } from '../QueryResultSetModifierState.js';
46
46
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../graph/QueryBuilderMetaModelConst.js';
47
47
  import { buildGenericLambdaFunctionInstanceValue } from '../../../QueryBuilderValueSpecificationHelper.js';
48
- import { buildPropertyExpressionChain } from '../../../QueryBuilderValueSpecificationBuilderHelper.js';
48
+ import {
49
+ buildPropertyExpressionChain,
50
+ type LambdaFunctionBuilderOption,
51
+ } from '../../../QueryBuilderValueSpecificationBuilderHelper.js';
49
52
  import { appendOLAPGroupByState } from '../window/QueryBuilderWindowValueSpecificationBuilder.js';
50
53
  import { appendPostFilter } from '../post-filter/QueryBuilderPostFilterValueSpecificationBuilder.js';
51
54
  import { buildTDSSortTypeExpression } from '../QueryBuilderTDSHelper.js';
55
+ import { buildRelationProjection } from './QueryBuilderRelationProjectValueSpecBuidler.js';
52
56
 
53
57
  const buildSortExpression = (
54
58
  sortColumnState: SortColumnState,
@@ -174,15 +178,7 @@ const appendResultSetModifier = (
174
178
  export const appendProjection = (
175
179
  tdsState: QueryBuilderTDSState,
176
180
  lambdaFunction: LambdaFunction,
177
- options?: {
178
- /**
179
- * Set queryBuilderState to `true` when we construct query for execution within the app.
180
- * queryBuilderState will make the lambda function building process overrides several query values, such as the row limit.
181
- */
182
- isBuildingExecutionQuery?: boolean | undefined;
183
- keepSourceInformation?: boolean | undefined;
184
- isExportingResult?: boolean | undefined;
185
- },
181
+ options?: LambdaFunctionBuilderOption,
186
182
  ): void => {
187
183
  const queryBuilderState = tdsState.queryBuilderState;
188
184
  const precedingExpression = guaranteeNonNullable(
@@ -327,82 +323,95 @@ export const appendProjection = (
327
323
  ];
328
324
  lambdaFunction.expressionSequence[0] = groupByFunction;
329
325
  } else if (tdsState.projectionColumns.length) {
330
- // projection
331
- const projectFunction = new SimpleFunctionExpression(
332
- extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT),
333
- );
334
- const colLambdas = new CollectionInstanceValue(
335
- queryBuilderState.graphManagerState.graph.getMultiplicity(
336
- tdsState.projectionColumns.length,
337
- tdsState.projectionColumns.length,
338
- ),
339
- );
340
- const colAliases = new CollectionInstanceValue(
341
- queryBuilderState.graphManagerState.graph.getMultiplicity(
342
- tdsState.projectionColumns.length,
343
- tdsState.projectionColumns.length,
344
- ),
345
- );
346
- tdsState.projectionColumns.forEach((projectionColumnState) => {
347
- // column alias
348
- const colAlias = new PrimitiveInstanceValue(
349
- GenericTypeExplicitReference.create(
350
- new GenericType(PrimitiveType.STRING),
326
+ if (!tdsState.queryBuilderState.isFetchStructureTyped) {
327
+ // projection
328
+ const projectFunction = new SimpleFunctionExpression(
329
+ extractElementNameFromPath(
330
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT,
351
331
  ),
352
332
  );
353
- colAlias.values.push(projectionColumnState.columnName);
354
- colAliases.values.push(colAlias);
355
-
356
- // column projection
357
- let columnLambda: ValueSpecification;
358
- if (
359
- projectionColumnState instanceof QueryBuilderSimpleProjectionColumnState
360
- ) {
361
- columnLambda = buildGenericLambdaFunctionInstanceValue(
362
- projectionColumnState.lambdaParameterName,
363
- [
364
- buildPropertyExpressionChain(
365
- projectionColumnState.propertyExpressionState.propertyExpression,
366
- projectionColumnState.propertyExpressionState.queryBuilderState,
367
- projectionColumnState.lambdaParameterName,
368
- options,
369
- ),
370
- ],
371
- queryBuilderState.graphManagerState.graph,
333
+ const colLambdas = new CollectionInstanceValue(
334
+ queryBuilderState.graphManagerState.graph.getMultiplicity(
335
+ tdsState.projectionColumns.length,
336
+ tdsState.projectionColumns.length,
337
+ ),
338
+ );
339
+ const colAliases = new CollectionInstanceValue(
340
+ queryBuilderState.graphManagerState.graph.getMultiplicity(
341
+ tdsState.projectionColumns.length,
342
+ tdsState.projectionColumns.length,
343
+ ),
344
+ );
345
+ tdsState.projectionColumns.forEach((projectionColumnState) => {
346
+ // column alias
347
+ const colAlias = new PrimitiveInstanceValue(
348
+ GenericTypeExplicitReference.create(
349
+ new GenericType(PrimitiveType.STRING),
350
+ ),
372
351
  );
373
- } else if (
374
- projectionColumnState instanceof
375
- QueryBuilderDerivationProjectionColumnState
376
- ) {
377
- columnLambda = new INTERNAL__UnknownValueSpecification(
378
- V1_serializeRawValueSpecification(
379
- V1_transformRawLambda(
380
- projectionColumnState.lambda,
381
- new V1_GraphTransformerContextBuilder(
382
- // TODO?: do we need to include the plugins here?
383
- [],
384
- )
385
- .withKeepSourceInformationFlag(
386
- Boolean(options?.keepSourceInformation),
352
+ colAlias.values.push(projectionColumnState.columnName);
353
+ colAliases.values.push(colAlias);
354
+
355
+ // column projection
356
+ let columnLambda: ValueSpecification;
357
+ if (
358
+ projectionColumnState instanceof
359
+ QueryBuilderSimpleProjectionColumnState
360
+ ) {
361
+ columnLambda = buildGenericLambdaFunctionInstanceValue(
362
+ projectionColumnState.lambdaParameterName,
363
+ [
364
+ buildPropertyExpressionChain(
365
+ projectionColumnState.propertyExpressionState
366
+ .propertyExpression,
367
+ projectionColumnState.propertyExpressionState.queryBuilderState,
368
+ projectionColumnState.lambdaParameterName,
369
+ options,
370
+ ),
371
+ ],
372
+ queryBuilderState.graphManagerState.graph,
373
+ );
374
+ } else if (
375
+ projectionColumnState instanceof
376
+ QueryBuilderDerivationProjectionColumnState
377
+ ) {
378
+ columnLambda = new INTERNAL__UnknownValueSpecification(
379
+ V1_serializeRawValueSpecification(
380
+ V1_transformRawLambda(
381
+ projectionColumnState.lambda,
382
+ new V1_GraphTransformerContextBuilder(
383
+ // TODO?: do we need to include the plugins here?
384
+ [],
387
385
  )
388
- .build(),
386
+ .withKeepSourceInformationFlag(
387
+ Boolean(options?.keepSourceInformation),
388
+ )
389
+ .build(),
390
+ ),
389
391
  ),
390
- ),
391
- );
392
- } else {
393
- throw new UnsupportedOperationError(
394
- `Can't build project() column expression: unsupported projection column state`,
395
- projectionColumnState,
396
- );
397
- }
398
- colLambdas.values.push(columnLambda);
399
- });
400
- projectFunction.parametersValues = [
401
- precedingExpression,
402
- colLambdas,
403
- colAliases,
404
- ];
405
- lambdaFunction.expressionSequence[0] = projectFunction;
392
+ );
393
+ } else {
394
+ throw new UnsupportedOperationError(
395
+ `Can't build project() column expression: unsupported projection column state`,
396
+ projectionColumnState,
397
+ );
398
+ }
399
+ colLambdas.values.push(columnLambda);
400
+ });
401
+ projectFunction.parametersValues = [
402
+ precedingExpression,
403
+ colLambdas,
404
+ colAliases,
405
+ ];
406
+ lambdaFunction.expressionSequence[0] = projectFunction;
407
+ } else {
408
+ const projectFunction = buildRelationProjection(
409
+ precedingExpression,
410
+ tdsState,
411
+ options,
412
+ );
413
+ lambdaFunction.expressionSequence[0] = projectFunction;
414
+ }
406
415
  }
407
416
 
408
417
  // build olapGroupBy
@@ -0,0 +1,108 @@
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 {
18
+ ColSpecArray,
19
+ type ValueSpecification,
20
+ extractElementNameFromPath,
21
+ SimpleFunctionExpression,
22
+ ColSpecArrayInstance,
23
+ Multiplicity,
24
+ ColSpec,
25
+ INTERNAL__UnknownValueSpecification,
26
+ V1_serializeRawValueSpecification,
27
+ V1_transformRawLambda,
28
+ V1_GraphTransformerContextBuilder,
29
+ } from '@finos/legend-graph';
30
+ import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../graph/QueryBuilderMetaModelConst.js';
31
+ import {
32
+ QueryBuilderDerivationProjectionColumnState,
33
+ QueryBuilderSimpleProjectionColumnState,
34
+ } from './QueryBuilderProjectionColumnState.js';
35
+ import type { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
36
+ import { buildGenericLambdaFunctionInstanceValue } from '../../../QueryBuilderValueSpecificationHelper.js';
37
+ import {
38
+ buildPropertyExpressionChain,
39
+ type LambdaFunctionBuilderOption,
40
+ } from '../../../QueryBuilderValueSpecificationBuilderHelper.js';
41
+ import { UnsupportedOperationError } from '@finos/legend-shared';
42
+
43
+ export const buildRelationProjection = (
44
+ precedingExpression: ValueSpecification,
45
+ tdsState: QueryBuilderTDSState,
46
+ options?: LambdaFunctionBuilderOption,
47
+ ): SimpleFunctionExpression => {
48
+ const projectFunction = new SimpleFunctionExpression(
49
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT),
50
+ );
51
+ const queryBuilderState = tdsState.queryBuilderState;
52
+
53
+ const instanceVal = new ColSpecArrayInstance(Multiplicity.ONE, undefined);
54
+
55
+ const colSepcArray = new ColSpecArray();
56
+ instanceVal.values = [colSepcArray];
57
+
58
+ tdsState.projectionColumns.forEach((projectionColumnState) => {
59
+ const colSpec = new ColSpec();
60
+ colSepcArray.colSpecs.push(colSpec);
61
+ colSpec.name = projectionColumnState.columnName;
62
+ // column projection
63
+ let columnLambda: ValueSpecification;
64
+ if (
65
+ projectionColumnState instanceof QueryBuilderSimpleProjectionColumnState
66
+ ) {
67
+ columnLambda = buildGenericLambdaFunctionInstanceValue(
68
+ projectionColumnState.lambdaParameterName,
69
+ [
70
+ buildPropertyExpressionChain(
71
+ projectionColumnState.propertyExpressionState.propertyExpression,
72
+ projectionColumnState.propertyExpressionState.queryBuilderState,
73
+ projectionColumnState.lambdaParameterName,
74
+ options,
75
+ ),
76
+ ],
77
+ queryBuilderState.graphManagerState.graph,
78
+ );
79
+ } else if (
80
+ projectionColumnState instanceof
81
+ QueryBuilderDerivationProjectionColumnState
82
+ ) {
83
+ columnLambda = new INTERNAL__UnknownValueSpecification(
84
+ V1_serializeRawValueSpecification(
85
+ V1_transformRawLambda(
86
+ projectionColumnState.lambda,
87
+ new V1_GraphTransformerContextBuilder(
88
+ // TODO?: do we need to include the plugins here?
89
+ [],
90
+ )
91
+ .withKeepSourceInformationFlag(
92
+ Boolean(options?.keepSourceInformation),
93
+ )
94
+ .build(),
95
+ ),
96
+ ),
97
+ );
98
+ } else {
99
+ throw new UnsupportedOperationError(
100
+ `Can't build relation project() column expression: unsupported projection column state`,
101
+ projectionColumnState,
102
+ );
103
+ }
104
+ colSpec.function1 = columnLambda;
105
+ });
106
+ projectFunction.parametersValues = [precedingExpression, instanceVal];
107
+ return projectFunction;
108
+ };
@@ -0,0 +1,64 @@
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 { QueryBuilderState } from '../QueryBuilderState.js';
18
+
19
+ export interface FetchStructureLayoutConfig {
20
+ label: string;
21
+ showInFetchPanel: boolean;
22
+ }
23
+
24
+ export abstract class QueryBuilderWorkflowState {
25
+ abstract get showStatusBar(): boolean;
26
+
27
+ abstract getFetchStructureLayoutConfig(
28
+ state: QueryBuilderState,
29
+ ): FetchStructureLayoutConfig;
30
+ }
31
+
32
+ export class QueryBuilderAdvancedWorkflowState extends QueryBuilderWorkflowState {
33
+ get showStatusBar(): boolean {
34
+ return true;
35
+ }
36
+
37
+ override getFetchStructureLayoutConfig(
38
+ state: QueryBuilderState,
39
+ ): FetchStructureLayoutConfig {
40
+ return {
41
+ label: 'fetch structure',
42
+ showInFetchPanel: true,
43
+ };
44
+ }
45
+
46
+ static INSTANCE = new QueryBuilderAdvancedWorkflowState();
47
+ }
48
+
49
+ export class QueryBuilderDataBrowserWorkflow extends QueryBuilderWorkflowState {
50
+ override get showStatusBar(): boolean {
51
+ return false;
52
+ }
53
+
54
+ override getFetchStructureLayoutConfig(
55
+ state: QueryBuilderState,
56
+ ): FetchStructureLayoutConfig {
57
+ return {
58
+ label: state.fetchStructureState.implementation.fetchLabel,
59
+ showInFetchPanel: false,
60
+ };
61
+ }
62
+
63
+ static readonly INSTANCE = new QueryBuilderDataBrowserWorkflow();
64
+ }
@@ -21,7 +21,7 @@ import type {
21
21
  } from '@finos/legend-graph';
22
22
  import { ClassQueryBuilderState } from './ClassQueryBuilderState.js';
23
23
  import type { QueryBuilderConfig } from '../../graph-manager/QueryBuilderConfig.js';
24
- import type { QueryBuilderWorkflowState } from '../workflow/QueryBuilderWorkFlowState.js';
24
+ import type { QueryBuilderWorkflowState } from '../query-workflow/QueryBuilderWorkFlowState.js';
25
25
 
26
26
  // Note: We may want to move it to extend QueryBuilderState directly
27
27
  // but for now we will use the same setup as class as class, mapping, runtime are editable
@@ -28,7 +28,7 @@ import { getNullableFirstEntry } from '@finos/legend-shared';
28
28
  import { renderMappingQueryBuilderSetupPanelContent } from '../../components/workflows/MappingQueryBuilder.js';
29
29
  import { QueryBuilderState } from '../QueryBuilderState.js';
30
30
  import type { QueryBuilderConfig } from '../../graph-manager/QueryBuilderConfig.js';
31
- import type { QueryBuilderWorkflowState } from '../workflow/QueryBuilderWorkFlowState.js';
31
+ import type { QueryBuilderWorkflowState } from '../query-workflow/QueryBuilderWorkFlowState.js';
32
32
 
33
33
  export class MappingQueryBuilderState extends QueryBuilderState {
34
34
  readonly onMappingChange?: ((val: Mapping) => void) | undefined;
@@ -34,7 +34,7 @@ import { action, makeObservable, observable } from 'mobx';
34
34
  import { renderServiceQueryBuilderSetupPanelContent } from '../../components/workflows/ServiceQueryBuilder.js';
35
35
  import { QueryBuilderState } from '../QueryBuilderState.js';
36
36
  import type { QueryBuilderConfig } from '../../graph-manager/QueryBuilderConfig.js';
37
- import type { QueryBuilderWorkflowState } from '../workflow/QueryBuilderWorkFlowState.js';
37
+ import type { QueryBuilderWorkflowState } from '../query-workflow/QueryBuilderWorkFlowState.js';
38
38
 
39
39
  export type ServiceExecutionContext = {
40
40
  key: string;
package/tsconfig.json CHANGED
@@ -92,6 +92,7 @@
92
92
  "./src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts",
93
93
  "./src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.ts",
94
94
  "./src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.ts",
95
+ "./src/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.ts",
95
96
  "./src/stores/fetch-structure/tds/QueryBuilderTDSColumnState.ts",
96
97
  "./src/stores/fetch-structure/tds/QueryBuilderTDSHelper.ts",
97
98
  "./src/stores/fetch-structure/tds/QueryBuilderTDSState.ts",
@@ -134,6 +135,7 @@
134
135
  "./src/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.ts",
135
136
  "./src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts",
136
137
  "./src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts",
138
+ "./src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.ts",
137
139
  "./src/stores/fetch-structure/tds/window/QueryBuilderWindowGroupByOperatorLoader.ts",
138
140
  "./src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts",
139
141
  "./src/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.ts",
@@ -170,6 +172,7 @@
170
172
  "./src/stores/milestoning/QueryBuilderMilestoningImplementation.ts",
171
173
  "./src/stores/milestoning/QueryBuilderMilestoningState.ts",
172
174
  "./src/stores/milestoning/QueryBuilderProcessingTemporalMilestoningImplementation.ts",
175
+ "./src/stores/query-workflow/QueryBuilderWorkFlowState.ts",
173
176
  "./src/stores/shared/LambdaEditorState.ts",
174
177
  "./src/stores/shared/LambdaParameterState.ts",
175
178
  "./src/stores/shared/ValueSpecificationEditorHelper.ts",
@@ -177,7 +180,6 @@
177
180
  "./src/stores/watermark/QueryBuilderWatermarkState.ts",
178
181
  "./src/stores/watermark/QueryBuilderWatermarkStateBuilder.ts",
179
182
  "./src/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.ts",
180
- "./src/stores/workflow/QueryBuilderWorkFlowState.ts",
181
183
  "./src/stores/workflows/ClassQueryBuilderState.ts",
182
184
  "./src/stores/workflows/FunctionQueryBuilderState.ts",
183
185
  "./src/stores/workflows/MappingQueryBuilderState.ts",
@@ -1 +0,0 @@
1
- {"version":3,"file":"QueryBuilderWorkFlowState.d.ts","sourceRoot":"","sources":["../../../src/stores/workflow/QueryBuilderWorkFlowState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8BAAsB,yBAAyB;IAC7C,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC;CACvC;AAED,qBAAa,iCAAkC,SAAQ,yBAAyB;IAC9E,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,MAAM,CAAC,QAAQ,oCAA2C;CAC3D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"QueryBuilderWorkFlowState.js","sourceRoot":"","sources":["../../../src/stores/workflow/QueryBuilderWorkFlowState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,OAAgB,yBAAyB;CAE9C;AAED,MAAM,OAAO,iCAAkC,SAAQ,yBAAyB;IAC9E,IAAI,aAAa;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,QAAQ,GAAG,IAAI,iCAAiC,EAAE,CAAC"}