@shaxpir/squilt 1.0.0 → 1.1.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 (68) hide show
  1. package/README.md +289 -1
  2. package/dist/ast/AlterTableQuery.d.ts +32 -0
  3. package/dist/ast/AlterTableQuery.js +60 -0
  4. package/dist/ast/BetweenExpression.d.ts +10 -0
  5. package/dist/ast/BetweenExpression.js +18 -0
  6. package/dist/ast/CastExpression.d.ts +13 -0
  7. package/dist/ast/CastExpression.js +25 -0
  8. package/dist/ast/CollateExpression.d.ts +18 -0
  9. package/dist/ast/CollateExpression.js +30 -0
  10. package/dist/ast/CreateIndexQuery.d.ts +25 -0
  11. package/dist/ast/CreateIndexQuery.js +64 -0
  12. package/dist/ast/CreateTableQuery.d.ts +57 -0
  13. package/dist/ast/CreateTableQuery.js +79 -0
  14. package/dist/ast/CreateViewQuery.d.ts +34 -0
  15. package/dist/ast/CreateViewQuery.js +61 -0
  16. package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
  17. package/dist/ast/CreateVirtualTableQuery.js +74 -0
  18. package/dist/ast/DeleteQuery.d.ts +17 -0
  19. package/dist/ast/DeleteQuery.js +43 -0
  20. package/dist/ast/DropIndexQuery.d.ts +14 -0
  21. package/dist/ast/DropIndexQuery.js +35 -0
  22. package/dist/ast/DropTableQuery.d.ts +14 -0
  23. package/dist/ast/DropTableQuery.js +35 -0
  24. package/dist/ast/DropViewQuery.d.ts +11 -0
  25. package/dist/ast/DropViewQuery.js +24 -0
  26. package/dist/ast/FunctionExpression.d.ts +21 -0
  27. package/dist/ast/FunctionExpression.js +40 -1
  28. package/dist/ast/FunctionName.d.ts +1 -1
  29. package/dist/ast/FunctionName.js +1 -1
  30. package/dist/ast/InsertQuery.d.ts +24 -1
  31. package/dist/ast/InsertQuery.js +49 -1
  32. package/dist/ast/Operator.d.ts +2 -0
  33. package/dist/ast/Operator.js +3 -1
  34. package/dist/ast/SelectQuery.d.ts +4 -0
  35. package/dist/ast/SelectQuery.js +11 -1
  36. package/dist/ast/SubqueryExpression.d.ts +18 -0
  37. package/dist/ast/SubqueryExpression.js +27 -0
  38. package/dist/ast/UpdateQuery.d.ts +24 -0
  39. package/dist/ast/UpdateQuery.js +51 -0
  40. package/dist/ast/WindowExpression.d.ts +51 -0
  41. package/dist/ast/WindowExpression.js +61 -0
  42. package/dist/ast/WindowSpecification.d.ts +46 -0
  43. package/dist/ast/WindowSpecification.js +60 -0
  44. package/dist/builder/QueryBuilder.d.ts +20 -0
  45. package/dist/builder/QueryBuilder.js +41 -1
  46. package/dist/builder/Shorthand.d.ts +51 -0
  47. package/dist/builder/Shorthand.js +125 -1
  48. package/dist/index.d.ts +17 -1
  49. package/dist/index.js +59 -3
  50. package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
  51. package/dist/renderer/CompactQueryRenderer.js +272 -2
  52. package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
  53. package/dist/renderer/IndentedQueryRenderer.js +289 -3
  54. package/dist/renderer/QueryRenderer.d.ts +11 -1
  55. package/dist/renderer/QueryRenderer.js +1 -1
  56. package/dist/validate/CommonQueryValidator.d.ts +31 -1
  57. package/dist/validate/CommonQueryValidator.js +253 -4
  58. package/dist/validate/QueryValidator.d.ts +10 -1
  59. package/dist/validate/QueryValidator.js +1 -1
  60. package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
  61. package/dist/validate/SQLiteQueryValidator.js +32 -3
  62. package/dist/visitor/ParamCollector.d.ts +30 -0
  63. package/dist/visitor/ParamCollector.js +109 -2
  64. package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
  65. package/dist/visitor/QueryIdentityTransformer.js +217 -2
  66. package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
  67. package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
  68. package/package.json +4 -1
package/README.md CHANGED
@@ -73,6 +73,287 @@ query.toSQL(new IndentedQueryRenderer(2));
73
73
  // LIMIT 10
74
74
  ```
75
75
 
76
+ ### Delete Queries
77
+
78
+ Build DELETE statements with optional WHERE clauses:
79
+
80
+ ```typescript
81
+ import { DELETE_FROM, EQ, COLUMN, PARAM, AND, LT } from '@shaxpir/squilt';
82
+
83
+ // Simple delete
84
+ const deleteAll = DELETE_FROM('temp_files');
85
+ console.log(deleteAll.toSQL());
86
+ // DELETE FROM temp_files
87
+
88
+ // Delete with conditions
89
+ const deleteOld = DELETE_FROM('logs')
90
+ .where(AND(
91
+ EQ(COLUMN('level'), 'debug'),
92
+ LT(COLUMN('created_at'), PARAM('cutoffDate'))
93
+ ));
94
+ console.log(deleteOld.toSQL());
95
+ // DELETE FROM logs WHERE ((level = 'debug') AND (created_at < ?))
96
+ ```
97
+
98
+ DELETE queries support subqueries in WHERE clauses:
99
+
100
+ ```typescript
101
+ import { DELETE_FROM, SELECT, FROM, COLUMN, IN, EXISTS, EQ } from '@shaxpir/squilt';
102
+
103
+ // Delete using IN with subquery
104
+ const bannedUsers = SELECT(FROM('banned_users'), COLUMN('id'));
105
+ const deleteComments = DELETE_FROM('comments')
106
+ .where(IN(COLUMN('user_id'), bannedUsers));
107
+ console.log(deleteComments.toSQL());
108
+ // DELETE FROM comments WHERE (user_id IN (SELECT id FROM banned_users))
109
+
110
+ // Delete using EXISTS with correlated subquery
111
+ const deleteOrders = DELETE_FROM('orders')
112
+ .where(EXISTS(
113
+ SELECT(FROM('refunds'), COLUMN('*'))
114
+ .where(EQ(COLUMN('refunds', 'order_id'), COLUMN('orders', 'id')))
115
+ ));
116
+ console.log(deleteOrders.toSQL());
117
+ // DELETE FROM orders WHERE EXISTS (SELECT * FROM refunds WHERE (refunds.order_id = orders.id))
118
+ ```
119
+
120
+ ### Update Queries
121
+
122
+ Build UPDATE statements with SET clauses and optional WHERE:
123
+
124
+ ```typescript
125
+ import { UPDATE, EQ, COLUMN, PARAM } from '@shaxpir/squilt';
126
+ import { StringLiteral, NumberLiteral } from '@shaxpir/squilt';
127
+
128
+ // Simple update
129
+ const updateStatus = UPDATE('users')
130
+ .set('status', new StringLiteral('active'))
131
+ .set('last_login', PARAM('loginTime'))
132
+ .where(EQ(COLUMN('id'), PARAM('userId')));
133
+ console.log(updateStatus.toSQL());
134
+ // UPDATE users SET status = 'active', last_login = ? WHERE (id = ?)
135
+
136
+ // Update multiple columns
137
+ const bulkUpdate = UPDATE('products')
138
+ .set('price', new NumberLiteral(99))
139
+ .set('on_sale', new NumberLiteral(1))
140
+ .set('discount', new NumberLiteral(10))
141
+ .where(EQ(COLUMN('category'), 'electronics'));
142
+ console.log(bulkUpdate.toSQL());
143
+ // UPDATE products SET price = 99, on_sale = 1, discount = 10 WHERE (category = 'electronics')
144
+ ```
145
+
146
+ ### RETURNING Clause (SQLite 3.35+)
147
+
148
+ Get back affected rows from INSERT, UPDATE, and DELETE statements:
149
+
150
+ ```typescript
151
+ import { INSERT, UPDATE, DELETE_FROM, COLUMN, PARAM, EQ, ALIAS, FN } from '@shaxpir/squilt';
152
+
153
+ // INSERT with RETURNING
154
+ const createUser = INSERT('users', ['name', 'email'], [PARAM('name'), PARAM('email')])
155
+ .returning(COLUMN('id'), COLUMN('created_at'));
156
+ console.log(createUser.toSQL());
157
+ // INSERT INTO users (name, email) VALUES (?, ?) RETURNING id, created_at
158
+
159
+ // UPDATE with RETURNING
160
+ const updateUser = UPDATE('users')
161
+ .set('status', 'active')
162
+ .where(EQ(COLUMN('id'), PARAM('userId')))
163
+ .returning(COLUMN('id'), COLUMN('status'), COLUMN('updated_at'));
164
+ console.log(updateUser.toSQL());
165
+ // UPDATE users SET status = 'active' WHERE (id = ?) RETURNING id, status, updated_at
166
+
167
+ // DELETE with RETURNING
168
+ const deleteInactive = DELETE_FROM('users')
169
+ .where(EQ(COLUMN('status'), 'inactive'))
170
+ .returning(COLUMN('id'), COLUMN('email'));
171
+ console.log(deleteInactive.toSQL());
172
+ // DELETE FROM users WHERE (status = 'inactive') RETURNING id, email
173
+
174
+ // RETURNING with aliased expressions
175
+ const insertWithAlias = INSERT('orders', ['total'], [PARAM('total')])
176
+ .returning(
177
+ COLUMN('id'),
178
+ ALIAS(FN('DATETIME', COLUMN('created_at')), 'order_time')
179
+ );
180
+ console.log(insertWithAlias.toSQL());
181
+ // INSERT INTO orders (total) VALUES (?) RETURNING id, DATETIME(created_at) AS order_time
182
+ ```
183
+
184
+ ### INSERT ... SELECT
185
+
186
+ Insert rows from a query result:
187
+
188
+ ```typescript
189
+ import { INSERT_INTO, SELECT, FROM, COLUMN, EQ, LT, PARAM } from '@shaxpir/squilt';
190
+
191
+ // Basic INSERT ... SELECT
192
+ const archiveOrders = INSERT_INTO('archive_orders')
193
+ .columns('id', 'user_id', 'total')
194
+ .fromSelect(
195
+ SELECT(FROM('orders'), COLUMN('id'), COLUMN('user_id'), COLUMN('total'))
196
+ .where(LT(COLUMN('created_at'), PARAM('cutoff')))
197
+ );
198
+ console.log(archiveOrders.toSQL());
199
+ // INSERT INTO archive_orders (id, user_id, total)
200
+ // SELECT id, user_id, total FROM orders WHERE (created_at < ?)
201
+
202
+ // INSERT OR REPLACE ... SELECT
203
+ const syncData = INSERT_INTO('local_cache')
204
+ .orReplace()
205
+ .columns('id', 'data')
206
+ .fromSelect(
207
+ SELECT(FROM('remote_data'), COLUMN('id'), COLUMN('data'))
208
+ );
209
+ console.log(syncData.toSQL());
210
+ // INSERT OR REPLACE INTO local_cache (id, data) SELECT id, data FROM remote_data
211
+
212
+ // With RETURNING clause
213
+ const copyWithIds = INSERT_INTO('new_table')
214
+ .columns('name', 'value')
215
+ .fromSelect(SELECT(FROM('old_table'), COLUMN('name'), COLUMN('value')))
216
+ .returning(COLUMN('id'));
217
+ console.log(copyWithIds.toSQL());
218
+ // INSERT INTO new_table (name, value) SELECT name, value FROM old_table RETURNING id
219
+ ```
220
+
221
+ ### Set Operations: UNION, INTERSECT, EXCEPT
222
+
223
+ Combine query results with set operations:
224
+
225
+ ```typescript
226
+ import { SELECT, FROM, COLUMN, EQ } from '@shaxpir/squilt';
227
+
228
+ // UNION - combine results from multiple queries (already supported)
229
+ const allEmails = SELECT(FROM('customers'), COLUMN('email'))
230
+ .union(SELECT(FROM('subscribers'), COLUMN('email')));
231
+ console.log(allEmails.toSQL());
232
+ // SELECT email FROM customers UNION SELECT email FROM subscribers
233
+
234
+ // INTERSECT - rows that appear in both queries
235
+ const commonEmails = SELECT(FROM('subscribers'), COLUMN('email'))
236
+ .intersect(SELECT(FROM('customers'), COLUMN('email')));
237
+ console.log(commonEmails.toSQL());
238
+ // SELECT email FROM subscribers INTERSECT SELECT email FROM customers
239
+
240
+ // EXCEPT - rows in first query but not in second
241
+ const activeUsers = SELECT(FROM('all_users'), COLUMN('id'))
242
+ .except(SELECT(FROM('banned_users'), COLUMN('user_id')));
243
+ console.log(activeUsers.toSQL());
244
+ // SELECT id FROM all_users EXCEPT SELECT user_id FROM banned_users
245
+
246
+ // Combine multiple set operations
247
+ const complexSet = SELECT(FROM('set_a'), COLUMN('id'))
248
+ .union(SELECT(FROM('set_b'), COLUMN('id')))
249
+ .intersect(SELECT(FROM('set_c'), COLUMN('id')))
250
+ .except(SELECT(FROM('set_d'), COLUMN('id')));
251
+ ```
252
+
253
+ ### UPSERT (ON CONFLICT) (SQLite 3.24+)
254
+
255
+ Insert-or-update operations using SQLite's upsert syntax:
256
+
257
+ ```typescript
258
+ import { INSERT, PARAM, COLUMN, EQ } from '@shaxpir/squilt';
259
+
260
+ // ON CONFLICT DO UPDATE - update existing rows on conflict
261
+ const upsertUser = INSERT('users', ['id', 'name', 'email'], [PARAM('id'), PARAM('name'), PARAM('email')])
262
+ .onConflict('id')
263
+ .doUpdate({ name: PARAM('name'), email: PARAM('email') });
264
+ console.log(upsertUser.toSQL());
265
+ // INSERT INTO users (id, name, email) VALUES (?, ?, ?)
266
+ // ON CONFLICT (id) DO UPDATE SET name = ?, email = ?
267
+
268
+ // ON CONFLICT DO NOTHING - silently ignore conflicts
269
+ const insertIfNotExists = INSERT('events', ['id', 'data'], [PARAM('id'), PARAM('data')])
270
+ .onConflict('id')
271
+ .doNothing();
272
+ console.log(insertIfNotExists.toSQL());
273
+ // INSERT INTO events (id, data) VALUES (?, ?) ON CONFLICT (id) DO NOTHING
274
+
275
+ // Multiple conflict columns
276
+ const upsertRole = INSERT('user_roles', ['user_id', 'role_id', 'assigned_at'], [PARAM('userId'), PARAM('roleId'), PARAM('now')])
277
+ .onConflict('user_id', 'role_id')
278
+ .doUpdate({ assigned_at: PARAM('now') });
279
+ console.log(upsertRole.toSQL());
280
+ // INSERT INTO user_roles (user_id, role_id, assigned_at) VALUES (?, ?, ?)
281
+ // ON CONFLICT (user_id, role_id) DO UPDATE SET assigned_at = ?
282
+
283
+ // With WHERE clause on conflict (conditional upsert)
284
+ const conditionalUpsert = INSERT('users', ['id', 'name'], [PARAM('id'), PARAM('name')])
285
+ .onConflict('id')
286
+ .onConflictWhere(EQ(COLUMN('active'), true))
287
+ .doUpdate({ name: PARAM('name') });
288
+ console.log(conditionalUpsert.toSQL());
289
+ // INSERT INTO users (id, name) VALUES (?, ?)
290
+ // ON CONFLICT (id) WHERE (active = 1) DO UPDATE SET name = ?
291
+
292
+ // With RETURNING clause
293
+ const upsertWithReturn = INSERT('counters', ['counter_key', 'value'], [PARAM('key'), PARAM('value')])
294
+ .onConflict('counter_key')
295
+ .doUpdate({ value: PARAM('value') })
296
+ .returning(COLUMN('counter_key'), COLUMN('value'));
297
+ console.log(upsertWithReturn.toSQL());
298
+ // INSERT INTO counters (counter_key, value) VALUES (?, ?)
299
+ // ON CONFLICT (counter_key) DO UPDATE SET value = ?
300
+ // RETURNING counter_key, value
301
+ ```
302
+
303
+ ### DROP TABLE and DROP INDEX
304
+
305
+ Remove tables and indexes from the database:
306
+
307
+ ```typescript
308
+ import { DROP_TABLE, DROP_INDEX } from '@shaxpir/squilt';
309
+
310
+ // Simple DROP TABLE
311
+ const dropUsers = DROP_TABLE('users');
312
+ console.log(dropUsers.toSQL());
313
+ // DROP TABLE users
314
+
315
+ // DROP TABLE IF EXISTS
316
+ const dropCache = DROP_TABLE('cache').ifExists();
317
+ console.log(dropCache.toSQL());
318
+ // DROP TABLE IF EXISTS cache
319
+
320
+ // Simple DROP INDEX
321
+ const dropIndex = DROP_INDEX('idx_users_email');
322
+ console.log(dropIndex.toSQL());
323
+ // DROP INDEX idx_users_email
324
+
325
+ // DROP INDEX IF EXISTS
326
+ const dropOldIndex = DROP_INDEX('idx_old').ifExists();
327
+ console.log(dropOldIndex.toSQL());
328
+ // DROP INDEX IF EXISTS idx_old
329
+ ```
330
+
331
+ ### Range Queries with BETWEEN
332
+
333
+ Use BETWEEN for range comparisons:
334
+
335
+ ```typescript
336
+ import { SELECT, FROM, COLUMN, BETWEEN, NOT_BETWEEN, PARAM, AND } from '@shaxpir/squilt';
337
+
338
+ // Price range query
339
+ const priceFilter = SELECT(FROM('products'), COLUMN('*'))
340
+ .where(BETWEEN(COLUMN('price'), 10, 100));
341
+ console.log(priceFilter.toSQL());
342
+ // SELECT * FROM products WHERE (price BETWEEN 10 AND 100)
343
+
344
+ // Date range with parameters
345
+ const dateFilter = SELECT(FROM('orders'), COLUMN('*'))
346
+ .where(BETWEEN(COLUMN('created_at'), PARAM('startDate'), PARAM('endDate')));
347
+ console.log(dateFilter.toSQL());
348
+ // SELECT * FROM orders WHERE (created_at BETWEEN ? AND ?)
349
+
350
+ // Exclude a range with NOT BETWEEN
351
+ const excludeRange = SELECT(FROM('employees'), COLUMN('*'))
352
+ .where(NOT_BETWEEN(COLUMN('salary'), 50000, 100000));
353
+ console.log(excludeRange.toSQL());
354
+ // SELECT * FROM employees WHERE (salary NOT BETWEEN 50000 AND 100000)
355
+ ```
356
+
76
357
  ### Parameterized Queries
77
358
 
78
359
  Use named parameters for safe value binding:
@@ -109,14 +390,21 @@ const params = query.accept(new ParamCollectingVisitor({ userId: 42 }));
109
390
  | `SELECT_DISTINCT(...args)` | Create a SELECT DISTINCT query |
110
391
  | `FROM(table)` | Create a FROM clause |
111
392
  | `COLUMN(name)` or `COLUMN(table, name)` | Reference a column |
393
+ | `ALIAS(expr, name)` | Create an aliased expression |
112
394
  | `EQ`, `NOT_EQ`, `GT`, `LT`, `GTE`, `LTE` | Comparison operators |
395
+ | `BETWEEN`, `NOT_BETWEEN` | Range operators |
113
396
  | `AND`, `OR`, `NOT` | Logical operators |
114
397
  | `LIKE`, `IN`, `NOT_IN` | Pattern matching |
115
398
  | `JOIN`, `LEFT_JOIN`, `CROSS_JOIN` | Join clauses |
116
399
  | `FN(name, ...args)` | Function calls |
117
400
  | `CASE([...cases])` | CASE expressions |
118
401
  | `WITH(name, query)` | Common Table Expressions |
119
- | `INSERT`, `INSERT_OR_REPLACE` | Insert statements |
402
+ | `UNION`, `INTERSECT`, `EXCEPT` | Set operations |
403
+ | `INSERT`, `INSERT_INTO`, `INSERT_OR_REPLACE` | Insert statements |
404
+ | `UPDATE(table)` | Update statements |
405
+ | `DELETE_FROM(table)` | Delete statements |
406
+ | `DROP_TABLE(table)` | Drop table statements |
407
+ | `DROP_INDEX(index)` | Drop index statements |
120
408
 
121
409
  ### Renderers
122
410
 
@@ -0,0 +1,32 @@
1
+ import { QueryRenderer } from "../renderer/QueryRenderer";
2
+ import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
3
+ import { SqlTreeNode } from "./Abstractions";
4
+ import { ColumnType, ColumnConstraints, ColumnDefinition } from "./CreateTableQuery";
5
+ export type AlterTableOperation = {
6
+ type: 'ADD_COLUMN';
7
+ column: ColumnDefinition;
8
+ } | {
9
+ type: 'RENAME_COLUMN';
10
+ oldName: string;
11
+ newName: string;
12
+ } | {
13
+ type: 'DROP_COLUMN';
14
+ columnName: string;
15
+ } | {
16
+ type: 'RENAME_TABLE';
17
+ newTableName: string;
18
+ };
19
+ export declare class AlterTableQuery implements SqlTreeNode {
20
+ private _tableName;
21
+ private _operation;
22
+ constructor(tableName: string);
23
+ static create(tableName: string): AlterTableQuery;
24
+ addColumn(name: string, type: ColumnType, constraints?: ColumnConstraints): AlterTableQuery;
25
+ renameColumn(oldName: string, newName: string): AlterTableQuery;
26
+ dropColumn(columnName: string): AlterTableQuery;
27
+ renameTo(newTableName: string): AlterTableQuery;
28
+ get tableName(): string;
29
+ get operation(): AlterTableOperation | null;
30
+ toSQL(renderer?: QueryRenderer): string;
31
+ accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
32
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlterTableQuery = void 0;
4
+ const IndentedQueryRenderer_1 = require("../renderer/IndentedQueryRenderer");
5
+ // Represents an ALTER TABLE statement
6
+ class AlterTableQuery {
7
+ constructor(tableName) {
8
+ this._operation = null;
9
+ this._tableName = tableName;
10
+ }
11
+ static create(tableName) {
12
+ return new AlterTableQuery(tableName);
13
+ }
14
+ addColumn(name, type, constraints = {}) {
15
+ this._operation = {
16
+ type: 'ADD_COLUMN',
17
+ column: { name, type, constraints }
18
+ };
19
+ return this;
20
+ }
21
+ renameColumn(oldName, newName) {
22
+ this._operation = {
23
+ type: 'RENAME_COLUMN',
24
+ oldName,
25
+ newName
26
+ };
27
+ return this;
28
+ }
29
+ dropColumn(columnName) {
30
+ this._operation = {
31
+ type: 'DROP_COLUMN',
32
+ columnName
33
+ };
34
+ return this;
35
+ }
36
+ renameTo(newTableName) {
37
+ this._operation = {
38
+ type: 'RENAME_TABLE',
39
+ newTableName
40
+ };
41
+ return this;
42
+ }
43
+ get tableName() {
44
+ return this._tableName;
45
+ }
46
+ get operation() {
47
+ return this._operation;
48
+ }
49
+ toSQL(renderer) {
50
+ if (!renderer) {
51
+ renderer = new IndentedQueryRenderer_1.IndentedQueryRenderer(2);
52
+ }
53
+ return this.accept(renderer);
54
+ }
55
+ accept(visitor) {
56
+ return visitor.visitAlterTableQuery(this);
57
+ }
58
+ }
59
+ exports.AlterTableQuery = AlterTableQuery;
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWx0ZXJUYWJsZVF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FzdC9BbHRlclRhYmxlUXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTBFO0FBYTFFLHNDQUFzQztBQUN0QyxNQUFhLGVBQWU7SUFLMUIsWUFBWSxTQUFpQjtRQUZyQixlQUFVLEdBQStCLElBQUksQ0FBQztRQUdwRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFpQjtRQUNwQyxPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxTQUFTLENBQUMsSUFBWSxFQUFFLElBQWdCLEVBQUUsY0FBaUMsRUFBRTtRQUNsRixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLElBQUksRUFBRSxZQUFZO1lBQ2xCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixJQUFJLEVBQUUsZUFBZTtZQUNyQixPQUFPO1lBQ1AsT0FBTztTQUNSLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxVQUFVLENBQUMsVUFBa0I7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixJQUFJLEVBQUUsYUFBYTtZQUNuQixVQUFVO1NBQ1gsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLFFBQVEsQ0FBQyxZQUFvQjtRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLElBQUksRUFBRSxjQUFjO1lBQ3BCLFlBQVk7U0FDYixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQXdCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLFFBQVEsR0FBRyxJQUFJLDZDQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUE4QjtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFoRUQsMENBZ0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5kZW50ZWRRdWVyeVJlbmRlcmVyIH0gZnJvbSBcIi4uL3JlbmRlcmVyL0luZGVudGVkUXVlcnlSZW5kZXJlclwiO1xuaW1wb3J0IHsgUXVlcnlSZW5kZXJlciB9IGZyb20gXCIuLi9yZW5kZXJlci9RdWVyeVJlbmRlcmVyXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IFNxbFRyZWVOb2RlIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBDb2x1bW5Db25zdHJhaW50cywgQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gXCIuL0NyZWF0ZVRhYmxlUXVlcnlcIjtcblxuLy8gVHlwZXMgb2YgQUxURVIgVEFCTEUgb3BlcmF0aW9uc1xuZXhwb3J0IHR5cGUgQWx0ZXJUYWJsZU9wZXJhdGlvbiA9XG4gIHwgeyB0eXBlOiAnQUREX0NPTFVNTic7IGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbiB9XG4gIHwgeyB0eXBlOiAnUkVOQU1FX0NPTFVNTic7IG9sZE5hbWU6IHN0cmluZzsgbmV3TmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdEUk9QX0NPTFVNTic7IGNvbHVtbk5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnUkVOQU1FX1RBQkxFJzsgbmV3VGFibGVOYW1lOiBzdHJpbmcgfTtcblxuLy8gUmVwcmVzZW50cyBhbiBBTFRFUiBUQUJMRSBzdGF0ZW1lbnRcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlUXVlcnkgaW1wbGVtZW50cyBTcWxUcmVlTm9kZSB7XG5cbiAgcHJpdmF0ZSBfdGFibGVOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX29wZXJhdGlvbjogQWx0ZXJUYWJsZU9wZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFibGVOYW1lID0gdGFibGVOYW1lO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUodGFibGVOYW1lOiBzdHJpbmcpOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZVF1ZXJ5KHRhYmxlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdHlwZTogQ29sdW1uVHlwZSwgY29uc3RyYWludHM6IENvbHVtbkNvbnN0cmFpbnRzID0ge30pOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHRoaXMuX29wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdBRERfQ09MVU1OJyxcbiAgICAgIGNvbHVtbjogeyBuYW1lLCB0eXBlLCBjb25zdHJhaW50cyB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb2x1bW4ob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiBBbHRlclRhYmxlUXVlcnkge1xuICAgIHRoaXMuX29wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdSRU5BTUVfQ09MVU1OJyxcbiAgICAgIG9sZE5hbWUsXG4gICAgICBuZXdOYW1lXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBkcm9wQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyk6IEFsdGVyVGFibGVRdWVyeSB7XG4gICAgdGhpcy5fb3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ0RST1BfQ09MVU1OJyxcbiAgICAgIGNvbHVtbk5hbWVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZVRvKG5ld1RhYmxlTmFtZTogc3RyaW5nKTogQWx0ZXJUYWJsZVF1ZXJ5IHtcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAnUkVOQU1FX1RBQkxFJyxcbiAgICAgIG5ld1RhYmxlTmFtZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpOiBBbHRlclRhYmxlT3BlcmF0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0b1NRTChyZW5kZXJlcj86IFF1ZXJ5UmVuZGVyZXIpOiBzdHJpbmcge1xuICAgIGlmICghcmVuZGVyZXIpIHtcbiAgICAgIHJlbmRlcmVyID0gbmV3IEluZGVudGVkUXVlcnlSZW5kZXJlcigyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWNjZXB0KHJlbmRlcmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8VD4odmlzaXRvcjogU3FsVHJlZU5vZGVWaXNpdG9yPFQ+KTogVCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbHRlclRhYmxlUXVlcnkodGhpcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { AliasableExpression, Expression } from "./Abstractions";
2
+ import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
3
+ export declare class BetweenExpression extends AliasableExpression {
4
+ readonly operand: Expression;
5
+ readonly low: Expression;
6
+ readonly high: Expression;
7
+ readonly not: boolean;
8
+ constructor(operand: Expression, low: Expression, high: Expression, not?: boolean);
9
+ accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
10
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BetweenExpression = void 0;
4
+ const Abstractions_1 = require("./Abstractions");
5
+ class BetweenExpression extends Abstractions_1.AliasableExpression {
6
+ constructor(operand, low, high, not = false) {
7
+ super();
8
+ this.operand = operand;
9
+ this.low = low;
10
+ this.high = high;
11
+ this.not = not;
12
+ }
13
+ accept(visitor) {
14
+ return visitor.visitBetweenExpression(this);
15
+ }
16
+ }
17
+ exports.BetweenExpression = BetweenExpression;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmV0d2VlbkV4cHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L0JldHdlZW5FeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRTtBQUdqRSxNQUFhLGlCQUFrQixTQUFRLGtDQUFtQjtJQU14RCxZQUFZLE9BQW1CLEVBQUUsR0FBZSxFQUFFLElBQWdCLEVBQUUsTUFBZSxLQUFLO1FBQ3RGLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFJLE9BQThCO1FBQzdDLE9BQU8sT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQWpCRCw4Q0FpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGlhc2FibGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuZXhwb3J0IGNsYXNzIEJldHdlZW5FeHByZXNzaW9uIGV4dGVuZHMgQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyByZWFkb25seSBvcGVyYW5kOiBFeHByZXNzaW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgbG93OiBFeHByZXNzaW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgaGlnaDogRXhwcmVzc2lvbjtcbiAgcHVibGljIHJlYWRvbmx5IG5vdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcGVyYW5kOiBFeHByZXNzaW9uLCBsb3c6IEV4cHJlc3Npb24sIGhpZ2g6IEV4cHJlc3Npb24sIG5vdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm9wZXJhbmQgPSBvcGVyYW5kO1xuICAgIHRoaXMubG93ID0gbG93O1xuICAgIHRoaXMuaGlnaCA9IGhpZ2g7XG4gICAgdGhpcy5ub3QgPSBub3Q7XG4gIH1cblxuICBwdWJsaWMgYWNjZXB0PFQ+KHZpc2l0b3I6IFNxbFRyZWVOb2RlVmlzaXRvcjxUPik6IFQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmV0d2VlbkV4cHJlc3Npb24odGhpcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { AliasableExpression, Expression } from "./Abstractions";
2
+ import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
3
+ /**
4
+ * Represents a CAST expression: CAST(expression AS type)
5
+ */
6
+ export declare class CastExpression extends AliasableExpression {
7
+ private _expression;
8
+ private _targetType;
9
+ constructor(expression: Expression, targetType: string);
10
+ get expression(): Expression;
11
+ get targetType(): string;
12
+ accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
13
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CastExpression = void 0;
4
+ const Abstractions_1 = require("./Abstractions");
5
+ /**
6
+ * Represents a CAST expression: CAST(expression AS type)
7
+ */
8
+ class CastExpression extends Abstractions_1.AliasableExpression {
9
+ constructor(expression, targetType) {
10
+ super();
11
+ this._expression = expression;
12
+ this._targetType = targetType;
13
+ }
14
+ get expression() {
15
+ return this._expression;
16
+ }
17
+ get targetType() {
18
+ return this._targetType;
19
+ }
20
+ accept(visitor) {
21
+ return visitor.visitCastExpression(this);
22
+ }
23
+ }
24
+ exports.CastExpression = CastExpression;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdEV4cHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L0Nhc3RFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRTtBQUdqRTs7R0FFRztBQUNILE1BQWEsY0FBZSxTQUFRLGtDQUFtQjtJQUlyRCxZQUFZLFVBQXNCLEVBQUUsVUFBa0I7UUFDcEQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0sTUFBTSxDQUFJLE9BQThCO1FBQzdDLE9BQU8sT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQXJCRCx3Q0FxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbGlhc2FibGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgQ0FTVCBleHByZXNzaW9uOiBDQVNUKGV4cHJlc3Npb24gQVMgdHlwZSlcbiAqL1xuZXhwb3J0IGNsYXNzIENhc3RFeHByZXNzaW9uIGV4dGVuZHMgQWxpYXNhYmxlRXhwcmVzc2lvbiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IEV4cHJlc3Npb247XG4gIHByaXZhdGUgX3RhcmdldFR5cGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBFeHByZXNzaW9uLCB0YXJnZXRUeXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHRoaXMuX3RhcmdldFR5cGUgPSB0YXJnZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLl9leHByZXNzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCB0YXJnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWNjZXB0PFQ+KHZpc2l0b3I6IFNxbFRyZWVOb2RlVmlzaXRvcjxUPik6IFQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2FzdEV4cHJlc3Npb24odGhpcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { AliasableExpression, Expression } from "./Abstractions";
2
+ import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
3
+ /**
4
+ * Represents a COLLATE expression: expression COLLATE collation_name
5
+ *
6
+ * SQLite built-in collations:
7
+ * - BINARY: Compares using memcmp()
8
+ * - NOCASE: Case-insensitive ASCII comparison
9
+ * - RTRIM: Like BINARY but ignores trailing spaces
10
+ */
11
+ export declare class CollateExpression extends AliasableExpression {
12
+ private _expression;
13
+ private _collation;
14
+ constructor(expression: Expression, collation: string);
15
+ get expression(): Expression;
16
+ get collation(): string;
17
+ accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
18
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollateExpression = void 0;
4
+ const Abstractions_1 = require("./Abstractions");
5
+ /**
6
+ * Represents a COLLATE expression: expression COLLATE collation_name
7
+ *
8
+ * SQLite built-in collations:
9
+ * - BINARY: Compares using memcmp()
10
+ * - NOCASE: Case-insensitive ASCII comparison
11
+ * - RTRIM: Like BINARY but ignores trailing spaces
12
+ */
13
+ class CollateExpression extends Abstractions_1.AliasableExpression {
14
+ constructor(expression, collation) {
15
+ super();
16
+ this._expression = expression;
17
+ this._collation = collation;
18
+ }
19
+ get expression() {
20
+ return this._expression;
21
+ }
22
+ get collation() {
23
+ return this._collation;
24
+ }
25
+ accept(visitor) {
26
+ return visitor.visitCollateExpression(this);
27
+ }
28
+ }
29
+ exports.CollateExpression = CollateExpression;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGF0ZUV4cHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXN0L0NvbGxhdGVFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRTtBQUdqRTs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxrQ0FBbUI7SUFJeEQsWUFBWSxVQUFzQixFQUFFLFNBQWlCO1FBQ25ELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUE4QjtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFyQkQsOENBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxpYXNhYmxlRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiB9IGZyb20gXCIuL0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgU3FsVHJlZU5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL3Zpc2l0b3IvU3FsVHJlZU5vZGVWaXNpdG9yXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIENPTExBVEUgZXhwcmVzc2lvbjogZXhwcmVzc2lvbiBDT0xMQVRFIGNvbGxhdGlvbl9uYW1lXG4gKlxuICogU1FMaXRlIGJ1aWx0LWluIGNvbGxhdGlvbnM6XG4gKiAtIEJJTkFSWTogQ29tcGFyZXMgdXNpbmcgbWVtY21wKClcbiAqIC0gTk9DQVNFOiBDYXNlLWluc2Vuc2l0aXZlIEFTQ0lJIGNvbXBhcmlzb25cbiAqIC0gUlRSSU06IExpa2UgQklOQVJZIGJ1dCBpZ25vcmVzIHRyYWlsaW5nIHNwYWNlc1xuICovXG5leHBvcnQgY2xhc3MgQ29sbGF0ZUV4cHJlc3Npb24gZXh0ZW5kcyBBbGlhc2FibGVFeHByZXNzaW9uIHtcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcbiAgcHJpdmF0ZSBfY29sbGF0aW9uOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgY29sbGF0aW9uOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHRoaXMuX2NvbGxhdGlvbiA9IGNvbGxhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sbGF0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8VD4odmlzaXRvcjogU3FsVHJlZU5vZGVWaXNpdG9yPFQ+KTogVCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb2xsYXRlRXhwcmVzc2lvbih0aGlzKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,25 @@
1
+ import { QueryRenderer } from "../renderer/QueryRenderer";
2
+ import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
3
+ import { Expression, SqlTreeNode } from "./Abstractions";
4
+ export declare class CreateIndexQuery implements SqlTreeNode {
5
+ private _indexName;
6
+ private _tableName;
7
+ private _columns;
8
+ private _unique;
9
+ private _ifNotExists;
10
+ private _where;
11
+ constructor(indexName: string);
12
+ static create(indexName: string): CreateIndexQuery;
13
+ on(tableName: string, columns: string | string[]): CreateIndexQuery;
14
+ unique(): CreateIndexQuery;
15
+ ifNotExists(): CreateIndexQuery;
16
+ where(expression: Expression): CreateIndexQuery;
17
+ get indexName(): string;
18
+ get tableName(): string;
19
+ get columns(): string[];
20
+ get isUnique(): boolean;
21
+ get hasIfNotExists(): boolean;
22
+ get whereExpression(): Expression | null;
23
+ toSQL(renderer?: QueryRenderer): string;
24
+ accept<T>(visitor: SqlTreeNodeVisitor<T>): T;
25
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateIndexQuery = void 0;
4
+ const IndentedQueryRenderer_1 = require("../renderer/IndentedQueryRenderer");
5
+ // Represents a CREATE INDEX statement
6
+ class CreateIndexQuery {
7
+ constructor(indexName) {
8
+ this._tableName = '';
9
+ this._columns = [];
10
+ this._unique = false;
11
+ this._ifNotExists = false;
12
+ this._where = null;
13
+ this._indexName = indexName;
14
+ }
15
+ static create(indexName) {
16
+ return new CreateIndexQuery(indexName);
17
+ }
18
+ on(tableName, columns) {
19
+ this._tableName = tableName;
20
+ this._columns = Array.isArray(columns) ? columns : [columns];
21
+ return this;
22
+ }
23
+ unique() {
24
+ this._unique = true;
25
+ return this;
26
+ }
27
+ ifNotExists() {
28
+ this._ifNotExists = true;
29
+ return this;
30
+ }
31
+ where(expression) {
32
+ this._where = expression;
33
+ return this;
34
+ }
35
+ get indexName() {
36
+ return this._indexName;
37
+ }
38
+ get tableName() {
39
+ return this._tableName;
40
+ }
41
+ get columns() {
42
+ return this._columns;
43
+ }
44
+ get isUnique() {
45
+ return this._unique;
46
+ }
47
+ get hasIfNotExists() {
48
+ return this._ifNotExists;
49
+ }
50
+ get whereExpression() {
51
+ return this._where;
52
+ }
53
+ toSQL(renderer) {
54
+ if (!renderer) {
55
+ renderer = new IndentedQueryRenderer_1.IndentedQueryRenderer(2);
56
+ }
57
+ return this.accept(renderer);
58
+ }
59
+ accept(visitor) {
60
+ return visitor.visitCreateIndexQuery(this);
61
+ }
62
+ }
63
+ exports.CreateIndexQuery = CreateIndexQuery;
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlYXRlSW5kZXhRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3QvQ3JlYXRlSW5kZXhRdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2RUFBMEU7QUFLMUUsc0NBQXNDO0FBQ3RDLE1BQWEsZ0JBQWdCO0lBUzNCLFlBQVksU0FBaUI7UUFOckIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsV0FBTSxHQUFzQixJQUFJLENBQUM7UUFHdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBaUI7UUFDcEMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUEwQjtRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBc0I7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQXdCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLFFBQVEsR0FBRyxJQUFJLDZDQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUE4QjtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUF4RUQsNENBd0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5kZW50ZWRRdWVyeVJlbmRlcmVyIH0gZnJvbSBcIi4uL3JlbmRlcmVyL0luZGVudGVkUXVlcnlSZW5kZXJlclwiO1xuaW1wb3J0IHsgUXVlcnlSZW5kZXJlciB9IGZyb20gXCIuLi9yZW5kZXJlci9RdWVyeVJlbmRlcmVyXCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IEV4cHJlc3Npb24sIFNxbFRyZWVOb2RlIH0gZnJvbSBcIi4vQWJzdHJhY3Rpb25zXCI7XG5cbi8vIFJlcHJlc2VudHMgYSBDUkVBVEUgSU5ERVggc3RhdGVtZW50XG5leHBvcnQgY2xhc3MgQ3JlYXRlSW5kZXhRdWVyeSBpbXBsZW1lbnRzIFNxbFRyZWVOb2RlIHtcblxuICBwcml2YXRlIF9pbmRleE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVOYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfY29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfdW5pcXVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lmTm90RXhpc3RzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3doZXJlOiBFeHByZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoaW5kZXhOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbmRleE5hbWUgPSBpbmRleE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShpbmRleE5hbWU6IHN0cmluZyk6IENyZWF0ZUluZGV4UXVlcnkge1xuICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhRdWVyeShpbmRleE5hbWUpO1xuICB9XG5cbiAgcHVibGljIG9uKHRhYmxlTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IENyZWF0ZUluZGV4UXVlcnkge1xuICAgIHRoaXMuX3RhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgICB0aGlzLl9jb2x1bW5zID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSA/IGNvbHVtbnMgOiBbY29sdW1uc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgdW5pcXVlKCk6IENyZWF0ZUluZGV4UXVlcnkge1xuICAgIHRoaXMuX3VuaXF1ZSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgaWZOb3RFeGlzdHMoKTogQ3JlYXRlSW5kZXhRdWVyeSB7XG4gICAgdGhpcy5faWZOb3RFeGlzdHMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHdoZXJlKGV4cHJlc3Npb246IEV4cHJlc3Npb24pOiBDcmVhdGVJbmRleFF1ZXJ5IHtcbiAgICB0aGlzLl93aGVyZSA9IGV4cHJlc3Npb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbmRleE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1VuaXF1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdW5pcXVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNJZk5vdEV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faWZOb3RFeGlzdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdoZXJlRXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3doZXJlO1xuICB9XG5cbiAgcHVibGljIHRvU1FMKHJlbmRlcmVyPzogUXVlcnlSZW5kZXJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFyZW5kZXJlcikge1xuICAgICAgcmVuZGVyZXIgPSBuZXcgSW5kZW50ZWRRdWVyeVJlbmRlcmVyKDIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hY2NlcHQocmVuZGVyZXIpO1xuICB9XG5cbiAgcHVibGljIGFjY2VwdDxUPih2aXNpdG9yOiBTcWxUcmVlTm9kZVZpc2l0b3I8VD4pOiBUIHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdENyZWF0ZUluZGV4UXVlcnkodGhpcyk7XG4gIH1cbn1cbiJdfQ==