@finos/legend-data-cube 0.0.41 → 0.0.43

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 (236) hide show
  1. package/lib/components/DataCube.d.ts.map +1 -1
  2. package/lib/components/DataCube.js +1 -1
  3. package/lib/components/DataCube.js.map +1 -1
  4. package/lib/components/DataCubePlaceholder.d.ts +0 -1
  5. package/lib/components/DataCubePlaceholder.d.ts.map +1 -1
  6. package/lib/components/DataCubePlaceholder.js.map +1 -1
  7. package/lib/components/core/DataCubeCodeCheckErrorAlert.d.ts.map +1 -1
  8. package/lib/components/core/DataCubeCodeCheckErrorAlert.js +5 -1
  9. package/lib/components/core/DataCubeCodeCheckErrorAlert.js.map +1 -1
  10. package/lib/components/view/extend/DataCubeColumnEditor.d.ts.map +1 -1
  11. package/lib/components/view/extend/DataCubeColumnEditor.js +5 -2
  12. package/lib/components/view/extend/DataCubeColumnEditor.js.map +1 -1
  13. package/lib/components/view/filter/DataCubeFilterEditor.d.ts.map +1 -1
  14. package/lib/components/view/filter/DataCubeFilterEditor.js +3 -3
  15. package/lib/components/view/filter/DataCubeFilterEditor.js.map +1 -1
  16. package/lib/index.css +2 -2
  17. package/lib/index.css.map +1 -1
  18. package/lib/index.d.ts +1 -0
  19. package/lib/index.d.ts.map +1 -1
  20. package/lib/index.js +1 -0
  21. package/lib/index.js.map +1 -1
  22. package/lib/package.json +4 -4
  23. package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
  24. package/lib/stores/core/DataCubeQueryBuilder.js +12 -6
  25. package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
  26. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +5 -5
  27. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
  28. package/lib/stores/core/DataCubeQueryBuilderUtils.js +20 -20
  29. package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
  30. package/lib/stores/core/DataCubeQueryEngine.d.ts +4 -2
  31. package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
  32. package/lib/stores/core/DataCubeQueryEngine.js +13 -0
  33. package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
  34. package/lib/stores/core/DataCubeQuerySnapshot.d.ts +1 -1
  35. package/lib/stores/core/DataCubeQuerySnapshot.d.ts.map +1 -1
  36. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts +2 -1
  37. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  38. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js +86 -53
  39. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  40. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.d.ts +37 -8
  41. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.d.ts.map +1 -1
  42. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js +227 -203
  43. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js.map +1 -1
  44. package/lib/stores/core/filter/DataCubeQueryFilterEditorState.d.ts +3 -3
  45. package/lib/stores/core/filter/DataCubeQueryFilterEditorState.d.ts.map +1 -1
  46. package/lib/stores/core/filter/DataCubeQueryFilterEditorState.js +4 -8
  47. package/lib/stores/core/filter/DataCubeQueryFilterEditorState.js.map +1 -1
  48. package/lib/stores/core/filter/DataCubeQueryFilterOperation.d.ts +7 -3
  49. package/lib/stores/core/filter/DataCubeQueryFilterOperation.d.ts.map +1 -1
  50. package/lib/stores/core/filter/DataCubeQueryFilterOperation.js +16 -1
  51. package/lib/stores/core/filter/DataCubeQueryFilterOperation.js.map +1 -1
  52. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.d.ts +1 -1
  53. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.d.ts.map +1 -1
  54. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.js +10 -14
  55. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Contain.js.map +1 -1
  56. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.d.ts +1 -1
  57. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.d.ts.map +1 -1
  58. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.js +10 -14
  59. package/lib/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.js.map +1 -1
  60. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.d.ts +1 -1
  61. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.d.ts.map +1 -1
  62. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.js +10 -14
  63. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWith.js.map +1 -1
  64. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.d.ts +1 -1
  65. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.d.ts.map +1 -1
  66. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.js +10 -14
  67. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.js.map +1 -1
  68. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.d.ts +1 -2
  69. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.d.ts.map +1 -1
  70. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.js +15 -90
  71. package/lib/stores/core/filter/DataCubeQueryFilterOperation__Equal.js.map +1 -1
  72. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.d.ts +1 -1
  73. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.d.ts.map +1 -1
  74. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.js +10 -14
  75. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.js.map +1 -1
  76. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.d.ts +1 -1
  77. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.d.ts.map +1 -1
  78. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.js +6 -14
  79. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.js.map +1 -1
  80. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.d.ts +1 -1
  81. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.d.ts.map +1 -1
  82. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.js +6 -14
  83. package/lib/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.js.map +1 -1
  84. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.d.ts +1 -1
  85. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.d.ts.map +1 -1
  86. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.js +14 -18
  87. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.js.map +1 -1
  88. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.d.ts +1 -1
  89. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.d.ts.map +1 -1
  90. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.js +6 -14
  91. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.js.map +1 -1
  92. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.d.ts +1 -1
  93. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.d.ts.map +1 -1
  94. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.js +14 -18
  95. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.js.map +1 -1
  96. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.d.ts +1 -1
  97. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.d.ts.map +1 -1
  98. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.js +6 -14
  99. package/lib/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.js.map +1 -1
  100. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.d.ts +6 -4
  101. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.d.ts.map +1 -1
  102. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.js +15 -15
  103. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.js.map +1 -1
  104. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.d.ts +6 -4
  105. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.d.ts.map +1 -1
  106. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.js +10 -15
  107. package/lib/stores/core/filter/DataCubeQueryFilterOperation__IsNull.js.map +1 -1
  108. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.d.ts +1 -1
  109. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.d.ts.map +1 -1
  110. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.js +14 -18
  111. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThan.js.map +1 -1
  112. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.d.ts +1 -1
  113. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.d.ts.map +1 -1
  114. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.js +6 -14
  115. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.js.map +1 -1
  116. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.d.ts +1 -1
  117. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.d.ts.map +1 -1
  118. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.js +14 -18
  119. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.js.map +1 -1
  120. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.d.ts +1 -1
  121. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.d.ts.map +1 -1
  122. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.js +6 -14
  123. package/lib/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.js.map +1 -1
  124. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.d.ts +1 -1
  125. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.d.ts.map +1 -1
  126. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.js +14 -14
  127. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotContain.js.map +1 -1
  128. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.d.ts +1 -1
  129. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.d.ts.map +1 -1
  130. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.js +14 -14
  131. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.js.map +1 -1
  132. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.d.ts +1 -1
  133. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.d.ts.map +1 -1
  134. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.js +19 -19
  135. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.js.map +1 -1
  136. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.d.ts +1 -1
  137. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.d.ts.map +1 -1
  138. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.js +14 -14
  139. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.js.map +1 -1
  140. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.d.ts +1 -1
  141. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.d.ts.map +1 -1
  142. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.js +10 -14
  143. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.js.map +1 -1
  144. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.d.ts +1 -1
  145. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.d.ts.map +1 -1
  146. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.js +10 -14
  147. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.js.map +1 -1
  148. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.d.ts +1 -1
  149. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.d.ts.map +1 -1
  150. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.js +14 -14
  151. package/lib/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.js.map +1 -1
  152. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.d.ts +1 -1
  153. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.d.ts.map +1 -1
  154. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.js +10 -14
  155. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWith.js.map +1 -1
  156. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.d.ts +1 -1
  157. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.d.ts.map +1 -1
  158. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.js +10 -14
  159. package/lib/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.js.map +1 -1
  160. package/lib/stores/core/model/DataCubeConfiguration.d.ts +2 -0
  161. package/lib/stores/core/model/DataCubeConfiguration.d.ts.map +1 -1
  162. package/lib/stores/core/model/DataCubeConfiguration.js +3 -1
  163. package/lib/stores/core/model/DataCubeConfiguration.js.map +1 -1
  164. package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
  165. package/lib/stores/view/DataCubeViewState.js +1 -1
  166. package/lib/stores/view/DataCubeViewState.js.map +1 -1
  167. package/lib/stores/view/editor/DataCubeEditorColumnPropertiesPanelState.js +2 -2
  168. package/lib/stores/view/editor/DataCubeEditorColumnPropertiesPanelState.js.map +1 -1
  169. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
  170. package/lib/stores/view/extend/DataCubeColumnEditorState.js +3 -6
  171. package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
  172. package/lib/stores/view/filter/DataCubeFilterEditorState.d.ts.map +1 -1
  173. package/lib/stores/view/filter/DataCubeFilterEditorState.js +3 -3
  174. package/lib/stores/view/filter/DataCubeFilterEditorState.js.map +1 -1
  175. package/lib/stores/view/grid/DataCubeGridClientEngine.js +1 -1
  176. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  177. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts.map +1 -1
  178. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js +5 -5
  179. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js.map +1 -1
  180. package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts.map +1 -1
  181. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +13 -5
  182. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
  183. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  184. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +8 -5
  185. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
  186. package/package.json +9 -9
  187. package/src/components/DataCube.tsx +1 -0
  188. package/src/components/DataCubePlaceholder.tsx +0 -1
  189. package/src/components/core/DataCubeCodeCheckErrorAlert.tsx +7 -3
  190. package/src/components/view/extend/DataCubeColumnEditor.tsx +7 -4
  191. package/src/components/view/filter/DataCubeFilterEditor.tsx +10 -19
  192. package/src/index.tsx +1 -0
  193. package/src/stores/core/DataCubeQueryBuilder.ts +20 -6
  194. package/src/stores/core/DataCubeQueryBuilderUtils.ts +38 -33
  195. package/src/stores/core/DataCubeQueryEngine.ts +17 -1
  196. package/src/stores/core/DataCubeQuerySnapshot.ts +1 -1
  197. package/src/stores/core/DataCubeQuerySnapshotBuilder.ts +148 -75
  198. package/src/stores/core/DataCubeQuerySnapshotBuilderUtils.ts +332 -260
  199. package/src/stores/core/filter/DataCubeQueryFilterEditorState.ts +7 -11
  200. package/src/stores/core/filter/DataCubeQueryFilterOperation.ts +28 -6
  201. package/src/stores/core/filter/DataCubeQueryFilterOperation__Contain.tsx +13 -21
  202. package/src/stores/core/filter/DataCubeQueryFilterOperation__ContainCaseInsensitive.tsx +17 -21
  203. package/src/stores/core/filter/DataCubeQueryFilterOperation__EndWith.tsx +17 -21
  204. package/src/stores/core/filter/DataCubeQueryFilterOperation__EndWithCaseInsensitive.tsx +17 -21
  205. package/src/stores/core/filter/DataCubeQueryFilterOperation__Equal.tsx +13 -98
  206. package/src/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitive.tsx +17 -21
  207. package/src/stores/core/filter/DataCubeQueryFilterOperation__EqualCaseInsensitiveColumn.tsx +13 -19
  208. package/src/stores/core/filter/DataCubeQueryFilterOperation__EqualColumn.tsx +9 -19
  209. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThan.tsx +17 -21
  210. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanColumn.tsx +13 -19
  211. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqual.tsx +17 -21
  212. package/src/stores/core/filter/DataCubeQueryFilterOperation__GreaterThanOrEqualColumn.tsx +13 -19
  213. package/src/stores/core/filter/DataCubeQueryFilterOperation__IsNotNull.tsx +24 -20
  214. package/src/stores/core/filter/DataCubeQueryFilterOperation__IsNull.tsx +14 -20
  215. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThan.tsx +17 -21
  216. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThanColumn.tsx +13 -19
  217. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqual.tsx +17 -21
  218. package/src/stores/core/filter/DataCubeQueryFilterOperation__LessThanOrEqualColumn.tsx +13 -19
  219. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotContain.tsx +20 -19
  220. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEndWith.tsx +20 -19
  221. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqual.tsx +20 -19
  222. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitive.tsx +24 -19
  223. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqualCaseInsensitiveColumn.tsx +25 -18
  224. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotEqualColumn.tsx +21 -18
  225. package/src/stores/core/filter/DataCubeQueryFilterOperation__NotStartWith.tsx +24 -19
  226. package/src/stores/core/filter/DataCubeQueryFilterOperation__StartWith.tsx +17 -21
  227. package/src/stores/core/filter/DataCubeQueryFilterOperation__StartWithCaseInsensitive.tsx +17 -21
  228. package/src/stores/core/model/DataCubeConfiguration.ts +9 -1
  229. package/src/stores/view/DataCubeViewState.ts +1 -0
  230. package/src/stores/view/editor/DataCubeEditorColumnPropertiesPanelState.ts +2 -2
  231. package/src/stores/view/extend/DataCubeColumnEditorState.tsx +2 -5
  232. package/src/stores/view/filter/DataCubeFilterEditorState.tsx +3 -7
  233. package/src/stores/view/grid/DataCubeGridClientEngine.ts +1 -1
  234. package/src/stores/view/grid/DataCubeGridConfigurationBuilder.tsx +6 -6
  235. package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +14 -5
  236. package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +9 -5
@@ -28,25 +28,32 @@ import {
28
28
  V1_ClassInstance,
29
29
  V1_ColSpec,
30
30
  V1_ColSpecArray,
31
- V1_Lambda,
31
+ V1_GenericTypeInstance,
32
32
  type V1_ValueSpecification,
33
- type V1_PrimitiveValueSpecification,
33
+ V1_PrimitiveValueSpecification,
34
34
  extractElementNameFromPath as _name,
35
35
  matchFunctionName,
36
+ V1_RelationType,
37
+ V1_PackageableType,
38
+ type V1_GenericType,
36
39
  } from '@finos/legend-graph';
37
40
  import { type DataCubeColumn } from './model/DataCubeColumn.js';
38
41
  import {
39
42
  assertTrue,
40
43
  assertType,
44
+ at,
41
45
  guaranteeNonNullable,
42
46
  guaranteeType,
47
+ IllegalStateError,
48
+ uniq,
43
49
  UnsupportedOperationError,
44
50
  type Clazz,
45
51
  } from '@finos/legend-shared';
46
52
  import {
47
53
  DataCubeFunction,
54
+ DataCubeOperationAdvancedValueType,
48
55
  DataCubeQueryFilterGroupOperator,
49
- DataCubeQueryFilterOperator,
56
+ getDataType,
50
57
  TREE_COLUMN_VALUE_SEPARATOR,
51
58
  type DataCubeOperationValue,
52
59
  } from './DataCubeQueryEngine.js';
@@ -54,7 +61,7 @@ import type {
54
61
  DataCubeQuerySnapshotFilter,
55
62
  DataCubeQuerySnapshotFilterCondition,
56
63
  } from './DataCubeQuerySnapshot.js';
57
- import { _functionName } from './DataCubeQueryBuilderUtils.js';
64
+ import { _serializeValueSpecification } from './DataCubeQueryBuilderUtils.js';
58
65
  import type { DataCubeQueryFilterOperation } from './filter/DataCubeQueryFilterOperation.js';
59
66
 
60
67
  // --------------------------------- UTILITIES ---------------------------------
@@ -63,6 +70,7 @@ export function _param<T extends V1_ValueSpecification>(
63
70
  func: V1_AppliedFunction,
64
71
  paramIdx: number,
65
72
  clazz: Clazz<T>,
73
+ message?: string | undefined,
66
74
  ): T {
67
75
  assertTrue(
68
76
  func.parameters.length >= paramIdx + 1,
@@ -71,7 +79,8 @@ export function _param<T extends V1_ValueSpecification>(
71
79
  return guaranteeType(
72
80
  func.parameters[paramIdx],
73
81
  clazz,
74
- `Can't process ${_name(func.function)}() expression: Found unexpected type for parameter at index ${paramIdx}`,
82
+ message ??
83
+ `Can't process ${_name(func.function)}() expression: Found unexpected type for parameter at index ${paramIdx}`,
75
84
  );
76
85
  }
77
86
 
@@ -83,14 +92,6 @@ export function _colSpecParam(func: V1_AppliedFunction, paramIdx: number) {
83
92
  );
84
93
  }
85
94
 
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
-
94
95
  export function _colSpecArrayParam(func: V1_AppliedFunction, paramIdx: number) {
95
96
  return guaranteeType(
96
97
  _param(func, paramIdx, V1_ClassInstance).value,
@@ -99,6 +100,15 @@ export function _colSpecArrayParam(func: V1_AppliedFunction, paramIdx: number) {
99
100
  );
100
101
  }
101
102
 
103
+ export function _genericTypeParam(func: V1_AppliedFunction, paramIdx: number) {
104
+ return _param(
105
+ func,
106
+ paramIdx,
107
+ V1_GenericTypeInstance,
108
+ `Can't process ${_name(func.function)}: Expected parameter at index ${paramIdx} to be a generic type instance`,
109
+ );
110
+ }
111
+
102
112
  export function _funcMatch(
103
113
  value: V1_ValueSpecification | undefined,
104
114
  functionNames: string | string[],
@@ -113,11 +123,50 @@ export function _funcMatch(
113
123
  value.function,
114
124
  Array.isArray(functionNames) ? functionNames : [functionNames],
115
125
  ),
116
- `Can't process function: Expected function name to be one of [${Array.isArray(functionNames) ? functionNames.join(', ') : functionNames}]`,
126
+ `Can't process function: Expected function to be one of [${uniq((Array.isArray(functionNames) ? functionNames : [functionNames]).map(_name)).join(', ')}]`,
117
127
  );
118
128
  return value;
119
129
  }
120
130
 
131
+ export function _relationType(genericType: V1_GenericType) {
132
+ return guaranteeType(
133
+ genericType.typeArguments[0]?.rawType,
134
+ V1_RelationType,
135
+ `Can't process generic type: failed to extract relation type`,
136
+ );
137
+ }
138
+
139
+ export function _packageableType(genericType: V1_GenericType) {
140
+ return guaranteeType(
141
+ genericType.rawType,
142
+ V1_PackageableType,
143
+ `Can't process generic type: failed to extract packageable type`,
144
+ );
145
+ }
146
+
147
+ export function _operationPrimitiveValue(
148
+ value: V1_PrimitiveValueSpecification,
149
+ ): DataCubeOperationValue {
150
+ if (value instanceof V1_CString) {
151
+ return { value: value.value, type: PRIMITIVE_TYPE.STRING };
152
+ } else if (value instanceof V1_CBoolean) {
153
+ return { value: value.value, type: PRIMITIVE_TYPE.BOOLEAN };
154
+ } else if (value instanceof V1_CDecimal) {
155
+ return { value: value.value, type: PRIMITIVE_TYPE.DECIMAL };
156
+ } else if (value instanceof V1_CInteger) {
157
+ return { value: value.value, type: PRIMITIVE_TYPE.INTEGER };
158
+ } else if (value instanceof V1_CFloat) {
159
+ return { value: value.value, type: PRIMITIVE_TYPE.FLOAT };
160
+ } else if (value instanceof V1_CStrictDate) {
161
+ return { value: value.value, type: PRIMITIVE_TYPE.STRICTDATE };
162
+ } else if (value instanceof V1_CDateTime) {
163
+ return { value: value.value, type: PRIMITIVE_TYPE.DATETIME };
164
+ } else if (value instanceof V1_CStrictTime) {
165
+ return { value: value.value, type: PRIMITIVE_TYPE.STRICTTIME };
166
+ }
167
+ throw new UnsupportedOperationError(`Can't process primitive value`);
168
+ }
169
+
121
170
  // --------------------------------- BUILDING BLOCKS ---------------------------------
122
171
 
123
172
  /**
@@ -154,283 +203,306 @@ export function _pruneExpandedPaths(
154
203
  .sort();
155
204
  }
156
205
 
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;
206
+ export function _extractExtendedColumns(func: V1_AppliedFunction) {
207
+ const extendFuncs: V1_AppliedFunction[] = [];
208
+ let currentFunc = func;
209
+
210
+ while (currentFunc instanceof V1_AppliedFunction) {
211
+ // since we are processing a chain of extend(), we can finish processing when
212
+ // encountering a different function.
213
+ if (!matchFunctionName(currentFunc.function, DataCubeFunction.EXTEND)) {
214
+ break;
172
215
  }
173
216
 
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
- });
217
+ if (currentFunc.parameters.length === 2) {
218
+ const valueSpecification = currentFunc.parameters[0];
219
+ if (!(valueSpecification instanceof V1_AppliedFunction)) {
220
+ throw new IllegalStateError(
221
+ `Can't process extend() expression: Expected a chain of function calls (e.g. x()->y()->z())`,
222
+ );
223
+ } else {
224
+ currentFunc.parameters = currentFunc.parameters.slice(1);
225
+ extendFuncs.unshift(currentFunc);
226
+ currentFunc = valueSpecification;
227
+ }
181
228
  } else {
182
- filterConditionSnapshot.push(_buildSubFilter(vs, filterOperations)!);
229
+ assertTrue(
230
+ currentFunc.parameters.length === 1,
231
+ `Can't process extend() expression: Expected 1 parameter, got ${currentFunc.parameters.length}`,
232
+ );
233
+ extendFuncs.unshift(currentFunc);
234
+ break;
183
235
  }
184
236
  }
185
- filterSnapshot.conditions = filterConditionSnapshot;
186
- return filterSnapshot;
237
+ return extendFuncs.map((extendFunc) => {
238
+ const colSpecs = _colSpecArrayParam(extendFunc, 0).colSpecs;
239
+ assertTrue(
240
+ colSpecs.length === 1,
241
+ `Can't process extend() expression: Expected 1 column specification, got ${colSpecs.length}`,
242
+ );
243
+ const colSpec = at(colSpecs, 0);
244
+ return {
245
+ name: colSpec.name,
246
+ type: '', // NOTE: we don't have type information for extended columns at this point
247
+ mapFn: _serializeValueSpecification(
248
+ guaranteeNonNullable(
249
+ colSpec.function1,
250
+ `Can't process extend() expression: Expected a transformation function expression`,
251
+ ),
252
+ ),
253
+ reduceFn: colSpec.function2
254
+ ? _serializeValueSpecification(colSpec.function2)
255
+ : undefined,
256
+ };
257
+ });
187
258
  }
188
259
 
189
- function _buildSubFilter(
190
- vs: V1_ValueSpecification,
260
+ export function _filter(
261
+ value: V1_ValueSpecification,
262
+ columnGetter: (name: string) => DataCubeColumn,
191
263
  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,
264
+ ): DataCubeQuerySnapshotFilter {
265
+ if (!(value instanceof V1_AppliedFunction)) {
266
+ throw new Error(
267
+ `Can't process filter() expression: Expected a function expression`,
268
+ );
269
+ }
270
+
271
+ const group: DataCubeQuerySnapshotFilter = {
272
+ // default to AND group for case where there is only one condition
273
+ groupOperator: DataCubeQueryFilterGroupOperator.AND,
274
+ conditions: [],
275
+ };
276
+
277
+ if (matchFunctionName(value.function, DataCubeFunction.AND)) {
278
+ value.parameters.forEach((param) => {
279
+ group.conditions.push(
280
+ _filterCondition(param, columnGetter, filterOperations),
208
281
  );
209
- } else if (vs.function === _functionName(DataCubeFunction.NOT)) {
210
- const notCondition = _buildNotFilterConditionSnapshot(
211
- vs.parameters[0] as V1_AppliedFunction,
282
+ });
283
+ } else if (matchFunctionName(value.function, DataCubeFunction.OR)) {
284
+ group.groupOperator = DataCubeQueryFilterGroupOperator.OR;
285
+ value.parameters.forEach((param) => {
286
+ group.conditions.push(
287
+ _filterCondition(param, columnGetter, filterOperations),
212
288
  );
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
- }
289
+ });
290
+ } else {
291
+ // handles the case where the root is a simple condition or a NOT condition
292
+ group.conditions.push(
293
+ _filterCondition(value, columnGetter, filterOperations),
294
+ );
230
295
  }
231
- return undefined;
296
+ return group;
232
297
  }
233
298
 
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
- }
299
+ export function _unwrapNotFilterCondition(func: V1_AppliedFunction) {
300
+ assertTrue(
301
+ matchFunctionName(func.function, DataCubeFunction.NOT),
302
+ `Can't process filter condition expression: failed to unwrap not() function`,
303
+ );
304
+ assertTrue(
305
+ func.parameters.length === 1,
306
+ `Can't process not() function: Expected 1 parameter`,
307
+ );
308
+ return _param(func, 0, V1_AppliedFunction);
283
309
  }
284
310
 
285
- function _buildCaseInsensitiveFilterConditionSnapshot(
286
- af: V1_AppliedFunction,
287
- ): [V1_AppliedFunction, string] | undefined {
288
- const func = af;
311
+ function _filterCondition(
312
+ value: V1_ValueSpecification,
313
+ columnGetter: (name: string) => DataCubeColumn,
314
+ filterOperations: DataCubeQueryFilterOperation[],
315
+ ): DataCubeQuerySnapshotFilterCondition | DataCubeQuerySnapshotFilter {
316
+ if (!(value instanceof V1_AppliedFunction)) {
317
+ throw new UnsupportedOperationError(
318
+ `Can't process filter condition expression: Expected a function expression`,
319
+ );
320
+ }
321
+
322
+ // handle group condition
289
323
  if (
290
- af.parameters[0] instanceof V1_AppliedFunction &&
291
- af.parameters[1] instanceof V1_AppliedFunction
324
+ matchFunctionName(value.function, [
325
+ DataCubeFunction.AND,
326
+ DataCubeFunction.OR,
327
+ ])
292
328
  ) {
293
- func.parameters = [
294
- af.parameters[0].parameters[0]!,
295
- af.parameters[1].parameters[0]!,
296
- ];
329
+ return _filter(value, columnGetter, filterOperations);
297
330
  }
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;
331
+
332
+ // run through the list of supported filter operations to find the one that can process the condition
333
+ for (const filterOperation of filterOperations) {
334
+ const condition = filterOperation.buildConditionSnapshot(
335
+ value,
336
+ columnGetter,
337
+ );
338
+ if (condition) {
339
+ return condition;
320
340
  }
321
341
  }
322
- }
323
342
 
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
- ];
343
+ // if no match found, proceed to unwrap if it's a NOT condition
344
+ if (matchFunctionName(value.function, DataCubeFunction.NOT)) {
345
+ // run through the list of supported filter operations to find the one that can process the condition
346
+ // again. Processing in this order ensures cases like x != y can be recognized as NOT_EQUAL operator
347
+ // instead of NOT(x == y)
348
+ const unwrapped = _unwrapNotFilterCondition(value);
349
+ for (const filterOperation of filterOperations) {
350
+ const condition = filterOperation.buildConditionSnapshot(
351
+ unwrapped,
352
+ columnGetter,
353
+ );
354
+ if (condition) {
355
+ condition.not = true;
356
+ return condition;
357
357
  }
358
- return [func, DataCubeQueryFilterOperator.NOT_EQUAL_CASE_INSENSITIVE];
359
358
  }
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;
359
+
360
+ // if no match found, try to see if the condition is a group condition and process
361
+ if (
362
+ unwrapped instanceof V1_AppliedFunction &&
363
+ matchFunctionName(unwrapped.function, [
364
+ DataCubeFunction.AND,
365
+ DataCubeFunction.OR,
366
+ ])
367
+ ) {
368
+ const condition = _filter(unwrapped, columnGetter, filterOperations);
369
+ condition.not = true;
370
+ return condition;
374
371
  }
375
372
  }
376
- return undefined;
373
+
374
+ // if no match found, throw error, we encountered a filter condition form that we don't support
375
+ throw new Error(`Can't process filter condition: no matching operator found`);
377
376
  }
378
377
 
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
- );
378
+ function _filterConditionValue(
379
+ value: V1_ValueSpecification | undefined,
380
+ column: DataCubeColumn,
381
+ columnGetter: (name: string) => DataCubeColumn,
382
+ ) {
383
+ if (value instanceof V1_PrimitiveValueSpecification) {
384
+ return _operationPrimitiveValue(value);
385
+ } else if (value instanceof V1_AppliedProperty) {
386
+ const column2 = columnGetter(value.property);
387
+ if (getDataType(column.type) !== getDataType(column2.type)) {
388
+ return undefined;
389
+ }
390
+ return {
391
+ value: column2.name,
392
+ type: DataCubeOperationAdvancedValueType.COLUMN,
393
+ };
394
+ } else if (value === undefined) {
395
+ return {
396
+ type: DataCubeOperationAdvancedValueType.VOID,
397
+ };
403
398
  }
404
- }
405
399
 
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);
400
+ return undefined;
415
401
  }
416
402
 
417
- function _buildDataCubeOperationValue(
418
- type: string,
419
- value: unknown,
420
- ): DataCubeOperationValue {
421
- return {
422
- value: value,
423
- type: type,
424
- } satisfies DataCubeOperationValue;
403
+ /**
404
+ * Processes filter conditions of form: column | operator | value, e.g.
405
+ * $x.Age > 5
406
+ * $x.Name == 'abc'
407
+ * $x.Name->startsWith('abc')
408
+ * $x.Age > $x.Age2
409
+ * $x.Name == $x.Name2
410
+ */
411
+ export function _baseFilterCondition(
412
+ expression: V1_AppliedFunction,
413
+ columnGetter: (name: string) => DataCubeColumn,
414
+ func: string,
415
+ ) {
416
+ if (matchFunctionName(expression.function, func)) {
417
+ if (
418
+ expression.parameters.length !== 2 &&
419
+ expression.parameters.length !== 1
420
+ ) {
421
+ return undefined;
422
+ }
423
+
424
+ const column =
425
+ expression.parameters[0] instanceof V1_AppliedProperty
426
+ ? columnGetter(expression.parameters[0].property)
427
+ : undefined;
428
+ if (!column) {
429
+ return undefined;
430
+ }
431
+
432
+ const value = _filterConditionValue(
433
+ expression.parameters[1],
434
+ column,
435
+ columnGetter,
436
+ );
437
+ if (!value) {
438
+ return undefined;
439
+ }
440
+
441
+ return {
442
+ column,
443
+ value,
444
+ };
445
+ }
446
+ return undefined;
425
447
  }
426
448
 
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;
449
+ /**
450
+ * Processes filter conditions of form: column (case-insensitive) | operator | value (case-insensitive), e.g.
451
+ * $x.Name->toLower() == 'abc'->toLower()
452
+ * $x.Name->toLower() == $x.Name2->toLower()
453
+ */
454
+ export function _caseSensitiveBaseFilterCondition(
455
+ expression: V1_AppliedFunction,
456
+ columnGetter: (name: string) => DataCubeColumn,
457
+ func: string,
458
+ ) {
459
+ if (matchFunctionName(expression.function, func)) {
460
+ if (expression.parameters.length !== 2) {
461
+ return undefined;
462
+ }
463
+
464
+ const param1 = expression.parameters[0];
465
+ if (
466
+ !(param1 instanceof V1_AppliedFunction) ||
467
+ !matchFunctionName(param1.function, DataCubeFunction.TO_LOWERCASE)
468
+ ) {
469
+ return undefined;
470
+ }
471
+ if (param1.parameters.length !== 1) {
472
+ return undefined;
473
+ }
474
+ const column =
475
+ param1.parameters[0] instanceof V1_AppliedProperty
476
+ ? columnGetter(param1.parameters[0].property)
477
+ : undefined;
478
+ if (!column) {
479
+ return undefined;
480
+ }
481
+
482
+ const param2 = expression.parameters[1];
483
+ if (
484
+ !(param2 instanceof V1_AppliedFunction) ||
485
+ !matchFunctionName(param2.function, DataCubeFunction.TO_LOWERCASE)
486
+ ) {
487
+ return undefined;
488
+ }
489
+ if (param2.parameters.length !== 1) {
490
+ return undefined;
491
+ }
492
+ const value = _filterConditionValue(
493
+ param2.parameters[0],
494
+ column,
495
+ columnGetter,
496
+ );
497
+
498
+ if (!value) {
499
+ return undefined;
500
+ }
501
+
502
+ return {
503
+ column,
504
+ value,
505
+ };
506
+ }
507
+ return undefined;
436
508
  }