@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.
- package/LICENSE +1 -1
- package/README.md +0 -2
- package/dist/src/ast/aggregate.d.ts +82 -0
- package/dist/src/ast/aggregate.d.ts.map +1 -0
- package/dist/src/ast/aggregate.js +180 -0
- package/dist/src/ast/aggregate.js.map +1 -0
- package/dist/src/ast/between-op.d.ts +46 -0
- package/dist/src/ast/between-op.d.ts.map +1 -0
- package/dist/src/ast/between-op.js +60 -0
- package/dist/src/ast/between-op.js.map +1 -0
- package/dist/src/ast/binary-op.d.ts +21 -0
- package/dist/src/ast/binary-op.d.ts.map +1 -0
- package/dist/src/ast/binary-op.js +29 -0
- package/dist/src/ast/binary-op.js.map +1 -0
- package/dist/src/ast/case.d.ts +53 -0
- package/dist/src/ast/case.d.ts.map +1 -0
- package/dist/src/ast/case.js +75 -0
- package/dist/src/ast/case.js.map +1 -0
- package/dist/src/ast/cast.d.ts +18 -0
- package/dist/src/ast/cast.d.ts.map +1 -0
- package/dist/src/ast/cast.js +26 -0
- package/dist/src/ast/cast.js.map +1 -0
- package/dist/src/ast/collate.d.ts +18 -0
- package/dist/src/ast/collate.d.ts.map +1 -0
- package/dist/src/ast/collate.js +25 -0
- package/dist/src/ast/collate.js.map +1 -0
- package/dist/src/ast/column-param.d.ts +23 -0
- package/dist/src/ast/column-param.d.ts.map +1 -0
- package/dist/src/ast/column-param.js +29 -0
- package/dist/src/ast/column-param.js.map +1 -0
- package/dist/src/ast/column-ref.d.ts +40 -0
- package/dist/src/ast/column-ref.d.ts.map +1 -0
- package/dist/src/ast/column-ref.js +58 -0
- package/dist/src/ast/column-ref.js.map +1 -0
- package/dist/src/ast/fragment.d.ts +20 -0
- package/dist/src/ast/fragment.d.ts.map +1 -0
- package/dist/src/ast/fragment.js +26 -0
- package/dist/src/ast/fragment.js.map +1 -0
- package/dist/src/ast/from.d.ts +22 -0
- package/dist/src/ast/from.d.ts.map +1 -0
- package/dist/src/ast/from.js +37 -0
- package/dist/src/ast/from.js.map +1 -0
- package/dist/src/ast/function.d.ts +18 -0
- package/dist/src/ast/function.d.ts.map +1 -0
- package/dist/src/ast/function.js +26 -0
- package/dist/src/ast/function.js.map +1 -0
- package/dist/src/ast/in-op.d.ts +18 -0
- package/dist/src/ast/in-op.d.ts.map +1 -0
- package/dist/src/ast/in-op.js +25 -0
- package/dist/src/ast/in-op.js.map +1 -0
- package/dist/src/ast/interval.d.ts +18 -0
- package/dist/src/ast/interval.d.ts.map +1 -0
- package/dist/src/ast/interval.js +25 -0
- package/dist/src/ast/interval.js.map +1 -0
- package/dist/src/ast/literal.d.ts +16 -0
- package/dist/src/ast/literal.d.ts.map +1 -0
- package/dist/src/ast/literal.js +53 -0
- package/dist/src/ast/literal.js.map +1 -0
- package/dist/src/ast/logical-op.d.ts +32 -0
- package/dist/src/ast/logical-op.d.ts.map +1 -0
- package/dist/src/ast/logical-op.js +46 -0
- package/dist/src/ast/logical-op.js.map +1 -0
- package/dist/src/ast/node.d.ts +25 -0
- package/dist/src/ast/node.d.ts.map +1 -0
- package/dist/src/ast/node.js +36 -0
- package/dist/src/ast/node.js.map +1 -0
- package/dist/src/ast/order-by.d.ts +21 -0
- package/dist/src/ast/order-by.d.ts.map +1 -0
- package/dist/src/ast/order-by.js +36 -0
- package/dist/src/ast/order-by.js.map +1 -0
- package/dist/{types → src}/ast/param.d.ts +11 -11
- package/dist/src/ast/param.d.ts.map +1 -0
- package/dist/src/ast/param.js +28 -0
- package/dist/src/ast/param.js.map +1 -0
- package/dist/src/ast/query.d.ts +294 -0
- package/dist/src/ast/query.d.ts.map +1 -0
- package/dist/src/ast/query.js +584 -0
- package/dist/src/ast/query.js.map +1 -0
- package/dist/src/ast/sample.d.ts +27 -0
- package/dist/src/ast/sample.d.ts.map +1 -0
- package/dist/src/ast/sample.js +38 -0
- package/dist/src/ast/sample.js.map +1 -0
- package/dist/src/ast/select.d.ts +19 -0
- package/dist/src/ast/select.d.ts.map +1 -0
- package/dist/src/ast/select.js +35 -0
- package/dist/src/ast/select.js.map +1 -0
- package/dist/src/ast/subquery.d.ts +16 -0
- package/dist/src/ast/subquery.d.ts.map +1 -0
- package/dist/src/ast/subquery.js +21 -0
- package/dist/src/ast/subquery.js.map +1 -0
- package/dist/src/ast/table-ref.d.ts +24 -0
- package/dist/src/ast/table-ref.d.ts.map +1 -0
- package/dist/src/ast/table-ref.js +35 -0
- package/dist/src/ast/table-ref.js.map +1 -0
- package/dist/src/ast/unary-op.d.ts +40 -0
- package/dist/src/ast/unary-op.d.ts.map +1 -0
- package/dist/src/ast/unary-op.js +52 -0
- package/dist/src/ast/unary-op.js.map +1 -0
- package/dist/src/ast/verbatim.d.ts +18 -0
- package/dist/src/ast/verbatim.d.ts.map +1 -0
- package/dist/src/ast/verbatim.js +25 -0
- package/dist/src/ast/verbatim.js.map +1 -0
- package/dist/src/ast/window-frame.d.ts +54 -0
- package/dist/src/ast/window-frame.d.ts.map +1 -0
- package/dist/src/ast/window-frame.js +79 -0
- package/dist/src/ast/window-frame.js.map +1 -0
- package/dist/src/ast/window.d.ts +128 -0
- package/dist/src/ast/window.d.ts.map +1 -0
- package/dist/src/ast/window.js +194 -0
- package/dist/src/ast/window.js.map +1 -0
- package/dist/{types → src}/ast/with.d.ts +15 -22
- package/dist/src/ast/with.d.ts.map +1 -0
- package/dist/src/ast/with.js +36 -0
- package/dist/src/ast/with.js.map +1 -0
- package/dist/src/constants.d.ts +38 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +38 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/functions/aggregate.d.ts +236 -0
- package/dist/src/functions/aggregate.d.ts.map +1 -0
- package/dist/src/functions/aggregate.js +308 -0
- package/dist/src/functions/aggregate.js.map +1 -0
- package/dist/{types → src}/functions/case.d.ts +7 -7
- package/dist/src/functions/case.d.ts.map +1 -0
- package/dist/src/functions/case.js +17 -0
- package/dist/src/functions/case.js.map +1 -0
- package/dist/src/functions/cast.d.ts +23 -0
- package/dist/src/functions/cast.d.ts.map +1 -0
- package/dist/src/functions/cast.js +32 -0
- package/dist/src/functions/cast.js.map +1 -0
- package/dist/src/functions/collate.d.ts +10 -0
- package/dist/src/functions/collate.d.ts.map +1 -0
- package/dist/src/functions/collate.js +12 -0
- package/dist/src/functions/collate.js.map +1 -0
- package/dist/src/functions/column.d.ts +10 -0
- package/dist/src/functions/column.d.ts.map +1 -0
- package/dist/src/functions/column.js +17 -0
- package/dist/src/functions/column.js.map +1 -0
- package/dist/{types → src}/functions/cte.d.ts +7 -7
- package/dist/src/functions/cte.d.ts.map +1 -0
- package/dist/src/functions/cte.js +14 -0
- package/dist/src/functions/cte.js.map +1 -0
- package/dist/src/functions/datetime.d.ts +32 -0
- package/dist/src/functions/datetime.d.ts.map +1 -0
- package/dist/src/functions/datetime.js +45 -0
- package/dist/src/functions/datetime.js.map +1 -0
- package/dist/src/functions/interval.d.ts +48 -0
- package/dist/src/functions/interval.d.ts.map +1 -0
- package/dist/src/functions/interval.js +66 -0
- package/dist/src/functions/interval.js.map +1 -0
- package/dist/{types → src}/functions/literal.d.ts +8 -8
- package/dist/src/functions/literal.d.ts.map +1 -0
- package/dist/src/functions/literal.js +20 -0
- package/dist/src/functions/literal.js.map +1 -0
- package/dist/src/functions/numeric.d.ts +80 -0
- package/dist/src/functions/numeric.d.ts.map +1 -0
- package/dist/src/functions/numeric.js +110 -0
- package/dist/src/functions/numeric.js.map +1 -0
- package/dist/src/functions/operators.d.ts +169 -0
- package/dist/src/functions/operators.d.ts.map +1 -0
- package/dist/src/functions/operators.js +235 -0
- package/dist/src/functions/operators.js.map +1 -0
- package/dist/src/functions/order-by.d.ts +15 -0
- package/dist/src/functions/order-by.d.ts.map +1 -0
- package/dist/src/functions/order-by.js +19 -0
- package/dist/src/functions/order-by.js.map +1 -0
- package/dist/src/functions/spatial.d.ts +32 -0
- package/dist/src/functions/spatial.d.ts.map +1 -0
- package/dist/src/functions/spatial.js +44 -0
- package/dist/src/functions/spatial.js.map +1 -0
- package/dist/{types → src}/functions/sql-template-tag.d.ts +8 -10
- package/dist/src/functions/sql-template-tag.d.ts.map +1 -0
- package/dist/src/functions/sql-template-tag.js +44 -0
- package/dist/src/functions/sql-template-tag.js.map +1 -0
- package/dist/src/functions/string.d.ts +49 -0
- package/dist/src/functions/string.d.ts.map +1 -0
- package/dist/src/functions/string.js +67 -0
- package/dist/src/functions/string.js.map +1 -0
- package/dist/src/functions/table-ref.d.ts +10 -0
- package/dist/src/functions/table-ref.d.ts.map +1 -0
- package/dist/src/functions/table-ref.js +13 -0
- package/dist/src/functions/table-ref.js.map +1 -0
- package/dist/src/functions/util.d.ts +7 -0
- package/dist/src/functions/util.d.ts.map +1 -0
- package/dist/src/functions/util.js +9 -0
- package/dist/src/functions/util.js.map +1 -0
- package/dist/src/functions/window-frame.d.ts +41 -0
- package/dist/src/functions/window-frame.d.ts.map +1 -0
- package/dist/src/functions/window-frame.js +52 -0
- package/dist/src/functions/window-frame.js.map +1 -0
- package/dist/{types → src}/functions/window.d.ts +24 -39
- package/dist/src/functions/window.d.ts.map +1 -0
- package/dist/src/functions/window.js +96 -0
- package/dist/src/functions/window.js.map +1 -0
- package/dist/src/index.d.ts +69 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{src → dist/src}/index.js +16 -12
- package/dist/src/index.js.map +1 -0
- package/dist/src/load/create.d.ts +10 -0
- package/dist/src/load/create.d.ts.map +1 -0
- package/dist/src/load/create.js +14 -0
- package/dist/src/load/create.js.map +1 -0
- package/dist/src/load/extension.d.ts +2 -0
- package/dist/src/load/extension.d.ts.map +1 -0
- package/dist/src/load/extension.js +4 -0
- package/dist/src/load/extension.js.map +1 -0
- package/dist/src/load/load.d.ts +18 -0
- package/dist/src/load/load.d.ts.map +1 -0
- package/dist/src/load/load.js +80 -0
- package/dist/src/load/load.js.map +1 -0
- package/dist/src/load/sql-from.d.ts +14 -0
- package/dist/src/load/sql-from.d.ts.map +1 -0
- package/dist/src/load/sql-from.js +29 -0
- package/dist/src/load/sql-from.js.map +1 -0
- package/dist/src/transforms/bin-1d.d.ts +16 -0
- package/dist/src/transforms/bin-1d.d.ts.map +1 -0
- package/dist/src/transforms/bin-1d.js +21 -0
- package/dist/src/transforms/bin-1d.js.map +1 -0
- package/dist/src/transforms/bin-2d.d.ts +19 -0
- package/dist/src/transforms/bin-2d.d.ts.map +1 -0
- package/dist/src/transforms/bin-2d.js +27 -0
- package/dist/src/transforms/bin-2d.js.map +1 -0
- package/dist/src/transforms/bin-date.d.ts +31 -0
- package/dist/src/transforms/bin-date.d.ts.map +1 -0
- package/dist/src/transforms/bin-date.js +20 -0
- package/dist/src/transforms/bin-date.js.map +1 -0
- package/dist/src/transforms/bin-histogram.d.ts +37 -0
- package/dist/src/transforms/bin-histogram.d.ts.map +1 -0
- package/dist/src/transforms/bin-histogram.js +32 -0
- package/dist/src/transforms/bin-histogram.js.map +1 -0
- package/dist/src/transforms/bin-linear-1d.d.ts +11 -0
- package/dist/src/transforms/bin-linear-1d.d.ts.map +1 -0
- package/dist/src/transforms/bin-linear-1d.js +25 -0
- package/dist/src/transforms/bin-linear-1d.js.map +1 -0
- package/dist/src/transforms/bin-linear-2d.d.ts +20 -0
- package/dist/src/transforms/bin-linear-2d.d.ts.map +1 -0
- package/dist/src/transforms/bin-linear-2d.js +49 -0
- package/dist/src/transforms/bin-linear-2d.js.map +1 -0
- package/dist/src/transforms/filter-query.d.ts +12 -0
- package/dist/src/transforms/filter-query.d.ts.map +1 -0
- package/dist/src/transforms/filter-query.js +39 -0
- package/dist/src/transforms/filter-query.js.map +1 -0
- package/dist/src/transforms/line-density.d.ts +24 -0
- package/dist/src/transforms/line-density.d.ts.map +1 -0
- package/dist/src/transforms/line-density.js +98 -0
- package/dist/src/transforms/line-density.js.map +1 -0
- package/dist/src/transforms/m4.d.ts +19 -0
- package/dist/src/transforms/m4.d.ts.map +1 -0
- package/dist/src/transforms/m4.js +38 -0
- package/dist/src/transforms/m4.js.map +1 -0
- package/dist/src/transforms/scales.d.ts +30 -0
- package/dist/src/transforms/scales.d.ts.map +1 -0
- package/dist/src/transforms/scales.js +103 -0
- package/dist/src/transforms/scales.js.map +1 -0
- package/dist/src/transforms/util/bin-step.d.ts +50 -0
- package/dist/src/transforms/util/bin-step.d.ts.map +1 -0
- package/dist/src/transforms/util/bin-step.js +53 -0
- package/dist/src/transforms/util/bin-step.js.map +1 -0
- package/dist/src/transforms/util/time-interval.d.ts +14 -0
- package/dist/src/transforms/util/time-interval.d.ts.map +1 -0
- package/dist/src/transforms/util/time-interval.js +88 -0
- package/dist/src/transforms/util/time-interval.js.map +1 -0
- package/dist/{types → src}/types.d.ts +6 -19
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/{types → src}/util/ast.d.ts +26 -25
- package/dist/src/util/ast.d.ts.map +1 -0
- package/{src → dist/src}/util/ast.js +36 -41
- package/dist/src/util/ast.js.map +1 -0
- package/dist/src/util/function.d.ts +56 -0
- package/dist/src/util/function.d.ts.map +1 -0
- package/dist/src/util/function.js +73 -0
- package/dist/src/util/function.js.map +1 -0
- package/dist/src/util/identity.d.ts +6 -0
- package/dist/src/util/identity.d.ts.map +1 -0
- package/dist/src/util/identity.js +8 -0
- package/dist/src/util/identity.js.map +1 -0
- package/dist/src/util/string.d.ts +4 -0
- package/dist/src/util/string.d.ts.map +1 -0
- package/dist/src/util/string.js +14 -0
- package/dist/src/util/string.js.map +1 -0
- package/dist/src/util/type-check.d.ts +17 -0
- package/dist/src/util/type-check.d.ts.map +1 -0
- package/dist/src/util/type-check.js +28 -0
- package/dist/src/util/type-check.js.map +1 -0
- package/dist/src/visit/clone.d.ts +7 -0
- package/dist/src/visit/clone.d.ts.map +1 -0
- package/dist/src/visit/clone.js +52 -0
- package/dist/src/visit/clone.js.map +1 -0
- package/dist/src/visit/recurse.d.ts +2 -0
- package/dist/src/visit/recurse.d.ts.map +1 -0
- package/dist/src/visit/recurse.js +36 -0
- package/dist/src/visit/recurse.js.map +1 -0
- package/dist/src/visit/rewrite.d.ts +9 -0
- package/dist/src/visit/rewrite.d.ts.map +1 -0
- package/dist/src/visit/rewrite.js +39 -0
- package/dist/src/visit/rewrite.js.map +1 -0
- package/dist/{types → src}/visit/visitors.d.ts +14 -16
- package/dist/src/visit/visitors.d.ts.map +1 -0
- package/dist/src/visit/visitors.js +95 -0
- package/dist/src/visit/visitors.js.map +1 -0
- package/dist/src/visit/walk.d.ts +21 -0
- package/dist/src/visit/walk.d.ts.map +1 -0
- package/dist/src/visit/walk.js +32 -0
- package/dist/src/visit/walk.js.map +1 -0
- package/package.json +12 -10
- package/src/ast/aggregate.ts +198 -0
- package/src/ast/{between-op.js → between-op.ts} +19 -26
- package/src/ast/binary-op.ts +31 -0
- package/src/ast/{case.js → case.ts} +29 -44
- package/src/ast/{cast.js → cast.ts} +8 -14
- package/src/ast/collate.ts +27 -0
- package/src/ast/column-param.ts +34 -0
- package/src/ast/{column-ref.js → column-ref.ts} +16 -25
- package/src/ast/fragment.ts +28 -0
- package/src/ast/from.ts +40 -0
- package/src/ast/{function.js → function.ts} +8 -14
- package/src/ast/{in-op.js → in-op.ts} +8 -14
- package/src/ast/{interval.js → interval.ts} +8 -14
- package/src/ast/{literal.js → literal.ts} +6 -9
- package/src/ast/logical-op.ts +50 -0
- package/src/ast/node.ts +39 -0
- package/src/ast/order-by.ts +38 -0
- package/src/ast/{param.js → param.ts} +6 -12
- package/src/ast/{query.js → query.ts} +193 -205
- package/src/ast/sample.ts +47 -0
- package/src/ast/{select.js → select.ts} +10 -16
- package/src/ast/subquery.ts +24 -0
- package/src/ast/{table-ref.js → table-ref.ts} +7 -12
- package/src/ast/{unary-op.js → unary-op.ts} +16 -23
- package/src/ast/{verbatim.js → verbatim.ts} +9 -8
- package/src/ast/window-frame.ts +97 -0
- package/src/ast/window.ts +246 -0
- package/src/ast/{with.js → with.ts} +19 -20
- package/src/{constants.js → constants.ts} +5 -6
- package/src/functions/aggregate.ts +344 -0
- package/src/functions/{case.js → case.ts} +5 -8
- package/src/functions/{cast.js → cast.ts} +9 -13
- package/src/functions/collate.ts +13 -0
- package/src/functions/{column.js → column.ts} +9 -10
- package/src/functions/{cte.js → cte.ts} +9 -6
- package/src/functions/datetime.ts +50 -0
- package/src/functions/interval.ts +74 -0
- package/src/functions/{literal.js → literal.ts} +6 -7
- package/src/functions/numeric.ts +125 -0
- package/src/functions/operators.ts +272 -0
- package/src/functions/order-by.ts +21 -0
- package/src/functions/spatial.ts +50 -0
- package/src/functions/{sql-template-tag.js → sql-template-tag.ts} +16 -13
- package/src/functions/string.ts +79 -0
- package/src/functions/{table-ref.js → table-ref.ts} +4 -4
- package/src/functions/util.ts +10 -0
- package/src/functions/window-frame.ts +58 -0
- package/src/functions/{window.js → window.ts} +18 -35
- package/src/index.ts +75 -0
- package/src/load/{create.js → create.ts} +9 -3
- package/src/load/extension.ts +3 -0
- package/src/load/{load.js → load.ts} +26 -11
- package/src/load/{sql-from.js → sql-from.ts} +14 -7
- package/src/transforms/{bin-1d.js → bin-1d.ts} +13 -9
- package/src/transforms/{bin-2d.js → bin-2d.ts} +17 -13
- package/src/transforms/bin-date.ts +48 -0
- package/src/transforms/bin-histogram.ts +61 -0
- package/src/transforms/{bin-linear-1d.js → bin-linear-1d.ts} +16 -11
- package/src/transforms/{bin-linear-2d.js → bin-linear-2d.ts} +23 -35
- package/src/transforms/filter-query.ts +40 -0
- package/src/transforms/{line-density.js → line-density.ts} +19 -17
- package/src/transforms/{m4.js → m4.ts} +17 -14
- package/src/transforms/{scales.js → scales.ts} +57 -14
- package/src/transforms/util/bin-step.ts +100 -0
- package/src/transforms/util/{time-interval.js → time-interval.ts} +32 -21
- package/src/types.ts +5 -30
- package/src/util/ast.ts +104 -0
- package/src/util/{function.js → function.ts} +40 -31
- package/src/util/identity.ts +7 -0
- package/src/util/{string.js → string.ts} +4 -4
- package/src/util/type-check.ts +31 -0
- package/src/visit/clone.ts +53 -0
- package/src/visit/{recurse.js → recurse.ts} +18 -6
- package/src/visit/{rewrite.js → rewrite.ts} +10 -18
- package/src/visit/{visitors.js → visitors.ts} +22 -30
- package/src/visit/walk.ts +46 -0
- package/dist/types/ast/aggregate.d.ts +0 -71
- package/dist/types/ast/between-op.d.ts +0 -46
- package/dist/types/ast/binary-op.d.ts +0 -28
- package/dist/types/ast/case.d.ts +0 -67
- package/dist/types/ast/cast.d.ts +0 -21
- package/dist/types/ast/column-param.d.ts +0 -23
- package/dist/types/ast/column-ref.d.ts +0 -40
- package/dist/types/ast/fragment.d.ts +0 -14
- package/dist/types/ast/from.d.ts +0 -21
- package/dist/types/ast/function.d.ts +0 -21
- package/dist/types/ast/in-op.d.ts +0 -21
- package/dist/types/ast/interval.d.ts +0 -21
- package/dist/types/ast/literal.d.ts +0 -15
- package/dist/types/ast/logical-op.d.ts +0 -46
- package/dist/types/ast/node.d.ts +0 -24
- package/dist/types/ast/order-by.d.ts +0 -29
- package/dist/types/ast/query.d.ts +0 -320
- package/dist/types/ast/sample.d.ts +0 -42
- package/dist/types/ast/select.d.ts +0 -22
- package/dist/types/ast/table-ref.d.ts +0 -25
- package/dist/types/ast/unary-op.d.ts +0 -39
- package/dist/types/ast/verbatim.d.ts +0 -9
- package/dist/types/ast/window.d.ts +0 -180
- package/dist/types/constants.d.ts +0 -38
- package/dist/types/functions/aggregate.d.ts +0 -236
- package/dist/types/functions/cast.d.ts +0 -26
- package/dist/types/functions/column.d.ts +0 -11
- package/dist/types/functions/datetime.d.ts +0 -45
- package/dist/types/functions/numeric.d.ts +0 -95
- package/dist/types/functions/operators.d.ts +0 -200
- package/dist/types/functions/order-by.d.ts +0 -18
- package/dist/types/functions/spatial.d.ts +0 -38
- package/dist/types/functions/string.d.ts +0 -57
- package/dist/types/functions/table-ref.d.ts +0 -9
- package/dist/types/functions/util.d.ts +0 -8
- package/dist/types/index-types.d.ts +0 -2
- package/dist/types/index.d.ts +0 -59
- package/dist/types/load/create.d.ts +0 -8
- package/dist/types/load/extension.d.ts +0 -1
- package/dist/types/load/load.d.ts +0 -12
- package/dist/types/load/sql-from.d.ts +0 -11
- package/dist/types/transforms/bin-1d.d.ts +0 -15
- package/dist/types/transforms/bin-2d.d.ts +0 -19
- package/dist/types/transforms/bin-date.d.ts +0 -44
- package/dist/types/transforms/bin-histogram.d.ts +0 -51
- package/dist/types/transforms/bin-linear-1d.d.ts +0 -12
- package/dist/types/transforms/bin-linear-2d.d.ts +0 -19
- package/dist/types/transforms/line-density.d.ts +0 -24
- package/dist/types/transforms/m4.d.ts +0 -21
- package/dist/types/transforms/scales.d.ts +0 -1
- package/dist/types/transforms/util/bin-step.d.ts +0 -61
- package/dist/types/transforms/util/time-interval.d.ts +0 -13
- package/dist/types/util/function.d.ts +0 -56
- package/dist/types/util/string.d.ts +0 -3
- package/dist/types/util/type-check.d.ts +0 -22
- package/dist/types/visit/recurse.d.ts +0 -28
- package/dist/types/visit/rewrite.d.ts +0 -10
- package/dist/types/visit/walk.d.ts +0 -10
- package/jsconfig.json +0 -11
- package/src/ast/aggregate.js +0 -167
- package/src/ast/binary-op.js +0 -40
- package/src/ast/column-param.js +0 -40
- package/src/ast/fragment.js +0 -26
- package/src/ast/from.js +0 -40
- package/src/ast/logical-op.js +0 -67
- package/src/ast/node.js +0 -29
- package/src/ast/order-by.js +0 -48
- package/src/ast/sample.js +0 -53
- package/src/ast/window.js +0 -294
- package/src/functions/aggregate.js +0 -347
- package/src/functions/datetime.js +0 -68
- package/src/functions/numeric.js +0 -143
- package/src/functions/operators.js +0 -301
- package/src/functions/order-by.js +0 -27
- package/src/functions/spatial.js +0 -59
- package/src/functions/string.js +0 -85
- package/src/functions/util.js +0 -14
- package/src/index-types.ts +0 -2
- package/src/load/extension.js +0 -3
- package/src/transforms/bin-date.js +0 -37
- package/src/transforms/bin-histogram.js +0 -52
- package/src/transforms/util/bin-step.js +0 -79
- package/src/util/type-check.js +0 -33
- package/src/visit/walk.js +0 -35
- package/tsconfig.json +0 -12
- 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
|
|
6
|
-
* @returns
|
|
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
|
|
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
|
|
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
|
|
28
|
-
* @returns {ParamLike[]}
|
|
29
|
+
* @param root The root of the AST to search.
|
|
29
30
|
*/
|
|
30
|
-
export function collectParams(root: SQLNode): ParamLike[];
|
|
31
|
-
|
|
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.
|
|
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/
|
|
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
|
-
"
|
|
23
|
-
"build": "npm run types",
|
|
24
|
-
"types": "tsc",
|
|
27
|
+
"clean": "rimraf dist && mkdir dist",
|
|
25
28
|
"lint": "eslint src test",
|
|
26
|
-
"test": "vitest run
|
|
27
|
-
"
|
|
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": "
|
|
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
|
|
8
|
-
* @param
|
|
9
|
-
* @param
|
|
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
|
-
* @
|
|
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
|
|
41
|
-
* @param
|
|
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
|
|
61
|
-
* @param
|
|
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
|
+
}
|