@devrev/meerkat-core 0.0.96 → 0.0.98

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 (358) hide show
  1. package/README.md +70 -6
  2. package/package.json +2 -2
  3. package/src/ast-builder/ast-builder.js +91 -0
  4. package/src/ast-builder/ast-builder.js.map +1 -0
  5. package/src/ast-deserializer/ast-deserializer.js +17 -0
  6. package/src/ast-deserializer/ast-deserializer.js.map +1 -0
  7. package/src/ast-serializer/ast-serializer.js +8 -0
  8. package/src/ast-serializer/ast-serializer.js.map +1 -0
  9. package/src/ast-validator/dimension-validator.js +49 -0
  10. package/src/ast-validator/dimension-validator.js.map +1 -0
  11. package/src/ast-validator/index.js +12 -0
  12. package/src/ast-validator/index.js.map +1 -0
  13. package/src/ast-validator/measure-validator.js +155 -0
  14. package/src/ast-validator/measure-validator.js.map +1 -0
  15. package/{ast-validator → src/ast-validator}/tests/test-data.js +692 -890
  16. package/src/ast-validator/tests/test-data.js.map +1 -0
  17. package/src/ast-validator/types.js +3 -0
  18. package/src/ast-validator/types.js.map +1 -0
  19. package/src/ast-validator/utils.js +24 -0
  20. package/src/ast-validator/utils.js.map +1 -0
  21. package/src/context-params/context-params-ast.js +42 -0
  22. package/src/context-params/context-params-ast.js.map +1 -0
  23. package/src/cube-filter-transformer/and/and.js +14 -0
  24. package/src/cube-filter-transformer/and/and.js.map +1 -0
  25. package/src/cube-filter-transformer/base-condition-builder/base-condition-builder.js +145 -0
  26. package/src/cube-filter-transformer/base-condition-builder/base-condition-builder.js.map +1 -0
  27. package/src/cube-filter-transformer/contains/contains.js +62 -0
  28. package/src/cube-filter-transformer/contains/contains.js.map +1 -0
  29. package/src/cube-filter-transformer/equals/equals-array.js +71 -0
  30. package/src/cube-filter-transformer/equals/equals-array.js.map +1 -0
  31. package/src/cube-filter-transformer/equals/equals.js +36 -0
  32. package/src/cube-filter-transformer/equals/equals.js.map +1 -0
  33. package/src/cube-filter-transformer/factory.js +120 -0
  34. package/src/cube-filter-transformer/factory.js.map +1 -0
  35. package/src/cube-filter-transformer/gt/gt.js +28 -0
  36. package/src/cube-filter-transformer/gt/gt.js.map +1 -0
  37. package/src/cube-filter-transformer/gte/gte.js +28 -0
  38. package/src/cube-filter-transformer/gte/gte.js.map +1 -0
  39. package/src/cube-filter-transformer/in/in.js +69 -0
  40. package/src/cube-filter-transformer/in/in.js.map +1 -0
  41. package/src/cube-filter-transformer/in-date-range/in-date-range.js +21 -0
  42. package/src/cube-filter-transformer/in-date-range/in-date-range.js.map +1 -0
  43. package/src/cube-filter-transformer/lt/lt.js +28 -0
  44. package/src/cube-filter-transformer/lt/lt.js.map +1 -0
  45. package/src/cube-filter-transformer/lte/lte.js +28 -0
  46. package/src/cube-filter-transformer/lte/lte.js.map +1 -0
  47. package/src/cube-filter-transformer/not/not.js +14 -0
  48. package/src/cube-filter-transformer/not/not.js.map +1 -0
  49. package/src/cube-filter-transformer/not-In-date-range/not-In-date-range.js +21 -0
  50. package/src/cube-filter-transformer/not-In-date-range/not-In-date-range.js.map +1 -0
  51. package/src/cube-filter-transformer/not-contains/not-contains.js +62 -0
  52. package/src/cube-filter-transformer/not-contains/not-contains.js.map +1 -0
  53. package/src/cube-filter-transformer/not-equals/not-equals-array.js +21 -0
  54. package/src/cube-filter-transformer/not-equals/not-equals-array.js.map +1 -0
  55. package/src/cube-filter-transformer/not-equals/not-equals.js +36 -0
  56. package/src/cube-filter-transformer/not-equals/not-equals.js.map +1 -0
  57. package/src/cube-filter-transformer/not-in/not-in.js +76 -0
  58. package/src/cube-filter-transformer/not-in/not-in.js.map +1 -0
  59. package/src/cube-filter-transformer/not-set/not-set.js +23 -0
  60. package/src/cube-filter-transformer/not-set/not-set.js.map +1 -0
  61. package/src/cube-filter-transformer/or/or.js +14 -0
  62. package/src/cube-filter-transformer/or/or.js.map +1 -0
  63. package/src/cube-filter-transformer/set/set.js +23 -0
  64. package/src/cube-filter-transformer/set/set.js.map +1 -0
  65. package/src/cube-group-by-transformer/cube-group-by-transformer.js +19 -0
  66. package/src/cube-group-by-transformer/cube-group-by-transformer.js.map +1 -0
  67. package/src/cube-limit-offset-transformer/cube-limit-offset-transformer.js +42 -0
  68. package/src/cube-limit-offset-transformer/cube-limit-offset-transformer.js.map +1 -0
  69. package/src/cube-measure-transformer/cube-measure-transformer.js +124 -0
  70. package/src/cube-measure-transformer/cube-measure-transformer.js.map +1 -0
  71. package/src/cube-order-by-transformer/cube-order-by-transformer.js +34 -0
  72. package/src/cube-order-by-transformer/cube-order-by-transformer.js.map +1 -0
  73. package/src/cube-to-duckdb/cube-filter-to-duckdb.js +3 -0
  74. package/src/cube-to-duckdb/cube-filter-to-duckdb.js.map +1 -0
  75. package/src/filter-params/filter-params-ast.js +114 -0
  76. package/src/filter-params/filter-params-ast.js.map +1 -0
  77. package/src/get-filter-params-sql/get-filter-params-sql.js +25 -0
  78. package/src/get-filter-params-sql/get-filter-params-sql.js.map +1 -0
  79. package/src/get-final-base-sql/get-final-base-sql.js +28 -0
  80. package/src/get-final-base-sql/get-final-base-sql.js.map +1 -0
  81. package/{get-wrapped-base-query-with-projections → src/get-wrapped-base-query-with-projections}/get-aliased-columns-from-filters.js +39 -64
  82. package/src/get-wrapped-base-query-with-projections/get-aliased-columns-from-filters.js.map +1 -0
  83. package/src/get-wrapped-base-query-with-projections/get-projection-clause.js +83 -0
  84. package/src/get-wrapped-base-query-with-projections/get-projection-clause.js.map +1 -0
  85. package/src/get-wrapped-base-query-with-projections/get-wrapped-base-query-with-projections.js +32 -0
  86. package/src/get-wrapped-base-query-with-projections/get-wrapped-base-query-with-projections.js.map +1 -0
  87. package/src/get-wrapped-base-query-with-projections/sql-expression-modifiers.js +32 -0
  88. package/src/get-wrapped-base-query-with-projections/sql-expression-modifiers.js.map +1 -0
  89. package/src/index.js +37 -0
  90. package/src/index.js.map +1 -0
  91. package/src/joins/joins.js +162 -0
  92. package/src/joins/joins.js.map +1 -0
  93. package/src/member-formatters/constants.js +6 -0
  94. package/src/member-formatters/constants.js.map +1 -0
  95. package/src/member-formatters/index.js +10 -0
  96. package/src/member-formatters/index.js.map +1 -0
  97. package/src/member-formatters/member-key-to-safe-key.js +9 -0
  98. package/src/member-formatters/member-key-to-safe-key.js.map +1 -0
  99. package/src/member-formatters/split-into-data-source-and-fields.js +10 -0
  100. package/src/member-formatters/split-into-data-source-and-fields.js.map +1 -0
  101. package/src/resolution/resolution.js +112 -0
  102. package/src/resolution/resolution.js.map +1 -0
  103. package/src/resolution/types.js +5 -0
  104. package/src/resolution/types.js.map +1 -0
  105. package/src/types/cube-types/index.js +6 -0
  106. package/src/types/cube-types/index.js.map +1 -0
  107. package/src/types/cube-types/query.js +8 -0
  108. package/src/types/cube-types/query.js.map +1 -0
  109. package/src/types/cube-types/table.js +3 -0
  110. package/src/types/cube-types/table.js.map +1 -0
  111. package/src/types/duckdb-serialization-types/index.js +11 -0
  112. package/src/types/duckdb-serialization-types/index.js.map +1 -0
  113. package/{types → src/types}/duckdb-serialization-types/serialization/Constraint.js +6 -19
  114. package/src/types/duckdb-serialization-types/serialization/Constraint.js.map +1 -0
  115. package/{types → src/types}/duckdb-serialization-types/serialization/CreateInfo.js +10 -29
  116. package/src/types/duckdb-serialization-types/serialization/CreateInfo.js.map +1 -0
  117. package/{types → src/types}/duckdb-serialization-types/serialization/Expression.js +6 -19
  118. package/src/types/duckdb-serialization-types/serialization/Expression.js.map +1 -0
  119. package/src/types/duckdb-serialization-types/serialization/LogicalOperator.js +28 -0
  120. package/src/types/duckdb-serialization-types/serialization/LogicalOperator.js.map +1 -0
  121. package/src/types/duckdb-serialization-types/serialization/MacroFunction.js +10 -0
  122. package/src/types/duckdb-serialization-types/serialization/MacroFunction.js.map +1 -0
  123. package/src/types/duckdb-serialization-types/serialization/Misc.js +3 -0
  124. package/src/types/duckdb-serialization-types/serialization/Misc.js.map +1 -0
  125. package/{types → src/types}/duckdb-serialization-types/serialization/Nodes.js +17 -45
  126. package/src/types/duckdb-serialization-types/serialization/Nodes.js.map +1 -0
  127. package/{types → src/types}/duckdb-serialization-types/serialization/ParseInfo.js +20 -54
  128. package/src/types/duckdb-serialization-types/serialization/ParseInfo.js.map +1 -0
  129. package/{types → src/types}/duckdb-serialization-types/serialization/ParsedExpression.js +6 -19
  130. package/src/types/duckdb-serialization-types/serialization/ParsedExpression.js.map +1 -0
  131. package/{types → src/types}/duckdb-serialization-types/serialization/QueryNode.js +8 -24
  132. package/src/types/duckdb-serialization-types/serialization/QueryNode.js.map +1 -0
  133. package/{types → src/types}/duckdb-serialization-types/serialization/ResultModifier.js +4 -9
  134. package/src/types/duckdb-serialization-types/serialization/ResultModifier.js.map +1 -0
  135. package/src/types/duckdb-serialization-types/serialization/Statement.js +3 -0
  136. package/src/types/duckdb-serialization-types/serialization/Statement.js.map +1 -0
  137. package/{types → src/types}/duckdb-serialization-types/serialization/TableFilter.js +4 -9
  138. package/src/types/duckdb-serialization-types/serialization/TableFilter.js.map +1 -0
  139. package/{types → src/types}/duckdb-serialization-types/serialization/TableRef.js +8 -24
  140. package/src/types/duckdb-serialization-types/serialization/TableRef.js.map +1 -0
  141. package/{types → src/types}/duckdb-serialization-types/serialization/Types.js +4 -9
  142. package/src/types/duckdb-serialization-types/serialization/Types.js.map +1 -0
  143. package/src/types/duckdb-serialization-types/serialization/example.js +109 -0
  144. package/src/types/duckdb-serialization-types/serialization/example.js.map +1 -0
  145. package/src/types/utils.js +69 -0
  146. package/src/types/utils.js.map +1 -0
  147. package/{utils → src/utils}/__fixtures__/joins.fixtures.js +228 -316
  148. package/src/utils/__fixtures__/joins.fixtures.js.map +1 -0
  149. package/src/utils/base-ast.js +49 -0
  150. package/src/utils/base-ast.js.map +1 -0
  151. package/src/utils/cube-filter-enrichment.js +53 -0
  152. package/src/utils/cube-filter-enrichment.js.map +1 -0
  153. package/{utils → src/utils}/cube-to-table-schema.js +25 -38
  154. package/src/utils/cube-to-table-schema.js.map +1 -0
  155. package/src/utils/cube-type-to-duckdb-type.js +12 -0
  156. package/src/utils/cube-type-to-duckdb-type.js.map +1 -0
  157. package/src/utils/find-in-table-schema.js +28 -0
  158. package/src/utils/find-in-table-schema.js.map +1 -0
  159. package/src/utils/get-column-names-from-ast.js +45 -0
  160. package/src/utils/get-column-names-from-ast.js.map +1 -0
  161. package/src/utils/get-possible-nodes.js +146 -0
  162. package/src/utils/get-possible-nodes.js.map +1 -0
  163. package/src/utils/get-type-info.js +34 -0
  164. package/src/utils/get-type-info.js.map +1 -0
  165. package/src/utils/is-array-member-type.js +8 -0
  166. package/src/utils/is-array-member-type.js.map +1 -0
  167. package/src/utils/key-from-measures-dimension.js +32 -0
  168. package/src/utils/key-from-measures-dimension.js.map +1 -0
  169. package/src/utils/meerkat-placeholder-replacer.js +10 -0
  170. package/src/utils/meerkat-placeholder-replacer.js.map +1 -0
  171. package/src/utils/modify-meerkat-filter.js +24 -0
  172. package/src/utils/modify-meerkat-filter.js.map +1 -0
  173. package/{utils → src/utils}/type-guards.js +10 -28
  174. package/src/utils/type-guards.js.map +1 -0
  175. package/ast-builder/ast-builder.js +0 -90
  176. package/ast-builder/ast-builder.js.map +0 -1
  177. package/ast-deserializer/ast-deserializer.js +0 -30
  178. package/ast-deserializer/ast-deserializer.js.map +0 -1
  179. package/ast-serializer/ast-serializer.js +0 -12
  180. package/ast-serializer/ast-serializer.js.map +0 -1
  181. package/ast-validator/dimension-validator.js +0 -54
  182. package/ast-validator/dimension-validator.js.map +0 -1
  183. package/ast-validator/index.js +0 -25
  184. package/ast-validator/index.js.map +0 -1
  185. package/ast-validator/measure-validator.js +0 -163
  186. package/ast-validator/measure-validator.js.map +0 -1
  187. package/ast-validator/tests/test-data.js.map +0 -1
  188. package/ast-validator/types.js +0 -3
  189. package/ast-validator/types.js.map +0 -1
  190. package/ast-validator/utils.js +0 -35
  191. package/ast-validator/utils.js.map +0 -1
  192. package/context-params/context-params-ast.js +0 -55
  193. package/context-params/context-params-ast.js.map +0 -1
  194. package/cube-filter-transformer/and/and.js +0 -18
  195. package/cube-filter-transformer/and/and.js.map +0 -1
  196. package/cube-filter-transformer/base-condition-builder/base-condition-builder.js +0 -160
  197. package/cube-filter-transformer/base-condition-builder/base-condition-builder.js.map +0 -1
  198. package/cube-filter-transformer/contains/contains.js +0 -71
  199. package/cube-filter-transformer/contains/contains.js.map +0 -1
  200. package/cube-filter-transformer/equals/equals-array.js +0 -77
  201. package/cube-filter-transformer/equals/equals-array.js.map +0 -1
  202. package/cube-filter-transformer/equals/equals.js +0 -37
  203. package/cube-filter-transformer/equals/equals.js.map +0 -1
  204. package/cube-filter-transformer/factory.js +0 -124
  205. package/cube-filter-transformer/factory.js.map +0 -1
  206. package/cube-filter-transformer/gt/gt.js +0 -30
  207. package/cube-filter-transformer/gt/gt.js.map +0 -1
  208. package/cube-filter-transformer/gte/gte.js +0 -30
  209. package/cube-filter-transformer/gte/gte.js.map +0 -1
  210. package/cube-filter-transformer/in/in.js +0 -78
  211. package/cube-filter-transformer/in/in.js.map +0 -1
  212. package/cube-filter-transformer/in-date-range/in-date-range.js +0 -24
  213. package/cube-filter-transformer/in-date-range/in-date-range.js.map +0 -1
  214. package/cube-filter-transformer/lt/lt.js +0 -30
  215. package/cube-filter-transformer/lt/lt.js.map +0 -1
  216. package/cube-filter-transformer/lte/lte.js +0 -30
  217. package/cube-filter-transformer/lte/lte.js.map +0 -1
  218. package/cube-filter-transformer/not/not.js +0 -18
  219. package/cube-filter-transformer/not/not.js.map +0 -1
  220. package/cube-filter-transformer/not-In-date-range/not-In-date-range.js +0 -24
  221. package/cube-filter-transformer/not-In-date-range/not-In-date-range.js.map +0 -1
  222. package/cube-filter-transformer/not-contains/not-contains.js +0 -71
  223. package/cube-filter-transformer/not-contains/not-contains.js.map +0 -1
  224. package/cube-filter-transformer/not-equals/not-equals-array.js +0 -26
  225. package/cube-filter-transformer/not-equals/not-equals-array.js.map +0 -1
  226. package/cube-filter-transformer/not-equals/not-equals.js +0 -37
  227. package/cube-filter-transformer/not-equals/not-equals.js.map +0 -1
  228. package/cube-filter-transformer/not-in/not-in.js +0 -85
  229. package/cube-filter-transformer/not-in/not-in.js.map +0 -1
  230. package/cube-filter-transformer/not-set/not-set.js +0 -27
  231. package/cube-filter-transformer/not-set/not-set.js.map +0 -1
  232. package/cube-filter-transformer/or/or.js +0 -18
  233. package/cube-filter-transformer/or/or.js.map +0 -1
  234. package/cube-filter-transformer/set/set.js +0 -27
  235. package/cube-filter-transformer/set/set.js.map +0 -1
  236. package/cube-group-by-transformer/cube-group-by-transformer.js +0 -25
  237. package/cube-group-by-transformer/cube-group-by-transformer.js.map +0 -1
  238. package/cube-limit-offset-transformer/cube-limit-offset-transformer.js +0 -42
  239. package/cube-limit-offset-transformer/cube-limit-offset-transformer.js.map +0 -1
  240. package/cube-measure-transformer/cube-measure-transformer.js +0 -127
  241. package/cube-measure-transformer/cube-measure-transformer.js.map +0 -1
  242. package/cube-order-by-transformer/cube-order-by-transformer.js +0 -39
  243. package/cube-order-by-transformer/cube-order-by-transformer.js.map +0 -1
  244. package/cube-to-duckdb/cube-filter-to-duckdb.js +0 -3
  245. package/cube-to-duckdb/cube-filter-to-duckdb.js.map +0 -1
  246. package/filter-params/filter-params-ast.js +0 -115
  247. package/filter-params/filter-params-ast.js.map +0 -1
  248. package/get-filter-params-sql/get-filter-params-sql.js +0 -28
  249. package/get-filter-params-sql/get-filter-params-sql.js.map +0 -1
  250. package/get-final-base-sql/get-final-base-sql.js +0 -30
  251. package/get-final-base-sql/get-final-base-sql.js.map +0 -1
  252. package/get-wrapped-base-query-with-projections/get-aliased-columns-from-filters.js.map +0 -1
  253. package/get-wrapped-base-query-with-projections/get-projection-clause.js +0 -87
  254. package/get-wrapped-base-query-with-projections/get-projection-clause.js.map +0 -1
  255. package/get-wrapped-base-query-with-projections/get-wrapped-base-query-with-projections.js +0 -33
  256. package/get-wrapped-base-query-with-projections/get-wrapped-base-query-with-projections.js.map +0 -1
  257. package/get-wrapped-base-query-with-projections/sql-expression-modifiers.js +0 -60
  258. package/get-wrapped-base-query-with-projections/sql-expression-modifiers.js.map +0 -1
  259. package/index.js +0 -66
  260. package/index.js.map +0 -1
  261. package/joins/joins.js +0 -170
  262. package/joins/joins.js.map +0 -1
  263. package/member-formatters/constants.js +0 -19
  264. package/member-formatters/constants.js.map +0 -1
  265. package/member-formatters/index.js +0 -23
  266. package/member-formatters/index.js.map +0 -1
  267. package/member-formatters/member-key-to-safe-key.js +0 -13
  268. package/member-formatters/member-key-to-safe-key.js.map +0 -1
  269. package/member-formatters/split-into-data-source-and-fields.js +0 -17
  270. package/member-formatters/split-into-data-source-and-fields.js.map +0 -1
  271. package/resolution/resolution.js +0 -128
  272. package/resolution/resolution.js.map +0 -1
  273. package/resolution/types.js +0 -10
  274. package/resolution/types.js.map +0 -1
  275. package/types/cube-types/index.d.js +0 -6
  276. package/types/cube-types/index.d.js.map +0 -1
  277. package/types/cube-types/index.js +0 -6
  278. package/types/cube-types/index.js.map +0 -1
  279. package/types/cube-types/query.d.js +0 -5
  280. package/types/cube-types/query.d.js.map +0 -1
  281. package/types/cube-types/query.js +0 -14
  282. package/types/cube-types/query.js.map +0 -1
  283. package/types/cube-types/table.d.js +0 -3
  284. package/types/cube-types/table.d.js.map +0 -1
  285. package/types/cube-types/table.js +0 -3
  286. package/types/cube-types/table.js.map +0 -1
  287. package/types/duckdb-serialization-types/index.d.js +0 -11
  288. package/types/duckdb-serialization-types/index.d.js.map +0 -1
  289. package/types/duckdb-serialization-types/index.js +0 -11
  290. package/types/duckdb-serialization-types/index.js.map +0 -1
  291. package/types/duckdb-serialization-types/serialization/Constraint.js.map +0 -1
  292. package/types/duckdb-serialization-types/serialization/CreateInfo.js.map +0 -1
  293. package/types/duckdb-serialization-types/serialization/Expression.d.js +0 -3
  294. package/types/duckdb-serialization-types/serialization/Expression.d.js.map +0 -1
  295. package/types/duckdb-serialization-types/serialization/Expression.js.map +0 -1
  296. package/types/duckdb-serialization-types/serialization/LogicalOperator.js +0 -47
  297. package/types/duckdb-serialization-types/serialization/LogicalOperator.js.map +0 -1
  298. package/types/duckdb-serialization-types/serialization/MacroFunction.js +0 -15
  299. package/types/duckdb-serialization-types/serialization/MacroFunction.js.map +0 -1
  300. package/types/duckdb-serialization-types/serialization/Misc.d.js +0 -3
  301. package/types/duckdb-serialization-types/serialization/Misc.d.js.map +0 -1
  302. package/types/duckdb-serialization-types/serialization/Misc.js +0 -3
  303. package/types/duckdb-serialization-types/serialization/Misc.js.map +0 -1
  304. package/types/duckdb-serialization-types/serialization/Nodes.d.js +0 -3
  305. package/types/duckdb-serialization-types/serialization/Nodes.d.js.map +0 -1
  306. package/types/duckdb-serialization-types/serialization/Nodes.js.map +0 -1
  307. package/types/duckdb-serialization-types/serialization/ParseInfo.js.map +0 -1
  308. package/types/duckdb-serialization-types/serialization/ParsedExpression.d.js +0 -3
  309. package/types/duckdb-serialization-types/serialization/ParsedExpression.d.js.map +0 -1
  310. package/types/duckdb-serialization-types/serialization/ParsedExpression.js.map +0 -1
  311. package/types/duckdb-serialization-types/serialization/QueryNode.d.js +0 -3
  312. package/types/duckdb-serialization-types/serialization/QueryNode.d.js.map +0 -1
  313. package/types/duckdb-serialization-types/serialization/QueryNode.js.map +0 -1
  314. package/types/duckdb-serialization-types/serialization/ResultModifier.d.js +0 -3
  315. package/types/duckdb-serialization-types/serialization/ResultModifier.d.js.map +0 -1
  316. package/types/duckdb-serialization-types/serialization/ResultModifier.js.map +0 -1
  317. package/types/duckdb-serialization-types/serialization/Statement.d.js +0 -3
  318. package/types/duckdb-serialization-types/serialization/Statement.d.js.map +0 -1
  319. package/types/duckdb-serialization-types/serialization/Statement.js +0 -3
  320. package/types/duckdb-serialization-types/serialization/Statement.js.map +0 -1
  321. package/types/duckdb-serialization-types/serialization/TableFilter.d.js +0 -3
  322. package/types/duckdb-serialization-types/serialization/TableFilter.d.js.map +0 -1
  323. package/types/duckdb-serialization-types/serialization/TableFilter.js.map +0 -1
  324. package/types/duckdb-serialization-types/serialization/TableRef.d.js +0 -3
  325. package/types/duckdb-serialization-types/serialization/TableRef.d.js.map +0 -1
  326. package/types/duckdb-serialization-types/serialization/TableRef.js.map +0 -1
  327. package/types/duckdb-serialization-types/serialization/Types.d.js +0 -3
  328. package/types/duckdb-serialization-types/serialization/Types.d.js.map +0 -1
  329. package/types/duckdb-serialization-types/serialization/Types.js.map +0 -1
  330. package/types/duckdb-serialization-types/serialization/example.js +0 -131
  331. package/types/duckdb-serialization-types/serialization/example.js.map +0 -1
  332. package/types/utils.js +0 -108
  333. package/types/utils.js.map +0 -1
  334. package/utils/__fixtures__/joins.fixtures.js.map +0 -1
  335. package/utils/base-ast.js +0 -63
  336. package/utils/base-ast.js.map +0 -1
  337. package/utils/cube-filter-enrichment.js +0 -63
  338. package/utils/cube-filter-enrichment.js.map +0 -1
  339. package/utils/cube-to-table-schema.js.map +0 -1
  340. package/utils/cube-type-to-duckdb-type.js +0 -17
  341. package/utils/cube-type-to-duckdb-type.js.map +0 -1
  342. package/utils/find-in-table-schema.js +0 -40
  343. package/utils/find-in-table-schema.js.map +0 -1
  344. package/utils/get-column-names-from-ast.js +0 -45
  345. package/utils/get-column-names-from-ast.js.map +0 -1
  346. package/utils/get-possible-nodes.js +0 -152
  347. package/utils/get-possible-nodes.js.map +0 -1
  348. package/utils/get-type-info.js +0 -44
  349. package/utils/get-type-info.js.map +0 -1
  350. package/utils/is-array-member-type.js +0 -12
  351. package/utils/is-array-member-type.js.map +0 -1
  352. package/utils/key-from-measures-dimension.js +0 -35
  353. package/utils/key-from-measures-dimension.js.map +0 -1
  354. package/utils/meerkat-placeholder-replacer.js +0 -14
  355. package/utils/meerkat-placeholder-replacer.js.map +0 -1
  356. package/utils/modify-meerkat-filter.js +0 -30
  357. package/utils/modify-meerkat-filter.js.map +0 -1
  358. package/utils/type-guards.js.map +0 -1
package/README.md CHANGED
@@ -1,11 +1,75 @@
1
- # meerkat-core
1
+ # @devrev/meerkat-core
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ `@devrev/meerkat-core` is the foundational library for the Meerkat ecosystem, a TypeScript SDK that seamlessly translates Cube-like queries into DuckDB Abstract Syntax Trees (AST). It provides the core logic for query transformation, designed to be environment-agnostic, running in both Node.js and browser environments.
4
4
 
5
- ## Building
5
+ This package focuses exclusively on generating a DuckDB-compatible AST from a JSON-based query object. It does not handle query execution, which is the responsibility of environment-specific packages like `@devrev/meerkat-node` and `@devrev/meerkat-browser`.
6
6
 
7
- Run `nx build meerkat-core` to build the library.
7
+ ## Key Features
8
8
 
9
- ## Running unit tests
9
+ - **Cube-to-AST Transformation**: Converts Cube-style JSON queries into DuckDB-compatible SQL ASTs.
10
+ - **Environment Agnostic**: Runs in both Node.js and browser environments.
11
+ - **Type-Safe**: Provides strong TypeScript definitions for queries, schemas, and filters.
12
+ - **Advanced Filtering and Joins**: Supports complex filters, logical operators, and multi-table joins.
13
+ - **Extensible by Design**: Leverages DuckDB's native JSON serialization, avoiding the limitations of traditional query builders.
10
14
 
11
- Run `nx test meerkat-core` to execute the unit tests via [Jest](https://jestjs.io).
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @devrev/meerkat-core
19
+ ```
20
+
21
+ ## Core Concepts
22
+
23
+ `meerkat-core` revolves around two main objects:
24
+
25
+ 1. **`Query`**: A JSON object that defines your analytics request. It specifies measures, dimensions, filters, and ordering.
26
+ 2. **`TableSchema`**: Defines the structure of your data tables, including columns, measures, dimensions, and joins.
27
+
28
+ The library uses these objects to generate a DuckDB AST. This AST can then be passed to an execution engine.
29
+
30
+ ## Usage
31
+
32
+ Here's how to transform a Cube-style query into a DuckDB AST:
33
+
34
+ ```typescript
35
+ import { cubeToDuckdbAST, Query, TableSchema } from '@devrev/meerkat-core';
36
+
37
+ // 1. Define the schema for your table
38
+ const schema: TableSchema = {
39
+ name: 'users',
40
+ sql: 'SELECT * FROM users',
41
+ columns: [
42
+ { name: 'id', type: 'INTEGER' },
43
+ { name: 'name', type: 'VARCHAR' },
44
+ { name: 'city', type: 'VARCHAR' },
45
+ { name: 'signed_up_at', type: 'TIMESTAMP' },
46
+ ],
47
+ };
48
+
49
+ // 2. Define your query
50
+ const query: Query = {
51
+ measures: ['users.count'],
52
+ dimensions: ['users.city'],
53
+ filters: [
54
+ {
55
+ member: 'users.city',
56
+ operator: 'equals',
57
+ values: ['New York'],
58
+ },
59
+ ],
60
+ limit: 100,
61
+ };
62
+
63
+ // 3. Generate the DuckDB AST
64
+ const ast = cubeToDuckdbAST(query, schema);
65
+
66
+ // The `ast` can now be deserialized into a SQL string for execution.
67
+ console.log(JSON.stringify(ast, null, 2));
68
+ ```
69
+
70
+ ## Ecosystem
71
+
72
+ `meerkat-core` is the foundation for:
73
+
74
+ - **`@devrev/meerkat-node`**: For server-side analytics in Node.js with `@duckdb/node-api`.
75
+ - **`@devrev/meerkat-browser`**: For client-side analytics in the browser with `@duckdb/duckdb-wasm`.
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@devrev/meerkat-core",
3
- "version": "0.0.96",
3
+ "version": "0.0.98",
4
4
  "dependencies": {
5
- "@swc/helpers": "~0.5.0"
5
+ "tslib": "^2.3.0"
6
6
  },
7
7
  "scripts": {
8
8
  "release": "semantic-release"
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cubeToDuckdbAST = void 0;
4
+ const factory_1 = require("../cube-filter-transformer/factory");
5
+ const cube_group_by_transformer_1 = require("../cube-group-by-transformer/cube-group-by-transformer");
6
+ const cube_limit_offset_transformer_1 = require("../cube-limit-offset-transformer/cube-limit-offset-transformer");
7
+ const cube_order_by_transformer_1 = require("../cube-order-by-transformer/cube-order-by-transformer");
8
+ const filter_params_ast_1 = require("../filter-params/filter-params-ast");
9
+ const member_key_to_safe_key_1 = require("../member-formatters/member-key-to-safe-key");
10
+ const base_ast_1 = require("../utils/base-ast");
11
+ const cube_filter_enrichment_1 = require("../utils/cube-filter-enrichment");
12
+ const modify_meerkat_filter_1 = require("../utils/modify-meerkat-filter");
13
+ const formatFilters = (queryFiltersWithInfo, filterType) => {
14
+ /*
15
+ * If the type of filter is set to base filter where
16
+ */
17
+ return filterType === 'BASE_FILTER'
18
+ ? queryFiltersWithInfo
19
+ : (0, modify_meerkat_filter_1.modifyLeafMeerkatFilter)(queryFiltersWithInfo, (item) => {
20
+ return Object.assign(Object.assign({}, item), { member: (0, member_key_to_safe_key_1.memberKeyToSafeKey)(item.member) });
21
+ });
22
+ };
23
+ const getFormattedFilters = ({ queryFiltersWithInfo, filterType, mapperFn, baseAST, }) => {
24
+ const filters = queryFiltersWithInfo
25
+ .map((item) => mapperFn(item))
26
+ .filter(Boolean);
27
+ const formattedFilters = formatFilters(filters, filterType);
28
+ return (0, factory_1.cubeFilterToDuckdbAST)(formattedFilters, baseAST);
29
+ };
30
+ const cubeToDuckdbAST = (query, tableSchema, options) => {
31
+ var _a;
32
+ /**
33
+ * Obviously, if no table schema was found, return null.
34
+ */
35
+ if (!tableSchema) {
36
+ return null;
37
+ }
38
+ const baseAST = (0, base_ast_1.getBaseAST)();
39
+ const node = baseAST.node;
40
+ if (query.filters && query.filters.length > 0) {
41
+ /**
42
+ * Make a copy of the query filters and enrich them with the table schema.
43
+ */
44
+ const queryFiltersWithInfo = (0, cube_filter_enrichment_1.cubeFiltersEnrichment)(JSON.parse(JSON.stringify(query.filters)), tableSchema);
45
+ if (!queryFiltersWithInfo) {
46
+ return null;
47
+ }
48
+ const whereClause = getFormattedFilters({
49
+ baseAST,
50
+ mapperFn: (item) => (0, filter_params_ast_1.traverseAndFilter)(item, (value) => !query.measures.includes(value.member)),
51
+ queryFiltersWithInfo,
52
+ filterType: options === null || options === void 0 ? void 0 : options.filterType,
53
+ });
54
+ const havingClause = getFormattedFilters({
55
+ baseAST,
56
+ mapperFn: (item) => (0, filter_params_ast_1.traverseAndFilter)(item, (value) => query.measures.includes(value.member)),
57
+ queryFiltersWithInfo,
58
+ filterType: options === null || options === void 0 ? void 0 : options.filterType,
59
+ });
60
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
61
+ //@ts-ignore
62
+ node.where_clause = whereClause;
63
+ node.having = havingClause;
64
+ }
65
+ if (query.measures.length &&
66
+ query.dimensions &&
67
+ ((_a = query.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0) {
68
+ node.group_expressions = (0, cube_group_by_transformer_1.cubeDimensionToGroupByAST)(query.dimensions);
69
+ const groupSets = [];
70
+ /**
71
+ * We only support one group set for now.
72
+ */
73
+ for (let i = 0; i < node.group_expressions.length; i++) {
74
+ groupSets.push(i);
75
+ }
76
+ node.group_sets = [groupSets];
77
+ }
78
+ node.modifiers = [];
79
+ if (query.order && Object.keys(query.order).length > 0) {
80
+ node.modifiers.push((0, cube_order_by_transformer_1.cubeOrderByToAST)(query.order));
81
+ }
82
+ if (query.limit || query.offset) {
83
+ // Type assertion is needed here because the AST is not typed correctly.
84
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
85
+ //@ts-ignore
86
+ node.modifiers.push((0, cube_limit_offset_transformer_1.cubeLimitOffsetToAST)(query.limit, query.offset));
87
+ }
88
+ return baseAST;
89
+ };
90
+ exports.cubeToDuckdbAST = cubeToDuckdbAST;
91
+ //# sourceMappingURL=ast-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-builder.js","sourceRoot":"","sources":["../../../../meerkat-core/src/ast-builder/ast-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserializeQuery = exports.astDeserializerQuery = void 0;
4
+ const astDeserializerQuery = (ast) => {
5
+ return `SELECT json_deserialize_sql('${JSON.stringify({
6
+ statements: [ast],
7
+ })}');`;
8
+ };
9
+ exports.astDeserializerQuery = astDeserializerQuery;
10
+ const deserializeQuery = (queryOutput) => {
11
+ const deserializeObj = queryOutput[0];
12
+ const deserializeKey = Object.keys(deserializeObj)[0];
13
+ const deserializeQuery = deserializeObj[deserializeKey];
14
+ return deserializeQuery;
15
+ };
16
+ exports.deserializeQuery = deserializeQuery;
17
+ //# sourceMappingURL=ast-deserializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-deserializer.js","sourceRoot":"","sources":["../../../../meerkat-core/src/ast-deserializer/ast-deserializer.ts"],"names":[],"mappings":";;;AAEO,MAAM,oBAAoB,GAAG,CAAC,GAAoB,EAAE,EAAE;IAC3D,OAAO,gCAAgC,IAAI,CAAC,SAAS,CAAC;QACpD,UAAU,EAAE,CAAC,GAAG,CAAC;KAClB,CAAC,KAAK,CAAC;AACV,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B;AAEK,MAAM,gBAAgB,GAAG,CAC9B,WAEG,EACH,EAAE;IACF,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACxD,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AATW,QAAA,gBAAgB,oBAS3B"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.astSerializerQuery = void 0;
4
+ const astSerializerQuery = (query) => {
5
+ return `SELECT json_serialize_sql('${query}')`;
6
+ };
7
+ exports.astSerializerQuery = astSerializerQuery;
8
+ //# sourceMappingURL=ast-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-serializer.js","sourceRoot":"","sources":["../../../../meerkat-core/src/ast-serializer/ast-serializer.ts"],"names":[],"mappings":";;;AAAO,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE;IAClD,OAAO,8BAA8B,KAAK,IAAI,CAAC;AACjD,CAAC,CAAC;AAFW,QAAA,kBAAkB,sBAE7B"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateDimension = exports.validateExpressionNode = void 0;
4
+ const utils_1 = require("../types/utils");
5
+ const utils_2 = require("./utils");
6
+ /**
7
+ * Validates an individual expression node
8
+ */
9
+ const validateExpressionNode = (node, validFunctions) => {
10
+ // Column references and value constants
11
+ if ((0, utils_1.isColumnRefExpression)(node) || (0, utils_1.isConstantExpression)(node)) {
12
+ return true;
13
+ }
14
+ // Cast expression
15
+ if ((0, utils_1.isCastExpression)(node)) {
16
+ return (0, exports.validateExpressionNode)(node.child, validFunctions);
17
+ }
18
+ // Operator expression
19
+ if ((0, utils_1.isOperatorExpression)(node)) {
20
+ return node.children.every((child) => (0, exports.validateExpressionNode)(child, validFunctions));
21
+ }
22
+ // Function expression
23
+ if ((0, utils_1.isFunctionExpression)(node)) {
24
+ if (!validFunctions.has(node.function_name)) {
25
+ throw new Error(`Invalid function: ${node.function_name}`);
26
+ }
27
+ return node.children.every((child) => (0, exports.validateExpressionNode)(child, validFunctions));
28
+ }
29
+ // Case expression
30
+ if ((0, utils_1.isCaseExpression)(node)) {
31
+ return (node.case_checks.every((check) => (0, exports.validateExpressionNode)(check.then_expr, validFunctions)) && (0, exports.validateExpressionNode)(node.else_expr, validFunctions));
32
+ }
33
+ throw new Error(`Invalid expression type: ${node.type}`);
34
+ };
35
+ exports.validateExpressionNode = validateExpressionNode;
36
+ /**
37
+ * Validates if the parsed serialization represents a valid dimension
38
+ */
39
+ const validateDimension = (parsedSerialization, validFunctions) => {
40
+ const node = (0, utils_2.getSelectNode)(parsedSerialization);
41
+ const validFunctionSet = new Set(validFunctions);
42
+ // Validate the expression
43
+ if ((0, exports.validateExpressionNode)(node, validFunctionSet)) {
44
+ return true;
45
+ }
46
+ throw new Error('Expression contains invalid functions or operators');
47
+ };
48
+ exports.validateDimension = validateDimension;
49
+ //# sourceMappingURL=dimension-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-validator.js","sourceRoot":"","sources":["../../../../meerkat-core/src/ast-validator/dimension-validator.ts"],"names":[],"mappings":";;;AACA,0CAOwB;AAExB,mCAAwC;AAExC;;GAEG;AACI,MAAM,sBAAsB,GAAG,CACpC,IAAsB,EACtB,cAA2B,EAClB,EAAE;IACX,wCAAwC;IACxC,IAAI,IAAA,6BAAqB,EAAC,IAAI,CAAC,IAAI,IAAA,4BAAoB,EAAC,IAAI,CAAC,EAAE;QAC7D,OAAO,IAAI,CAAC;KACb;IAED,kBAAkB;IAClB,IAAI,IAAA,wBAAgB,EAAC,IAAI,CAAC,EAAE;QAC1B,OAAO,IAAA,8BAAsB,EAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;KAC3D;IAED,sBAAsB;IACtB,IAAI,IAAA,4BAAoB,EAAC,IAAI,CAAC,EAAE;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACnC,IAAA,8BAAsB,EAAC,KAAK,EAAE,cAAc,CAAC,CAC9C,CAAC;KACH;IAED,sBAAsB;IACtB,IAAI,IAAA,4BAAoB,EAAC,IAAI,CAAC,EAAE;QAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC3C,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;SAC5D;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACnC,IAAA,8BAAsB,EAAC,KAAK,EAAE,cAAc,CAAC,CAC9C,CAAC;KACH;IAED,kBAAkB;IAClB,IAAI,IAAA,wBAAgB,EAAC,IAAI,CAAC,EAAE;QAC1B,OAAO,CACL,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/B,IAAA,8BAAsB,EAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CACxD,IAAI,IAAA,8BAAsB,EAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAC5D,CAAC;KACH;IAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC;AAzCW,QAAA,sBAAsB,0BAyCjC;AAEF;;GAEG;AACI,MAAM,iBAAiB,GAAG,CAC/B,mBAAwC,EACxC,cAAwB,EACf,EAAE;IACX,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,mBAAmB,CAAC,CAAC;IAEhD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAEjD,0BAA0B;IAC1B,IAAI,IAAA,8BAAsB,EAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE;QAClD,OAAO,IAAI,CAAC;KACb;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSelectNode = exports.validateMeasure = exports.validateDimension = void 0;
4
+ const tslib_1 = require("tslib");
5
+ var dimension_validator_1 = require("./dimension-validator");
6
+ Object.defineProperty(exports, "validateDimension", { enumerable: true, get: function () { return dimension_validator_1.validateDimension; } });
7
+ var measure_validator_1 = require("./measure-validator");
8
+ Object.defineProperty(exports, "validateMeasure", { enumerable: true, get: function () { return measure_validator_1.validateMeasure; } });
9
+ tslib_1.__exportStar(require("./types"), exports);
10
+ var utils_1 = require("./utils");
11
+ Object.defineProperty(exports, "getSelectNode", { enumerable: true, get: function () { return utils_1.getSelectNode; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../meerkat-core/src/ast-validator/index.ts"],"names":[],"mappings":";;;;AAAA,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,yDAAsD;AAA7C,oHAAA,eAAe,OAAA;AACxB,kDAAwB;AACxB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateMeasure = exports.containsAggregation = exports.validateExpressionNode = void 0;
4
+ const utils_1 = require("../types/utils");
5
+ const utils_2 = require("./utils");
6
+ const validateExpressionNode = ({ node, validFunctions, parentNode, validScalarFunctions, hasAggregation = false, }) => {
7
+ // Base cases for column references and constants
8
+ if ((0, utils_1.isColumnRefExpression)(node) || (0, utils_1.isConstantExpression)(node)) {
9
+ // Allow column references inside aggregation functions
10
+ return !!parentNode;
11
+ }
12
+ // Check for valid aggregation functions
13
+ if ((0, utils_1.isFunctionExpression)(node) || (0, utils_1.isWindowExpression)(node)) {
14
+ // count_star don't have children
15
+ if (node.function_name === 'count_star')
16
+ return true;
17
+ // This is a valid aggregation function - verify its children don't contain nested aggregations
18
+ if (validFunctions.has(node.function_name)) {
19
+ return node.children.some((child) => (0, exports.validateExpressionNode)({
20
+ node: child,
21
+ validFunctions,
22
+ parentNode: node,
23
+ validScalarFunctions,
24
+ hasAggregation: true,
25
+ }));
26
+ }
27
+ // For non-aggregation functions
28
+ if (validScalarFunctions.has(node.function_name)) {
29
+ return node.children.some((child) => {
30
+ return ((0, exports.validateExpressionNode)({
31
+ node: child,
32
+ validFunctions,
33
+ parentNode: node,
34
+ validScalarFunctions,
35
+ }) &&
36
+ ((0, exports.containsAggregation)(child, validFunctions) || hasAggregation));
37
+ });
38
+ }
39
+ throw new Error(`Invalid function type: ${node.function_name}`);
40
+ }
41
+ // Operator expression
42
+ if ((0, utils_1.isOperatorExpression)(node)) {
43
+ return node.children.some((child) => (0, exports.validateExpressionNode)({
44
+ node: child,
45
+ validFunctions,
46
+ parentNode,
47
+ validScalarFunctions,
48
+ }));
49
+ }
50
+ // Cast expression
51
+ if ((0, utils_1.isCastExpression)(node)) {
52
+ return (0, exports.validateExpressionNode)({
53
+ node: node.child,
54
+ validFunctions,
55
+ parentNode,
56
+ validScalarFunctions,
57
+ });
58
+ }
59
+ // Case expression
60
+ if ((0, utils_1.isCaseExpression)(node)) {
61
+ const checksValid = node.case_checks.every((caseCheck) => {
62
+ // WHEN conditions cannot contain aggregations
63
+ const whenValid = !(0, exports.containsAggregation)(caseCheck.when_expr, validFunctions);
64
+ // THEN expressions must be valid aggregations or contain no aggregations
65
+ const thenValid = (0, exports.validateExpressionNode)({
66
+ node: caseCheck.then_expr,
67
+ validFunctions,
68
+ parentNode: node,
69
+ validScalarFunctions,
70
+ }) || !(0, exports.containsAggregation)(caseCheck.then_expr, validFunctions);
71
+ return whenValid && thenValid;
72
+ });
73
+ const elseValid = (0, exports.validateExpressionNode)({
74
+ node: node.else_expr,
75
+ validFunctions,
76
+ parentNode: node,
77
+ validScalarFunctions,
78
+ }) || !(0, exports.containsAggregation)(node.else_expr, validFunctions);
79
+ return checksValid && elseValid;
80
+ }
81
+ // Subquery expression
82
+ if ((0, utils_1.isSubqueryExpression)(node) && (0, utils_1.isSelectNode)(node.subquery.node)) {
83
+ return node.subquery.node.select_list.every((node) => {
84
+ return (0, exports.validateExpressionNode)({
85
+ node,
86
+ validFunctions,
87
+ parentNode,
88
+ validScalarFunctions,
89
+ });
90
+ });
91
+ }
92
+ // Window expression
93
+ if ((0, utils_1.isWindowExpression)(node)) {
94
+ return node.children.every((node) => {
95
+ return (0, exports.validateExpressionNode)({
96
+ node,
97
+ validFunctions,
98
+ parentNode,
99
+ validScalarFunctions,
100
+ });
101
+ });
102
+ }
103
+ throw new Error(`Invalid expression type: ${node.type}`);
104
+ };
105
+ exports.validateExpressionNode = validateExpressionNode;
106
+ const containsAggregation = (node, validFunctions) => {
107
+ if (!node)
108
+ return false;
109
+ // Function expression
110
+ if ((0, utils_1.isFunctionExpression)(node) || (0, utils_1.isWindowExpression)(node)) {
111
+ return (validFunctions.has(node.function_name) ||
112
+ node.children.some((child) => (0, exports.containsAggregation)(child, validFunctions)));
113
+ }
114
+ // Case expression
115
+ if ((0, utils_1.isCaseExpression)(node)) {
116
+ return (node.case_checks.some((check) => (0, exports.containsAggregation)(check.when_expr, validFunctions) ||
117
+ (0, exports.containsAggregation)(check.then_expr, validFunctions)) || (0, exports.containsAggregation)(node.else_expr, validFunctions));
118
+ }
119
+ // Operator expression
120
+ if ((0, utils_1.isOperatorExpression)(node)) {
121
+ return node.children.some((child) => (0, exports.containsAggregation)(child, validFunctions));
122
+ }
123
+ if ((0, utils_1.isCastExpression)(node)) {
124
+ return (0, exports.containsAggregation)(node.child, validFunctions);
125
+ }
126
+ // Window expression
127
+ if ((0, utils_1.isWindowExpression)(node)) {
128
+ return node.children.some((child) => (0, exports.containsAggregation)(child, validFunctions));
129
+ }
130
+ // Subquery expression
131
+ if ((0, utils_1.isSubqueryExpression)(node) && (0, utils_1.isSelectNode)(node.subquery.node)) {
132
+ return node.subquery.node.select_list.every((node) => {
133
+ return (0, exports.containsAggregation)(node, validFunctions);
134
+ });
135
+ }
136
+ return false;
137
+ };
138
+ exports.containsAggregation = containsAggregation;
139
+ const validateMeasure = (parsedSerialization, validFunctions, validScalarFunctions) => {
140
+ const node = (0, utils_2.getSelectNode)(parsedSerialization);
141
+ const validFunctionSet = new Set(validFunctions);
142
+ const validScalarFunctionSet = new Set(validScalarFunctions);
143
+ // Validate the expression
144
+ if ((0, exports.validateExpressionNode)({
145
+ node: node,
146
+ validFunctions: validFunctionSet,
147
+ parentNode: null,
148
+ validScalarFunctions: validScalarFunctionSet,
149
+ })) {
150
+ return true;
151
+ }
152
+ throw new Error('Expression contains invalid functions or operators');
153
+ };
154
+ exports.validateMeasure = validateMeasure;
155
+ //# sourceMappingURL=measure-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-validator.js","sourceRoot":"","sources":["../../../../meerkat-core/src/ast-validator/measure-validator.ts"],"names":[],"mappings":"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"}