@uwdata/mosaic-sql 0.17.0 → 0.19.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 (429) hide show
  1. package/LICENSE +47 -0
  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/list.d.ts +15 -0
  56. package/dist/src/ast/list.d.ts.map +1 -0
  57. package/dist/src/ast/list.js +21 -0
  58. package/dist/src/ast/list.js.map +1 -0
  59. package/dist/src/ast/literal.d.ts +16 -0
  60. package/dist/src/ast/literal.d.ts.map +1 -0
  61. package/dist/src/ast/literal.js +53 -0
  62. package/dist/src/ast/literal.js.map +1 -0
  63. package/dist/src/ast/logical-op.d.ts +32 -0
  64. package/dist/src/ast/logical-op.d.ts.map +1 -0
  65. package/dist/src/ast/logical-op.js +46 -0
  66. package/dist/src/ast/logical-op.js.map +1 -0
  67. package/dist/src/ast/node.d.ts +25 -0
  68. package/dist/src/ast/node.d.ts.map +1 -0
  69. package/dist/src/ast/node.js +36 -0
  70. package/dist/src/ast/node.js.map +1 -0
  71. package/dist/src/ast/order-by.d.ts +21 -0
  72. package/dist/src/ast/order-by.d.ts.map +1 -0
  73. package/dist/src/ast/order-by.js +36 -0
  74. package/dist/src/ast/order-by.js.map +1 -0
  75. package/dist/src/ast/param.d.ts +20 -0
  76. package/dist/src/ast/param.d.ts.map +1 -0
  77. package/dist/src/ast/param.js +28 -0
  78. package/dist/src/ast/param.js.map +1 -0
  79. package/dist/src/ast/query.d.ts +334 -0
  80. package/dist/src/ast/query.d.ts.map +1 -0
  81. package/dist/src/ast/query.js +640 -0
  82. package/dist/src/ast/query.js.map +1 -0
  83. package/dist/src/ast/sample.d.ts +27 -0
  84. package/dist/src/ast/sample.d.ts.map +1 -0
  85. package/dist/src/ast/sample.js +38 -0
  86. package/dist/src/ast/sample.js.map +1 -0
  87. package/dist/src/ast/select.d.ts +19 -0
  88. package/dist/src/ast/select.d.ts.map +1 -0
  89. package/dist/src/ast/select.js +35 -0
  90. package/dist/src/ast/select.js.map +1 -0
  91. package/dist/src/ast/subquery.d.ts +16 -0
  92. package/dist/src/ast/subquery.d.ts.map +1 -0
  93. package/dist/src/ast/subquery.js +21 -0
  94. package/dist/src/ast/subquery.js.map +1 -0
  95. package/dist/src/ast/table-ref.d.ts +24 -0
  96. package/dist/src/ast/table-ref.d.ts.map +1 -0
  97. package/dist/src/ast/table-ref.js +35 -0
  98. package/dist/src/ast/table-ref.js.map +1 -0
  99. package/dist/src/ast/unary-op.d.ts +40 -0
  100. package/dist/src/ast/unary-op.d.ts.map +1 -0
  101. package/dist/src/ast/unary-op.js +52 -0
  102. package/dist/src/ast/unary-op.js.map +1 -0
  103. package/dist/src/ast/unnest.d.ts +19 -0
  104. package/dist/src/ast/unnest.d.ts.map +1 -0
  105. package/dist/src/ast/unnest.js +29 -0
  106. package/dist/src/ast/unnest.js.map +1 -0
  107. package/dist/src/ast/verbatim.d.ts +18 -0
  108. package/dist/src/ast/verbatim.d.ts.map +1 -0
  109. package/dist/src/ast/verbatim.js +25 -0
  110. package/dist/src/ast/verbatim.js.map +1 -0
  111. package/dist/src/ast/window-frame.d.ts +54 -0
  112. package/dist/src/ast/window-frame.d.ts.map +1 -0
  113. package/dist/src/ast/window-frame.js +79 -0
  114. package/dist/src/ast/window-frame.js.map +1 -0
  115. package/dist/src/ast/window.d.ts +128 -0
  116. package/dist/src/ast/window.d.ts.map +1 -0
  117. package/dist/src/ast/window.js +194 -0
  118. package/dist/src/ast/window.js.map +1 -0
  119. package/dist/src/ast/with.d.ts +25 -0
  120. package/dist/src/ast/with.d.ts.map +1 -0
  121. package/dist/src/ast/with.js +36 -0
  122. package/dist/src/ast/with.js.map +1 -0
  123. package/dist/src/constants.d.ts +40 -0
  124. package/dist/src/constants.d.ts.map +1 -0
  125. package/dist/src/constants.js +40 -0
  126. package/dist/src/constants.js.map +1 -0
  127. package/dist/src/functions/aggregate.d.ts +236 -0
  128. package/dist/src/functions/aggregate.d.ts.map +1 -0
  129. package/dist/src/functions/aggregate.js +308 -0
  130. package/dist/src/functions/aggregate.js.map +1 -0
  131. package/dist/src/functions/case.d.ts +13 -0
  132. package/dist/src/functions/case.d.ts.map +1 -0
  133. package/dist/src/functions/case.js +17 -0
  134. package/dist/src/functions/case.js.map +1 -0
  135. package/dist/src/functions/cast.d.ts +23 -0
  136. package/dist/src/functions/cast.d.ts.map +1 -0
  137. package/dist/src/functions/cast.js +32 -0
  138. package/dist/src/functions/cast.js.map +1 -0
  139. package/dist/src/functions/collate.d.ts +10 -0
  140. package/dist/src/functions/collate.d.ts.map +1 -0
  141. package/dist/src/functions/collate.js +12 -0
  142. package/dist/src/functions/collate.js.map +1 -0
  143. package/dist/src/functions/column.d.ts +10 -0
  144. package/dist/src/functions/column.d.ts.map +1 -0
  145. package/dist/src/functions/column.js +17 -0
  146. package/dist/src/functions/column.js.map +1 -0
  147. package/dist/src/functions/cte.d.ts +13 -0
  148. package/dist/src/functions/cte.d.ts.map +1 -0
  149. package/dist/src/functions/cte.js +14 -0
  150. package/dist/src/functions/cte.js.map +1 -0
  151. package/dist/src/functions/datetime.d.ts +32 -0
  152. package/dist/src/functions/datetime.d.ts.map +1 -0
  153. package/dist/src/functions/datetime.js +45 -0
  154. package/dist/src/functions/datetime.js.map +1 -0
  155. package/dist/src/functions/interval.d.ts +48 -0
  156. package/dist/src/functions/interval.d.ts.map +1 -0
  157. package/dist/src/functions/interval.js +66 -0
  158. package/dist/src/functions/interval.js.map +1 -0
  159. package/dist/src/functions/list.d.ts +31 -0
  160. package/dist/src/functions/list.d.ts.map +1 -0
  161. package/dist/src/functions/list.js +49 -0
  162. package/dist/src/functions/list.js.map +1 -0
  163. package/dist/src/functions/literal.d.ts +16 -0
  164. package/dist/src/functions/literal.d.ts.map +1 -0
  165. package/dist/src/functions/literal.js +20 -0
  166. package/dist/src/functions/literal.js.map +1 -0
  167. package/dist/src/functions/numeric.d.ts +80 -0
  168. package/dist/src/functions/numeric.d.ts.map +1 -0
  169. package/dist/src/functions/numeric.js +110 -0
  170. package/dist/src/functions/numeric.js.map +1 -0
  171. package/dist/src/functions/operators.d.ts +169 -0
  172. package/dist/src/functions/operators.d.ts.map +1 -0
  173. package/dist/src/functions/operators.js +235 -0
  174. package/dist/src/functions/operators.js.map +1 -0
  175. package/dist/src/functions/order-by.d.ts +15 -0
  176. package/dist/src/functions/order-by.d.ts.map +1 -0
  177. package/dist/src/functions/order-by.js +19 -0
  178. package/dist/src/functions/order-by.js.map +1 -0
  179. package/dist/src/functions/spatial.d.ts +32 -0
  180. package/dist/src/functions/spatial.d.ts.map +1 -0
  181. package/dist/src/functions/spatial.js +44 -0
  182. package/dist/src/functions/spatial.js.map +1 -0
  183. package/dist/src/functions/sql-template-tag.d.ts +13 -0
  184. package/dist/src/functions/sql-template-tag.d.ts.map +1 -0
  185. package/dist/src/functions/sql-template-tag.js +44 -0
  186. package/dist/src/functions/sql-template-tag.js.map +1 -0
  187. package/dist/src/functions/string.d.ts +49 -0
  188. package/dist/src/functions/string.d.ts.map +1 -0
  189. package/dist/src/functions/string.js +67 -0
  190. package/dist/src/functions/string.js.map +1 -0
  191. package/dist/src/functions/table-ref.d.ts +10 -0
  192. package/dist/src/functions/table-ref.d.ts.map +1 -0
  193. package/dist/src/functions/table-ref.js +13 -0
  194. package/dist/src/functions/table-ref.js.map +1 -0
  195. package/dist/src/functions/unnest.d.ts +10 -0
  196. package/dist/src/functions/unnest.d.ts.map +1 -0
  197. package/dist/src/functions/unnest.js +12 -0
  198. package/dist/src/functions/unnest.js.map +1 -0
  199. package/dist/src/functions/util.d.ts +7 -0
  200. package/dist/src/functions/util.d.ts.map +1 -0
  201. package/dist/src/functions/util.js +9 -0
  202. package/dist/src/functions/util.js.map +1 -0
  203. package/dist/src/functions/window-frame.d.ts +41 -0
  204. package/dist/src/functions/window-frame.d.ts.map +1 -0
  205. package/dist/src/functions/window-frame.js +52 -0
  206. package/dist/src/functions/window-frame.js.map +1 -0
  207. package/dist/src/functions/window.d.ts +74 -0
  208. package/dist/src/functions/window.d.ts.map +1 -0
  209. package/dist/src/functions/window.js +96 -0
  210. package/dist/src/functions/window.js.map +1 -0
  211. package/dist/src/index.d.ts +73 -0
  212. package/dist/src/index.d.ts.map +1 -0
  213. package/{src → dist/src}/index.js +8 -8
  214. package/dist/src/index.js.map +1 -0
  215. package/dist/src/load/create.d.ts +10 -0
  216. package/dist/src/load/create.d.ts.map +1 -0
  217. package/dist/src/load/create.js +14 -0
  218. package/dist/src/load/create.js.map +1 -0
  219. package/dist/src/load/extension.d.ts +2 -0
  220. package/dist/src/load/extension.d.ts.map +1 -0
  221. package/dist/src/load/extension.js +4 -0
  222. package/dist/src/load/extension.js.map +1 -0
  223. package/dist/src/load/load.d.ts +18 -0
  224. package/dist/src/load/load.d.ts.map +1 -0
  225. package/dist/src/load/load.js +80 -0
  226. package/dist/src/load/load.js.map +1 -0
  227. package/dist/src/load/sql-from.d.ts +14 -0
  228. package/dist/src/load/sql-from.d.ts.map +1 -0
  229. package/dist/src/load/sql-from.js +29 -0
  230. package/dist/src/load/sql-from.js.map +1 -0
  231. package/dist/src/transforms/bin-1d.d.ts +16 -0
  232. package/dist/src/transforms/bin-1d.d.ts.map +1 -0
  233. package/dist/src/transforms/bin-1d.js +21 -0
  234. package/dist/src/transforms/bin-1d.js.map +1 -0
  235. package/dist/src/transforms/bin-2d.d.ts +19 -0
  236. package/dist/src/transforms/bin-2d.d.ts.map +1 -0
  237. package/dist/src/transforms/bin-2d.js +27 -0
  238. package/dist/src/transforms/bin-2d.js.map +1 -0
  239. package/dist/src/transforms/bin-date.d.ts +31 -0
  240. package/dist/src/transforms/bin-date.d.ts.map +1 -0
  241. package/dist/src/transforms/bin-date.js +20 -0
  242. package/dist/src/transforms/bin-date.js.map +1 -0
  243. package/dist/src/transforms/bin-histogram.d.ts +37 -0
  244. package/dist/src/transforms/bin-histogram.d.ts.map +1 -0
  245. package/dist/src/transforms/bin-histogram.js +32 -0
  246. package/dist/src/transforms/bin-histogram.js.map +1 -0
  247. package/dist/src/transforms/bin-linear-1d.d.ts +11 -0
  248. package/dist/src/transforms/bin-linear-1d.d.ts.map +1 -0
  249. package/dist/src/transforms/bin-linear-1d.js +25 -0
  250. package/dist/src/transforms/bin-linear-1d.js.map +1 -0
  251. package/dist/src/transforms/bin-linear-2d.d.ts +20 -0
  252. package/dist/src/transforms/bin-linear-2d.d.ts.map +1 -0
  253. package/dist/src/transforms/bin-linear-2d.js +49 -0
  254. package/dist/src/transforms/bin-linear-2d.js.map +1 -0
  255. package/dist/src/transforms/filter-query.d.ts +12 -0
  256. package/dist/src/transforms/filter-query.d.ts.map +1 -0
  257. package/dist/src/transforms/filter-query.js +39 -0
  258. package/dist/src/transforms/filter-query.js.map +1 -0
  259. package/dist/src/transforms/line-density.d.ts +24 -0
  260. package/dist/src/transforms/line-density.d.ts.map +1 -0
  261. package/dist/src/transforms/line-density.js +98 -0
  262. package/dist/src/transforms/line-density.js.map +1 -0
  263. package/dist/src/transforms/m4.d.ts +19 -0
  264. package/dist/src/transforms/m4.d.ts.map +1 -0
  265. package/dist/src/transforms/m4.js +38 -0
  266. package/dist/src/transforms/m4.js.map +1 -0
  267. package/dist/src/transforms/scales.d.ts +30 -0
  268. package/dist/src/transforms/scales.d.ts.map +1 -0
  269. package/dist/src/transforms/scales.js +103 -0
  270. package/dist/src/transforms/scales.js.map +1 -0
  271. package/dist/src/transforms/util/bin-step.d.ts +50 -0
  272. package/dist/src/transforms/util/bin-step.d.ts.map +1 -0
  273. package/dist/src/transforms/util/bin-step.js +53 -0
  274. package/dist/src/transforms/util/bin-step.js.map +1 -0
  275. package/dist/src/transforms/util/time-interval.d.ts +14 -0
  276. package/dist/src/transforms/util/time-interval.d.ts.map +1 -0
  277. package/dist/src/transforms/util/time-interval.js +88 -0
  278. package/dist/src/transforms/util/time-interval.js.map +1 -0
  279. package/dist/src/types.d.ts +49 -0
  280. package/dist/src/types.d.ts.map +1 -0
  281. package/dist/src/types.js +2 -0
  282. package/dist/src/types.js.map +1 -0
  283. package/dist/src/util/ast.d.ts +62 -0
  284. package/dist/src/util/ast.d.ts.map +1 -0
  285. package/{src → dist/src}/util/ast.js +36 -41
  286. package/dist/src/util/ast.js.map +1 -0
  287. package/dist/src/util/function.d.ts +56 -0
  288. package/dist/src/util/function.d.ts.map +1 -0
  289. package/dist/src/util/function.js +73 -0
  290. package/dist/src/util/function.js.map +1 -0
  291. package/dist/src/util/identity.d.ts +6 -0
  292. package/dist/src/util/identity.d.ts.map +1 -0
  293. package/dist/src/util/identity.js +8 -0
  294. package/dist/src/util/identity.js.map +1 -0
  295. package/dist/src/util/string.d.ts +4 -0
  296. package/dist/src/util/string.d.ts.map +1 -0
  297. package/dist/src/util/string.js +14 -0
  298. package/dist/src/util/string.js.map +1 -0
  299. package/dist/src/util/type-check.d.ts +17 -0
  300. package/dist/src/util/type-check.d.ts.map +1 -0
  301. package/dist/src/util/type-check.js +28 -0
  302. package/dist/src/util/type-check.js.map +1 -0
  303. package/dist/src/visit/clone.d.ts +7 -0
  304. package/dist/src/visit/clone.d.ts.map +1 -0
  305. package/dist/src/visit/clone.js +52 -0
  306. package/dist/src/visit/clone.js.map +1 -0
  307. package/dist/src/visit/recurse.d.ts +2 -0
  308. package/dist/src/visit/recurse.d.ts.map +1 -0
  309. package/dist/src/visit/recurse.js +37 -0
  310. package/dist/src/visit/recurse.js.map +1 -0
  311. package/dist/src/visit/rewrite.d.ts +9 -0
  312. package/dist/src/visit/rewrite.d.ts.map +1 -0
  313. package/dist/src/visit/rewrite.js +39 -0
  314. package/dist/src/visit/rewrite.js.map +1 -0
  315. package/dist/src/visit/visitors.d.ts +32 -0
  316. package/dist/src/visit/visitors.d.ts.map +1 -0
  317. package/dist/src/visit/visitors.js +95 -0
  318. package/dist/src/visit/visitors.js.map +1 -0
  319. package/dist/src/visit/walk.d.ts +21 -0
  320. package/dist/src/visit/walk.d.ts.map +1 -0
  321. package/dist/src/visit/walk.js +32 -0
  322. package/dist/src/visit/walk.js.map +1 -0
  323. package/package.json +13 -7
  324. package/src/ast/{aggregate.js → aggregate.ts} +49 -60
  325. package/src/ast/{between-op.js → between-op.ts} +19 -26
  326. package/src/ast/binary-op.ts +31 -0
  327. package/src/ast/{case.js → case.ts} +29 -44
  328. package/src/ast/{cast.js → cast.ts} +8 -14
  329. package/src/ast/{collate.js → collate.ts} +8 -14
  330. package/src/ast/column-param.ts +34 -0
  331. package/src/ast/{column-ref.js → column-ref.ts} +16 -25
  332. package/src/ast/fragment.ts +28 -0
  333. package/src/ast/{from.js → from.ts} +12 -21
  334. package/src/ast/{function.js → function.ts} +8 -14
  335. package/src/ast/{in-op.js → in-op.ts} +8 -14
  336. package/src/ast/{interval.js → interval.ts} +8 -14
  337. package/src/ast/list.ts +23 -0
  338. package/src/ast/{literal.js → literal.ts} +6 -9
  339. package/src/ast/logical-op.ts +50 -0
  340. package/src/ast/{node.js → node.ts} +10 -13
  341. package/src/ast/order-by.ts +38 -0
  342. package/src/ast/{param.js → param.ts} +6 -12
  343. package/src/ast/{query.js → query.ts} +224 -204
  344. package/src/ast/sample.ts +47 -0
  345. package/src/ast/{select.js → select.ts} +10 -16
  346. package/src/ast/{subquery.js → subquery.ts} +9 -8
  347. package/src/ast/{table-ref.js → table-ref.ts} +7 -12
  348. package/src/ast/{unary-op.js → unary-op.ts} +16 -23
  349. package/src/ast/unnest.ts +31 -0
  350. package/src/ast/verbatim.ts +27 -0
  351. package/src/ast/{window-frame.js → window-frame.ts} +37 -47
  352. package/src/ast/window.ts +246 -0
  353. package/src/ast/{with.js → with.ts} +19 -20
  354. package/src/{constants.js → constants.ts} +2 -0
  355. package/src/functions/aggregate.ts +344 -0
  356. package/src/functions/{case.js → case.ts} +5 -8
  357. package/src/functions/{cast.js → cast.ts} +9 -13
  358. package/src/functions/{collate.js → collate.ts} +4 -7
  359. package/src/functions/{column.js → column.ts} +9 -10
  360. package/src/functions/{cte.js → cte.ts} +9 -6
  361. package/src/functions/{datetime.js → datetime.ts} +12 -20
  362. package/src/functions/interval.ts +74 -0
  363. package/src/functions/list.ts +63 -0
  364. package/src/functions/{literal.js → literal.ts} +5 -7
  365. package/src/functions/numeric.ts +125 -0
  366. package/src/functions/operators.ts +272 -0
  367. package/src/functions/order-by.ts +21 -0
  368. package/src/functions/spatial.ts +50 -0
  369. package/src/functions/{sql-template-tag.js → sql-template-tag.ts} +16 -13
  370. package/src/functions/string.ts +79 -0
  371. package/src/functions/{table-ref.js → table-ref.ts} +4 -4
  372. package/src/functions/unnest.ts +13 -0
  373. package/src/functions/util.ts +10 -0
  374. package/src/functions/window-frame.ts +58 -0
  375. package/src/functions/{window.js → window.ts} +18 -35
  376. package/src/index.ts +79 -0
  377. package/src/load/{create.js → create.ts} +9 -3
  378. package/src/load/extension.ts +3 -0
  379. package/src/load/{load.js → load.ts} +25 -10
  380. package/src/load/{sql-from.js → sql-from.ts} +14 -7
  381. package/src/transforms/{bin-1d.js → bin-1d.ts} +13 -9
  382. package/src/transforms/{bin-2d.js → bin-2d.ts} +17 -13
  383. package/src/transforms/bin-date.ts +48 -0
  384. package/src/transforms/bin-histogram.ts +61 -0
  385. package/src/transforms/{bin-linear-1d.js → bin-linear-1d.ts} +16 -11
  386. package/src/transforms/{bin-linear-2d.js → bin-linear-2d.ts} +23 -35
  387. package/src/transforms/{filter-query.js → filter-query.ts} +10 -14
  388. package/src/transforms/{line-density.js → line-density.ts} +19 -17
  389. package/src/transforms/{m4.js → m4.ts} +17 -14
  390. package/src/transforms/{scales.js → scales.ts} +57 -14
  391. package/src/transforms/util/bin-step.ts +100 -0
  392. package/src/transforms/util/{time-interval.js → time-interval.ts} +32 -21
  393. package/src/types.ts +5 -39
  394. package/src/util/ast.ts +104 -0
  395. package/src/util/{function.js → function.ts} +40 -31
  396. package/src/util/identity.ts +7 -0
  397. package/src/util/{string.js → string.ts} +4 -4
  398. package/src/util/type-check.ts +31 -0
  399. package/src/visit/{clone.js → clone.ts} +10 -10
  400. package/src/visit/{recurse.js → recurse.ts} +3 -1
  401. package/src/visit/{rewrite.js → rewrite.ts} +7 -7
  402. package/src/visit/{visitors.js → visitors.ts} +22 -30
  403. package/src/visit/walk.ts +46 -0
  404. package/src/ast/binary-op.js +0 -40
  405. package/src/ast/column-param.js +0 -40
  406. package/src/ast/fragment.js +0 -26
  407. package/src/ast/logical-op.js +0 -67
  408. package/src/ast/order-by.js +0 -48
  409. package/src/ast/sample.js +0 -53
  410. package/src/ast/verbatim.js +0 -33
  411. package/src/ast/window.js +0 -260
  412. package/src/functions/aggregate.js +0 -347
  413. package/src/functions/interval.js +0 -83
  414. package/src/functions/numeric.js +0 -143
  415. package/src/functions/operators.js +0 -301
  416. package/src/functions/order-by.js +0 -27
  417. package/src/functions/spatial.js +0 -59
  418. package/src/functions/string.js +0 -85
  419. package/src/functions/util.js +0 -14
  420. package/src/functions/window-frame.js +0 -61
  421. package/src/index-types.ts +0 -2
  422. package/src/load/extension.js +0 -3
  423. package/src/transforms/bin-date.js +0 -38
  424. package/src/transforms/bin-histogram.js +0 -52
  425. package/src/transforms/util/bin-step.js +0 -79
  426. package/src/util/type-check.js +0 -33
  427. package/src/visit/walk.js +0 -34
  428. package/tsconfig.json +0 -8
  429. package/vitest.config.ts +0 -3
@@ -0,0 +1,39 @@
1
+ import { isSelectQuery } from '../ast/query.js';
2
+ import { isTableRef } from '../ast/table-ref.js';
3
+ import { deepClone } from '../visit/clone.js';
4
+ import { walk } from '../visit/walk.js';
5
+ /**
6
+ * Returns a generator function that clones the given query and adds
7
+ * a WHERE clause for the specified table reference.
8
+ * @param query The query to clone and extend.
9
+ * @param tableRef The table to filter.
10
+ * @returns The generator function.
11
+ */
12
+ export function filterQuery(query, tableRef) {
13
+ return (filter) => {
14
+ const clone = deepClone(query);
15
+ walk(clone, (node) => {
16
+ if (isSelectQuery(node) &&
17
+ node._from.length === 1 &&
18
+ isTableRef(node._from[0].expr) &&
19
+ arrayEquals(node._from[0].expr.table, tableRef.table)) {
20
+ node.where(filter);
21
+ }
22
+ });
23
+ return clone;
24
+ };
25
+ }
26
+ function arrayEquals(a, b) {
27
+ if (a === b)
28
+ return true;
29
+ if (a == null || b == null)
30
+ return false;
31
+ if (a.length !== b.length)
32
+ return false;
33
+ for (let i = 0; i < a.length; ++i) {
34
+ if (a[i] !== b[i])
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ //# sourceMappingURL=filter-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-query.js","sourceRoot":"","sources":["../../../src/transforms/filter-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,QAAsB;IAC9D,OAAO,CAAC,MAAkB,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,IACE,aAAa,CAAC,IAAI,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EACrD,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAY,EAAE,CAAY;IAC7C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ExprValue } from '../types.js';
2
+ import { type SelectQuery } from '../ast/query.js';
3
+ /**
4
+ * Compute line segment densities over a gridded 2D domain. The returned
5
+ * query uses multiple subqueries (CTEs) to identify line segment end point
6
+ * pairs, perform line rasterization in-database, normalize arc lengths,
7
+ * and then sum results for all line series to produce a density map.
8
+ * Based on Moritz and Fisher's work: https://arxiv.org/abs/1808.06019
9
+ * @param q The base query over the data.
10
+ * @param x Bin expression for x dimension.
11
+ * Provides gridded x coordinates, potentially with a fractional component.
12
+ * @param y Bin expression for x dimension.
13
+ * Provides gridded y coordinates, potentially with a fractional component.
14
+ * @param z Group by columns that segment data into individual line
15
+ * series. An empty array indicates there is only a single line series.
16
+ * @param xn The number of grid bins for the x dimension.
17
+ * @param yn The number of grid bins for the y dimension.
18
+ * @param groupby Additional group by expressions. Separate
19
+ * line density maps are created for each of these groups.
20
+ * @param normalize Flag toggling approximate arc-length normalization to
21
+ * improve accuracy and reduce artifacts (default `true`).
22
+ */
23
+ export declare function lineDensity(q: SelectQuery, x: ExprValue, y: ExprValue, z: string[], xn: number, yn: number, groupby?: string[], normalize?: boolean): SelectQuery;
24
+ //# sourceMappingURL=line-density.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-density.d.ts","sourceRoot":"","sources":["../../../src/transforms/line-density.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAS,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAU1D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,MAAM,EAAE,EACX,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,MAAM,EAAO,EACtB,SAAS,GAAE,OAAc,eA+E1B"}
@@ -0,0 +1,98 @@
1
+ import { Query } from '../ast/query.js';
2
+ import { count, max, sum } from '../functions/aggregate.js';
3
+ import { int32 } from '../functions/cast.js';
4
+ import { abs, floor, greatest, round, sign } from '../functions/numeric.js';
5
+ import { add, div, gt, isNull, lt, lte, mul, or, sub } from '../functions/operators.js';
6
+ import { asc } from '../functions/order-by.js';
7
+ import { sql } from '../functions/sql-template-tag.js';
8
+ import { lead } from '../functions/window.js';
9
+ import { over } from '../util/ast.js';
10
+ /**
11
+ * Compute line segment densities over a gridded 2D domain. The returned
12
+ * query uses multiple subqueries (CTEs) to identify line segment end point
13
+ * pairs, perform line rasterization in-database, normalize arc lengths,
14
+ * and then sum results for all line series to produce a density map.
15
+ * Based on Moritz and Fisher's work: https://arxiv.org/abs/1808.06019
16
+ * @param q The base query over the data.
17
+ * @param x Bin expression for x dimension.
18
+ * Provides gridded x coordinates, potentially with a fractional component.
19
+ * @param y Bin expression for x dimension.
20
+ * Provides gridded y coordinates, potentially with a fractional component.
21
+ * @param z Group by columns that segment data into individual line
22
+ * series. An empty array indicates there is only a single line series.
23
+ * @param xn The number of grid bins for the x dimension.
24
+ * @param yn The number of grid bins for the y dimension.
25
+ * @param groupby Additional group by expressions. Separate
26
+ * line density maps are created for each of these groups.
27
+ * @param normalize Flag toggling approximate arc-length normalization to
28
+ * improve accuracy and reduce artifacts (default `true`).
29
+ */
30
+ export function lineDensity(q, x, y, z, xn, yn, groupby = [], normalize = true) {
31
+ // select x, y points binned to the grid
32
+ q.select({
33
+ x: int32(floor(x)),
34
+ y: int32(floor(y))
35
+ });
36
+ // select line segment end point pairs
37
+ // retain only segments within the grid region
38
+ const groups = groupby.concat(z);
39
+ const pairs = Query
40
+ .from(q)
41
+ .select(groups, {
42
+ x0: 'x',
43
+ y0: 'y',
44
+ dx: sub(lead('x').over('sw'), 'x'),
45
+ dy: sub(lead('y').over('sw'), 'y')
46
+ })
47
+ .window({
48
+ sw: over().partitionby(groups).orderby(asc('x'))
49
+ })
50
+ .qualify([
51
+ or(lt('x0', xn), lt(add('x0', 'dx'), xn)),
52
+ or(lt('y0', yn), lt(add('y0', 'dy'), yn)),
53
+ or(gt('x0', 0), gt(add('x0', 'dx'), 0)),
54
+ or(gt('y0', 0), gt(add('y0', 'dy'), 0))
55
+ ]);
56
+ // create indices to join against for rasterization
57
+ // generate the maximum number of indices needed
58
+ const num = Query
59
+ .select({ x: greatest(max(abs('dx')), max(abs('dy'))) })
60
+ .from('pairs');
61
+ const indices = Query.select({
62
+ i: int32(sql `UNNEST(range((${num})))`)
63
+ });
64
+ // rasterize line segments
65
+ const raster = Query.unionAll(Query
66
+ .select(groups, {
67
+ x: add('x0', 'i'),
68
+ y: add('y0', int32(round(div(mul('i', 'dy'), 'dx'))))
69
+ })
70
+ .from('pairs', 'indices')
71
+ .where([lte(abs('dy'), abs('dx')), lt('i', abs('dx'))]), Query
72
+ .select(groups, {
73
+ x: add('x0', int32(round(div(mul(mul(sign('dy'), 'i'), 'dx'), 'dy')))),
74
+ y: add('y0', mul(sign('dy'), 'i'))
75
+ })
76
+ .from('pairs', 'indices')
77
+ .where([gt(abs('dy'), abs('dx')), lt('i', abs('dy'))]), Query
78
+ .select(groups, { x: 'x0', y: 'y0' })
79
+ .from('pairs')
80
+ .where(isNull('dx')));
81
+ // filter raster, normalize columns for each series
82
+ const points = Query
83
+ .from('raster')
84
+ .select(groups, 'x', 'y', normalize
85
+ ? { w: div(1, count().partitionby(['x'].concat(groups))) }
86
+ : null)
87
+ .where([lte(0, 'x'), lt('x', xn), lte(0, 'y'), lt('y', yn)]);
88
+ // sum normalized, rasterized series into output grids
89
+ return Query
90
+ .with({ pairs, indices, raster, points })
91
+ .from('points')
92
+ .select(groupby, {
93
+ index: add('x', mul('y', int32(xn))),
94
+ density: normalize ? sum('w') : count()
95
+ })
96
+ .groupby('index', groupby);
97
+ }
98
+ //# sourceMappingURL=line-density.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-density.js","sourceRoot":"","sources":["../../../src/transforms/line-density.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ExprValue, FromExpr } from '../types.js';
2
+ import type { ColumnRefNode } from '../ast/column-ref.js';
3
+ /**
4
+ * M4 is an optimization for value-preserving time-series aggregation
5
+ * (https://www.vldb.org/pvldb/vol7/p797-jugel.pdf). This implementation uses
6
+ * an efficient version with a single scan and the aggregate functions
7
+ * argmin and argmax, following https://arxiv.org/pdf/2306.03714.pdf.
8
+ * This method can bin along either the *x* or *y* dimension, as determined
9
+ * by the caller-provided *bin* expression.
10
+ * @param input The base query or table.
11
+ * @param bin An expression that maps
12
+ * time-series values to fractional pixel positions.
13
+ * @param x The x dimension column name.
14
+ * @param y The y dimension column name.
15
+ * @param groups Additional groupby columns, for example for faceted charts.
16
+ * @returns The resulting M4 query.
17
+ */
18
+ export declare function m4(input: FromExpr, bin: ExprValue, x: string, y: string, groups?: ColumnRefNode[]): import("../ast/query.js").SetOperation;
19
+ //# sourceMappingURL=m4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"m4.d.ts","sourceRoot":"","sources":["../../../src/transforms/m4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAO1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,EAAE,CAChB,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,SAAS,EACd,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,GAAE,aAAa,EAAO,0CAyB7B"}
@@ -0,0 +1,38 @@
1
+ import { Query, isQuery } from '../ast/query.js';
2
+ import { argmax, argmin, max, min } from '../functions/aggregate.js';
3
+ import { int32 } from '../functions/cast.js';
4
+ import { cte } from '../functions/cte.js';
5
+ import { floor } from '../functions/numeric.js';
6
+ /**
7
+ * M4 is an optimization for value-preserving time-series aggregation
8
+ * (https://www.vldb.org/pvldb/vol7/p797-jugel.pdf). This implementation uses
9
+ * an efficient version with a single scan and the aggregate functions
10
+ * argmin and argmax, following https://arxiv.org/pdf/2306.03714.pdf.
11
+ * This method can bin along either the *x* or *y* dimension, as determined
12
+ * by the caller-provided *bin* expression.
13
+ * @param input The base query or table.
14
+ * @param bin An expression that maps
15
+ * time-series values to fractional pixel positions.
16
+ * @param x The x dimension column name.
17
+ * @param y The y dimension column name.
18
+ * @param groups Additional groupby columns, for example for faceted charts.
19
+ * @returns The resulting M4 query.
20
+ */
21
+ export function m4(input, bin, x, y, groups = []) {
22
+ const pixel = int32(floor(bin));
23
+ // Below, we treat input as a CTE when it is a query. In this case,
24
+ // we also request that the CTE be explicitly materialized.
25
+ const useCTE = isQuery(input);
26
+ const from = useCTE ? 'input' : input;
27
+ const query = useCTE
28
+ ? Query.with(cte(String(from), input, true))
29
+ : Query;
30
+ const q = (sel) => Query
31
+ .from(from)
32
+ .select(sel)
33
+ .groupby(pixel, groups);
34
+ return query
35
+ .union(q([{ [x]: min(x), [y]: argmin(y, x) }, ...groups]), q([{ [x]: max(x), [y]: argmax(y, x) }, ...groups]), q([{ [x]: argmin(x, y), [y]: min(y) }, ...groups]), q([{ [x]: argmax(x, y), [y]: max(y) }, ...groups]))
36
+ .orderby(groups, x);
37
+ }
38
+ //# sourceMappingURL=m4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"m4.js","sourceRoot":"","sources":["../../../src/transforms/m4.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,EAAE,CAChB,KAAe,EACf,GAAc,EACd,CAAS,EACT,CAAS,EACT,SAA0B,EAAE;IAE5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhC,mEAAmE;IACnE,2DAA2D;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM;QAClB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC;IAEV,MAAM,CAAC,GAAG,CAAC,GAAe,EAAE,EAAE,CAAC,KAAK;SACjC,IAAI,CAAC,IAAI,CAAC;SACV,MAAM,CAAC,GAAG,CAAC;SACX,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE1B,OAAO,KAAK;SACT,KAAK,CACJ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,EAClD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,EAClD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,EAClD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CACnD;SACA,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ExprValue } from '../types.js';
2
+ import { ExprNode } from '../ast/node.js';
3
+ export interface ScaleTransform<T> {
4
+ apply: (value: T) => number;
5
+ invert: (value: number) => T;
6
+ sqlApply: (value: ExprValue) => ExprNode;
7
+ sqlInvert: (value: ExprNode) => ExprNode;
8
+ }
9
+ export type ScaleType = 'identity' | 'linear' | 'log' | 'symlog' | 'sqrt' | 'pow' | 'time' | 'utc';
10
+ export type ScaleDomain = [number, number] | [Date, Date];
11
+ export interface ScaleOptions {
12
+ /** The scale type, such as `'linear'`, `'log'`, etc. */
13
+ type: ScaleType;
14
+ /** The scale domain, as an array of start and end data values. */
15
+ domain?: ScaleDomain;
16
+ /**
17
+ * The scale range, as an array of start and end screen pixels.
18
+ * The range may be omitted for *identity* scales.
19
+ */
20
+ range?: [number, number];
21
+ /** The base of the logarithm. For `'log'` scales only. */
22
+ base?: number;
23
+ /** The constant parameter. For `'symlog'` scales only. */
24
+ constant?: number;
25
+ /** The exponent parameter. For `'pow'` scales only. */
26
+ exponent?: number;
27
+ }
28
+ export type Scale<T> = ScaleTransform<T> & ScaleOptions;
29
+ export declare function scaleTransform<T>(options: ScaleOptions): Scale<T>;
30
+ //# sourceMappingURL=scales.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scales.d.ts","sourceRoot":"","sources":["../../../src/transforms/scales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAS1C,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,QAAQ,CAAC;IACzC,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC;CAC1C;AAED,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,QAAQ,GACR,KAAK,GACL,QAAQ,GACR,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,CACN;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,IAAI,EAAE,SAAS,CAAC;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;AAwFxD,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAKjE"}
@@ -0,0 +1,103 @@
1
+ import { LiteralNode } from '../ast/literal.js';
2
+ import { epoch_ms } from '../functions/datetime.js';
3
+ import { literal } from '../functions/literal.js';
4
+ import { abs, exp, ln, log, sign, sqrt } from '../functions/numeric.js';
5
+ import { add, div, mul, pow, sub } from '../functions/operators.js';
6
+ import { asNode } from '../util/ast.js';
7
+ import { identity } from '../util/identity.js';
8
+ function scaleLinear() {
9
+ return {
10
+ apply: identity,
11
+ invert: identity,
12
+ sqlApply: asNode,
13
+ sqlInvert: identity
14
+ };
15
+ }
16
+ function scaleLog({ base = null } = {}) {
17
+ if (base == null || base === Math.E) {
18
+ return {
19
+ apply: Math.log,
20
+ invert: Math.exp,
21
+ sqlApply: c => ln(c),
22
+ sqlInvert: c => exp(c)
23
+ };
24
+ }
25
+ else if (base === 10) {
26
+ return {
27
+ apply: Math.log10,
28
+ invert: x => Math.pow(10, x),
29
+ sqlApply: c => log(c),
30
+ sqlInvert: c => pow(10, c)
31
+ };
32
+ }
33
+ else {
34
+ const b = +base;
35
+ return {
36
+ apply: x => Math.log(x) / Math.log(b),
37
+ invert: x => Math.pow(b, x),
38
+ sqlApply: c => div(ln(c), ln(b)),
39
+ sqlInvert: c => pow(b, c)
40
+ };
41
+ }
42
+ }
43
+ function scaleSymlog({ constant = 1 } = {}) {
44
+ const _ = +constant;
45
+ return {
46
+ apply: x => Math.sign(x) * Math.log1p(Math.abs(x)),
47
+ invert: x => Math.sign(x) * Math.exp(Math.abs(x) - _),
48
+ sqlApply: c => (c = asNode(c), mul(sign(c), ln(add(_, abs(c))))),
49
+ sqlInvert: c => mul(sign(c), sub(exp(abs(c)), _))
50
+ };
51
+ }
52
+ function scaleSqrt() {
53
+ return {
54
+ apply: x => Math.sign(x) * Math.sqrt(Math.abs(x)),
55
+ invert: x => Math.sign(x) * x * x,
56
+ sqlApply: c => (c = asNode(c), mul(sign(c), sqrt(abs(c)))),
57
+ sqlInvert: c => mul(sign(c), pow(c, 2))
58
+ };
59
+ }
60
+ function scalePow({ exponent = 1 } = {}) {
61
+ const e = +exponent;
62
+ return {
63
+ apply: x => Math.sign(x) * Math.pow(Math.abs(x), e),
64
+ invert: x => Math.sign(x) * Math.pow(Math.abs(x), 1 / e),
65
+ sqlApply: c => (c = asNode(c), mul(sign(c), pow(abs(c), e))),
66
+ sqlInvert: c => mul(sign(c), pow(abs(c), div(1, e)))
67
+ };
68
+ }
69
+ function scaleTime() {
70
+ return {
71
+ apply: x => Number(x),
72
+ invert: x => new Date(x),
73
+ sqlApply: c => c instanceof Date ? literal(+c)
74
+ : isDateLiteral(c) ? literal(Number(c.value))
75
+ : epoch_ms(c),
76
+ sqlInvert: identity
77
+ };
78
+ }
79
+ const scales = {
80
+ identity: scaleLinear,
81
+ linear: scaleLinear,
82
+ log: scaleLog,
83
+ symlog: scaleSymlog,
84
+ sqrt: scaleSqrt,
85
+ pow: scalePow,
86
+ time: scaleTime,
87
+ utc: scaleTime
88
+ };
89
+ export function scaleTransform(options) {
90
+ const scale = scales[options.type];
91
+ if (!scale)
92
+ throw new Error(`Unrecognized scale type: ${options.type}`);
93
+ // @ts-expect-error suppress error, revisit later?
94
+ return { ...options, ...scale(options) };
95
+ }
96
+ /**
97
+ * Check if a value is a date-valued literal SQL AST node.
98
+ * @param x The value to test.
99
+ */
100
+ function isDateLiteral(x) {
101
+ return x instanceof LiteralNode && x.value instanceof Date;
102
+ }
103
+ //# sourceMappingURL=scales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scales.js","sourceRoot":"","sources":["../../../src/transforms/scales.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /** Numerical binning options. */
2
+ export interface BinOptions {
3
+ /**
4
+ * An exact binning step to use.
5
+ */
6
+ step?: number;
7
+ /**
8
+ * The desired number of binning steps. This value is a hint,
9
+ * it does not guarantee an exact number of steps.
10
+ */
11
+ steps?: number;
12
+ /**
13
+ * A minimum binning step value.
14
+ * No generated step can be less than this value.
15
+ */
16
+ minstep?: number;
17
+ /**
18
+ * A boolean flag (default true) indicating if bin extents should be snapped
19
+ * to "nice" numbers such as multiples of 5 or 10.
20
+ */
21
+ nice?: boolean;
22
+ /**
23
+ * A number indicating the the logarithm base to use for automatic step size
24
+ * determination. Defaults to base 10.
25
+ */
26
+ base?: number;
27
+ }
28
+ /**
29
+ * Generate a numeric binning scheme suitable for a histogram.
30
+ * @param min The minimum value of the extent to bin.
31
+ * @param max The maximum value of the extent to bin.
32
+ * @param options Binning scheme options.
33
+ */
34
+ export declare function binSpec(min: number, max: number, options: BinOptions): {
35
+ min: number;
36
+ max: number;
37
+ steps: number;
38
+ };
39
+ /**
40
+ * Determine a bin step interval.
41
+ * @param span The span from maximum to minimum value.
42
+ * @param steps The approximate number of desired bins.
43
+ * @param minstep The minimum acceptable bin step size.
44
+ * @param logb The log base for determining orders of magnitude for step
45
+ * sizes. Defaults to log base 10 (`Math.LN10`). For example to use log
46
+ * base 2, provide the argument `Math.LN2` instead.
47
+ * @returns The bin step interval (bin size).
48
+ */
49
+ export declare function binStep(span: number, steps: number, minstep?: number, logb?: number): number;
50
+ //# sourceMappingURL=bin-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin-step.d.ts","sourceRoot":"","sources":["../../../../src/transforms/util/bin-step.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;;;;EA4BpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAU,EACnB,IAAI,GAAE,MAAkB,UAqBzB"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Generate a numeric binning scheme suitable for a histogram.
3
+ * @param min The minimum value of the extent to bin.
4
+ * @param max The maximum value of the extent to bin.
5
+ * @param options Binning scheme options.
6
+ */
7
+ export function binSpec(min, max, options) {
8
+ let { step, steps = 25, } = options;
9
+ const { minstep = 0, nice = true, base } = options;
10
+ if (nice !== false) {
11
+ // use span to determine step size
12
+ const span = max - min;
13
+ const logb = base ? Math.log(base) : Math.LN10;
14
+ step = step || binStep(span, steps, minstep, logb);
15
+ // adjust min/max relative to step
16
+ let v = Math.log(step);
17
+ const precision = v >= 0 ? 0 : ~~(-v / logb) + 1;
18
+ const eps = Math.pow(10, -precision - 1);
19
+ v = Math.floor(min / step + eps) * step;
20
+ min = min < v ? v - step : v;
21
+ max = Math.ceil(max / step) * step;
22
+ steps = Math.round((max - min) / step);
23
+ }
24
+ return { min, max, steps };
25
+ }
26
+ /**
27
+ * Determine a bin step interval.
28
+ * @param span The span from maximum to minimum value.
29
+ * @param steps The approximate number of desired bins.
30
+ * @param minstep The minimum acceptable bin step size.
31
+ * @param logb The log base for determining orders of magnitude for step
32
+ * sizes. Defaults to log base 10 (`Math.LN10`). For example to use log
33
+ * base 2, provide the argument `Math.LN2` instead.
34
+ * @returns The bin step interval (bin size).
35
+ */
36
+ export function binStep(span, steps, minstep = 0, logb = Math.LN10) {
37
+ let v;
38
+ const level = Math.ceil(Math.log(steps) / logb);
39
+ let step = Math.max(minstep, Math.pow(10, Math.round(Math.log(span) / logb) - level));
40
+ // increase step size if too many bins
41
+ while (Math.ceil(span / step) > steps) {
42
+ step *= 10;
43
+ }
44
+ // decrease step size if allowed
45
+ const div = [5, 2];
46
+ for (let i = 0, n = div.length; i < n; ++i) {
47
+ v = step / div[i];
48
+ if (v >= minstep && span / v <= steps)
49
+ step = v;
50
+ }
51
+ return step;
52
+ }
53
+ //# sourceMappingURL=bin-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin-step.js","sourceRoot":"","sources":["../../../../src/transforms/util/bin-step.ts"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,OAAmB;IACnE,IAAI,EACF,IAAI,EACJ,KAAK,GAAG,EAAE,GACX,GAAG,OAAO,CAAC;IACZ,MAAM,EACJ,OAAO,GAAG,CAAC,EACX,IAAI,GAAG,IAAI,EACX,IAAI,EACL,GAAG,OAAO,CAAC;IAEZ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,kCAAkC;QAClC,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/C,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEnD,kCAAkC;QAClC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QACxC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,KAAa,EACb,UAAkB,CAAC,EACnB,OAAe,IAAI,CAAC,IAAI;IAExB,IAAI,CAAC,CAAC;IAEN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CACjB,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CACxD,CAAC;IAEF,sCAAsC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QAAC,IAAI,IAAI,EAAE,CAAC;IAAC,CAAC;IAEtD,gCAAgC;IAChC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3C,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK;YAAE,IAAI,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type DateTimeValue = Date | number;
2
+ export type TimeUnit = 'year' | 'quarter' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond' | 'microsecond';
3
+ /**
4
+ * Determine a time interval for binning based on provided min
5
+ * and max timestamps and approximate step count.
6
+ * @param min The minimum timestamp value.
7
+ * @param max The maximum timestamp value.
8
+ * @param steps The approximate number of bins desired.
9
+ */
10
+ export declare function timeInterval(min: DateTimeValue, max: DateTimeValue, steps: number): ({
11
+ unit: TimeUnit;
12
+ step: number;
13
+ });
14
+ //# sourceMappingURL=time-interval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-interval.d.ts","sourceRoot":"","sources":["../../../../src/transforms/util/time-interval.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,MAAM,CAAC;AAE1C,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,SAAS,GACT,OAAO,GACP,KAAK,GACL,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,aAAa,CAAC;AAuClB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,GACZ,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBpC"}
@@ -0,0 +1,88 @@
1
+ import { binStep } from './bin-step.js';
2
+ const YEAR = 'year';
3
+ const MONTH = 'month';
4
+ const DAY = 'day';
5
+ const HOUR = 'hour';
6
+ const MINUTE = 'minute';
7
+ const SECOND = 'second';
8
+ const MILLISECOND = 'millisecond';
9
+ const MICROSECOND = 'microsecond';
10
+ const durationSecond = 1000;
11
+ const durationMinute = durationSecond * 60;
12
+ const durationHour = durationMinute * 60;
13
+ const durationDay = durationHour * 24;
14
+ const durationWeek = durationDay * 7;
15
+ const durationMonth = durationDay * 30;
16
+ const durationYear = durationDay * 365;
17
+ const units = [
18
+ { unit: SECOND, step: 1, dt: durationSecond },
19
+ { unit: SECOND, step: 5, dt: durationSecond * 5 },
20
+ { unit: SECOND, step: 15, dt: durationSecond * 15 },
21
+ { unit: SECOND, step: 30, dt: durationSecond * 30 },
22
+ { unit: MINUTE, step: 1, dt: durationMinute },
23
+ { unit: MINUTE, step: 5, dt: durationMinute * 5 },
24
+ { unit: MINUTE, step: 15, dt: durationMinute * 15 },
25
+ { unit: MINUTE, step: 30, dt: durationMinute * 30 },
26
+ { unit: HOUR, step: 1, dt: durationHour },
27
+ { unit: HOUR, step: 3, dt: durationHour * 3 },
28
+ { unit: HOUR, step: 6, dt: durationHour * 6 },
29
+ { unit: HOUR, step: 12, dt: durationHour * 12 },
30
+ { unit: DAY, step: 1, dt: durationDay },
31
+ { unit: DAY, step: 7, dt: durationWeek },
32
+ { unit: MONTH, step: 1, dt: durationMonth },
33
+ { unit: MONTH, step: 3, dt: durationMonth * 3 },
34
+ { unit: YEAR, step: 1, dt: durationYear }
35
+ ];
36
+ /**
37
+ * Determine a time interval for binning based on provided min
38
+ * and max timestamps and approximate step count.
39
+ * @param min The minimum timestamp value.
40
+ * @param max The maximum timestamp value.
41
+ * @param steps The approximate number of bins desired.
42
+ */
43
+ export function timeInterval(min, max, steps) {
44
+ const span = +max - +min;
45
+ const t = span / steps; // target step size duration
46
+ const i = bisect(units, t, v => v.dt);
47
+ let unit;
48
+ let step;
49
+ if (i === units.length) {
50
+ unit = YEAR;
51
+ step = binStep(span / durationYear, steps);
52
+ }
53
+ else if (i) {
54
+ ({ unit, step } = units[t / units[i - 1].dt < units[i].dt / t ? i - 1 : i]);
55
+ }
56
+ else {
57
+ step = binStep(span, steps);
58
+ unit = step >= 1 ? MILLISECOND : MICROSECOND;
59
+ step = step >= 1 ? step : step * 1000;
60
+ }
61
+ return { unit, step };
62
+ }
63
+ /**
64
+ * Perform a binary search.
65
+ * @param a The array to search.
66
+ * @param x The target value.
67
+ * @param value A value accessor.
68
+ * @returns The search result array index.
69
+ */
70
+ function bisect(a, x, value) {
71
+ const compare1 = (a, b) => Number(a) - Number(b);
72
+ const compare2 = (d, x) => compare1(value(d), x);
73
+ let lo = 0;
74
+ let hi = a.length;
75
+ if (lo < hi) {
76
+ if (compare1(x, x) !== 0)
77
+ return hi;
78
+ do {
79
+ const mid = (lo + hi) >>> 1;
80
+ if (compare2(a[mid], x) <= 0)
81
+ lo = mid + 1;
82
+ else
83
+ hi = mid;
84
+ } while (lo < hi);
85
+ }
86
+ return lo;
87
+ }
88
+ //# sourceMappingURL=time-interval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-interval.js","sourceRoot":"","sources":["../../../../src/transforms/util/time-interval.ts"],"names":[],"mappings":"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"}