@sqlrooms/sql-editor 0.6.0 → 0.8.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/README.md +409 -0
- package/dist/CreateTableModal.d.ts.map +1 -1
- package/dist/CreateTableModal.js +10 -4
- package/dist/CreateTableModal.js.map +1 -1
- package/dist/SqlEditor.d.ts +1 -14
- package/dist/SqlEditor.d.ts.map +1 -1
- package/dist/SqlEditor.js +111 -183
- package/dist/SqlEditor.js.map +1 -1
- package/dist/SqlEditorModal.d.ts.map +1 -1
- package/dist/SqlEditorModal.js +8 -4
- package/dist/SqlEditorModal.js.map +1 -1
- package/dist/SqlEditorSlice.d.ts +102 -5
- package/dist/SqlEditorSlice.d.ts.map +1 -1
- package/dist/SqlEditorSlice.js +107 -30
- package/dist/SqlEditorSlice.js.map +1 -1
- package/dist/SqlMonacoEditor.d.ts +30 -0
- package/dist/SqlMonacoEditor.d.ts.map +1 -0
- package/dist/SqlMonacoEditor.js +205 -0
- package/dist/SqlMonacoEditor.js.map +1 -0
- package/dist/SqlQueryDataSourcesPanel.js +2 -3
- package/dist/SqlQueryDataSourcesPanel.js.map +1 -1
- package/dist/components/internal/SqlMonacoEditor.d.ts +36 -0
- package/dist/components/internal/SqlMonacoEditor.d.ts.map +1 -0
- package/dist/components/internal/SqlMonacoEditor.js +219 -0
- package/dist/components/internal/SqlMonacoEditor.js.map +1 -0
- package/dist/constants/duckdb-dialect.d.ts +73 -0
- package/dist/constants/duckdb-dialect.d.ts.map +1 -0
- package/dist/constants/duckdb-dialect.js +392 -0
- package/dist/constants/duckdb-dialect.js.map +1 -0
- package/dist/constants/duckdb.d.ts +73 -0
- package/dist/constants/duckdb.d.ts.map +1 -0
- package/dist/constants/duckdb.js +392 -0
- package/dist/constants/duckdb.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useMonacoEditor.d.ts +13 -0
- package/dist/hooks/useMonacoEditor.d.ts.map +1 -0
- package/dist/hooks/useMonacoEditor.js +78 -0
- package/dist/hooks/useMonacoEditor.js.map +1 -0
- package/dist/hooks/useQueryExecution.d.ts +17 -0
- package/dist/hooks/useQueryExecution.d.ts.map +1 -0
- package/dist/hooks/useQueryExecution.js +61 -0
- package/dist/hooks/useQueryExecution.js.map +1 -0
- package/dist/hooks/useQueryTabManagement.d.ts +41 -0
- package/dist/hooks/useQueryTabManagement.d.ts.map +1 -0
- package/dist/hooks/useQueryTabManagement.js +95 -0
- package/dist/hooks/useQueryTabManagement.js.map +1 -0
- package/dist/hooks/useTableManagement.d.ts +14 -0
- package/dist/hooks/useTableManagement.d.ts.map +1 -0
- package/dist/hooks/useTableManagement.js +46 -0
- package/dist/hooks/useTableManagement.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/package.json +12 -9
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DuckDB SQL language constants for Monaco Editor
|
|
3
|
+
*/
|
|
4
|
+
// DuckDB specific keywords
|
|
5
|
+
export const DUCKDB_KEYWORDS = [
|
|
6
|
+
'PRAGMA',
|
|
7
|
+
'RETURNING',
|
|
8
|
+
'QUALIFY',
|
|
9
|
+
'PIVOT',
|
|
10
|
+
'UNPIVOT',
|
|
11
|
+
'EXCLUDE',
|
|
12
|
+
'INCLUDE',
|
|
13
|
+
'WINDOW',
|
|
14
|
+
'FILTER',
|
|
15
|
+
'WITHIN',
|
|
16
|
+
'OVER',
|
|
17
|
+
'PARTITION',
|
|
18
|
+
'RANGE',
|
|
19
|
+
'ROWS',
|
|
20
|
+
'GROUPS',
|
|
21
|
+
'PRECEDING',
|
|
22
|
+
'FOLLOWING',
|
|
23
|
+
'CURRENT',
|
|
24
|
+
'ROW',
|
|
25
|
+
'TIES',
|
|
26
|
+
'OTHERS',
|
|
27
|
+
'EXCLUDE',
|
|
28
|
+
'RESPECT',
|
|
29
|
+
'NULLS',
|
|
30
|
+
'FIRST',
|
|
31
|
+
'LAST',
|
|
32
|
+
'MATERIALIZED',
|
|
33
|
+
'RECURSIVE',
|
|
34
|
+
'TEMPORARY',
|
|
35
|
+
'TEMP',
|
|
36
|
+
'UNLOGGED',
|
|
37
|
+
'GLOBAL',
|
|
38
|
+
'LOCAL',
|
|
39
|
+
'STORED',
|
|
40
|
+
'VIRTUAL',
|
|
41
|
+
'DELIMITED',
|
|
42
|
+
'CSV',
|
|
43
|
+
'JSON',
|
|
44
|
+
'COPY',
|
|
45
|
+
'DESCRIBE',
|
|
46
|
+
'EXPLAIN',
|
|
47
|
+
'SUMMARIZE',
|
|
48
|
+
'PROFILE',
|
|
49
|
+
'LOAD',
|
|
50
|
+
'INSTALL',
|
|
51
|
+
'FORCE',
|
|
52
|
+
'PARALLEL',
|
|
53
|
+
'SEQUENTIAL',
|
|
54
|
+
'PRAGMA',
|
|
55
|
+
// Standard SQL keywords
|
|
56
|
+
'SELECT',
|
|
57
|
+
'FROM',
|
|
58
|
+
'WHERE',
|
|
59
|
+
'GROUP',
|
|
60
|
+
'BY',
|
|
61
|
+
'HAVING',
|
|
62
|
+
'ORDER',
|
|
63
|
+
'LIMIT',
|
|
64
|
+
'OFFSET',
|
|
65
|
+
'INSERT',
|
|
66
|
+
'INTO',
|
|
67
|
+
'VALUES',
|
|
68
|
+
'UPDATE',
|
|
69
|
+
'SET',
|
|
70
|
+
'DELETE',
|
|
71
|
+
'CREATE',
|
|
72
|
+
'ALTER',
|
|
73
|
+
'DROP',
|
|
74
|
+
'TABLE',
|
|
75
|
+
'VIEW',
|
|
76
|
+
'INDEX',
|
|
77
|
+
'TRIGGER',
|
|
78
|
+
'PROCEDURE',
|
|
79
|
+
'FUNCTION',
|
|
80
|
+
'DATABASE',
|
|
81
|
+
'SCHEMA',
|
|
82
|
+
'JOIN',
|
|
83
|
+
'INNER',
|
|
84
|
+
'LEFT',
|
|
85
|
+
'RIGHT',
|
|
86
|
+
'FULL',
|
|
87
|
+
'OUTER',
|
|
88
|
+
'CROSS',
|
|
89
|
+
'NATURAL',
|
|
90
|
+
'ON',
|
|
91
|
+
'USING',
|
|
92
|
+
'AND',
|
|
93
|
+
'OR',
|
|
94
|
+
'NOT',
|
|
95
|
+
'NULL',
|
|
96
|
+
'IS',
|
|
97
|
+
'IN',
|
|
98
|
+
'BETWEEN',
|
|
99
|
+
'LIKE',
|
|
100
|
+
'AS',
|
|
101
|
+
'CASE',
|
|
102
|
+
'WHEN',
|
|
103
|
+
'THEN',
|
|
104
|
+
'ELSE',
|
|
105
|
+
'END',
|
|
106
|
+
'DISTINCT',
|
|
107
|
+
'ALL',
|
|
108
|
+
'UNION',
|
|
109
|
+
'INTERSECT',
|
|
110
|
+
'EXCEPT',
|
|
111
|
+
'WITH',
|
|
112
|
+
'CAST',
|
|
113
|
+
'PRIMARY',
|
|
114
|
+
'KEY',
|
|
115
|
+
'FOREIGN',
|
|
116
|
+
'REFERENCES',
|
|
117
|
+
'CONSTRAINT',
|
|
118
|
+
'DEFAULT',
|
|
119
|
+
'CHECK',
|
|
120
|
+
'UNIQUE',
|
|
121
|
+
'INDEX',
|
|
122
|
+
'CASCADE',
|
|
123
|
+
'RESTRICT',
|
|
124
|
+
'ASC',
|
|
125
|
+
'DESC',
|
|
126
|
+
'IF',
|
|
127
|
+
'EXISTS',
|
|
128
|
+
'TRUE',
|
|
129
|
+
'FALSE',
|
|
130
|
+
];
|
|
131
|
+
// DuckDB functions
|
|
132
|
+
export const DUCKDB_FUNCTIONS = [
|
|
133
|
+
// Aggregate functions
|
|
134
|
+
'ARRAY_AGG',
|
|
135
|
+
'AVG',
|
|
136
|
+
'BIT_AND',
|
|
137
|
+
'BIT_OR',
|
|
138
|
+
'BIT_XOR',
|
|
139
|
+
'COUNT',
|
|
140
|
+
'FIRST',
|
|
141
|
+
'LAST',
|
|
142
|
+
'LIST',
|
|
143
|
+
'MAX',
|
|
144
|
+
'MIN',
|
|
145
|
+
'STRING_AGG',
|
|
146
|
+
'SUM',
|
|
147
|
+
'MEDIAN',
|
|
148
|
+
'QUANTILE',
|
|
149
|
+
'APPROX_COUNT_DISTINCT',
|
|
150
|
+
'APPROX_QUANTILE',
|
|
151
|
+
// Window functions
|
|
152
|
+
'ROW_NUMBER',
|
|
153
|
+
'RANK',
|
|
154
|
+
'DENSE_RANK',
|
|
155
|
+
'PERCENT_RANK',
|
|
156
|
+
'CUME_DIST',
|
|
157
|
+
'NTILE',
|
|
158
|
+
'LAG',
|
|
159
|
+
'LEAD',
|
|
160
|
+
'FIRST_VALUE',
|
|
161
|
+
'LAST_VALUE',
|
|
162
|
+
'NTH_VALUE',
|
|
163
|
+
// Date functions
|
|
164
|
+
'AGE',
|
|
165
|
+
'DATE_PART',
|
|
166
|
+
'DATE_TRUNC',
|
|
167
|
+
'EXTRACT',
|
|
168
|
+
'GREATEST',
|
|
169
|
+
'LEAST',
|
|
170
|
+
'NOW',
|
|
171
|
+
'CURRENT_DATE',
|
|
172
|
+
'CURRENT_TIME',
|
|
173
|
+
'CURRENT_TIMESTAMP',
|
|
174
|
+
'EPOCH',
|
|
175
|
+
'STRFTIME',
|
|
176
|
+
'STRPTIME',
|
|
177
|
+
'TO_TIMESTAMP',
|
|
178
|
+
// String functions
|
|
179
|
+
'CONCAT',
|
|
180
|
+
'LENGTH',
|
|
181
|
+
'LOWER',
|
|
182
|
+
'LPAD',
|
|
183
|
+
'LTRIM',
|
|
184
|
+
'REGEXP_MATCHES',
|
|
185
|
+
'REGEXP_REPLACE',
|
|
186
|
+
'REPEAT',
|
|
187
|
+
'REPLACE',
|
|
188
|
+
'REVERSE',
|
|
189
|
+
'RIGHT',
|
|
190
|
+
'RPAD',
|
|
191
|
+
'RTRIM',
|
|
192
|
+
'SPLIT',
|
|
193
|
+
'SUBSTRING',
|
|
194
|
+
'TRIM',
|
|
195
|
+
'UPPER',
|
|
196
|
+
// Nested functions
|
|
197
|
+
'LIST_EXTRACT',
|
|
198
|
+
'LIST_ELEMENT',
|
|
199
|
+
'LIST_VALUE',
|
|
200
|
+
'STRUCT_EXTRACT',
|
|
201
|
+
'STRUCT_PACK',
|
|
202
|
+
'MAP',
|
|
203
|
+
'MAP_EXTRACT',
|
|
204
|
+
// Math functions
|
|
205
|
+
'ABS',
|
|
206
|
+
'CEIL',
|
|
207
|
+
'CEILING',
|
|
208
|
+
'FLOOR',
|
|
209
|
+
'ROUND',
|
|
210
|
+
'SIGN',
|
|
211
|
+
'SQRT',
|
|
212
|
+
'CBRT',
|
|
213
|
+
'EXP',
|
|
214
|
+
'LN',
|
|
215
|
+
'LOG',
|
|
216
|
+
'POWER',
|
|
217
|
+
'MOD',
|
|
218
|
+
'RANDOM',
|
|
219
|
+
'SETSEED',
|
|
220
|
+
'ACOS',
|
|
221
|
+
'ASIN',
|
|
222
|
+
'ATAN',
|
|
223
|
+
'ATAN2',
|
|
224
|
+
'COS',
|
|
225
|
+
'COT',
|
|
226
|
+
'SIN',
|
|
227
|
+
'TAN',
|
|
228
|
+
'RADIANS',
|
|
229
|
+
'DEGREES',
|
|
230
|
+
'PI',
|
|
231
|
+
// Other functions
|
|
232
|
+
'COALESCE',
|
|
233
|
+
'NULLIF',
|
|
234
|
+
'TYPEOF',
|
|
235
|
+
'CURRENT_SCHEMA',
|
|
236
|
+
'CURRENT_USER',
|
|
237
|
+
'HASH',
|
|
238
|
+
'UUID',
|
|
239
|
+
'CHAR_LENGTH',
|
|
240
|
+
'CHARACTER_LENGTH',
|
|
241
|
+
'POSITION',
|
|
242
|
+
'OVERLAY',
|
|
243
|
+
'CONCAT_WS',
|
|
244
|
+
'FORMAT',
|
|
245
|
+
'TO_CHAR',
|
|
246
|
+
'TO_DATE',
|
|
247
|
+
'TO_NUMBER',
|
|
248
|
+
'LOCALTIME',
|
|
249
|
+
'LOCALTIMESTAMP',
|
|
250
|
+
'JUSTIFY_DAYS',
|
|
251
|
+
'JUSTIFY_HOURS',
|
|
252
|
+
'JUSTIFY_INTERVAL',
|
|
253
|
+
'MAKE_DATE',
|
|
254
|
+
'MAKE_INTERVAL',
|
|
255
|
+
'MAKE_TIME',
|
|
256
|
+
'MAKE_TIMESTAMP',
|
|
257
|
+
'CLOCK_TIMESTAMP',
|
|
258
|
+
'STATEMENT_TIMESTAMP',
|
|
259
|
+
'TRANSACTION_TIMESTAMP',
|
|
260
|
+
];
|
|
261
|
+
// SQL operators
|
|
262
|
+
export const SQL_OPERATORS = [
|
|
263
|
+
'+',
|
|
264
|
+
'-',
|
|
265
|
+
'*',
|
|
266
|
+
'/',
|
|
267
|
+
'%',
|
|
268
|
+
'&',
|
|
269
|
+
'|',
|
|
270
|
+
'^',
|
|
271
|
+
'=',
|
|
272
|
+
'<>',
|
|
273
|
+
'!=',
|
|
274
|
+
'>',
|
|
275
|
+
'>=',
|
|
276
|
+
'<',
|
|
277
|
+
'<=',
|
|
278
|
+
'<<',
|
|
279
|
+
'>>',
|
|
280
|
+
'||',
|
|
281
|
+
'::',
|
|
282
|
+
'->>',
|
|
283
|
+
'->',
|
|
284
|
+
'~',
|
|
285
|
+
'!',
|
|
286
|
+
'@',
|
|
287
|
+
];
|
|
288
|
+
// SQL variables
|
|
289
|
+
export const SQL_VARIABLES = [
|
|
290
|
+
'$1',
|
|
291
|
+
'$2',
|
|
292
|
+
'$3',
|
|
293
|
+
'$4',
|
|
294
|
+
'$5',
|
|
295
|
+
'$6',
|
|
296
|
+
'$7',
|
|
297
|
+
'$8',
|
|
298
|
+
'$9',
|
|
299
|
+
];
|
|
300
|
+
// SQL pseudo columns
|
|
301
|
+
export const SQL_PSEUDO_COLUMNS = [
|
|
302
|
+
'$ACTION',
|
|
303
|
+
'$IDENTITY',
|
|
304
|
+
'$ROWGUID',
|
|
305
|
+
'$PARTITION',
|
|
306
|
+
];
|
|
307
|
+
// SQL language configuration for Monaco Editor
|
|
308
|
+
export const SQL_LANGUAGE_CONFIGURATION = {
|
|
309
|
+
defaultToken: '',
|
|
310
|
+
tokenPostfix: '.sql',
|
|
311
|
+
ignoreCase: true,
|
|
312
|
+
brackets: [
|
|
313
|
+
{ open: '[', close: ']', token: 'delimiter.square' },
|
|
314
|
+
{ open: '(', close: ')', token: 'delimiter.parenthesis' },
|
|
315
|
+
],
|
|
316
|
+
keywords: DUCKDB_KEYWORDS,
|
|
317
|
+
operators: SQL_OPERATORS,
|
|
318
|
+
builtinFunctions: DUCKDB_FUNCTIONS,
|
|
319
|
+
builtinVariables: SQL_VARIABLES,
|
|
320
|
+
pseudoColumns: SQL_PSEUDO_COLUMNS,
|
|
321
|
+
tokenizer: {
|
|
322
|
+
root: [
|
|
323
|
+
{ include: '@comments' },
|
|
324
|
+
{ include: '@whitespace' },
|
|
325
|
+
{ include: '@numbers' },
|
|
326
|
+
{ include: '@strings' },
|
|
327
|
+
{ include: '@complexIdentifiers' },
|
|
328
|
+
{ include: '@scopes' },
|
|
329
|
+
[/[;,.]/, 'delimiter'],
|
|
330
|
+
[/[()]/, '@brackets'],
|
|
331
|
+
[
|
|
332
|
+
/[\w@#$]+/,
|
|
333
|
+
{
|
|
334
|
+
cases: {
|
|
335
|
+
'@keywords': 'keyword',
|
|
336
|
+
'@operators': 'operator',
|
|
337
|
+
'@builtinFunctions': 'predefined',
|
|
338
|
+
'@builtinVariables': 'predefined',
|
|
339
|
+
'@pseudoColumns': 'predefined',
|
|
340
|
+
'@default': 'identifier',
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
],
|
|
344
|
+
[/[<>=!%&+\-*/|~^]/, 'operator'],
|
|
345
|
+
],
|
|
346
|
+
whitespace: [[/\s+/, 'white']],
|
|
347
|
+
comments: [
|
|
348
|
+
[/--+.*/, 'comment'],
|
|
349
|
+
[/\/\*/, { token: 'comment.quote', next: '@comment' }],
|
|
350
|
+
],
|
|
351
|
+
comment: [
|
|
352
|
+
[/[^*/]+/, 'comment'],
|
|
353
|
+
[/\*\//, { token: 'comment.quote', next: '@pop' }],
|
|
354
|
+
[/./, 'comment'],
|
|
355
|
+
],
|
|
356
|
+
numbers: [
|
|
357
|
+
[/0[xX][0-9a-fA-F]*/, 'number'],
|
|
358
|
+
[/[$][+-]*\d*(\.\d*)?/, 'number'],
|
|
359
|
+
[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/, 'number'],
|
|
360
|
+
],
|
|
361
|
+
strings: [
|
|
362
|
+
[/'/, { token: 'string', next: '@string' }],
|
|
363
|
+
[/"/, { token: 'string.double', next: '@stringDouble' }],
|
|
364
|
+
],
|
|
365
|
+
string: [
|
|
366
|
+
[/[^']+/, 'string'],
|
|
367
|
+
[/''/, 'string'],
|
|
368
|
+
[/'/, { token: 'string', next: '@pop' }],
|
|
369
|
+
],
|
|
370
|
+
stringDouble: [
|
|
371
|
+
[/[^"]+/, 'string.double'],
|
|
372
|
+
[/""/, 'string.double'],
|
|
373
|
+
[/"/, { token: 'string.double', next: '@pop' }],
|
|
374
|
+
],
|
|
375
|
+
complexIdentifiers: [
|
|
376
|
+
[/\[/, { token: 'identifier.quote', next: '@bracketedIdentifier' }],
|
|
377
|
+
[/"/, { token: 'identifier.quote', next: '@quotedIdentifier' }],
|
|
378
|
+
],
|
|
379
|
+
bracketedIdentifier: [
|
|
380
|
+
[/[^\]]+/, 'identifier'],
|
|
381
|
+
[/]]/, 'identifier'],
|
|
382
|
+
[/]/, { token: 'identifier.quote', next: '@pop' }],
|
|
383
|
+
],
|
|
384
|
+
quotedIdentifier: [
|
|
385
|
+
[/[^"]+/, 'identifier'],
|
|
386
|
+
[/""/, 'identifier'],
|
|
387
|
+
[/"/, { token: 'identifier.quote', next: '@pop' }],
|
|
388
|
+
],
|
|
389
|
+
scopes: [],
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
//# sourceMappingURL=duckdb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb.js","sourceRoot":"","sources":["../../src/constants/duckdb.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DuckDB SQL language constants for Monaco Editor\n */\n\n// DuckDB specific keywords\nexport const DUCKDB_KEYWORDS = [\n 'PRAGMA',\n 'RETURNING',\n 'QUALIFY',\n 'PIVOT',\n 'UNPIVOT',\n 'EXCLUDE',\n 'INCLUDE',\n 'WINDOW',\n 'FILTER',\n 'WITHIN',\n 'OVER',\n 'PARTITION',\n 'RANGE',\n 'ROWS',\n 'GROUPS',\n 'PRECEDING',\n 'FOLLOWING',\n 'CURRENT',\n 'ROW',\n 'TIES',\n 'OTHERS',\n 'EXCLUDE',\n 'RESPECT',\n 'NULLS',\n 'FIRST',\n 'LAST',\n 'MATERIALIZED',\n 'RECURSIVE',\n 'TEMPORARY',\n 'TEMP',\n 'UNLOGGED',\n 'GLOBAL',\n 'LOCAL',\n 'STORED',\n 'VIRTUAL',\n 'DELIMITED',\n 'CSV',\n 'JSON',\n 'COPY',\n 'DESCRIBE',\n 'EXPLAIN',\n 'SUMMARIZE',\n 'PROFILE',\n 'LOAD',\n 'INSTALL',\n 'FORCE',\n 'PARALLEL',\n 'SEQUENTIAL',\n 'PRAGMA',\n // Standard SQL keywords\n 'SELECT',\n 'FROM',\n 'WHERE',\n 'GROUP',\n 'BY',\n 'HAVING',\n 'ORDER',\n 'LIMIT',\n 'OFFSET',\n 'INSERT',\n 'INTO',\n 'VALUES',\n 'UPDATE',\n 'SET',\n 'DELETE',\n 'CREATE',\n 'ALTER',\n 'DROP',\n 'TABLE',\n 'VIEW',\n 'INDEX',\n 'TRIGGER',\n 'PROCEDURE',\n 'FUNCTION',\n 'DATABASE',\n 'SCHEMA',\n 'JOIN',\n 'INNER',\n 'LEFT',\n 'RIGHT',\n 'FULL',\n 'OUTER',\n 'CROSS',\n 'NATURAL',\n 'ON',\n 'USING',\n 'AND',\n 'OR',\n 'NOT',\n 'NULL',\n 'IS',\n 'IN',\n 'BETWEEN',\n 'LIKE',\n 'AS',\n 'CASE',\n 'WHEN',\n 'THEN',\n 'ELSE',\n 'END',\n 'DISTINCT',\n 'ALL',\n 'UNION',\n 'INTERSECT',\n 'EXCEPT',\n 'WITH',\n 'CAST',\n 'PRIMARY',\n 'KEY',\n 'FOREIGN',\n 'REFERENCES',\n 'CONSTRAINT',\n 'DEFAULT',\n 'CHECK',\n 'UNIQUE',\n 'INDEX',\n 'CASCADE',\n 'RESTRICT',\n 'ASC',\n 'DESC',\n 'IF',\n 'EXISTS',\n 'TRUE',\n 'FALSE',\n];\n\n// DuckDB functions\nexport const DUCKDB_FUNCTIONS = [\n // Aggregate functions\n 'ARRAY_AGG',\n 'AVG',\n 'BIT_AND',\n 'BIT_OR',\n 'BIT_XOR',\n 'COUNT',\n 'FIRST',\n 'LAST',\n 'LIST',\n 'MAX',\n 'MIN',\n 'STRING_AGG',\n 'SUM',\n 'MEDIAN',\n 'QUANTILE',\n 'APPROX_COUNT_DISTINCT',\n 'APPROX_QUANTILE',\n // Window functions\n 'ROW_NUMBER',\n 'RANK',\n 'DENSE_RANK',\n 'PERCENT_RANK',\n 'CUME_DIST',\n 'NTILE',\n 'LAG',\n 'LEAD',\n 'FIRST_VALUE',\n 'LAST_VALUE',\n 'NTH_VALUE',\n // Date functions\n 'AGE',\n 'DATE_PART',\n 'DATE_TRUNC',\n 'EXTRACT',\n 'GREATEST',\n 'LEAST',\n 'NOW',\n 'CURRENT_DATE',\n 'CURRENT_TIME',\n 'CURRENT_TIMESTAMP',\n 'EPOCH',\n 'STRFTIME',\n 'STRPTIME',\n 'TO_TIMESTAMP',\n // String functions\n 'CONCAT',\n 'LENGTH',\n 'LOWER',\n 'LPAD',\n 'LTRIM',\n 'REGEXP_MATCHES',\n 'REGEXP_REPLACE',\n 'REPEAT',\n 'REPLACE',\n 'REVERSE',\n 'RIGHT',\n 'RPAD',\n 'RTRIM',\n 'SPLIT',\n 'SUBSTRING',\n 'TRIM',\n 'UPPER',\n // Nested functions\n 'LIST_EXTRACT',\n 'LIST_ELEMENT',\n 'LIST_VALUE',\n 'STRUCT_EXTRACT',\n 'STRUCT_PACK',\n 'MAP',\n 'MAP_EXTRACT',\n // Math functions\n 'ABS',\n 'CEIL',\n 'CEILING',\n 'FLOOR',\n 'ROUND',\n 'SIGN',\n 'SQRT',\n 'CBRT',\n 'EXP',\n 'LN',\n 'LOG',\n 'POWER',\n 'MOD',\n 'RANDOM',\n 'SETSEED',\n 'ACOS',\n 'ASIN',\n 'ATAN',\n 'ATAN2',\n 'COS',\n 'COT',\n 'SIN',\n 'TAN',\n 'RADIANS',\n 'DEGREES',\n 'PI',\n // Other functions\n 'COALESCE',\n 'NULLIF',\n 'TYPEOF',\n 'CURRENT_SCHEMA',\n 'CURRENT_USER',\n 'HASH',\n 'UUID',\n 'CHAR_LENGTH',\n 'CHARACTER_LENGTH',\n 'POSITION',\n 'OVERLAY',\n 'CONCAT_WS',\n 'FORMAT',\n 'TO_CHAR',\n 'TO_DATE',\n 'TO_NUMBER',\n 'LOCALTIME',\n 'LOCALTIMESTAMP',\n 'JUSTIFY_DAYS',\n 'JUSTIFY_HOURS',\n 'JUSTIFY_INTERVAL',\n 'MAKE_DATE',\n 'MAKE_INTERVAL',\n 'MAKE_TIME',\n 'MAKE_TIMESTAMP',\n 'CLOCK_TIMESTAMP',\n 'STATEMENT_TIMESTAMP',\n 'TRANSACTION_TIMESTAMP',\n];\n\n// SQL operators\nexport const SQL_OPERATORS = [\n '+',\n '-',\n '*',\n '/',\n '%',\n '&',\n '|',\n '^',\n '=',\n '<>',\n '!=',\n '>',\n '>=',\n '<',\n '<=',\n '<<',\n '>>',\n '||',\n '::',\n '->>',\n '->',\n '~',\n '!',\n '@',\n];\n\n// SQL variables\nexport const SQL_VARIABLES = [\n '$1',\n '$2',\n '$3',\n '$4',\n '$5',\n '$6',\n '$7',\n '$8',\n '$9',\n];\n\n// SQL pseudo columns\nexport const SQL_PSEUDO_COLUMNS = [\n '$ACTION',\n '$IDENTITY',\n '$ROWGUID',\n '$PARTITION',\n];\n\n// SQL language configuration for Monaco Editor\nexport const SQL_LANGUAGE_CONFIGURATION = {\n defaultToken: '',\n tokenPostfix: '.sql',\n ignoreCase: true,\n\n brackets: [\n {open: '[', close: ']', token: 'delimiter.square'},\n {open: '(', close: ')', token: 'delimiter.parenthesis'},\n ],\n\n keywords: DUCKDB_KEYWORDS,\n operators: SQL_OPERATORS,\n builtinFunctions: DUCKDB_FUNCTIONS,\n builtinVariables: SQL_VARIABLES,\n pseudoColumns: SQL_PSEUDO_COLUMNS,\n\n tokenizer: {\n root: [\n {include: '@comments'},\n {include: '@whitespace'},\n {include: '@numbers'},\n {include: '@strings'},\n {include: '@complexIdentifiers'},\n {include: '@scopes'},\n [/[;,.]/, 'delimiter'],\n [/[()]/, '@brackets'],\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@keywords': 'keyword',\n '@operators': 'operator',\n '@builtinFunctions': 'predefined',\n '@builtinVariables': 'predefined',\n '@pseudoColumns': 'predefined',\n '@default': 'identifier',\n },\n },\n ],\n [/[<>=!%&+\\-*/|~^]/, 'operator'],\n ],\n whitespace: [[/\\s+/, 'white']],\n comments: [\n [/--+.*/, 'comment'],\n [/\\/\\*/, {token: 'comment.quote', next: '@comment'}],\n ],\n comment: [\n [/[^*/]+/, 'comment'],\n [/\\*\\//, {token: 'comment.quote', next: '@pop'}],\n [/./, 'comment'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n strings: [\n [/'/, {token: 'string', next: '@string'}],\n [/\"/, {token: 'string.double', next: '@stringDouble'}],\n ],\n string: [\n [/[^']+/, 'string'],\n [/''/, 'string'],\n [/'/, {token: 'string', next: '@pop'}],\n ],\n stringDouble: [\n [/[^\"]+/, 'string.double'],\n [/\"\"/, 'string.double'],\n [/\"/, {token: 'string.double', next: '@pop'}],\n ],\n complexIdentifiers: [\n [/\\[/, {token: 'identifier.quote', next: '@bracketedIdentifier'}],\n [/\"/, {token: 'identifier.quote', next: '@quotedIdentifier'}],\n ],\n bracketedIdentifier: [\n [/[^\\]]+/, 'identifier'],\n [/]]/, 'identifier'],\n [/]/, {token: 'identifier.quote', next: '@pop'}],\n ],\n quotedIdentifier: [\n [/[^\"]+/, 'identifier'],\n [/\"\"/, 'identifier'],\n [/\"/, {token: 'identifier.quote', next: '@pop'}],\n ],\n scopes: [],\n },\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC,CAAC,mDAAmD;AAC5F,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from './useQueryTabManagement'; // Deprecated - use SqlEditorSlice methods directly\nexport * from './useTableManagement';\nexport * from './useQueryExecution';\nexport * from './useMonacoEditor';\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type EditorInstance = any;
|
|
2
|
+
type MonacoInstance = any;
|
|
3
|
+
/**
|
|
4
|
+
* Hook for managing Monaco editor instances and keyboard shortcuts
|
|
5
|
+
*/
|
|
6
|
+
export declare function useMonacoEditor(): {
|
|
7
|
+
editorInstances: Record<string, any>;
|
|
8
|
+
handleEditorMount: (editor: EditorInstance, monaco: MonacoInstance, queryId: string, onRunQuery: () => Promise<void>) => void;
|
|
9
|
+
getQueryText: (queryId: string, defaultQuery: string) => string;
|
|
10
|
+
setRunQueryHandler: (handler: () => Promise<void>) => void;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=useMonacoEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMonacoEditor.d.ts","sourceRoot":"","sources":["../../src/hooks/useMonacoEditor.ts"],"names":[],"mappings":"AAEA,KAAK,cAAc,GAAG,GAAG,CAAC;AAC1B,KAAK,cAAc,GAAG,GAAG,CAAC;AAE1B;;GAEG;AACH,wBAAgB,eAAe;;gCAsBjB,cAAc,UACd,cAAc,WACb,MAAM,cACH,MAAM,OAAO,CAAC,IAAI,CAAC;4BAoBvB,MAAM,gBAAgB,MAAM,KAAG,MAAM;kCAhCA,MAAM,OAAO,CAAC,IAAI,CAAC;EAuFrE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for managing Monaco editor instances and keyboard shortcuts
|
|
4
|
+
*/
|
|
5
|
+
export function useMonacoEditor() {
|
|
6
|
+
// Store editor instances for each query tab
|
|
7
|
+
const [editorInstances, setEditorInstances] = useState({});
|
|
8
|
+
// Use a ref for the run query function to avoid dependency issues
|
|
9
|
+
// This ref is NOT for Zustand selectors, it's for function reference stability
|
|
10
|
+
const handleRunQueryRef = useRef(async () => { });
|
|
11
|
+
/**
|
|
12
|
+
* Set the run query handler reference
|
|
13
|
+
*/
|
|
14
|
+
const setRunQueryHandler = useCallback((handler) => {
|
|
15
|
+
handleRunQueryRef.current = handler;
|
|
16
|
+
}, []);
|
|
17
|
+
/**
|
|
18
|
+
* Handle editor mounting and setup keyboard shortcuts
|
|
19
|
+
*/
|
|
20
|
+
const handleEditorMount = useCallback((editor, monaco, queryId, onRunQuery) => {
|
|
21
|
+
// Store the editor instance
|
|
22
|
+
setEditorInstances((prev) => ({
|
|
23
|
+
...prev,
|
|
24
|
+
[queryId]: editor,
|
|
25
|
+
}));
|
|
26
|
+
// Add Cmd/Ctrl+Enter keyboard shortcut to run query
|
|
27
|
+
editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {
|
|
28
|
+
void handleRunQueryRef.current();
|
|
29
|
+
});
|
|
30
|
+
}, []);
|
|
31
|
+
/**
|
|
32
|
+
* Get selected text or entire query from the editor
|
|
33
|
+
*/
|
|
34
|
+
const getQueryText = useCallback((queryId, defaultQuery) => {
|
|
35
|
+
const editor = editorInstances[queryId];
|
|
36
|
+
if (!editor)
|
|
37
|
+
return defaultQuery;
|
|
38
|
+
const selection = editor.getSelection();
|
|
39
|
+
if (selection &&
|
|
40
|
+
!selection.isEmpty() &&
|
|
41
|
+
typeof editor.getModel().getValueInRange === 'function') {
|
|
42
|
+
// Return selected text
|
|
43
|
+
return editor.getModel().getValueInRange(selection);
|
|
44
|
+
}
|
|
45
|
+
// Return the entire query if no selection
|
|
46
|
+
return defaultQuery;
|
|
47
|
+
}, [editorInstances]);
|
|
48
|
+
/**
|
|
49
|
+
* Setup global keyboard shortcuts for running queries
|
|
50
|
+
*/
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
// This global event listener is a fallback for when the editor doesn't have focus
|
|
53
|
+
const handleKeyDown = (evt) => {
|
|
54
|
+
if (evt instanceof KeyboardEvent &&
|
|
55
|
+
evt.key === 'Enter' &&
|
|
56
|
+
(evt.metaKey || evt.ctrlKey || evt.shiftKey)) {
|
|
57
|
+
// Check if the event target is not part of the Monaco editor
|
|
58
|
+
const target = evt.target;
|
|
59
|
+
const isMonacoEditor = target.closest('.monaco-editor');
|
|
60
|
+
// Only handle the event if it's not already being handled by Monaco
|
|
61
|
+
if (!isMonacoEditor) {
|
|
62
|
+
void handleRunQueryRef.current();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
globalThis.addEventListener('keydown', handleKeyDown);
|
|
67
|
+
return () => {
|
|
68
|
+
globalThis.removeEventListener('keydown', handleKeyDown);
|
|
69
|
+
};
|
|
70
|
+
}, []);
|
|
71
|
+
return {
|
|
72
|
+
editorInstances,
|
|
73
|
+
handleEditorMount,
|
|
74
|
+
getQueryText,
|
|
75
|
+
setRunQueryHandler,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=useMonacoEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMonacoEditor.js","sourceRoot":"","sources":["../../src/hooks/useMonacoEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import {useRef, useState, useEffect, useCallback} from 'react';\n\ntype EditorInstance = any;\ntype MonacoInstance = any;\n\n/**\n * Hook for managing Monaco editor instances and keyboard shortcuts\n */\nexport function useMonacoEditor() {\n // Store editor instances for each query tab\n const [editorInstances, setEditorInstances] = useState<\n Record<string, EditorInstance>\n >({});\n\n // Use a ref for the run query function to avoid dependency issues\n // This ref is NOT for Zustand selectors, it's for function reference stability\n const handleRunQueryRef = useRef<() => Promise<void>>(async () => {});\n\n /**\n * Set the run query handler reference\n */\n const setRunQueryHandler = useCallback((handler: () => Promise<void>) => {\n handleRunQueryRef.current = handler;\n }, []);\n\n /**\n * Handle editor mounting and setup keyboard shortcuts\n */\n const handleEditorMount = useCallback(\n (\n editor: EditorInstance,\n monaco: MonacoInstance,\n queryId: string,\n onRunQuery: () => Promise<void>,\n ) => {\n // Store the editor instance\n setEditorInstances((prev) => ({\n ...prev,\n [queryId]: editor,\n }));\n\n // Add Cmd/Ctrl+Enter keyboard shortcut to run query\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {\n void handleRunQueryRef.current();\n });\n },\n [],\n );\n\n /**\n * Get selected text or entire query from the editor\n */\n const getQueryText = useCallback(\n (queryId: string, defaultQuery: string): string => {\n const editor = editorInstances[queryId];\n if (!editor) return defaultQuery;\n\n const selection = editor.getSelection();\n if (\n selection &&\n !selection.isEmpty() &&\n typeof editor.getModel().getValueInRange === 'function'\n ) {\n // Return selected text\n return editor.getModel().getValueInRange(selection);\n }\n\n // Return the entire query if no selection\n return defaultQuery;\n },\n [editorInstances],\n );\n\n /**\n * Setup global keyboard shortcuts for running queries\n */\n useEffect(() => {\n // This global event listener is a fallback for when the editor doesn't have focus\n const handleKeyDown = (evt: Event) => {\n if (\n evt instanceof KeyboardEvent &&\n evt.key === 'Enter' &&\n (evt.metaKey || evt.ctrlKey || evt.shiftKey)\n ) {\n // Check if the event target is not part of the Monaco editor\n const target = evt.target as HTMLElement;\n const isMonacoEditor = target.closest('.monaco-editor');\n\n // Only handle the event if it's not already being handled by Monaco\n if (!isMonacoEditor) {\n void handleRunQueryRef.current();\n }\n }\n };\n\n globalThis.addEventListener('keydown', handleKeyDown);\n\n return () => {\n globalThis.removeEventListener('keydown', handleKeyDown);\n };\n }, []);\n\n return {\n editorInstances,\n handleEditorMount,\n getQueryText,\n setRunQueryHandler,\n };\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Table } from 'apache-arrow';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for executing SQL queries and managing results
|
|
4
|
+
*/
|
|
5
|
+
export declare function useQueryExecution(schema?: string): {
|
|
6
|
+
results: Table<any> | undefined;
|
|
7
|
+
resultsTableData: {
|
|
8
|
+
data: ArrayLike<any>;
|
|
9
|
+
columns: import("@tanstack/table-core").ColumnDef<any, any>[];
|
|
10
|
+
} | undefined;
|
|
11
|
+
loading: boolean;
|
|
12
|
+
error: string | null;
|
|
13
|
+
runQuery: (q: string) => Promise<Table<any> | undefined>;
|
|
14
|
+
exportResults: () => void;
|
|
15
|
+
clearResults: () => void;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=useQueryExecution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQueryExecution.d.ts","sourceRoot":"","sources":["../../src/hooks/useQueryExecution.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAInC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAe;;;;;;;;kBAkB3C,MAAM;;;EAgDnB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useArrowDataTable } from '@sqlrooms/data-table';
|
|
3
|
+
import { useStoreWithSqlEditor } from '../SqlEditorSlice';
|
|
4
|
+
/**
|
|
5
|
+
* Hook for executing SQL queries and managing results
|
|
6
|
+
*/
|
|
7
|
+
export function useQueryExecution(schema = 'main') {
|
|
8
|
+
const [results, setResults] = useState();
|
|
9
|
+
const resultsTableData = useArrowDataTable(results);
|
|
10
|
+
const [loading, setLoading] = useState(false);
|
|
11
|
+
const [error, setError] = useState(null);
|
|
12
|
+
// Get functions from SqlEditorSlice directly
|
|
13
|
+
const executeQueryFromSlice = useStoreWithSqlEditor((s) => s.sqlEditor.executeQuery);
|
|
14
|
+
const exportResultsToCsv = useStoreWithSqlEditor((s) => s.sqlEditor.exportResultsToCsv);
|
|
15
|
+
/**
|
|
16
|
+
* Execute a SQL query
|
|
17
|
+
*/
|
|
18
|
+
const runQuery = useCallback(async (q) => {
|
|
19
|
+
try {
|
|
20
|
+
setLoading(true);
|
|
21
|
+
setError(null);
|
|
22
|
+
const { results: queryResults, error: queryError } = await executeQueryFromSlice(q, schema);
|
|
23
|
+
if (queryError) {
|
|
24
|
+
setError(queryError);
|
|
25
|
+
setResults(undefined);
|
|
26
|
+
}
|
|
27
|
+
else if (queryResults) {
|
|
28
|
+
setResults(queryResults);
|
|
29
|
+
}
|
|
30
|
+
return queryResults;
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
setLoading(false);
|
|
34
|
+
}
|
|
35
|
+
}, [executeQueryFromSlice, schema]);
|
|
36
|
+
/**
|
|
37
|
+
* Export query results to CSV
|
|
38
|
+
*/
|
|
39
|
+
const exportResults = useCallback(() => {
|
|
40
|
+
if (!results)
|
|
41
|
+
return;
|
|
42
|
+
exportResultsToCsv(results);
|
|
43
|
+
}, [exportResultsToCsv, results]);
|
|
44
|
+
/**
|
|
45
|
+
* Clear current query results
|
|
46
|
+
*/
|
|
47
|
+
const clearResults = useCallback(() => {
|
|
48
|
+
setResults(undefined);
|
|
49
|
+
setError(null);
|
|
50
|
+
}, []);
|
|
51
|
+
return {
|
|
52
|
+
results,
|
|
53
|
+
resultsTableData,
|
|
54
|
+
loading,
|
|
55
|
+
error,
|
|
56
|
+
runQuery,
|
|
57
|
+
exportResults,
|
|
58
|
+
clearResults,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=useQueryExecution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQueryExecution.js","sourceRoot":"","sources":["../../src/hooks/useQueryExecution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB,MAAM;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAS,CAAC;IAChD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,6CAA6C;IAC7C,MAAM,qBAAqB,GAAG,qBAAqB,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAChC,CAAC;IACF,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CACtC,CAAC;IAEF;;OAEG;IACH,MAAM,QAAQ,GAAG,WAAW,CAC1B,KAAK,EAAE,CAAS,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEf,MAAM,EAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAC,GAC9C,MAAM,qBAAqB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAEzC,IAAI,UAAU,EAAE,CAAC;gBACf,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACrB,UAAU,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,YAAY,EAAE,CAAC;gBACxB,UAAU,CAAC,YAAY,CAAC,CAAC;YAC3B,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EACD,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAChC,CAAC;IAEF;;OAEG;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;IAElC;;OAEG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,OAAO;QACP,gBAAgB;QAChB,OAAO;QACP,KAAK;QACL,QAAQ;QACR,aAAa;QACb,YAAY;KACb,CAAC;AACJ,CAAC","sourcesContent":["import {useState, useCallback} from 'react';\nimport {Table} from 'apache-arrow';\nimport {useArrowDataTable} from '@sqlrooms/data-table';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\n\n/**\n * Hook for executing SQL queries and managing results\n */\nexport function useQueryExecution(schema: string = 'main') {\n const [results, setResults] = useState<Table>();\n const resultsTableData = useArrowDataTable(results);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Get functions from SqlEditorSlice directly\n const executeQueryFromSlice = useStoreWithSqlEditor(\n (s) => s.sqlEditor.executeQuery,\n );\n const exportResultsToCsv = useStoreWithSqlEditor(\n (s) => s.sqlEditor.exportResultsToCsv,\n );\n\n /**\n * Execute a SQL query\n */\n const runQuery = useCallback(\n async (q: string) => {\n try {\n setLoading(true);\n setError(null);\n\n const {results: queryResults, error: queryError} =\n await executeQueryFromSlice(q, schema);\n\n if (queryError) {\n setError(queryError);\n setResults(undefined);\n } else if (queryResults) {\n setResults(queryResults);\n }\n\n return queryResults;\n } finally {\n setLoading(false);\n }\n },\n [executeQueryFromSlice, schema],\n );\n\n /**\n * Export query results to CSV\n */\n const exportResults = useCallback(() => {\n if (!results) return;\n exportResultsToCsv(results);\n }, [exportResultsToCsv, results]);\n\n /**\n * Clear current query results\n */\n const clearResults = useCallback(() => {\n setResults(undefined);\n setError(null);\n }, []);\n\n return {\n results,\n resultsTableData,\n loading,\n error,\n runQuery,\n exportResults,\n clearResults,\n };\n}\n"]}
|