@finos/legend-query-builder 4.7.3 → 4.8.0

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 (83) hide show
  1. package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
  2. package/lib/components/QueryBuilderConstantExpressionPanel.js +24 -8
  3. package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
  4. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  5. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +5 -3
  6. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  7. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  8. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +8 -1
  9. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  10. package/lib/components/shared/LambdaEditor.d.ts +1 -11
  11. package/lib/components/shared/LambdaEditor.d.ts.map +1 -1
  12. package/lib/components/shared/LambdaEditor.js +11 -4
  13. package/lib/components/shared/LambdaEditor.js.map +1 -1
  14. package/lib/index.css +2 -2
  15. package/lib/index.css.map +1 -1
  16. package/lib/package.json +2 -2
  17. package/lib/stores/QueryBuilderConstantsState.d.ts +2 -1
  18. package/lib/stores/QueryBuilderConstantsState.d.ts.map +1 -1
  19. package/lib/stores/QueryBuilderConstantsState.js +9 -1
  20. package/lib/stores/QueryBuilderConstantsState.js.map +1 -1
  21. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  22. package/lib/stores/QueryBuilderState.js +1 -0
  23. package/lib/stores/QueryBuilderState.js.map +1 -1
  24. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts +1 -1
  25. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -1
  26. package/lib/stores/QueryBuilderTypeaheadHelper.js +190 -30
  27. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
  28. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
  29. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  30. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  31. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts +1 -0
  32. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts.map +1 -1
  33. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js +4 -0
  34. package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js.map +1 -1
  35. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +1 -0
  36. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  37. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +3 -0
  38. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  39. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +2 -0
  40. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  41. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +25 -1
  42. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  43. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +3 -1
  44. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  45. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +6 -0
  46. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  47. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts +9 -2
  48. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts.map +1 -1
  49. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js +40 -6
  50. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js.map +1 -1
  51. package/lib/stores/milestoning/QueryBuilderBitemporalMilestoningImplementation.d.ts +1 -0
  52. package/lib/stores/milestoning/QueryBuilderBitemporalMilestoningImplementation.d.ts.map +1 -1
  53. package/lib/stores/milestoning/QueryBuilderBitemporalMilestoningImplementation.js +8 -1
  54. package/lib/stores/milestoning/QueryBuilderBitemporalMilestoningImplementation.js.map +1 -1
  55. package/lib/stores/milestoning/QueryBuilderBusinessTemporalMilestoningImplementation.d.ts +1 -0
  56. package/lib/stores/milestoning/QueryBuilderBusinessTemporalMilestoningImplementation.d.ts.map +1 -1
  57. package/lib/stores/milestoning/QueryBuilderBusinessTemporalMilestoningImplementation.js +7 -1
  58. package/lib/stores/milestoning/QueryBuilderBusinessTemporalMilestoningImplementation.js.map +1 -1
  59. package/lib/stores/milestoning/QueryBuilderMilestoningImplementation.d.ts +4 -0
  60. package/lib/stores/milestoning/QueryBuilderMilestoningImplementation.d.ts.map +1 -1
  61. package/lib/stores/milestoning/QueryBuilderMilestoningImplementation.js.map +1 -1
  62. package/lib/stores/milestoning/QueryBuilderProcessingTemporalMilestoningImplementation.d.ts +1 -0
  63. package/lib/stores/milestoning/QueryBuilderProcessingTemporalMilestoningImplementation.d.ts.map +1 -1
  64. package/lib/stores/milestoning/QueryBuilderProcessingTemporalMilestoningImplementation.js +7 -1
  65. package/lib/stores/milestoning/QueryBuilderProcessingTemporalMilestoningImplementation.js.map +1 -1
  66. package/package.json +6 -6
  67. package/src/components/QueryBuilderConstantExpressionPanel.tsx +81 -24
  68. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +11 -1
  69. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +12 -1
  70. package/src/components/shared/LambdaEditor.tsx +15 -2
  71. package/src/stores/QueryBuilderConstantsState.ts +12 -0
  72. package/src/stores/QueryBuilderState.ts +1 -0
  73. package/src/stores/QueryBuilderTypeaheadHelper.ts +382 -54
  74. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -0
  75. package/src/stores/fetch-structure/QueryBuilderFetchStructureState.ts +5 -0
  76. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +4 -0
  77. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +43 -1
  78. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +11 -0
  79. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.ts +66 -9
  80. package/src/stores/milestoning/QueryBuilderBitemporalMilestoningImplementation.ts +14 -0
  81. package/src/stores/milestoning/QueryBuilderBusinessTemporalMilestoningImplementation.ts +13 -0
  82. package/src/stores/milestoning/QueryBuilderMilestoningImplementation.ts +7 -0
  83. package/src/stores/milestoning/QueryBuilderProcessingTemporalMilestoningImplementation.ts +13 -0
@@ -15,77 +15,356 @@
15
15
  */
16
16
 
17
17
  import {
18
- type AbstractPropertyExpression,
18
+ AbstractPropertyExpression,
19
19
  type ExecutionResult,
20
20
  type ValueSpecification,
21
21
  PrimitiveInstanceValue,
22
22
  PRIMITIVE_TYPE,
23
23
  TDSExecutionResult,
24
24
  type RawLambda,
25
+ DerivedProperty,
26
+ Class,
27
+ SimpleFunctionExpression,
28
+ matchFunctionName,
29
+ PrimitiveType,
30
+ type ObserverContext,
31
+ Multiplicity,
32
+ getMilestoneTemporalStereotype,
33
+ extractElementNameFromPath,
34
+ CollectionInstanceValue,
35
+ GenericTypeExplicitReference,
36
+ GenericType,
37
+ CORE_PURE_PATH,
38
+ FunctionType,
39
+ LambdaFunction,
40
+ PackageableElementExplicitReference,
41
+ PropertyExplicitReference,
42
+ getAllClassDerivedProperties,
43
+ VariableExpression,
44
+ buildRawLambdaFromLambdaFunction,
45
+ type Type,
46
+ INTERNAL__UnknownValueSpecification,
47
+ V1_transformRawLambda,
48
+ V1_GraphTransformerContextBuilder,
49
+ V1_serializeRawValueSpecification,
25
50
  } from '@finos/legend-graph';
26
- import { guaranteeType, isNonNullable, isString } from '@finos/legend-shared';
51
+ import {
52
+ getNullableFirstEntry,
53
+ guaranteeNonNullable,
54
+ guaranteeType,
55
+ isNonNullable,
56
+ isString,
57
+ UnsupportedOperationError,
58
+ } from '@finos/legend-shared';
27
59
  import { QueryBuilderPostFilterOperator_StartWith } from './fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js';
28
60
  import type { QueryBuilderAggregateColumnState } from './fetch-structure/tds/aggregation/QueryBuilderAggregationState.js';
29
61
  import {
30
- PostFilterConditionState,
31
- QueryBuilderPostFilterTreeConditionNodeData,
62
+ getTDSColumnDerivedProperyFromType,
63
+ type TDS_COLUMN_GETTER,
32
64
  } from './fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js';
33
65
  import {
66
+ QueryBuilderDerivationProjectionColumnState,
34
67
  QueryBuilderProjectionColumnState,
35
68
  QueryBuilderSimpleProjectionColumnState,
36
69
  } from './fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
37
70
  import type { QueryBuilderState } from './QueryBuilderState.js';
38
- import { QueryBuilderTDSState } from './fetch-structure/tds/QueryBuilderTDSState.js';
39
71
  import {
40
72
  DEFAULT_TYPEAHEAD_SEARCH_LIMIT,
41
73
  DEFAULT_TYPEAHEAD_SEARCH_MINIMUM_SEARCH_LENGTH,
42
74
  } from '@finos/legend-application';
75
+ import {
76
+ QUERY_BUILDER_PURE_PATH,
77
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS,
78
+ } from '../graph/QueryBuilderMetaModelConst.js';
79
+ import {
80
+ functionExpression_setParametersValues,
81
+ variableExpression_setName,
82
+ } from './shared/ValueSpecificationModifierHelper.js';
83
+ import { createSupportedFunctionExpression } from './shared/ValueSpecificationEditorHelper.js';
84
+ import { buildGetAllFunction } from './QueryBuilderValueSpecificationBuilder.js';
85
+ import { getPropertyChainName } from './QueryBuilderPropertyEditorState.js';
86
+ import { buildGenericLambdaFunctionInstanceValue } from './QueryBuilderValueSpecificationHelper.js';
87
+ import {
88
+ DEFAULT_LAMBDA_VARIABLE_NAME,
89
+ DEFAULT_POST_FILTER_LAMBDA_VARIABLE_NAME,
90
+ } from './QueryBuilderConfig.js';
91
+ import type { QueryBuilderAggregateOperator } from './fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js';
43
92
 
44
- const initializeQueryBuilderState = (
45
- queryBuilderState: QueryBuilderState,
46
- ): QueryBuilderState => {
47
- const builderState = queryBuilderState.INTERNAL__toBasicQueryBuilderState();
48
- const tdsState = guaranteeType(
49
- builderState.fetchStructureState.implementation,
50
- QueryBuilderTDSState,
51
- );
52
- tdsState.resultSetModifierState.distinct = true;
53
- tdsState.resultSetModifierState.limit = DEFAULT_TYPEAHEAD_SEARCH_LIMIT;
54
- return builderState;
93
+ const buildPropertyExpressionChainWithDefaultMilestoningDates = (
94
+ propertyExpression: AbstractPropertyExpression,
95
+ lambdaParameterName: string,
96
+ observerContext: ObserverContext,
97
+ ): AbstractPropertyExpression => {
98
+ const newPropertyExpression = new AbstractPropertyExpression('');
99
+ newPropertyExpression.func = propertyExpression.func;
100
+ newPropertyExpression.parametersValues = [
101
+ ...propertyExpression.parametersValues,
102
+ ];
103
+
104
+ let nextExpression: ValueSpecification | undefined;
105
+ let currentExpression: ValueSpecification | undefined = newPropertyExpression;
106
+ while (currentExpression instanceof AbstractPropertyExpression) {
107
+ nextExpression = getNullableFirstEntry(currentExpression.parametersValues);
108
+ if (nextExpression instanceof AbstractPropertyExpression) {
109
+ const parameterValue = new AbstractPropertyExpression('');
110
+ parameterValue.func = nextExpression.func;
111
+ parameterValue.parametersValues = [...nextExpression.parametersValues];
112
+ nextExpression = parameterValue;
113
+ currentExpression.parametersValues[0] = parameterValue;
114
+ }
115
+ if (
116
+ currentExpression instanceof AbstractPropertyExpression &&
117
+ currentExpression.func.value.genericType.value.rawType instanceof Class &&
118
+ currentExpression.func.value._OWNER._generatedMilestonedProperties
119
+ .length !== 0 &&
120
+ currentExpression.func.value instanceof DerivedProperty &&
121
+ !currentExpression.func.value._OWNER.derivedProperties.includes(
122
+ currentExpression.func.value,
123
+ )
124
+ ) {
125
+ const parameterValue = createSupportedFunctionExpression(
126
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.NOW,
127
+ PrimitiveType.DATETIME,
128
+ );
129
+ const parameterValues =
130
+ currentExpression.parametersValues.length === 2
131
+ ? [parameterValue]
132
+ : [parameterValue, parameterValue];
133
+ functionExpression_setParametersValues(
134
+ currentExpression,
135
+ [
136
+ guaranteeNonNullable(currentExpression.parametersValues[0]),
137
+ ...parameterValues,
138
+ ],
139
+ observerContext,
140
+ );
141
+ }
142
+ currentExpression = nextExpression;
143
+ // Take care of chains of subtype (a pattern that is not useful, but we want to support and rectify)
144
+ // $x.employees->subType(@Person)->subType(@Staff)
145
+ while (
146
+ currentExpression instanceof SimpleFunctionExpression &&
147
+ matchFunctionName(
148
+ currentExpression.functionName,
149
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.SUBTYPE,
150
+ )
151
+ ) {
152
+ currentExpression = getNullableFirstEntry(
153
+ currentExpression.parametersValues,
154
+ );
155
+ }
156
+ }
157
+
158
+ // Update the root lambda name based on the parent's lambda parameter name.
159
+ if (currentExpression instanceof VariableExpression) {
160
+ variableExpression_setName(currentExpression, lambdaParameterName);
161
+ }
162
+ return newPropertyExpression;
55
163
  };
56
164
 
57
- const buildColumnTypeaheadQuery = (
58
- builderState: QueryBuilderState,
59
- columnState:
60
- | QueryBuilderProjectionColumnState
61
- | QueryBuilderAggregateColumnState,
62
- value: ValueSpecification | undefined,
165
+ const buildRawLambda = (
166
+ queryBuilderState: QueryBuilderState,
167
+ propertyExpression?: AbstractPropertyExpression | undefined,
168
+ aggregationOperator?: QueryBuilderAggregateOperator | undefined,
169
+ colLambda?: ValueSpecification | undefined,
170
+ colType?: Type | undefined,
171
+ colName?: string | undefined,
172
+ value?: ValueSpecification | undefined,
63
173
  ): RawLambda => {
64
- const tdsState = guaranteeType(
65
- builderState.fetchStructureState.implementation,
66
- QueryBuilderTDSState,
174
+ if (!propertyExpression && !(colLambda && colType && colName)) {
175
+ throw new UnsupportedOperationError(`Can't build typeahead query`);
176
+ }
177
+
178
+ const lambdaFunction = new LambdaFunction(
179
+ new FunctionType(
180
+ PackageableElementExplicitReference.create(
181
+ queryBuilderState.graphManagerState.graph.getType(CORE_PURE_PATH.ANY),
182
+ ),
183
+ Multiplicity.ONE,
184
+ ),
67
185
  );
68
- let projectionColumnState;
69
- if (columnState instanceof QueryBuilderProjectionColumnState) {
70
- projectionColumnState = columnState;
186
+
187
+ // build getAll function
188
+ const _class = guaranteeNonNullable(queryBuilderState.class);
189
+ const getAllFn = buildGetAllFunction(
190
+ guaranteeNonNullable(queryBuilderState.class),
191
+ Multiplicity.ONE,
192
+ );
193
+ const milestoningStereotype = getMilestoneTemporalStereotype(
194
+ _class,
195
+ queryBuilderState.graphManagerState.graph,
196
+ );
197
+ if (milestoningStereotype) {
198
+ // build milestoning parameter(s) for getAll()
199
+ queryBuilderState.milestoningState
200
+ .getMilestoningImplementation(milestoningStereotype)
201
+ .buildGetAllWithDefaultParameters(getAllFn);
202
+ }
203
+ lambdaFunction.expressionSequence[0] = getAllFn;
204
+
205
+ // projection
206
+ const columnName = propertyExpression
207
+ ? getPropertyChainName(propertyExpression, false)
208
+ : colName;
209
+ if (aggregationOperator) {
210
+ const groupByFunction = new SimpleFunctionExpression(
211
+ extractElementNameFromPath(
212
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_GROUP_BY,
213
+ ),
214
+ );
215
+
216
+ const colLambdas = new CollectionInstanceValue(Multiplicity.ZERO);
217
+ const aggregateLambdas = new CollectionInstanceValue(Multiplicity.ONE);
218
+ const colAliases = new CollectionInstanceValue(Multiplicity.ONE);
219
+ const colAlias = new PrimitiveInstanceValue(
220
+ GenericTypeExplicitReference.create(
221
+ new GenericType(PrimitiveType.STRING),
222
+ ),
223
+ );
224
+ colAlias.values.push(columnName);
225
+ colAliases.values.push(colAlias);
226
+ const columnLambda = propertyExpression
227
+ ? buildGenericLambdaFunctionInstanceValue(
228
+ DEFAULT_LAMBDA_VARIABLE_NAME,
229
+ [propertyExpression],
230
+ queryBuilderState.graphManagerState.graph,
231
+ )
232
+ : colLambda;
233
+ const aggregateFunctionExpression = new SimpleFunctionExpression(
234
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_AGG),
235
+ );
236
+ const aggregateLambda = buildGenericLambdaFunctionInstanceValue(
237
+ DEFAULT_LAMBDA_VARIABLE_NAME,
238
+ [
239
+ aggregationOperator.buildAggregateExpression(
240
+ propertyExpression,
241
+ DEFAULT_LAMBDA_VARIABLE_NAME,
242
+ queryBuilderState.graphManagerState.graph,
243
+ ),
244
+ ],
245
+ queryBuilderState.graphManagerState.graph,
246
+ );
247
+ aggregateFunctionExpression.parametersValues = [
248
+ guaranteeNonNullable(columnLambda),
249
+ aggregateLambda,
250
+ ];
251
+ aggregateLambdas.values.push(aggregateFunctionExpression);
252
+ groupByFunction.parametersValues = [
253
+ lambdaFunction.expressionSequence[0],
254
+ colLambdas,
255
+ aggregateLambdas,
256
+ colAliases,
257
+ ];
258
+ lambdaFunction.expressionSequence[0] = groupByFunction;
71
259
  } else {
72
- projectionColumnState = columnState.projectionColumnState;
73
- const aggregationState = tdsState.aggregationState;
74
- aggregationState.columns = [columnState];
260
+ const projectFunction = new SimpleFunctionExpression(
261
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT),
262
+ );
263
+ const colLambdas = new CollectionInstanceValue(Multiplicity.ONE);
264
+ const colAliases = new CollectionInstanceValue(Multiplicity.ONE);
265
+ // column alias
266
+ const colAlias = new PrimitiveInstanceValue(
267
+ GenericTypeExplicitReference.create(
268
+ new GenericType(PrimitiveType.STRING),
269
+ ),
270
+ );
271
+ colAlias.values.push(columnName);
272
+ colAliases.values.push(colAlias);
273
+ const columnLambda = propertyExpression
274
+ ? buildGenericLambdaFunctionInstanceValue(
275
+ DEFAULT_LAMBDA_VARIABLE_NAME,
276
+ [propertyExpression],
277
+ queryBuilderState.graphManagerState.graph,
278
+ )
279
+ : colLambda;
280
+ colLambdas.values.push(guaranteeNonNullable(columnLambda));
281
+ projectFunction.parametersValues = [
282
+ lambdaFunction.expressionSequence[0],
283
+ colLambdas,
284
+ colAliases,
285
+ ];
286
+ lambdaFunction.expressionSequence[0] = projectFunction;
75
287
  }
76
- tdsState.projectionColumns = [projectionColumnState];
77
- const postConditionState = new PostFilterConditionState(
78
- tdsState.postFilterState,
79
- columnState,
80
- value,
81
- new QueryBuilderPostFilterOperator_StartWith(),
288
+
289
+ // append post filter
290
+ const operator = new QueryBuilderPostFilterOperator_StartWith();
291
+ const tdsPropertyExpression = new AbstractPropertyExpression('');
292
+ let tdsDerivedPropertyName: TDS_COLUMN_GETTER;
293
+ const correspondingTDSDerivedProperty = operator.getTDSColumnGetter();
294
+ if (correspondingTDSDerivedProperty) {
295
+ tdsDerivedPropertyName = correspondingTDSDerivedProperty;
296
+ } else {
297
+ const type =
298
+ propertyExpression?.func.value.genericType.value.rawType ?? colType;
299
+ tdsDerivedPropertyName = getTDSColumnDerivedProperyFromType(
300
+ guaranteeNonNullable(type),
301
+ );
302
+ }
303
+ tdsPropertyExpression.func = PropertyExplicitReference.create(
304
+ guaranteeNonNullable(
305
+ getAllClassDerivedProperties(
306
+ queryBuilderState.graphManagerState.graph.getClass(
307
+ QUERY_BUILDER_PURE_PATH.TDS_ROW,
308
+ ),
309
+ ).find((p) => p.name === tdsDerivedPropertyName),
310
+ ),
82
311
  );
83
- const postFilterNode = new QueryBuilderPostFilterTreeConditionNodeData(
84
- undefined,
85
- postConditionState,
312
+ const variableName = new VariableExpression(
313
+ DEFAULT_POST_FILTER_LAMBDA_VARIABLE_NAME,
314
+ Multiplicity.ONE,
315
+ );
316
+ const colInstanceValue = new PrimitiveInstanceValue(
317
+ GenericTypeExplicitReference.create(new GenericType(PrimitiveType.STRING)),
318
+ );
319
+ colInstanceValue.values = [columnName];
320
+ tdsPropertyExpression.parametersValues = [variableName, colInstanceValue];
321
+
322
+ const postFilterExpression = new SimpleFunctionExpression(
323
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.STARTS_WITH),
324
+ );
325
+ postFilterExpression.parametersValues.push(tdsPropertyExpression);
326
+ if (value) {
327
+ postFilterExpression.parametersValues.push(value);
328
+ }
329
+ const filterLambda = buildGenericLambdaFunctionInstanceValue(
330
+ DEFAULT_POST_FILTER_LAMBDA_VARIABLE_NAME,
331
+ [postFilterExpression],
332
+ queryBuilderState.graphManagerState.graph,
333
+ );
334
+
335
+ // build post-filter expression
336
+ const filterExpression = new SimpleFunctionExpression(
337
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_FILTER),
338
+ );
339
+ const projectExpression = guaranteeNonNullable(
340
+ lambdaFunction.expressionSequence[0],
341
+ );
342
+ filterExpression.parametersValues = [projectExpression, filterLambda];
343
+ lambdaFunction.expressionSequence[0] = filterExpression;
344
+
345
+ // append distinct and take
346
+ const postFilterExp = lambdaFunction.expressionSequence[0];
347
+ let currentExpression = postFilterExp;
348
+ const distinctFunction = new SimpleFunctionExpression(
349
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_DISTINCT),
350
+ );
351
+ distinctFunction.parametersValues[0] = currentExpression;
352
+ currentExpression = distinctFunction;
353
+ const limit = new PrimitiveInstanceValue(
354
+ GenericTypeExplicitReference.create(new GenericType(PrimitiveType.INTEGER)),
355
+ );
356
+ limit.values = [DEFAULT_TYPEAHEAD_SEARCH_LIMIT];
357
+ const takeFunction = new SimpleFunctionExpression(
358
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_TAKE),
359
+ );
360
+ takeFunction.parametersValues[0] = currentExpression;
361
+ takeFunction.parametersValues[1] = limit;
362
+ currentExpression = takeFunction;
363
+ lambdaFunction.expressionSequence[0] = currentExpression;
364
+ return buildRawLambdaFromLambdaFunction(
365
+ lambdaFunction,
366
+ queryBuilderState.graphManagerState,
86
367
  );
87
- tdsState.postFilterState.addNodeFromNode(postFilterNode, undefined);
88
- return builderState.resultState.buildExecutionRawLambda();
89
368
  };
90
369
 
91
370
  export const buildPropertyTypeaheadQuery = (
@@ -93,17 +372,22 @@ export const buildPropertyTypeaheadQuery = (
93
372
  propertyExpression: AbstractPropertyExpression,
94
373
  value: ValueSpecification | undefined,
95
374
  ): RawLambda => {
96
- const builderState = initializeQueryBuilderState(queryBuilderState);
97
- const tdsState = guaranteeType(
98
- builderState.fetchStructureState.implementation,
99
- QueryBuilderTDSState,
100
- );
101
- const columnState = new QueryBuilderSimpleProjectionColumnState(
102
- tdsState,
103
- propertyExpression,
104
- false,
375
+ const newPropertyExpression =
376
+ buildPropertyExpressionChainWithDefaultMilestoningDates(
377
+ propertyExpression,
378
+ DEFAULT_LAMBDA_VARIABLE_NAME,
379
+ queryBuilderState.observerContext,
380
+ );
381
+
382
+ return buildRawLambda(
383
+ queryBuilderState,
384
+ newPropertyExpression,
385
+ undefined,
386
+ undefined,
387
+ undefined,
388
+ undefined,
389
+ value,
105
390
  );
106
- return buildColumnTypeaheadQuery(builderState, columnState, value);
107
391
  };
108
392
 
109
393
  export const buildProjectionColumnTypeaheadQuery = (
@@ -113,8 +397,52 @@ export const buildProjectionColumnTypeaheadQuery = (
113
397
  | QueryBuilderAggregateColumnState,
114
398
  value: ValueSpecification | undefined,
115
399
  ): RawLambda => {
116
- const builderState = initializeQueryBuilderState(queryBuilderState);
117
- return buildColumnTypeaheadQuery(builderState, columnState, value);
400
+ let propertyExpression: AbstractPropertyExpression | undefined = undefined;
401
+ let aggregationOperator: QueryBuilderAggregateOperator | undefined =
402
+ undefined;
403
+ let columnLambda: ValueSpecification | undefined = undefined;
404
+ let columnName: string | undefined = undefined;
405
+ let columnType: Type | undefined = undefined;
406
+ let column: QueryBuilderProjectionColumnState;
407
+ if (columnState instanceof QueryBuilderProjectionColumnState) {
408
+ column = columnState;
409
+ } else {
410
+ column = columnState.projectionColumnState;
411
+ aggregationOperator = columnState.operator;
412
+ }
413
+ if (column instanceof QueryBuilderDerivationProjectionColumnState) {
414
+ columnLambda = new INTERNAL__UnknownValueSpecification(
415
+ V1_serializeRawValueSpecification(
416
+ V1_transformRawLambda(
417
+ column.lambda,
418
+ new V1_GraphTransformerContextBuilder(
419
+ // TODO?: do we need to include the plugins here?
420
+ [],
421
+ ).build(),
422
+ ),
423
+ ),
424
+ );
425
+ columnName = column.columnName;
426
+ columnType = column.returnType;
427
+ } else {
428
+ propertyExpression =
429
+ buildPropertyExpressionChainWithDefaultMilestoningDates(
430
+ guaranteeType(column, QueryBuilderSimpleProjectionColumnState)
431
+ .propertyExpressionState.propertyExpression,
432
+ DEFAULT_LAMBDA_VARIABLE_NAME,
433
+ queryBuilderState.observerContext,
434
+ );
435
+ }
436
+
437
+ return buildRawLambda(
438
+ queryBuilderState,
439
+ propertyExpression,
440
+ aggregationOperator,
441
+ columnLambda,
442
+ columnType,
443
+ columnName,
444
+ value,
445
+ );
118
446
  };
119
447
 
120
448
  export const buildTypeaheadOptions = (result: ExecutionResult): string[] => {
@@ -73,6 +73,7 @@ export abstract class QueryBuilderFetchStructureImplementationState
73
73
  options?: LambdaFunctionBuilderOption,
74
74
  ): void;
75
75
  abstract initialize(): void;
76
+ abstract initializeWithQuery(): void;
76
77
  abstract get hashCode(): string;
77
78
 
78
79
  get TEMPORARY__showPostFetchStructurePanel(): boolean {
@@ -37,6 +37,7 @@ export class QueryBuilderFetchStructureState {
37
37
  makeObservable(this, {
38
38
  implementation: observable,
39
39
  changeImplementation: action,
40
+ initializeWithQuery: action,
40
41
  });
41
42
 
42
43
  this.queryBuilderState = queryBuilderState;
@@ -77,6 +78,10 @@ export class QueryBuilderFetchStructureState {
77
78
  this.implementation.initialize();
78
79
  }
79
80
 
81
+ initializeWithQuery(): void {
82
+ this.implementation.initializeWithQuery();
83
+ }
84
+
80
85
  fetchProperty(node: QueryBuilderExplorerTreeNodeData): void {
81
86
  if (
82
87
  node instanceof QueryBuilderExplorerTreePropertyNodeData &&
@@ -413,6 +413,10 @@ export class QueryBuilderGraphFetchTreeState
413
413
  }
414
414
  }
415
415
 
416
+ override initializeWithQuery(): void {
417
+ return;
418
+ }
419
+
416
420
  onClassChange(_class: Class | undefined): void {
417
421
  this.updateTreeData(_class);
418
422
  }
@@ -44,6 +44,7 @@ import {
44
44
  type LambdaFunction,
45
45
  type ValueSpecification,
46
46
  type VariableExpression,
47
+ type EngineError,
47
48
  GRAPH_MANAGER_EVENT,
48
49
  extractSourceInformationCoordinates,
49
50
  LAMBDA_PIPE,
@@ -150,9 +151,11 @@ export class QueryBuilderTDSState
150
151
  removeAllColumns: action,
151
152
  replaceColumn: action,
152
153
  initialize: action,
154
+ initializeWithQuery: action,
153
155
  setShowPostFilterPanel: action,
154
156
  setShowWindowFuncPanel: action,
155
157
  convertDerivationProjectionObjects: flow,
158
+ fetchDerivedReturnTypes: flow,
156
159
  });
157
160
 
158
161
  this.resultSetModifierState = new QueryResultSetModifierState(this);
@@ -358,6 +361,12 @@ export class QueryBuilderTDSState
358
361
  this.setShowWindowFuncPanel(false);
359
362
  }
360
363
 
364
+ override initializeWithQuery(): void {
365
+ flowResult(this.fetchDerivedReturnTypes()).catch(
366
+ this.queryBuilderState.applicationStore.alertUnhandledError,
367
+ );
368
+ }
369
+
361
370
  isColumnInUse(tdsCol: QueryBuilderTDSColumnState): boolean {
362
371
  return Boolean(
363
372
  [
@@ -741,7 +750,7 @@ export class QueryBuilderTDSState
741
750
  filterByType(QueryBuilderDerivationProjectionColumnState),
742
751
  );
743
752
  if (derivationColumns.length) {
744
- // we will return false if any derivation cols are present as we can't verify is the variable is ued
753
+ // we will return false if any derivation cols are present as we can't verify is the variable is used
745
754
  return false;
746
755
  }
747
756
  const usedInProjection = columns
@@ -760,4 +769,37 @@ export class QueryBuilderTDSState
760
769
  this.resultSetModifierState,
761
770
  ]);
762
771
  }
772
+
773
+ *fetchDerivedReturnTypes(): GeneratorFn<void> {
774
+ try {
775
+ const input = new Map<string, RawLambda>();
776
+ const graph = this.queryBuilderState.graphManagerState.graph;
777
+ const derivedCols = this.projectionColumns.filter(
778
+ filterByType(QueryBuilderDerivationProjectionColumnState),
779
+ );
780
+ derivedCols.forEach((col) =>
781
+ input.set(col.columnName, col.getIsolatedRawLambda()),
782
+ );
783
+ const result =
784
+ (yield this.queryBuilderState.graphManagerState.graphManager.getLambdasReturnType(
785
+ input,
786
+ graph,
787
+ )) as {
788
+ results: Map<string, string>;
789
+ errors: Map<string, EngineError>;
790
+ };
791
+ Array.from(result.results.entries()).forEach((res) => {
792
+ const col = derivedCols.find((d) => d.columnName === res[0]);
793
+ if (col) {
794
+ col.setLambdaReturnType(res[1]);
795
+ }
796
+ });
797
+ } catch (error) {
798
+ assertErrorThrown(error);
799
+ this.queryBuilderState.applicationStore.logService.info(
800
+ LogEvent.create('Unable to fetch derived return types'),
801
+ error,
802
+ );
803
+ }
804
+ }
763
805
  }
@@ -480,6 +480,9 @@ export class QueryBuilderPostFilterState
480
480
  operators: QueryBuilderPostFilterOperator[] = [];
481
481
  rootIds: string[] = [];
482
482
  nodes = new Map<string, QueryBuilderPostFilterTreeNodeData>();
483
+ derivedColumnBeingDropped:
484
+ | QueryBuilderDerivationProjectionColumnState
485
+ | undefined;
483
486
 
484
487
  constructor(
485
488
  tdsState: QueryBuilderTDSState,
@@ -492,6 +495,7 @@ export class QueryBuilderPostFilterState
492
495
  rootIds: observable,
493
496
  nodes: observable,
494
497
  lambdaParameterName: observable,
498
+ derivedColumnBeingDropped: observable,
495
499
  setLambdaParameterName: action,
496
500
  setSelectedNode: action,
497
501
  addNodeFromNode: action,
@@ -504,6 +508,7 @@ export class QueryBuilderPostFilterState
504
508
  expandTree: action,
505
509
  replaceBlankNodeWithNode: action,
506
510
  setRearrangingConditions: action,
511
+ setDerivedColumnBeingDropped: action,
507
512
  hashCode: computed,
508
513
  });
509
514
 
@@ -526,6 +531,12 @@ export class QueryBuilderPostFilterState
526
531
  );
527
532
  }
528
533
 
534
+ setDerivedColumnBeingDropped(
535
+ val: QueryBuilderDerivationProjectionColumnState | undefined,
536
+ ): void {
537
+ this.derivedColumnBeingDropped = val;
538
+ }
539
+
529
540
  get isEmpty(): boolean {
530
541
  return !this.nodes.size && !this.rootIds.length;
531
542
  }