@uwdata/mosaic-sql 0.16.2 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +0 -2
  3. package/dist/src/ast/aggregate.d.ts +82 -0
  4. package/dist/src/ast/aggregate.d.ts.map +1 -0
  5. package/dist/src/ast/aggregate.js +180 -0
  6. package/dist/src/ast/aggregate.js.map +1 -0
  7. package/dist/src/ast/between-op.d.ts +46 -0
  8. package/dist/src/ast/between-op.d.ts.map +1 -0
  9. package/dist/src/ast/between-op.js +60 -0
  10. package/dist/src/ast/between-op.js.map +1 -0
  11. package/dist/src/ast/binary-op.d.ts +21 -0
  12. package/dist/src/ast/binary-op.d.ts.map +1 -0
  13. package/dist/src/ast/binary-op.js +29 -0
  14. package/dist/src/ast/binary-op.js.map +1 -0
  15. package/dist/src/ast/case.d.ts +53 -0
  16. package/dist/src/ast/case.d.ts.map +1 -0
  17. package/dist/src/ast/case.js +75 -0
  18. package/dist/src/ast/case.js.map +1 -0
  19. package/dist/src/ast/cast.d.ts +18 -0
  20. package/dist/src/ast/cast.d.ts.map +1 -0
  21. package/dist/src/ast/cast.js +26 -0
  22. package/dist/src/ast/cast.js.map +1 -0
  23. package/dist/src/ast/collate.d.ts +18 -0
  24. package/dist/src/ast/collate.d.ts.map +1 -0
  25. package/dist/src/ast/collate.js +25 -0
  26. package/dist/src/ast/collate.js.map +1 -0
  27. package/dist/src/ast/column-param.d.ts +23 -0
  28. package/dist/src/ast/column-param.d.ts.map +1 -0
  29. package/dist/src/ast/column-param.js +29 -0
  30. package/dist/src/ast/column-param.js.map +1 -0
  31. package/dist/src/ast/column-ref.d.ts +40 -0
  32. package/dist/src/ast/column-ref.d.ts.map +1 -0
  33. package/dist/src/ast/column-ref.js +58 -0
  34. package/dist/src/ast/column-ref.js.map +1 -0
  35. package/dist/src/ast/fragment.d.ts +20 -0
  36. package/dist/src/ast/fragment.d.ts.map +1 -0
  37. package/dist/src/ast/fragment.js +26 -0
  38. package/dist/src/ast/fragment.js.map +1 -0
  39. package/dist/src/ast/from.d.ts +22 -0
  40. package/dist/src/ast/from.d.ts.map +1 -0
  41. package/dist/src/ast/from.js +37 -0
  42. package/dist/src/ast/from.js.map +1 -0
  43. package/dist/src/ast/function.d.ts +18 -0
  44. package/dist/src/ast/function.d.ts.map +1 -0
  45. package/dist/src/ast/function.js +26 -0
  46. package/dist/src/ast/function.js.map +1 -0
  47. package/dist/src/ast/in-op.d.ts +18 -0
  48. package/dist/src/ast/in-op.d.ts.map +1 -0
  49. package/dist/src/ast/in-op.js +25 -0
  50. package/dist/src/ast/in-op.js.map +1 -0
  51. package/dist/src/ast/interval.d.ts +18 -0
  52. package/dist/src/ast/interval.d.ts.map +1 -0
  53. package/dist/src/ast/interval.js +25 -0
  54. package/dist/src/ast/interval.js.map +1 -0
  55. package/dist/src/ast/literal.d.ts +16 -0
  56. package/dist/src/ast/literal.d.ts.map +1 -0
  57. package/dist/src/ast/literal.js +53 -0
  58. package/dist/src/ast/literal.js.map +1 -0
  59. package/dist/src/ast/logical-op.d.ts +32 -0
  60. package/dist/src/ast/logical-op.d.ts.map +1 -0
  61. package/dist/src/ast/logical-op.js +46 -0
  62. package/dist/src/ast/logical-op.js.map +1 -0
  63. package/dist/src/ast/node.d.ts +25 -0
  64. package/dist/src/ast/node.d.ts.map +1 -0
  65. package/dist/src/ast/node.js +36 -0
  66. package/dist/src/ast/node.js.map +1 -0
  67. package/dist/src/ast/order-by.d.ts +21 -0
  68. package/dist/src/ast/order-by.d.ts.map +1 -0
  69. package/dist/src/ast/order-by.js +36 -0
  70. package/dist/src/ast/order-by.js.map +1 -0
  71. package/dist/{types → src}/ast/param.d.ts +11 -11
  72. package/dist/src/ast/param.d.ts.map +1 -0
  73. package/dist/src/ast/param.js +28 -0
  74. package/dist/src/ast/param.js.map +1 -0
  75. package/dist/src/ast/query.d.ts +294 -0
  76. package/dist/src/ast/query.d.ts.map +1 -0
  77. package/dist/src/ast/query.js +584 -0
  78. package/dist/src/ast/query.js.map +1 -0
  79. package/dist/src/ast/sample.d.ts +27 -0
  80. package/dist/src/ast/sample.d.ts.map +1 -0
  81. package/dist/src/ast/sample.js +38 -0
  82. package/dist/src/ast/sample.js.map +1 -0
  83. package/dist/src/ast/select.d.ts +19 -0
  84. package/dist/src/ast/select.d.ts.map +1 -0
  85. package/dist/src/ast/select.js +35 -0
  86. package/dist/src/ast/select.js.map +1 -0
  87. package/dist/src/ast/subquery.d.ts +16 -0
  88. package/dist/src/ast/subquery.d.ts.map +1 -0
  89. package/dist/src/ast/subquery.js +21 -0
  90. package/dist/src/ast/subquery.js.map +1 -0
  91. package/dist/src/ast/table-ref.d.ts +24 -0
  92. package/dist/src/ast/table-ref.d.ts.map +1 -0
  93. package/dist/src/ast/table-ref.js +35 -0
  94. package/dist/src/ast/table-ref.js.map +1 -0
  95. package/dist/src/ast/unary-op.d.ts +40 -0
  96. package/dist/src/ast/unary-op.d.ts.map +1 -0
  97. package/dist/src/ast/unary-op.js +52 -0
  98. package/dist/src/ast/unary-op.js.map +1 -0
  99. package/dist/src/ast/verbatim.d.ts +18 -0
  100. package/dist/src/ast/verbatim.d.ts.map +1 -0
  101. package/dist/src/ast/verbatim.js +25 -0
  102. package/dist/src/ast/verbatim.js.map +1 -0
  103. package/dist/src/ast/window-frame.d.ts +54 -0
  104. package/dist/src/ast/window-frame.d.ts.map +1 -0
  105. package/dist/src/ast/window-frame.js +79 -0
  106. package/dist/src/ast/window-frame.js.map +1 -0
  107. package/dist/src/ast/window.d.ts +128 -0
  108. package/dist/src/ast/window.d.ts.map +1 -0
  109. package/dist/src/ast/window.js +194 -0
  110. package/dist/src/ast/window.js.map +1 -0
  111. package/dist/{types → src}/ast/with.d.ts +15 -22
  112. package/dist/src/ast/with.d.ts.map +1 -0
  113. package/dist/src/ast/with.js +36 -0
  114. package/dist/src/ast/with.js.map +1 -0
  115. package/dist/src/constants.d.ts +38 -0
  116. package/dist/src/constants.d.ts.map +1 -0
  117. package/dist/src/constants.js +38 -0
  118. package/dist/src/constants.js.map +1 -0
  119. package/dist/src/functions/aggregate.d.ts +236 -0
  120. package/dist/src/functions/aggregate.d.ts.map +1 -0
  121. package/dist/src/functions/aggregate.js +308 -0
  122. package/dist/src/functions/aggregate.js.map +1 -0
  123. package/dist/{types → src}/functions/case.d.ts +7 -7
  124. package/dist/src/functions/case.d.ts.map +1 -0
  125. package/dist/src/functions/case.js +17 -0
  126. package/dist/src/functions/case.js.map +1 -0
  127. package/dist/src/functions/cast.d.ts +23 -0
  128. package/dist/src/functions/cast.d.ts.map +1 -0
  129. package/dist/src/functions/cast.js +32 -0
  130. package/dist/src/functions/cast.js.map +1 -0
  131. package/dist/src/functions/collate.d.ts +10 -0
  132. package/dist/src/functions/collate.d.ts.map +1 -0
  133. package/dist/src/functions/collate.js +12 -0
  134. package/dist/src/functions/collate.js.map +1 -0
  135. package/dist/src/functions/column.d.ts +10 -0
  136. package/dist/src/functions/column.d.ts.map +1 -0
  137. package/dist/src/functions/column.js +17 -0
  138. package/dist/src/functions/column.js.map +1 -0
  139. package/dist/{types → src}/functions/cte.d.ts +7 -7
  140. package/dist/src/functions/cte.d.ts.map +1 -0
  141. package/dist/src/functions/cte.js +14 -0
  142. package/dist/src/functions/cte.js.map +1 -0
  143. package/dist/src/functions/datetime.d.ts +32 -0
  144. package/dist/src/functions/datetime.d.ts.map +1 -0
  145. package/dist/src/functions/datetime.js +45 -0
  146. package/dist/src/functions/datetime.js.map +1 -0
  147. package/dist/src/functions/interval.d.ts +48 -0
  148. package/dist/src/functions/interval.d.ts.map +1 -0
  149. package/dist/src/functions/interval.js +66 -0
  150. package/dist/src/functions/interval.js.map +1 -0
  151. package/dist/{types → src}/functions/literal.d.ts +8 -8
  152. package/dist/src/functions/literal.d.ts.map +1 -0
  153. package/dist/src/functions/literal.js +20 -0
  154. package/dist/src/functions/literal.js.map +1 -0
  155. package/dist/src/functions/numeric.d.ts +80 -0
  156. package/dist/src/functions/numeric.d.ts.map +1 -0
  157. package/dist/src/functions/numeric.js +110 -0
  158. package/dist/src/functions/numeric.js.map +1 -0
  159. package/dist/src/functions/operators.d.ts +169 -0
  160. package/dist/src/functions/operators.d.ts.map +1 -0
  161. package/dist/src/functions/operators.js +235 -0
  162. package/dist/src/functions/operators.js.map +1 -0
  163. package/dist/src/functions/order-by.d.ts +15 -0
  164. package/dist/src/functions/order-by.d.ts.map +1 -0
  165. package/dist/src/functions/order-by.js +19 -0
  166. package/dist/src/functions/order-by.js.map +1 -0
  167. package/dist/src/functions/spatial.d.ts +32 -0
  168. package/dist/src/functions/spatial.d.ts.map +1 -0
  169. package/dist/src/functions/spatial.js +44 -0
  170. package/dist/src/functions/spatial.js.map +1 -0
  171. package/dist/{types → src}/functions/sql-template-tag.d.ts +8 -10
  172. package/dist/src/functions/sql-template-tag.d.ts.map +1 -0
  173. package/dist/src/functions/sql-template-tag.js +44 -0
  174. package/dist/src/functions/sql-template-tag.js.map +1 -0
  175. package/dist/src/functions/string.d.ts +49 -0
  176. package/dist/src/functions/string.d.ts.map +1 -0
  177. package/dist/src/functions/string.js +67 -0
  178. package/dist/src/functions/string.js.map +1 -0
  179. package/dist/src/functions/table-ref.d.ts +10 -0
  180. package/dist/src/functions/table-ref.d.ts.map +1 -0
  181. package/dist/src/functions/table-ref.js +13 -0
  182. package/dist/src/functions/table-ref.js.map +1 -0
  183. package/dist/src/functions/util.d.ts +7 -0
  184. package/dist/src/functions/util.d.ts.map +1 -0
  185. package/dist/src/functions/util.js +9 -0
  186. package/dist/src/functions/util.js.map +1 -0
  187. package/dist/src/functions/window-frame.d.ts +41 -0
  188. package/dist/src/functions/window-frame.d.ts.map +1 -0
  189. package/dist/src/functions/window-frame.js +52 -0
  190. package/dist/src/functions/window-frame.js.map +1 -0
  191. package/dist/{types → src}/functions/window.d.ts +24 -39
  192. package/dist/src/functions/window.d.ts.map +1 -0
  193. package/dist/src/functions/window.js +96 -0
  194. package/dist/src/functions/window.js.map +1 -0
  195. package/dist/src/index.d.ts +69 -0
  196. package/dist/src/index.d.ts.map +1 -0
  197. package/{src → dist/src}/index.js +16 -12
  198. package/dist/src/index.js.map +1 -0
  199. package/dist/src/load/create.d.ts +10 -0
  200. package/dist/src/load/create.d.ts.map +1 -0
  201. package/dist/src/load/create.js +14 -0
  202. package/dist/src/load/create.js.map +1 -0
  203. package/dist/src/load/extension.d.ts +2 -0
  204. package/dist/src/load/extension.d.ts.map +1 -0
  205. package/dist/src/load/extension.js +4 -0
  206. package/dist/src/load/extension.js.map +1 -0
  207. package/dist/src/load/load.d.ts +18 -0
  208. package/dist/src/load/load.d.ts.map +1 -0
  209. package/dist/src/load/load.js +80 -0
  210. package/dist/src/load/load.js.map +1 -0
  211. package/dist/src/load/sql-from.d.ts +14 -0
  212. package/dist/src/load/sql-from.d.ts.map +1 -0
  213. package/dist/src/load/sql-from.js +29 -0
  214. package/dist/src/load/sql-from.js.map +1 -0
  215. package/dist/src/transforms/bin-1d.d.ts +16 -0
  216. package/dist/src/transforms/bin-1d.d.ts.map +1 -0
  217. package/dist/src/transforms/bin-1d.js +21 -0
  218. package/dist/src/transforms/bin-1d.js.map +1 -0
  219. package/dist/src/transforms/bin-2d.d.ts +19 -0
  220. package/dist/src/transforms/bin-2d.d.ts.map +1 -0
  221. package/dist/src/transforms/bin-2d.js +27 -0
  222. package/dist/src/transforms/bin-2d.js.map +1 -0
  223. package/dist/src/transforms/bin-date.d.ts +31 -0
  224. package/dist/src/transforms/bin-date.d.ts.map +1 -0
  225. package/dist/src/transforms/bin-date.js +20 -0
  226. package/dist/src/transforms/bin-date.js.map +1 -0
  227. package/dist/src/transforms/bin-histogram.d.ts +37 -0
  228. package/dist/src/transforms/bin-histogram.d.ts.map +1 -0
  229. package/dist/src/transforms/bin-histogram.js +32 -0
  230. package/dist/src/transforms/bin-histogram.js.map +1 -0
  231. package/dist/src/transforms/bin-linear-1d.d.ts +11 -0
  232. package/dist/src/transforms/bin-linear-1d.d.ts.map +1 -0
  233. package/dist/src/transforms/bin-linear-1d.js +25 -0
  234. package/dist/src/transforms/bin-linear-1d.js.map +1 -0
  235. package/dist/src/transforms/bin-linear-2d.d.ts +20 -0
  236. package/dist/src/transforms/bin-linear-2d.d.ts.map +1 -0
  237. package/dist/src/transforms/bin-linear-2d.js +49 -0
  238. package/dist/src/transforms/bin-linear-2d.js.map +1 -0
  239. package/dist/src/transforms/filter-query.d.ts +12 -0
  240. package/dist/src/transforms/filter-query.d.ts.map +1 -0
  241. package/dist/src/transforms/filter-query.js +39 -0
  242. package/dist/src/transforms/filter-query.js.map +1 -0
  243. package/dist/src/transforms/line-density.d.ts +24 -0
  244. package/dist/src/transforms/line-density.d.ts.map +1 -0
  245. package/dist/src/transforms/line-density.js +98 -0
  246. package/dist/src/transforms/line-density.js.map +1 -0
  247. package/dist/src/transforms/m4.d.ts +19 -0
  248. package/dist/src/transforms/m4.d.ts.map +1 -0
  249. package/dist/src/transforms/m4.js +38 -0
  250. package/dist/src/transforms/m4.js.map +1 -0
  251. package/dist/src/transforms/scales.d.ts +30 -0
  252. package/dist/src/transforms/scales.d.ts.map +1 -0
  253. package/dist/src/transforms/scales.js +103 -0
  254. package/dist/src/transforms/scales.js.map +1 -0
  255. package/dist/src/transforms/util/bin-step.d.ts +50 -0
  256. package/dist/src/transforms/util/bin-step.d.ts.map +1 -0
  257. package/dist/src/transforms/util/bin-step.js +53 -0
  258. package/dist/src/transforms/util/bin-step.js.map +1 -0
  259. package/dist/src/transforms/util/time-interval.d.ts +14 -0
  260. package/dist/src/transforms/util/time-interval.d.ts.map +1 -0
  261. package/dist/src/transforms/util/time-interval.js +88 -0
  262. package/dist/src/transforms/util/time-interval.js.map +1 -0
  263. package/dist/{types → src}/types.d.ts +6 -19
  264. package/dist/src/types.d.ts.map +1 -0
  265. package/dist/src/types.js +2 -0
  266. package/dist/src/types.js.map +1 -0
  267. package/dist/{types → src}/util/ast.d.ts +26 -25
  268. package/dist/src/util/ast.d.ts.map +1 -0
  269. package/{src → dist/src}/util/ast.js +36 -41
  270. package/dist/src/util/ast.js.map +1 -0
  271. package/dist/src/util/function.d.ts +56 -0
  272. package/dist/src/util/function.d.ts.map +1 -0
  273. package/dist/src/util/function.js +73 -0
  274. package/dist/src/util/function.js.map +1 -0
  275. package/dist/src/util/identity.d.ts +6 -0
  276. package/dist/src/util/identity.d.ts.map +1 -0
  277. package/dist/src/util/identity.js +8 -0
  278. package/dist/src/util/identity.js.map +1 -0
  279. package/dist/src/util/string.d.ts +4 -0
  280. package/dist/src/util/string.d.ts.map +1 -0
  281. package/dist/src/util/string.js +14 -0
  282. package/dist/src/util/string.js.map +1 -0
  283. package/dist/src/util/type-check.d.ts +17 -0
  284. package/dist/src/util/type-check.d.ts.map +1 -0
  285. package/dist/src/util/type-check.js +28 -0
  286. package/dist/src/util/type-check.js.map +1 -0
  287. package/dist/src/visit/clone.d.ts +7 -0
  288. package/dist/src/visit/clone.d.ts.map +1 -0
  289. package/dist/src/visit/clone.js +52 -0
  290. package/dist/src/visit/clone.js.map +1 -0
  291. package/dist/src/visit/recurse.d.ts +2 -0
  292. package/dist/src/visit/recurse.d.ts.map +1 -0
  293. package/dist/src/visit/recurse.js +36 -0
  294. package/dist/src/visit/recurse.js.map +1 -0
  295. package/dist/src/visit/rewrite.d.ts +9 -0
  296. package/dist/src/visit/rewrite.d.ts.map +1 -0
  297. package/dist/src/visit/rewrite.js +39 -0
  298. package/dist/src/visit/rewrite.js.map +1 -0
  299. package/dist/{types → src}/visit/visitors.d.ts +14 -16
  300. package/dist/src/visit/visitors.d.ts.map +1 -0
  301. package/dist/src/visit/visitors.js +95 -0
  302. package/dist/src/visit/visitors.js.map +1 -0
  303. package/dist/src/visit/walk.d.ts +21 -0
  304. package/dist/src/visit/walk.d.ts.map +1 -0
  305. package/dist/src/visit/walk.js +32 -0
  306. package/dist/src/visit/walk.js.map +1 -0
  307. package/package.json +12 -10
  308. package/src/ast/aggregate.ts +198 -0
  309. package/src/ast/{between-op.js → between-op.ts} +19 -26
  310. package/src/ast/binary-op.ts +31 -0
  311. package/src/ast/{case.js → case.ts} +29 -44
  312. package/src/ast/{cast.js → cast.ts} +8 -14
  313. package/src/ast/collate.ts +27 -0
  314. package/src/ast/column-param.ts +34 -0
  315. package/src/ast/{column-ref.js → column-ref.ts} +16 -25
  316. package/src/ast/fragment.ts +28 -0
  317. package/src/ast/from.ts +40 -0
  318. package/src/ast/{function.js → function.ts} +8 -14
  319. package/src/ast/{in-op.js → in-op.ts} +8 -14
  320. package/src/ast/{interval.js → interval.ts} +8 -14
  321. package/src/ast/{literal.js → literal.ts} +6 -9
  322. package/src/ast/logical-op.ts +50 -0
  323. package/src/ast/node.ts +39 -0
  324. package/src/ast/order-by.ts +38 -0
  325. package/src/ast/{param.js → param.ts} +6 -12
  326. package/src/ast/{query.js → query.ts} +193 -205
  327. package/src/ast/sample.ts +47 -0
  328. package/src/ast/{select.js → select.ts} +10 -16
  329. package/src/ast/subquery.ts +24 -0
  330. package/src/ast/{table-ref.js → table-ref.ts} +7 -12
  331. package/src/ast/{unary-op.js → unary-op.ts} +16 -23
  332. package/src/ast/{verbatim.js → verbatim.ts} +9 -8
  333. package/src/ast/window-frame.ts +97 -0
  334. package/src/ast/window.ts +246 -0
  335. package/src/ast/{with.js → with.ts} +19 -20
  336. package/src/{constants.js → constants.ts} +5 -6
  337. package/src/functions/aggregate.ts +344 -0
  338. package/src/functions/{case.js → case.ts} +5 -8
  339. package/src/functions/{cast.js → cast.ts} +9 -13
  340. package/src/functions/collate.ts +13 -0
  341. package/src/functions/{column.js → column.ts} +9 -10
  342. package/src/functions/{cte.js → cte.ts} +9 -6
  343. package/src/functions/datetime.ts +50 -0
  344. package/src/functions/interval.ts +74 -0
  345. package/src/functions/{literal.js → literal.ts} +6 -7
  346. package/src/functions/numeric.ts +125 -0
  347. package/src/functions/operators.ts +272 -0
  348. package/src/functions/order-by.ts +21 -0
  349. package/src/functions/spatial.ts +50 -0
  350. package/src/functions/{sql-template-tag.js → sql-template-tag.ts} +16 -13
  351. package/src/functions/string.ts +79 -0
  352. package/src/functions/{table-ref.js → table-ref.ts} +4 -4
  353. package/src/functions/util.ts +10 -0
  354. package/src/functions/window-frame.ts +58 -0
  355. package/src/functions/{window.js → window.ts} +18 -35
  356. package/src/index.ts +75 -0
  357. package/src/load/{create.js → create.ts} +9 -3
  358. package/src/load/extension.ts +3 -0
  359. package/src/load/{load.js → load.ts} +26 -11
  360. package/src/load/{sql-from.js → sql-from.ts} +14 -7
  361. package/src/transforms/{bin-1d.js → bin-1d.ts} +13 -9
  362. package/src/transforms/{bin-2d.js → bin-2d.ts} +17 -13
  363. package/src/transforms/bin-date.ts +48 -0
  364. package/src/transforms/bin-histogram.ts +61 -0
  365. package/src/transforms/{bin-linear-1d.js → bin-linear-1d.ts} +16 -11
  366. package/src/transforms/{bin-linear-2d.js → bin-linear-2d.ts} +23 -35
  367. package/src/transforms/filter-query.ts +40 -0
  368. package/src/transforms/{line-density.js → line-density.ts} +19 -17
  369. package/src/transforms/{m4.js → m4.ts} +17 -14
  370. package/src/transforms/{scales.js → scales.ts} +57 -14
  371. package/src/transforms/util/bin-step.ts +100 -0
  372. package/src/transforms/util/{time-interval.js → time-interval.ts} +32 -21
  373. package/src/types.ts +5 -30
  374. package/src/util/ast.ts +104 -0
  375. package/src/util/{function.js → function.ts} +40 -31
  376. package/src/util/identity.ts +7 -0
  377. package/src/util/{string.js → string.ts} +4 -4
  378. package/src/util/type-check.ts +31 -0
  379. package/src/visit/clone.ts +53 -0
  380. package/src/visit/{recurse.js → recurse.ts} +18 -6
  381. package/src/visit/{rewrite.js → rewrite.ts} +10 -18
  382. package/src/visit/{visitors.js → visitors.ts} +22 -30
  383. package/src/visit/walk.ts +46 -0
  384. package/dist/types/ast/aggregate.d.ts +0 -71
  385. package/dist/types/ast/between-op.d.ts +0 -46
  386. package/dist/types/ast/binary-op.d.ts +0 -28
  387. package/dist/types/ast/case.d.ts +0 -67
  388. package/dist/types/ast/cast.d.ts +0 -21
  389. package/dist/types/ast/column-param.d.ts +0 -23
  390. package/dist/types/ast/column-ref.d.ts +0 -40
  391. package/dist/types/ast/fragment.d.ts +0 -14
  392. package/dist/types/ast/from.d.ts +0 -21
  393. package/dist/types/ast/function.d.ts +0 -21
  394. package/dist/types/ast/in-op.d.ts +0 -21
  395. package/dist/types/ast/interval.d.ts +0 -21
  396. package/dist/types/ast/literal.d.ts +0 -15
  397. package/dist/types/ast/logical-op.d.ts +0 -46
  398. package/dist/types/ast/node.d.ts +0 -24
  399. package/dist/types/ast/order-by.d.ts +0 -29
  400. package/dist/types/ast/query.d.ts +0 -320
  401. package/dist/types/ast/sample.d.ts +0 -42
  402. package/dist/types/ast/select.d.ts +0 -22
  403. package/dist/types/ast/table-ref.d.ts +0 -25
  404. package/dist/types/ast/unary-op.d.ts +0 -39
  405. package/dist/types/ast/verbatim.d.ts +0 -9
  406. package/dist/types/ast/window.d.ts +0 -180
  407. package/dist/types/constants.d.ts +0 -38
  408. package/dist/types/functions/aggregate.d.ts +0 -236
  409. package/dist/types/functions/cast.d.ts +0 -26
  410. package/dist/types/functions/column.d.ts +0 -11
  411. package/dist/types/functions/datetime.d.ts +0 -45
  412. package/dist/types/functions/numeric.d.ts +0 -95
  413. package/dist/types/functions/operators.d.ts +0 -200
  414. package/dist/types/functions/order-by.d.ts +0 -18
  415. package/dist/types/functions/spatial.d.ts +0 -38
  416. package/dist/types/functions/string.d.ts +0 -57
  417. package/dist/types/functions/table-ref.d.ts +0 -9
  418. package/dist/types/functions/util.d.ts +0 -8
  419. package/dist/types/index-types.d.ts +0 -2
  420. package/dist/types/index.d.ts +0 -59
  421. package/dist/types/load/create.d.ts +0 -8
  422. package/dist/types/load/extension.d.ts +0 -1
  423. package/dist/types/load/load.d.ts +0 -12
  424. package/dist/types/load/sql-from.d.ts +0 -11
  425. package/dist/types/transforms/bin-1d.d.ts +0 -15
  426. package/dist/types/transforms/bin-2d.d.ts +0 -19
  427. package/dist/types/transforms/bin-date.d.ts +0 -44
  428. package/dist/types/transforms/bin-histogram.d.ts +0 -51
  429. package/dist/types/transforms/bin-linear-1d.d.ts +0 -12
  430. package/dist/types/transforms/bin-linear-2d.d.ts +0 -19
  431. package/dist/types/transforms/line-density.d.ts +0 -24
  432. package/dist/types/transforms/m4.d.ts +0 -21
  433. package/dist/types/transforms/scales.d.ts +0 -1
  434. package/dist/types/transforms/util/bin-step.d.ts +0 -61
  435. package/dist/types/transforms/util/time-interval.d.ts +0 -13
  436. package/dist/types/util/function.d.ts +0 -56
  437. package/dist/types/util/string.d.ts +0 -3
  438. package/dist/types/util/type-check.d.ts +0 -22
  439. package/dist/types/visit/recurse.d.ts +0 -28
  440. package/dist/types/visit/rewrite.d.ts +0 -10
  441. package/dist/types/visit/walk.d.ts +0 -10
  442. package/jsconfig.json +0 -11
  443. package/src/ast/aggregate.js +0 -167
  444. package/src/ast/binary-op.js +0 -40
  445. package/src/ast/column-param.js +0 -40
  446. package/src/ast/fragment.js +0 -26
  447. package/src/ast/from.js +0 -40
  448. package/src/ast/logical-op.js +0 -67
  449. package/src/ast/node.js +0 -29
  450. package/src/ast/order-by.js +0 -48
  451. package/src/ast/sample.js +0 -53
  452. package/src/ast/window.js +0 -294
  453. package/src/functions/aggregate.js +0 -347
  454. package/src/functions/datetime.js +0 -68
  455. package/src/functions/numeric.js +0 -143
  456. package/src/functions/operators.js +0 -301
  457. package/src/functions/order-by.js +0 -27
  458. package/src/functions/spatial.js +0 -59
  459. package/src/functions/string.js +0 -85
  460. package/src/functions/util.js +0 -14
  461. package/src/index-types.ts +0 -2
  462. package/src/load/extension.js +0 -3
  463. package/src/transforms/bin-date.js +0 -37
  464. package/src/transforms/bin-histogram.js +0 -52
  465. package/src/transforms/util/bin-step.js +0 -79
  466. package/src/util/type-check.js +0 -33
  467. package/src/visit/walk.js +0 -35
  468. package/tsconfig.json +0 -12
  469. package/vitest.config.ts +0 -3
@@ -0,0 +1,39 @@
1
+ import { isNode } from '../ast/node.js';
2
+ import { recurse } from './recurse.js';
3
+ /**
4
+ * Rewrite a SQL expression, based on a map of nodes to replace.
5
+ * This method copies nodes as needed; it does not modify the input node.
6
+ * @param node The root AST node of the expression.
7
+ * @param map The rewrite map. When encountered, key nodes are replaced by value nodes.
8
+ */
9
+ export function rewrite(node, map) {
10
+ if (map.has(node)) {
11
+ return map.get(node);
12
+ }
13
+ else if (isNode(node)) {
14
+ const props = recurse[node.type];
15
+ const n = props?.length ?? 0;
16
+ if (n > 0) {
17
+ node = node.clone();
18
+ for (let i = 0; i < n; ++i) {
19
+ const prop = props[i];
20
+ // @ts-expect-error lookup valid property
21
+ const child = node[prop];
22
+ if (Array.isArray(child)) {
23
+ // @ts-expect-error rewrite known property
24
+ const a = (node[prop] = child.slice());
25
+ const m = child.length;
26
+ for (let j = 0; j < m; ++j) {
27
+ a[j] = rewrite(child[j], map);
28
+ }
29
+ }
30
+ else if (child) {
31
+ // @ts-expect-error rewrite known property
32
+ node[prop] = rewrite(child, map);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ return node;
38
+ }
39
+ //# sourceMappingURL=rewrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite.js","sourceRoot":"","sources":["../../../src/visit/rewrite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,GAA4B;IAClE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,yCAAyC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,0CAA0C;oBAC1C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;oBACvC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;oBACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;wBAC3B,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,EAAE,CAAC;oBACjB,0CAA0C;oBAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,34 +1,32 @@
1
+ import { type AggregateNode } from '../ast/aggregate.js';
2
+ import type { ColumnRefNode } from '../ast/column-ref.js';
3
+ import type { SQLNode } from '../ast/node.js';
4
+ import type { ParamLike } from '../types.js';
1
5
  /**
2
6
  * Indicate if the input AST contains an aggregate expression.
3
7
  * The string content of verbatim nodes is analyzed to try to identify
4
8
  * unparsed aggregate functions calls within SQL strings.
5
- * @param {SQLNode} root The root of the AST to search.
6
- * @returns {number} Return 0 if no aggregate functions are found.
9
+ * @param root The root of the AST to search.
10
+ * @returns Return 0 if no aggregate functions are found.
7
11
  * Sets bit 1 if an AggregateFunction instance is found.
8
12
  * Sets bit 2 if an aggregate embedded in verbatim text is found.
9
13
  */
10
- export function isAggregateExpression(root: SQLNode): number;
14
+ export declare function isAggregateExpression(root: SQLNode): number;
11
15
  /**
12
16
  * Collect all aggregate function nodes.
13
- * @param {SQLNode} root The root of the AST to search.
14
- * @returns {AggregateNode[]}
17
+ * @param root The root of the AST to search.
15
18
  */
16
- export function collectAggregates(root: SQLNode): AggregateNode[];
19
+ export declare function collectAggregates(root: SQLNode): AggregateNode[];
17
20
  /**
18
21
  * Collect all unique column references.
19
22
  * Multiple references to the same column are de-duplicated, even if
20
23
  * they are not object-equal node instances.
21
- * @param {SQLNode} root The root of the AST to search.
22
- * @returns {ColumnRefNode[]}
24
+ * @param root The root of the AST to search.
23
25
  */
24
- export function collectColumns(root: SQLNode): ColumnRefNode[];
26
+ export declare function collectColumns(root: SQLNode): ColumnRefNode[];
25
27
  /**
26
28
  * Collect all unique dynamic parameter instances.
27
- * @param {SQLNode} root The root of the AST to search.
28
- * @returns {ParamLike[]}
29
+ * @param root The root of the AST to search.
29
30
  */
30
- export function collectParams(root: SQLNode): ParamLike[];
31
- import type { SQLNode } from '../ast/node.js';
32
- import type { AggregateNode } from '../ast/aggregate.js';
33
- import type { ColumnRefNode } from '../ast/column-ref.js';
34
- import type { ParamLike } from '../types.js';
31
+ export declare function collectParams(root: SQLNode): ParamLike[];
32
+ //# sourceMappingURL=visitors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitors.d.ts","sourceRoot":"","sources":["../../../src/visit/visitors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkB7C;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,UA4BlD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,mBAQ9C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,mBAS3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,eAQ1C"}
@@ -0,0 +1,95 @@
1
+ import { aggregateNames } from '../ast/aggregate.js';
2
+ import { AGGREGATE, COLUMN_PARAM, COLUMN_REF, FRAGMENT, PARAM, VERBATIM, WINDOW } from '../constants.js';
3
+ import { walk } from './walk.js';
4
+ // regexp to match valid aggregate function names
5
+ const aggrRegExp = new RegExp(`^(${aggregateNames.join('|')})$`);
6
+ // regexp to tokenize sql text in order to find function calls
7
+ // includes checks to avoid analyzing text within quoted strings
8
+ // function call tokens will have a pattern like "name(".
9
+ const funcRegExp = /(\\'|\\"|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\w+\()/g;
10
+ function hasVerbatimAggregate(s) {
11
+ return s
12
+ .split(funcRegExp)
13
+ .some(tok => tok.endsWith('(') && aggrRegExp.test(tok.slice(0, -1)));
14
+ }
15
+ /**
16
+ * Indicate if the input AST contains an aggregate expression.
17
+ * The string content of verbatim nodes is analyzed to try to identify
18
+ * unparsed aggregate functions calls within SQL strings.
19
+ * @param root The root of the AST to search.
20
+ * @returns Return 0 if no aggregate functions are found.
21
+ * Sets bit 1 if an AggregateFunction instance is found.
22
+ * Sets bit 2 if an aggregate embedded in verbatim text is found.
23
+ */
24
+ export function isAggregateExpression(root) {
25
+ let agg = 0;
26
+ walk(root, (node) => {
27
+ switch (node.type) {
28
+ case WINDOW:
29
+ return -1; // aggs can't include windows
30
+ case AGGREGATE:
31
+ agg |= 1;
32
+ return -1;
33
+ case FRAGMENT:
34
+ case VERBATIM: {
35
+ let s = `${node}`.toLowerCase();
36
+ // strip away scalar subquery content
37
+ const sub = s.indexOf('(select ');
38
+ if (sub >= 0)
39
+ s = s.slice(0, sub);
40
+ // exit if expression includes windowing
41
+ if (s.includes(') over '))
42
+ return -1;
43
+ if (hasVerbatimAggregate(s)) {
44
+ agg |= 2;
45
+ return -1;
46
+ }
47
+ return 1; // don't recurse
48
+ }
49
+ }
50
+ });
51
+ return agg;
52
+ }
53
+ /**
54
+ * Collect all aggregate function nodes.
55
+ * @param root The root of the AST to search.
56
+ */
57
+ export function collectAggregates(root) {
58
+ const aggs = new Set();
59
+ walk(root, (node) => {
60
+ if (node.type === AGGREGATE) {
61
+ aggs.add(node);
62
+ }
63
+ });
64
+ return Array.from(aggs);
65
+ }
66
+ /**
67
+ * Collect all unique column references.
68
+ * Multiple references to the same column are de-duplicated, even if
69
+ * they are not object-equal node instances.
70
+ * @param root The root of the AST to search.
71
+ */
72
+ export function collectColumns(root) {
73
+ const cols = {};
74
+ walk(root, (node) => {
75
+ if (node.type === COLUMN_REF || node.type === COLUMN_PARAM) {
76
+ // key on string-coerced node
77
+ cols[`${node}`] = node;
78
+ }
79
+ });
80
+ return Object.values(cols);
81
+ }
82
+ /**
83
+ * Collect all unique dynamic parameter instances.
84
+ * @param root The root of the AST to search.
85
+ */
86
+ export function collectParams(root) {
87
+ const params = new Set;
88
+ walk(root, (node) => {
89
+ if (node.type === PARAM) {
90
+ params.add(node.param);
91
+ }
92
+ });
93
+ return Array.from(params);
94
+ }
95
+ //# sourceMappingURL=visitors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../../src/visit/visitors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { SQLNode } from '../ast/node.js';
2
+ /**
3
+ * SQL AST traversal visitor callback result.
4
+ * A falsy value (including `undefined`, `null`, `false`, and `0`) indicates
5
+ * that traversal should continue.
6
+ * A negative number values indicates that traversal should stop immediately.
7
+ * Any other truthy value indicates that traversal should not recurse on the
8
+ * current node, but should otherwise continue.
9
+ */
10
+ export type VisitorResult = boolean | number | null | undefined | void;
11
+ /**
12
+ * SQL AST traversal callback function.
13
+ */
14
+ export type VisitorCallback = (node: SQLNode) => VisitorResult;
15
+ /**
16
+ * Perform a traversal of a SQL expression AST.
17
+ * @param node Root node for AST traversal.
18
+ * @param visit Visitor callback function.
19
+ */
20
+ export declare function walk(node: unknown, visit: VisitorCallback): VisitorResult;
21
+ //# sourceMappingURL=walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../../src/visit/walk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI9C;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,aAAa,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,GAAG,aAAa,CAqBzE"}
@@ -0,0 +1,32 @@
1
+ import { isNode } from '../ast/node.js';
2
+ import { recurse } from './recurse.js';
3
+ /**
4
+ * Perform a traversal of a SQL expression AST.
5
+ * @param node Root node for AST traversal.
6
+ * @param visit Visitor callback function.
7
+ */
8
+ export function walk(node, visit) {
9
+ if (!isNode(node))
10
+ return;
11
+ const result = visit(node);
12
+ if (result)
13
+ return result;
14
+ const props = recurse[node.type];
15
+ const n = props?.length ?? 0;
16
+ for (let i = 0; i < n; ++i) {
17
+ // @ts-expect-error lookup of valid property
18
+ const value = node[props[i]];
19
+ if (Array.isArray(value)) {
20
+ const m = value.length;
21
+ for (let j = 0; j < m; ++j) {
22
+ if (value[j] && Number(walk(value[j], visit)) < 0) {
23
+ return result;
24
+ }
25
+ }
26
+ }
27
+ else if (value && Number(walk(value, visit)) < 0) {
28
+ return -1;
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../../src/visit/walk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAiBvC;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,IAAa,EAAE,KAAsB;IACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3B,4CAA4C;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClD,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uwdata/mosaic-sql",
3
- "version": "0.16.2",
3
+ "version": "0.18.0",
4
4
  "description": "SQL query construction and analysis.",
5
5
  "keywords": [
6
6
  "sql",
@@ -11,21 +11,23 @@
11
11
  "author": "Jeffrey Heer (https://idl.uw.edu)",
12
12
  "type": "module",
13
13
  "exports": {
14
- "types": "./dist/types/index-types.d.ts",
15
- "default": "./src/index.js"
14
+ "types": "./dist/src/index.d.ts",
15
+ "default": "./dist/src/index.js"
16
16
  },
17
+ "files": [
18
+ "dist",
19
+ "!dist/tsconfig.tsbuildinfo",
20
+ "src"
21
+ ],
17
22
  "repository": {
18
23
  "type": "git",
19
24
  "url": "https://github.com/uwdata/mosaic.git"
20
25
  },
21
26
  "scripts": {
22
- "prebuild": "rimraf dist && mkdir dist",
23
- "build": "npm run types",
24
- "types": "tsc",
27
+ "clean": "rimraf dist && mkdir dist",
25
28
  "lint": "eslint src test",
26
- "test": "vitest run && npm run tsc",
27
- "tsc": "tsc -p jsconfig.json",
28
- "prepublishOnly": "npm run test && npm run lint && npm run build"
29
+ "test": "vitest run",
30
+ "prepublishOnly": "npm run test && npm run lint && tsc --build"
29
31
  },
30
- "gitHead": "26d2719f4bcab471d2831145e1f03f39f3509869"
32
+ "gitHead": "dfb9ded0b0307754e3185ca34cc49a1384fe8455"
31
33
  }
@@ -0,0 +1,198 @@
1
+ import type { ExprVarArgs, OrderByExpr } from '../types.js';
2
+ import type { WindowFrameNode } from './window-frame.js';
3
+ import { AGGREGATE } from '../constants.js';
4
+ import { asVerbatim } from '../util/ast.js';
5
+ import { nodeList } from '../util/function.js';
6
+ import { isString } from '../util/type-check.js';
7
+ import { ExprNode } from './node.js';
8
+ import { WindowNode } from './window.js';
9
+
10
+ export class AggregateNode extends ExprNode {
11
+ /** The aggregate function name. */
12
+ readonly name: string;
13
+ /** The aggregate function arguments. */
14
+ readonly args: ExprNode[];
15
+ /** The distinct flag. */
16
+ readonly isDistinct: boolean;
17
+ /** Filter criteria. */
18
+ readonly filter: ExprNode | null;
19
+ /** Order by expression for order-sensitive aggregates. */
20
+ readonly order: ExprNode[];
21
+
22
+ /**
23
+ * Instantiate an aggregate function node.
24
+ * @param name The aggregate function name.
25
+ * @param args The aggregate function arguments.
26
+ * @param distinct The distinct flag.
27
+ * @param filter Filter expression.
28
+ * @param argOrder Order by expression.
29
+ */
30
+ constructor(
31
+ name: string,
32
+ args: ExprNode[],
33
+ distinct: boolean = false,
34
+ filter: ExprNode | null = null,
35
+ argOrder: OrderByExpr = []
36
+ ) {
37
+ super(AGGREGATE);
38
+ this.name = name;
39
+ this.args = args;
40
+ this.isDistinct = distinct;
41
+ this.filter = filter;
42
+ this.order = nodeList([argOrder]);
43
+ }
44
+
45
+ /**
46
+ * Return a new derived aggregate over distinct values.
47
+ * @param isDistinct The distinct flag.
48
+ * @returns A new aggregate node.
49
+ */
50
+ distinct(isDistinct: boolean = true) {
51
+ return new AggregateNode(this.name, this.args, isDistinct, this.filter, this.order);
52
+ }
53
+
54
+ /**
55
+ * Return a new derived aggregate function that filters values.
56
+ * @param The filter expression.
57
+ * @returns A new aggregate node.
58
+ */
59
+ where(filter: ExprNode | string) {
60
+ if (isString(filter)) filter = asVerbatim(filter);
61
+ return new AggregateNode(this.name, this.args, this.isDistinct, filter, this.order);
62
+ }
63
+
64
+ /**
65
+ * Return a new derived aggregate function that sorts values prior to aggregation.
66
+ * @param order The order by expression.
67
+ * @returns A new aggregate node.
68
+ */
69
+ argOrder(order: OrderByExpr) {
70
+ return new AggregateNode(this.name, this.args, this.isDistinct, this.filter, order);
71
+ }
72
+
73
+ /**
74
+ * Return a new window function over this aggregate.
75
+ * @returns A new window node.
76
+ */
77
+ window() {
78
+ return new WindowNode(this);
79
+ }
80
+
81
+ /**
82
+ * Return a new window function over this aggregate with the given partitions.
83
+ * @param expr The partition by criteria.
84
+ * @returns A new window node.
85
+ */
86
+ partitionby(...expr: ExprVarArgs[]) {
87
+ return this.window().partitionby(...expr);
88
+ }
89
+
90
+ /**
91
+ * Return a new window function over this aggregate with the given ordering.
92
+ * @param expr The order by criteria.
93
+ * @returns A new window node.
94
+ */
95
+ orderby(...expr: ExprVarArgs[]) {
96
+ return this.window().orderby(...expr);
97
+ }
98
+
99
+ /**
100
+ * Return a new window function over this aggregate with the given frame.
101
+ * @param framedef The window frame definition.
102
+ * @returns A new window node.
103
+ */
104
+ frame(framedef: WindowFrameNode) {
105
+ return this.window().frame(framedef);
106
+ }
107
+
108
+ /**
109
+ * Generate a SQL query string for this node.
110
+ */
111
+ toString() {
112
+ const { name, args, isDistinct, filter, order } = this;
113
+ const arg = [
114
+ isDistinct ? 'DISTINCT' : '',
115
+ args?.length ? args.join(', ')
116
+ : name.toLowerCase() === 'count' ? '*'
117
+ : '',
118
+ order.length ? `ORDER BY ${order.join(', ')}` : ''
119
+ ].filter(x => x).join(' ');
120
+ const filt = filter ? ` FILTER (WHERE ${filter})` : '';
121
+ return `${name}(${arg})${filt}`;
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Check if a function name corresponds to an aggregate function.
127
+ * @param name The function name to check
128
+ * @returns True if a known aggregate function, false otherwise.
129
+ */
130
+ export function isAggregateFunction(name: string) {
131
+ return aggregateNames.includes(name.toLowerCase());
132
+ }
133
+
134
+ /**
135
+ * An array of known aggregate function names.
136
+ * From https://duckdb.org/docs/sql/functions/aggregates.html.
137
+ */
138
+ export const aggregateNames = [
139
+ 'any_value',
140
+ 'approx_count_distinct',
141
+ 'approx_quantile',
142
+ 'arbitrary',
143
+ 'arg_max',
144
+ 'arg_max_null',
145
+ 'arg_min',
146
+ 'arg_min_null',
147
+ 'array_agg',
148
+ 'avg',
149
+ 'bit_and',
150
+ 'bit_or',
151
+ 'bit_xor',
152
+ 'bitstring_agg',
153
+ 'bool_and',
154
+ 'bool_or',
155
+ 'corr',
156
+ 'count',
157
+ 'count_star',
158
+ 'covar_pop',
159
+ 'covar_samp',
160
+ 'entropy',
161
+ 'favg',
162
+ 'first',
163
+ 'fsum',
164
+ 'geomean',
165
+ 'kurtosis_pop',
166
+ 'kurtosis',
167
+ 'last',
168
+ 'mad',
169
+ 'max',
170
+ 'max_by',
171
+ 'median',
172
+ 'min',
173
+ 'min_by',
174
+ 'mode',
175
+ 'product',
176
+ 'quantile',
177
+ 'quantile_cont',
178
+ 'quantile_disc',
179
+ 'regr_avgx',
180
+ 'regr_avgy',
181
+ 'regr_count',
182
+ 'regr_intercept',
183
+ 'regr_r2',
184
+ 'regr_sxx',
185
+ 'regr_sxy',
186
+ 'regr_syy',
187
+ 'regr_slope',
188
+ 'reservoir_quantile',
189
+ 'skewness',
190
+ 'stddev',
191
+ 'stddev_pop',
192
+ 'stddev_samp',
193
+ 'string_agg',
194
+ 'sum',
195
+ 'variance',
196
+ 'var_pop',
197
+ 'var_samp'
198
+ ];
@@ -1,34 +1,31 @@
1
1
  import { BETWEEN_OPERATOR, NOT_BETWEEN_OPERATOR } from '../constants.js';
2
2
  import { ExprNode } from './node.js';
3
3
 
4
+ export type Extent = [ExprNode, ExprNode] | null;
5
+
4
6
  class AbstractBetweenOpNode extends ExprNode {
7
+ /** The input expression. */
8
+ readonly expr: ExprNode;
9
+ /** The range extent. */
10
+ readonly extent?: Extent;
11
+
5
12
  /**
6
13
  * Instantiate an abstract between operator node.
7
- * @param {string} type The node type.
8
- * @param {ExprNode} expr The input expression.
9
- * @param {[ExprNode, ExprNode]} extent The range extent.
14
+ * @param type The node type.
15
+ * @param expr The input expression.
16
+ * @param extent The range extent.
10
17
  */
11
- constructor(type, expr, extent) {
18
+ constructor(type: string, expr: ExprNode, extent?: Extent) {
12
19
  super(type);
13
- /**
14
- * The input expression.
15
- * @type {ExprNode}
16
- * @readonly
17
- */
18
20
  this.expr = expr;
19
- /**
20
- * The range extent.
21
- * @type {[ExprNode, ExprNode]}
22
- * @readonly
23
- */
24
21
  this.extent = extent;
25
22
  }
26
23
 
27
24
  /**
28
25
  * Generate a SQL query string for this node.
29
- * @returns {string}
26
+ * @param op The operator to apply.
30
27
  */
31
- toSQL(op) {
28
+ toSQL(op: string) {
32
29
  const { extent: r, expr } = this;
33
30
  return r ? `(${expr} ${op} ${r[0]} AND ${r[1]})` : '';
34
31
  }
@@ -37,17 +34,15 @@ class AbstractBetweenOpNode extends ExprNode {
37
34
  export class BetweenOpNode extends AbstractBetweenOpNode {
38
35
  /**
39
36
  * Instantiate a between operator node.
40
- * @param {ExprNode} expr The input expression.
41
- * @param {[ExprNode, ExprNode]} extent
42
- * The range extent.
37
+ * @param expr The input expression.
38
+ * @param extent The range extent.
43
39
  */
44
- constructor(expr, extent) {
40
+ constructor(expr: ExprNode, extent?: Extent) {
45
41
  super(BETWEEN_OPERATOR, expr, extent);
46
42
  }
47
43
 
48
44
  /**
49
45
  * Generate a SQL query string for this node.
50
- * @returns {string}
51
46
  */
52
47
  toString() {
53
48
  return super.toSQL('BETWEEN');
@@ -57,17 +52,15 @@ export class BetweenOpNode extends AbstractBetweenOpNode {
57
52
  export class NotBetweenOpNode extends AbstractBetweenOpNode {
58
53
  /**
59
54
  * Instantiate a not between operator node.
60
- * @param {ExprNode} expr The input expression.
61
- * @param {[ExprNode, ExprNode]} extent
62
- * The range extent.
55
+ * @param expr The input expression.
56
+ * @param extent The range extent.
63
57
  */
64
- constructor(expr, extent) {
58
+ constructor(expr: ExprNode, extent?: Extent) {
65
59
  super(NOT_BETWEEN_OPERATOR, expr, extent);
66
60
  }
67
61
 
68
62
  /**
69
63
  * Generate a SQL query string for this node.
70
- * @returns {string}
71
64
  */
72
65
  toString() {
73
66
  return super.toSQL('NOT BETWEEN');
@@ -0,0 +1,31 @@
1
+ import { BINARY_OPERATOR } from '../constants.js';
2
+ import { ExprNode } from './node.js';
3
+
4
+ export class BinaryOpNode extends ExprNode {
5
+ /** The operator type. */
6
+ readonly op: string;
7
+ /** The left input expression. */
8
+ readonly left: ExprNode;
9
+ /** The right input expression. */
10
+ readonly right: ExprNode;
11
+
12
+ /**
13
+ * Instantiate a binary operator node.
14
+ * @param op The operator type.
15
+ * @param left The left input expression.
16
+ * @param right The right input expression.
17
+ */
18
+ constructor(op: string, left: ExprNode, right: ExprNode) {
19
+ super(BINARY_OPERATOR);
20
+ this.op = op;
21
+ this.left = left;
22
+ this.right = right;
23
+ }
24
+
25
+ /**
26
+ * Generate a SQL query string for this node.
27
+ */
28
+ toString() {
29
+ return `(${this.left} ${this.op} ${this.right})`;
30
+ }
31
+ }