@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.
- package/LICENSE +47 -0
- 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/list.d.ts +15 -0
- package/dist/src/ast/list.d.ts.map +1 -0
- package/dist/src/ast/list.js +21 -0
- package/dist/src/ast/list.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/src/ast/param.d.ts +20 -0
- 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 +334 -0
- package/dist/src/ast/query.d.ts.map +1 -0
- package/dist/src/ast/query.js +640 -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/unnest.d.ts +19 -0
- package/dist/src/ast/unnest.d.ts.map +1 -0
- package/dist/src/ast/unnest.js +29 -0
- package/dist/src/ast/unnest.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/src/ast/with.d.ts +25 -0
- 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 +40 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +40 -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/src/functions/case.d.ts +13 -0
- 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/src/functions/cte.d.ts +13 -0
- 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/src/functions/list.d.ts +31 -0
- package/dist/src/functions/list.d.ts.map +1 -0
- package/dist/src/functions/list.js +49 -0
- package/dist/src/functions/list.js.map +1 -0
- package/dist/src/functions/literal.d.ts +16 -0
- 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/src/functions/sql-template-tag.d.ts +13 -0
- 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/unnest.d.ts +10 -0
- package/dist/src/functions/unnest.d.ts.map +1 -0
- package/dist/src/functions/unnest.js +12 -0
- package/dist/src/functions/unnest.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/src/functions/window.d.ts +74 -0
- 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 +73 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{src → dist/src}/index.js +8 -8
- 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/src/types.d.ts +49 -0
- 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/src/util/ast.d.ts +62 -0
- 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 +37 -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/src/visit/visitors.d.ts +32 -0
- 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 +13 -7
- package/src/ast/{aggregate.js → aggregate.ts} +49 -60
- 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.js → collate.ts} +8 -14
- 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.js → from.ts} +12 -21
- 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/list.ts +23 -0
- package/src/ast/{literal.js → literal.ts} +6 -9
- package/src/ast/logical-op.ts +50 -0
- package/src/ast/{node.js → node.ts} +10 -13
- package/src/ast/order-by.ts +38 -0
- package/src/ast/{param.js → param.ts} +6 -12
- package/src/ast/{query.js → query.ts} +224 -204
- package/src/ast/sample.ts +47 -0
- package/src/ast/{select.js → select.ts} +10 -16
- package/src/ast/{subquery.js → subquery.ts} +9 -8
- 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/unnest.ts +31 -0
- package/src/ast/verbatim.ts +27 -0
- package/src/ast/{window-frame.js → window-frame.ts} +37 -47
- package/src/ast/window.ts +246 -0
- package/src/ast/{with.js → with.ts} +19 -20
- package/src/{constants.js → constants.ts} +2 -0
- 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.js → collate.ts} +4 -7
- package/src/functions/{column.js → column.ts} +9 -10
- package/src/functions/{cte.js → cte.ts} +9 -6
- package/src/functions/{datetime.js → datetime.ts} +12 -20
- package/src/functions/interval.ts +74 -0
- package/src/functions/list.ts +63 -0
- package/src/functions/{literal.js → literal.ts} +5 -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/unnest.ts +13 -0
- 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 +79 -0
- package/src/load/{create.js → create.ts} +9 -3
- package/src/load/extension.ts +3 -0
- package/src/load/{load.js → load.ts} +25 -10
- 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.js → filter-query.ts} +10 -14
- 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 -39
- 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.js → clone.ts} +10 -10
- package/src/visit/{recurse.js → recurse.ts} +3 -1
- package/src/visit/{rewrite.js → rewrite.ts} +7 -7
- package/src/visit/{visitors.js → visitors.ts} +22 -30
- package/src/visit/walk.ts +46 -0
- 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/logical-op.js +0 -67
- package/src/ast/order-by.js +0 -48
- package/src/ast/sample.js +0 -53
- package/src/ast/verbatim.js +0 -33
- package/src/ast/window.js +0 -260
- package/src/functions/aggregate.js +0 -347
- package/src/functions/interval.js +0 -83
- 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/functions/window-frame.js +0 -61
- package/src/index-types.ts +0 -2
- package/src/load/extension.js +0 -3
- package/src/transforms/bin-date.js +0 -38
- 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 -34
- package/tsconfig.json +0 -8
- package/vitest.config.ts +0 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { SQLNode } from '../ast/node.js';
|
|
2
|
+
import { isNode } from '../ast/node.js';
|
|
3
|
+
import { recurse } from './recurse.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQL AST traversal visitor callback result.
|
|
7
|
+
* A falsy value (including `undefined`, `null`, `false`, and `0`) indicates
|
|
8
|
+
* that traversal should continue.
|
|
9
|
+
* A negative number values indicates that traversal should stop immediately.
|
|
10
|
+
* Any other truthy value indicates that traversal should not recurse on the
|
|
11
|
+
* current node, but should otherwise continue.
|
|
12
|
+
*/
|
|
13
|
+
export type VisitorResult = boolean | number | null | undefined | void;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* SQL AST traversal callback function.
|
|
17
|
+
*/
|
|
18
|
+
export type VisitorCallback = (node: SQLNode) => VisitorResult;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Perform a traversal of a SQL expression AST.
|
|
22
|
+
* @param node Root node for AST traversal.
|
|
23
|
+
* @param visit Visitor callback function.
|
|
24
|
+
*/
|
|
25
|
+
export function walk(node: unknown, visit: VisitorCallback): VisitorResult {
|
|
26
|
+
if (!isNode(node)) return;
|
|
27
|
+
const result = visit(node);
|
|
28
|
+
if (result) return result;
|
|
29
|
+
|
|
30
|
+
const props = recurse[node.type];
|
|
31
|
+
const n = props?.length ?? 0;
|
|
32
|
+
for (let i = 0; i < n; ++i) {
|
|
33
|
+
// @ts-expect-error lookup of valid property
|
|
34
|
+
const value = node[props[i]];
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
const m = value.length;
|
|
37
|
+
for (let j = 0; j < m; ++j) {
|
|
38
|
+
if (value[j] && Number(walk(value[j], visit)) < 0) {
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} else if (value && Number(walk(value, visit)) < 0) {
|
|
43
|
+
return -1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/ast/binary-op.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { BINARY_OPERATOR } from '../constants.js';
|
|
2
|
-
import { ExprNode } from './node.js';
|
|
3
|
-
|
|
4
|
-
export class BinaryOpNode extends ExprNode {
|
|
5
|
-
/**
|
|
6
|
-
* Instantiate a binary operator node.
|
|
7
|
-
* @param {string} op The operator type.
|
|
8
|
-
* @param {ExprNode} left The left input expression.
|
|
9
|
-
* @param {ExprNode} right The right input expression.
|
|
10
|
-
*/
|
|
11
|
-
constructor(op, left, right) {
|
|
12
|
-
super(BINARY_OPERATOR);
|
|
13
|
-
/**
|
|
14
|
-
* The operator type.
|
|
15
|
-
* @type {string}
|
|
16
|
-
* @readonly
|
|
17
|
-
*/
|
|
18
|
-
this.op = op;
|
|
19
|
-
/**
|
|
20
|
-
* The left input expression.
|
|
21
|
-
* @type {ExprNode}
|
|
22
|
-
* @readonly
|
|
23
|
-
*/
|
|
24
|
-
this.left = left;
|
|
25
|
-
/**
|
|
26
|
-
* The right input expression.
|
|
27
|
-
* @type {ExprNode}
|
|
28
|
-
* @readonly
|
|
29
|
-
*/
|
|
30
|
-
this.right = right;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Generate a SQL query string for this node.
|
|
35
|
-
* @returns {string}
|
|
36
|
-
*/
|
|
37
|
-
toString() {
|
|
38
|
-
return `(${this.left} ${this.op} ${this.right})`;
|
|
39
|
-
}
|
|
40
|
-
}
|
package/src/ast/column-param.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @import { ParamNode } from './param.js'
|
|
3
|
-
* @import { TableRefNode } from './table-ref.js'
|
|
4
|
-
*/
|
|
5
|
-
import { COLUMN_PARAM } from '../constants.js';
|
|
6
|
-
import { ColumnRefNode } from './column-ref.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Check if a value is a dynamic column reference node.
|
|
10
|
-
* @param {*} value The value to check.
|
|
11
|
-
* @returns {value is ColumnParamNode}
|
|
12
|
-
*/
|
|
13
|
-
export function isColumnParam(value) {
|
|
14
|
-
return value instanceof ColumnParamNode;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export class ColumnParamNode extends ColumnRefNode {
|
|
18
|
-
/**
|
|
19
|
-
* Instantiate a column param node.
|
|
20
|
-
* @param {ParamNode} param The column name as a parameter node.
|
|
21
|
-
* @param {TableRefNode} [table] The table reference.
|
|
22
|
-
*/
|
|
23
|
-
constructor(param, table) {
|
|
24
|
-
super(COLUMN_PARAM, table);
|
|
25
|
-
/**
|
|
26
|
-
* The column name as a parameter node.
|
|
27
|
-
* @type {ParamNode}
|
|
28
|
-
* @readonly
|
|
29
|
-
*/
|
|
30
|
-
this.param = param;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Returns the column name.
|
|
35
|
-
* @returns {string}
|
|
36
|
-
*/
|
|
37
|
-
get column() {
|
|
38
|
-
return `${this.param.value}`;
|
|
39
|
-
}
|
|
40
|
-
}
|
package/src/ast/fragment.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { FRAGMENT } from '../constants.js';
|
|
2
|
-
import { ExprNode } from './node.js';
|
|
3
|
-
|
|
4
|
-
export class FragmentNode extends ExprNode {
|
|
5
|
-
/**
|
|
6
|
-
* Instantiate a fragment node with arbitrary content.
|
|
7
|
-
* @param {ExprNode[]} spans The consecutive parts making up the fragment.
|
|
8
|
-
*/
|
|
9
|
-
constructor(spans) {
|
|
10
|
-
super(FRAGMENT);
|
|
11
|
-
/**
|
|
12
|
-
* The consecutive parts making up the fragment.
|
|
13
|
-
* @type {ExprNode[]}
|
|
14
|
-
* @readonly
|
|
15
|
-
*/
|
|
16
|
-
this.spans = spans;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Generate a SQL query string for this node.
|
|
21
|
-
* @returns {string}
|
|
22
|
-
*/
|
|
23
|
-
toString() {
|
|
24
|
-
return this.spans.join('');
|
|
25
|
-
}
|
|
26
|
-
}
|
package/src/ast/logical-op.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { LOGICAL_OPERATOR } from '../constants.js';
|
|
2
|
-
import { ExprNode } from './node.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @template {ExprNode} T
|
|
6
|
-
*/
|
|
7
|
-
export class LogicalOpNode extends ExprNode {
|
|
8
|
-
/**
|
|
9
|
-
* Instantiate a logical operator node.
|
|
10
|
-
* @param {string} op The logical operation.
|
|
11
|
-
* @param {T[]} clauses The input clause expressions.
|
|
12
|
-
*/
|
|
13
|
-
constructor(op, clauses) {
|
|
14
|
-
super(LOGICAL_OPERATOR);
|
|
15
|
-
/**
|
|
16
|
-
* The logical operator.
|
|
17
|
-
* @type {string}
|
|
18
|
-
* @readonly
|
|
19
|
-
*/
|
|
20
|
-
this.op = op;
|
|
21
|
-
/**
|
|
22
|
-
* The input clause expressions.
|
|
23
|
-
* @type {T[]}
|
|
24
|
-
* @readonly
|
|
25
|
-
*/
|
|
26
|
-
this.clauses = clauses;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Generate a SQL query string for this node.
|
|
31
|
-
* @returns {string}
|
|
32
|
-
*/
|
|
33
|
-
toString() {
|
|
34
|
-
const c = this.clauses;
|
|
35
|
-
return c.length === 0 ? ''
|
|
36
|
-
: c.length === 1 ? `${c[0]}`
|
|
37
|
-
: `(${c.join(` ${this.op} `)})`;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* @template {ExprNode} T
|
|
43
|
-
* @extends {LogicalOpNode<T>}
|
|
44
|
-
*/
|
|
45
|
-
export class AndNode extends LogicalOpNode {
|
|
46
|
-
/**
|
|
47
|
-
* Instantiate a logical AND operator node.
|
|
48
|
-
* @param {T[]} clauses The input clause expressions.
|
|
49
|
-
*/
|
|
50
|
-
constructor(clauses) {
|
|
51
|
-
super('AND', clauses);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @template {ExprNode} T
|
|
57
|
-
* @extends {LogicalOpNode<T>}
|
|
58
|
-
*/
|
|
59
|
-
export class OrNode extends LogicalOpNode {
|
|
60
|
-
/**
|
|
61
|
-
* Instantiate a logical OR operator node.
|
|
62
|
-
* @param {T[]} clauses The input clause expressions.
|
|
63
|
-
*/
|
|
64
|
-
constructor(clauses) {
|
|
65
|
-
super('OR', clauses);
|
|
66
|
-
}
|
|
67
|
-
}
|
package/src/ast/order-by.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { ORDER_BY } from '../constants.js';
|
|
2
|
-
import { ExprNode } from './node.js';
|
|
3
|
-
|
|
4
|
-
export class OrderByNode extends ExprNode {
|
|
5
|
-
/**
|
|
6
|
-
* Instantiate an order by entry node.
|
|
7
|
-
* @param {ExprNode} expr The expression to order by.
|
|
8
|
-
* @param {boolean | undefined} [desc] Flag indicating descending order.
|
|
9
|
-
* @param {boolean | undefined} [nullsFirst] Flag indicating if null
|
|
10
|
-
* values should be sorted first.
|
|
11
|
-
*/
|
|
12
|
-
constructor(expr, desc, nullsFirst) {
|
|
13
|
-
super(ORDER_BY);
|
|
14
|
-
/**
|
|
15
|
-
* The expression to order by.
|
|
16
|
-
* @type {ExprNode}
|
|
17
|
-
* @readonly
|
|
18
|
-
*/
|
|
19
|
-
this.expr = expr;
|
|
20
|
-
/**
|
|
21
|
-
* Flag indicating descending order.
|
|
22
|
-
* @type {boolean | undefined}
|
|
23
|
-
* @readonly
|
|
24
|
-
*/
|
|
25
|
-
this.desc = desc;
|
|
26
|
-
/**
|
|
27
|
-
* Flag indicating if null values should be sorted first.
|
|
28
|
-
* @type {boolean | undefined}
|
|
29
|
-
* @readonly
|
|
30
|
-
*/
|
|
31
|
-
this.nullsFirst = nullsFirst;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Generate a SQL query string for this node.
|
|
36
|
-
* @returns {string}
|
|
37
|
-
*/
|
|
38
|
-
toString() {
|
|
39
|
-
const { expr, desc, nullsFirst } = this;
|
|
40
|
-
const dir = desc ? ' DESC'
|
|
41
|
-
: desc === false ? ' ASC'
|
|
42
|
-
: '';
|
|
43
|
-
const nf = nullsFirst ? ' NULLS FIRST'
|
|
44
|
-
: nullsFirst === false ? ' NULLS LAST'
|
|
45
|
-
: '';
|
|
46
|
-
return `${expr}${dir}${nf}`;
|
|
47
|
-
}
|
|
48
|
-
}
|
package/src/ast/sample.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { SAMPLE_CLAUSE } from '../constants.js';
|
|
2
|
-
import { SQLNode } from './node.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @typedef {'reservoir' | 'bernoulli' | 'system'} SampleMethod
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export class SampleClauseNode extends SQLNode {
|
|
9
|
-
/**
|
|
10
|
-
* Instantiate a sample clause node.
|
|
11
|
-
* @param {number} size The sample size as either a row count or percentage.
|
|
12
|
-
* @param {boolean} [perc=false] Flag indicating if the sampling unit is
|
|
13
|
-
* rows (`false`) or a percentage (`true`).
|
|
14
|
-
* @param {SampleMethod} [method] The sampling method. If unspecified,
|
|
15
|
-
* a default method is applied based on the sampling unit.
|
|
16
|
-
* @param {number} [seed] The random seed.
|
|
17
|
-
*/
|
|
18
|
-
constructor(size, perc = false, method = undefined, seed = undefined) {
|
|
19
|
-
super(SAMPLE_CLAUSE);
|
|
20
|
-
/**
|
|
21
|
-
* The sample size as either a row count or percentage.
|
|
22
|
-
* @type {number}
|
|
23
|
-
* @readonly
|
|
24
|
-
*/
|
|
25
|
-
this.size = size;
|
|
26
|
-
/**
|
|
27
|
-
* Flag indicating if the sampling unit is rows (`false`) or a
|
|
28
|
-
* percentage (`true`).
|
|
29
|
-
* @type {boolean}
|
|
30
|
-
* @readonly
|
|
31
|
-
*/
|
|
32
|
-
this.perc = perc;
|
|
33
|
-
/**
|
|
34
|
-
* The sampling method.
|
|
35
|
-
* @type {SampleMethod}
|
|
36
|
-
* @readonly
|
|
37
|
-
*/
|
|
38
|
-
this.method = method;
|
|
39
|
-
/**
|
|
40
|
-
* The random seed.
|
|
41
|
-
* @type {number}
|
|
42
|
-
* @readonly
|
|
43
|
-
*/
|
|
44
|
-
this.seed = seed;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
toString() {
|
|
48
|
-
const { size, perc, method, seed } = this;
|
|
49
|
-
const m = method ? `${method} ` : '';
|
|
50
|
-
const s = seed != null ? ` REPEATABLE (${seed})` : '';
|
|
51
|
-
return `${m}(${size}${perc ? '%' : ' ROWS'})${s}`;
|
|
52
|
-
}
|
|
53
|
-
}
|
package/src/ast/verbatim.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { VERBATIM } from '../constants.js';
|
|
2
|
-
import { ExprNode } from './node.js';
|
|
3
|
-
|
|
4
|
-
export class VerbatimNode extends ExprNode {
|
|
5
|
-
/**
|
|
6
|
-
* Instantiate a raw node with verbatim content.
|
|
7
|
-
* @param {string} value The verbatim content to include.
|
|
8
|
-
* @param {string} [hint] A type hint for analyzing verbatim content.
|
|
9
|
-
*/
|
|
10
|
-
constructor(value, hint) {
|
|
11
|
-
super(VERBATIM);
|
|
12
|
-
/**
|
|
13
|
-
* The verbatim content to include.
|
|
14
|
-
* @type {string}
|
|
15
|
-
* @readonly
|
|
16
|
-
*/
|
|
17
|
-
this.value = value;
|
|
18
|
-
/**
|
|
19
|
-
* A type hint for analyzing verbatim content.
|
|
20
|
-
* @type {string}
|
|
21
|
-
* @readonly
|
|
22
|
-
*/
|
|
23
|
-
this.hint = hint;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Generate a SQL query string for this node.
|
|
28
|
-
* @returns {string}
|
|
29
|
-
*/
|
|
30
|
-
toString() {
|
|
31
|
-
return this.value;
|
|
32
|
-
}
|
|
33
|
-
}
|
package/src/ast/window.js
DELETED
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @import { ExprVarArgs, OrderByExpr, WindowFunctionName } from '../types.js'
|
|
3
|
-
* @import { AggregateNode } from './aggregate.js'
|
|
4
|
-
* @import { WindowFrameNode } from './window-frame.js'
|
|
5
|
-
*/
|
|
6
|
-
import { WINDOW, WINDOW_CLAUSE, WINDOW_DEF, WINDOW_FUNCTION } from '../constants.js';
|
|
7
|
-
import { exprList } from '../util/function.js';
|
|
8
|
-
import { quoteIdentifier } from '../util/string.js';
|
|
9
|
-
import { ExprNode, SQLNode } from './node.js';
|
|
10
|
-
|
|
11
|
-
export class WindowClauseNode extends SQLNode {
|
|
12
|
-
/**
|
|
13
|
-
* Instantiate a window clause node.
|
|
14
|
-
* @param {string} name The window name.
|
|
15
|
-
* @param {WindowDefNode} def The window definition.
|
|
16
|
-
*/
|
|
17
|
-
constructor(name, def) {
|
|
18
|
-
super(WINDOW_CLAUSE);
|
|
19
|
-
/**
|
|
20
|
-
* The window name.
|
|
21
|
-
* @type {string}
|
|
22
|
-
* @readonly
|
|
23
|
-
*/
|
|
24
|
-
this.name = name;
|
|
25
|
-
/**
|
|
26
|
-
* The window definition.
|
|
27
|
-
* @type {WindowDefNode}
|
|
28
|
-
* @readonly
|
|
29
|
-
*/
|
|
30
|
-
this.def = def;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
toString() {
|
|
34
|
-
return `${quoteIdentifier(this.name)} AS ${this.def}`;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export class WindowNode extends ExprNode {
|
|
39
|
-
/**
|
|
40
|
-
* Instantiate a window node.
|
|
41
|
-
* @param {WindowFunctionNode | AggregateNode} func The window function call.
|
|
42
|
-
* @param {WindowDefNode} [over] The window definition or name.
|
|
43
|
-
*/
|
|
44
|
-
constructor(func, over = new WindowDefNode()) {
|
|
45
|
-
super(WINDOW);
|
|
46
|
-
/**
|
|
47
|
-
* @type {WindowFunctionNode | AggregateNode}
|
|
48
|
-
* @readonly
|
|
49
|
-
*/
|
|
50
|
-
this.func = func;
|
|
51
|
-
/**
|
|
52
|
-
* @type {WindowDefNode}
|
|
53
|
-
* @readonly
|
|
54
|
-
*/
|
|
55
|
-
this.def = over;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Return an updated window over a named window definition.
|
|
60
|
-
* @param {string} name The window definition name.
|
|
61
|
-
* @returns {WindowNode} A new window node.
|
|
62
|
-
*/
|
|
63
|
-
over(name) {
|
|
64
|
-
return new WindowNode(this.func, this.def.over(name));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Return an updated window with the given partitions.
|
|
69
|
-
* @param {...ExprVarArgs} expr The partition by criteria.
|
|
70
|
-
* @returns {WindowNode} A new window node.
|
|
71
|
-
*/
|
|
72
|
-
partitionby(...expr) {
|
|
73
|
-
return new WindowNode(this.func, this.def.partitionby(...expr));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Return an updated window with the given ordering.
|
|
78
|
-
* @param {...ExprVarArgs} expr The order by criteria.
|
|
79
|
-
* @returns {WindowNode} A new window node.
|
|
80
|
-
*/
|
|
81
|
-
orderby(...expr) {
|
|
82
|
-
return new WindowNode(this.func, this.def.orderby(...expr));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Return an updated window with the given frame definition.
|
|
87
|
-
* @param {WindowFrameNode} framedef The frame definition.
|
|
88
|
-
* @returns {WindowNode} A new window node.
|
|
89
|
-
*/
|
|
90
|
-
frame(framedef) {
|
|
91
|
-
return new WindowNode(this.func, this.def.frame(framedef));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Generate a SQL query string for this node.
|
|
96
|
-
* @returns {string}
|
|
97
|
-
*/
|
|
98
|
-
toString() {
|
|
99
|
-
return `${this.func} OVER ${this.def}`;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export class WindowFunctionNode extends ExprNode {
|
|
104
|
-
/**
|
|
105
|
-
* Instantiate a window function call node.
|
|
106
|
-
* @param {WindowFunctionName} name The window function name.
|
|
107
|
-
* @param {ExprNode[]} [args=[]] The window function arguments.
|
|
108
|
-
* @param {boolean} [ignoreNulls=false] Flag to ignore null values.
|
|
109
|
-
* @param {OrderByExpr} [argOrder] Order expressions for window arguments.
|
|
110
|
-
* Note that this argument ordering is distinct from the window ordering.
|
|
111
|
-
*/
|
|
112
|
-
constructor(name, args = [], ignoreNulls = false, argOrder = []) {
|
|
113
|
-
super(WINDOW_FUNCTION);
|
|
114
|
-
/**
|
|
115
|
-
* The window function name.
|
|
116
|
-
* @type {string}
|
|
117
|
-
* @readonly
|
|
118
|
-
*/
|
|
119
|
-
this.name = name;
|
|
120
|
-
/**
|
|
121
|
-
* The window function arguments.
|
|
122
|
-
* @type {ExprNode[]}
|
|
123
|
-
* @readonly
|
|
124
|
-
*/
|
|
125
|
-
this.args = args;
|
|
126
|
-
/**
|
|
127
|
-
* Flag to ignore null values.
|
|
128
|
-
* @type {boolean}
|
|
129
|
-
* @readonly
|
|
130
|
-
*/
|
|
131
|
-
this.ignoreNulls = ignoreNulls;
|
|
132
|
-
/**
|
|
133
|
-
* Order by expression for window arguments.
|
|
134
|
-
* @type {ExprNode[]}
|
|
135
|
-
* @readonly
|
|
136
|
-
*/
|
|
137
|
-
this.order = exprList([argOrder]);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Generate a SQL query string for this node.
|
|
142
|
-
* @returns {string}
|
|
143
|
-
*/
|
|
144
|
-
toString() {
|
|
145
|
-
const { name, args, ignoreNulls, order } = this;
|
|
146
|
-
const arg = [
|
|
147
|
-
args.join(', '),
|
|
148
|
-
order.length ? `ORDER BY ${order.join(', ')}` : '',
|
|
149
|
-
ignoreNulls ? 'IGNORE NULLS' : ''
|
|
150
|
-
].filter(x => x).join(' ');
|
|
151
|
-
return `${name}(${arg})`;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export class WindowDefNode extends SQLNode {
|
|
156
|
-
/**
|
|
157
|
-
* Instantiate a window definition node.
|
|
158
|
-
* @param {string} [name] The base window definition name.
|
|
159
|
-
* @param {ExprNode[]} [partition] The partition by criteria.
|
|
160
|
-
* @param {ExprNode[]} [order] The order by criteria.
|
|
161
|
-
* @param {WindowFrameNode} [framedef] The window frame definition.
|
|
162
|
-
*/
|
|
163
|
-
constructor(name, partition, order, framedef) {
|
|
164
|
-
super(WINDOW_DEF);
|
|
165
|
-
/**
|
|
166
|
-
* The base window definition name.
|
|
167
|
-
* @type {string}
|
|
168
|
-
* @readonly
|
|
169
|
-
*/
|
|
170
|
-
this.name = name;
|
|
171
|
-
/**
|
|
172
|
-
* The partition by criteria.
|
|
173
|
-
* @type {ExprNode[]}
|
|
174
|
-
* @readonly
|
|
175
|
-
*/
|
|
176
|
-
this.partition = partition;
|
|
177
|
-
/**
|
|
178
|
-
* The order by criteria.
|
|
179
|
-
* @type {ExprNode[]}
|
|
180
|
-
* @readonly
|
|
181
|
-
*/
|
|
182
|
-
this.order = order;
|
|
183
|
-
/**
|
|
184
|
-
* The window frame definition.
|
|
185
|
-
* @type {WindowFrameNode}
|
|
186
|
-
* @readonly
|
|
187
|
-
*/
|
|
188
|
-
this.framedef = framedef;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Return an updated window definition with the given base name.
|
|
193
|
-
* @param {string} name The base window definition name.
|
|
194
|
-
* @returns {WindowDefNode} A new window definition node.
|
|
195
|
-
*/
|
|
196
|
-
over(name) {
|
|
197
|
-
return deriveDef(this, { name });
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Return an updated window definition with the given partitions.
|
|
202
|
-
* @param {...ExprVarArgs} expr The partition by criteria.
|
|
203
|
-
* @returns {WindowDefNode} A new window definition node.
|
|
204
|
-
*/
|
|
205
|
-
partitionby(...expr) {
|
|
206
|
-
return deriveDef(this, { partition: exprList(expr) });
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Return an updated window definition with the given ordering.
|
|
211
|
-
* @param {...ExprVarArgs} expr The order by criteria.
|
|
212
|
-
* @returns {WindowDefNode} A new window definition node.
|
|
213
|
-
*/
|
|
214
|
-
orderby(...expr) {
|
|
215
|
-
return deriveDef(this, { order: exprList(expr) });
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Return an updated window definition with the given frame definition.
|
|
220
|
-
* @param {WindowFrameNode} framedef The frame definition.
|
|
221
|
-
* @returns {WindowDefNode} A new window definition node.
|
|
222
|
-
*/
|
|
223
|
-
frame(framedef) {
|
|
224
|
-
return deriveDef(this, { framedef });
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Generate a SQL query string for this node.
|
|
229
|
-
* @returns {string}
|
|
230
|
-
*/
|
|
231
|
-
toString() {
|
|
232
|
-
const { name, partition, order, framedef } = this;
|
|
233
|
-
const base = name && quoteIdentifier(name);
|
|
234
|
-
const def = [
|
|
235
|
-
base,
|
|
236
|
-
partition?.length && `PARTITION BY ${partition.join(', ')}`,
|
|
237
|
-
order?.length && `ORDER BY ${order.join(', ')}`,
|
|
238
|
-
framedef
|
|
239
|
-
].filter(x => x);
|
|
240
|
-
return base && def.length < 2 ? base : `(${def.join(' ')})`;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Derive a new window definition node from an existing one.
|
|
246
|
-
* @param {WindowDefNode} def The existing window definition.
|
|
247
|
-
* @param {object} options An options object with new definition properties.
|
|
248
|
-
* @param {string} [options.name] The base window definition name.
|
|
249
|
-
* @param {ExprNode[]} [options.partition] The partition by criteria.
|
|
250
|
-
* @param {ExprNode[]} [options.order] The order by criteria.
|
|
251
|
-
* @param {WindowFrameNode} [options.framedef] The window frame definition.
|
|
252
|
-
*/
|
|
253
|
-
function deriveDef(def, options) {
|
|
254
|
-
return new WindowDefNode(
|
|
255
|
-
options.name ?? def.name,
|
|
256
|
-
options.partition ?? def.partition,
|
|
257
|
-
options.order ?? def.order,
|
|
258
|
-
options.framedef ?? def.framedef
|
|
259
|
-
);
|
|
260
|
-
}
|