@finos/legend-query-builder 4.18.0 → 4.18.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 (122) hide show
  1. package/lib/__test__.d.ts +1 -0
  2. package/lib/__test__.d.ts.map +1 -1
  3. package/lib/__test__.js +1 -0
  4. package/lib/__test__.js.map +1 -1
  5. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts +5 -0
  6. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts.map +1 -1
  7. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +28 -2
  8. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
  9. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  10. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +8 -2
  11. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  12. package/lib/components/workflows/AccessorQueryBuilder.js +1 -1
  13. package/lib/components/workflows/AccessorQueryBuilder.js.map +1 -1
  14. package/lib/components/workflows/DataProductQueryBuilder.d.ts.map +1 -1
  15. package/lib/components/workflows/DataProductQueryBuilder.js +13 -12
  16. package/lib/components/workflows/DataProductQueryBuilder.js.map +1 -1
  17. package/lib/data-access-overview.css +1 -1
  18. package/lib/graph/QueryBuilderMetaModelConst.d.ts +2 -0
  19. package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
  20. package/lib/graph/QueryBuilderMetaModelConst.js +2 -0
  21. package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
  22. package/lib/index.css +1 -1
  23. package/lib/index.d.ts +1 -1
  24. package/lib/index.d.ts.map +1 -1
  25. package/lib/index.js +1 -1
  26. package/lib/index.js.map +1 -1
  27. package/lib/package.json +1 -1
  28. package/lib/stores/QueryBuilderStateHashUtils.d.ts +1 -0
  29. package/lib/stores/QueryBuilderStateHashUtils.d.ts.map +1 -1
  30. package/lib/stores/QueryBuilderStateHashUtils.js +1 -0
  31. package/lib/stores/QueryBuilderStateHashUtils.js.map +1 -1
  32. package/lib/stores/QueryBuilderTypeaheadHelper.js +4 -4
  33. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
  34. package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts +1 -1
  35. package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts.map +1 -1
  36. package/lib/stores/QueryBuilderValueSpecificationHelper.js +2 -2
  37. package/lib/stores/QueryBuilderValueSpecificationHelper.js.map +1 -1
  38. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.d.ts +374 -0
  39. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.d.ts.map +1 -0
  40. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.js +625 -0
  41. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.js.map +1 -0
  42. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  43. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +3 -2
  44. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  45. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderRelationAggregationValueSpecBuilder.js +2 -2
  46. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderRelationAggregationValueSpecBuilder.js.map +1 -1
  47. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.js +1 -1
  48. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.js.map +1 -1
  49. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  50. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +8 -6
  51. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  52. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js +2 -2
  53. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js.map +1 -1
  54. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowGroupByOperatorLoader.d.ts.map +1 -1
  55. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowGroupByOperatorLoader.js +2 -0
  56. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowGroupByOperatorLoader.js.map +1 -1
  57. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts.map +1 -1
  58. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js +40 -14
  59. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js.map +1 -1
  60. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts.map +1 -1
  61. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js +72 -30
  62. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js.map +1 -1
  63. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts +1 -1
  64. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts.map +1 -1
  65. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js +1 -1
  66. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js.map +1 -1
  67. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js +1 -1
  68. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js.map +1 -1
  69. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js +1 -1
  70. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js.map +1 -1
  71. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js +1 -1
  72. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js.map +1 -1
  73. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_PercentRank.d.ts +25 -0
  74. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_PercentRank.d.ts.map +1 -0
  75. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_PercentRank.js +54 -0
  76. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_PercentRank.js.map +1 -0
  77. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js +1 -1
  78. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js.map +1 -1
  79. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js +1 -1
  80. package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js.map +1 -1
  81. package/lib/stores/filter/QueryBuilderFilterValueSpecificationBuilder.js +3 -3
  82. package/lib/stores/filter/QueryBuilderFilterValueSpecificationBuilder.js.map +1 -1
  83. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts +1 -0
  84. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts.map +1 -1
  85. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js +4 -0
  86. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js.map +1 -1
  87. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts +31 -6
  88. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts.map +1 -1
  89. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +162 -15
  90. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
  91. package/package.json +5 -5
  92. package/src/__test__.ts +1 -0
  93. package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +73 -1
  94. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +10 -4
  95. package/src/components/workflows/AccessorQueryBuilder.tsx +2 -2
  96. package/src/components/workflows/DataProductQueryBuilder.tsx +40 -62
  97. package/src/graph/QueryBuilderMetaModelConst.ts +2 -0
  98. package/src/index.ts +3 -0
  99. package/src/stores/QueryBuilderStateHashUtils.ts +1 -0
  100. package/src/stores/QueryBuilderTypeaheadHelper.ts +4 -4
  101. package/src/stores/QueryBuilderValueSpecificationHelper.ts +5 -3
  102. package/src/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.ts +630 -0
  103. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +3 -2
  104. package/src/stores/fetch-structure/tds/aggregation/QueryBuilderRelationAggregationValueSpecBuilder.ts +2 -2
  105. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.ts +1 -1
  106. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +8 -6
  107. package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.ts +2 -2
  108. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowGroupByOperatorLoader.ts +2 -0
  109. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.ts +85 -25
  110. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.ts +141 -38
  111. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.ts +1 -1
  112. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.ts +1 -1
  113. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.ts +1 -1
  114. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.ts +1 -1
  115. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.ts +1 -1
  116. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_PercentRank.ts +57 -0
  117. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.ts +1 -1
  118. package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.ts +1 -1
  119. package/src/stores/filter/QueryBuilderFilterValueSpecificationBuilder.ts +3 -3
  120. package/src/stores/workflows/accessor/AccessorQueryBuilderState.ts +5 -0
  121. package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +275 -24
  122. package/tsconfig.json +2 -0
@@ -67,7 +67,7 @@ const buildProjectColFunc = (
67
67
  projectionColumnState instanceof QueryBuilderSimpleProjectionColumnState
68
68
  ) {
69
69
  columnLambda = buildGenericLambdaFunctionInstanceValue(
70
- projectionColumnState.lambdaParameterName,
70
+ [projectionColumnState.lambdaParameterName],
71
71
  [
72
72
  buildPropertyExpressionChain(
73
73
  projectionColumnState.propertyExpressionState.propertyExpression,
@@ -172,7 +172,7 @@ export const appendProjection = (
172
172
  projectionColumnState instanceof QueryBuilderSimpleProjectionColumnState
173
173
  ) {
174
174
  columnLambda = buildGenericLambdaFunctionInstanceValue(
175
- projectionColumnState.lambdaParameterName,
175
+ [projectionColumnState.lambdaParameterName],
176
176
  [
177
177
  buildPropertyExpressionChain(
178
178
  projectionColumnState.propertyExpressionState.propertyExpression,
@@ -222,7 +222,7 @@ export const appendProjection = (
222
222
  extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_AGG),
223
223
  );
224
224
  const aggregateLambda = buildGenericLambdaFunctionInstanceValue(
225
- aggregateColumnState.lambdaParameterName,
225
+ [aggregateColumnState.lambdaParameterName],
226
226
  [
227
227
  aggregateColumnState.operator.buildAggregateExpressionFromState(
228
228
  aggregateColumnState,
@@ -242,8 +242,10 @@ export const appendProjection = (
242
242
  aggregateCalendarLambdaState instanceof SimpleFunctionExpression
243
243
  ) {
244
244
  aggregateCalendarLambda = buildGenericLambdaFunctionInstanceValue(
245
- guaranteeNonNullable(aggregateColumnState.calendarFunction)
246
- .lambdaParameterName,
245
+ [
246
+ guaranteeNonNullable(aggregateColumnState.calendarFunction)
247
+ .lambdaParameterName,
248
+ ],
247
249
  [aggregateCalendarLambdaState],
248
250
  aggregateColumnState.aggregationState.tdsState.queryBuilderState
249
251
  .graphManagerState.graph,
@@ -348,7 +350,7 @@ export const appendProjection = (
348
350
  QueryBuilderSimpleProjectionColumnState
349
351
  ) {
350
352
  columnLambda = buildGenericLambdaFunctionInstanceValue(
351
- projectionColumnState.lambdaParameterName,
353
+ [projectionColumnState.lambdaParameterName],
352
354
  [
353
355
  buildPropertyExpressionChain(
354
356
  projectionColumnState.propertyExpressionState
@@ -79,7 +79,7 @@ export const buildRelationProjection = (
79
79
  projectionColumnState instanceof QueryBuilderSimpleProjectionColumnState
80
80
  ) {
81
81
  columnLambda = buildGenericLambdaFunctionInstanceValue(
82
- projectionColumnState.lambdaParameterName,
82
+ [projectionColumnState.lambdaParameterName],
83
83
  [
84
84
  buildPropertyExpressionChain(
85
85
  projectionColumnState.propertyExpressionState.propertyExpression,
@@ -104,7 +104,7 @@ export const buildRelationProjection = (
104
104
  simple.func = real;
105
105
  simple.parametersValues = [variable];
106
106
  columnLambda = buildGenericLambdaFunctionInstanceValue(
107
- projectionColumnState.lambdaParameterName,
107
+ [projectionColumnState.lambdaParameterName],
108
108
  [simple],
109
109
  queryBuilderState.graphManagerState.graph,
110
110
  );
@@ -24,6 +24,7 @@ import { QueryBuilderTDS_WindowOperator_Count } from './operators/QueryBuilderTD
24
24
  import { QueryBuilderTDS_WindowOperator_Max } from './operators/QueryBuilderTDS_WindowOperator_Max.js';
25
25
  import { QueryBuilderTDS_WindowOperator_Min } from './operators/QueryBuilderTDS_WindowOperator_Min.js';
26
26
  import { QueryBuilderTDS_WindowOperator_Average } from './operators/QueryBuilderTDS_WindowOperator_Average.js';
27
+ import { QueryBuilderTDS_WindowRankOperator_PercentRank } from './operators/QueryBuilderTDS_WindowOperator_PercentRank.js';
27
28
 
28
29
  export const getQueryBuilderCoreWindowOperators =
29
30
  (): QueryBuilderTDS_WindowOperator[] => [
@@ -36,4 +37,5 @@ export const getQueryBuilderCoreWindowOperators =
36
37
  new QueryBuilderTDS_WindowRankOperator_DenseRank(),
37
38
  new QueryBuilderTDS_WindowRankOperator_Rank(),
38
39
  new QueryBuilderTDS_WindowRankOperator_RowNumber(),
40
+ new QueryBuilderTDS_WindowRankOperator_PercentRank(),
39
41
  ];
@@ -19,6 +19,7 @@ import {
19
19
  type ColSpec,
20
20
  ColSpecArrayInstance,
21
21
  ColSpecInstanceValue,
22
+ FunctionExpression,
22
23
  LambdaFunction,
23
24
  LambdaFunctionInstanceValue,
24
25
  matchFunctionName,
@@ -248,35 +249,94 @@ const process_WindowOperatorState = (
248
249
  colSpec: ColSpec,
249
250
  tdsState: QueryBuilderTDSState,
250
251
  ): QueryBuilderTDS_WindowOperatorState => {
251
- //TODO: handle aggregation operators
252
- const rankLambda = guaranteeType(
253
- guaranteeType(colSpec.function1, LambdaFunctionInstanceValue).values[0],
254
- LambdaFunction,
255
- );
256
- assertTrue(rankLambda.expressionSequence.length === 1);
257
- const operationFunctionExp = guaranteeType(
258
- rankLambda.expressionSequence[0],
259
- SimpleFunctionExpression,
260
- );
252
+ if (colSpec.function2) {
253
+ //process function 1
254
+ const function1Lambda = guaranteeType(
255
+ guaranteeType(colSpec.function1, LambdaFunctionInstanceValue).values[0],
256
+ LambdaFunction,
257
+ );
258
+ const function1Column = guaranteeType(
259
+ function1Lambda.expressionSequence[0],
260
+ FunctionExpression,
261
+ `Can't process typed window aggregation: expects function1 to be a Function Expression`,
262
+ );
263
+ const aggColumnState = getTDSColumnState(
264
+ tdsState,
265
+ function1Column.functionName,
266
+ );
261
267
 
262
- const operation = guaranteeNonNullable(
263
- tdsState.windowState.findOperator(operationFunctionExp.functionName, true),
264
- `Operator '${operationFunctionExp.functionName}' not supported yet for typed TDS`,
265
- );
268
+ //process function2
269
+ const aggLambda = guaranteeType(
270
+ guaranteeType(colSpec.function2, LambdaFunctionInstanceValue).values[0],
271
+ LambdaFunction,
272
+ );
273
+ const aggFunctionExp = guaranteeType(
274
+ aggLambda.expressionSequence[0],
275
+ SimpleFunctionExpression,
276
+ );
266
277
 
267
- const operatorState = new QueryBuilderTDS_WindowRankOperatorState(
268
- tdsState.windowState,
269
- operation,
270
- );
278
+ const operation = guaranteeNonNullable(
279
+ tdsState.windowState.findOperator(aggFunctionExp.functionName, true),
280
+ `Operator '${aggFunctionExp.functionName}' not supported yet for typed TDS`,
281
+ );
271
282
 
272
- const operatorParameters: string[] = [];
273
- rankLambda.functionType.parameters.forEach((param) => {
274
- guaranteeType(param, VariableExpression);
275
- operatorParameters.push(param.name);
276
- });
277
- operatorState.setLambdaParameterNames(operatorParameters);
283
+ const operatorState = new QueryBuilderTDS_WindowAggreationOperatorState(
284
+ tdsState.windowState,
285
+ operation,
286
+ aggColumnState,
287
+ );
278
288
 
279
- return operatorState;
289
+ //add parameter vlaues
290
+ const lambdaParameters: string[] = [];
291
+ function1Lambda.functionType.parameters.forEach((param) => {
292
+ guaranteeType(param, VariableExpression);
293
+ lambdaParameters.push(param.name);
294
+ });
295
+ const aggLambdaParamName = guaranteeType(
296
+ aggLambda.functionType.parameters[0],
297
+ VariableExpression,
298
+ ).name;
299
+ lambdaParameters.push(aggLambdaParamName);
300
+ operatorState.setLambdaParameterNames(lambdaParameters);
301
+ return operatorState;
302
+ } else if (colSpec.function1) {
303
+ //TODO: implement rowNumber as part of rank functions
304
+ const rankLambda = guaranteeType(
305
+ guaranteeType(colSpec.function1, LambdaFunctionInstanceValue).values[0],
306
+ LambdaFunction,
307
+ );
308
+ assertTrue(rankLambda.expressionSequence.length === 1);
309
+ const operationFunctionExp = guaranteeType(
310
+ rankLambda.expressionSequence[0],
311
+ SimpleFunctionExpression,
312
+ );
313
+
314
+ const operation = guaranteeNonNullable(
315
+ tdsState.windowState.findOperator(
316
+ operationFunctionExp.functionName,
317
+ true,
318
+ ),
319
+ `Operator '${operationFunctionExp.functionName}' not supported yet for typed TDS`,
320
+ );
321
+
322
+ const operatorState = new QueryBuilderTDS_WindowRankOperatorState(
323
+ tdsState.windowState,
324
+ operation,
325
+ );
326
+
327
+ const operatorParameters: string[] = [];
328
+ rankLambda.functionType.parameters.forEach((param) => {
329
+ guaranteeType(param, VariableExpression);
330
+ operatorParameters.push(param.name);
331
+ });
332
+ operatorState.setLambdaParameterNames(operatorParameters);
333
+
334
+ return operatorState;
335
+ } else {
336
+ throw new UnsupportedOperationError(
337
+ `Only support aggregation and rank operators in extend() expression`,
338
+ );
339
+ }
280
340
  };
281
341
 
282
342
  export const processTDS_ExtendExpression = (
@@ -22,6 +22,7 @@ import {
22
22
  GenericTypeExplicitReference,
23
23
  PrimitiveInstanceValue,
24
24
  SimpleFunctionExpression,
25
+ FunctionExpression,
25
26
  VariableExpression,
26
27
  Multiplicity,
27
28
  PrimitiveType,
@@ -29,8 +30,12 @@ import {
29
30
  ColSpecArray,
30
31
  ColSpecArrayInstance,
31
32
  ColSpecInstanceValue,
33
+ RelationColumn,
32
34
  } from '@finos/legend-graph';
33
- import { guaranteeNonNullable } from '@finos/legend-shared';
35
+ import {
36
+ guaranteeNonNullable,
37
+ UnsupportedOperationError,
38
+ } from '@finos/legend-shared';
34
39
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../graph/QueryBuilderMetaModelConst.js';
35
40
  import { buildGenericLambdaFunctionInstanceValue } from '../../../QueryBuilderValueSpecificationHelper.js';
36
41
  import {
@@ -41,6 +46,7 @@ import {
41
46
  type QueryBuilderWindowColumnState,
42
47
  type QueryBuilderWindowState,
43
48
  QueryBuilderTDS_WindowAggreationOperatorState,
49
+ QueryBuilderTDS_WindowRankOperatorState,
44
50
  } from './QueryBuilderWindowState.js';
45
51
  import { DEFAULT_LAMBDA_VARIABLE_NAME } from '@finos/legend-data-cube';
46
52
  import {
@@ -93,13 +99,18 @@ const appendOLAPGroupByColumnState = (
93
99
  const operationState = olapGroupByColumnState.operatorState;
94
100
  const lambdaParameterName =
95
101
  operationState.lambdaParameterNames[0] ?? DEFAULT_LAMBDA_VARIABLE_NAME;
96
- const olapFunc = extractElementNameFromPath(operationState.operator.pureFunc);
102
+ const olapFunc = extractElementNameFromPath(
103
+ guaranteeNonNullable(
104
+ operationState.operator.pureFunc,
105
+ `Operator '${operationState.operator.getLabel()}' does not have a compatible OLAP function`,
106
+ ),
107
+ );
97
108
  const olapFuncExpression = new SimpleFunctionExpression(olapFunc);
98
109
  olapFuncExpression.parametersValues = [
99
110
  new VariableExpression(lambdaParameterName, Multiplicity.ONE),
100
111
  ];
101
112
  const olapLambdaFuncInstance = buildGenericLambdaFunctionInstanceValue(
102
- lambdaParameterName,
113
+ [lambdaParameterName],
103
114
  [olapFuncExpression],
104
115
  graph,
105
116
  );
@@ -216,47 +227,139 @@ const appendExtendColumnState = (
216
227
  ]);
217
228
  }
218
229
 
219
- //TODO: handle aggregation operators
220
- const operatorFunc = extractElementNameFromPath(
221
- operatorState.operator.pureFunc,
222
- );
223
- const operatorFuncExpression = new SimpleFunctionExpression(operatorFunc);
230
+ if (
231
+ operatorState instanceof QueryBuilderTDS_WindowAggreationOperatorState &&
232
+ operatorState.operator.relationFunc
233
+ ) {
234
+ const operatorFunc = extractElementNameFromPath(
235
+ operatorState.operator.relationFunc,
236
+ );
224
237
 
225
- const lambdaParameters: VariableExpression[] = [];
226
- operatorState.lambdaParameterNames.forEach((paramName) => {
227
- lambdaParameters.push(new VariableExpression(paramName, Multiplicity.ONE));
228
- });
229
- operatorFuncExpression.parametersValues = lambdaParameters;
238
+ //parameters
239
+ const [
240
+ partitionParam = DEFAULT_WINDOW_FUNCTION_PARTITION_VAR_NAME,
241
+ windowParam = DEFAULT_WINDOW_FUNCTION_WINDOW_VAR_NAME,
242
+ rowParam = DEFAULT_WINDOW_FUNCTION_ROW_VAR_NAME,
243
+ aggParam = DEFAULT_LAMBDA_VARIABLE_NAME,
244
+ ] = operatorState.lambdaParameterNames;
230
245
 
231
- const rankLambda = buildGenericLambdaFunctionInstanceValue(
232
- operatorState.lambdaParameterNames[0] ??
233
- DEFAULT_WINDOW_FUNCTION_PARTITION_VAR_NAME,
234
- [operatorFuncExpression],
235
- graph,
236
- );
246
+ // Build function1: the map lambda {p, w, r|$r.SOURCE_COL}
247
+ const columnAccessExpression = new FunctionExpression(
248
+ operatorState.columnState.columnName,
249
+ );
250
+ columnAccessExpression.func = new RelationColumn(
251
+ operatorState.columnState.columnName,
252
+ GenericTypeExplicitReference.create(
253
+ new GenericType(PrimitiveType.STRING),
254
+ ),
255
+ );
256
+ columnAccessExpression.parametersValues = [
257
+ new VariableExpression(rowParam, Multiplicity.ONE),
258
+ ];
237
259
 
238
- //skip over the first parameter since it was added in buildGenericLambdaFunctionInstanceValue()
239
- lambdaParameters.slice(1).forEach((param) => {
240
- rankLambda.values[0]?.functionType.parameters.push(param);
241
- });
242
- operatorColSpec.function1 = rankLambda;
243
- operatorColSpecArray.colSpecs.push(operatorColSpec);
260
+ const mapLambda = buildGenericLambdaFunctionInstanceValue(
261
+ [partitionParam, windowParam, rowParam],
262
+ [columnAccessExpression],
263
+ graph,
264
+ );
244
265
 
245
- const extendExpression = new SimpleFunctionExpression(
246
- extractElementNameFromPath(
247
- QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_EXTEND,
248
- ),
249
- );
266
+ operatorColSpec.function1 = mapLambda;
250
267
 
251
- const currentExpression = guaranteeNonNullable(lambda.expressionSequence[0]);
252
- extendExpression.parametersValues = [
253
- currentExpression,
254
- overExpression,
255
- operatorColSpecArrayInst,
256
- ];
268
+ // Build function2: the reduce lambda x|$x->operatorFunc()
269
+ const operatorFuncExpression = new SimpleFunctionExpression(operatorFunc);
270
+ operatorFuncExpression.parametersValues = [
271
+ new VariableExpression(aggParam, Multiplicity.ONE),
272
+ ];
257
273
 
258
- lambda.expressionSequence[0] = extendExpression;
259
- return lambda;
274
+ //build col spec
275
+ const function2 = buildGenericLambdaFunctionInstanceValue(
276
+ [aggParam],
277
+ [operatorFuncExpression],
278
+ graph,
279
+ );
280
+
281
+ operatorColSpec.function2 = function2;
282
+
283
+ operatorColSpecArray.colSpecs.push(operatorColSpec);
284
+
285
+ const extendExpression = new SimpleFunctionExpression(
286
+ extractElementNameFromPath(
287
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_EXTEND,
288
+ ),
289
+ );
290
+ const currentExpression = guaranteeNonNullable(
291
+ lambda.expressionSequence[0],
292
+ );
293
+ extendExpression.parametersValues = [
294
+ currentExpression,
295
+ overExpression,
296
+ operatorColSpecArrayInst,
297
+ ];
298
+ lambda.expressionSequence[0] = extendExpression;
299
+ return lambda;
300
+ } else if (
301
+ operatorState instanceof QueryBuilderTDS_WindowRankOperatorState &&
302
+ operatorState.operator.relationFunc
303
+ ) {
304
+ const operatorFunc = extractElementNameFromPath(
305
+ operatorState.operator.relationFunc,
306
+ );
307
+ const operatorFuncExpression = new SimpleFunctionExpression(operatorFunc);
308
+ const [
309
+ partitionParam = DEFAULT_WINDOW_FUNCTION_PARTITION_VAR_NAME,
310
+ windowParam = DEFAULT_WINDOW_FUNCTION_WINDOW_VAR_NAME,
311
+ rowParam = DEFAULT_WINDOW_FUNCTION_ROW_VAR_NAME,
312
+ ] = operatorState.lambdaParameterNames;
313
+
314
+ if (
315
+ operatorFunc ===
316
+ extractElementNameFromPath(
317
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_ROW_NUMBER,
318
+ )
319
+ ) {
320
+ operatorFuncExpression.parametersValues = [
321
+ new VariableExpression(partitionParam, Multiplicity.ONE),
322
+ new VariableExpression(rowParam, Multiplicity.ONE),
323
+ ];
324
+ } else {
325
+ operatorFuncExpression.parametersValues = [
326
+ new VariableExpression(partitionParam, Multiplicity.ONE),
327
+ new VariableExpression(windowParam, Multiplicity.ONE),
328
+ new VariableExpression(rowParam, Multiplicity.ONE),
329
+ ];
330
+ }
331
+
332
+ const rankLambda = buildGenericLambdaFunctionInstanceValue(
333
+ [partitionParam, windowParam, rowParam],
334
+ [operatorFuncExpression],
335
+ graph,
336
+ );
337
+
338
+ operatorColSpec.function1 = rankLambda;
339
+ operatorColSpecArray.colSpecs.push(operatorColSpec);
340
+
341
+ const extendExpression = new SimpleFunctionExpression(
342
+ extractElementNameFromPath(
343
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_EXTEND,
344
+ ),
345
+ );
346
+
347
+ const currentExpression = guaranteeNonNullable(
348
+ lambda.expressionSequence[0],
349
+ );
350
+ extendExpression.parametersValues = [
351
+ currentExpression,
352
+ overExpression,
353
+ operatorColSpecArrayInst,
354
+ ];
355
+
356
+ lambda.expressionSequence[0] = extendExpression;
357
+ return lambda;
358
+ } else {
359
+ throw new UnsupportedOperationError(
360
+ `Unsupported window function. Function must be supported for typed TDS and be an aggregation or rank function.`,
361
+ );
362
+ }
260
363
  };
261
364
 
262
365
  export const appendWindowFunctionState = (
@@ -25,7 +25,7 @@ export abstract class QueryBuilderTDS_WindowOperator implements Hashable {
25
25
 
26
26
  abstract get hashCode(): string;
27
27
 
28
- abstract get pureFunc(): string;
28
+ abstract get pureFunc(): string | undefined;
29
29
 
30
30
  abstract get relationFunc(): string | undefined;
31
31
 
@@ -33,7 +33,7 @@ export class QueryBuilderTDS_WindowOperator_Average extends QueryBuilderTDS_Wind
33
33
  }
34
34
 
35
35
  get relationFunc(): string | undefined {
36
- return undefined;
36
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.AVERAGE;
37
37
  }
38
38
 
39
39
  get hashCode(): string {
@@ -33,7 +33,7 @@ export class QueryBuilderTDS_WindowOperator_Count extends QueryBuilderTDS_Window
33
33
  }
34
34
 
35
35
  get relationFunc(): string | undefined {
36
- return undefined;
36
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.COUNT;
37
37
  }
38
38
 
39
39
  get hashCode(): string {
@@ -33,7 +33,7 @@ export class QueryBuilderTDS_WindowOperator_Max extends QueryBuilderTDS_WindowOp
33
33
  }
34
34
 
35
35
  get relationFunc(): string | undefined {
36
- return undefined;
36
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.MAX;
37
37
  }
38
38
 
39
39
  get hashCode(): string {
@@ -33,7 +33,7 @@ export class QueryBuilderTDS_WindowOperator_Min extends QueryBuilderTDS_WindowOp
33
33
  }
34
34
 
35
35
  get relationFunc(): string | undefined {
36
- return undefined;
36
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.MIN;
37
37
  }
38
38
 
39
39
  get hashCode(): string {
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Copyright (c) 2026-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 { PRIMITIVE_TYPE, type Type } from '@finos/legend-graph';
18
+ import { QueryBuilderTDS_WindowOperator } from './QueryBuilderTDS_WindowOperator.js';
19
+ import { hashArray } from '@finos/legend-shared';
20
+ import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
21
+ import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../../graph/QueryBuilderMetaModelConst.js';
22
+
23
+ export class QueryBuilderTDS_WindowRankOperator_PercentRank extends QueryBuilderTDS_WindowOperator {
24
+ override getLabel(): string {
25
+ return 'percent rank';
26
+ }
27
+ override get pureFunc(): string | undefined {
28
+ // percentRank() is only supported for typed TDS
29
+ return undefined;
30
+ }
31
+ override get relationFunc(): string | undefined {
32
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PERCENT_RANK;
33
+ }
34
+ override get hashCode(): string {
35
+ return hashArray([
36
+ QUERY_BUILDER_STATE_HASH_STRUCTURE.TDS_WINDOW_OPERATOR_PERCENT_RANK,
37
+ ]);
38
+ }
39
+ override isCompatibleWithType(type: Type | undefined): boolean {
40
+ if (type) {
41
+ return (
42
+ [
43
+ PRIMITIVE_TYPE.STRING,
44
+ PRIMITIVE_TYPE.BOOLEAN,
45
+ PRIMITIVE_TYPE.NUMBER,
46
+ PRIMITIVE_TYPE.INTEGER,
47
+ PRIMITIVE_TYPE.DECIMAL,
48
+ PRIMITIVE_TYPE.FLOAT,
49
+ PRIMITIVE_TYPE.DATE,
50
+ PRIMITIVE_TYPE.STRICTDATE,
51
+ PRIMITIVE_TYPE.DATETIME,
52
+ ] as string[]
53
+ ).includes(type.path);
54
+ }
55
+ return true;
56
+ }
57
+ }
@@ -33,7 +33,7 @@ export class QueryBuilderTDS_WindowOperator_Sum extends QueryBuilderTDS_WindowOp
33
33
  }
34
34
 
35
35
  get relationFunc(): string | undefined {
36
- return undefined;
36
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.SUM;
37
37
  }
38
38
 
39
39
  get hashCode(): string {
@@ -30,7 +30,7 @@ export class QueryBuilderTDS_WindowRankOperator_RowNumber extends QueryBuilderTD
30
30
  }
31
31
 
32
32
  get relationFunc(): string | undefined {
33
- return undefined;
33
+ return QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_ROW_NUMBER;
34
34
  }
35
35
 
36
36
  get hashCode(): string {
@@ -156,7 +156,7 @@ export const buildFilterConditionExpression = (
156
156
  } else if (clauses.length === 1) {
157
157
  const lambdaFunctionInstanceValue =
158
158
  buildGenericLambdaFunctionInstanceValue(
159
- node.lambdaParameterName ?? DEFAULT_LAMBDA_VARIABLE_NAME,
159
+ [node.lambdaParameterName ?? DEFAULT_LAMBDA_VARIABLE_NAME],
160
160
  clauses,
161
161
  filterState.queryBuilderState.graphManagerState.graph,
162
162
  );
@@ -175,7 +175,7 @@ export const buildFilterConditionExpression = (
175
175
  );
176
176
  simp.parametersValues = parametersValues;
177
177
  const lambdaFunctionInstanceValue = buildGenericLambdaFunctionInstanceValue(
178
- node.lambdaParameterName ?? DEFAULT_LAMBDA_VARIABLE_NAME,
178
+ [node.lambdaParameterName ?? DEFAULT_LAMBDA_VARIABLE_NAME],
179
179
  [simp],
180
180
  filterState.queryBuilderState.graphManagerState.graph,
181
181
  );
@@ -209,7 +209,7 @@ export const buildFilterExpression = (
209
209
  // param [1]
210
210
  filterExpression.parametersValues.push(
211
211
  buildGenericLambdaFunctionInstanceValue(
212
- filterState.lambdaParameterName,
212
+ [filterState.lambdaParameterName],
213
213
  filterConditionExpressions,
214
214
  filterState.queryBuilderState.graphManagerState.graph,
215
215
  ),
@@ -63,6 +63,7 @@ export class AccessorQueryBuilderState extends QueryBuilderState {
63
63
  changeAccessorOwner: action,
64
64
  changeAccessor: action,
65
65
  accessorOwnerOptions: computed,
66
+ accessorLabel: computed,
66
67
  compatibleRuntimes: computed,
67
68
  });
68
69
  this.workflowState.updateActionConfig(actionConfig);
@@ -83,6 +84,10 @@ export class AccessorQueryBuilderState extends QueryBuilderState {
83
84
  ];
84
85
  }
85
86
 
87
+ get accessorLabel(): string {
88
+ return this.sourceAccessor?.accessorLabel ?? 'Accessor';
89
+ }
90
+
86
91
  get accessorOwnerOptions(): AccessorOwnerOption[] {
87
92
  return this.accessorOwners.map(buildElementOption);
88
93
  }