@finos/legend-application-query 5.0.1 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/lib/application/LegendQueryApplicationConfig.d.ts +17 -1
  2. package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendQueryApplicationConfig.js +23 -1
  4. package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
  5. package/lib/components/QueryBuilder.d.ts.map +1 -1
  6. package/lib/components/QueryBuilder.js +3 -1
  7. package/lib/components/QueryBuilder.js.map +1 -1
  8. package/lib/components/QueryBuilderExplorerPanel.d.ts.map +1 -1
  9. package/lib/components/QueryBuilderExplorerPanel.js +10 -35
  10. package/lib/components/QueryBuilderExplorerPanel.js.map +1 -1
  11. package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  12. package/lib/components/QueryBuilderFetchStructurePanel.js +78 -35
  13. package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
  14. package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
  15. package/lib/components/QueryBuilderFilterPanel.js +80 -66
  16. package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
  17. package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  18. package/lib/components/QueryBuilderFunctionsExplorerPanel.js +9 -39
  19. package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  20. package/lib/components/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderGraphFetchTreePanel.js +5 -5
  22. package/lib/components/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  23. package/lib/components/QueryBuilderLambdaEditor.d.ts +1 -0
  24. package/lib/components/QueryBuilderLambdaEditor.d.ts.map +1 -1
  25. package/lib/components/QueryBuilderLambdaEditor.js +2 -2
  26. package/lib/components/QueryBuilderLambdaEditor.js.map +1 -1
  27. package/lib/components/QueryBuilderMilestoneEditor.js +5 -5
  28. package/lib/components/QueryBuilderMilestoneEditor.js.map +1 -1
  29. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts +20 -0
  30. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts.map +1 -0
  31. package/lib/components/QueryBuilderPanelIssueCountBadge.js +28 -0
  32. package/lib/components/QueryBuilderPanelIssueCountBadge.js.map +1 -0
  33. package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
  34. package/lib/components/QueryBuilderParameterPanel.js +13 -33
  35. package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
  36. package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  37. package/lib/components/QueryBuilderPostFilterPanel.js +59 -62
  38. package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
  39. package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
  40. package/lib/components/QueryBuilderProjectionPanel.js +47 -63
  41. package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
  42. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  43. package/lib/components/QueryBuilderPropertyExpressionEditor.js +11 -11
  44. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  45. package/lib/components/QueryBuilderPropertySearchPanel.js +5 -7
  46. package/lib/components/QueryBuilderPropertySearchPanel.js.map +1 -1
  47. package/lib/components/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  48. package/lib/components/QueryBuilderResultModifierPanel.js +3 -1
  49. package/lib/components/QueryBuilderResultModifierPanel.js.map +1 -1
  50. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  51. package/lib/components/QueryBuilderResultPanel.js +37 -23
  52. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  53. package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
  54. package/lib/components/QueryBuilderSetupPanel.js +10 -9
  55. package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
  56. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  57. package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -2
  58. package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
  59. package/lib/components/QueryEditor.d.ts.map +1 -1
  60. package/lib/components/QueryEditor.js +16 -4
  61. package/lib/components/QueryEditor.js.map +1 -1
  62. package/lib/index.css +2 -2
  63. package/lib/index.css.map +1 -1
  64. package/lib/package.json +10 -9
  65. package/lib/stores/QueryBuilderExplorerState.d.ts +1 -1
  66. package/lib/stores/QueryBuilderExplorerState.d.ts.map +1 -1
  67. package/lib/stores/QueryBuilderExplorerState.js +18 -3
  68. package/lib/stores/QueryBuilderExplorerState.js.map +1 -1
  69. package/lib/stores/QueryBuilderFetchStructureState.d.ts +8 -1
  70. package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
  71. package/lib/stores/QueryBuilderFetchStructureState.js +10 -2
  72. package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
  73. package/lib/stores/QueryBuilderFilterState.d.ts +10 -5
  74. package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
  75. package/lib/stores/QueryBuilderFilterState.js +34 -8
  76. package/lib/stores/QueryBuilderFilterState.js.map +1 -1
  77. package/lib/stores/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  78. package/lib/stores/QueryBuilderGraphFetchTreeState.js +6 -3
  79. package/lib/stores/QueryBuilderGraphFetchTreeState.js.map +1 -1
  80. package/lib/stores/QueryBuilderLambdaProcessor.d.ts.map +1 -1
  81. package/lib/stores/QueryBuilderLambdaProcessor.js +2 -0
  82. package/lib/stores/QueryBuilderLambdaProcessor.js.map +1 -1
  83. package/lib/stores/QueryBuilderOperatorLoader.d.ts +47 -0
  84. package/lib/stores/QueryBuilderOperatorLoader.d.ts.map +1 -0
  85. package/lib/stores/QueryBuilderOperatorLoader.js +94 -0
  86. package/lib/stores/QueryBuilderOperatorLoader.js.map +1 -0
  87. package/lib/stores/QueryBuilderOperatorsHelper.d.ts +1 -0
  88. package/lib/stores/QueryBuilderOperatorsHelper.d.ts.map +1 -1
  89. package/lib/stores/QueryBuilderOperatorsHelper.js +28 -1
  90. package/lib/stores/QueryBuilderOperatorsHelper.js.map +1 -1
  91. package/lib/stores/QueryBuilderPostFilterState.d.ts +9 -6
  92. package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
  93. package/lib/stores/QueryBuilderPostFilterState.js +31 -7
  94. package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
  95. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts +4 -3
  96. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  97. package/lib/stores/QueryBuilderPreviewDataHelper.js +77 -97
  98. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  99. package/lib/stores/QueryBuilderProjectionState.d.ts +4 -7
  100. package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
  101. package/lib/stores/QueryBuilderProjectionState.js +23 -39
  102. package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
  103. package/lib/stores/QueryBuilderPropertySearchPanelState.js +1 -1
  104. package/lib/stores/QueryBuilderPropertySearchPanelState.js.map +1 -1
  105. package/lib/stores/QueryBuilderResultState.d.ts +5 -2
  106. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  107. package/lib/stores/QueryBuilderResultState.js +19 -7
  108. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  109. package/lib/stores/QueryBuilderSetupState.js +1 -1
  110. package/lib/stores/QueryBuilderSetupState.js.map +1 -1
  111. package/lib/stores/QueryBuilderState.d.ts +7 -0
  112. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  113. package/lib/stores/QueryBuilderState.js +18 -58
  114. package/lib/stores/QueryBuilderState.js.map +1 -1
  115. package/lib/stores/QueryBuilderTestUtils.d.ts +24 -0
  116. package/lib/stores/QueryBuilderTestUtils.d.ts.map +1 -0
  117. package/lib/stores/QueryBuilderTestUtils.js +49 -0
  118. package/lib/stores/QueryBuilderTestUtils.js.map +1 -0
  119. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts +24 -0
  120. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -0
  121. package/lib/stores/QueryBuilderTypeaheadHelper.js +89 -0
  122. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -0
  123. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  124. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +7 -7
  125. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
  126. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  127. package/lib/stores/QueryEditorStore.js +14 -3
  128. package/lib/stores/QueryEditorStore.js.map +1 -1
  129. package/lib/stores/QueryFunctionsExplorerState.d.ts +2 -6
  130. package/lib/stores/QueryFunctionsExplorerState.d.ts.map +1 -1
  131. package/lib/stores/QueryFunctionsExplorerState.js +2 -11
  132. package/lib/stores/QueryFunctionsExplorerState.js.map +1 -1
  133. package/lib/stores/QueryParametersState.d.ts +1 -3
  134. package/lib/stores/QueryParametersState.d.ts.map +1 -1
  135. package/lib/stores/QueryParametersState.js +1 -4
  136. package/lib/stores/QueryParametersState.js.map +1 -1
  137. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  138. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js +9 -32
  139. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  140. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  141. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js +9 -32
  142. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  143. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  144. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js +9 -32
  145. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  146. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  147. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js +9 -33
  148. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  149. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  150. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js +9 -32
  151. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  152. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
  153. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js +7 -30
  154. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
  155. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
  156. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js +8 -31
  157. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
  158. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
  159. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js +8 -31
  160. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
  161. package/package.json +17 -16
  162. package/src/application/LegendQueryApplicationConfig.ts +35 -1
  163. package/src/components/QueryBuilder.tsx +13 -2
  164. package/src/components/QueryBuilderExplorerPanel.tsx +20 -57
  165. package/src/components/QueryBuilderFetchStructurePanel.tsx +94 -41
  166. package/src/components/QueryBuilderFilterPanel.tsx +271 -232
  167. package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +24 -68
  168. package/src/components/QueryBuilderGraphFetchTreePanel.tsx +34 -25
  169. package/src/components/QueryBuilderLambdaEditor.tsx +3 -0
  170. package/src/components/QueryBuilderMilestoneEditor.tsx +34 -34
  171. package/src/components/QueryBuilderPanelIssueCountBadge.tsx +38 -0
  172. package/src/components/QueryBuilderParameterPanel.tsx +23 -55
  173. package/src/components/QueryBuilderPostFilterPanel.tsx +245 -233
  174. package/src/components/QueryBuilderProjectionPanel.tsx +127 -154
  175. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +61 -57
  176. package/src/components/QueryBuilderPropertySearchPanel.tsx +9 -9
  177. package/src/components/QueryBuilderResultModifierPanel.tsx +4 -2
  178. package/src/components/QueryBuilderResultPanel.tsx +139 -91
  179. package/src/components/QueryBuilderSetupPanel.tsx +13 -12
  180. package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
  181. package/src/components/QueryEditor.tsx +39 -1
  182. package/src/stores/QueryBuilderExplorerState.ts +22 -3
  183. package/src/stores/QueryBuilderFetchStructureState.ts +18 -2
  184. package/src/stores/QueryBuilderFilterState.ts +52 -7
  185. package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
  186. package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
  187. package/src/stores/QueryBuilderOperatorLoader.ts +133 -0
  188. package/src/stores/QueryBuilderOperatorsHelper.ts +35 -0
  189. package/src/stores/QueryBuilderPostFilterState.ts +47 -8
  190. package/src/stores/QueryBuilderPreviewDataHelper.ts +122 -217
  191. package/src/stores/QueryBuilderProjectionState.ts +40 -53
  192. package/src/stores/QueryBuilderPropertySearchPanelState.ts +1 -1
  193. package/src/stores/QueryBuilderResultState.ts +27 -9
  194. package/src/stores/QueryBuilderSetupState.ts +1 -1
  195. package/src/stores/QueryBuilderState.ts +35 -94
  196. package/src/stores/QueryBuilderTestUtils.ts +93 -0
  197. package/src/stores/QueryBuilderTypeaheadHelper.ts +149 -0
  198. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
  199. package/src/stores/QueryEditorStore.ts +19 -3
  200. package/src/stores/QueryFunctionsExplorerState.ts +1 -11
  201. package/src/stores/QueryParametersState.ts +1 -3
  202. package/src/stores/filterOperators/QueryBuilderFilterOperator_Equal.ts +14 -36
  203. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.ts +17 -36
  204. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.ts +17 -36
  205. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThan.ts +17 -37
  206. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.ts +17 -36
  207. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.ts +14 -34
  208. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.ts +19 -37
  209. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.ts +19 -37
  210. package/tsconfig.json +4 -0
@@ -18,6 +18,7 @@ import { action, makeAutoObservable } from 'mobx';
18
18
  import type { QueryBuilderState } from './QueryBuilderState.js';
19
19
  import { QueryBuilderGraphFetchTreeState } from './QueryBuilderGraphFetchTreeState.js';
20
20
  import { QueryBuilderProjectionState } from './QueryBuilderProjectionState.js';
21
+ import type { QueryBuilderAggregateOperator } from './QueryBuilderAggregationState.js';
21
22
 
22
23
  export enum FETCH_STRUCTURE_MODE {
23
24
  PROJECTION = 'PROJECTION',
@@ -26,11 +27,19 @@ export enum FETCH_STRUCTURE_MODE {
26
27
 
27
28
  export class QueryBuilderFetchStructureState {
28
29
  queryBuilderState: QueryBuilderState;
30
+ /**
31
+ * TODO?: perhaps it would eventually make sense to default to
32
+ * graph-fetch since `getAll()` naturally works for graph-fetch case
33
+ * and graph-fetch allows somewhat an empty tree
34
+ */
29
35
  fetchStructureMode = FETCH_STRUCTURE_MODE.PROJECTION;
30
36
  projectionState: QueryBuilderProjectionState;
31
37
  graphFetchTreeState: QueryBuilderGraphFetchTreeState;
32
38
 
33
- constructor(queryBuilderState: QueryBuilderState) {
39
+ constructor(
40
+ queryBuilderState: QueryBuilderState,
41
+ operators: QueryBuilderAggregateOperator[],
42
+ ) {
34
43
  makeAutoObservable(this, {
35
44
  queryBuilderState: false,
36
45
  setFetchStructureMode: action,
@@ -39,7 +48,10 @@ export class QueryBuilderFetchStructureState {
39
48
  this.queryBuilderState = queryBuilderState;
40
49
  // TODO: we probably should modularize this a bit better
41
50
  // See https://github.com/finos/legend-studio/issues/731
42
- this.projectionState = new QueryBuilderProjectionState(queryBuilderState);
51
+ this.projectionState = new QueryBuilderProjectionState(
52
+ queryBuilderState,
53
+ operators,
54
+ );
43
55
  this.graphFetchTreeState = new QueryBuilderGraphFetchTreeState(
44
56
  queryBuilderState,
45
57
  );
@@ -56,4 +68,8 @@ export class QueryBuilderFetchStructureState {
56
68
  isProjectionMode(): boolean {
57
69
  return this.fetchStructureMode === FETCH_STRUCTURE_MODE.PROJECTION;
58
70
  }
71
+
72
+ get validationIssues(): string[] | undefined {
73
+ return this.projectionState.validationIssues;
74
+ }
59
75
  }
@@ -20,9 +20,11 @@ import {
20
20
  makeAutoObservable,
21
21
  makeObservable,
22
22
  observable,
23
+ flow,
23
24
  } from 'mobx';
24
25
  import type { TreeNodeData, TreeData } from '@finos/legend-art';
25
26
  import {
27
+ type GeneratorFn,
26
28
  assertTrue,
27
29
  getNullableFirstElement,
28
30
  guaranteeNonNullable,
@@ -34,11 +36,13 @@ import {
34
36
  deleteEntry,
35
37
  assertErrorThrown,
36
38
  filterByType,
39
+ ActionState,
37
40
  } from '@finos/legend-shared';
38
41
  import type { QueryBuilderExplorerTreeDragSource } from './QueryBuilderExplorerState.js';
39
42
  import { QueryBuilderPropertyExpressionState } from './QueryBuilderPropertyEditorState.js';
40
43
  import type { QueryBuilderState } from './QueryBuilderState.js';
41
44
  import {
45
+ type ExecutionResult,
42
46
  type AbstractPropertyExpression,
43
47
  type ValueSpecification,
44
48
  extractElementNameFromPath,
@@ -55,6 +59,12 @@ import {
55
59
  fromGroupOperation,
56
60
  QUERY_BUILDER_GROUP_OPERATION,
57
61
  } from './QueryBuilderOperatorsHelper.js';
62
+ import type { QueryBuilderProjectionColumnDragSource } from './QueryBuilderProjectionState.js';
63
+ import {
64
+ buildPropertyTypeAheadQuery,
65
+ buildTypeAheadOptions,
66
+ performTypeAhead,
67
+ } from './QueryBuilderTypeaheadHelper.js';
58
68
 
59
69
  export abstract class QueryBuilderFilterOperator {
60
70
  readonly uuid = uuid();
@@ -95,6 +105,7 @@ export interface QueryBuilderFilterConditionDragSource {
95
105
 
96
106
  export type QueryBuilderFilterDropTarget =
97
107
  | QueryBuilderExplorerTreeDragSource
108
+ | QueryBuilderProjectionColumnDragSource
98
109
  | QueryBuilderFilterConditionDragSource;
99
110
  export type QueryBuilderFilterConditionRearrangeDropTarget =
100
111
  QueryBuilderFilterConditionDragSource;
@@ -105,6 +116,8 @@ export class FilterConditionState {
105
116
  operator!: QueryBuilderFilterOperator;
106
117
  value?: ValueSpecification | undefined;
107
118
  existsLambdaParamNames: string[] = [];
119
+ typeaheadSearchResults: string[] | undefined;
120
+ typeaheadSearchState = ActionState.create();
108
121
 
109
122
  constructor(
110
123
  filterState: QueryBuilderFilterState,
@@ -117,7 +130,10 @@ export class FilterConditionState {
117
130
  changeOperator: action,
118
131
  setOperator: action,
119
132
  setValue: action,
133
+ typeaheadSearchResults: observable,
134
+ typeaheadSearchState: observable,
120
135
  addExistsLambdaParamNames: action,
136
+ handleTypeaheadSearch: flow,
121
137
  });
122
138
 
123
139
  this.filterState = filterState;
@@ -141,6 +157,35 @@ export class FilterConditionState {
141
157
  );
142
158
  }
143
159
 
160
+ *handleTypeaheadSearch(): GeneratorFn<void> {
161
+ try {
162
+ this.typeaheadSearchState.inProgress();
163
+ this.typeaheadSearchResults = undefined;
164
+ if (performTypeAhead(this.value)) {
165
+ const builderState = buildPropertyTypeAheadQuery(
166
+ this.filterState.queryBuilderState,
167
+ this.propertyExpressionState.propertyExpression,
168
+ this.value,
169
+ );
170
+ const result =
171
+ (yield builderState.graphManagerState.graphManager.executeMapping(
172
+ builderState.resultState.buildExecutionRawLambda(),
173
+ guaranteeNonNullable(builderState.querySetupState.mapping),
174
+ guaranteeNonNullable(builderState.querySetupState.runtimeValue),
175
+ builderState.graphManagerState.graph,
176
+ )) as ExecutionResult;
177
+ this.typeaheadSearchResults = buildTypeAheadOptions(result);
178
+ }
179
+ this.typeaheadSearchState.pass();
180
+ } catch (error) {
181
+ assertErrorThrown(error);
182
+ this.typeaheadSearchResults = [];
183
+ this.typeaheadSearchState.fail();
184
+ } finally {
185
+ this.typeaheadSearchState.complete();
186
+ }
187
+ }
188
+
144
189
  changeProperty(propertyExpression: AbstractPropertyExpression): void {
145
190
  try {
146
191
  // first, check if the new property is supported
@@ -219,7 +264,7 @@ export abstract class QueryBuilderFilterTreeNodeData implements TreeNodeData {
219
264
  });
220
265
  }
221
266
 
222
- abstract get dragLayerLabel(): string;
267
+ abstract get dragPreviewLabel(): string;
223
268
  setIsOpen(val: boolean): void {
224
269
  this.isOpen = val;
225
270
  }
@@ -244,14 +289,14 @@ export class QueryBuilderFilterTreeGroupNodeData extends QueryBuilderFilterTreeN
244
289
  setGroupOperation: action,
245
290
  addChildNode: action,
246
291
  removeChildNode: action,
247
- dragLayerLabel: computed,
292
+ dragPreviewLabel: computed,
248
293
  });
249
294
 
250
295
  this.groupOperation = groupOperation;
251
296
  this.isOpen = true;
252
297
  }
253
298
 
254
- get dragLayerLabel(): string {
299
+ get dragPreviewLabel(): string {
255
300
  return `${this.groupOperation.toUpperCase()} group`;
256
301
  }
257
302
 
@@ -283,13 +328,13 @@ export class QueryBuilderFilterTreeConditionNodeData extends QueryBuilderFilterT
283
328
 
284
329
  makeObservable(this, {
285
330
  condition: observable,
286
- dragLayerLabel: computed,
331
+ dragPreviewLabel: computed,
287
332
  });
288
333
 
289
334
  this.condition = condition;
290
335
  }
291
336
 
292
- get dragLayerLabel(): string {
337
+ get dragPreviewLabel(): string {
293
338
  return this.condition.propertyExpressionState.title;
294
339
  }
295
340
  }
@@ -299,11 +344,11 @@ export class QueryBuilderFilterTreeBlankConditionNodeData extends QueryBuilderFi
299
344
  super(parentId);
300
345
 
301
346
  makeObservable(this, {
302
- dragLayerLabel: computed,
347
+ dragPreviewLabel: computed,
303
348
  });
304
349
  }
305
350
 
306
- get dragLayerLabel(): string {
351
+ get dragPreviewLabel(): string {
307
352
  return '<blank>';
308
353
  }
309
354
  }
@@ -26,6 +26,7 @@ import {
26
26
  buildGraphFetchTreeData,
27
27
  } from './QueryBuilderGraphFetchTreeUtil.js';
28
28
  import type { QueryBuilderExplorerTreePropertyNodeData } from './QueryBuilderExplorerState.js';
29
+ import { assertNonNullable } from '@finos/legend-shared';
29
30
 
30
31
  export class QueryBuilderGraphFetchTreeState {
31
32
  queryBuilderState: QueryBuilderState;
@@ -77,14 +78,19 @@ export class QueryBuilderGraphFetchTreeState {
77
78
  }
78
79
 
79
80
  addProperty(node: QueryBuilderExplorerTreePropertyNodeData): void {
80
- if (this.treeData) {
81
- addQueryBuilderPropertyNode(
82
- this.treeData,
83
- this.queryBuilderState.explorerState.nonNullableTreeData,
84
- node,
85
- this.queryBuilderState,
86
- );
87
- this.setGraphFetchTree({ ...this.treeData });
81
+ if (!this.treeData) {
82
+ this.initialize();
88
83
  }
84
+ assertNonNullable(
85
+ this.treeData,
86
+ `Graph-fetch tree has not been properly initialized`,
87
+ );
88
+ addQueryBuilderPropertyNode(
89
+ this.treeData,
90
+ this.queryBuilderState.explorerState.nonNullableTreeData,
91
+ node,
92
+ this.queryBuilderState,
93
+ );
94
+ this.setGraphFetchTree({ ...this.treeData });
89
95
  }
90
96
  }
@@ -693,6 +693,10 @@ export class QueryBuilderLambdaProcessor
693
693
  (e, idx) => e.setColumnName(aliases[idx] as string),
694
694
  );
695
695
 
696
+ this.queryBuilderState.fetchStructureState.setFetchStructureMode(
697
+ FETCH_STRUCTURE_MODE.PROJECTION,
698
+ );
699
+
696
700
  return;
697
701
  } else if (
698
702
  matchFunctionName(
@@ -943,6 +947,10 @@ export class QueryBuilderLambdaProcessor
943
947
  (e, idx) => e.setColumnName(aliases[idx] as string),
944
948
  );
945
949
 
950
+ this.queryBuilderState.fetchStructureState.setFetchStructureMode(
951
+ FETCH_STRUCTURE_MODE.PROJECTION,
952
+ );
953
+
946
954
  return;
947
955
  } else if (
948
956
  matchFunctionName(functionName, QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_AGG)
@@ -0,0 +1,133 @@
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 { QueryBuilderAggregateOperator_Count } from './aggregateOperators/QueryBuilderAggregateOperator_Count.js';
18
+ import { QueryBuilderAggregateOperator_Distinct } from './aggregateOperators/QueryBuilderAggregateOperator_Distinct.js';
19
+ import { QueryBuilderAggregateOperator_Sum } from './aggregateOperators/QueryBuilderAggregateOperator_Sum.js';
20
+ import { QueryBuilderAggregateOperator_Average } from './aggregateOperators/QueryBuilderAggregateOperator_Average.js';
21
+ import { QueryBuilderAggregateOperator_StdDev_Population } from './aggregateOperators/QueryBuilderAggregateOperator_StdDev_Population.js';
22
+ import { QueryBuilderAggregateOperator_StdDev_Sample } from './aggregateOperators/QueryBuilderAggregateOperator_StdDev_Sample.js';
23
+ import { QueryBuilderAggregateOperator_DistinctCount } from './aggregateOperators/QueryBuilderAggregateOperator_DistinctCount.js';
24
+ import { QueryBuilderAggregateOperator_Min } from './aggregateOperators/QueryBuilderAggregateOperator_Min.js';
25
+ import { QueryBuilderAggregateOperator_Max } from './aggregateOperators/QueryBuilderAggregateOperator_Max.js';
26
+ import { QueryBuilderAggregateOperator_JoinString } from './aggregateOperators/QueryBuilderAggregateOperator_JoinString.js';
27
+ import {
28
+ QueryBuilderFilterOperator_Equal,
29
+ QueryBuilderFilterOperator_NotEqual,
30
+ } from './filterOperators/QueryBuilderFilterOperator_Equal.js';
31
+ import { QueryBuilderFilterOperator_GreaterThan } from './filterOperators/QueryBuilderFilterOperator_GreaterThan.js';
32
+ import {
33
+ QueryBuilderFilterOperator_NotStartWith,
34
+ QueryBuilderFilterOperator_StartWith,
35
+ } from './filterOperators/QueryBuilderFilterOperator_StartWith.js';
36
+ import { QueryBuilderFilterOperator_GreaterThanEqual } from './filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js';
37
+ import { QueryBuilderFilterOperator_LessThanEqual } from './filterOperators/QueryBuilderFilterOperator_LessThanEqual.js';
38
+ import { QueryBuilderFilterOperator_LessThan } from './filterOperators/QueryBuilderFilterOperator_LessThan.js';
39
+ import {
40
+ QueryBuilderFilterOperator_EndWith,
41
+ QueryBuilderFilterOperator_NotEndWith,
42
+ } from './filterOperators/QueryBuilderFilterOperator_EndWith.js';
43
+ import {
44
+ QueryBuilderFilterOperator_Contain,
45
+ QueryBuilderFilterOperator_NotContain,
46
+ } from './filterOperators/QueryBuilderFilterOperator_Contain.js';
47
+ import {
48
+ QueryBuilderFilterOperator_IsEmpty,
49
+ QueryBuilderFilterOperator_IsNotEmpty,
50
+ } from './filterOperators/QueryBuilderFilterOperator_IsEmpty.js';
51
+ import {
52
+ QueryBuilderFilterOperator_In,
53
+ QueryBuilderFilterOperator_NotIn,
54
+ } from './filterOperators/QueryBuilderFilterOperator_In.js';
55
+ import {
56
+ QueryBuilderPostFilterOperator_In,
57
+ QueryBuilderPostFilterOperator_NotIn,
58
+ } from './postFilterOperators/QueryBuilderPostFilterOperator_In.js';
59
+ import {
60
+ QueryBuilderPostFilterOperator_IsEmpty,
61
+ QueryBuilderPostFilterOperator_IsNotEmpty,
62
+ } from './postFilterOperators/QueryBuilderPostFilterOperator_IsEmpty.js';
63
+ import {
64
+ QueryBuilderPostFilterOperator_Equal,
65
+ QueryBuilderPostFilterOperator_NotEqual,
66
+ } from './postFilterOperators/QueryBuilderPostFilterOperator_Equal.js';
67
+ import { QueryBuilderPostFilterOperator_LessThan } from './postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js';
68
+ import { QueryBuilderPostFilterOperator_LessThanEqual } from './postFilterOperators/QueryBuilderPostFilterOperator_LessThanEqual.js';
69
+ import { QueryBuilderPostFilterOperator_GreaterThan } from './postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js';
70
+ import { QueryBuilderPostFilterOperator_GreaterThanEqual } from './postFilterOperators/QueryBuilderPostFilterOperator_GreaterThanEqual.js';
71
+ import {
72
+ QueryBuilderPostFilterOperator_NotStartWith,
73
+ QueryBuilderPostFilterOperator_StartWith,
74
+ } from './postFilterOperators/QueryBuilderPostFilterOperator_StartWith.js';
75
+ import {
76
+ QueryBuilderPostFilterOperator_Contain,
77
+ QueryBuilderPostFilterOperator_NotContain,
78
+ } from './postFilterOperators/QueryBuilderPostFilterOperator_Contain.js';
79
+ import {
80
+ QueryBuilderPostFilterOperator_EndWith,
81
+ QueryBuilderPostFilterOperator_NotEndWith,
82
+ } from './postFilterOperators/QueryBuilderPostFilterOperator_EndWith.js';
83
+
84
+ export const AGGREGATION_OPERATORS = [
85
+ new QueryBuilderAggregateOperator_Count(),
86
+ new QueryBuilderAggregateOperator_DistinctCount(),
87
+ new QueryBuilderAggregateOperator_Distinct(),
88
+ new QueryBuilderAggregateOperator_Sum(),
89
+ new QueryBuilderAggregateOperator_Average(),
90
+ new QueryBuilderAggregateOperator_Min(),
91
+ new QueryBuilderAggregateOperator_Max(),
92
+ new QueryBuilderAggregateOperator_StdDev_Population(),
93
+ new QueryBuilderAggregateOperator_StdDev_Sample(),
94
+ new QueryBuilderAggregateOperator_JoinString(),
95
+ ];
96
+
97
+ export const FILTER_OPERATORS = [
98
+ new QueryBuilderFilterOperator_Equal(),
99
+ new QueryBuilderFilterOperator_NotEqual(),
100
+ new QueryBuilderFilterOperator_LessThan(),
101
+ new QueryBuilderFilterOperator_LessThanEqual(),
102
+ new QueryBuilderFilterOperator_GreaterThan(),
103
+ new QueryBuilderFilterOperator_GreaterThanEqual(),
104
+ new QueryBuilderFilterOperator_StartWith(),
105
+ new QueryBuilderFilterOperator_NotStartWith(),
106
+ new QueryBuilderFilterOperator_Contain(),
107
+ new QueryBuilderFilterOperator_NotContain(),
108
+ new QueryBuilderFilterOperator_EndWith(),
109
+ new QueryBuilderFilterOperator_NotEndWith(),
110
+ new QueryBuilderFilterOperator_In(),
111
+ new QueryBuilderFilterOperator_NotIn(),
112
+ new QueryBuilderFilterOperator_IsEmpty(),
113
+ new QueryBuilderFilterOperator_IsNotEmpty(),
114
+ ];
115
+
116
+ export const POST_FILTER_OPERATORS = [
117
+ new QueryBuilderPostFilterOperator_Equal(),
118
+ new QueryBuilderPostFilterOperator_NotEqual(),
119
+ new QueryBuilderPostFilterOperator_LessThan(),
120
+ new QueryBuilderPostFilterOperator_LessThanEqual(),
121
+ new QueryBuilderPostFilterOperator_GreaterThan(),
122
+ new QueryBuilderPostFilterOperator_GreaterThanEqual(),
123
+ new QueryBuilderPostFilterOperator_StartWith(),
124
+ new QueryBuilderPostFilterOperator_NotStartWith(),
125
+ new QueryBuilderPostFilterOperator_Contain(),
126
+ new QueryBuilderPostFilterOperator_NotContain(),
127
+ new QueryBuilderPostFilterOperator_EndWith(),
128
+ new QueryBuilderPostFilterOperator_NotEndWith(),
129
+ new QueryBuilderPostFilterOperator_In(),
130
+ new QueryBuilderPostFilterOperator_NotIn(),
131
+ new QueryBuilderPostFilterOperator_IsEmpty(),
132
+ new QueryBuilderPostFilterOperator_IsNotEmpty(),
133
+ ];
@@ -29,6 +29,7 @@ import {
29
29
  EnumValueInstanceValue,
30
30
  VariableExpression,
31
31
  AbstractPropertyExpression,
32
+ isSuperType,
32
33
  } from '@finos/legend-graph';
33
34
  import {
34
35
  addUniqueEntry,
@@ -189,3 +190,37 @@ export const isPropertyExpressionChainOptional = (
189
190
  }
190
191
  return isOptional;
191
192
  };
193
+
194
+ export const isTypeCompatibleWithConditionValueType = (
195
+ type: Type | undefined,
196
+ conditionValueType: Type,
197
+ ): boolean => {
198
+ const NUMERIC_PRIMITIVE_TYPES = [
199
+ PRIMITIVE_TYPE.NUMBER,
200
+ PRIMITIVE_TYPE.INTEGER,
201
+ PRIMITIVE_TYPE.DECIMAL,
202
+ PRIMITIVE_TYPE.FLOAT,
203
+ ] as string[];
204
+ const DATE_PRIMITIVE_TYPES = [
205
+ PRIMITIVE_TYPE.DATE,
206
+ PRIMITIVE_TYPE.DATETIME,
207
+ PRIMITIVE_TYPE.STRICTDATE,
208
+ PRIMITIVE_TYPE.LATESTDATE,
209
+ ] as string[];
210
+
211
+ // When changing the return type for LHS, the RHS value should be adjusted accordingly.
212
+ return (
213
+ type !== undefined &&
214
+ // Numeric value is handled loosely because of autoboxing
215
+ // e.g. LHS (integer) = RHS (float) is acceptable
216
+ ((NUMERIC_PRIMITIVE_TYPES.includes(type.path) &&
217
+ NUMERIC_PRIMITIVE_TYPES.includes(conditionValueType.path)) ||
218
+ // Date value is handled loosely as well if the LHS is of type DateTime
219
+ // This is because we would simulate auto-boxing for date by altering the
220
+ // Pure function used for the operation
221
+ // e.g. LHS(DateTime) = RHS(Date) -> we use isOnDay() instead of is()
222
+ DATE_PRIMITIVE_TYPES.includes(type.path) ||
223
+ type === conditionValueType ||
224
+ isSuperType(conditionValueType, type))
225
+ );
226
+ };
@@ -19,6 +19,7 @@ import {
19
19
  type PureModel,
20
20
  type Type,
21
21
  type ValueSpecification,
22
+ type ExecutionResult,
22
23
  Enumeration,
23
24
  PRIMITIVE_TYPE,
24
25
  observe_ValueSpecification,
@@ -36,6 +37,7 @@ import {
36
37
  UnsupportedOperationError,
37
38
  uuid,
38
39
  filterByType,
40
+ ActionState,
39
41
  } from '@finos/legend-shared';
40
42
  import {
41
43
  action,
@@ -51,11 +53,16 @@ import type { QueryBuilderAggregateColumnState } from './QueryBuilderAggregation
51
53
  import { QUERY_BUILDER_GROUP_OPERATION } from './QueryBuilderOperatorsHelper.js';
52
54
  import type { QueryBuilderPostFilterOperator } from './QueryBuilderPostFilterOperator.js';
53
55
  import {
54
- type QueryBuilderProjectionColumnDragSource,
55
56
  type QueryBuilderProjectionColumnState,
57
+ type QueryBuilderProjectionColumnDragSource,
56
58
  QueryBuilderDerivationProjectionColumnState,
57
59
  } from './QueryBuilderProjectionState.js';
58
60
  import type { QueryBuilderState } from './QueryBuilderState.js';
61
+ import {
62
+ buildProjectionColumnTypeAheadQuery,
63
+ buildTypeAheadOptions,
64
+ performTypeAhead,
65
+ } from './QueryBuilderTypeaheadHelper.js';
59
66
 
60
67
  export enum QUERY_BUILDER_POST_FILTER_DND_TYPE {
61
68
  GROUP_CONDITION = 'GROUP_CONDITION',
@@ -158,7 +165,7 @@ export abstract class QueryBuilderPostFilterTreeNodeData
158
165
  });
159
166
  }
160
167
 
161
- abstract get dragLayerLabel(): string;
168
+ abstract get dragPreviewLabel(): string;
162
169
  setIsOpen(val: boolean): void {
163
170
  this.isOpen = val;
164
171
  }
@@ -190,13 +197,13 @@ export class QueryBuilderPostFilterTreeGroupNodeData extends QueryBuilderPostFil
190
197
  setGroupOperation: action,
191
198
  addChildNode: action,
192
199
  removeChildNode: action,
193
- dragLayerLabel: computed,
200
+ dragPreviewLabel: computed,
194
201
  });
195
202
  this.groupOperation = groupOperation;
196
203
  this.isOpen = true;
197
204
  }
198
205
 
199
- get dragLayerLabel(): string {
206
+ get dragPreviewLabel(): string {
200
207
  return `${this.groupOperation.toUpperCase()} group`;
201
208
  }
202
209
 
@@ -231,13 +238,13 @@ export class QueryBuilderPostFilterTreeConditionNodeData extends QueryBuilderPos
231
238
 
232
239
  makeObservable(this, {
233
240
  condition: observable,
234
- dragLayerLabel: computed,
241
+ dragPreviewLabel: computed,
235
242
  });
236
243
 
237
244
  this.condition = condition;
238
245
  }
239
246
 
240
- get dragLayerLabel(): string {
247
+ get dragPreviewLabel(): string {
241
248
  return this.condition.columnName;
242
249
  }
243
250
  }
@@ -247,11 +254,11 @@ export class QueryBuilderPostFilterTreeBlankConditionNodeData extends QueryBuild
247
254
  super(parentId);
248
255
 
249
256
  makeObservable(this, {
250
- dragLayerLabel: computed,
257
+ dragPreviewLabel: computed,
251
258
  });
252
259
  }
253
260
 
254
- get dragLayerLabel(): string {
261
+ get dragPreviewLabel(): string {
255
262
  return '<blank>';
256
263
  }
257
264
  }
@@ -262,6 +269,8 @@ export class PostFilterConditionState {
262
269
  | QueryBuilderAggregateColumnState;
263
270
  value?: ValueSpecification | undefined;
264
271
  operator: QueryBuilderPostFilterOperator;
272
+ typeaheadSearchResults: string[] | undefined;
273
+ typeaheadSearchState = ActionState.create();
265
274
 
266
275
  constructor(
267
276
  postFilterState: QueryBuilderPostFilterState,
@@ -273,11 +282,13 @@ export class PostFilterConditionState {
273
282
  ) {
274
283
  makeAutoObservable(this, {
275
284
  columnState: observable,
285
+ typeaheadSearchResults: observable,
276
286
  changeOperator: action,
277
287
  setColumnState: action,
278
288
  setValue: action,
279
289
  setOperator: action,
280
290
  changeColumn: flow,
291
+ handleTypeaheadSearch: flow,
281
292
  });
282
293
 
283
294
  this.postFilterState = postFilterState;
@@ -304,6 +315,34 @@ export class PostFilterConditionState {
304
315
  );
305
316
  }
306
317
 
318
+ *handleTypeaheadSearch(): GeneratorFn<void> {
319
+ try {
320
+ this.typeaheadSearchState.inProgress();
321
+ this.typeaheadSearchResults = undefined;
322
+ if (performTypeAhead(this.value)) {
323
+ const builderState = buildProjectionColumnTypeAheadQuery(
324
+ this.postFilterState.queryBuilderState,
325
+ this.columnState,
326
+ this.value,
327
+ );
328
+ const result =
329
+ (yield builderState.graphManagerState.graphManager.executeMapping(
330
+ builderState.resultState.buildExecutionRawLambda(),
331
+ guaranteeNonNullable(builderState.querySetupState.mapping),
332
+ guaranteeNonNullable(builderState.querySetupState.runtimeValue),
333
+ builderState.graphManagerState.graph,
334
+ )) as ExecutionResult;
335
+ this.typeaheadSearchResults = buildTypeAheadOptions(result);
336
+ }
337
+ this.typeaheadSearchState.pass();
338
+ } catch (error) {
339
+ assertErrorThrown(error);
340
+ this.typeaheadSearchState.fail();
341
+ } finally {
342
+ this.typeaheadSearchState.complete();
343
+ }
344
+ }
345
+
307
346
  changeOperator(val: QueryBuilderPostFilterOperator): void {
308
347
  this.setOperator(val);
309
348
  if (!this.operator.isCompatibleWithConditionValue(this)) {