@finos/legend-query-builder 4.2.4 → 4.3.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 (108) hide show
  1. package/lib/components/QueryBuilder.d.ts.map +1 -1
  2. package/lib/components/QueryBuilder.js +3 -1
  3. package/lib/components/QueryBuilder.js.map +1 -1
  4. package/lib/components/QueryBuilderSideBar.d.ts +16 -0
  5. package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
  6. package/lib/components/QueryBuilderSideBar.js +85 -7
  7. package/lib/components/QueryBuilderSideBar.js.map +1 -1
  8. package/lib/components/QueryChat.d.ts.map +1 -1
  9. package/lib/components/QueryChat.js +1 -1
  10. package/lib/components/QueryChat.js.map +1 -1
  11. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +2 -2
  12. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
  13. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
  14. package/lib/components/explorer/QueryBuilderExplorerPanel.js +5 -1
  15. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  16. package/lib/components/workflows/ClassQueryBuilder.d.ts.map +1 -1
  17. package/lib/components/workflows/ClassQueryBuilder.js +13 -9
  18. package/lib/components/workflows/ClassQueryBuilder.js.map +1 -1
  19. package/lib/components/workflows/MappingQueryBuilder.d.ts.map +1 -1
  20. package/lib/components/workflows/MappingQueryBuilder.js +13 -11
  21. package/lib/components/workflows/MappingQueryBuilder.js.map +1 -1
  22. package/lib/components/workflows/ServiceQueryBuilder.d.ts.map +1 -1
  23. package/lib/components/workflows/ServiceQueryBuilder.js +3 -2
  24. package/lib/components/workflows/ServiceQueryBuilder.js.map +1 -1
  25. package/lib/index.css +1 -1
  26. package/lib/index.d.ts +1 -0
  27. package/lib/index.d.ts.map +1 -1
  28. package/lib/index.js +1 -0
  29. package/lib/index.js.map +1 -1
  30. package/lib/package.json +1 -1
  31. package/lib/stores/QueryBuilderExecutionContextState.d.ts +34 -0
  32. package/lib/stores/QueryBuilderExecutionContextState.d.ts.map +1 -0
  33. package/lib/stores/QueryBuilderExecutionContextState.js +59 -0
  34. package/lib/stores/QueryBuilderExecutionContextState.js.map +1 -0
  35. package/lib/stores/QueryBuilderInternalizeState.d.ts +24 -0
  36. package/lib/stores/QueryBuilderInternalizeState.d.ts.map +1 -0
  37. package/lib/stores/QueryBuilderInternalizeState.js +26 -0
  38. package/lib/stores/QueryBuilderInternalizeState.js.map +1 -0
  39. package/lib/stores/QueryBuilderResultState.js +5 -5
  40. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  41. package/lib/stores/QueryBuilderState.d.ts +7 -5
  42. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  43. package/lib/stores/QueryBuilderState.js +19 -17
  44. package/lib/stores/QueryBuilderState.js.map +1 -1
  45. package/lib/stores/QueryBuilderStateBuilder.d.ts +1 -1
  46. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  47. package/lib/stores/QueryBuilderStateBuilder.js +27 -2
  48. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  49. package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
  50. package/lib/stores/QueryBuilderValueSpecificationBuilder.js +28 -2
  51. package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
  52. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.d.ts.map +1 -1
  53. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +2 -2
  54. package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
  55. package/lib/stores/entitlements/QueryBuilderCheckEntitlementsState.d.ts.map +1 -1
  56. package/lib/stores/entitlements/QueryBuilderCheckEntitlementsState.js +6 -4
  57. package/lib/stores/entitlements/QueryBuilderCheckEntitlementsState.js.map +1 -1
  58. package/lib/stores/explorer/QueryBuilderExplorerState.js +9 -9
  59. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  60. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.d.ts +2 -1
  61. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.d.ts.map +1 -1
  62. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js +25 -2
  63. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js.map +1 -1
  64. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +1 -1
  65. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  66. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  67. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +3 -1
  68. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  69. package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
  70. package/lib/stores/filter/QueryBuilderFilterState.js +2 -1
  71. package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
  72. package/lib/stores/workflows/ClassQueryBuilderState.d.ts.map +1 -1
  73. package/lib/stores/workflows/ClassQueryBuilderState.js +2 -1
  74. package/lib/stores/workflows/ClassQueryBuilderState.js.map +1 -1
  75. package/lib/stores/workflows/FunctionQueryBuilderState.d.ts +23 -0
  76. package/lib/stores/workflows/FunctionQueryBuilderState.d.ts.map +1 -0
  77. package/lib/stores/workflows/FunctionQueryBuilderState.js +27 -0
  78. package/lib/stores/workflows/FunctionQueryBuilderState.js.map +1 -0
  79. package/lib/stores/workflows/ServiceQueryBuilderState.d.ts.map +1 -1
  80. package/lib/stores/workflows/ServiceQueryBuilderState.js +7 -7
  81. package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
  82. package/package.json +4 -4
  83. package/src/components/QueryBuilder.tsx +5 -1
  84. package/src/components/QueryBuilderSideBar.tsx +211 -7
  85. package/src/components/QueryChat.tsx +2 -1
  86. package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +2 -2
  87. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +5 -1
  88. package/src/components/workflows/ClassQueryBuilder.tsx +17 -9
  89. package/src/components/workflows/MappingQueryBuilder.tsx +15 -11
  90. package/src/components/workflows/ServiceQueryBuilder.tsx +3 -2
  91. package/src/index.ts +1 -0
  92. package/src/stores/QueryBuilderExecutionContextState.ts +69 -0
  93. package/src/stores/QueryBuilderInternalizeState.ts +34 -0
  94. package/src/stores/QueryBuilderResultState.ts +6 -6
  95. package/src/stores/QueryBuilderState.ts +28 -21
  96. package/src/stores/QueryBuilderStateBuilder.ts +79 -1
  97. package/src/stores/QueryBuilderValueSpecificationBuilder.ts +50 -1
  98. package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +4 -2
  99. package/src/stores/entitlements/QueryBuilderCheckEntitlementsState.ts +6 -4
  100. package/src/stores/explorer/QueryBuilderExplorerState.ts +9 -9
  101. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts +64 -2
  102. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +1 -1
  103. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +4 -2
  104. package/src/stores/filter/QueryBuilderFilterState.ts +5 -2
  105. package/src/stores/workflows/ClassQueryBuilderState.ts +2 -1
  106. package/src/stores/workflows/FunctionQueryBuilderState.ts +38 -0
  107. package/src/stores/workflows/ServiceQueryBuilderState.ts +7 -11
  108. package/tsconfig.json +3 -0
@@ -51,6 +51,8 @@ import {
51
51
  type Mapping,
52
52
  type Runtime,
53
53
  type GraphManagerState,
54
+ type ValueSpecification,
55
+ type Type,
54
56
  GRAPH_MANAGER_EVENT,
55
57
  CompilationError,
56
58
  extractSourceInformationCoordinates,
@@ -62,9 +64,7 @@ import {
62
64
  isStubbed_RawLambda,
63
65
  buildLambdaVariableExpressions,
64
66
  buildRawLambdaFromLambdaFunction,
65
- type ValueSpecification,
66
67
  PrimitiveType,
67
- type Type,
68
68
  SimpleFunctionExpression,
69
69
  extractElementNameFromPath,
70
70
  SUPPORTED_FUNCTIONS,
@@ -94,6 +94,11 @@ import { QueryBuilderConstantsState } from './QueryBuilderConstantsState.js';
94
94
  import { QueryBuilderCheckEntitlementsState } from './entitlements/QueryBuilderCheckEntitlementsState.js';
95
95
  import { QueryBuilderTDSState } from './fetch-structure/tds/QueryBuilderTDSState.js';
96
96
  import { QUERY_BUILDER_PURE_PATH } from '../graph/QueryBuilderMetaModelConst.js';
97
+ import type { QueryBuilderInternalizeState } from './QueryBuilderInternalizeState.js';
98
+ import {
99
+ QueryBuilderExternalExecutionContextState,
100
+ type QueryBuilderExecutionContextState,
101
+ } from './QueryBuilderExecutionContextState.js';
97
102
 
98
103
  export abstract class QueryBuilderState implements CommandRegistrar {
99
104
  readonly applicationStore: GenericLegendApplicationStore;
@@ -125,8 +130,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
125
130
  isQueryChatOpened = false;
126
131
 
127
132
  class?: Class | undefined;
128
- mapping?: Mapping | undefined;
129
- runtimeValue?: Runtime | undefined;
133
+ executionContextState: QueryBuilderExecutionContextState;
134
+ internalizeState?: QueryBuilderInternalizeState | undefined;
130
135
 
131
136
  // NOTE: this makes it so that we need to import components in stores code,
132
137
  // we probably want to refactor to an extension mechanism
@@ -154,9 +159,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
154
159
  isCheckingEntitlments: observable,
155
160
  isCalendarEnabled: observable,
156
161
  changeDetectionState: observable,
162
+ executionContextState: observable,
157
163
  class: observable,
158
- mapping: observable,
159
- runtimeValue: observable,
160
164
  isQueryChatOpened: observable,
161
165
 
162
166
  sideBarClassName: computed,
@@ -169,14 +173,13 @@ export abstract class QueryBuilderState implements CommandRegistrar {
169
173
  setIsCalendarEnabled: action,
170
174
  setIsCheckingEntitlments: action,
171
175
  setClass: action,
172
- setMapping: action,
173
- setRuntimeValue: action,
174
176
  setIsQueryChatOpened: action,
175
177
 
176
178
  resetQueryResult: action,
177
179
  resetQueryContent: action,
178
180
  changeClass: action,
179
181
  changeMapping: action,
182
+ setExecutionContextState: action,
180
183
 
181
184
  rebuildWithQuery: action,
182
185
  compileQuery: flow,
@@ -185,7 +188,9 @@ export abstract class QueryBuilderState implements CommandRegistrar {
185
188
 
186
189
  this.applicationStore = applicationStore;
187
190
  this.graphManagerState = graphManagerState;
188
-
191
+ this.executionContextState = new QueryBuilderExternalExecutionContextState(
192
+ this,
193
+ );
189
194
  this.milestoningState = new QueryBuilderMilestoningState(this);
190
195
  this.explorerState = new QueryBuilderExplorerState(this);
191
196
  this.parametersState = new QueryBuilderParametersState(this);
@@ -250,6 +255,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
250
255
  this.isQueryChatOpened = val;
251
256
  }
252
257
 
258
+ setInternalize(val: QueryBuilderInternalizeState | undefined): void {
259
+ this.internalizeState = val;
260
+ }
261
+
253
262
  setShowFunctionsExplorerPanel(val: boolean): void {
254
263
  this.showFunctionsExplorerPanel = val;
255
264
  }
@@ -274,12 +283,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
274
283
  this.class = val;
275
284
  }
276
285
 
277
- setMapping(val: Mapping | undefined): void {
278
- this.mapping = val;
279
- }
280
-
281
- setRuntimeValue(val: Runtime | undefined): void {
282
- this.runtimeValue = val;
286
+ setExecutionContextState(val: QueryBuilderExecutionContextState): void {
287
+ this.executionContextState = val;
283
288
  }
284
289
 
285
290
  get isQuerySupported(): boolean {
@@ -373,12 +378,12 @@ export abstract class QueryBuilderState implements CommandRegistrar {
373
378
  this.resetQueryContent();
374
379
  this.milestoningState.updateMilestoningConfiguration();
375
380
  }
376
- this.setMapping(val);
381
+ this.executionContextState.setMapping(val);
377
382
  }
378
383
 
379
384
  changeRuntime(val: Runtime): void {
380
385
  this.resetQueryResult();
381
- this.setRuntimeValue(val);
386
+ this.executionContextState.setRuntimeValue(val);
382
387
  }
383
388
 
384
389
  getCurrentParameterValues(): Map<string, ValueSpecification> | undefined {
@@ -421,11 +426,11 @@ export abstract class QueryBuilderState implements CommandRegistrar {
421
426
  'Query must be supported to build from function',
422
427
  );
423
428
  const mapping = guaranteeNonNullable(
424
- this.mapping,
429
+ this.executionContextState.mapping,
425
430
  'Mapping required to build from() function',
426
431
  );
427
432
  const runtime = guaranteeNonNullable(
428
- this.runtimeValue,
433
+ this.executionContextState.runtimeValue,
429
434
  'Runtime required to build from query',
430
435
  );
431
436
  const runtimePointer = guaranteeType(
@@ -666,8 +671,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
666
671
  this.graphManagerState,
667
672
  );
668
673
  basicState.class = this.class;
669
- basicState.mapping = this.mapping;
670
- basicState.runtimeValue = this.runtimeValue;
674
+ basicState.executionContextState.mapping =
675
+ this.executionContextState.mapping;
676
+ basicState.executionContextState.runtimeValue =
677
+ this.executionContextState.runtimeValue;
671
678
  return basicState;
672
679
  }
673
680
 
@@ -30,7 +30,7 @@ import {
30
30
  type FunctionExpression,
31
31
  type GraphFetchTreeInstanceValue,
32
32
  type ValueSpecificationVisitor,
33
- type InstanceValue,
33
+ InstanceValue,
34
34
  type INTERNAL__UnknownValueSpecification,
35
35
  type LambdaFunction,
36
36
  type KeyExpressionInstanceValue,
@@ -47,6 +47,11 @@ import {
47
47
  type ValueSpecification,
48
48
  SUPPORTED_FUNCTIONS,
49
49
  isSuperType,
50
+ PackageableElementReference,
51
+ Mapping,
52
+ PackageableRuntime,
53
+ RuntimePointer,
54
+ PackageableElementExplicitReference,
50
55
  } from '@finos/legend-graph';
51
56
  import { processTDSPostFilterExpression } from './fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js';
52
57
  import { processFilterExpression } from './filter/QueryBuilderFilterStateBuilder.js';
@@ -58,6 +63,7 @@ import {
58
63
  processGraphFetchExpression,
59
64
  processGraphFetchExternalizeExpression,
60
65
  processGraphFetchSerializeExpression,
66
+ processInternalizeExpression,
61
67
  } from './fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js';
62
68
  import {
63
69
  processTDSDistinctExpression,
@@ -78,6 +84,7 @@ import { processWatermarkExpression } from './watermark/QueryBuilderWatermarkSta
78
84
  import { QueryBuilderConstantExpressionState } from './QueryBuilderConstantsState.js';
79
85
  import { checkIfEquivalent } from './milestoning/QueryBuilderMilestoningHelper.js';
80
86
  import type { QueryBuilderParameterValue } from './QueryBuilderParametersState.js';
87
+ import { QueryBuilderEmbeddedFromExecutionContextState } from './QueryBuilderExecutionContextState.js';
81
88
 
82
89
  const processGetAllExpression = (
83
90
  expression: SimpleFunctionExpression,
@@ -146,6 +153,51 @@ const processLetExpression = (
146
153
  queryBuilderState.constantState.addConstant(constantExpression);
147
154
  };
148
155
 
156
+ const processFromFunction = (
157
+ expression: SimpleFunctionExpression,
158
+ queryBuilderState: QueryBuilderState,
159
+ ): void => {
160
+ // mapping
161
+ const mappingInstanceExpression = guaranteeType(
162
+ expression.parametersValues[1],
163
+ InstanceValue,
164
+ `Can't process from() expression: only support from() with 1st parameter as instance value`,
165
+ );
166
+ const mapping = guaranteeType(
167
+ guaranteeType(
168
+ mappingInstanceExpression.values[0],
169
+ PackageableElementReference,
170
+ `Can't process from() expression: only support from() with 1st parameter as packagableElement value`,
171
+ ).value,
172
+ Mapping,
173
+ `Can't process from() expression: only support from() with 1st parameter as mapping value`,
174
+ );
175
+ // runtime
176
+ const runtimeInstanceExpression = guaranteeType(
177
+ expression.parametersValues[2],
178
+ InstanceValue,
179
+ `Can't process from() expression: only support from() with 2nd parameter as instance value`,
180
+ );
181
+ const runtimeVal = guaranteeType(
182
+ guaranteeType(
183
+ runtimeInstanceExpression.values[0],
184
+ PackageableElementReference,
185
+ `Can't process from() expression: only support from() with 2nd parameter as packagableElement value`,
186
+ ).value,
187
+ PackageableRuntime,
188
+ `Can't process from() expression: only support from() with 2nd parameter as runtime value`,
189
+ );
190
+ const fromContext = new QueryBuilderEmbeddedFromExecutionContextState(
191
+ queryBuilderState,
192
+ );
193
+ fromContext.setMapping(mapping);
194
+ fromContext.setRuntimeValue(
195
+ new RuntimePointer(PackageableElementExplicitReference.create(runtimeVal)),
196
+ );
197
+ queryBuilderState.setExecutionContextState(fromContext);
198
+ return;
199
+ };
200
+
149
201
  /**
150
202
  * This is the value specification processor (a.k.a state builder) for query builder.
151
203
  *
@@ -321,6 +373,18 @@ export class QueryBuilderValueSpecificationProcessor
321
373
  ) {
322
374
  processGetAllExpression(valueSpecification, this.queryBuilderState);
323
375
  return;
376
+ } else if (
377
+ matchFunctionName(
378
+ functionName,
379
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.INTERNALIZE,
380
+ )
381
+ ) {
382
+ processInternalizeExpression(
383
+ valueSpecification,
384
+ this.queryBuilderState,
385
+ this.parentLambda,
386
+ );
387
+ return;
324
388
  } else if (
325
389
  matchFunctionName(functionName, [
326
390
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.FILTER,
@@ -545,6 +609,20 @@ export class QueryBuilderValueSpecificationProcessor
545
609
  this.parentLambda,
546
610
  );
547
611
  return;
612
+ } else if (matchFunctionName(functionName, [SUPPORTED_FUNCTIONS.FROM])) {
613
+ const parameters = valueSpecification.parametersValues;
614
+ assertTrue(
615
+ parameters.length === 3,
616
+ 'From function expects 2 parameters (mapping and runtime)',
617
+ );
618
+ processFromFunction(valueSpecification, this.queryBuilderState);
619
+ QueryBuilderValueSpecificationProcessor.processChild(
620
+ guaranteeNonNullable(parameters[0]),
621
+ valueSpecification,
622
+ this.parentLambda,
623
+ this.queryBuilderState,
624
+ );
625
+ return;
548
626
  } else if (
549
627
  matchFunctionName(
550
628
  functionName,
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { guaranteeNonNullable } from '@finos/legend-shared';
17
+ import { guaranteeNonNullable, guaranteeType } from '@finos/legend-shared';
18
18
  import {
19
19
  type Class,
20
20
  Multiplicity,
@@ -31,6 +31,7 @@ import {
31
31
  PrimitiveInstanceValue,
32
32
  PrimitiveType,
33
33
  SUPPORTED_FUNCTIONS,
34
+ RuntimePointer,
34
35
  } from '@finos/legend-graph';
35
36
  import type { QueryBuilderState } from './QueryBuilderState.js';
36
37
  import { buildFilterExpression } from './filter/QueryBuilderFilterValueSpecificationBuilder.js';
@@ -40,6 +41,10 @@ import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../graph/QueryBuilderMetaMode
40
41
  import { buildWatermarkExpression } from './watermark/QueryBuilderWatermarkValueSpecificationBuilder.js';
41
42
  import { buildExecutionQueryFromLambdaFunction } from './shared/LambdaParameterState.js';
42
43
  import type { QueryBuilderConstantExpressionState } from './QueryBuilderConstantsState.js';
44
+ import {
45
+ QueryBuilderEmbeddedFromExecutionContextState,
46
+ type QueryBuilderExecutionContextState,
47
+ } from './QueryBuilderExecutionContextState.js';
43
48
 
44
49
  export const buildGetAllFunction = (
45
50
  _class: Class,
@@ -91,6 +96,45 @@ const buildLetExpression = (
91
96
  return letFunc;
92
97
  };
93
98
 
99
+ const buildExecutionContextState = (
100
+ executionState: QueryBuilderExecutionContextState,
101
+ lambdaFunction: LambdaFunction,
102
+ ): LambdaFunction => {
103
+ if (executionState instanceof QueryBuilderEmbeddedFromExecutionContextState) {
104
+ const precedingExpression = guaranteeNonNullable(
105
+ lambdaFunction.expressionSequence[0],
106
+ `Can't build from() expression: preceding expression is not defined`,
107
+ );
108
+ const fromFunc = new SimpleFunctionExpression(
109
+ extractElementNameFromPath(SUPPORTED_FUNCTIONS.FROM),
110
+ );
111
+ // 1st param
112
+ const mapping = guaranteeNonNullable(
113
+ executionState.mapping,
114
+ 'Mapping required for building from() expression',
115
+ );
116
+ const mappingInstance = new InstanceValue(Multiplicity.ONE, undefined);
117
+ mappingInstance.values = [
118
+ PackageableElementExplicitReference.create(mapping),
119
+ ];
120
+ // 2nd parameter
121
+ const runtime = guaranteeType(
122
+ executionState.runtimeValue,
123
+ RuntimePointer,
124
+ 'Runtime Pointer required for building from() expression',
125
+ );
126
+ const runtimeInstance = new InstanceValue(Multiplicity.ONE, undefined);
127
+ runtimeInstance.values = [runtime.packageableRuntime];
128
+ fromFunc.parametersValues = [
129
+ precedingExpression,
130
+ mappingInstance,
131
+ runtimeInstance,
132
+ ];
133
+ lambdaFunction.expressionSequence[0] = fromFunc;
134
+ }
135
+ return lambdaFunction;
136
+ };
137
+
94
138
  const buildFetchStructure = (
95
139
  fetchStructureState: QueryBuilderFetchStructureState,
96
140
  lambdaFunction: LambdaFunction,
@@ -157,6 +201,11 @@ export const buildLambdaFunction = (
157
201
  lambdaFunction,
158
202
  options,
159
203
  );
204
+ // build execution-state
205
+ buildExecutionContextState(
206
+ queryBuilderState.executionContextState,
207
+ lambdaFunction,
208
+ );
160
209
 
161
210
  // build variable expressions
162
211
  if (queryBuilderState.constantState.constants.length) {
@@ -138,9 +138,11 @@ export const TEST__setUpQueryBuilderState = async (
138
138
  if (executionContext) {
139
139
  const graph = queryBuilderState.graphManagerState.graph;
140
140
  queryBuilderState.class = graph.getClass(executionContext._class);
141
- queryBuilderState.mapping = graph.getMapping(executionContext.mapping);
141
+ queryBuilderState.executionContextState.mapping = graph.getMapping(
142
+ executionContext.mapping,
143
+ );
142
144
  if (executionContext.runtime) {
143
- queryBuilderState.runtimeValue = graph.getRuntime(
145
+ queryBuilderState.executionContextState.runtimeValue = graph.getRuntime(
144
146
  executionContext.runtime,
145
147
  );
146
148
  }
@@ -53,16 +53,18 @@ export class QueryBuilderCheckEntitlementsState implements Hashable {
53
53
 
54
54
  this.dataAccessState = undefined;
55
55
  if (
56
- this.queryBuilderState.mapping &&
57
- this.queryBuilderState.runtimeValue instanceof RuntimePointer
56
+ this.queryBuilderState.executionContextState.mapping &&
57
+ this.queryBuilderState.executionContextState.runtimeValue instanceof
58
+ RuntimePointer
58
59
  ) {
59
60
  this.dataAccessState = new DataAccessState(
60
61
  this.queryBuilderState.applicationStore,
61
62
  this.queryBuilderState.graphManagerState,
62
63
  {
63
- mapping: this.queryBuilderState.mapping.path,
64
+ mapping: this.queryBuilderState.executionContextState.mapping.path,
64
65
  runtime:
65
- this.queryBuilderState.runtimeValue.packageableRuntime.value.path,
66
+ this.queryBuilderState.executionContextState.runtimeValue
67
+ .packageableRuntime.value.path,
66
68
  getQuery: async () =>
67
69
  this.createExecutableQuery(
68
70
  this.queryBuilderState.buildQuery(),
@@ -660,7 +660,7 @@ export class QueryBuilderExplorerState {
660
660
 
661
661
  refreshTreeData(): void {
662
662
  const _class = this.queryBuilderState.class;
663
- const _mapping = this.queryBuilderState.mapping;
663
+ const _mapping = this.queryBuilderState.executionContextState.mapping;
664
664
  this.setTreeData(
665
665
  _class && _mapping && this.mappingModelCoverageAnalysisResult
666
666
  ? getQueryBuilderTreeData(
@@ -675,9 +675,9 @@ export class QueryBuilderExplorerState {
675
675
  // We will only refetch if the analysis result's mapping has changed.
676
676
  // This makes the assumption that the mapping has not been edited, which is a valid assumption since query is not for editing mappings
677
677
  if (
678
- this.queryBuilderState.mapping &&
679
- this.queryBuilderState.mapping.path !==
680
- this.mappingModelCoverageAnalysisResult?.mapping.path
678
+ this.queryBuilderState.executionContextState.mapping &&
679
+ this.queryBuilderState.executionContextState.mapping !==
680
+ this.mappingModelCoverageAnalysisResult?.mapping
681
681
  ) {
682
682
  this.mappingModelCoverageAnalysisState.inProgress();
683
683
  QueryBuilderTelemetryHelper.logEvent_QueryMappingModelCoverageAnalysisLaunched(
@@ -692,7 +692,7 @@ export class QueryBuilderExplorerState {
692
692
  try {
693
693
  this.mappingModelCoverageAnalysisResult = (yield flowResult(
694
694
  this.queryBuilderState.graphManagerState.graphManager.analyzeMappingModelCoverage(
695
- this.queryBuilderState.mapping,
695
+ this.queryBuilderState.executionContextState.mapping,
696
696
  this.queryBuilderState.graphManagerState.graph,
697
697
  ),
698
698
  )) as MappingModelCoverageAnalysisResult;
@@ -720,7 +720,7 @@ export class QueryBuilderExplorerState {
720
720
  *previewData(
721
721
  node: QueryBuilderExplorerTreePropertyNodeData,
722
722
  ): GeneratorFn<void> {
723
- const runtime = this.queryBuilderState.runtimeValue;
723
+ const runtime = this.queryBuilderState.executionContextState.runtimeValue;
724
724
  if (!runtime) {
725
725
  this.queryBuilderState.applicationStore.notificationService.notifyWarning(
726
726
  `Can't preview data for property '${node.property.name}': runtime is not specified`,
@@ -730,7 +730,7 @@ export class QueryBuilderExplorerState {
730
730
  if (
731
731
  !node.mappingData.mapped ||
732
732
  !this.queryBuilderState.class ||
733
- !this.queryBuilderState.mapping
733
+ !this.queryBuilderState.executionContextState.mapping
734
734
  ) {
735
735
  return;
736
736
  }
@@ -759,7 +759,7 @@ export class QueryBuilderExplorerState {
759
759
  this.queryBuilderState,
760
760
  propertyExpression,
761
761
  ),
762
- this.queryBuilderState.mapping,
762
+ this.queryBuilderState.executionContextState.mapping,
763
763
  runtime,
764
764
  this.queryBuilderState.graphManagerState.graph,
765
765
  )) as ExecutionResult;
@@ -796,7 +796,7 @@ export class QueryBuilderExplorerState {
796
796
  this.queryBuilderState,
797
797
  propertyExpression,
798
798
  ),
799
- this.queryBuilderState.mapping,
799
+ this.queryBuilderState.executionContextState.mapping,
800
800
  runtime,
801
801
  this.queryBuilderState.graphManagerState.graph,
802
802
  )) as ExecutionResult;
@@ -32,11 +32,13 @@ import {
32
32
  CollectionInstanceValue,
33
33
  getClassProperty,
34
34
  PrimitiveType,
35
+ VariableExpression,
35
36
  } from '@finos/legend-graph';
36
37
  import {
37
38
  assertIsBoolean,
38
39
  assertIsString,
39
40
  assertTrue,
41
+ assertType,
40
42
  guaranteeIsString,
41
43
  guaranteeNonNullable,
42
44
  guaranteeType,
@@ -45,7 +47,7 @@ import {
45
47
  QUERY_BUILDER_PURE_PATH,
46
48
  QUERY_BUILDER_SUPPORTED_FUNCTIONS,
47
49
  } from '../../../graph/QueryBuilderMetaModelConst.js';
48
- import type { QueryBuilderState } from '../../QueryBuilderState.js';
50
+ import { type QueryBuilderState } from '../../QueryBuilderState.js';
49
51
  import { QueryBuilderValueSpecificationProcessor } from '../../QueryBuilderStateBuilder.js';
50
52
  import { FETCH_STRUCTURE_IMPLEMENTATION } from '../QueryBuilderFetchStructureImplementationState.js';
51
53
  import {
@@ -56,6 +58,7 @@ import {
56
58
  } from './QueryBuilderGraphFetchTreeState.js';
57
59
  import { buildGraphFetchTreeData } from './QueryBuilderGraphFetchTreeUtil.js';
58
60
  import {} from 'mobx';
61
+ import { QueryBuilderInternalizeState } from '../../QueryBuilderInternalizeState.js';
59
62
 
60
63
  export const processGraphFetchExpression = (
61
64
  expression: SimpleFunctionExpression,
@@ -105,6 +108,65 @@ export const processGraphFetchExpression = (
105
108
  }
106
109
  };
107
110
 
111
+ export const processInternalizeExpression = (
112
+ expression: SimpleFunctionExpression,
113
+ queryBuilderState: QueryBuilderState,
114
+ parentLambda: LambdaFunction,
115
+ ): void => {
116
+ // update fetch-structure
117
+ queryBuilderState.fetchStructureState.changeImplementation(
118
+ FETCH_STRUCTURE_IMPLEMENTATION.GRAPH_FETCH,
119
+ );
120
+ const functionName = expression.functionName;
121
+ // check parameters
122
+ assertTrue(
123
+ expression.parametersValues.length === 3,
124
+ `Can't process ${functionName}() expression: ${functionName}() expects 2 argument`,
125
+ );
126
+
127
+ // first param classs
128
+ const classVal = expression.parametersValues[0];
129
+ const _class = classVal?.genericType?.value.rawType;
130
+ assertType(
131
+ _class,
132
+ Class,
133
+ `Can't process internalize() expression: internalize() return type is missing`,
134
+ );
135
+
136
+ queryBuilderState.setClass(_class);
137
+ queryBuilderState.milestoningState.clearMilestoningDates();
138
+ queryBuilderState.explorerState.refreshTreeData();
139
+
140
+ // binding
141
+ const instanceExpression = guaranteeType(
142
+ expression.parametersValues[1],
143
+ InstanceValue,
144
+ `Can't process internalize() expression: only support internalize() with 1st parameter as instance value`,
145
+ );
146
+ const binding = guaranteeType(
147
+ guaranteeType(
148
+ instanceExpression.values[0],
149
+ PackageableElementReference,
150
+ `Can't process internalize() expression: only support internalize() with 1st parameter as packagableElement value`,
151
+ ).value,
152
+ Binding,
153
+ `Can't process internalize() expression: only support internalize() with 1st parameter as binding value`,
154
+ );
155
+
156
+ const variableExpression = guaranteeType(
157
+ expression.parametersValues[2],
158
+ VariableExpression,
159
+ );
160
+
161
+ const inernalize = new QueryBuilderInternalizeState(
162
+ binding,
163
+ variableExpression,
164
+ queryBuilderState,
165
+ );
166
+
167
+ queryBuilderState.setInternalize(inernalize);
168
+ };
169
+
108
170
  type PropertyValue = object | string | number | boolean;
109
171
 
110
172
  // Dynamically sets key values of config
@@ -327,6 +389,7 @@ export const processGraphFetchExternalizeExpression = (
327
389
  matchFunctionName(precedingExpression.functionName, [
328
390
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH,
329
391
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH_CHECKED,
392
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.INTERNALIZE,
330
393
  ]),
331
394
  `Can't process externalize() expression: only support externalize() in graph-fetch expression`,
332
395
  );
@@ -373,7 +436,6 @@ export const processGraphFetchExternalizeExpression = (
373
436
  Binding,
374
437
  `Can't process externalize() expression: only support externalize() with 1st parameter as binding value`,
375
438
  );
376
-
377
439
  const externalizeState = new GraphFetchExternalFormatSerializationState(
378
440
  graphFetchTreeState,
379
441
  binding,
@@ -452,7 +452,7 @@ export class QueryBuilderTDSState
452
452
  new QueryBuilderDerivationProjectionColumnState(
453
453
  this,
454
454
  guaranteeType(
455
- this.queryBuilderState.graphManagerState.graphManager.buildRawValueSpecification(
455
+ this.queryBuilderState.graphManagerState.graphManager.transformValueSpecToRawValueSpec(
456
456
  columnColumnLambda,
457
457
  this.queryBuilderState.graphManagerState.graph,
458
458
  ),
@@ -380,10 +380,12 @@ export class PostFilterConditionState implements Hashable {
380
380
  this.value,
381
381
  ),
382
382
  guaranteeNonNullable(
383
- this.postFilterState.tdsState.queryBuilderState.mapping,
383
+ this.postFilterState.tdsState.queryBuilderState
384
+ .executionContextState.mapping,
384
385
  ),
385
386
  guaranteeNonNullable(
386
- this.postFilterState.tdsState.queryBuilderState.runtimeValue,
387
+ this.postFilterState.tdsState.queryBuilderState
388
+ .executionContextState.runtimeValue,
387
389
  ),
388
390
  this.postFilterState.tdsState.queryBuilderState.graphManagerState
389
391
  .graph,
@@ -134,9 +134,12 @@ export class FilterConditionState implements Hashable {
134
134
  this.propertyExpressionState.propertyExpression,
135
135
  this.value,
136
136
  ),
137
- guaranteeNonNullable(this.filterState.queryBuilderState.mapping),
138
137
  guaranteeNonNullable(
139
- this.filterState.queryBuilderState.runtimeValue,
138
+ this.filterState.queryBuilderState.executionContextState.mapping,
139
+ ),
140
+ guaranteeNonNullable(
141
+ this.filterState.queryBuilderState.executionContextState
142
+ .runtimeValue,
140
143
  ),
141
144
  this.filterState.queryBuilderState.graphManagerState.graph,
142
145
  )) as ExecutionResult;
@@ -44,7 +44,8 @@ export class ClassQueryBuilderState extends QueryBuilderState {
44
44
  );
45
45
  // cascading
46
46
  const isCurrentMappingCompatible =
47
- this.mapping && compatibleMappings.includes(this.mapping);
47
+ this.executionContextState.mapping &&
48
+ compatibleMappings.includes(this.executionContextState.mapping);
48
49
  if (this.isMappingReadOnly || isCurrentMappingCompatible) {
49
50
  return;
50
51
  }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import type { GenericLegendApplicationStore } from '@finos/legend-application';
18
+ import type {
19
+ ConcreteFunctionDefinition,
20
+ GraphManagerState,
21
+ } from '@finos/legend-graph';
22
+ import { ClassQueryBuilderState } from './ClassQueryBuilderState.js';
23
+
24
+ // Note: We may want to move it to extend QueryBuilderState directly
25
+ // but for now we will use the same setup as class as class, mapping, runtime are editable
26
+ export class FunctionQueryBuilderState extends ClassQueryBuilderState {
27
+ readonly functionElement: ConcreteFunctionDefinition;
28
+
29
+ constructor(
30
+ applicationStore: GenericLegendApplicationStore,
31
+ graphManagerState: GraphManagerState,
32
+ functionElemenet: ConcreteFunctionDefinition,
33
+ ) {
34
+ super(applicationStore, graphManagerState);
35
+ this.functionElement = functionElemenet;
36
+ this.showParametersPanel = true;
37
+ }
38
+ }