@finos/legend-query-builder 4.14.87 → 4.14.89

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 (95) hide show
  1. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.d.ts.map +1 -1
  2. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +2 -4
  3. package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
  4. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
  5. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +17 -3
  6. package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
  7. package/lib/index.css +1 -1
  8. package/lib/index.d.ts +3 -1
  9. package/lib/index.d.ts.map +1 -1
  10. package/lib/index.js +3 -1
  11. package/lib/index.js.map +1 -1
  12. package/lib/package.json +1 -1
  13. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.d.ts +2 -2
  14. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.d.ts.map +1 -1
  15. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.js.map +1 -1
  16. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +4 -4
  17. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  18. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +3 -3
  19. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  20. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.d.ts.map +1 -1
  21. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js +12 -2
  22. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js.map +1 -1
  23. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.d.ts.map +1 -1
  24. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.js +5 -5
  25. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.js.map +1 -1
  26. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.d.ts +3 -3
  27. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.d.ts.map +1 -1
  28. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js +32 -20
  29. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js.map +1 -1
  30. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.d.ts +3 -3
  31. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.d.ts.map +1 -1
  32. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.js +5 -5
  33. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.js.map +1 -1
  34. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.d.ts +3 -3
  35. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.d.ts.map +1 -1
  36. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.js +5 -5
  37. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.js.map +1 -1
  38. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.d.ts +3 -3
  39. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
  40. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.js +6 -6
  41. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
  42. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.d.ts +2 -2
  43. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
  44. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.js +4 -4
  45. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
  46. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.d.ts +2 -2
  47. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  48. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.js +4 -4
  49. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.js.map +1 -1
  50. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.d.ts +3 -3
  51. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.d.ts.map +1 -1
  52. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.js +5 -5
  53. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.js.map +1 -1
  54. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts +2 -2
  55. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts.map +1 -1
  56. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js +3 -3
  57. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js.map +1 -1
  58. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.d.ts +2 -2
  59. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
  60. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.js +4 -4
  61. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
  62. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.d.ts +2 -2
  63. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.d.ts.map +1 -1
  64. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.js +4 -4
  65. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.js.map +1 -1
  66. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.d.ts +3 -3
  67. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.d.ts.map +1 -1
  68. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js +5 -5
  69. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js.map +1 -1
  70. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  71. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  72. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts.map +1 -1
  73. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js +13 -3
  74. package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js.map +1 -1
  75. package/package.json +5 -5
  76. package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +4 -5
  77. package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +23 -7
  78. package/src/index.ts +7 -0
  79. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.ts +2 -0
  80. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +14 -3
  81. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.ts +14 -11
  82. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterValueSpecificationBuilder.ts +9 -3
  83. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.ts +51 -27
  84. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.ts +7 -2
  85. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.ts +7 -2
  86. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.ts +7 -2
  87. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.ts +5 -2
  88. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.ts +5 -2
  89. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.ts +7 -2
  90. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.ts +5 -2
  91. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.ts +5 -2
  92. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.ts +5 -2
  93. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.ts +7 -2
  94. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +0 -2
  95. package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.ts +30 -2
@@ -23,6 +23,7 @@ import {
23
23
  guaranteeType,
24
24
  isNonNullable,
25
25
  returnUndefOnError,
26
+ UnsupportedOperationError,
26
27
  } from '@finos/legend-shared';
27
28
  import {
28
29
  type V1_GraphBuilderContext,
@@ -62,6 +63,10 @@ import {
62
63
  ColSpecArrayInstance,
63
64
  ColSpecArray,
64
65
  ColSpec,
66
+ Relation_RelationType,
67
+ Relation_RelationalColumn,
68
+ getValueSpecificationReturnType,
69
+ Relation_Relation,
65
70
  } from '@finos/legend-graph';
66
71
  import {
67
72
  QUERY_BUILDER_PURE_PATH,
@@ -641,7 +646,7 @@ const V1_buildTypedProjectFunctionExpression = (
641
646
  const processedExpression = new ColSpecArrayInstance(Multiplicity.ONE);
642
647
  const processedColSpecArray = new ColSpecArray();
643
648
  processedExpression.values = [processedColSpecArray];
644
-
649
+ const relationType = new Relation_RelationType(Relation_RelationType.ID);
645
650
  processedColSpecArray.colSpecs = specArray.colSpecs.map((colSpec) => {
646
651
  const pColSpec = new ColSpec();
647
652
  let lambda: ValueSpecification;
@@ -667,6 +672,16 @@ const V1_buildTypedProjectFunctionExpression = (
667
672
  }
668
673
  pColSpec.function1 = lambda;
669
674
  pColSpec.name = colSpec.name;
675
+ const returnType = getValueSpecificationReturnType(lambda);
676
+ if (returnType) {
677
+ relationType.columns.push(
678
+ new Relation_RelationalColumn(colSpec.name, returnType),
679
+ );
680
+ } else {
681
+ throw new UnsupportedOperationError(
682
+ 'Unable to get return type for current lambda',
683
+ );
684
+ }
670
685
  return pColSpec;
671
686
  });
672
687
 
@@ -675,12 +690,13 @@ const V1_buildTypedProjectFunctionExpression = (
675
690
  functionName,
676
691
  compileContext,
677
692
  );
678
- expression.genericType = GenericTypeExplicitReference.create(
679
- new GenericType(
680
- compileContext.resolveType(QUERY_BUILDER_PURE_PATH.RELATION).value,
681
- ),
682
- );
683
-
693
+ const relationGenericType = new GenericType(Relation_Relation.INSTANCE);
694
+ const relationTypeGenericType = new GenericType(relationType);
695
+ relationGenericType.typeArguments = [
696
+ GenericTypeExplicitReference.create(relationTypeGenericType),
697
+ ];
698
+ expression.genericType =
699
+ GenericTypeExplicitReference.create(relationGenericType);
684
700
  return expression;
685
701
  };
686
702
 
package/src/index.ts CHANGED
@@ -35,6 +35,8 @@ export { QUERY_BUILDER_COMPONENT_ELEMENT_ID } from './components/QueryBuilderCom
35
35
  export {
36
36
  type QueryableSourceInfo as QuerySDLC,
37
37
  QueryBuilderState,
38
+ QUERY_BUILDER_LAMBDA_WRITER_MODE,
39
+ INTERNAL__BasicQueryBuilderState,
38
40
  } from './stores/QueryBuilderState.js';
39
41
  export {
40
42
  getTDSColumnDerivedProperyFromType,
@@ -59,6 +61,10 @@ export {
59
61
  QUERY_BUILDER_SUPPORTED_FUNCTIONS,
60
62
  QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS,
61
63
  } from './graph/QueryBuilderMetaModelConst.js';
64
+ export {
65
+ TEST__LegendApplicationPluginManager,
66
+ TEST__getGenericApplicationConfig,
67
+ } from './stores/__test-utils__/QueryBuilderStateTestUtils.js';
62
68
  export { getQueryBuilderGraphManagerExtension } from './graph-manager/protocol/pure/QueryBuilder_PureGraphManagerExtension.js';
63
69
  export type { ServiceExecutionAnalysisResult } from './graph-manager/action/analytics/ServiceExecutionAnalysis.js';
64
70
  export type { MappingRuntimeCompatibilityAnalysisResult } from './graph-manager/action/analytics/MappingRuntimeCompatibilityAnalysis.js';
@@ -87,6 +93,7 @@ export {
87
93
  getQueryBuilderExplorerTreeNodeSortRank,
88
94
  QueryBuilderSubclassInfoTooltip,
89
95
  } from './components/explorer/QueryBuilderExplorerPanel.js';
96
+ export { QueryBuilderActionConfig } from './stores/query-workflow/QueryBuilderWorkFlowState.js';
90
97
  // ------------------------------------------- Shared components -------------------------------------------
91
98
 
92
99
  export * from './components/shared/LambdaEditor.js';
@@ -16,6 +16,7 @@
16
16
 
17
17
  import type {
18
18
  FunctionExpression,
19
+ LambdaFunction,
19
20
  Type,
20
21
  ValueSpecification,
21
22
  } from '@finos/legend-graph';
@@ -57,6 +58,7 @@ export abstract class QueryBuilderPostFilterOperator implements Hashable {
57
58
 
58
59
  abstract buildPostFilterConditionExpression(
59
60
  postFilterConditionState: PostFilterConditionState,
61
+ parentExpression: LambdaFunction | undefined,
60
62
  ): ValueSpecification | undefined;
61
63
 
62
64
  abstract buildPostFilterConditionState(
@@ -26,6 +26,7 @@ import {
26
26
  PrimitiveType,
27
27
  CollectionInstanceValue,
28
28
  InstanceValue,
29
+ type LambdaFunction,
29
30
  } from '@finos/legend-graph';
30
31
  import {
31
32
  type GeneratorFn,
@@ -298,7 +299,10 @@ export abstract class PostFilterConditionValueState implements Hashable {
298
299
  ]);
299
300
  }
300
301
 
301
- abstract appendConditionValue(expressionVal: SimpleFunctionExpression): void;
302
+ abstract appendConditionValue(
303
+ expressionVal: SimpleFunctionExpression,
304
+ parentExpression: LambdaFunction | undefined,
305
+ ): void;
302
306
  }
303
307
 
304
308
  export class PostFilterValueSpecConditionValueState extends PostFilterConditionValueState {
@@ -341,7 +345,10 @@ export class PostFilterValueSpecConditionValueState extends PostFilterConditionV
341
345
  : undefined;
342
346
  return this.value;
343
347
  }
344
- override appendConditionValue(expressionVal: SimpleFunctionExpression): void {
348
+ override appendConditionValue(
349
+ expressionVal: SimpleFunctionExpression,
350
+ parentExpression: LambdaFunction | undefined,
351
+ ): void {
345
352
  if (this.value) {
346
353
  expressionVal.parametersValues.push(this.value);
347
354
  }
@@ -381,13 +388,17 @@ export class PostFilterTDSColumnValueConditionValueState extends PostFilterCondi
381
388
  override get isCollection(): boolean {
382
389
  return false;
383
390
  }
384
- override appendConditionValue(expressionVal: SimpleFunctionExpression): void {
391
+ override appendConditionValue(
392
+ expressionVal: SimpleFunctionExpression,
393
+ parentExpression: LambdaFunction | undefined,
394
+ ): void {
385
395
  const tdsPropertyExpression = buildtdsPropertyExpressionFromColState(
386
396
  this.conditionState,
387
397
  this.tdsColumn,
388
398
  this.conditionState.postFilterState.tdsState.queryBuilderState
389
399
  .graphManagerState.graph,
390
400
  undefined,
401
+ parentExpression,
391
402
  );
392
403
  expressionVal.parametersValues.push(tdsPropertyExpression);
393
404
  }
@@ -188,17 +188,20 @@ export const buildPostFilterConditionState = (
188
188
  );
189
189
 
190
190
  // get projection column
191
- const tdsColumnPropertyExpression = guaranteeType(
192
- expression.parametersValues[0],
193
- AbstractPropertyExpression,
194
- `Can't process ${extractElementNameFromPath(
195
- operatorFunctionFullPath,
196
- )}() expression: expects property expression in lambda body`,
197
- );
198
- const columnState = findProjectionColumnState(
199
- tdsColumnPropertyExpression,
200
- postFilterState,
201
- );
191
+ const paramValue = expression.parametersValues[0];
192
+ let columnState: QueryBuilderTDSColumnState;
193
+ if (paramValue instanceof AbstractPropertyExpression) {
194
+ columnState = findProjectionColumnState(paramValue, postFilterState);
195
+ } else if (paramValue instanceof FunctionExpression) {
196
+ const columnName = paramValue.functionName;
197
+ columnState = getTDSColumnState(postFilterState.tdsState, columnName);
198
+ } else {
199
+ throw new UnsupportedOperationError(
200
+ `Can't process ${extractElementNameFromPath(
201
+ operatorFunctionFullPath,
202
+ )}() expression: expects property expression in lambda body`,
203
+ );
204
+ }
202
205
 
203
206
  // get operation value specification
204
207
  const rightSide = expression.parametersValues[1];
@@ -34,10 +34,12 @@ import {
34
34
  const buildPostFilterExpression = (
35
35
  postFilterState: QueryBuilderPostFilterState,
36
36
  node: QueryBuilderPostFilterTreeNodeData,
37
+ parentExpression: LambdaFunction | undefined,
37
38
  ): ValueSpecification | undefined => {
38
39
  if (node instanceof QueryBuilderPostFilterTreeConditionNodeData) {
39
40
  return node.condition.operator.buildPostFilterConditionExpression(
40
41
  node.condition,
42
+ parentExpression,
41
43
  );
42
44
  } else if (node instanceof QueryBuilderPostFilterTreeGroupNodeData) {
43
45
  const func = new SimpleFunctionExpression(
@@ -46,7 +48,9 @@ const buildPostFilterExpression = (
46
48
  const clauses = node.childrenIds
47
49
  .map((e) => postFilterState.nodes.get(e))
48
50
  .filter(isNonNullable)
49
- .map((e) => buildPostFilterExpression(postFilterState, e))
51
+ .map((e) =>
52
+ buildPostFilterExpression(postFilterState, e, parentExpression),
53
+ )
50
54
  .filter(isNonNullable);
51
55
  /**
52
56
  * NOTE: Due to a limitation (or perhaps design decision) in the engine, group operations
@@ -84,8 +88,10 @@ export const appendPostFilter = (
84
88
  lambdaFunction: LambdaFunction,
85
89
  ): LambdaFunction => {
86
90
  const postFilterConditionExpressions = postFilterState.rootIds
87
- .map((e) => guaranteeNonNullable(postFilterState.nodes.get(e)))
88
- .map((e) => buildPostFilterExpression(postFilterState, e))
91
+ .map((node) => guaranteeNonNullable(postFilterState.nodes.get(node)))
92
+ .map((_node) =>
93
+ buildPostFilterExpression(postFilterState, _node, lambdaFunction),
94
+ )
89
95
  .filter(isNonNullable);
90
96
  if (
91
97
  !postFilterConditionExpressions.length ||
@@ -15,9 +15,9 @@
15
15
  */
16
16
 
17
17
  import {
18
- type FunctionExpression,
19
18
  AbstractPropertyExpression,
20
19
  extractElementNameFromPath,
20
+ FunctionExpression,
21
21
  GenericType,
22
22
  GenericTypeExplicitReference,
23
23
  PrimitiveInstanceValue,
@@ -28,6 +28,8 @@ import {
28
28
  Multiplicity,
29
29
  PrimitiveType,
30
30
  type PureModel,
31
+ type LambdaFunction,
32
+ getRelationTypeGenericType,
31
33
  } from '@finos/legend-graph';
32
34
  import { guaranteeNonNullable } from '@finos/legend-shared';
33
35
  import type { QueryBuilderPostFilterOperator } from '../QueryBuilderPostFilterOperator.js';
@@ -44,38 +46,55 @@ export const buildtdsPropertyExpressionFromColState = (
44
46
  colState: QueryBuilderTDSColumnState,
45
47
  graph: PureModel,
46
48
  operator: QueryBuilderPostFilterOperator | undefined,
47
- ): AbstractPropertyExpression => {
48
- const tdsPropertyExpression = new AbstractPropertyExpression('');
49
- let tdsDerivedPropertyName: TDS_COLUMN_GETTER;
50
- const correspondingTDSDerivedProperty = operator
51
- ? operator.getTDSColumnGetter()
49
+ parentExpression: LambdaFunction | undefined,
50
+ ): FunctionExpression => {
51
+ const relationType = parentExpression?.expressionSequence[0]
52
+ ? getRelationTypeGenericType(parentExpression.expressionSequence[0])
52
53
  : undefined;
53
- if (correspondingTDSDerivedProperty) {
54
- tdsDerivedPropertyName = correspondingTDSDerivedProperty;
55
- } else {
56
- const type = guaranteeNonNullable(colState.getColumnType());
57
- tdsDerivedPropertyName = getTDSColumnDerivedProperyFromType(type);
58
- }
59
- tdsPropertyExpression.func = PropertyExplicitReference.create(
60
- guaranteeNonNullable(
61
- getAllClassDerivedProperties(
62
- graph.getClass(QUERY_BUILDER_PURE_PATH.TDS_ROW),
63
- ).find((p) => p.name === tdsDerivedPropertyName),
64
- ),
65
- );
66
54
  const variableName = new VariableExpression(
67
55
  filterConditionState.postFilterState.lambdaParameterName,
68
56
  Multiplicity.ONE,
69
57
  );
70
- const colInstanceValue = new PrimitiveInstanceValue(
71
- GenericTypeExplicitReference.create(new GenericType(PrimitiveType.STRING)),
72
- );
73
- colInstanceValue.values = [colState.columnName];
74
- tdsPropertyExpression.parametersValues = [variableName, colInstanceValue];
75
- return tdsPropertyExpression;
58
+ if (relationType) {
59
+ const col = guaranteeNonNullable(
60
+ relationType.columns.find((e) => colState.columnName === e.name),
61
+ `Can't find property ${colState.columnName} in relation`,
62
+ );
63
+ const _funcExp = new FunctionExpression(col.name);
64
+ _funcExp.func = col;
65
+ _funcExp.parametersValues = [variableName];
66
+ return _funcExp;
67
+ } else {
68
+ const tdsPropertyExpression = new AbstractPropertyExpression('');
69
+ let tdsDerivedPropertyName: TDS_COLUMN_GETTER;
70
+ const correspondingTDSDerivedProperty = operator
71
+ ? operator.getTDSColumnGetter()
72
+ : undefined;
73
+ if (correspondingTDSDerivedProperty) {
74
+ tdsDerivedPropertyName = correspondingTDSDerivedProperty;
75
+ } else {
76
+ const type = guaranteeNonNullable(colState.getColumnType());
77
+ tdsDerivedPropertyName = getTDSColumnDerivedProperyFromType(type);
78
+ }
79
+ tdsPropertyExpression.func = PropertyExplicitReference.create(
80
+ guaranteeNonNullable(
81
+ getAllClassDerivedProperties(
82
+ graph.getClass(QUERY_BUILDER_PURE_PATH.TDS_ROW),
83
+ ).find((p) => p.name === tdsDerivedPropertyName),
84
+ ),
85
+ );
86
+ const colInstanceValue = new PrimitiveInstanceValue(
87
+ GenericTypeExplicitReference.create(
88
+ new GenericType(PrimitiveType.STRING),
89
+ ),
90
+ );
91
+ colInstanceValue.values = [colState.columnName];
92
+ tdsPropertyExpression.parametersValues = [variableName, colInstanceValue];
93
+ return tdsPropertyExpression;
94
+ }
76
95
  };
77
96
 
78
- export const buildPostFilterConditionExpression = (
97
+ export const buildPostFilterConditionExpressionHelper = (
79
98
  filterConditionState: PostFilterConditionState,
80
99
  operator: QueryBuilderPostFilterOperator,
81
100
  /**
@@ -85,6 +104,7 @@ export const buildPostFilterConditionExpression = (
85
104
  * This is the case because with TDS, we are provided some filter-like operators, e.g. IS_NULL, IS_NOT_NULL, etc.
86
105
  */
87
106
  operatorFunctionFullPath: string | undefined,
107
+ parentExpression: LambdaFunction | undefined,
88
108
  ): FunctionExpression => {
89
109
  // primitives
90
110
  const graph =
@@ -96,6 +116,7 @@ export const buildPostFilterConditionExpression = (
96
116
  filterConditionState.leftConditionValue,
97
117
  graph,
98
118
  operator,
119
+ parentExpression,
99
120
  );
100
121
 
101
122
  if (operatorFunctionFullPath) {
@@ -103,7 +124,10 @@ export const buildPostFilterConditionExpression = (
103
124
  extractElementNameFromPath(operatorFunctionFullPath),
104
125
  );
105
126
  expression.parametersValues.push(tdsPropertyExpression);
106
- filterConditionState.rightConditionValue.appendConditionValue(expression);
127
+ filterConditionState.rightConditionValue.appendConditionValue(
128
+ expression,
129
+ parentExpression,
130
+ );
107
131
  return expression;
108
132
  } else {
109
133
  return tdsPropertyExpression;
@@ -18,6 +18,7 @@ import {
18
18
  type SimpleFunctionExpression,
19
19
  type Type,
20
20
  type ValueSpecification,
21
+ type LambdaFunction,
21
22
  type FunctionExpression,
22
23
  PRIMITIVE_TYPE,
23
24
  PrimitiveType,
@@ -38,7 +39,7 @@ import {
38
39
  buildNotExpression,
39
40
  unwrapNotExpression,
40
41
  } from '../../../../QueryBuilderValueSpecificationHelper.js';
41
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
42
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
42
43
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../../graph/QueryBuilderMetaModelConst.js';
43
44
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
44
45
  import { buildDefaultInstanceValue } from '../../../../shared/ValueSpecificationEditorHelper.js';
@@ -93,11 +94,13 @@ export class QueryBuilderPostFilterOperator_Contain
93
94
 
94
95
  buildPostFilterConditionExpression(
95
96
  postFilterConditionState: PostFilterConditionState,
97
+ parentExpression: LambdaFunction | undefined,
96
98
  ): ValueSpecification | undefined {
97
- return buildPostFilterConditionExpression(
99
+ return buildPostFilterConditionExpressionHelper(
98
100
  postFilterConditionState,
99
101
  this,
100
102
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.CONTAINS,
103
+ parentExpression,
101
104
  );
102
105
  }
103
106
 
@@ -126,9 +129,11 @@ export class QueryBuilderPostFilterOperator_NotContain extends QueryBuilderPostF
126
129
  }
127
130
  override buildPostFilterConditionExpression(
128
131
  postFilterConditionState: PostFilterConditionState,
132
+ parentExpression: LambdaFunction | undefined,
129
133
  ): ValueSpecification | undefined {
130
134
  const expression = super.buildPostFilterConditionExpression(
131
135
  postFilterConditionState,
136
+ parentExpression,
132
137
  );
133
138
  return expression ? buildNotExpression(expression) : undefined;
134
139
  }
@@ -18,6 +18,7 @@ import {
18
18
  type Type,
19
19
  type ValueSpecification,
20
20
  type FunctionExpression,
21
+ type LambdaFunction,
21
22
  PRIMITIVE_TYPE,
22
23
  PrimitiveType,
23
24
  } from '@finos/legend-graph';
@@ -36,7 +37,7 @@ import {
36
37
  buildNotExpression,
37
38
  unwrapNotExpression,
38
39
  } from '../../../../QueryBuilderValueSpecificationHelper.js';
39
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
40
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
40
41
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../../graph/QueryBuilderMetaModelConst.js';
41
42
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
42
43
  import { buildDefaultInstanceValue } from '../../../../shared/ValueSpecificationEditorHelper.js';
@@ -88,11 +89,13 @@ export class QueryBuilderPostFilterOperator_EndWith
88
89
 
89
90
  buildPostFilterConditionExpression(
90
91
  postFilterConditionState: PostFilterConditionState,
92
+ parentExpression: LambdaFunction | undefined,
91
93
  ): ValueSpecification | undefined {
92
- return buildPostFilterConditionExpression(
94
+ return buildPostFilterConditionExpressionHelper(
93
95
  postFilterConditionState,
94
96
  this,
95
97
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.ENDS_WITH,
98
+ parentExpression,
96
99
  );
97
100
  }
98
101
 
@@ -122,9 +125,11 @@ export class QueryBuilderPostFilterOperator_NotEndWith extends QueryBuilderPostF
122
125
 
123
126
  override buildPostFilterConditionExpression(
124
127
  postFilterConditionState: PostFilterConditionState,
128
+ parentExpression: LambdaFunction | undefined,
125
129
  ): ValueSpecification | undefined {
126
130
  const expression = super.buildPostFilterConditionExpression(
127
131
  postFilterConditionState,
132
+ parentExpression,
128
133
  );
129
134
  return expression ? buildNotExpression(expression) : undefined;
130
135
  }
@@ -19,6 +19,7 @@ import {
19
19
  type ValueSpecification,
20
20
  type SimpleFunctionExpression,
21
21
  type FunctionExpression,
22
+ type LambdaFunction,
22
23
  AbstractPropertyExpression,
23
24
  Enumeration,
24
25
  PRIMITIVE_TYPE,
@@ -40,7 +41,7 @@ import {
40
41
  isTypeCompatibleForAssignment,
41
42
  unwrapNotExpression,
42
43
  } from '../../../../QueryBuilderValueSpecificationHelper.js';
43
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
44
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
44
45
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../../graph/QueryBuilderMetaModelConst.js';
45
46
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
46
47
  import { buildDefaultInstanceValue } from '../../../../shared/ValueSpecificationEditorHelper.js';
@@ -106,8 +107,9 @@ export class QueryBuilderPostFilterOperator_Equal
106
107
 
107
108
  buildPostFilterConditionExpression(
108
109
  postFilterConditionState: PostFilterConditionState,
110
+ parentExpression: LambdaFunction | undefined,
109
111
  ): ValueSpecification | undefined {
110
- return buildPostFilterConditionExpression(
112
+ return buildPostFilterConditionExpressionHelper(
111
113
  postFilterConditionState,
112
114
  this,
113
115
  postFilterConditionState.leftConditionValue.getColumnType() ===
@@ -116,6 +118,7 @@ export class QueryBuilderPostFilterOperator_Equal
116
118
  PrimitiveType.DATETIME
117
119
  ? QUERY_BUILDER_SUPPORTED_FUNCTIONS.IS_ON_DAY
118
120
  : QUERY_BUILDER_SUPPORTED_FUNCTIONS.EQUAL,
121
+ parentExpression,
119
122
  );
120
123
  }
121
124
 
@@ -150,9 +153,11 @@ export class QueryBuilderPostFilterOperator_NotEqual extends QueryBuilderPostFil
150
153
 
151
154
  override buildPostFilterConditionExpression(
152
155
  postFilterConditionState: PostFilterConditionState,
156
+ parentExpression: LambdaFunction | undefined,
153
157
  ): ValueSpecification | undefined {
154
158
  const expression = super.buildPostFilterConditionExpression(
155
159
  postFilterConditionState,
160
+ parentExpression,
156
161
  );
157
162
  return expression ? buildNotExpression(expression) : undefined;
158
163
  }
@@ -18,6 +18,7 @@ import {
18
18
  type Type,
19
19
  type ValueSpecification,
20
20
  type FunctionExpression,
21
+ type LambdaFunction,
21
22
  AbstractPropertyExpression,
22
23
  PRIMITIVE_TYPE,
23
24
  PrimitiveType,
@@ -35,7 +36,7 @@ import type {
35
36
  QueryBuilderPostFilterState,
36
37
  } from '../QueryBuilderPostFilterState.js';
37
38
  import { isTypeCompatibleForAssignment } from '../../../../QueryBuilderValueSpecificationHelper.js';
38
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
39
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
39
40
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../../graph/QueryBuilderMetaModelConst.js';
40
41
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
41
42
  import { buildDefaultInstanceValue } from '../../../../shared/ValueSpecificationEditorHelper.js';
@@ -107,8 +108,9 @@ export class QueryBuilderPostFilterOperator_GreaterThan
107
108
 
108
109
  buildPostFilterConditionExpression(
109
110
  postFilterConditionState: PostFilterConditionState,
111
+ parentExpression: LambdaFunction | undefined,
110
112
  ): ValueSpecification | undefined {
111
- return buildPostFilterConditionExpression(
113
+ return buildPostFilterConditionExpressionHelper(
112
114
  postFilterConditionState,
113
115
  this,
114
116
  postFilterConditionState.leftConditionValue.getColumnType() ===
@@ -117,6 +119,7 @@ export class QueryBuilderPostFilterOperator_GreaterThan
117
119
  PrimitiveType.DATETIME
118
120
  ? QUERY_BUILDER_SUPPORTED_FUNCTIONS.IS_AFTER_DAY
119
121
  : QUERY_BUILDER_SUPPORTED_FUNCTIONS.GREATER_THAN,
122
+ parentExpression,
120
123
  );
121
124
  }
122
125
 
@@ -17,6 +17,7 @@
17
17
  import {
18
18
  type FunctionExpression,
19
19
  type ValueSpecification,
20
+ type LambdaFunction,
20
21
  AbstractPropertyExpression,
21
22
  PRIMITIVE_TYPE,
22
23
  PrimitiveType,
@@ -26,7 +27,7 @@ import type {
26
27
  PostFilterConditionState,
27
28
  QueryBuilderPostFilterState,
28
29
  } from '../QueryBuilderPostFilterState.js';
29
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
30
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
30
31
  import { QueryBuilderPostFilterOperator_GreaterThan } from './QueryBuilderPostFilterOperator_GreaterThan.js';
31
32
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../../graph/QueryBuilderMetaModelConst.js';
32
33
  import { hashArray } from '@finos/legend-shared';
@@ -39,8 +40,9 @@ export class QueryBuilderPostFilterOperator_GreaterThanEqual extends QueryBuilde
39
40
 
40
41
  override buildPostFilterConditionExpression(
41
42
  postFilterConditionState: PostFilterConditionState,
43
+ parentExpression: LambdaFunction | undefined,
42
44
  ): ValueSpecification | undefined {
43
- return buildPostFilterConditionExpression(
45
+ return buildPostFilterConditionExpressionHelper(
44
46
  postFilterConditionState,
45
47
  this,
46
48
  postFilterConditionState.leftConditionValue.getColumnType() ===
@@ -49,6 +51,7 @@ export class QueryBuilderPostFilterOperator_GreaterThanEqual extends QueryBuilde
49
51
  PrimitiveType.DATETIME
50
52
  ? QUERY_BUILDER_SUPPORTED_FUNCTIONS.IS_ON_OR_AFTER_DAY
51
53
  : QUERY_BUILDER_SUPPORTED_FUNCTIONS.GREATER_THAN_EQUAL,
54
+ parentExpression,
52
55
  );
53
56
  }
54
57
 
@@ -19,6 +19,7 @@ import {
19
19
  type ValueSpecification,
20
20
  type SimpleFunctionExpression,
21
21
  type FunctionExpression,
22
+ type LambdaFunction,
22
23
  CollectionInstanceValue,
23
24
  Enumeration,
24
25
  PRIMITIVE_TYPE,
@@ -39,7 +40,7 @@ import {
39
40
  type PostFilterConditionState,
40
41
  type QueryBuilderPostFilterState,
41
42
  } from '../QueryBuilderPostFilterState.js';
42
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
43
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
43
44
  import {
44
45
  buildNotExpression,
45
46
  getCollectionValueSpecificationType,
@@ -139,11 +140,13 @@ export class QueryBuilderPostFilterOperator_In
139
140
 
140
141
  buildPostFilterConditionExpression(
141
142
  postFilterConditionState: PostFilterConditionState,
143
+ parentExpression: LambdaFunction | undefined,
142
144
  ): ValueSpecification | undefined {
143
- return buildPostFilterConditionExpression(
145
+ return buildPostFilterConditionExpressionHelper(
144
146
  postFilterConditionState,
145
147
  this,
146
148
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.IN,
149
+ parentExpression,
147
150
  );
148
151
  }
149
152
 
@@ -173,9 +176,11 @@ export class QueryBuilderPostFilterOperator_NotIn extends QueryBuilderPostFilter
173
176
 
174
177
  override buildPostFilterConditionExpression(
175
178
  postFilterConditionState: PostFilterConditionState,
179
+ parentExpression: LambdaFunction | undefined,
176
180
  ): ValueSpecification | undefined {
177
181
  const expression = super.buildPostFilterConditionExpression(
178
182
  postFilterConditionState,
183
+ parentExpression,
179
184
  );
180
185
  return expression ? buildNotExpression(expression) : undefined;
181
186
  }
@@ -18,6 +18,7 @@ import {
18
18
  type Type,
19
19
  type ValueSpecification,
20
20
  type FunctionExpression,
21
+ type LambdaFunction,
21
22
  Enumeration,
22
23
  PrimitiveType,
23
24
  } from '@finos/legend-graph';
@@ -29,7 +30,7 @@ import {
29
30
  PostFilterValueSpecConditionValueState,
30
31
  } from '../QueryBuilderPostFilterState.js';
31
32
  import { QueryBuilderSimpleProjectionColumnState } from '../../projection/QueryBuilderProjectionColumnState.js';
32
- import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
33
+ import { buildPostFilterConditionExpressionHelper } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
33
34
  import { isPropertyExpressionChainOptional } from '../../../../QueryBuilderValueSpecificationHelper.js';
34
35
  import { type Hashable, hashArray } from '@finos/legend-shared';
35
36
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../../QueryBuilderStateHashUtils.js';
@@ -91,11 +92,13 @@ export class QueryBuilderPostFilterOperator_IsEmpty
91
92
 
92
93
  buildPostFilterConditionExpression(
93
94
  postFilterConditionState: PostFilterConditionState,
95
+ parentExpression: LambdaFunction | undefined,
94
96
  ): ValueSpecification | undefined {
95
- return buildPostFilterConditionExpression(
97
+ return buildPostFilterConditionExpressionHelper(
96
98
  postFilterConditionState,
97
99
  this,
98
100
  undefined,
101
+ parentExpression,
99
102
  );
100
103
  }
101
104