@finos/legend-query-builder 4.14.30 → 4.14.32

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 (124) 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/QueryBuilderPropertyExpressionEditor.d.ts +3 -3
  6. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  7. package/lib/components/QueryBuilderPropertyExpressionEditor.js +23 -15
  8. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  9. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +1 -1
  10. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
  11. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  12. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +5 -10
  13. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
  14. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  15. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +7 -7
  16. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  17. package/lib/graph/QueryBuilderMetaModelConst.d.ts +3 -0
  18. package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
  19. package/lib/graph/QueryBuilderMetaModelConst.js +5 -0
  20. package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
  21. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +4 -1
  22. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
  23. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +1 -0
  24. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
  25. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +51 -3
  26. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
  27. package/lib/index.css +17 -1
  28. package/lib/index.css.map +1 -1
  29. package/lib/index.d.ts +1 -1
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +1 -1
  32. package/lib/index.js.map +1 -1
  33. package/lib/package.json +1 -1
  34. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  35. package/lib/stores/QueryBuilderResultState.js +1 -0
  36. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  37. package/lib/stores/QueryBuilderState.d.ts +4 -1
  38. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  39. package/lib/stores/QueryBuilderState.js +12 -1
  40. package/lib/stores/QueryBuilderState.js.map +1 -1
  41. package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
  42. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  43. package/lib/stores/QueryBuilderStateBuilder.js +40 -5
  44. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  45. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts +5 -0
  46. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  47. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +1 -1
  48. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
  49. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
  50. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  51. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  52. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts +2 -1
  53. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts.map +1 -1
  54. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js +7 -0
  55. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js.map +1 -1
  56. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +1 -0
  57. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  58. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +4 -0
  59. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  60. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.d.ts +2 -0
  61. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.d.ts.map +1 -0
  62. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.js +2 -0
  63. package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.js.map +1 -0
  64. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
  65. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  66. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +4 -0
  67. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  68. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts +3 -3
  69. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
  70. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +9 -2
  71. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
  72. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts +2 -9
  73. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  74. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +45 -36
  75. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  76. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts +20 -0
  77. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts.map +1 -0
  78. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js +55 -0
  79. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js.map +1 -0
  80. package/{src/stores/workflow/QueryBuilderWorkFlowState.ts → lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.d.ts} +5 -12
  81. package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.d.ts.map +1 -0
  82. package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js +54 -0
  83. package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js.map +1 -0
  84. package/lib/stores/{workflow → query-workflow}/QueryBuilderWorkFlowState.d.ts +12 -0
  85. package/lib/stores/query-workflow/QueryBuilderWorkFlowState.d.ts.map +1 -0
  86. package/lib/stores/{workflow → query-workflow}/QueryBuilderWorkFlowState.js +18 -0
  87. package/lib/stores/query-workflow/QueryBuilderWorkFlowState.js.map +1 -0
  88. package/lib/stores/workflows/FunctionQueryBuilderState.d.ts +1 -1
  89. package/lib/stores/workflows/FunctionQueryBuilderState.d.ts.map +1 -1
  90. package/lib/stores/workflows/MappingQueryBuilderState.d.ts +1 -1
  91. package/lib/stores/workflows/MappingQueryBuilderState.d.ts.map +1 -1
  92. package/lib/stores/workflows/ServiceQueryBuilderState.d.ts +1 -1
  93. package/lib/stores/workflows/ServiceQueryBuilderState.d.ts.map +1 -1
  94. package/package.json +4 -4
  95. package/src/components/QueryBuilder.tsx +77 -2
  96. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +34 -20
  97. package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +1 -1
  98. package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +29 -29
  99. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +9 -16
  100. package/src/graph/QueryBuilderMetaModelConst.ts +7 -0
  101. package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +3 -3
  102. package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +122 -1
  103. package/src/index.ts +1 -1
  104. package/src/stores/QueryBuilderResultState.ts +1 -0
  105. package/src/stores/QueryBuilderState.ts +17 -1
  106. package/src/stores/QueryBuilderStateBuilder.ts +83 -10
  107. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +5 -0
  108. package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -1
  109. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -0
  110. package/src/stores/fetch-structure/QueryBuilderFetchStructureState.ts +15 -0
  111. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +5 -0
  112. package/src/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.ts +0 -0
  113. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +5 -0
  114. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +9 -2
  115. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +90 -81
  116. package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.ts +108 -0
  117. package/src/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.ts +103 -0
  118. package/src/stores/query-workflow/QueryBuilderWorkFlowState.ts +64 -0
  119. package/src/stores/workflows/FunctionQueryBuilderState.ts +1 -1
  120. package/src/stores/workflows/MappingQueryBuilderState.ts +1 -1
  121. package/src/stores/workflows/ServiceQueryBuilderState.ts +1 -1
  122. package/tsconfig.json +4 -1
  123. package/lib/stores/workflow/QueryBuilderWorkFlowState.d.ts.map +0 -1
  124. package/lib/stores/workflow/QueryBuilderWorkFlowState.js.map +0 -1
@@ -26,7 +26,7 @@ import {
26
26
  } from '@finos/legend-shared';
27
27
  import type { QueryBuilderState } from './QueryBuilderState.js';
28
28
  import {
29
- type AbstractPropertyExpression,
29
+ AbstractPropertyExpression,
30
30
  type EnumValueInstanceValue,
31
31
  type FunctionExpression,
32
32
  type GraphFetchTreeInstanceValue,
@@ -36,7 +36,8 @@ import {
36
36
  type INTERNAL__PropagatedValue,
37
37
  type ValueSpecification,
38
38
  type CollectionInstanceValue,
39
- type LambdaFunctionInstanceValue,
39
+ LambdaFunctionInstanceValue,
40
+ type ColSpecArrayInstance,
40
41
  InstanceValue,
41
42
  INTERNAL__UnknownValueSpecification,
42
43
  matchFunctionName,
@@ -92,6 +93,10 @@ import {
92
93
  import { checkIfEquivalent } from './milestoning/QueryBuilderMilestoningHelper.js';
93
94
  import type { QueryBuilderParameterValue } from './QueryBuilderParametersState.js';
94
95
  import { QueryBuilderEmbeddedFromExecutionContextState } from './QueryBuilderExecutionContextState.js';
96
+ import {
97
+ isTypedProjectionExpression,
98
+ processTypedTDSProjectExpression,
99
+ } from './fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js';
95
100
 
96
101
  const processGetAllExpression = (
97
102
  expression: SimpleFunctionExpression,
@@ -481,6 +486,7 @@ export class QueryBuilderValueSpecificationProcessor
481
486
  ) {
482
487
  processTDSProjectionDerivationExpression(
483
488
  valueSpecification,
489
+ undefined,
484
490
  this.parentExpression,
485
491
  this.queryBuilderState,
486
492
  );
@@ -637,16 +643,25 @@ export class QueryBuilderValueSpecificationProcessor
637
643
  );
638
644
  return;
639
645
  } else if (
640
- matchFunctionName(
641
- functionName,
646
+ matchFunctionName(functionName, [
642
647
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT,
643
- )
648
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
649
+ ])
644
650
  ) {
645
- processTDSProjectExpression(
646
- valueSpecification,
647
- this.queryBuilderState,
648
- this.parentLambda,
649
- );
651
+ if (isTypedProjectionExpression(valueSpecification)) {
652
+ processTypedTDSProjectExpression(
653
+ valueSpecification,
654
+ this.queryBuilderState,
655
+ this.parentLambda,
656
+ );
657
+ } else {
658
+ processTDSProjectExpression(
659
+ valueSpecification,
660
+ this.queryBuilderState,
661
+ this.parentLambda,
662
+ );
663
+ }
664
+
650
665
  return;
651
666
  } else if (
652
667
  matchFunctionName(
@@ -835,6 +850,7 @@ export class QueryBuilderValueSpecificationProcessor
835
850
  if (
836
851
  matchFunctionName(this.parentExpression.functionName, [
837
852
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT,
853
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
838
854
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_GROUP_BY,
839
855
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_AGG,
840
856
  ...Object.values(
@@ -844,6 +860,7 @@ export class QueryBuilderValueSpecificationProcessor
844
860
  ) {
845
861
  processTDSProjectionColumnPropertyExpression(
846
862
  valueSpecification,
863
+ undefined,
847
864
  this.queryBuilderState,
848
865
  );
849
866
  return;
@@ -903,6 +920,62 @@ export class QueryBuilderValueSpecificationProcessor
903
920
  ): void {
904
921
  throw new UnsupportedOperationError();
905
922
  }
923
+
924
+ visit_ColSpecArrayInstance(valueSpecification: ColSpecArrayInstance): void {
925
+ assertNonNullable(
926
+ this.parentExpression,
927
+ `Can't process col spec aray instance: parent expression cannot be retrieved`,
928
+ );
929
+
930
+ if (
931
+ matchFunctionName(this.parentExpression.functionName, [
932
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
933
+ ])
934
+ ) {
935
+ const spec = valueSpecification.values;
936
+ assertTrue(
937
+ spec.length === 1,
938
+ `Can't process col spec array instance: value expected to be of size 1`,
939
+ );
940
+ guaranteeNonNullable(spec[0]).colSpecs.forEach((col) => {
941
+ const _function1 = guaranteeType(
942
+ col.function1,
943
+ LambdaFunctionInstanceValue,
944
+ `Can't process col spec: function1 not a lambda function instance value`,
945
+ );
946
+ assertTrue(_function1.values.length === 1);
947
+ const lambdaVal = guaranteeNonNullable(_function1.values[0]);
948
+ assertTrue(lambdaVal.expressionSequence.length === 1);
949
+ const expression = guaranteeNonNullable(
950
+ lambdaVal.expressionSequence[0],
951
+ );
952
+
953
+ if (expression instanceof AbstractPropertyExpression) {
954
+ processTDSProjectionColumnPropertyExpression(
955
+ expression,
956
+ col.name,
957
+ this.queryBuilderState,
958
+ );
959
+ } else if (expression instanceof INTERNAL__UnknownValueSpecification) {
960
+ assertNonNullable(
961
+ this.parentExpression,
962
+ `Can't process unknown value: parent expression cannot be retrieved`,
963
+ );
964
+ processTDSProjectionDerivationExpression(
965
+ expression,
966
+ col.name,
967
+ this.parentExpression,
968
+ this.queryBuilderState,
969
+ );
970
+ }
971
+ });
972
+
973
+ return;
974
+ }
975
+ throw new UnsupportedOperationError(
976
+ `Can't process col spec array expression with parent expression of function ${this.parentExpression.functionName}()`,
977
+ );
978
+ }
906
979
  }
907
980
 
908
981
  export const processParameters = (
@@ -205,4 +205,9 @@ export type LambdaFunctionBuilderOption = {
205
205
  * limit for the query results if it exists so the exported results contain all the data
206
206
  */
207
207
  isExportingResult?: boolean | undefined;
208
+ /**
209
+ * Set this flag to `true` when you want to write to typed TDS function using the `Relation`
210
+ * typed in engine. This is still an experimental feature, hence we should only enable this flag when user wants to enable this directly.
211
+ */
212
+ useTypedRelationFunctions?: boolean | undefined;
208
213
  };
@@ -41,7 +41,7 @@ import {
41
41
  INTERNAL__BasicQueryBuilderState,
42
42
  type QueryBuilderState,
43
43
  } from '../QueryBuilderState.js';
44
- import { QueryBuilderAdvancedWorkflowState } from '../workflow/QueryBuilderWorkFlowState.js';
44
+ import { QueryBuilderAdvancedWorkflowState } from '../query-workflow/QueryBuilderWorkFlowState.js';
45
45
 
46
46
  export class TEST__LegendApplicationPluginManager
47
47
  extends LegendApplicationPluginManager<LegendApplicationPlugin>
@@ -58,6 +58,7 @@ export abstract class QueryBuilderFetchStructureImplementationState
58
58
  abstract get usedExplorerTreePropertyNodeIDs(): string[];
59
59
  abstract get fetchStructureValidationIssues(): string[];
60
60
  abstract get allValidationIssues(): string[];
61
+ abstract get fetchLabel(): string;
61
62
 
62
63
  abstract onClassChange(_class: Class | undefined): void;
63
64
  abstract revealCompilationError(compilationError: CompilationError): boolean;
@@ -29,6 +29,21 @@ import {
29
29
  type QueryBuilderFetchStructureImplementationState,
30
30
  } from './QueryBuilderFetchStructureImplementationState.js';
31
31
 
32
+ export const onChangeFetchStructureImplementation =
33
+ (
34
+ implementationType: FETCH_STRUCTURE_IMPLEMENTATION,
35
+ fetchStructureState: QueryBuilderFetchStructureState,
36
+ ): (() => void) =>
37
+ (): void => {
38
+ if (fetchStructureState.implementation.type !== implementationType) {
39
+ fetchStructureState.implementation.checkBeforeChangingImplementation(
40
+ () => {
41
+ fetchStructureState.changeImplementation(implementationType);
42
+ },
43
+ );
44
+ }
45
+ };
46
+
32
47
  export class QueryBuilderFetchStructureState {
33
48
  readonly queryBuilderState: QueryBuilderState;
34
49
  implementation: QueryBuilderFetchStructureImplementationState;
@@ -292,6 +292,7 @@ export class QueryBuilderGraphFetchTreeState
292
292
  setSerializationState: action,
293
293
  setChecked: action,
294
294
  initialize: action,
295
+ checkBeforeChangingImplementation: action,
295
296
  });
296
297
 
297
298
  // try to initialize the graph-fetch tree data using the setup class
@@ -304,6 +305,10 @@ export class QueryBuilderGraphFetchTreeState
304
305
  return FETCH_STRUCTURE_IMPLEMENTATION.GRAPH_FETCH;
305
306
  }
306
307
 
308
+ override get fetchLabel(): string {
309
+ return 'Class Properties';
310
+ }
311
+
307
312
  get usedExplorerTreePropertyNodeIDs(): string[] {
308
313
  if (!this.treeData) {
309
314
  return [];
@@ -154,6 +154,7 @@ export class QueryBuilderTDSState
154
154
  initializeWithQuery: action,
155
155
  setShowPostFilterPanel: action,
156
156
  setShowWindowFuncPanel: action,
157
+ checkBeforeChangingImplementation: action,
157
158
  convertDerivationProjectionObjects: flow,
158
159
  fetchDerivedReturnTypes: flow,
159
160
  });
@@ -194,6 +195,10 @@ export class QueryBuilderTDSState
194
195
  );
195
196
  }
196
197
 
198
+ override get fetchLabel(): string {
199
+ return 'Columns';
200
+ }
201
+
197
202
  override get TEMPORARY__showPostFetchStructurePanel(): boolean {
198
203
  return (
199
204
  this.queryBuilderState.filterState.showPanel ||
@@ -44,7 +44,7 @@ import {
44
44
  QUERY_BUILDER_SUPPORTED_FUNCTIONS,
45
45
  QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS,
46
46
  } from '../../../../graph/QueryBuilderMetaModelConst.js';
47
- import type { QueryBuilderState } from '../../../QueryBuilderState.js';
47
+ import { type QueryBuilderState } from '../../../QueryBuilderState.js';
48
48
  import { QueryBuilderValueSpecificationProcessor } from '../../../QueryBuilderStateBuilder.js';
49
49
  import {
50
50
  extractNullableNumberFromInstanceValue,
@@ -142,6 +142,7 @@ export const processTDSProjectExpression = (
142
142
 
143
143
  export const processTDSProjectionColumnPropertyExpression = (
144
144
  expression: AbstractPropertyExpression,
145
+ columnName: string | undefined,
145
146
  queryBuilderState: QueryBuilderState,
146
147
  ): void => {
147
148
  if (
@@ -200,7 +201,9 @@ export const processTDSProjectionColumnPropertyExpression = (
200
201
  );
201
202
 
202
203
  tdsState.addColumn(columnState, { skipSorting: true });
203
-
204
+ if (columnName) {
205
+ columnState.setColumnName(columnName);
206
+ }
204
207
  // NOTE: technically we should set the lambda parameter name when we process
205
208
  // the lambda, not when we process the lambda body like this, but that requires
206
209
  // some setup, so it's easier to do it here. The validation of this should have
@@ -211,6 +214,7 @@ export const processTDSProjectionColumnPropertyExpression = (
211
214
 
212
215
  export const processTDSProjectionDerivationExpression = (
213
216
  value: INTERNAL__UnknownValueSpecification,
217
+ columnName: string | undefined,
214
218
  parentExpression: SimpleFunctionExpression,
215
219
  queryBuilderState: QueryBuilderState,
216
220
  ): void => {
@@ -236,6 +240,9 @@ export const processTDSProjectionDerivationExpression = (
236
240
  new RawLambda(rawLambdaProtocol.parameters, rawLambdaProtocol.body),
237
241
  );
238
242
  projectionState.addColumn(columnState, { skipSorting: true });
243
+ if (columnName) {
244
+ columnState.setColumnName(columnName);
245
+ }
239
246
  }
240
247
  };
241
248
 
@@ -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
+ };