@finos/legend-data-cube 0.0.38 → 0.0.39

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 (152) hide show
  1. package/lib/index.css +1 -1
  2. package/lib/package.json +3 -3
  3. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts +2 -1
  4. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  5. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js +25 -7
  6. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  7. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.d.ts +8 -1
  8. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.d.ts.map +1 -1
  9. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js +228 -3
  10. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js.map +1 -1
  11. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.d.ts +2 -2
  12. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.d.ts.map +1 -1
  13. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.js +8 -3
  14. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.js.map +1 -1
  15. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.d.ts +2 -2
  16. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.d.ts.map +1 -1
  17. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.js +8 -3
  18. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.js.map +1 -1
  19. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.d.ts +2 -2
  20. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.d.ts.map +1 -1
  21. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.js +8 -3
  22. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.js.map +1 -1
  23. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.d.ts +2 -2
  24. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.d.ts.map +1 -1
  25. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.js +8 -3
  26. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.js.map +1 -1
  27. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.d.ts +3 -2
  28. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.d.ts.map +1 -1
  29. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.js +79 -70
  30. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.js.map +1 -1
  31. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.d.ts +2 -2
  32. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.d.ts.map +1 -1
  33. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.js +8 -3
  34. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.js.map +1 -1
  35. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.d.ts +2 -2
  36. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.d.ts.map +1 -1
  37. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.js +11 -3
  38. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.js.map +1 -1
  39. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.d.ts +2 -2
  40. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.d.ts.map +1 -1
  41. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.js +11 -3
  42. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.js.map +1 -1
  43. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.d.ts +2 -2
  44. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.d.ts.map +1 -1
  45. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.js +8 -3
  46. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.js.map +1 -1
  47. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.d.ts +2 -2
  48. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.d.ts.map +1 -1
  49. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.js +11 -3
  50. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.js.map +1 -1
  51. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.d.ts +2 -2
  52. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.d.ts.map +1 -1
  53. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.js +8 -3
  54. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.js.map +1 -1
  55. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.d.ts +2 -2
  56. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.d.ts.map +1 -1
  57. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.js +11 -3
  58. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.js.map +1 -1
  59. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.d.ts +2 -2
  60. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.d.ts.map +1 -1
  61. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.js +4 -3
  62. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.js.map +1 -1
  63. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.d.ts +2 -2
  64. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.d.ts.map +1 -1
  65. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.js +4 -3
  66. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.js.map +1 -1
  67. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.d.ts +2 -2
  68. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.d.ts.map +1 -1
  69. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.js +8 -3
  70. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.js.map +1 -1
  71. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.d.ts +2 -2
  72. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.d.ts.map +1 -1
  73. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.js +11 -3
  74. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.js.map +1 -1
  75. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.d.ts +2 -2
  76. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.d.ts.map +1 -1
  77. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.js +8 -3
  78. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.js.map +1 -1
  79. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.d.ts +2 -2
  80. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.d.ts.map +1 -1
  81. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.js +11 -3
  82. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.js.map +1 -1
  83. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.d.ts +2 -2
  84. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.d.ts.map +1 -1
  85. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.js +8 -3
  86. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.js.map +1 -1
  87. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.d.ts +2 -2
  88. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.d.ts.map +1 -1
  89. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.js +8 -3
  90. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.js.map +1 -1
  91. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.d.ts +2 -2
  92. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.d.ts.map +1 -1
  93. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.js +8 -3
  94. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.js.map +1 -1
  95. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.d.ts +2 -2
  96. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.d.ts.map +1 -1
  97. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.js +8 -3
  98. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.js.map +1 -1
  99. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.d.ts +2 -2
  100. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.d.ts.map +1 -1
  101. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.js +11 -3
  102. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.js.map +1 -1
  103. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.d.ts +2 -2
  104. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.d.ts.map +1 -1
  105. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.js +11 -3
  106. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.js.map +1 -1
  107. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.d.ts +2 -2
  108. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.d.ts.map +1 -1
  109. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.js +8 -3
  110. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.js.map +1 -1
  111. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.d.ts +2 -2
  112. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.d.ts.map +1 -1
  113. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.js +8 -3
  114. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.js.map +1 -1
  115. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.d.ts +2 -2
  116. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.d.ts.map +1 -1
  117. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.js +8 -3
  118. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.js.map +1 -1
  119. package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
  120. package/lib/stores/view/DataCubeViewState.js +1 -1
  121. package/lib/stores/view/DataCubeViewState.js.map +1 -1
  122. package/package.json +7 -7
  123. package/src/stores/core/DataCubeQuerySnapshotBuilder.ts +38 -5
  124. package/src/stores/core/DataCubeQuerySnapshotBuilderUtils.ts +316 -3
  125. package/src/stores/core/filter/DataCubeQueryFilterOperation__Contain.tsx +18 -4
  126. package/src/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.tsx +18 -4
  127. package/src/stores/core/filter/DataCubeQueryFilterOperation__EndWith.tsx +18 -4
  128. package/src/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.tsx +18 -4
  129. package/src/stores/core/filter/DataCubeQueryFilterOperation__Equal.tsx +91 -72
  130. package/src/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.tsx +18 -4
  131. package/src/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.tsx +18 -4
  132. package/src/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.tsx +18 -4
  133. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.tsx +18 -4
  134. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.tsx +18 -4
  135. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.tsx +18 -4
  136. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.tsx +18 -4
  137. package/src/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.tsx +11 -4
  138. package/src/stores/core/filter/DataCubeQueryFilterOperation__IsNull.tsx +11 -4
  139. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThan.tsx +18 -3
  140. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.tsx +18 -4
  141. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.tsx +18 -4
  142. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.tsx +18 -4
  143. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotContain.tsx +18 -4
  144. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.tsx +18 -4
  145. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.tsx +18 -4
  146. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.tsx +18 -4
  147. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.tsx +18 -4
  148. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.tsx +18 -4
  149. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.tsx +18 -4
  150. package/src/stores/core/filter/DataCubeQueryFilterOperation__StartWith.tsx +18 -4
  151. package/src/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.tsx +18 -4
  152. package/src/stores/view/DataCubeViewState.ts +1 -0
@@ -13,15 +13,26 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
-
17
16
  import {
17
+ PRIMITIVE_TYPE,
18
18
  V1_AppliedFunction,
19
+ V1_AppliedProperty,
20
+ V1_CBoolean,
21
+ V1_CDateTime,
22
+ V1_CDecimal,
23
+ V1_CFloat,
24
+ V1_CInteger,
25
+ V1_CStrictDate,
26
+ V1_CStrictTime,
27
+ V1_CString,
19
28
  V1_ClassInstance,
20
29
  V1_ColSpec,
21
30
  V1_ColSpecArray,
31
+ V1_Lambda,
32
+ type V1_ValueSpecification,
33
+ type V1_PrimitiveValueSpecification,
22
34
  extractElementNameFromPath as _name,
23
35
  matchFunctionName,
24
- type V1_ValueSpecification,
25
36
  } from '@finos/legend-graph';
26
37
  import { type DataCubeColumn } from './model/DataCubeColumn.js';
27
38
  import {
@@ -29,9 +40,22 @@ import {
29
40
  assertType,
30
41
  guaranteeNonNullable,
31
42
  guaranteeType,
43
+ UnsupportedOperationError,
32
44
  type Clazz,
33
45
  } from '@finos/legend-shared';
34
- import { TREE_COLUMN_VALUE_SEPARATOR } from './DataCubeQueryEngine.js';
46
+ import {
47
+ DataCubeFunction,
48
+ DataCubeQueryFilterGroupOperator,
49
+ DataCubeQueryFilterOperator,
50
+ TREE_COLUMN_VALUE_SEPARATOR,
51
+ type DataCubeOperationValue,
52
+ } from './DataCubeQueryEngine.js';
53
+ import type {
54
+ DataCubeQuerySnapshotFilter,
55
+ DataCubeQuerySnapshotFilterCondition,
56
+ } from './DataCubeQuerySnapshot.js';
57
+ import { _functionName } from './DataCubeQueryBuilderUtils.js';
58
+ import type { DataCubeQueryFilterOperation } from './filter/DataCubeQueryFilterOperation.js';
35
59
 
36
60
  // --------------------------------- UTILITIES ---------------------------------
37
61
 
@@ -59,6 +83,14 @@ export function _colSpecParam(func: V1_AppliedFunction, paramIdx: number) {
59
83
  );
60
84
  }
61
85
 
86
+ export function _lambdaParam(func: V1_AppliedFunction, paramIdx: number) {
87
+ return guaranteeType(
88
+ _param(func, paramIdx, V1_Lambda),
89
+ V1_Lambda,
90
+ `Can't process ${_name(func.function)}: Expected parameter at index ${paramIdx} to be a lambda expression`,
91
+ );
92
+ }
93
+
62
94
  export function _colSpecArrayParam(func: V1_AppliedFunction, paramIdx: number) {
63
95
  return guaranteeType(
64
96
  _param(func, paramIdx, V1_ClassInstance).value,
@@ -121,3 +153,284 @@ export function _pruneExpandedPaths(
121
153
  )
122
154
  .sort();
123
155
  }
156
+
157
+ export function _buildFilterSnapshot(
158
+ vs: V1_ValueSpecification,
159
+ filterOperations: DataCubeQueryFilterOperation[],
160
+ ): DataCubeQuerySnapshotFilter {
161
+ const filterSnapshot = {} as DataCubeQuerySnapshotFilter;
162
+ const filterConditionSnapshot = [];
163
+
164
+ if (vs instanceof V1_AppliedFunction) {
165
+ switch (vs.function) {
166
+ case DataCubeQueryFilterGroupOperator.OR:
167
+ case DataCubeQueryFilterGroupOperator.AND:
168
+ filterSnapshot.groupOperator = vs.function;
169
+ break;
170
+ default:
171
+ filterSnapshot.groupOperator = DataCubeQueryFilterGroupOperator.AND;
172
+ }
173
+
174
+ if (
175
+ vs.function === DataCubeQueryFilterGroupOperator.AND ||
176
+ vs.function === DataCubeQueryFilterGroupOperator.OR
177
+ ) {
178
+ vs.parameters.forEach((param) => {
179
+ filterConditionSnapshot.push(_buildSubFilter(param, filterOperations)!);
180
+ });
181
+ } else {
182
+ filterConditionSnapshot.push(_buildSubFilter(vs, filterOperations)!);
183
+ }
184
+ }
185
+ filterSnapshot.conditions = filterConditionSnapshot;
186
+ return filterSnapshot;
187
+ }
188
+
189
+ function _buildSubFilter(
190
+ vs: V1_ValueSpecification,
191
+ filterOperations: DataCubeQueryFilterOperation[],
192
+ ):
193
+ | DataCubeQuerySnapshotFilterCondition
194
+ | DataCubeQuerySnapshotFilter
195
+ | undefined {
196
+ if (vs instanceof V1_AppliedFunction) {
197
+ if (
198
+ Object.values(DataCubeFunction)
199
+ .map((op) => _functionName(op))
200
+ .includes(vs.function) &&
201
+ vs.function !== _functionName(DataCubeFunction.NOT)
202
+ ) {
203
+ const condition = _buildFilterConditionSnapshot(vs)!;
204
+ return _buildDataCubeQueryFilter(
205
+ condition[0],
206
+ condition[1],
207
+ filterOperations,
208
+ );
209
+ } else if (vs.function === _functionName(DataCubeFunction.NOT)) {
210
+ const notCondition = _buildNotFilterConditionSnapshot(
211
+ vs.parameters[0] as V1_AppliedFunction,
212
+ );
213
+ if (notCondition) {
214
+ return _buildDataCubeQueryFilter(
215
+ notCondition[0],
216
+ notCondition[1],
217
+ filterOperations,
218
+ );
219
+ } else {
220
+ const filterSnapshot = _buildFilterSnapshot(
221
+ vs.parameters[0] as V1_ValueSpecification,
222
+ filterOperations,
223
+ );
224
+ filterSnapshot.not = true;
225
+ return filterSnapshot;
226
+ }
227
+ } else if (vs.parameters[0] instanceof V1_AppliedFunction) {
228
+ return _buildFilterSnapshot(vs, filterOperations);
229
+ }
230
+ }
231
+ return undefined;
232
+ }
233
+
234
+ function _buildFilterConditionSnapshot(
235
+ af: V1_AppliedFunction,
236
+ ): [V1_AppliedFunction, string] | undefined {
237
+ if (af.parameters[1] && af.parameters[1] instanceof V1_AppliedProperty) {
238
+ switch (af.function) {
239
+ case _functionName(DataCubeFunction.EQUAL):
240
+ return [af, DataCubeQueryFilterOperator.EQUAL_COLUMN];
241
+ case _functionName(DataCubeFunction.GREATER_THAN):
242
+ return [af, DataCubeQueryFilterOperator.GREATER_THAN_COLUMN];
243
+ case _functionName(DataCubeFunction.GREATER_THAN_OR_EQUAL):
244
+ return [af, DataCubeQueryFilterOperator.GREATER_THAN_OR_EQUAL_COLUMN];
245
+ case _functionName(DataCubeFunction.LESS_THAN):
246
+ return [af, DataCubeQueryFilterOperator.GREATER_THAN_OR_EQUAL_COLUMN];
247
+ case _functionName(DataCubeFunction.LESS_THAN):
248
+ return [af, DataCubeQueryFilterOperator.LESS_THAN_COLUMN];
249
+ case _functionName(DataCubeFunction.LESS_THAN_OR_EQUAL):
250
+ return [af, DataCubeQueryFilterOperator.LESS_THAN_OR_EQUAL_COLUMN];
251
+ default:
252
+ return undefined;
253
+ }
254
+ } else if (
255
+ af.parameters[0] instanceof V1_AppliedFunction &&
256
+ af.parameters[0].function === _functionName(DataCubeFunction.TO_LOWERCASE)
257
+ ) {
258
+ return _buildCaseInsensitiveFilterConditionSnapshot(af);
259
+ } else {
260
+ switch (af.function) {
261
+ case _functionName(DataCubeFunction.CONTAINS):
262
+ return [af, DataCubeQueryFilterOperator.CONTAIN];
263
+ case _functionName(DataCubeFunction.ENDS_WITH):
264
+ return [af, DataCubeQueryFilterOperator.END_WITH];
265
+ case _functionName(DataCubeFunction.EQUAL):
266
+ return [af, DataCubeQueryFilterOperator.EQUAL];
267
+ case _functionName(DataCubeFunction.GREATER_THAN):
268
+ return [af, DataCubeQueryFilterOperator.GREATER_THAN];
269
+ case _functionName(DataCubeFunction.GREATER_THAN_OR_EQUAL):
270
+ return [af, DataCubeQueryFilterOperator.GREATER_THAN_OR_EQUAL];
271
+ case _functionName(DataCubeFunction.IS_EMPTY):
272
+ return [af, DataCubeQueryFilterOperator.IS_NULL];
273
+ case _functionName(DataCubeFunction.LESS_THAN):
274
+ return [af, DataCubeQueryFilterOperator.LESS_THAN];
275
+ case _functionName(DataCubeFunction.LESS_THAN_OR_EQUAL):
276
+ return [af, DataCubeQueryFilterOperator.LESS_THAN_OR_EQUAL];
277
+ case _functionName(DataCubeFunction.STARTS_WITH):
278
+ return [af, DataCubeQueryFilterOperator.START_WITH];
279
+ default:
280
+ return undefined;
281
+ }
282
+ }
283
+ }
284
+
285
+ function _buildCaseInsensitiveFilterConditionSnapshot(
286
+ af: V1_AppliedFunction,
287
+ ): [V1_AppliedFunction, string] | undefined {
288
+ const func = af;
289
+ if (
290
+ af.parameters[0] instanceof V1_AppliedFunction &&
291
+ af.parameters[1] instanceof V1_AppliedFunction
292
+ ) {
293
+ func.parameters = [
294
+ af.parameters[0].parameters[0]!,
295
+ af.parameters[1].parameters[0]!,
296
+ ];
297
+ }
298
+ if (func.parameters[1] && func.parameters[1] instanceof V1_AppliedProperty) {
299
+ switch (af.function) {
300
+ case _functionName(DataCubeFunction.EQUAL):
301
+ return [
302
+ func,
303
+ DataCubeQueryFilterOperator.EQUAL_CASE_INSENSITIVE_COLUMN,
304
+ ];
305
+ default:
306
+ return undefined;
307
+ }
308
+ } else {
309
+ switch (af.function) {
310
+ case _functionName(DataCubeFunction.CONTAINS):
311
+ return [func, DataCubeQueryFilterOperator.CONTAIN_CASE_INSENSITIVE];
312
+ case _functionName(DataCubeFunction.ENDS_WITH):
313
+ return [func, DataCubeQueryFilterOperator.END_WITH_CASE_INSENSITIVE];
314
+ case _functionName(DataCubeFunction.EQUAL):
315
+ return [func, DataCubeQueryFilterOperator.EQUAL_CASE_INSENSITIVE];
316
+ case _functionName(DataCubeFunction.STARTS_WITH):
317
+ return [func, DataCubeQueryFilterOperator.START_WITH_CASE_INSENSITIVE];
318
+ default:
319
+ return undefined;
320
+ }
321
+ }
322
+ }
323
+
324
+ function _buildNotFilterConditionSnapshot(
325
+ af: V1_AppliedFunction,
326
+ ): [V1_AppliedFunction, string] | undefined {
327
+ if (af.parameters[1] && af.parameters[1] instanceof V1_AppliedProperty) {
328
+ switch (af.function) {
329
+ case _functionName(DataCubeFunction.EQUAL):
330
+ return [af, DataCubeQueryFilterOperator.NOT_EQUAL_COLUMN];
331
+ default:
332
+ return undefined;
333
+ }
334
+ } else if (
335
+ af.parameters[0] instanceof V1_AppliedFunction &&
336
+ af.parameters[0].function === _functionName(DataCubeFunction.TO_LOWERCASE)
337
+ ) {
338
+ if (af.function === _functionName(DataCubeFunction.EQUAL)) {
339
+ const func = af;
340
+ if (
341
+ af.parameters[0] instanceof V1_AppliedFunction &&
342
+ af.parameters[1] instanceof V1_AppliedFunction
343
+ ) {
344
+ func.parameters = [
345
+ af.parameters[0].parameters[0]!,
346
+ af.parameters[1].parameters[0]!,
347
+ ];
348
+ }
349
+ if (
350
+ func.parameters[1] &&
351
+ func.parameters[1] instanceof V1_AppliedProperty
352
+ ) {
353
+ return [
354
+ func,
355
+ DataCubeQueryFilterOperator.NOT_EQUAL_CASE_INSENSITIVE_COLUMN,
356
+ ];
357
+ }
358
+ return [func, DataCubeQueryFilterOperator.NOT_EQUAL_CASE_INSENSITIVE];
359
+ }
360
+ } else {
361
+ switch (af.function) {
362
+ case _functionName(DataCubeFunction.CONTAINS):
363
+ return [af, DataCubeQueryFilterOperator.NOT_CONTAIN];
364
+ case _functionName(DataCubeFunction.ENDS_WITH):
365
+ return [af, DataCubeQueryFilterOperator.NOT_END_WITH];
366
+ case _functionName(DataCubeFunction.EQUAL):
367
+ return [af, DataCubeQueryFilterOperator.NOT_EQUAL];
368
+ case _functionName(DataCubeFunction.IS_EMPTY):
369
+ return [af, DataCubeQueryFilterOperator.IS_NOT_NULL];
370
+ case _functionName(DataCubeFunction.STARTS_WITH):
371
+ return [af, DataCubeQueryFilterOperator.NOT_START_WITH];
372
+ default:
373
+ return undefined;
374
+ }
375
+ }
376
+ return undefined;
377
+ }
378
+
379
+ export function _dataCubeOperationValue(
380
+ vs: V1_PrimitiveValueSpecification,
381
+ ): DataCubeOperationValue {
382
+ switch (true) {
383
+ case vs instanceof V1_CString:
384
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.STRING, vs.value);
385
+ case vs instanceof V1_CBoolean:
386
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.BOOLEAN, vs.value);
387
+ case vs instanceof V1_CDecimal:
388
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.DECIMAL, vs.value);
389
+ case vs instanceof V1_CInteger:
390
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.INTEGER, vs.value);
391
+ case vs instanceof V1_CFloat:
392
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.FLOAT, vs.value);
393
+ case vs instanceof V1_CStrictDate:
394
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.STRICTDATE, vs.value);
395
+ case vs instanceof V1_CDateTime:
396
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.DATETIME, vs.value);
397
+ case vs instanceof V1_CStrictTime:
398
+ return _buildDataCubeOperationValue(PRIMITIVE_TYPE.STRICTTIME, vs.value);
399
+ default:
400
+ throw new UnsupportedOperationError(
401
+ `Unsupported primitive value '${vs}'`,
402
+ );
403
+ }
404
+ }
405
+
406
+ function _buildDataCubeQueryFilter(
407
+ af: V1_AppliedFunction,
408
+ operator: string,
409
+ filterOperations: DataCubeQueryFilterOperation[],
410
+ ): DataCubeQuerySnapshotFilterCondition | undefined {
411
+ const filterOperation = filterOperations.find(
412
+ (op) => op.operator === operator,
413
+ );
414
+ return filterOperation?.buildConditionSnapshot(af);
415
+ }
416
+
417
+ function _buildDataCubeOperationValue(
418
+ type: string,
419
+ value: unknown,
420
+ ): DataCubeOperationValue {
421
+ return {
422
+ value: value,
423
+ type: type,
424
+ } satisfies DataCubeOperationValue;
425
+ }
426
+
427
+ export function _buildConditionSnapshotProperty(
428
+ property: V1_AppliedProperty,
429
+ operator: DataCubeQueryFilterOperator,
430
+ ): DataCubeQuerySnapshotFilterCondition {
431
+ return {
432
+ name: property.property,
433
+ operator: operator,
434
+ type: property.class!, // TODO: fix this in engine (missing class in V1_AppliedProperty)
435
+ } as DataCubeQuerySnapshotFilterCondition;
436
+ }
@@ -13,8 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
-
17
- import { type V1_AppliedFunction } from '@finos/legend-graph';
18
16
  import {
19
17
  DataCubeQueryFilterOperation,
20
18
  generateDefaultFilterConditionPrimitiveTypeValue,
@@ -35,6 +33,15 @@ import {
35
33
  _value,
36
34
  } from '../DataCubeQueryBuilderUtils.js';
37
35
  import { guaranteeNonNullable } from '@finos/legend-shared';
36
+ import {
37
+ V1_PrimitiveValueSpecification,
38
+ type V1_AppliedFunction,
39
+ type V1_AppliedProperty,
40
+ } from '@finos/legend-graph';
41
+ import {
42
+ _buildConditionSnapshotProperty,
43
+ _dataCubeOperationValue,
44
+ } from '../DataCubeQuerySnapshotBuilderUtils.js';
38
45
 
39
46
  export class DataCubeQueryFilterOperation__Contain extends DataCubeQueryFilterOperation {
40
47
  override get label() {
@@ -73,8 +80,15 @@ export class DataCubeQueryFilterOperation__Contain extends DataCubeQueryFilterOp
73
80
  }
74
81
 
75
82
  buildConditionSnapshot(expression: V1_AppliedFunction) {
76
- /** TODO: @datacube roundtrip */
77
- return undefined;
83
+ const value = expression.parameters[1];
84
+ const filterConditionSnapshot = _buildConditionSnapshotProperty(
85
+ expression.parameters[0] as V1_AppliedProperty,
86
+ this.operator,
87
+ );
88
+ if (value instanceof V1_PrimitiveValueSpecification) {
89
+ filterConditionSnapshot.value = _dataCubeOperationValue(value);
90
+ }
91
+ return filterConditionSnapshot satisfies DataCubeQuerySnapshotFilterCondition;
78
92
  }
79
93
 
80
94
  buildConditionExpression(condition: DataCubeQuerySnapshotFilterCondition) {
@@ -13,8 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
-
17
- import { type V1_AppliedFunction } from '@finos/legend-graph';
18
16
  import {
19
17
  DataCubeQueryFilterOperation,
20
18
  generateDefaultFilterConditionPrimitiveTypeValue,
@@ -36,6 +34,15 @@ import {
36
34
  _var,
37
35
  } from '../DataCubeQueryBuilderUtils.js';
38
36
  import { guaranteeNonNullable } from '@finos/legend-shared';
37
+ import {
38
+ V1_PrimitiveValueSpecification,
39
+ type V1_AppliedFunction,
40
+ type V1_AppliedProperty,
41
+ } from '@finos/legend-graph';
42
+ import {
43
+ _buildConditionSnapshotProperty,
44
+ _dataCubeOperationValue,
45
+ } from '../DataCubeQuerySnapshotBuilderUtils.js';
39
46
 
40
47
  export class DataCubeQueryFilterOperation__ContainCaseInsensitive extends DataCubeQueryFilterOperation {
41
48
  override get label() {
@@ -74,8 +81,15 @@ export class DataCubeQueryFilterOperation__ContainCaseInsensitive extends DataCu
74
81
  }
75
82
 
76
83
  buildConditionSnapshot(expression: V1_AppliedFunction) {
77
- /** TODO: @datacube roundtrip */
78
- return undefined;
84
+ const value = expression.parameters[1];
85
+ const filterConditionSnapshot = _buildConditionSnapshotProperty(
86
+ expression.parameters[0] as V1_AppliedProperty,
87
+ this.operator,
88
+ );
89
+ if (value instanceof V1_PrimitiveValueSpecification) {
90
+ filterConditionSnapshot.value = _dataCubeOperationValue(value);
91
+ }
92
+ return filterConditionSnapshot satisfies DataCubeQuerySnapshotFilterCondition;
79
93
  }
80
94
 
81
95
  buildConditionExpression(condition: DataCubeQuerySnapshotFilterCondition) {
@@ -13,8 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
-
17
- import { type V1_AppliedFunction } from '@finos/legend-graph';
18
16
  import {
19
17
  DataCubeQueryFilterOperation,
20
18
  generateDefaultFilterConditionPrimitiveTypeValue,
@@ -35,6 +33,15 @@ import {
35
33
  _value,
36
34
  } from '../DataCubeQueryBuilderUtils.js';
37
35
  import { guaranteeNonNullable } from '@finos/legend-shared';
36
+ import {
37
+ V1_PrimitiveValueSpecification,
38
+ type V1_AppliedFunction,
39
+ type V1_AppliedProperty,
40
+ } from '@finos/legend-graph';
41
+ import {
42
+ _buildConditionSnapshotProperty,
43
+ _dataCubeOperationValue,
44
+ } from '../DataCubeQuerySnapshotBuilderUtils.js';
38
45
 
39
46
  export class DataCubeQueryFilterOperation__EndWith extends DataCubeQueryFilterOperation {
40
47
  override get label() {
@@ -73,8 +80,15 @@ export class DataCubeQueryFilterOperation__EndWith extends DataCubeQueryFilterOp
73
80
  }
74
81
 
75
82
  buildConditionSnapshot(expression: V1_AppliedFunction) {
76
- /** TODO: @datacube roundtrip */
77
- return undefined;
83
+ const value = expression.parameters[1];
84
+ const filterConditionSnapshot = _buildConditionSnapshotProperty(
85
+ expression.parameters[0] as V1_AppliedProperty,
86
+ this.operator,
87
+ );
88
+ if (value instanceof V1_PrimitiveValueSpecification) {
89
+ filterConditionSnapshot.value = _dataCubeOperationValue(value);
90
+ }
91
+ return filterConditionSnapshot satisfies DataCubeQuerySnapshotFilterCondition;
78
92
  }
79
93
 
80
94
  buildConditionExpression(condition: DataCubeQuerySnapshotFilterCondition) {
@@ -13,8 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
-
17
- import { type V1_AppliedFunction } from '@finos/legend-graph';
18
16
  import {
19
17
  DataCubeQueryFilterOperation,
20
18
  generateDefaultFilterConditionPrimitiveTypeValue,
@@ -36,6 +34,15 @@ import {
36
34
  _var,
37
35
  } from '../DataCubeQueryBuilderUtils.js';
38
36
  import { guaranteeNonNullable } from '@finos/legend-shared';
37
+ import {
38
+ V1_PrimitiveValueSpecification,
39
+ type V1_AppliedFunction,
40
+ type V1_AppliedProperty,
41
+ } from '@finos/legend-graph';
42
+ import {
43
+ _buildConditionSnapshotProperty,
44
+ _dataCubeOperationValue,
45
+ } from '../DataCubeQuerySnapshotBuilderUtils.js';
39
46
 
40
47
  export class DataCubeQueryFilterOperation__EndWithCaseInsensitive extends DataCubeQueryFilterOperation {
41
48
  override get label() {
@@ -74,8 +81,15 @@ export class DataCubeQueryFilterOperation__EndWithCaseInsensitive extends DataCu
74
81
  }
75
82
 
76
83
  buildConditionSnapshot(expression: V1_AppliedFunction) {
77
- /** TODO: @datacube roundtrip */
78
- return undefined;
84
+ const value = expression.parameters[1];
85
+ const filterConditionSnapshot = _buildConditionSnapshotProperty(
86
+ expression.parameters[0] as V1_AppliedProperty,
87
+ this.operator,
88
+ );
89
+ if (value instanceof V1_PrimitiveValueSpecification) {
90
+ filterConditionSnapshot.value = _dataCubeOperationValue(value);
91
+ }
92
+ return filterConditionSnapshot satisfies DataCubeQuerySnapshotFilterCondition;
79
93
  }
80
94
 
81
95
  buildConditionExpression(condition: DataCubeQuerySnapshotFilterCondition) {