@finos/legend-application-query 5.0.2 → 5.1.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 (81) hide show
  1. package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  2. package/lib/components/QueryBuilderFetchStructurePanel.js +1 -1
  3. package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
  4. package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
  5. package/lib/components/QueryBuilderFilterPanel.js +17 -4
  6. package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
  7. package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  8. package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  9. package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
  10. package/lib/components/QueryBuilderParameterPanel.js +3 -2
  11. package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
  12. package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  13. package/lib/components/QueryBuilderPostFilterPanel.js +17 -4
  14. package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
  15. package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
  16. package/lib/components/QueryBuilderProjectionPanel.js +6 -2
  17. package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
  18. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  19. package/lib/components/QueryBuilderResultPanel.js +3 -1
  20. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  21. package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
  22. package/lib/components/QueryBuilderSetupPanel.js +5 -3
  23. package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
  24. package/lib/index.css +2 -2
  25. package/lib/index.css.map +1 -1
  26. package/lib/package.json +1 -1
  27. package/lib/stores/QueryBuilderFetchStructureState.d.ts +2 -1
  28. package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
  29. package/lib/stores/QueryBuilderFetchStructureState.js +2 -2
  30. package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
  31. package/lib/stores/QueryBuilderFilterState.d.ts +4 -0
  32. package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
  33. package/lib/stores/QueryBuilderFilterState.js +28 -2
  34. package/lib/stores/QueryBuilderFilterState.js.map +1 -1
  35. package/lib/stores/QueryBuilderOperatorLoader.d.ts +47 -0
  36. package/lib/stores/QueryBuilderOperatorLoader.d.ts.map +1 -0
  37. package/lib/stores/QueryBuilderOperatorLoader.js +94 -0
  38. package/lib/stores/QueryBuilderOperatorLoader.js.map +1 -0
  39. package/lib/stores/QueryBuilderPostFilterState.d.ts +5 -2
  40. package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
  41. package/lib/stores/QueryBuilderPostFilterState.js +25 -1
  42. package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
  43. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts +4 -3
  44. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  45. package/lib/stores/QueryBuilderPreviewDataHelper.js +77 -97
  46. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  47. package/lib/stores/QueryBuilderProjectionState.d.ts +3 -2
  48. package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
  49. package/lib/stores/QueryBuilderProjectionState.js +17 -32
  50. package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
  51. package/lib/stores/QueryBuilderState.d.ts +1 -0
  52. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  53. package/lib/stores/QueryBuilderState.js +8 -58
  54. package/lib/stores/QueryBuilderState.js.map +1 -1
  55. package/lib/stores/QueryBuilderTestUtils.d.ts +24 -0
  56. package/lib/stores/QueryBuilderTestUtils.d.ts.map +1 -0
  57. package/lib/stores/QueryBuilderTestUtils.js +49 -0
  58. package/lib/stores/QueryBuilderTestUtils.js.map +1 -0
  59. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts +24 -0
  60. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -0
  61. package/lib/stores/QueryBuilderTypeaheadHelper.js +89 -0
  62. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -0
  63. package/package.json +8 -8
  64. package/src/components/QueryBuilderFetchStructurePanel.tsx +4 -1
  65. package/src/components/QueryBuilderFilterPanel.tsx +31 -4
  66. package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +1 -0
  67. package/src/components/QueryBuilderParameterPanel.tsx +3 -2
  68. package/src/components/QueryBuilderPostFilterPanel.tsx +31 -4
  69. package/src/components/QueryBuilderProjectionPanel.tsx +19 -2
  70. package/src/components/QueryBuilderResultPanel.tsx +6 -0
  71. package/src/components/QueryBuilderSetupPanel.tsx +5 -3
  72. package/src/stores/QueryBuilderFetchStructureState.ts +9 -2
  73. package/src/stores/QueryBuilderFilterState.ts +43 -0
  74. package/src/stores/QueryBuilderOperatorLoader.ts +133 -0
  75. package/src/stores/QueryBuilderPostFilterState.ts +40 -1
  76. package/src/stores/QueryBuilderPreviewDataHelper.ts +122 -217
  77. package/src/stores/QueryBuilderProjectionState.ts +29 -46
  78. package/src/stores/QueryBuilderState.ts +23 -94
  79. package/src/stores/QueryBuilderTestUtils.ts +93 -0
  80. package/src/stores/QueryBuilderTypeaheadHelper.ts +149 -0
  81. package/tsconfig.json +3 -0
@@ -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,
@@ -56,6 +60,11 @@ import {
56
60
  QUERY_BUILDER_GROUP_OPERATION,
57
61
  } from './QueryBuilderOperatorsHelper.js';
58
62
  import type { QueryBuilderProjectionColumnDragSource } from './QueryBuilderProjectionState.js';
63
+ import {
64
+ buildPropertyTypeAheadQuery,
65
+ buildTypeAheadOptions,
66
+ performTypeAhead,
67
+ } from './QueryBuilderTypeaheadHelper.js';
59
68
 
60
69
  export abstract class QueryBuilderFilterOperator {
61
70
  readonly uuid = uuid();
@@ -107,6 +116,8 @@ export class FilterConditionState {
107
116
  operator!: QueryBuilderFilterOperator;
108
117
  value?: ValueSpecification | undefined;
109
118
  existsLambdaParamNames: string[] = [];
119
+ typeaheadSearchResults: string[] | undefined;
120
+ typeaheadSearchState = ActionState.create();
110
121
 
111
122
  constructor(
112
123
  filterState: QueryBuilderFilterState,
@@ -119,7 +130,10 @@ export class FilterConditionState {
119
130
  changeOperator: action,
120
131
  setOperator: action,
121
132
  setValue: action,
133
+ typeaheadSearchResults: observable,
134
+ typeaheadSearchState: observable,
122
135
  addExistsLambdaParamNames: action,
136
+ handleTypeaheadSearch: flow,
123
137
  });
124
138
 
125
139
  this.filterState = filterState;
@@ -143,6 +157,35 @@ export class FilterConditionState {
143
157
  );
144
158
  }
145
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
+
146
189
  changeProperty(propertyExpression: AbstractPropertyExpression): void {
147
190
  try {
148
191
  // first, check if the new property is supported
@@ -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
+ ];
@@ -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',
@@ -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)) {