@nshiab/simple-data-analysis-core 2.0.5 → 2.0.7
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 +118 -12
- package/esm/class/Simple.d.ts +8 -2
- package/esm/class/Simple.d.ts.map +1 -1
- package/esm/class/Simple.js +9 -3
- package/esm/class/SimpleDB.d.ts +72 -1
- package/esm/class/SimpleDB.d.ts.map +1 -1
- package/esm/class/SimpleDB.js +81 -1
- package/esm/class/SimpleTable.d.ts +271 -288
- package/esm/class/SimpleTable.d.ts.map +1 -1
- package/esm/class/SimpleTable.js +269 -340
- package/esm/helpers/LogValue.d.ts +8 -0
- package/esm/helpers/LogValue.d.ts.map +1 -0
- package/esm/helpers/LogValue.js +23 -0
- package/esm/helpers/cacheTableDependencies.d.ts +9 -0
- package/esm/helpers/cacheTableDependencies.d.ts.map +1 -1
- package/esm/helpers/cacheTableDependencies.js +131 -21
- package/esm/helpers/cleanSQL.d.ts +1 -1
- package/esm/helpers/cleanSQL.d.ts.map +1 -1
- package/esm/helpers/cleanSQL.js +268 -23
- package/esm/helpers/flushAllTables.d.ts.map +1 -1
- package/esm/helpers/flushAllTables.js +23 -28
- package/esm/helpers/foldIdentifier.d.ts +3 -0
- package/esm/helpers/foldIdentifier.d.ts.map +1 -0
- package/esm/helpers/foldIdentifier.js +4 -0
- package/esm/helpers/geometryFromJSON.d.ts +3 -0
- package/esm/helpers/geometryFromJSON.d.ts.map +1 -0
- package/esm/helpers/geometryFromJSON.js +4 -0
- package/esm/helpers/index.d.ts +1 -0
- package/esm/helpers/index.d.ts.map +1 -1
- package/esm/helpers/index.js +1 -0
- package/esm/helpers/logData.d.ts.map +1 -1
- package/esm/helpers/logData.js +45 -44
- package/esm/helpers/makeLogConverter.d.ts +5 -0
- package/esm/helpers/makeLogConverter.d.ts.map +1 -0
- package/esm/helpers/makeLogConverter.js +64 -0
- package/esm/helpers/osmFiles.d.ts.map +1 -1
- package/esm/helpers/parseTypes.d.ts +1 -1
- package/esm/helpers/parseTypes.d.ts.map +1 -1
- package/esm/helpers/parseTypes.js +4 -0
- package/esm/helpers/pendingOps.d.ts +4 -2
- package/esm/helpers/pendingOps.d.ts.map +1 -1
- package/esm/helpers/prepareGeometry.d.ts +3 -0
- package/esm/helpers/prepareGeometry.d.ts.map +1 -0
- package/esm/helpers/prepareGeometry.js +99 -0
- package/esm/helpers/prepareJSON.d.ts +3 -0
- package/esm/helpers/prepareJSON.d.ts.map +1 -0
- package/esm/helpers/prepareJSON.js +50 -0
- package/esm/helpers/printTable.d.ts +5 -4
- package/esm/helpers/printTable.d.ts.map +1 -1
- package/esm/helpers/printTable.js +32 -36
- package/esm/helpers/queryDB.js +1 -1
- package/esm/helpers/queueAsyncBarrier.d.ts +4 -0
- package/esm/helpers/queueAsyncBarrier.d.ts.map +1 -1
- package/esm/helpers/queueAsyncBarrier.js +4 -0
- package/esm/helpers/queueOp.d.ts.map +1 -1
- package/esm/helpers/queueOp.js +5 -3
- package/esm/helpers/readMutationRows.d.ts +9 -0
- package/esm/helpers/readMutationRows.d.ts.map +1 -0
- package/esm/helpers/readMutationRows.js +94 -0
- package/esm/helpers/referencedTables.d.ts +9 -0
- package/esm/helpers/referencedTables.d.ts.map +1 -0
- package/esm/helpers/referencedTables.js +22 -0
- package/esm/helpers/runQuery.d.ts.map +1 -1
- package/esm/helpers/runQuery.js +11 -13
- package/esm/helpers/scanSQL.d.ts +7 -0
- package/esm/helpers/scanSQL.d.ts.map +1 -0
- package/esm/helpers/scanSQL.js +71 -0
- package/esm/helpers/tableRegistry.d.ts +2 -0
- package/esm/helpers/tableRegistry.d.ts.map +1 -1
- package/esm/helpers/tableRegistry.js +12 -4
- package/esm/helpers/updateColumnsWithJS.d.ts +52 -0
- package/esm/helpers/updateColumnsWithJS.d.ts.map +1 -0
- package/esm/helpers/updateColumnsWithJS.js +139 -0
- package/esm/methods/addColumn.d.ts +1 -1
- package/esm/methods/addColumn.d.ts.map +1 -1
- package/esm/methods/bins.d.ts +1 -1
- package/esm/methods/bins.d.ts.map +1 -1
- package/esm/methods/bins.js +45 -29
- package/esm/methods/bm25.d.ts.map +1 -1
- package/esm/methods/bm25.js +1 -2
- package/esm/methods/cache.d.ts.map +1 -1
- package/esm/methods/cache.js +4 -6
- package/esm/methods/convert.d.ts +2 -2
- package/esm/methods/convert.d.ts.map +1 -1
- package/esm/methods/convert.js +5 -0
- package/esm/methods/getBottom.d.ts +1 -1
- package/esm/methods/getBottom.d.ts.map +1 -1
- package/esm/methods/getBottom.js +2 -2
- package/esm/methods/getData.d.ts +1 -1
- package/esm/methods/getData.d.ts.map +1 -1
- package/esm/methods/getData.js +2 -2
- package/esm/methods/join.d.ts.map +1 -1
- package/esm/methods/join.js +8 -16
- package/esm/methods/joinGeo.d.ts.map +1 -1
- package/esm/methods/joinGeo.js +10 -19
- package/esm/methods/loadArray.d.ts +1 -1
- package/esm/methods/loadArray.d.ts.map +1 -1
- package/esm/methods/loadArray.js +74 -19
- package/esm/methods/loadData.js +3 -0
- package/esm/methods/log.d.ts +7 -0
- package/esm/methods/log.d.ts.map +1 -0
- package/esm/methods/log.js +63 -0
- package/esm/methods/logBottom.d.ts +5 -0
- package/esm/methods/logBottom.d.ts.map +1 -0
- package/esm/methods/logBottom.js +9 -0
- package/esm/methods/removeTable.d.ts.map +1 -1
- package/esm/methods/removeTable.js +2 -0
- package/esm/methods/removeTables.d.ts.map +1 -1
- package/esm/methods/removeTables.js +7 -0
- package/esm/methods/renameTable.d.ts.map +1 -1
- package/esm/methods/renameTable.js +4 -0
- package/esm/methods/rowToText.js +2 -2
- package/esm/methods/selectTables.d.ts.map +1 -1
- package/esm/methods/selectTables.js +6 -0
- package/esm/methods/setTypes.d.ts +1 -1
- package/esm/methods/setTypes.d.ts.map +1 -1
- package/esm/methods/stream.d.ts.map +1 -1
- package/esm/methods/stream.js +2 -1
- package/esm/methods/updateWithJS.d.ts +1 -3
- package/esm/methods/updateWithJS.d.ts.map +1 -1
- package/esm/methods/updateWithJS.js +123 -37
- package/llm.md +365 -461
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/script/class/Simple.d.ts +8 -2
- package/script/class/Simple.d.ts.map +1 -1
- package/script/class/Simple.js +9 -3
- package/script/class/SimpleDB.d.ts +72 -1
- package/script/class/SimpleDB.d.ts.map +1 -1
- package/script/class/SimpleDB.js +81 -1
- package/script/class/SimpleTable.d.ts +271 -288
- package/script/class/SimpleTable.d.ts.map +1 -1
- package/script/class/SimpleTable.js +269 -340
- package/script/helpers/LogValue.d.ts +8 -0
- package/script/helpers/LogValue.d.ts.map +1 -0
- package/script/helpers/LogValue.js +26 -0
- package/script/helpers/cacheTableDependencies.d.ts +9 -0
- package/script/helpers/cacheTableDependencies.d.ts.map +1 -1
- package/script/helpers/cacheTableDependencies.js +170 -20
- package/script/helpers/cleanSQL.d.ts +1 -1
- package/script/helpers/cleanSQL.d.ts.map +1 -1
- package/script/helpers/cleanSQL.js +271 -23
- package/script/helpers/flushAllTables.d.ts.map +1 -1
- package/script/helpers/flushAllTables.js +24 -29
- package/script/helpers/foldIdentifier.d.ts +3 -0
- package/script/helpers/foldIdentifier.d.ts.map +1 -0
- package/script/helpers/foldIdentifier.js +7 -0
- package/script/helpers/geometryFromJSON.d.ts +3 -0
- package/script/helpers/geometryFromJSON.d.ts.map +1 -0
- package/script/helpers/geometryFromJSON.js +7 -0
- package/script/helpers/index.d.ts +1 -0
- package/script/helpers/index.d.ts.map +1 -1
- package/script/helpers/index.js +3 -1
- package/script/helpers/logData.d.ts.map +1 -1
- package/script/helpers/logData.js +45 -44
- package/script/helpers/makeLogConverter.d.ts +5 -0
- package/script/helpers/makeLogConverter.d.ts.map +1 -0
- package/script/helpers/makeLogConverter.js +70 -0
- package/script/helpers/osmFiles.d.ts.map +1 -1
- package/script/helpers/parseTypes.d.ts +1 -1
- package/script/helpers/parseTypes.d.ts.map +1 -1
- package/script/helpers/parseTypes.js +4 -0
- package/script/helpers/pendingOps.d.ts +4 -2
- package/script/helpers/pendingOps.d.ts.map +1 -1
- package/script/helpers/prepareGeometry.d.ts +3 -0
- package/script/helpers/prepareGeometry.d.ts.map +1 -0
- package/script/helpers/prepareGeometry.js +102 -0
- package/script/helpers/prepareJSON.d.ts +3 -0
- package/script/helpers/prepareJSON.d.ts.map +1 -0
- package/script/helpers/prepareJSON.js +53 -0
- package/script/helpers/printTable.d.ts +5 -4
- package/script/helpers/printTable.d.ts.map +1 -1
- package/script/helpers/printTable.js +32 -36
- package/script/helpers/queryDB.js +1 -1
- package/script/helpers/queueAsyncBarrier.d.ts +4 -0
- package/script/helpers/queueAsyncBarrier.d.ts.map +1 -1
- package/script/helpers/queueAsyncBarrier.js +4 -0
- package/script/helpers/queueOp.d.ts.map +1 -1
- package/script/helpers/queueOp.js +4 -2
- package/script/helpers/readMutationRows.d.ts +9 -0
- package/script/helpers/readMutationRows.d.ts.map +1 -0
- package/script/helpers/readMutationRows.js +97 -0
- package/script/helpers/referencedTables.d.ts +9 -0
- package/script/helpers/referencedTables.d.ts.map +1 -0
- package/script/helpers/referencedTables.js +28 -0
- package/script/helpers/runQuery.d.ts.map +1 -1
- package/script/helpers/runQuery.js +11 -13
- package/script/helpers/scanSQL.d.ts +7 -0
- package/script/helpers/scanSQL.d.ts.map +1 -0
- package/script/helpers/scanSQL.js +74 -0
- package/script/helpers/tableRegistry.d.ts +2 -0
- package/script/helpers/tableRegistry.d.ts.map +1 -1
- package/script/helpers/tableRegistry.js +16 -4
- package/script/helpers/updateColumnsWithJS.d.ts +52 -0
- package/script/helpers/updateColumnsWithJS.d.ts.map +1 -0
- package/script/helpers/updateColumnsWithJS.js +145 -0
- package/script/methods/addColumn.d.ts +1 -1
- package/script/methods/addColumn.d.ts.map +1 -1
- package/script/methods/bins.d.ts +1 -1
- package/script/methods/bins.d.ts.map +1 -1
- package/script/methods/bins.js +45 -29
- package/script/methods/bm25.d.ts.map +1 -1
- package/script/methods/bm25.js +1 -2
- package/script/methods/cache.d.ts.map +1 -1
- package/script/methods/cache.js +3 -5
- package/script/methods/convert.d.ts +2 -2
- package/script/methods/convert.d.ts.map +1 -1
- package/script/methods/convert.js +5 -0
- package/script/methods/getBottom.d.ts +1 -1
- package/script/methods/getBottom.d.ts.map +1 -1
- package/script/methods/getBottom.js +2 -2
- package/script/methods/getData.d.ts +1 -1
- package/script/methods/getData.d.ts.map +1 -1
- package/script/methods/getData.js +2 -2
- package/script/methods/join.d.ts.map +1 -1
- package/script/methods/join.js +8 -16
- package/script/methods/joinGeo.d.ts.map +1 -1
- package/script/methods/joinGeo.js +10 -19
- package/script/methods/loadArray.d.ts +1 -1
- package/script/methods/loadArray.d.ts.map +1 -1
- package/script/methods/loadArray.js +74 -19
- package/script/methods/loadData.js +3 -0
- package/script/methods/log.d.ts +7 -0
- package/script/methods/log.d.ts.map +1 -0
- package/script/methods/log.js +69 -0
- package/script/methods/logBottom.d.ts +5 -0
- package/script/methods/logBottom.d.ts.map +1 -0
- package/script/methods/logBottom.js +15 -0
- package/script/methods/removeTable.d.ts.map +1 -1
- package/script/methods/removeTable.js +2 -0
- package/script/methods/removeTables.d.ts.map +1 -1
- package/script/methods/removeTables.js +7 -0
- package/script/methods/renameTable.d.ts.map +1 -1
- package/script/methods/renameTable.js +4 -0
- package/script/methods/rowToText.js +2 -2
- package/script/methods/selectTables.d.ts.map +1 -1
- package/script/methods/selectTables.js +6 -0
- package/script/methods/setTypes.d.ts +1 -1
- package/script/methods/setTypes.d.ts.map +1 -1
- package/script/methods/stream.d.ts.map +1 -1
- package/script/methods/stream.js +2 -1
- package/script/methods/updateWithJS.d.ts +1 -3
- package/script/methods/updateWithJS.d.ts.map +1 -1
- package/script/methods/updateWithJS.js +122 -36
|
@@ -4,10 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.default = updateWithJS;
|
|
7
|
+
const prepareGeometry_js_1 = __importDefault(require("../helpers/prepareGeometry.js"));
|
|
8
|
+
const geometryFromJSON_js_1 = __importDefault(require("../helpers/geometryFromJSON.js"));
|
|
7
9
|
const quoteIdentifier_js_1 = __importDefault(require("../helpers/quoteIdentifier.js"));
|
|
8
10
|
const tableRegistry_js_1 = require("../helpers/tableRegistry.js");
|
|
9
11
|
const queueOp_js_1 = __importDefault(require("../helpers/queueOp.js"));
|
|
10
12
|
const loadArray_js_1 = require("./loadArray.js");
|
|
13
|
+
const node_api_1 = require("@duckdb/node-api");
|
|
14
|
+
const readMutationRows_js_1 = __importDefault(require("../helpers/readMutationRows.js"));
|
|
15
|
+
const parseDuckDBType_js_1 = __importDefault(require("../helpers/parseDuckDBType.js"));
|
|
11
16
|
function updateWithJS(simpleTable, dataModifier, options = {}) {
|
|
12
17
|
if (options.batchSize !== undefined &&
|
|
13
18
|
(!Number.isInteger(options.batchSize) || options.batchSize < 1)) {
|
|
@@ -23,39 +28,35 @@ function updateWithJS(simpleTable, dataModifier, options = {}) {
|
|
|
23
28
|
}
|
|
24
29
|
async function executeUpdateWithJS(simpleTable, dataModifier, options) {
|
|
25
30
|
const types = await simpleTable.getTypes();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (options.batchSize === undefined) {
|
|
31
|
-
const oldData = await simpleTable.getData();
|
|
32
|
-
if (!oldData) {
|
|
33
|
-
throw new Error("No data from getData.");
|
|
31
|
+
const geometryColumns = Object.keys(types).filter((key) => types[key].toUpperCase().startsWith("GEOMETRY"));
|
|
32
|
+
for (const column of geometryColumns) {
|
|
33
|
+
if (types[column].toUpperCase() !== "GEOMETRY('EPSG:4326')") {
|
|
34
|
+
throw new Error(`Column ${JSON.stringify(column)} has CRS ${types[column]}. Call .reproject("EPSG:4326", { column: ${JSON.stringify(column)} }) before updateWithJS().`);
|
|
34
35
|
}
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
const name = (0, quoteIdentifier_js_1.default)(column);
|
|
37
|
+
// Compare the actual binary representation, including dimensions and double
|
|
38
|
+
// precision, rather than assuming GeoJSON serialization is lossless.
|
|
39
|
+
const result = await simpleTable.connection.runAndReadAll(`SELECT count(*) AS invalid FROM ${(0, quoteIdentifier_js_1.default)(simpleTable.name)}
|
|
40
|
+
WHERE ${name} IS NOT NULL AND
|
|
41
|
+
ST_AsWKB(${name}) != ST_AsWKB(${(0, geometryFromJSON_js_1.default)(`ST_AsGeoJSON(${name})`)})`);
|
|
42
|
+
if (result.getRows()[0][0] !== 0n) {
|
|
43
|
+
throw new Error(`Column ${JSON.stringify(column)} contains geometry that cannot round-trip through GeoJSON without losing precision or dimensions; unsupported representations cannot be updated with updateWithJS().`);
|
|
42
44
|
}
|
|
43
|
-
await (0, loadArray_js_1.executePreparedArray)(simpleTable, (0, loadArray_js_1.prepareArray)(newData));
|
|
44
|
-
return;
|
|
45
45
|
}
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
for (const key of Object.keys(options.columnTypes ?? {})) {
|
|
47
|
+
if (Object.keys(types).some((name) => name.toLowerCase() === key.toLowerCase())) {
|
|
48
|
+
throw new Error(`updateWithJS() columnTypes may only declare new columns; ${JSON.stringify(key)} already exists.`);
|
|
49
|
+
}
|
|
49
50
|
}
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
const batchSize = options.batchSize;
|
|
52
|
+
const geometryBatch = batchSize !== undefined && geometryColumns.length > 0;
|
|
53
|
+
if (batchSize !== undefined) {
|
|
54
|
+
// DuckDB resolves identifiers case-insensitively, and a real rowid column
|
|
55
|
+
// shadows its hidden row identifier used for pagination.
|
|
56
|
+
const conflictingColumn = Object.keys(types).find((column) => ["rowid", "__sda_rowid"].includes(column.toLowerCase()));
|
|
57
|
+
if (conflictingColumn !== undefined) {
|
|
58
|
+
throw new Error(`The table has a column named "${conflictingColumn}", which conflicts with the internal column used by the batchSize option. Rename it or run updateWithJS without batchSize.`);
|
|
56
59
|
}
|
|
57
|
-
await (0, loadArray_js_1.executePreparedArray)(simpleTable, (0, loadArray_js_1.prepareArray)(newData));
|
|
58
|
-
return;
|
|
59
60
|
}
|
|
60
61
|
// Rows are pulled in batches by rowid, passed through the modifier, and
|
|
61
62
|
// accumulated in a temporary table, so only one batch of rows is
|
|
@@ -66,27 +67,112 @@ async function executeUpdateWithJS(simpleTable, dataModifier, options) {
|
|
|
66
67
|
try {
|
|
67
68
|
let first = true;
|
|
68
69
|
let lastRowid = null;
|
|
70
|
+
let sawRows = false;
|
|
71
|
+
let outputOffset = 0;
|
|
72
|
+
let inputOffset = 0;
|
|
69
73
|
while (true) {
|
|
70
|
-
const
|
|
71
|
-
|
|
74
|
+
const page = `${(0, quoteIdentifier_js_1.default)(simpleTable.name)}${lastRowid === null ? "" : ` WHERE rowid > ${lastRowid}`}${batchSize === undefined ? "" : ` ORDER BY rowid LIMIT ${batchSize}`}`;
|
|
75
|
+
// Select the batch before serializing geometry. Otherwise DuckDB can
|
|
76
|
+
// evaluate ST_AsGeoJSON on remaining rows before applying the LIMIT,
|
|
77
|
+
// repeatedly converting polygons that belong to later batches.
|
|
78
|
+
const from = geometryBatch
|
|
79
|
+
? `(SELECT *, rowid AS __sda_rowid FROM ${page}) AS __sda_batch ORDER BY __sda_rowid`
|
|
80
|
+
: page;
|
|
81
|
+
const source = await (0, readMutationRows_js_1.default)(simpleTable.connection, `SELECT ${Object.keys(types).map((key) => geometryColumns.includes(key)
|
|
82
|
+
? `ST_AsGeoJSON(${(0, quoteIdentifier_js_1.default)(key)})::VARCHAR AS ${(0, quoteIdentifier_js_1.default)(key)}`
|
|
83
|
+
: (0, quoteIdentifier_js_1.default)(key)).join(", ")}${batchSize === undefined
|
|
84
|
+
? ""
|
|
85
|
+
: geometryBatch
|
|
86
|
+
? ", __sda_rowid"
|
|
87
|
+
: ", rowid AS __sda_rowid"} FROM ${from}`, batchSize === undefined ? undefined : "__sda_rowid");
|
|
88
|
+
const batch = source.rows;
|
|
89
|
+
const inputCount = batch.length;
|
|
90
|
+
if (inputCount === 0 && sawRows)
|
|
72
91
|
break;
|
|
92
|
+
sawRows ||= inputCount > 0;
|
|
93
|
+
if (batchSize !== undefined && batch.length > 0) {
|
|
94
|
+
// Keep the cursor separate: adding and deleting it on every row also
|
|
95
|
+
// makes ordinary callback operations such as object spread slower.
|
|
96
|
+
lastRowid = source.lastCursorValue;
|
|
73
97
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
98
|
+
for (const [index, row] of batch.entries()) {
|
|
99
|
+
for (const key of geometryColumns) {
|
|
100
|
+
row[key] = row[key] === null ? null : JSON.parse(row[key]);
|
|
101
|
+
(0, prepareGeometry_js_1.default)(row[key], key, inputOffset + index + 1);
|
|
102
|
+
}
|
|
77
103
|
}
|
|
104
|
+
inputOffset += inputCount;
|
|
78
105
|
const modified = await dataModifier(batch);
|
|
79
106
|
if (modified.length === 0) {
|
|
107
|
+
if (!sawRows)
|
|
108
|
+
return;
|
|
109
|
+
if (batchSize === undefined)
|
|
110
|
+
break;
|
|
80
111
|
continue;
|
|
81
112
|
}
|
|
82
|
-
|
|
113
|
+
const keys = Object.keys(modified[0]);
|
|
114
|
+
for (const key of Object.keys(options.columnTypes ?? {})) {
|
|
115
|
+
if (!keys.includes(key)) {
|
|
116
|
+
throw new Error(`Unknown column ${JSON.stringify(key)} in updateWithJS columnTypes.`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const newKeys = keys.filter((key) => !source.types.has(key));
|
|
120
|
+
const added = newKeys.length === 0 ? undefined : (0, loadArray_js_1.prepareArray)(modified.map((row) => Object.fromEntries(newKeys.map((key) => [key, row[key]]))), options.columnTypes);
|
|
121
|
+
const outputGeometry = keys.filter((key) => geometryColumns.includes(key) ||
|
|
122
|
+
(added && added.types[newKeys.indexOf(key)] === "GEOMETRY('EPSG:4326')"));
|
|
123
|
+
const outputJSON = keys.filter((key) => types[key] === "JSON" ||
|
|
124
|
+
(added && added.types[newKeys.indexOf(key)] === "JSON"));
|
|
125
|
+
if (outputGeometry.length && !simpleTable.sdb.spatialLoaded) {
|
|
126
|
+
await simpleTable.sdb.customQuery("INSTALL spatial; LOAD spatial; SET geometry_always_xy = true;");
|
|
127
|
+
simpleTable.sdb.spatialLoaded = true;
|
|
128
|
+
}
|
|
129
|
+
const geometryData = new Map(outputGeometry.map((key) => [
|
|
130
|
+
key,
|
|
131
|
+
geometryColumns.includes(key)
|
|
132
|
+
? modified.map((row, i) => (0, prepareGeometry_js_1.default)(row[key], key, outputOffset + i + 1))
|
|
133
|
+
: added.columnsData[newKeys.indexOf(key)],
|
|
134
|
+
]));
|
|
135
|
+
outputOffset += modified.length;
|
|
136
|
+
const columnTypes = keys.map((key) => outputGeometry.includes(key) || outputJSON.includes(key)
|
|
137
|
+
? (0, parseDuckDBType_js_1.default)("VARCHAR")
|
|
138
|
+
: source.types.get(key) ??
|
|
139
|
+
(0, parseDuckDBType_js_1.default)(added.types[newKeys.indexOf(key)]));
|
|
140
|
+
await simpleTable.sdb.customQuery(`CREATE OR REPLACE TABLE ${(0, quoteIdentifier_js_1.default)(scratch.name)} (${keys.map((key, i) => `${(0, quoteIdentifier_js_1.default)(key)} ${columnTypes[i]}`)
|
|
141
|
+
.join(", ")})`);
|
|
142
|
+
const appender = await simpleTable.connection.createAppender(scratch.name);
|
|
143
|
+
try {
|
|
144
|
+
for (let start = 0; start < modified.length; start += 2000) {
|
|
145
|
+
const end = Math.min(start + 2000, modified.length);
|
|
146
|
+
const chunk = node_api_1.DuckDBDataChunk.create(columnTypes, end - start);
|
|
147
|
+
for (let i = 0; i < keys.length; i++) {
|
|
148
|
+
const key = keys[i];
|
|
149
|
+
chunk.setColumnValues(i, outputGeometry.includes(key)
|
|
150
|
+
? geometryData.get(key).slice(start, end)
|
|
151
|
+
: source.types.has(key)
|
|
152
|
+
? modified.slice(start, end).map((row) => source.toNative(row[key], columnTypes[i]))
|
|
153
|
+
: added.columnsData[newKeys.indexOf(key)].slice(start, end));
|
|
154
|
+
}
|
|
155
|
+
appender.appendDataChunk(chunk);
|
|
156
|
+
}
|
|
157
|
+
appender.flushSync();
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
appender.closeSync();
|
|
161
|
+
}
|
|
162
|
+
const projection = keys.map((key) => outputGeometry.includes(key)
|
|
163
|
+
? `${(0, geometryFromJSON_js_1.default)((0, quoteIdentifier_js_1.default)(key))} AS ${(0, quoteIdentifier_js_1.default)(key)}`
|
|
164
|
+
: outputJSON.includes(key)
|
|
165
|
+
? `${(0, quoteIdentifier_js_1.default)(key)}::JSON AS ${(0, quoteIdentifier_js_1.default)(key)}`
|
|
166
|
+
: (0, quoteIdentifier_js_1.default)(key)).join(", ");
|
|
83
167
|
if (first) {
|
|
84
|
-
await simpleTable.sdb.customQuery(`CREATE OR REPLACE TABLE ${(0, quoteIdentifier_js_1.default)(accumulator)} AS SELECT
|
|
168
|
+
await simpleTable.sdb.customQuery(`CREATE OR REPLACE TABLE ${(0, quoteIdentifier_js_1.default)(accumulator)} AS SELECT ${projection} FROM ${(0, quoteIdentifier_js_1.default)(scratch.name)}`);
|
|
85
169
|
first = false;
|
|
86
170
|
}
|
|
87
171
|
else {
|
|
88
|
-
await simpleTable.sdb.customQuery(`INSERT INTO ${(0, quoteIdentifier_js_1.default)(accumulator)} BY NAME SELECT
|
|
172
|
+
await simpleTable.sdb.customQuery(`INSERT INTO ${(0, quoteIdentifier_js_1.default)(accumulator)} BY NAME SELECT ${projection} FROM ${(0, quoteIdentifier_js_1.default)(scratch.name)}`);
|
|
89
173
|
}
|
|
174
|
+
if (batchSize === undefined || inputCount === 0)
|
|
175
|
+
break;
|
|
90
176
|
}
|
|
91
177
|
if (first) {
|
|
92
178
|
throw new Error("The dataModifier returned no rows. updateWithJS can't infer the table schema from zero rows.");
|