@sqlrooms/cells 0.29.0-rc.1 → 0.29.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +2 -1
- package/README.md +8 -8
- package/dist/cellsSlice.d.ts.map +1 -1
- package/dist/cellsSlice.js +305 -264
- package/dist/cellsSlice.js.map +1 -1
- package/dist/components/AggregationSelector.d.ts +8 -0
- package/dist/components/AggregationSelector.d.ts.map +1 -0
- package/dist/components/AggregationSelector.js +13 -0
- package/dist/components/AggregationSelector.js.map +1 -0
- package/dist/components/CellSourceSelector.d.ts +12 -0
- package/dist/components/CellSourceSelector.d.ts.map +1 -0
- package/dist/components/CellSourceSelector.js +34 -0
- package/dist/components/CellSourceSelector.js.map +1 -0
- package/dist/components/ChartTypeSelector.d.ts +8 -0
- package/dist/components/ChartTypeSelector.d.ts.map +1 -0
- package/dist/components/ChartTypeSelector.js +13 -0
- package/dist/components/ChartTypeSelector.js.map +1 -0
- package/dist/components/CollapsibleSectionButton.d.ts +10 -0
- package/dist/components/CollapsibleSectionButton.d.ts.map +1 -0
- package/dist/components/CollapsibleSectionButton.js +10 -0
- package/dist/components/CollapsibleSectionButton.js.map +1 -0
- package/dist/components/ColorSelector.d.ts +24 -0
- package/dist/components/ColorSelector.d.ts.map +1 -0
- package/dist/components/ColorSelector.js +17 -0
- package/dist/components/ColorSelector.js.map +1 -0
- package/dist/components/FieldSelector.d.ts +11 -0
- package/dist/components/FieldSelector.d.ts.map +1 -0
- package/dist/components/FieldSelector.js +11 -0
- package/dist/components/FieldSelector.js.map +1 -0
- package/dist/components/FieldTypeIcon.d.ts +8 -0
- package/dist/components/FieldTypeIcon.d.ts.map +1 -0
- package/dist/components/FieldTypeIcon.js +27 -0
- package/dist/components/FieldTypeIcon.js.map +1 -0
- package/dist/components/InputCellContent.d.ts.map +1 -1
- package/dist/components/InputCellContent.js +3 -3
- package/dist/components/InputCellContent.js.map +1 -1
- package/dist/components/SqlCellConnectionSelector.d.ts +9 -0
- package/dist/components/SqlCellConnectionSelector.d.ts.map +1 -0
- package/dist/components/SqlCellConnectionSelector.js +21 -0
- package/dist/components/SqlCellConnectionSelector.js.map +1 -0
- package/dist/components/SqlCellContent.d.ts.map +1 -1
- package/dist/components/SqlCellContent.js +31 -160
- package/dist/components/SqlCellContent.js.map +1 -1
- package/dist/components/SqlCellDependentsMenu.d.ts +11 -0
- package/dist/components/SqlCellDependentsMenu.d.ts.map +1 -0
- package/dist/components/SqlCellDependentsMenu.js +62 -0
- package/dist/components/SqlCellDependentsMenu.js.map +1 -0
- package/dist/components/SqlCellEditor.d.ts +14 -0
- package/dist/components/SqlCellEditor.d.ts.map +1 -0
- package/dist/components/SqlCellEditor.js +17 -0
- package/dist/components/SqlCellEditor.js.map +1 -0
- package/dist/components/SqlCellResultNameEditor.d.ts +8 -0
- package/dist/components/SqlCellResultNameEditor.d.ts.map +1 -0
- package/dist/components/SqlCellResultNameEditor.js +38 -0
- package/dist/components/SqlCellResultNameEditor.js.map +1 -0
- package/dist/components/SqlCellResults.d.ts +17 -0
- package/dist/components/SqlCellResults.d.ts.map +1 -0
- package/dist/components/SqlCellResults.js +44 -0
- package/dist/components/SqlCellResults.js.map +1 -0
- package/dist/components/SqlCellRunButton.d.ts +5 -6
- package/dist/components/SqlCellRunButton.d.ts.map +1 -1
- package/dist/components/SqlCellRunButton.js +11 -7
- package/dist/components/SqlCellRunButton.js.map +1 -1
- package/dist/components/SqlQueryPreview.d.ts +9 -0
- package/dist/components/SqlQueryPreview.d.ts.map +1 -0
- package/dist/components/SqlQueryPreview.js +14 -0
- package/dist/components/SqlQueryPreview.js.map +1 -0
- package/dist/components/TextCellContent.d.ts.map +1 -1
- package/dist/components/TextCellContent.js +24 -7
- package/dist/components/TextCellContent.js.map +1 -1
- package/dist/components/VegaCellContent.d.ts +0 -1
- package/dist/components/VegaCellContent.d.ts.map +1 -1
- package/dist/components/VegaCellContent.js +28 -49
- package/dist/components/VegaCellContent.js.map +1 -1
- package/dist/components/VegaCellHeader.d.ts +8 -0
- package/dist/components/VegaCellHeader.d.ts.map +1 -0
- package/dist/components/VegaCellHeader.js +30 -0
- package/dist/components/VegaCellHeader.js.map +1 -0
- package/dist/components/VegaConfigPanel.d.ts.map +1 -1
- package/dist/components/VegaConfigPanel.js +23 -64
- package/dist/components/VegaConfigPanel.js.map +1 -1
- package/dist/dagUtils.d.ts +10 -9
- package/dist/dagUtils.d.ts.map +1 -1
- package/dist/dagUtils.js +76 -50
- package/dist/dagUtils.js.map +1 -1
- package/dist/defaultCellRegistry.d.ts.map +1 -1
- package/dist/defaultCellRegistry.js +82 -39
- package/dist/defaultCellRegistry.js.map +1 -1
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +27 -20
- package/dist/execution.js.map +1 -1
- package/dist/helpers.d.ts +21 -28
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +77 -90
- package/dist/helpers.js.map +1 -1
- package/dist/hooks/useVegaCellDataSource.d.ts +18 -0
- package/dist/hooks/useVegaCellDataSource.d.ts.map +1 -0
- package/dist/hooks/useVegaCellDataSource.js +40 -0
- package/dist/hooks/useVegaCellDataSource.js.map +1 -0
- package/dist/hooks/useVegaCellQuery.d.ts +12 -0
- package/dist/hooks/useVegaCellQuery.d.ts.map +1 -0
- package/dist/hooks/useVegaCellQuery.js +12 -0
- package/dist/hooks/useVegaCellQuery.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/resultRelationPolicy.d.ts +2 -2
- package/dist/resultRelationPolicy.d.ts.map +1 -1
- package/dist/resultRelationPolicy.js +9 -1
- package/dist/resultRelationPolicy.js.map +1 -1
- package/dist/sqlHelpers.d.ts +8 -8
- package/dist/sqlHelpers.d.ts.map +1 -1
- package/dist/sqlHelpers.js +16 -12
- package/dist/sqlHelpers.js.map +1 -1
- package/dist/types.d.ts +113 -70
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +22 -13
- package/dist/types.js.map +1 -1
- package/dist/useValidateResultName.d.ts +34 -0
- package/dist/useValidateResultName.d.ts.map +1 -0
- package/dist/useValidateResultName.js +111 -0
- package/dist/useValidateResultName.js.map +1 -0
- package/dist/utils.d.ts +10 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +20 -4
- package/dist/utils.js.map +1 -1
- package/dist/vegaSelectionUtils.d.ts +14 -0
- package/dist/vegaSelectionUtils.d.ts.map +1 -0
- package/dist/vegaSelectionUtils.js +97 -0
- package/dist/vegaSelectionUtils.js.map +1 -0
- package/dist/vegaSpecBuilder.d.ts +34 -0
- package/dist/vegaSpecBuilder.d.ts.map +1 -0
- package/dist/vegaSpecBuilder.js +90 -0
- package/dist/vegaSpecBuilder.js.map +1 -0
- package/package.json +20 -21
- package/dist/components/DeleteSheetModal.d.ts +0 -9
- package/dist/components/DeleteSheetModal.d.ts.map +0 -1
- package/dist/components/DeleteSheetModal.js +0 -6
- package/dist/components/DeleteSheetModal.js.map +0 -1
- package/dist/components/SheetsTabBar.d.ts +0 -6
- package/dist/components/SheetsTabBar.d.ts.map +0 -1
- package/dist/components/SheetsTabBar.js +0 -57
- package/dist/components/SheetsTabBar.js.map +0 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { makeQualifiedTableName } from '@sqlrooms/duckdb';
|
|
3
2
|
import { convertToValidColumnOrTableName } from '@sqlrooms/utils';
|
|
3
|
+
import { getRawSqlTableReference } from '@sqlrooms/duckdb';
|
|
4
4
|
import { produce } from 'immer';
|
|
5
5
|
import { InputCellContent } from './components/InputCellContent';
|
|
6
6
|
import { SqlCellContent } from './components/SqlCellContent';
|
|
7
7
|
import { TextCellContent } from './components/TextCellContent';
|
|
8
8
|
import { VegaCellContent } from './components/VegaCellContent';
|
|
9
9
|
import { executeSqlCell } from './execution';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { isInputCell } from './types';
|
|
10
|
+
import { findArtifactIdForCell, resolveArtifactSchemaName } from './helpers';
|
|
11
|
+
import { dropResultRelation, renameResultRelation } from './resultRelationPolicy';
|
|
12
|
+
import { findSqlDependenciesFromAst, qualifyArtifactLocalResultNames, renderSqlWithInputs, } from './sqlHelpers';
|
|
13
|
+
import { isInputCell, isSqlCell } from './types';
|
|
14
14
|
import { getEffectiveResultName, isDefined } from './utils';
|
|
15
15
|
export function createDefaultCellRegistry() {
|
|
16
16
|
return {
|
|
17
17
|
sql: {
|
|
18
18
|
type: 'sql',
|
|
19
19
|
title: 'SQL Query',
|
|
20
|
-
createCell: (id) => ({
|
|
20
|
+
createCell: ({ id }) => ({
|
|
21
21
|
id,
|
|
22
22
|
type: 'sql',
|
|
23
23
|
data: { title: 'Untitled Query', sql: '' },
|
|
@@ -30,12 +30,52 @@ export function createDefaultCellRegistry() {
|
|
|
30
30
|
sqlSelectToJson,
|
|
31
31
|
});
|
|
32
32
|
},
|
|
33
|
+
createStatus: () => ({
|
|
34
|
+
type: 'sql',
|
|
35
|
+
status: 'idle',
|
|
36
|
+
referencedTables: [],
|
|
37
|
+
}),
|
|
38
|
+
onRemove: async ({ status, get }) => {
|
|
39
|
+
if (status?.type === 'sql' && status.resultView) {
|
|
40
|
+
try {
|
|
41
|
+
const connector = await get().db.getConnector();
|
|
42
|
+
await dropResultRelation({
|
|
43
|
+
connector,
|
|
44
|
+
relationName: status.resultView,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// best-effort
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
hasSemanticChange: (oldCell, newCell) => {
|
|
53
|
+
const oldSql = isSqlCell(oldCell) ? oldCell.data.sql : undefined;
|
|
54
|
+
const newSql = isSqlCell(newCell) ? newCell.data.sql : undefined;
|
|
55
|
+
return oldSql !== newSql;
|
|
56
|
+
},
|
|
57
|
+
invalidateStatus: (currentStatus) => ({
|
|
58
|
+
type: 'sql',
|
|
59
|
+
status: 'idle',
|
|
60
|
+
referencedTables: currentStatus.referencedTables || [],
|
|
61
|
+
}),
|
|
62
|
+
getRelationsToDrop: (status) => {
|
|
63
|
+
const sqlStatus = status;
|
|
64
|
+
return sqlStatus.resultView ? [sqlStatus.resultView] : [];
|
|
65
|
+
},
|
|
66
|
+
recordError: (currentStatus, message) => ({
|
|
67
|
+
...currentStatus,
|
|
68
|
+
status: 'error',
|
|
69
|
+
lastError: message,
|
|
70
|
+
}),
|
|
71
|
+
getResultRelation: (status) => {
|
|
72
|
+
const sqlStatus = status;
|
|
73
|
+
return sqlStatus.resultView;
|
|
74
|
+
},
|
|
33
75
|
runCell: async ({ id, opts, get, set }) => {
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
// stays current without paying the cost on every keystroke.
|
|
38
|
-
await get().cells.updateEdgesFromSql(ownerSheetId, id);
|
|
76
|
+
const ownerArtifactId = findArtifactIdForCell(get(), id);
|
|
77
|
+
if (ownerArtifactId) {
|
|
78
|
+
await get().cells.updateEdgesFromSql(ownerArtifactId, id);
|
|
39
79
|
}
|
|
40
80
|
const controller = new AbortController();
|
|
41
81
|
set((s) => produce(s, (draft) => {
|
|
@@ -47,7 +87,6 @@ export function createDefaultCellRegistry() {
|
|
|
47
87
|
signal: controller.signal,
|
|
48
88
|
setCellResult: get().cells.setCellResult,
|
|
49
89
|
});
|
|
50
|
-
// Refresh table schemas after execution (fire and forget)
|
|
51
90
|
void get().db.refreshTableSchemas();
|
|
52
91
|
},
|
|
53
92
|
renameResult: async ({ id, oldResultView, get, set }) => {
|
|
@@ -56,30 +95,32 @@ export function createDefaultCellRegistry() {
|
|
|
56
95
|
if (!cell || cell.type !== 'sql')
|
|
57
96
|
return;
|
|
58
97
|
const status = state.cells.status[id];
|
|
59
|
-
const previousRelationType = (status?.type === 'sql'
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
const
|
|
98
|
+
const previousRelationType = (status?.type === 'sql'
|
|
99
|
+
? status.resultRelationType
|
|
100
|
+
: undefined) ?? 'view';
|
|
101
|
+
const artifactId = findArtifactIdForCell(state, id);
|
|
102
|
+
const artifact = artifactId
|
|
103
|
+
? state.cells.config.artifacts[artifactId]
|
|
104
|
+
: undefined;
|
|
105
|
+
const schemaName = artifact
|
|
106
|
+
? resolveArtifactSchemaName(artifact)
|
|
107
|
+
: 'main';
|
|
64
108
|
const effectiveResultName = getEffectiveResultName(cell.data, convertToValidColumnOrTableName);
|
|
65
|
-
const newTableName =
|
|
109
|
+
const newTableName = getRawSqlTableReference(state.db.qualifyTableName({
|
|
66
110
|
table: effectiveResultName,
|
|
67
111
|
schema: schemaName,
|
|
68
112
|
database: state.db.currentDatabase,
|
|
69
|
-
})
|
|
113
|
+
}));
|
|
70
114
|
if (newTableName === oldResultView) {
|
|
71
115
|
return;
|
|
72
116
|
}
|
|
73
|
-
// Re-create the relation under the new name. For materialized results
|
|
74
|
-
// keep table semantics, otherwise keep view semantics.
|
|
75
117
|
const connector = await state.db.getConnector();
|
|
76
118
|
const sql = cell.data.sql;
|
|
77
|
-
const scopedCellIds =
|
|
119
|
+
const scopedCellIds = artifact?.cellIds ?? Object.keys(state.cells.config.data);
|
|
78
120
|
const scopedCells = Object.fromEntries(scopedCellIds
|
|
79
121
|
.map((cellId) => state.cells.config.data[cellId])
|
|
80
122
|
.filter(isDefined)
|
|
81
123
|
.map((candidate) => [candidate.id, candidate]));
|
|
82
|
-
// Gather inputs for SQL rendering
|
|
83
124
|
const inputs = Object.values(scopedCells)
|
|
84
125
|
.filter((c) => isInputCell(c))
|
|
85
126
|
.map((c) => ({
|
|
@@ -87,10 +128,10 @@ export function createDefaultCellRegistry() {
|
|
|
87
128
|
value: c.data.input.value,
|
|
88
129
|
}));
|
|
89
130
|
const renderedSql = renderSqlWithInputs(sql, inputs);
|
|
90
|
-
const rewrittenSql =
|
|
131
|
+
const rewrittenSql = qualifyArtifactLocalResultNames({
|
|
91
132
|
sql: renderedSql,
|
|
92
|
-
|
|
93
|
-
|
|
133
|
+
artifactSchema: schemaName,
|
|
134
|
+
artifactCellIds: scopedCellIds,
|
|
94
135
|
cells: state.cells.config.data,
|
|
95
136
|
getSqlResultName: (cellId) => {
|
|
96
137
|
const c = state.cells.config.data[cellId];
|
|
@@ -100,8 +141,6 @@ export function createDefaultCellRegistry() {
|
|
|
100
141
|
return undefined;
|
|
101
142
|
},
|
|
102
143
|
});
|
|
103
|
-
// Rename must preserve whichever mode execution selected (view/table).
|
|
104
|
-
// We clear any stale object at the destination name first.
|
|
105
144
|
await renameResultRelation({
|
|
106
145
|
connector,
|
|
107
146
|
oldRelationName: oldResultView,
|
|
@@ -109,23 +148,22 @@ export function createDefaultCellRegistry() {
|
|
|
109
148
|
relationType: previousRelationType,
|
|
110
149
|
viewSql: rewrittenSql,
|
|
111
150
|
});
|
|
112
|
-
// Update status with new view name
|
|
113
151
|
set((s) => produce(s, (draft) => {
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
152
|
+
const draftStatus = draft.cells.status[id];
|
|
153
|
+
if (draftStatus?.type === 'sql') {
|
|
154
|
+
draftStatus.resultName = newTableName;
|
|
155
|
+
draftStatus.resultView = newTableName;
|
|
156
|
+
draftStatus.resultRelationType =
|
|
157
|
+
previousRelationType;
|
|
119
158
|
}
|
|
120
159
|
}));
|
|
121
|
-
// Refresh schema tree
|
|
122
160
|
void get().db.refreshTableSchemas();
|
|
123
161
|
},
|
|
124
162
|
},
|
|
125
163
|
text: {
|
|
126
164
|
type: 'text',
|
|
127
165
|
title: 'Text / Markdown',
|
|
128
|
-
createCell: (id) => ({
|
|
166
|
+
createCell: ({ id }) => ({
|
|
129
167
|
id,
|
|
130
168
|
type: 'text',
|
|
131
169
|
data: { title: 'Text', text: '' },
|
|
@@ -136,11 +174,12 @@ export function createDefaultCellRegistry() {
|
|
|
136
174
|
vega: {
|
|
137
175
|
type: 'vega',
|
|
138
176
|
title: 'Visualization',
|
|
139
|
-
createCell: (id) => ({
|
|
177
|
+
createCell: ({ id }) => ({
|
|
140
178
|
id,
|
|
141
179
|
type: 'vega',
|
|
142
180
|
data: {
|
|
143
181
|
title: 'Chart',
|
|
182
|
+
crossFilter: { enabled: true },
|
|
144
183
|
vegaSpec: {
|
|
145
184
|
data: { name: 'queryResult' },
|
|
146
185
|
mark: 'bar',
|
|
@@ -151,13 +190,17 @@ export function createDefaultCellRegistry() {
|
|
|
151
190
|
renderCell: ({ id, cell, renderContainer }) => (_jsx(VegaCellContent, { id: id, cell: cell, renderContainer: renderContainer })),
|
|
152
191
|
findDependencies: async ({ cell }) => {
|
|
153
192
|
const sqlId = cell.data.sqlId;
|
|
154
|
-
|
|
193
|
+
const tableRef = cell.data.tableRef;
|
|
194
|
+
return {
|
|
195
|
+
cellIds: sqlId ? [sqlId] : [],
|
|
196
|
+
tableNames: tableRef ? [tableRef] : [],
|
|
197
|
+
};
|
|
155
198
|
},
|
|
156
199
|
},
|
|
157
200
|
input: {
|
|
158
201
|
type: 'input',
|
|
159
202
|
title: 'Input / Parameter',
|
|
160
|
-
createCell: (id) => ({
|
|
203
|
+
createCell: ({ id }) => ({
|
|
161
204
|
id,
|
|
162
205
|
type: 'input',
|
|
163
206
|
data: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultCellRegistry.js","sourceRoot":"","sources":["../src/defaultCellRegistry.tsx"],"names":[],"mappings":"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","sourcesContent":["import {makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {InputCellContent} from './components/InputCellContent';\nimport {SqlCellContent} from './components/SqlCellContent';\nimport {TextCellContent} from './components/TextCellContent';\nimport {VegaCellContent} from './components/VegaCellContent';\nimport {executeSqlCell} from './execution';\nimport {findSheetIdForCell, resolveSheetSchemaName} from './helpers';\nimport {\n findSqlDependenciesFromAst,\n qualifySheetLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport {renameResultRelation} from './resultRelationPolicy';\nimport type {\n Cell,\n CellRegistry,\n InputCell,\n SqlCell,\n SqlCellData,\n TextCell,\n VegaCell,\n} from './types';\nimport {isInputCell} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nexport function createDefaultCellRegistry(): CellRegistry {\n return {\n sql: {\n type: 'sql',\n title: 'SQL Query',\n createCell: (id: string): SqlCell => ({\n id,\n type: 'sql',\n data: {title: 'Untitled Query', sql: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <SqlCellContent\n id={id}\n cell={cell as SqlCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell, cells, sqlSelectToJson}) => {\n return findSqlDependenciesFromAst({\n sql: (cell as SqlCell).data.sql,\n cells,\n sqlSelectToJson,\n });\n },\n runCell: async ({id, opts, get, set}) => {\n const ownerSheetId = findSheetIdForCell(get(), id);\n if (ownerSheetId) {\n // Recompute this SQL cell's dependencies on explicit run so graph state\n // stays current without paying the cost on every keystroke.\n await get().cells.updateEdgesFromSql(ownerSheetId, id);\n }\n\n const controller = new AbortController();\n set((s) =>\n produce(s, (draft) => {\n draft.cells.activeAbortControllers[id] = controller;\n }),\n );\n\n await executeSqlCell(id, get, set, {\n schemaName: opts?.schemaName || 'main',\n cascade: opts?.cascade,\n signal: controller.signal,\n setCellResult: get().cells.setCellResult,\n });\n\n // Refresh table schemas after execution (fire and forget)\n void get().db.refreshTableSchemas();\n },\n renameResult: async ({id, oldResultView, get, set}) => {\n const state = get();\n const cell = state.cells.config.data[id];\n if (!cell || cell.type !== 'sql') return;\n const status = state.cells.status[id];\n const previousRelationType =\n (status?.type === 'sql' ? status.resultRelationType : undefined) ??\n 'view';\n\n const sheetId = findSheetIdForCell(state, id);\n const sheet = sheetId ? state.cells.config.sheets[sheetId] : undefined;\n const schemaName = sheet ? resolveSheetSchemaName(sheet) : 'main';\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const newTableName = makeQualifiedTableName({\n table: effectiveResultName,\n schema: schemaName,\n database: state.db.currentDatabase,\n }).toString();\n\n if (newTableName === oldResultView) {\n return;\n }\n\n // Re-create the relation under the new name. For materialized results\n // keep table semantics, otherwise keep view semantics.\n const connector = await state.db.getConnector();\n const sql = (cell.data as SqlCellData).sql;\n const scopedCellIds =\n sheet?.cellIds ?? Object.keys(state.cells.config.data);\n const scopedCells = Object.fromEntries(\n scopedCellIds\n .map((cellId) => state.cells.config.data[cellId])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n\n // Gather inputs for SQL rendering\n const inputs = Object.values(scopedCells)\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value as string | number,\n }));\n const renderedSql = renderSqlWithInputs(sql, inputs);\n const rewrittenSql = qualifySheetLocalResultNames({\n sql: renderedSql,\n sheetSchema: schemaName,\n sheetCellIds: scopedCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (cellId) => {\n const c = state.cells.config.data[cellId];\n if (c?.type === 'sql') {\n return getEffectiveResultName(\n c.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n }\n return undefined;\n },\n });\n\n // Rename must preserve whichever mode execution selected (view/table).\n // We clear any stale object at the destination name first.\n await renameResultRelation({\n connector,\n oldRelationName: oldResultView,\n newRelationName: newTableName,\n relationType: previousRelationType,\n viewSql: rewrittenSql,\n });\n\n // Update status with new view name\n set((s) =>\n produce(s, (draft) => {\n const status = draft.cells.status[id];\n if (status?.type === 'sql') {\n status.resultName = newTableName;\n status.resultView = newTableName;\n status.resultRelationType = previousRelationType;\n }\n }),\n );\n\n // Refresh schema tree\n void get().db.refreshTableSchemas();\n },\n },\n text: {\n type: 'text',\n title: 'Text / Markdown',\n createCell: (id: string): TextCell => ({\n id,\n type: 'text',\n data: {title: 'Text', text: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <TextCellContent\n id={id}\n cell={cell as TextCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n vega: {\n type: 'vega',\n title: 'Visualization',\n createCell: (id: string): VegaCell => ({\n id,\n type: 'vega',\n data: {\n title: 'Chart',\n vegaSpec: {\n data: {name: 'queryResult'},\n mark: 'bar',\n padding: 20,\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <VegaCellContent\n id={id}\n cell={cell as VegaCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell}) => {\n const sqlId = (cell as VegaCell).data.sqlId;\n return sqlId ? [sqlId] : [];\n },\n },\n input: {\n type: 'input',\n title: 'Input / Parameter',\n createCell: (id: string): InputCell => ({\n id,\n type: 'input',\n data: {\n title: 'Input',\n input: {\n kind: 'text',\n varName: `param_${id.slice(0, 4)}`,\n value: '',\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <InputCellContent\n id={id}\n cell={cell as InputCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"defaultCellRegistry.js","sourceRoot":"","sources":["../src/defaultCellRegistry.tsx"],"names":[],"mappings":"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","sourcesContent":["import {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {getRawSqlTableReference} from '@sqlrooms/duckdb';\nimport {produce} from 'immer';\nimport {InputCellContent} from './components/InputCellContent';\nimport {SqlCellContent} from './components/SqlCellContent';\nimport {TextCellContent} from './components/TextCellContent';\nimport {VegaCellContent} from './components/VegaCellContent';\nimport {executeSqlCell} from './execution';\nimport {findArtifactIdForCell, resolveArtifactSchemaName} from './helpers';\nimport {dropResultRelation, renameResultRelation} from './resultRelationPolicy';\nimport {\n findSqlDependenciesFromAst,\n qualifyArtifactLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport type {\n Cell,\n CellRegistry,\n CellStatus,\n InputCell,\n SqlCell,\n SqlCellData,\n SqlCellStatus,\n TextCell,\n VegaCell,\n} from './types';\nimport {isInputCell, isSqlCell} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nexport function createDefaultCellRegistry(): CellRegistry {\n return {\n sql: {\n type: 'sql',\n title: 'SQL Query',\n createCell: ({id}): SqlCell => ({\n id,\n type: 'sql',\n data: {title: 'Untitled Query', sql: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <SqlCellContent\n id={id}\n cell={cell as SqlCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell, cells, sqlSelectToJson}) => {\n return findSqlDependenciesFromAst({\n sql: (cell as SqlCell).data.sql,\n cells,\n sqlSelectToJson,\n });\n },\n createStatus: (): CellStatus => ({\n type: 'sql',\n status: 'idle',\n referencedTables: [],\n }),\n onRemove: async ({status, get}) => {\n if (status?.type === 'sql' && (status as SqlCellStatus).resultView) {\n try {\n const connector = await get().db.getConnector();\n await dropResultRelation({\n connector,\n relationName: (status as SqlCellStatus).resultView,\n });\n } catch {\n // best-effort\n }\n }\n },\n hasSemanticChange: (oldCell, newCell) => {\n const oldSql = isSqlCell(oldCell) ? oldCell.data.sql : undefined;\n const newSql = isSqlCell(newCell) ? newCell.data.sql : undefined;\n return oldSql !== newSql;\n },\n invalidateStatus: (currentStatus): CellStatus => ({\n type: 'sql',\n status: 'idle',\n referencedTables:\n (currentStatus as SqlCellStatus).referencedTables || [],\n }),\n getRelationsToDrop: (status): string[] => {\n const sqlStatus = status as SqlCellStatus;\n return sqlStatus.resultView ? [sqlStatus.resultView] : [];\n },\n recordError: (currentStatus, message): CellStatus => ({\n ...currentStatus,\n status: 'error',\n lastError: message,\n }),\n getResultRelation: (status): string | undefined => {\n const sqlStatus = status as SqlCellStatus;\n return sqlStatus.resultView;\n },\n runCell: async ({id, opts, get, set}) => {\n const ownerArtifactId = findArtifactIdForCell(get(), id);\n if (ownerArtifactId) {\n await get().cells.updateEdgesFromSql(ownerArtifactId, id);\n }\n\n const controller = new AbortController();\n set((s) =>\n produce(s, (draft) => {\n draft.cells.activeAbortControllers[id] = controller;\n }),\n );\n\n await executeSqlCell(id, get, set, {\n schemaName: opts?.schemaName || 'main',\n cascade: opts?.cascade,\n signal: controller.signal,\n setCellResult: get().cells.setCellResult,\n });\n\n void get().db.refreshTableSchemas();\n },\n renameResult: async ({id, oldResultView, get, set}) => {\n const state = get();\n const cell = state.cells.config.data[id];\n if (!cell || cell.type !== 'sql') return;\n const status = state.cells.status[id];\n const previousRelationType =\n (status?.type === 'sql'\n ? (status as SqlCellStatus).resultRelationType\n : undefined) ?? 'view';\n\n const artifactId = findArtifactIdForCell(state, id);\n const artifact = artifactId\n ? state.cells.config.artifacts[artifactId]\n : undefined;\n const schemaName = artifact\n ? resolveArtifactSchemaName(artifact)\n : 'main';\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const newTableName = getRawSqlTableReference(\n state.db.qualifyTableName({\n table: effectiveResultName,\n schema: schemaName,\n database: state.db.currentDatabase,\n }),\n );\n\n if (newTableName === oldResultView) {\n return;\n }\n\n const connector = await state.db.getConnector();\n const sql = (cell.data as SqlCellData).sql;\n const scopedCellIds =\n artifact?.cellIds ?? Object.keys(state.cells.config.data);\n const scopedCells = Object.fromEntries(\n scopedCellIds\n .map((cellId) => state.cells.config.data[cellId])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n\n const inputs = Object.values(scopedCells)\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value as string | number,\n }));\n const renderedSql = renderSqlWithInputs(sql, inputs);\n const rewrittenSql = qualifyArtifactLocalResultNames({\n sql: renderedSql,\n artifactSchema: schemaName,\n artifactCellIds: scopedCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (cellId) => {\n const c = state.cells.config.data[cellId];\n if (c?.type === 'sql') {\n return getEffectiveResultName(\n c.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n }\n return undefined;\n },\n });\n\n await renameResultRelation({\n connector,\n oldRelationName: oldResultView,\n newRelationName: newTableName,\n relationType: previousRelationType,\n viewSql: rewrittenSql,\n });\n\n set((s) =>\n produce(s, (draft) => {\n const draftStatus = draft.cells.status[id];\n if (draftStatus?.type === 'sql') {\n (draftStatus as SqlCellStatus).resultName = newTableName;\n (draftStatus as SqlCellStatus).resultView = newTableName;\n (draftStatus as SqlCellStatus).resultRelationType =\n previousRelationType;\n }\n }),\n );\n\n void get().db.refreshTableSchemas();\n },\n },\n text: {\n type: 'text',\n title: 'Text / Markdown',\n createCell: ({id}): TextCell => ({\n id,\n type: 'text',\n data: {title: 'Text', text: ''},\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <TextCellContent\n id={id}\n cell={cell as TextCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n vega: {\n type: 'vega',\n title: 'Visualization',\n createCell: ({id}): VegaCell => ({\n id,\n type: 'vega',\n data: {\n title: 'Chart',\n crossFilter: {enabled: true},\n vegaSpec: {\n data: {name: 'queryResult'},\n mark: 'bar',\n padding: 20,\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <VegaCellContent\n id={id}\n cell={cell as VegaCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async ({cell}) => {\n const sqlId = (cell as VegaCell).data.sqlId;\n const tableRef = (cell as VegaCell).data.tableRef;\n return {\n cellIds: sqlId ? [sqlId] : [],\n tableNames: tableRef ? [tableRef] : [],\n };\n },\n },\n input: {\n type: 'input',\n title: 'Input / Parameter',\n createCell: ({id}): InputCell => ({\n id,\n type: 'input',\n data: {\n title: 'Input',\n input: {\n kind: 'text',\n varName: `param_${id.slice(0, 4)}`,\n value: '',\n },\n },\n }),\n renderCell: ({id, cell, renderContainer}) => (\n <InputCellContent\n id={id}\n cell={cell as InputCell}\n renderContainer={renderContainer}\n />\n ),\n findDependencies: async () => [],\n },\n };\n}\n"]}
|
package/dist/execution.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAkBA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EAGpB,MAAM,SAAS,CAAC;AAKjB,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,cAAc,EAC9B,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,KAAK,IAAI,EACjE,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAkBA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EAGpB,MAAM,SAAS,CAAC;AAKjB,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,cAAc,EAC9B,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,KAAK,IAAI,EACjE,OAAO,EAAE,qBAAqB,iBA4O/B"}
|
package/dist/execution.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { escapeId,
|
|
1
|
+
import { escapeId, getRawSqlTableReference } from '@sqlrooms/duckdb';
|
|
2
2
|
import { convertToValidColumnOrTableName } from '@sqlrooms/utils';
|
|
3
3
|
import { produce } from 'immer';
|
|
4
|
-
import {
|
|
5
|
-
import { findSqlDependencies,
|
|
4
|
+
import { findArtifactIdForCell, getUnqualifiedSqlIdentifier, resolveArtifactSchemaName, } from './helpers';
|
|
5
|
+
import { findSqlDependencies, qualifyArtifactLocalResultNames, renderSqlWithInputs, } from './sqlHelpers';
|
|
6
6
|
import { chooseAdaptiveRelationType, createOrReplaceResultRelation, } from './resultRelationPolicy';
|
|
7
7
|
import { isInputCell, isSqlCell, } from './types';
|
|
8
8
|
import { getEffectiveResultName, isDefined } from './utils';
|
|
@@ -20,15 +20,21 @@ export async function executeSqlCell(cellId, getState, set, options) {
|
|
|
20
20
|
: undefined;
|
|
21
21
|
const { schemaName, cascade = true, signal, setCellResult } = options;
|
|
22
22
|
const sqlRaw = cell.data.sql || '';
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
23
|
+
const artifactId = findArtifactIdForCell(state, cellId);
|
|
24
|
+
const artifact = artifactId
|
|
25
|
+
? state.cells.config.artifacts[artifactId]
|
|
26
|
+
: undefined;
|
|
27
|
+
const finalSchemaName = artifact
|
|
28
|
+
? resolveArtifactSchemaName(artifact)
|
|
29
|
+
: schemaName;
|
|
26
30
|
const finalDatabaseName = state.db.config.coreMaterialization.strategy === 'attached_ephemeral'
|
|
27
31
|
? state.db.config.coreMaterialization.attachedDatabaseName
|
|
28
32
|
: undefined;
|
|
29
|
-
const
|
|
33
|
+
const artifactCellIds = artifact?.cellIds ?? [];
|
|
30
34
|
// 1. Gather inputs for SQL rendering
|
|
31
|
-
const cellsInScope = (
|
|
35
|
+
const cellsInScope = (artifactCellIds.length
|
|
36
|
+
? artifactCellIds
|
|
37
|
+
: Object.keys(state.cells.config.data))
|
|
32
38
|
.map((id) => state.cells.config.data[id])
|
|
33
39
|
.filter(isDefined);
|
|
34
40
|
const inputs = cellsInScope
|
|
@@ -38,11 +44,11 @@ export async function executeSqlCell(cellId, getState, set, options) {
|
|
|
38
44
|
value: c.data.input.value,
|
|
39
45
|
}));
|
|
40
46
|
const renderedSql = renderSqlWithInputs(sqlRaw, inputs);
|
|
41
|
-
const sql =
|
|
47
|
+
const sql = qualifyArtifactLocalResultNames({
|
|
42
48
|
sql: renderedSql,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
artifactSchema: finalSchemaName,
|
|
50
|
+
artifactDatabase: finalDatabaseName,
|
|
51
|
+
artifactCellIds,
|
|
46
52
|
cells: state.cells.config.data,
|
|
47
53
|
getSqlResultName: (id) => {
|
|
48
54
|
const target = state.cells.config.data[id];
|
|
@@ -101,17 +107,17 @@ export async function executeSqlCell(cellId, getState, set, options) {
|
|
|
101
107
|
if (signal?.aborted)
|
|
102
108
|
throw new Error('Query cancelled');
|
|
103
109
|
await connector.query(`CREATE SCHEMA IF NOT EXISTS ${escapeId(finalSchemaName)}`, { signal });
|
|
104
|
-
tableName =
|
|
110
|
+
tableName = getRawSqlTableReference(db.qualifyTableName({
|
|
105
111
|
table: effectiveResultName,
|
|
106
112
|
schema: finalSchemaName,
|
|
107
113
|
database: db.currentDatabase,
|
|
108
|
-
})
|
|
114
|
+
}));
|
|
109
115
|
// Adaptive policy:
|
|
110
116
|
// - first run: choose table when there are downstream dependents,
|
|
111
117
|
// otherwise keep a lightweight view.
|
|
112
118
|
// - subsequent runs: preserve the previously selected relation type.
|
|
113
|
-
const hasDownstream = Boolean(
|
|
114
|
-
getState().cells.getDownstream(
|
|
119
|
+
const hasDownstream = Boolean(artifactId) &&
|
|
120
|
+
getState().cells.getDownstream(artifactId, cellId).length > 0;
|
|
115
121
|
relationType = chooseAdaptiveRelationType({
|
|
116
122
|
previousRelationType: previousStatus?.resultRelationType,
|
|
117
123
|
hasDownstream,
|
|
@@ -136,7 +142,8 @@ export async function executeSqlCell(cellId, getState, set, options) {
|
|
|
136
142
|
const s = getState().cells.status[id];
|
|
137
143
|
if (s?.type !== 'sql')
|
|
138
144
|
return undefined;
|
|
139
|
-
const
|
|
145
|
+
const sqlStatus = s;
|
|
146
|
+
const fromStatus = getUnqualifiedSqlIdentifier(sqlStatus.resultName);
|
|
140
147
|
if (fromStatus)
|
|
141
148
|
return fromStatus;
|
|
142
149
|
const currentCell = getState().cells.config.data[id];
|
|
@@ -170,9 +177,9 @@ export async function executeSqlCell(cellId, getState, set, options) {
|
|
|
170
177
|
}
|
|
171
178
|
// 5. Cascade if needed
|
|
172
179
|
if (cascade) {
|
|
173
|
-
const
|
|
174
|
-
if (
|
|
175
|
-
await state.cells.runDownstreamCascade(
|
|
180
|
+
const ownerArtifactId = findArtifactIdForCell(getState(), cellId);
|
|
181
|
+
if (ownerArtifactId) {
|
|
182
|
+
await state.cells.runDownstreamCascade(ownerArtifactId, cellId);
|
|
176
183
|
}
|
|
177
184
|
}
|
|
178
185
|
}
|
package/dist/execution.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import {escapeId, makeQualifiedTableName} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {\n findSheetIdForCell,\n getUnqualifiedSqlIdentifier,\n resolveSheetSchemaName,\n} from './helpers';\nimport {\n findSqlDependencies,\n qualifySheetLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport {\n chooseAdaptiveRelationType,\n createOrReplaceResultRelation,\n type ResultRelationType,\n} from './resultRelationPolicy';\nimport {\n isInputCell,\n isSqlCell,\n type CellResultData,\n type CellsRootState,\n type SqlCellData,\n type SqlCellStatus,\n} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nexport type ExecuteSqlCellOptions = {\n schemaName: string;\n cascade?: boolean;\n signal?: AbortSignal;\n setCellResult?: (id: string, data: CellResultData) => void;\n};\n\nexport async function executeSqlCell(\n cellId: string,\n getState: () => CellsRootState,\n set: (updater: (state: CellsRootState) => CellsRootState) => void,\n options: ExecuteSqlCellOptions,\n) {\n // Intentionally snapshot state/cell at trigger time so this run is stable.\n // Later store mutations do not alter this execution; re-read with getState()\n // explicitly if you need live data after awaits.\n const state = getState();\n const cell = state.cells.config.data[cellId];\n if (!cell || cell.type !== 'sql') return;\n const previousStatus =\n state.cells.status[cellId]?.type === 'sql'\n ? state.cells.status[cellId]\n : undefined;\n\n const {schemaName, cascade = true, signal, setCellResult} = options;\n const sqlRaw = cell.data.sql || '';\n const sheetId = findSheetIdForCell(state, cellId);\n const sheet = sheetId ? state.cells.config.sheets[sheetId] : undefined;\n const finalSchemaName = sheet ? resolveSheetSchemaName(sheet) : schemaName;\n const finalDatabaseName =\n state.db.config.coreMaterialization.strategy === 'attached_ephemeral'\n ? state.db.config.coreMaterialization.attachedDatabaseName\n : undefined;\n const sheetCellIds = sheet?.cellIds ?? [];\n\n // 1. Gather inputs for SQL rendering\n const cellsInScope = (\n sheetCellIds.length ? sheetCellIds : Object.keys(state.cells.config.data)\n )\n .map((id) => state.cells.config.data[id])\n .filter(isDefined);\n const inputs = cellsInScope\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value,\n }));\n\n const renderedSql = renderSqlWithInputs(sqlRaw, inputs);\n const sql = qualifySheetLocalResultNames({\n sql: renderedSql,\n sheetSchema: finalSchemaName,\n sheetDatabase: finalDatabaseName,\n sheetCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (id) => {\n const target = state.cells.config.data[id];\n if (!target || target.type !== 'sql') return undefined;\n return getEffectiveResultName(\n target.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 2. Update status to running\n set((s) =>\n produce(s, (draft) => {\n const previousStatus = draft.cells.status[cellId] as\n | SqlCellStatus\n | undefined;\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'running',\n // Keep previous result metadata so the table remains mounted while\n // a fresh query is running.\n resultName: previousStatus?.resultName,\n resultView: previousStatus?.resultView,\n resultRelationType: previousStatus?.resultRelationType,\n lastRunTime: previousStatus?.lastRunTime,\n referencedTables: previousStatus?.referencedTables || [],\n };\n }),\n );\n\n try {\n const db = state.db;\n const dbConnectors = state.db.connectors;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const selectedConnectorId = (cell.data as SqlCellData).connectorId;\n let tableName = '';\n let relationType: ResultRelationType = 'view';\n const connector = await db.getConnector();\n if (dbConnectors?.runQuery) {\n const routed = await dbConnectors.runQuery({\n connectionId: selectedConnectorId,\n sql,\n queryType: 'arrow',\n materialize: true,\n materializedName: effectiveResultName,\n materializedSchema: finalSchemaName,\n materializedDatabase: finalDatabaseName,\n signal,\n });\n if (!routed.relationName) {\n throw new Error('Query did not return a materialized relation');\n }\n tableName = routed.relationName;\n relationType = 'table';\n } else {\n const parsed = await db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(parsed.error_message || 'Not a valid SELECT statement');\n }\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${escapeId(finalSchemaName)}`,\n {signal},\n );\n\n tableName = makeQualifiedTableName({\n table: effectiveResultName,\n schema: finalSchemaName,\n database: db.currentDatabase,\n }).toString();\n // Adaptive policy:\n // - first run: choose table when there are downstream dependents,\n // otherwise keep a lightweight view.\n // - subsequent runs: preserve the previously selected relation type.\n const hasDownstream =\n Boolean(sheetId) &&\n getState().cells.getDownstream(sheetId as string, cellId).length > 0;\n relationType = chooseAdaptiveRelationType({\n previousRelationType: previousStatus?.resultRelationType,\n hasDownstream,\n });\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await createOrReplaceResultRelation({\n connector,\n relationName: tableName,\n relationType,\n sql,\n signal,\n });\n }\n\n // Find dependencies for referenced tables\n const referenced = findSqlDependencies({\n targetCell: cell,\n cells: Object.fromEntries(cellsInScope.map((c) => [c.id, c])),\n getSqlText: (c) => (isSqlCell(c) ? c.data.sql : undefined),\n getInputVarName: (c) =>\n isInputCell(c) ? c.data.input.varName : undefined,\n getSqlResultName: (id) => {\n const s = getState().cells.status[id];\n if (s?.type !== 'sql') return undefined;\n const fromStatus = getUnqualifiedSqlIdentifier(s.resultName);\n if (fromStatus) return fromStatus;\n\n const currentCell = getState().cells.config.data[id];\n if (currentCell?.type !== 'sql') return undefined;\n return getEffectiveResultName(\n currentCell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 3. Update status to success\n set((s) =>\n produce(s, (draft) => {\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'success',\n resultName: tableName,\n resultView: tableName,\n resultRelationType: relationType,\n referencedTables: referenced,\n lastRunTime: Date.now(),\n };\n }),\n );\n\n // 4. Fetch count + first page and store result\n if (setCellResult) {\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const countResult = await connector.query(\n `SELECT COUNT(*)::int AS count FROM ${tableName}`,\n {signal},\n );\n const totalRows = countResult.toArray()[0]?.count ?? 0;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const pageResult = await connector.query(\n `SELECT * FROM ${tableName} LIMIT ${DEFAULT_PAGE_SIZE}`,\n {signal},\n );\n\n setCellResult(cellId, {arrowTable: pageResult, totalRows});\n }\n\n // 5. Cascade if needed\n if (cascade) {\n const ownerSheetId = findSheetIdForCell(getState(), cellId);\n if (ownerSheetId) {\n await state.cells.runDownstreamCascade(ownerSheetId, cellId);\n }\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((s) =>\n produce(s, (draft) => {\n const status = draft.cells.status[cellId];\n if (status?.type === 'sql') {\n status.status = signal?.aborted ? 'cancel' : 'error';\n status.lastError = message;\n }\n }),\n );\n } finally {\n set((s) =>\n produce(s, (draft) => {\n delete draft.cells.activeAbortControllers[cellId];\n }),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import {escapeId, getRawSqlTableReference} from '@sqlrooms/duckdb';\nimport {convertToValidColumnOrTableName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {\n findArtifactIdForCell,\n getUnqualifiedSqlIdentifier,\n resolveArtifactSchemaName,\n} from './helpers';\nimport {\n findSqlDependencies,\n qualifyArtifactLocalResultNames,\n renderSqlWithInputs,\n} from './sqlHelpers';\nimport {\n chooseAdaptiveRelationType,\n createOrReplaceResultRelation,\n type ResultRelationType,\n} from './resultRelationPolicy';\nimport {\n isInputCell,\n isSqlCell,\n type CellResultData,\n type CellsRootState,\n type SqlCellData,\n type SqlCellStatus,\n} from './types';\nimport {getEffectiveResultName, isDefined} from './utils';\n\nconst DEFAULT_PAGE_SIZE = 10;\n\nexport type ExecuteSqlCellOptions = {\n schemaName: string;\n cascade?: boolean;\n signal?: AbortSignal;\n setCellResult?: (id: string, data: CellResultData) => void;\n};\n\nexport async function executeSqlCell(\n cellId: string,\n getState: () => CellsRootState,\n set: (updater: (state: CellsRootState) => CellsRootState) => void,\n options: ExecuteSqlCellOptions,\n) {\n // Intentionally snapshot state/cell at trigger time so this run is stable.\n // Later store mutations do not alter this execution; re-read with getState()\n // explicitly if you need live data after awaits.\n const state = getState();\n const cell = state.cells.config.data[cellId];\n if (!cell || cell.type !== 'sql') return;\n const previousStatus =\n state.cells.status[cellId]?.type === 'sql'\n ? (state.cells.status[cellId] as SqlCellStatus)\n : undefined;\n\n const {schemaName, cascade = true, signal, setCellResult} = options;\n const sqlRaw = cell.data.sql || '';\n const artifactId = findArtifactIdForCell(state, cellId);\n const artifact = artifactId\n ? state.cells.config.artifacts[artifactId]\n : undefined;\n const finalSchemaName = artifact\n ? resolveArtifactSchemaName(artifact)\n : schemaName;\n const finalDatabaseName =\n state.db.config.coreMaterialization.strategy === 'attached_ephemeral'\n ? state.db.config.coreMaterialization.attachedDatabaseName\n : undefined;\n const artifactCellIds = artifact?.cellIds ?? [];\n\n // 1. Gather inputs for SQL rendering\n const cellsInScope = (\n artifactCellIds.length\n ? artifactCellIds\n : Object.keys(state.cells.config.data)\n )\n .map((id) => state.cells.config.data[id])\n .filter(isDefined);\n const inputs = cellsInScope\n .filter((c) => isInputCell(c))\n .map((c) => ({\n varName: c.data.input.varName,\n value: c.data.input.value,\n }));\n\n const renderedSql = renderSqlWithInputs(sqlRaw, inputs);\n const sql = qualifyArtifactLocalResultNames({\n sql: renderedSql,\n artifactSchema: finalSchemaName,\n artifactDatabase: finalDatabaseName,\n artifactCellIds,\n cells: state.cells.config.data,\n getSqlResultName: (id) => {\n const target = state.cells.config.data[id];\n if (!target || target.type !== 'sql') return undefined;\n return getEffectiveResultName(\n target.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 2. Update status to running\n set((s) =>\n produce(s, (draft) => {\n const previousStatus = draft.cells.status[cellId] as\n | SqlCellStatus\n | undefined;\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'running',\n // Keep previous result metadata so the table remains mounted while\n // a fresh query is running.\n resultName: previousStatus?.resultName,\n resultView: previousStatus?.resultView,\n resultRelationType: previousStatus?.resultRelationType,\n lastRunTime: previousStatus?.lastRunTime,\n referencedTables: previousStatus?.referencedTables || [],\n };\n }),\n );\n\n try {\n const db = state.db;\n const dbConnectors = state.db.connectors;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const effectiveResultName = getEffectiveResultName(\n cell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n const selectedConnectorId = (cell.data as SqlCellData).connectorId;\n let tableName = '';\n let relationType: ResultRelationType = 'view';\n const connector = await db.getConnector();\n if (dbConnectors?.runQuery) {\n const routed = await dbConnectors.runQuery({\n connectionId: selectedConnectorId,\n sql,\n queryType: 'arrow',\n materialize: true,\n materializedName: effectiveResultName,\n materializedSchema: finalSchemaName,\n materializedDatabase: finalDatabaseName,\n signal,\n });\n if (!routed.relationName) {\n throw new Error('Query did not return a materialized relation');\n }\n tableName = routed.relationName;\n relationType = 'table';\n } else {\n const parsed = await db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(parsed.error_message || 'Not a valid SELECT statement');\n }\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${escapeId(finalSchemaName)}`,\n {signal},\n );\n\n tableName = getRawSqlTableReference(\n db.qualifyTableName({\n table: effectiveResultName,\n schema: finalSchemaName,\n database: db.currentDatabase,\n }),\n );\n // Adaptive policy:\n // - first run: choose table when there are downstream dependents,\n // otherwise keep a lightweight view.\n // - subsequent runs: preserve the previously selected relation type.\n const hasDownstream =\n Boolean(artifactId) &&\n getState().cells.getDownstream(artifactId as string, cellId).length > 0;\n relationType = chooseAdaptiveRelationType({\n previousRelationType: previousStatus?.resultRelationType,\n hasDownstream,\n });\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n await createOrReplaceResultRelation({\n connector,\n relationName: tableName,\n relationType,\n sql,\n signal,\n });\n }\n\n // Find dependencies for referenced tables\n const referenced = findSqlDependencies({\n targetCell: cell,\n cells: Object.fromEntries(cellsInScope.map((c) => [c.id, c])),\n getSqlText: (c) => (isSqlCell(c) ? c.data.sql : undefined),\n getInputVarName: (c) =>\n isInputCell(c) ? c.data.input.varName : undefined,\n getSqlResultName: (id) => {\n const s = getState().cells.status[id];\n if (s?.type !== 'sql') return undefined;\n const sqlStatus = s as SqlCellStatus;\n const fromStatus = getUnqualifiedSqlIdentifier(sqlStatus.resultName);\n if (fromStatus) return fromStatus;\n\n const currentCell = getState().cells.config.data[id];\n if (currentCell?.type !== 'sql') return undefined;\n return getEffectiveResultName(\n currentCell.data as SqlCellData,\n convertToValidColumnOrTableName,\n );\n },\n });\n\n // 3. Update status to success\n set((s) =>\n produce(s, (draft) => {\n draft.cells.status[cellId] = {\n type: 'sql',\n status: 'success',\n resultName: tableName,\n resultView: tableName,\n resultRelationType: relationType,\n referencedTables: referenced,\n lastRunTime: Date.now(),\n };\n }),\n );\n\n // 4. Fetch count + first page and store result\n if (setCellResult) {\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const countResult = await connector.query(\n `SELECT COUNT(*)::int AS count FROM ${tableName}`,\n {signal},\n );\n const totalRows = countResult.toArray()[0]?.count ?? 0;\n\n if (signal?.aborted) throw new Error('Query cancelled');\n\n const pageResult = await connector.query(\n `SELECT * FROM ${tableName} LIMIT ${DEFAULT_PAGE_SIZE}`,\n {signal},\n );\n\n setCellResult(cellId, {arrowTable: pageResult, totalRows});\n }\n\n // 5. Cascade if needed\n if (cascade) {\n const ownerArtifactId = findArtifactIdForCell(getState(), cellId);\n if (ownerArtifactId) {\n await state.cells.runDownstreamCascade(ownerArtifactId, cellId);\n }\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((s) =>\n produce(s, (draft) => {\n const status = draft.cells.status[cellId];\n if (status?.type === 'sql') {\n status.status = signal?.aborted ? 'cancel' : 'error';\n status.lastError = message;\n }\n }),\n );\n } finally {\n set((s) =>\n produce(s, (draft) => {\n delete draft.cells.activeAbortControllers[cellId];\n }),\n );\n }\n}\n"]}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -1,45 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { QualifiedTableName } from '@sqlrooms/db';
|
|
2
|
+
import { Cell, CellDependencies, CellRegistry, CellsRootState, CellsSliceConfig, SqlCell, SqlSelectToJsonFn, CellArtifactRuntime } from './types';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
+
* Normalizes the result of `findDependencies` to a `CellDependencies` object.
|
|
5
|
+
* Accepts either the legacy `string[]` (cell IDs only) or the new `CellDependencies` shape.
|
|
4
6
|
*/
|
|
5
|
-
export declare function
|
|
7
|
+
export declare function normalizeCellDependencies(result: string[] | CellDependencies): CellDependencies;
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
9
|
+
* Helper to resolve dependencies using the registry's async AST-based resolver.
|
|
8
10
|
*/
|
|
9
|
-
export declare function
|
|
11
|
+
export declare function resolveDependencies(cell: Cell, cells: Record<string, Cell>, artifactId: string, registry: CellRegistry, sqlSelectToJson: SqlSelectToJsonFn): Promise<CellDependencies>;
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
13
|
+
* Finds the artifact ID that contains the given cell ID.
|
|
12
14
|
*/
|
|
13
|
-
export declare function
|
|
15
|
+
export declare function findArtifactIdForCell(state: Pick<CellsRootState, 'cells'>, cellId: string): string | undefined;
|
|
14
16
|
/**
|
|
15
17
|
* Required accessor for SQL AST parser used in dependency derivation.
|
|
16
18
|
*/
|
|
17
19
|
export declare function getRequiredSqlSelectToJson(state: CellsRootState): SqlSelectToJsonFn;
|
|
18
20
|
/**
|
|
19
|
-
* Normalizes
|
|
21
|
+
* Normalizes artifact runtime entries in a partial cells config.
|
|
20
22
|
*
|
|
21
23
|
* This enforces internal invariants before the config is applied:
|
|
22
|
-
* - `
|
|
23
|
-
* - `sheetOrder` only contains existing sheet ids and includes every sheet.
|
|
24
|
-
* - `currentSheetId` always points to an existing sheet.
|
|
25
|
-
*
|
|
26
|
-
* Non-structural fields are preserved by the caller when merging.
|
|
27
|
-
*/
|
|
28
|
-
export declare function normalizeCellsConfigStructure(config: Partial<CellsSliceConfig>, defaultConfig: CellsSliceConfig): Pick<CellsSliceConfig, 'sheets' | 'sheetOrder' | 'currentSheetId'>;
|
|
29
|
-
/**
|
|
30
|
-
* Returns the final identifier segment from a possibly-qualified SQL name.
|
|
31
|
-
*
|
|
32
|
-
* The parser is quote-aware: dots inside double-quoted identifiers are treated
|
|
33
|
-
* as part of the identifier rather than as qualification separators.
|
|
34
|
-
*
|
|
35
|
-
* Examples:
|
|
36
|
-
* - `schema.table` -> `table`
|
|
37
|
-
* - `db.schema.table` -> `table`
|
|
38
|
-
* - `schema."my.funny.table"` -> `my.funny.table`
|
|
24
|
+
* - `artifacts` always has stable ids that match the record keys.
|
|
39
25
|
*/
|
|
40
|
-
export declare function
|
|
26
|
+
export declare function normalizeCellsConfigStructure(config: Partial<CellsSliceConfig>): Pick<CellsSliceConfig, 'artifacts'>;
|
|
27
|
+
export { getUnqualifiedSqlIdentifier } from '@sqlrooms/duckdb';
|
|
41
28
|
/**
|
|
42
|
-
* Resolves the schema name for
|
|
29
|
+
* Resolves the schema name for an artifact runtime, falling back to a stable id-based name.
|
|
43
30
|
*/
|
|
44
|
-
export declare function
|
|
31
|
+
export declare function resolveArtifactSchemaName(artifact: Pick<CellArtifactRuntime, 'id' | 'schemaName'>): string;
|
|
32
|
+
export declare function toDataSourceCell(cell: SqlCell | string): string;
|
|
33
|
+
export declare function toDataSourceTable(table: QualifiedTableName | string): string;
|
|
34
|
+
export declare function isDataSourceCell(value: string): boolean;
|
|
35
|
+
export declare function isDataSourceTable(value: string): boolean;
|
|
36
|
+
export declare function fromDataSourceCell(value: string): string | undefined;
|
|
37
|
+
export declare function fromDataSourceTable(value: string): string | undefined;
|
|
45
38
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAGjB;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,GAClC,gBAAgB,CAKlB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,EACtB,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAU3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,EACpC,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CASpB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,GACpB,iBAAiB,CAQnB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAChC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAcrC;AAED,OAAO,EAAC,2BAA2B,EAAC,MAAM,kBAAkB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,YAAY,CAAC,UAGzD;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAI/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAgB5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKpE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE"}
|