@uwdata/mosaic-sql 0.18.0 → 0.20.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 (212) hide show
  1. package/dist/src/ast/aggregate.d.ts +0 -4
  2. package/dist/src/ast/aggregate.d.ts.map +1 -1
  3. package/dist/src/ast/aggregate.js +0 -15
  4. package/dist/src/ast/aggregate.js.map +1 -1
  5. package/dist/src/ast/between-op.d.ts +0 -8
  6. package/dist/src/ast/between-op.d.ts.map +1 -1
  7. package/dist/src/ast/between-op.js +0 -12
  8. package/dist/src/ast/between-op.js.map +1 -1
  9. package/dist/src/ast/binary-op.d.ts +0 -4
  10. package/dist/src/ast/binary-op.d.ts.map +1 -1
  11. package/dist/src/ast/binary-op.js +0 -6
  12. package/dist/src/ast/binary-op.js.map +1 -1
  13. package/dist/src/ast/case.d.ts +0 -8
  14. package/dist/src/ast/case.d.ts.map +1 -1
  15. package/dist/src/ast/case.js +0 -16
  16. package/dist/src/ast/case.js.map +1 -1
  17. package/dist/src/ast/cast.d.ts +0 -4
  18. package/dist/src/ast/cast.d.ts.map +1 -1
  19. package/dist/src/ast/cast.js +0 -7
  20. package/dist/src/ast/cast.js.map +1 -1
  21. package/dist/src/ast/collate.d.ts +0 -4
  22. package/dist/src/ast/collate.d.ts.map +1 -1
  23. package/dist/src/ast/collate.js +0 -6
  24. package/dist/src/ast/collate.js.map +1 -1
  25. package/dist/src/ast/column-ref.d.ts +0 -4
  26. package/dist/src/ast/column-ref.d.ts.map +1 -1
  27. package/dist/src/ast/column-ref.js +0 -10
  28. package/dist/src/ast/column-ref.js.map +1 -1
  29. package/dist/src/ast/fragment.d.ts +0 -4
  30. package/dist/src/ast/fragment.d.ts.map +1 -1
  31. package/dist/src/ast/fragment.js +0 -6
  32. package/dist/src/ast/fragment.js.map +1 -1
  33. package/dist/src/ast/from.d.ts +10 -3
  34. package/dist/src/ast/from.d.ts.map +1 -1
  35. package/dist/src/ast/from.js +11 -12
  36. package/dist/src/ast/from.js.map +1 -1
  37. package/dist/src/ast/function.d.ts +0 -4
  38. package/dist/src/ast/function.d.ts.map +1 -1
  39. package/dist/src/ast/function.js +0 -7
  40. package/dist/src/ast/function.js.map +1 -1
  41. package/dist/src/ast/in-op.d.ts +0 -4
  42. package/dist/src/ast/in-op.d.ts.map +1 -1
  43. package/dist/src/ast/in-op.js +0 -6
  44. package/dist/src/ast/in-op.js.map +1 -1
  45. package/dist/src/ast/interval.d.ts +0 -4
  46. package/dist/src/ast/interval.d.ts.map +1 -1
  47. package/dist/src/ast/interval.js +0 -6
  48. package/dist/src/ast/interval.js.map +1 -1
  49. package/dist/src/ast/join.d.ts +45 -0
  50. package/dist/src/ast/join.d.ts.map +1 -0
  51. package/dist/src/ast/join.js +47 -0
  52. package/dist/src/ast/join.js.map +1 -0
  53. package/dist/src/ast/list.d.ts +11 -0
  54. package/dist/src/ast/list.d.ts.map +1 -0
  55. package/dist/src/ast/list.js +15 -0
  56. package/dist/src/ast/list.js.map +1 -0
  57. package/dist/src/ast/literal.d.ts +0 -4
  58. package/dist/src/ast/literal.d.ts.map +1 -1
  59. package/dist/src/ast/literal.js +0 -6
  60. package/dist/src/ast/literal.js.map +1 -1
  61. package/dist/src/ast/logical-op.d.ts +0 -4
  62. package/dist/src/ast/logical-op.d.ts.map +1 -1
  63. package/dist/src/ast/logical-op.js +0 -9
  64. package/dist/src/ast/logical-op.js.map +1 -1
  65. package/dist/src/ast/node.d.ts +13 -0
  66. package/dist/src/ast/node.d.ts.map +1 -1
  67. package/dist/src/ast/node.js +25 -3
  68. package/dist/src/ast/node.js.map +1 -1
  69. package/dist/src/ast/order-by.d.ts +0 -4
  70. package/dist/src/ast/order-by.d.ts.map +1 -1
  71. package/dist/src/ast/order-by.js +0 -13
  72. package/dist/src/ast/order-by.js.map +1 -1
  73. package/dist/src/ast/param.d.ts +0 -4
  74. package/dist/src/ast/param.d.ts.map +1 -1
  75. package/dist/src/ast/param.js +0 -7
  76. package/dist/src/ast/param.js.map +1 -1
  77. package/dist/src/ast/query.d.ts +43 -15
  78. package/dist/src/ast/query.d.ts.map +1 -1
  79. package/dist/src/ast/query.js +71 -92
  80. package/dist/src/ast/query.js.map +1 -1
  81. package/dist/src/ast/sample.d.ts +0 -4
  82. package/dist/src/ast/sample.d.ts.map +1 -1
  83. package/dist/src/ast/sample.js +0 -9
  84. package/dist/src/ast/sample.js.map +1 -1
  85. package/dist/src/ast/select.d.ts +0 -4
  86. package/dist/src/ast/select.d.ts.map +1 -1
  87. package/dist/src/ast/select.js +0 -16
  88. package/dist/src/ast/select.js.map +1 -1
  89. package/dist/src/ast/subquery.d.ts +0 -4
  90. package/dist/src/ast/subquery.d.ts.map +1 -1
  91. package/dist/src/ast/subquery.js +0 -6
  92. package/dist/src/ast/subquery.js.map +1 -1
  93. package/dist/src/ast/table-ref.d.ts +0 -4
  94. package/dist/src/ast/table-ref.d.ts.map +1 -1
  95. package/dist/src/ast/table-ref.js +0 -7
  96. package/dist/src/ast/table-ref.js.map +1 -1
  97. package/dist/src/ast/unary-op.d.ts +0 -8
  98. package/dist/src/ast/unary-op.d.ts.map +1 -1
  99. package/dist/src/ast/unary-op.js +0 -12
  100. package/dist/src/ast/unary-op.js.map +1 -1
  101. package/dist/src/ast/unnest.d.ts +15 -0
  102. package/dist/src/ast/unnest.d.ts.map +1 -0
  103. package/dist/src/ast/unnest.js +21 -0
  104. package/dist/src/ast/unnest.js.map +1 -0
  105. package/dist/src/ast/verbatim.d.ts +0 -4
  106. package/dist/src/ast/verbatim.d.ts.map +1 -1
  107. package/dist/src/ast/verbatim.js +0 -6
  108. package/dist/src/ast/verbatim.js.map +1 -1
  109. package/dist/src/ast/window-frame.d.ts +0 -8
  110. package/dist/src/ast/window-frame.d.ts.map +1 -1
  111. package/dist/src/ast/window-frame.js +1 -29
  112. package/dist/src/ast/window-frame.js.map +1 -1
  113. package/dist/src/ast/window.d.ts +0 -16
  114. package/dist/src/ast/window.d.ts.map +1 -1
  115. package/dist/src/ast/window.js +0 -39
  116. package/dist/src/ast/window.js.map +1 -1
  117. package/dist/src/ast/with.d.ts +0 -4
  118. package/dist/src/ast/with.d.ts.map +1 -1
  119. package/dist/src/ast/with.js +0 -10
  120. package/dist/src/ast/with.js.map +1 -1
  121. package/dist/src/constants.d.ts +4 -0
  122. package/dist/src/constants.d.ts.map +1 -1
  123. package/dist/src/constants.js +4 -0
  124. package/dist/src/constants.js.map +1 -1
  125. package/dist/src/functions/from.d.ts +11 -0
  126. package/dist/src/functions/from.d.ts.map +1 -0
  127. package/dist/src/functions/from.js +12 -0
  128. package/dist/src/functions/from.js.map +1 -0
  129. package/dist/src/functions/join.d.ts +49 -0
  130. package/dist/src/functions/join.d.ts.map +1 -0
  131. package/dist/src/functions/join.js +50 -0
  132. package/dist/src/functions/join.js.map +1 -0
  133. package/dist/src/functions/list.d.ts +31 -0
  134. package/dist/src/functions/list.d.ts.map +1 -0
  135. package/dist/src/functions/list.js +49 -0
  136. package/dist/src/functions/list.js.map +1 -0
  137. package/dist/src/functions/unnest.d.ts +10 -0
  138. package/dist/src/functions/unnest.d.ts.map +1 -0
  139. package/dist/src/functions/unnest.js +12 -0
  140. package/dist/src/functions/unnest.js.map +1 -0
  141. package/dist/src/index.d.ts +11 -1
  142. package/dist/src/index.d.ts.map +1 -1
  143. package/dist/src/index.js +12 -1
  144. package/dist/src/index.js.map +1 -1
  145. package/dist/src/init.d.ts +2 -0
  146. package/dist/src/init.d.ts.map +1 -0
  147. package/dist/src/init.js +5 -0
  148. package/dist/src/init.js.map +1 -0
  149. package/dist/src/transforms/filter-query.d.ts.map +1 -1
  150. package/dist/src/transforms/filter-query.js +2 -0
  151. package/dist/src/transforms/filter-query.js.map +1 -1
  152. package/dist/src/visit/codegen/duckdb.d.ts +49 -0
  153. package/dist/src/visit/codegen/duckdb.d.ts.map +1 -0
  154. package/dist/src/visit/codegen/duckdb.js +332 -0
  155. package/dist/src/visit/codegen/duckdb.js.map +1 -0
  156. package/dist/src/visit/codegen/sql.d.ts +60 -0
  157. package/dist/src/visit/codegen/sql.d.ts.map +1 -0
  158. package/dist/src/visit/codegen/sql.js +85 -0
  159. package/dist/src/visit/codegen/sql.js.map +1 -0
  160. package/dist/src/visit/duckdb-visitor.d.ts +50 -0
  161. package/dist/src/visit/duckdb-visitor.d.ts.map +1 -0
  162. package/dist/src/visit/duckdb-visitor.js +350 -0
  163. package/dist/src/visit/duckdb-visitor.js.map +1 -0
  164. package/dist/src/visit/recurse.d.ts.map +1 -1
  165. package/dist/src/visit/recurse.js +3 -1
  166. package/dist/src/visit/recurse.js.map +1 -1
  167. package/dist/src/visit/to-string-visitor.d.ts +60 -0
  168. package/dist/src/visit/to-string-visitor.d.ts.map +1 -0
  169. package/dist/src/visit/to-string-visitor.js +80 -0
  170. package/dist/src/visit/to-string-visitor.js.map +1 -0
  171. package/package.json +2 -2
  172. package/src/ast/aggregate.ts +0 -16
  173. package/src/ast/between-op.ts +0 -14
  174. package/src/ast/binary-op.ts +0 -7
  175. package/src/ast/case.ts +0 -18
  176. package/src/ast/cast.ts +0 -8
  177. package/src/ast/collate.ts +0 -7
  178. package/src/ast/column-ref.ts +0 -11
  179. package/src/ast/fragment.ts +0 -7
  180. package/src/ast/from.ts +12 -12
  181. package/src/ast/function.ts +0 -8
  182. package/src/ast/in-op.ts +0 -7
  183. package/src/ast/interval.ts +0 -7
  184. package/src/ast/join.ts +66 -0
  185. package/src/ast/list.ts +16 -0
  186. package/src/ast/literal.ts +0 -7
  187. package/src/ast/logical-op.ts +0 -10
  188. package/src/ast/node.ts +30 -3
  189. package/src/ast/order-by.ts +0 -14
  190. package/src/ast/param.ts +0 -8
  191. package/src/ast/query.ts +80 -104
  192. package/src/ast/sample.ts +0 -10
  193. package/src/ast/select.ts +0 -18
  194. package/src/ast/subquery.ts +0 -7
  195. package/src/ast/table-ref.ts +0 -8
  196. package/src/ast/unary-op.ts +0 -14
  197. package/src/ast/unnest.ts +22 -0
  198. package/src/ast/verbatim.ts +0 -7
  199. package/src/ast/window-frame.ts +1 -32
  200. package/src/ast/window.ts +0 -43
  201. package/src/ast/with.ts +0 -11
  202. package/src/constants.ts +4 -0
  203. package/src/functions/from.ts +18 -0
  204. package/src/functions/join.ts +101 -0
  205. package/src/functions/list.ts +63 -0
  206. package/src/functions/unnest.ts +13 -0
  207. package/src/index.ts +13 -1
  208. package/src/init.ts +5 -0
  209. package/src/transforms/filter-query.ts +2 -0
  210. package/src/visit/codegen/duckdb.ts +444 -0
  211. package/src/visit/codegen/sql.ts +213 -0
  212. package/src/visit/recurse.ts +4 -0
@@ -0,0 +1,60 @@
1
+ import type { SQLNode, ExprNode, AggregateNode, BetweenOpNode, NotBetweenOpNode, BinaryOpNode, CaseNode, WhenNode, CastNode, CollateNode, ColumnParamNode, ColumnRefNode, FragmentNode, FromClauseNode, FunctionNode, InOpNode, IntervalNode, JoinNode, ListNode, LiteralNode, LogicalOpNode, OrderByNode, ParamNode, DescribeQuery, SelectQuery, SetOperation, SampleClauseNode, SelectClauseNode, ScalarSubqueryNode, TableRefNode, UnaryOpNode, UnaryPostfixOpNode, UnnestNode, VerbatimNode, WindowNode, WindowClauseNode, WindowDefNode, WindowFunctionNode, WindowFrameNode, WindowFrameExprNode, WithClauseNode } from '../index.js';
2
+ /**
3
+ * Abstract base class for SQL visitors providing common functionality.
4
+ */
5
+ export declare abstract class ToStringVisitor {
6
+ /**
7
+ * Convert a SQL AST node to a string using this visitor.
8
+ * @param node The SQL AST node to convert.
9
+ * @returns The SQL string representation.
10
+ */
11
+ toString(node: SQLNode): string;
12
+ protected getVisitMethod(nodeType: string): ((node: AggregateNode) => string) | ((node: BetweenOpNode) => string) | ((node: BinaryOpNode) => string) | ((node: CaseNode) => string) | ((node: CastNode) => string) | ((node: CollateNode) => string) | ((node: ColumnParamNode) => string) | ((node: DescribeQuery) => string);
13
+ /**
14
+ * Helper method to convert child nodes to strings.
15
+ * @param nodes Array of child nodes.
16
+ * @returns Array of SQL strings.
17
+ */
18
+ protected mapToString(nodes: SQLNode[]): string[];
19
+ abstract visitAggregate(node: AggregateNode): string;
20
+ abstract visitBetween(node: BetweenOpNode): string;
21
+ abstract visitBinary(node: BinaryOpNode): string;
22
+ abstract visitCase(node: CaseNode): string;
23
+ abstract visitCast(node: CastNode): string;
24
+ abstract visitCollate(node: CollateNode): string;
25
+ abstract visitColumnParam(node: ColumnParamNode): string;
26
+ abstract visitColumnRef(node: ColumnRefNode): string;
27
+ abstract visitDescribeQuery(node: DescribeQuery): string;
28
+ abstract visitExpression(node: ExprNode): string;
29
+ abstract visitFragment(node: FragmentNode): string;
30
+ abstract visitFromClause(node: FromClauseNode): string;
31
+ abstract visitFunction(node: FunctionNode): string;
32
+ abstract visitIn(node: InOpNode): string;
33
+ abstract visitInterval(node: IntervalNode): string;
34
+ abstract visitJoinClause(node: JoinNode): string;
35
+ abstract visitList(node: ListNode): string;
36
+ abstract visitLiteral(node: LiteralNode): string;
37
+ abstract visitLogicalOperator(node: LogicalOpNode<ExprNode>): string;
38
+ abstract visitNotBetween(node: NotBetweenOpNode): string;
39
+ abstract visitOrderBy(node: OrderByNode): string;
40
+ abstract visitParam(node: ParamNode): string;
41
+ abstract visitSampleClause(node: SampleClauseNode): string;
42
+ abstract visitScalarSubquery(node: ScalarSubqueryNode): string;
43
+ abstract visitSelectClause(node: SelectClauseNode): string;
44
+ abstract visitSelectQuery(node: SelectQuery): string;
45
+ abstract visitSetOperation(node: SetOperation): string;
46
+ abstract visitTableRef(node: TableRefNode): string;
47
+ abstract visitUnary(node: UnaryOpNode): string;
48
+ abstract visitUnaryPostfix(node: UnaryPostfixOpNode): string;
49
+ abstract visitUnnest(node: UnnestNode): string;
50
+ abstract visitVerbatim(node: VerbatimNode): string;
51
+ abstract visitWhen(node: WhenNode): string;
52
+ abstract visitWindow(node: WindowNode): string;
53
+ abstract visitWindowClause(node: WindowClauseNode): string;
54
+ abstract visitWindowDef(node: WindowDefNode): string;
55
+ abstract visitWindowExtentExpr(node: WindowFrameExprNode): string;
56
+ abstract visitWindowFrame(node: WindowFrameNode): string;
57
+ abstract visitWindowFunction(node: WindowFunctionNode): string;
58
+ abstract visitWithClause(node: WithClauseNode): string;
59
+ }
60
+ //# sourceMappingURL=to-string-visitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-string-visitor.d.ts","sourceRoot":"","sources":["../../../src/visit/to-string-visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { AGGREGATE, BETWEEN_OPERATOR, BINARY_OPERATOR, CASE, CAST, COLLATE, COLUMN_PARAM, COLUMN_REF, DESCRIBE_QUERY, EXPRESSION, FRAGMENT, FROM_CLAUSE, FUNCTION, IN_OPERATOR, INTERVAL, JOIN_CLAUSE, LIST, LITERAL, LOGICAL_OPERATOR, NOT_BETWEEN_OPERATOR, ORDER_BY, PARAM, SAMPLE_CLAUSE, SCALAR_SUBQUERY, SELECT_CLAUSE, SELECT_QUERY, SET_OPERATION, TABLE_REF, UNARY_OPERATOR, UNARY_POSTFIX_OPERATOR, UNNEST, VERBATIM, WHEN, WINDOW, WINDOW_CLAUSE, WINDOW_DEF, WINDOW_EXTENT_EXPR, WINDOW_FRAME, WINDOW_FUNCTION, WITH_CLAUSE } from '../constants.js';
2
+ /**
3
+ * Abstract base class for SQL visitors providing common functionality.
4
+ */
5
+ export class ToStringVisitor {
6
+ /**
7
+ * Convert a SQL AST node to a string using this visitor.
8
+ * @param node The SQL AST node to convert.
9
+ * @returns The SQL string representation.
10
+ */
11
+ toString(node) {
12
+ if (!node) {
13
+ throw new Error('Node is null or undefined');
14
+ }
15
+ if (typeof node.type !== 'string') {
16
+ throw new Error(`Node type is not a string: ${typeof node.type}, value: ${node.type}`);
17
+ }
18
+ const method = this.getVisitMethod(node.type);
19
+ if (typeof method === 'function') {
20
+ // @ts-expect-error: fix me
21
+ return method.call(this, node);
22
+ }
23
+ throw new Error(`No visitor method for node type: '${node.type}'`);
24
+ }
25
+ getVisitMethod(nodeType) {
26
+ switch (nodeType) {
27
+ case AGGREGATE: return this.visitAggregate;
28
+ case BETWEEN_OPERATOR: return this.visitBetween;
29
+ case BINARY_OPERATOR: return this.visitBinary;
30
+ case CASE: return this.visitCase;
31
+ case CAST: return this.visitCast;
32
+ case COLLATE: return this.visitCollate;
33
+ case COLUMN_PARAM: return this.visitColumnParam;
34
+ case COLUMN_REF: return this.visitColumnRef;
35
+ case DESCRIBE_QUERY: return this.visitDescribeQuery;
36
+ case EXPRESSION: return this.visitExpression;
37
+ case FRAGMENT: return this.visitFragment;
38
+ case FROM_CLAUSE: return this.visitFromClause;
39
+ case FUNCTION: return this.visitFunction;
40
+ case IN_OPERATOR: return this.visitIn;
41
+ case INTERVAL: return this.visitInterval;
42
+ case JOIN_CLAUSE: return this.visitJoinClause;
43
+ case LIST: return this.visitList;
44
+ case LITERAL: return this.visitLiteral;
45
+ case LOGICAL_OPERATOR: return this.visitLogicalOperator;
46
+ case NOT_BETWEEN_OPERATOR: return this.visitNotBetween;
47
+ case ORDER_BY: return this.visitOrderBy;
48
+ case PARAM: return this.visitParam;
49
+ case SAMPLE_CLAUSE: return this.visitSampleClause;
50
+ case SCALAR_SUBQUERY: return this.visitScalarSubquery;
51
+ case SELECT_CLAUSE: return this.visitSelectClause;
52
+ case SELECT_QUERY: return this.visitSelectQuery;
53
+ case SET_OPERATION: return this.visitSetOperation;
54
+ case TABLE_REF: return this.visitTableRef;
55
+ case UNARY_OPERATOR: return this.visitUnary;
56
+ case UNARY_POSTFIX_OPERATOR: return this.visitUnaryPostfix;
57
+ case UNNEST: return this.visitUnnest;
58
+ case VERBATIM: return this.visitVerbatim;
59
+ case WHEN: return this.visitWhen;
60
+ case WINDOW: return this.visitWindow;
61
+ case WINDOW_CLAUSE: return this.visitWindowClause;
62
+ case WINDOW_DEF: return this.visitWindowDef;
63
+ case WINDOW_EXTENT_EXPR: return this.visitWindowExtentExpr;
64
+ case WINDOW_FRAME: return this.visitWindowFrame;
65
+ case WINDOW_FUNCTION: return this.visitWindowFunction;
66
+ case WITH_CLAUSE: return this.visitWithClause;
67
+ default:
68
+ throw new Error(`Unknown node type: '${nodeType}'`);
69
+ }
70
+ }
71
+ /**
72
+ * Helper method to convert child nodes to strings.
73
+ * @param nodes Array of child nodes.
74
+ * @returns Array of SQL strings.
75
+ */
76
+ mapToString(nodes) {
77
+ return nodes.map(node => this.toString(node));
78
+ }
79
+ }
80
+ //# sourceMappingURL=to-string-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-string-visitor.js","sourceRoot":"","sources":["../../../src/visit/to-string-visitor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uwdata/mosaic-sql",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "description": "SQL query construction and analysis.",
5
5
  "keywords": [
6
6
  "sql",
@@ -29,5 +29,5 @@
29
29
  "test": "vitest run",
30
30
  "prepublishOnly": "npm run test && npm run lint && tsc --build"
31
31
  },
32
- "gitHead": "dfb9ded0b0307754e3185ca34cc49a1384fe8455"
32
+ "gitHead": "5dae8fa40fd559abe287e1264d1a00073eedc749"
33
33
  }
@@ -104,22 +104,6 @@ export class AggregateNode extends ExprNode {
104
104
  frame(framedef: WindowFrameNode) {
105
105
  return this.window().frame(framedef);
106
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
107
  }
124
108
 
125
109
  /**
@@ -40,13 +40,6 @@ export class BetweenOpNode extends AbstractBetweenOpNode {
40
40
  constructor(expr: ExprNode, extent?: Extent) {
41
41
  super(BETWEEN_OPERATOR, expr, extent);
42
42
  }
43
-
44
- /**
45
- * Generate a SQL query string for this node.
46
- */
47
- toString() {
48
- return super.toSQL('BETWEEN');
49
- }
50
43
  }
51
44
 
52
45
  export class NotBetweenOpNode extends AbstractBetweenOpNode {
@@ -58,11 +51,4 @@ export class NotBetweenOpNode extends AbstractBetweenOpNode {
58
51
  constructor(expr: ExprNode, extent?: Extent) {
59
52
  super(NOT_BETWEEN_OPERATOR, expr, extent);
60
53
  }
61
-
62
- /**
63
- * Generate a SQL query string for this node.
64
- */
65
- toString() {
66
- return super.toSQL('NOT BETWEEN');
67
- }
68
54
  }
@@ -21,11 +21,4 @@ export class BinaryOpNode extends ExprNode {
21
21
  this.left = left;
22
22
  this.right = right;
23
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
24
  }
package/src/ast/case.ts CHANGED
@@ -52,17 +52,6 @@ export class CaseNode extends ExprNode {
52
52
  else(expr: ExprValue) {
53
53
  return new CaseNode(this.expr, this._when, asNode(expr));
54
54
  }
55
-
56
- /**
57
- * Generate a SQL query string for this node.
58
- */
59
- toString() {
60
- return 'CASE '
61
- + (this.expr ? `${this.expr} ` : '')
62
- + this._when.join(' ')
63
- + (this._else ? ` ELSE ${this._else}` : '')
64
- + ' END';
65
- }
66
55
  }
67
56
 
68
57
  export class WhenNode extends SQLNode {
@@ -81,11 +70,4 @@ export class WhenNode extends SQLNode {
81
70
  this.when = when;
82
71
  this.then = then;
83
72
  }
84
-
85
- /**
86
- * Generate a SQL query string for this node.
87
- */
88
- toString() {
89
- return `WHEN ${this.when} THEN ${this.then}`;
90
- }
91
73
  }
package/src/ast/cast.ts CHANGED
@@ -17,12 +17,4 @@ export class CastNode extends ExprNode {
17
17
  this.expr = expr;
18
18
  this.cast = type;
19
19
  }
20
-
21
- /**
22
- * Generate a SQL query string for this node.
23
- */
24
- toString() {
25
- // TODO? could include check to see if parens are necessary
26
- return `(${this.expr})::${this.cast}`;
27
- }
28
20
  }
@@ -17,11 +17,4 @@ export class CollateNode extends ExprNode {
17
17
  this.expr = expr;
18
18
  this.collation = collation;
19
19
  }
20
-
21
- /**
22
- * Generate a SQL query string for this node.
23
- */
24
- toString() {
25
- return `${this.expr} ${COLLATE} ${this.collation}`;
26
- }
27
20
  }
@@ -1,6 +1,5 @@
1
1
  import type { TableRefNode } from './table-ref.js';
2
2
  import { COLUMN_REF } from '../constants.js';
3
- import { quoteIdentifier } from '../util/string.js';
4
3
  import { ExprNode } from './node.js';
5
4
 
6
5
  /**
@@ -31,16 +30,6 @@ export class ColumnRefNode extends ExprNode {
31
30
  get column() {
32
31
  return ''; // subclasses to override
33
32
  }
34
-
35
- /**
36
- * Generate a SQL query string for this node.
37
- */
38
- toString() {
39
- const { column, table } = this;
40
- const tref = `${table ?? ''}`;
41
- const id = column === '*' ? '*' : quoteIdentifier(column);
42
- return (tref ? (tref + '.') : '') + id;
43
- }
44
33
  }
45
34
 
46
35
  export class ColumnNameRefNode extends ColumnRefNode {
@@ -18,11 +18,4 @@ export class FragmentNode extends ExprNode {
18
18
  super(FRAGMENT);
19
19
  this.spans = spans;
20
20
  }
21
-
22
- /**
23
- * Generate a SQL query string for this node.
24
- */
25
- toString() {
26
- return this.spans.join('');
27
- }
28
21
  }
package/src/ast/from.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import type { SampleClauseNode } from './sample.js';
2
2
  import { FROM_CLAUSE } from '../constants.js';
3
- import { quoteIdentifier } from '../util/string.js';
4
3
  import { SQLNode } from './node.js';
5
- import { isQuery } from './query.js';
6
- import { isTableRef } from './table-ref.js';
7
4
 
8
- export class FromClauseNode extends SQLNode {
5
+ /**
6
+ * AST node corresponding to a table source which can appear
7
+ * within a SQL `FROM` clause.
8
+ */
9
+ export class FromNode extends SQLNode {
10
+ }
11
+
12
+ export class FromClauseNode extends FromNode {
9
13
  /** The from expression. */
10
14
  readonly expr: SQLNode;
11
15
  /** The output name. */
@@ -27,14 +31,10 @@ export class FromClauseNode extends SQLNode {
27
31
  }
28
32
 
29
33
  /**
30
- * Generate a SQL query string for this node.
34
+ * Create a new from clause node that uses the given alias.
35
+ * @param string alias
31
36
  */
32
- toString() {
33
- const { expr, alias, sample } = this;
34
- const ref = isQuery(expr) ? `(${expr})` : `${expr}`;
35
- const from = alias && !(isTableRef(expr) && expr.table.join('.') === alias)
36
- ? `${ref} AS ${quoteIdentifier(alias)}`
37
- : `${ref}`;
38
- return `${from}${sample ? ` TABLESAMPLE ${sample}` : ''}`;
37
+ as(alias: string) {
38
+ return new FromClauseNode(this.expr, alias, this.sample);
39
39
  }
40
40
  }
@@ -17,12 +17,4 @@ export class FunctionNode extends ExprNode {
17
17
  this.name = name;
18
18
  this.args = args;
19
19
  }
20
-
21
- /**
22
- * Generate a SQL query string for this node.
23
- */
24
- toString() {
25
- const { name, args } = this;
26
- return `${name}(${args.join(', ')})`;
27
- }
28
20
  }
package/src/ast/in-op.ts CHANGED
@@ -17,11 +17,4 @@ export class InOpNode extends ExprNode {
17
17
  this.expr = expr;
18
18
  this.values = values;
19
19
  }
20
-
21
- /**
22
- * Generate a SQL query string for this node.
23
- */
24
- toString() {
25
- return `(${this.expr} IN (${this.values.join(', ')}))`;
26
- }
27
20
  }
@@ -17,11 +17,4 @@ export class IntervalNode extends ExprNode {
17
17
  this.name = name;
18
18
  this.steps = steps;
19
19
  }
20
-
21
- /**
22
- * Generate a SQL query string for this node.
23
- */
24
- toString() {
25
- return `INTERVAL ${this.steps} ${this.name}`;
26
- }
27
20
  }
@@ -0,0 +1,66 @@
1
+ import type { SampleClauseNode } from './sample.js';
2
+ import { JOIN_CLAUSE } from '../constants.js';
3
+ import { ColumnRefNode } from './column-ref.js';
4
+ import { FromNode } from './from.js';
5
+ import { ExprNode } from './node.js';
6
+ import { TableRefNode } from './table-ref.js';
7
+
8
+ /** The join variant. Determines what kind of join is performed. */
9
+ export type JoinVariant = 'REGULAR' | 'CROSS' | 'NATURAL' | 'POSITIONAL' | 'ASOF';
10
+
11
+ /** The join type. Determines which values are included in the join output. */
12
+ export type JoinType = 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' | 'SEMI' | 'ANTI';
13
+
14
+ export class JoinNode extends FromNode {
15
+ /** The left table to join. */
16
+ readonly left: FromNode | TableRefNode;
17
+ /** The right table to join. */
18
+ readonly right: FromNode | TableRefNode;
19
+ /** The join variant (REGULAR, CROSS, NATURAL, POSITIONAL, ASOF). */
20
+ readonly joinVariant: JoinVariant;
21
+ /** The join type (INNER, LEFT, RIGHT, FULL, SEMI, ANTI). */
22
+ readonly joinType: JoinType;
23
+ /**
24
+ * The join condition as a boolean expression.
25
+ * If specified, *using* should be `undefined`.
26
+ */
27
+ readonly condition?: ExprNode;
28
+ /**
29
+ * The join condition as shared columns to match on.
30
+ * If specified, *condition* should be `undefined`.
31
+ */
32
+ readonly using?: ColumnRefNode[];
33
+ /** A table sample to apply to join output. */
34
+ readonly sample?: SampleClauseNode;
35
+
36
+ /**
37
+ * Instantiate a join node.
38
+ * @param left The left table to join.
39
+ * @param right The right table to join.
40
+ * @param variant The join variant (REGULAR, CROSS, NATURAL, POSITIONAL, ASOF).
41
+ * @param type The join type (INNER, LEFT, RIGHT, FULL, SEMI, ANTI).
42
+ * @param condition The join condition as a boolean expression.
43
+ * If specified, *using* should be `undefined`.
44
+ * @param using The join condition as shared columns to match on.
45
+ * If specified, *condition* should be `undefined`.
46
+ * @param sample A table sample to apply to join output.
47
+ */
48
+ constructor(
49
+ left: FromNode | TableRefNode,
50
+ right: FromNode | TableRefNode,
51
+ variant: JoinVariant = 'NATURAL',
52
+ type: JoinType = 'INNER',
53
+ condition?: ExprNode,
54
+ using?: ColumnRefNode[],
55
+ sample?: SampleClauseNode
56
+ ) {
57
+ super(JOIN_CLAUSE);
58
+ this.left = left;
59
+ this.right = right;
60
+ this.joinVariant = variant;
61
+ this.joinType = type;
62
+ this.condition = condition;
63
+ this.using = using;
64
+ this.sample = sample;
65
+ }
66
+ }
@@ -0,0 +1,16 @@
1
+ import { LIST } from '../constants.js';
2
+ import { ExprNode } from './node.js';
3
+
4
+ export class ListNode extends ExprNode {
5
+ /** The array of values. */
6
+ readonly values: ExprNode[];
7
+
8
+ /**
9
+ * Instantiate a list node.
10
+ * @param values
11
+ */
12
+ constructor(values: ExprNode[]) {
13
+ super(LIST);
14
+ this.values = values;
15
+ }
16
+ }
@@ -13,13 +13,6 @@ export class LiteralNode extends ExprNode {
13
13
  super(LITERAL);
14
14
  this.value = value;
15
15
  }
16
-
17
- /**
18
- * Generate a SQL query string for this node.
19
- */
20
- toString() {
21
- return literalToSQL(this.value);
22
- }
23
16
  }
24
17
 
25
18
  export function literalToSQL(value: unknown) {
@@ -17,16 +17,6 @@ export class LogicalOpNode<T extends ExprNode> extends ExprNode {
17
17
  this.op = op;
18
18
  this.clauses = clauses;
19
19
  }
20
-
21
- /**
22
- * Generate a SQL query string for this node.
23
- */
24
- toString() {
25
- const c = this.clauses;
26
- return c.length === 0 ? ''
27
- : c.length === 1 ? `${c[0]}`
28
- : `(${c.join(` ${this.op} `)})`;
29
- }
30
20
  }
31
21
 
32
22
  export class AndNode<T extends ExprNode> extends LogicalOpNode<T> {
package/src/ast/node.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { SQLCodeGenerator } from '../visit/codegen/sql.js';
2
+
1
3
  /**
2
4
  * Check if a value is a SQL AST node.
3
5
  * @param value The value to check.
@@ -6,6 +8,16 @@ export function isNode(value: unknown): value is SQLNode {
6
8
  return value instanceof SQLNode;
7
9
  }
8
10
 
11
+ let _defaultVisitor: SQLCodeGenerator | undefined;
12
+
13
+ /**
14
+ * Set the default visitor for toString operations.
15
+ * This is used when no visitor is explicitly provided.
16
+ */
17
+ export function setDefaultVisitor(visitor: SQLCodeGenerator) {
18
+ _defaultVisitor = visitor;
19
+ }
20
+
9
21
  export class SQLNode {
10
22
  /** The SQL AST node type. */
11
23
  readonly type: string;
@@ -23,13 +35,28 @@ export class SQLNode {
23
35
  * @returns The shallow clone node.
24
36
  */
25
37
  clone(): this {
26
- // @ts-expect-error use constructor
27
- const clone = new this.constructor();
38
+ // @ts-expect-error use constructor with type
39
+ const clone = new this.constructor(this.type);
28
40
  for (const key in this) {
29
- clone[key] = this[key];
41
+ if (key !== 'type') { // Skip type since it's already set by constructor
42
+ clone[key] = this[key];
43
+ }
30
44
  }
31
45
  return clone;
32
46
  }
47
+
48
+ /**
49
+ * Generate a SQL query string for this node using a specific dialect visitor.
50
+ * @param visitor Optional SQL visitor to use for string generation.
51
+ * If not provided, uses the default visitor.
52
+ * @returns The SQL string representation.
53
+ */
54
+ toString(visitor: SQLCodeGenerator | undefined = _defaultVisitor): string {
55
+ if (!visitor) {
56
+ throw new Error('No visitor provided and no default visitor set.');
57
+ }
58
+ return visitor.toString(this);
59
+ }
33
60
  }
34
61
 
35
62
  /**
@@ -21,18 +21,4 @@ export class OrderByNode extends ExprNode {
21
21
  this.desc = desc;
22
22
  this.nullsFirst = nullsFirst;
23
23
  }
24
-
25
- /**
26
- * Generate a SQL query string for this node.
27
- */
28
- toString() {
29
- const { expr, desc, nullsFirst } = this;
30
- const dir = desc ? ' DESC'
31
- : desc === false ? ' ASC'
32
- : '';
33
- const nf = nullsFirst ? ' NULLS FIRST'
34
- : nullsFirst === false ? ' NULLS LAST'
35
- : '';
36
- return `${expr}${dir}${nf}`;
37
- }
38
24
  }
package/src/ast/param.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import type { ParamLike } from '../types.js';
2
2
  import { PARAM } from '../constants.js';
3
- import { literalToSQL } from './literal.js';
4
3
  import { ExprNode } from './node.js';
5
4
 
6
5
  export class ParamNode extends ExprNode {
@@ -22,11 +21,4 @@ export class ParamNode extends ExprNode {
22
21
  get value() {
23
22
  return this.param.value;
24
23
  }
25
-
26
- /**
27
- * Generate a SQL query string for this node.
28
- */
29
- toString() {
30
- return literalToSQL(this.value);
31
- }
32
24
  }