@sqlrooms/duckdb 0.8.1 → 0.9.1
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/dist/DuckDbSlice.d.ts +106 -0
- package/dist/DuckDbSlice.d.ts.map +1 -0
- package/dist/DuckDbSlice.js +152 -0
- package/dist/DuckDbSlice.js.map +1 -0
- package/dist/connectors/DuckDbConnector.d.ts +40 -0
- package/dist/connectors/DuckDbConnector.d.ts.map +1 -0
- package/dist/connectors/DuckDbConnector.js +2 -0
- package/dist/connectors/DuckDbConnector.js.map +1 -0
- package/dist/connectors/WasmDuckDbConnector.d.ts +44 -0
- package/dist/connectors/WasmDuckDbConnector.d.ts.map +1 -0
- package/dist/connectors/WasmDuckDbConnector.js +210 -0
- package/dist/connectors/WasmDuckDbConnector.js.map +1 -0
- package/dist/connectors/load/create.d.ts +33 -0
- package/dist/connectors/load/create.d.ts.map +1 -0
- package/dist/connectors/load/create.js +33 -0
- package/dist/connectors/load/create.js.map +1 -0
- package/dist/connectors/load/load.d.ts +55 -0
- package/dist/connectors/load/load.d.ts.map +1 -0
- package/dist/connectors/load/load.js +147 -0
- package/dist/connectors/load/load.js.map +1 -0
- package/dist/connectors/load/sql-from.d.ts.map +1 -0
- package/dist/{sql-from.js → connectors/load/sql-from.js} +1 -1
- package/dist/connectors/load/sql-from.js.map +1 -0
- package/dist/duckdb-utils.d.ts +47 -0
- package/dist/duckdb-utils.d.ts.map +1 -0
- package/dist/duckdb-utils.js +65 -0
- package/dist/duckdb-utils.js.map +1 -0
- package/dist/exportToCsv.d.ts +3 -1
- package/dist/exportToCsv.d.ts.map +1 -1
- package/dist/exportToCsv.js +29 -24
- package/dist/exportToCsv.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/useDuckDb.d.ts +2 -31
- package/dist/useDuckDb.d.ts.map +1 -1
- package/dist/useDuckDb.js +3 -229
- package/dist/useDuckDb.js.map +1 -1
- package/dist/useSql.d.ts.map +1 -1
- package/dist/useSql.js +4 -3
- package/dist/useSql.js.map +1 -1
- package/package.json +8 -4
- package/dist/__tests__/arrow-utils.test.d.ts +0 -2
- package/dist/__tests__/arrow-utils.test.d.ts.map +0 -1
- package/dist/__tests__/arrow-utils.test.js +0 -187
- package/dist/__tests__/arrow-utils.test.js.map +0 -1
- package/dist/__tests__/sql-from.test.d.ts +0 -2
- package/dist/__tests__/sql-from.test.d.ts.map +0 -1
- package/dist/__tests__/sql-from.test.js +0 -71
- package/dist/__tests__/sql-from.test.js.map +0 -1
- package/dist/duckdb.d.ts +0 -49
- package/dist/duckdb.d.ts.map +0 -1
- package/dist/duckdb.js +0 -82
- package/dist/duckdb.js.map +0 -1
- package/dist/sql-from.d.ts.map +0 -1
- package/dist/sql-from.js.map +0 -1
- /package/dist/{sql-from.d.ts → connectors/load/sql-from.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrow-utils.test.js","sourceRoot":"","sources":["../../src/__tests__/arrow-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as arrow from 'apache-arrow';\nimport {arrowTableToJson} from '../arrow-utils';\n\n/// TODO: Revise tests for nested objects once https://github.com/apache/arrow/issues/33394 is fixed\n\ndescribe('arrow-utils', () => {\n describe('arrowTableToJson', () => {\n it('should convert Arrow table to JSON array', () => {\n // Create a simple Arrow table\n const data: Array<{id: bigint; name: string; score: number}> = [\n {id: 1n, name: 'John', score: 95.5},\n {id: 2n, name: 'Jane', score: 88.0},\n ];\n\n const table = arrow.tableFromJSON(data);\n\n const result = arrowTableToJson(table);\n const expected: Record<string, unknown>[] = [\n {id: 1, name: 'John', score: 95.5},\n {id: 2, name: 'Jane', score: 88.0},\n ];\n expect(result).toEqual(expected);\n });\n\n it('should handle large BigInt values', () => {\n const largeNumber = 9007199254740991n; // Number.MAX_SAFE_INTEGER\n const data: Array<{id: bigint; value: string}> = [\n {id: largeNumber, value: 'test'},\n {id: largeNumber + 1n, value: 'test2'},\n ];\n\n const table = arrow.tableFromJSON(data);\n\n const result = arrowTableToJson(table);\n const expected: Record<string, unknown>[] = [\n {id: 9007199254740991, value: 'test'},\n {id: '9007199254740992', value: 'test2'}, // Beyond MAX_SAFE_INTEGER, should be string\n ];\n expect(result).toEqual(expected);\n });\n\n it('should handle timestamps and dates', () => {\n const timestamp = new Date('2024-02-05T12:30:45.123Z');\n const date = new Date('2024-02-05');\n const data = [\n {\n id: 1,\n timestamp: timestamp,\n date: date,\n },\n ];\n\n const table = arrow.tableFromJSON(data);\n const result = arrowTableToJson(table);\n\n expect(result).toEqual([\n {\n id: 1,\n timestamp: timestamp.getTime(),\n date: date.getTime(),\n },\n ]);\n });\n\n it('should handle nested objects (structs)', () => {\n /// TODO: Revise tests for nested objects once https://github.com/apache/arrow/issues/33394 is fixed\n // For now, we'll use JSON strings for nested objects as Arrow's JS API\n // doesn't seem to have a straightforward way to create struct types\n const data = [\n {\n id: 1,\n user: JSON.stringify({\n name: 'John',\n address: {\n city: 'New York',\n country: 'USA',\n },\n }),\n },\n {\n id: 2,\n user: JSON.stringify({\n name: 'Jane',\n address: {\n city: 'London',\n country: 'UK',\n },\n }),\n },\n ];\n\n const table = arrow.tableFromJSON(data);\n const result = arrowTableToJson(table);\n\n // Parse the JSON strings back to objects for comparison\n const parsedResult = result.map((row) => ({\n ...row,\n user: JSON.parse(row.user as string),\n }));\n\n expect(parsedResult).toEqual([\n {\n id: 1,\n user: {\n name: 'John',\n address: {\n city: 'New York',\n country: 'USA',\n },\n },\n },\n {\n id: 2,\n user: {\n name: 'Jane',\n address: {\n city: 'London',\n country: 'UK',\n },\n },\n },\n ]);\n });\n\n it('should handle arrays', () => {\n // For now, we'll use JSON strings for arrays as Arrow's JS API\n // doesn't seem to have a straightforward way to create list types\n const data = [\n {\n id: 1,\n tags: JSON.stringify(['a', 'b']),\n scores: JSON.stringify([1, 2, 3]),\n },\n ];\n\n const table = arrow.tableFromJSON(data);\n const result = arrowTableToJson(table);\n\n // Parse the JSON strings back to arrays for comparison\n const parsedResult = result.map((row) => ({\n ...row,\n tags: JSON.parse(row.tags as string),\n scores: JSON.parse(row.scores as string),\n }));\n\n expect(parsedResult).toEqual([\n {\n id: 1,\n tags: ['a', 'b'],\n scores: [1, 2, 3],\n },\n ]);\n });\n\n it('should handle combination of structs, BigInts, and timestamps', () => {\n const timestamp = new Date('2024-02-05T12:30:45.123Z');\n // const largeNumber = 9007199254740991n; // MAX_SAFE_INTEGER\n const largeNumber = 1;\n\n // Create data with JSON strings for complex structures\n const data = [\n {\n id: largeNumber,\n created_at: timestamp,\n metadata: JSON.stringify({\n user: {\n id: largeNumber, // + 1n,\n name: 'John',\n last_login: new Date('2024-01-01T00:00:00Z').getTime(),\n stats: {\n score: 95.5,\n rank: largeNumber, // + 2n,\n },\n },\n tags: ['active', 'premium'],\n }),\n },\n ];\n\n const table = arrow.tableFromJSON(data);\n const result = arrowTableToJson(table);\n\n // Parse the JSON strings back to objects for comparison\n const parsedResult = result.map((row) => ({\n ...row,\n metadata: JSON.parse(row.metadata as string),\n }));\n\n expect(parsedResult).toEqual([\n {\n id: 1,\n created_at: timestamp.getTime(),\n metadata: {\n user: {\n id: 1,\n name: 'John',\n last_login: new Date('2024-01-01T00:00:00Z').getTime(),\n stats: {\n score: 95.5,\n rank: 1,\n },\n },\n tags: ['active', 'premium'],\n },\n },\n ]);\n });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-from.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sql-from.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { sqlFrom, literalToSQL } from '../sql-from';
|
|
2
|
-
describe('sql-from', () => {
|
|
3
|
-
describe('literalToSQL', () => {
|
|
4
|
-
it('should convert numbers correctly', () => {
|
|
5
|
-
expect(literalToSQL(42)).toBe('42');
|
|
6
|
-
expect(literalToSQL(3.14)).toBe('3.14');
|
|
7
|
-
expect(literalToSQL(Infinity)).toBe('NULL');
|
|
8
|
-
expect(literalToSQL(NaN)).toBe('NULL');
|
|
9
|
-
});
|
|
10
|
-
it('should convert strings correctly', () => {
|
|
11
|
-
expect(literalToSQL('hello')).toBe("'hello'");
|
|
12
|
-
expect(literalToSQL("O'Neil")).toBe("'O''Neil'"); // Escapes single quotes
|
|
13
|
-
});
|
|
14
|
-
it('should convert booleans correctly', () => {
|
|
15
|
-
expect(literalToSQL(true)).toBe('TRUE');
|
|
16
|
-
expect(literalToSQL(false)).toBe('FALSE');
|
|
17
|
-
});
|
|
18
|
-
it('should convert dates correctly', () => {
|
|
19
|
-
const date = new Date('2024-02-05');
|
|
20
|
-
expect(literalToSQL(date)).toMatch(/^DATE '\d{4}-\d{1,2}-\d{1,2}'$/);
|
|
21
|
-
const timestamp = new Date('2024-02-05T12:30:00Z');
|
|
22
|
-
expect(literalToSQL(timestamp)).toMatch(/^epoch_ms\(\d+\)$/);
|
|
23
|
-
});
|
|
24
|
-
it('should handle null and undefined', () => {
|
|
25
|
-
expect(literalToSQL(null)).toBe('NULL');
|
|
26
|
-
expect(literalToSQL(undefined)).toBe('NULL');
|
|
27
|
-
});
|
|
28
|
-
it('should convert RegExp to string', () => {
|
|
29
|
-
expect(literalToSQL(/test/)).toBe("'test'");
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
describe('sqlFrom', () => {
|
|
33
|
-
it('should create SQL query from array of objects', () => {
|
|
34
|
-
const data = [
|
|
35
|
-
{ id: 1, name: 'John' },
|
|
36
|
-
{ id: 2, name: 'Jane' },
|
|
37
|
-
];
|
|
38
|
-
const result = sqlFrom(data);
|
|
39
|
-
expect(result).toBe('(SELECT 1 AS "id", \'John\' AS "name") ' +
|
|
40
|
-
'UNION ALL ' +
|
|
41
|
-
'(SELECT 2 AS "id", \'Jane\' AS "name")');
|
|
42
|
-
});
|
|
43
|
-
it('should handle custom column mapping', () => {
|
|
44
|
-
const data = [
|
|
45
|
-
{ id: 1, firstName: 'John' },
|
|
46
|
-
{ id: 2, firstName: 'Jane' },
|
|
47
|
-
];
|
|
48
|
-
const result = sqlFrom(data, {
|
|
49
|
-
columns: { id: 'user_id', firstName: 'name' },
|
|
50
|
-
});
|
|
51
|
-
expect(result).toBe('(SELECT 1 AS "user_id", \'John\' AS "name") ' +
|
|
52
|
-
'UNION ALL ' +
|
|
53
|
-
'(SELECT 2 AS "user_id", \'Jane\' AS "name")');
|
|
54
|
-
});
|
|
55
|
-
it('should handle column subset selection', () => {
|
|
56
|
-
const data = [
|
|
57
|
-
{ id: 1, name: 'John', age: 30 },
|
|
58
|
-
{ id: 2, name: 'Jane', age: 25 },
|
|
59
|
-
];
|
|
60
|
-
const result = sqlFrom(data, { columns: ['id', 'name'] });
|
|
61
|
-
expect(result).toBe('(SELECT 1 AS "id", \'John\' AS "name") ' +
|
|
62
|
-
'UNION ALL ' +
|
|
63
|
-
'(SELECT 2 AS "id", \'Jane\' AS "name")');
|
|
64
|
-
});
|
|
65
|
-
it('should throw error for empty column set', () => {
|
|
66
|
-
const data = [];
|
|
67
|
-
expect(() => sqlFrom(data)).toThrow('Can not create table from empty column set.');
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=sql-from.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-from.test.js","sourceRoot":"","sources":["../../src/__tests__/sql-from.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {sqlFrom, literalToSQL} from '../sql-from';\n\ndescribe('sql-from', () => {\n describe('literalToSQL', () => {\n it('should convert numbers correctly', () => {\n expect(literalToSQL(42)).toBe('42');\n expect(literalToSQL(3.14)).toBe('3.14');\n expect(literalToSQL(Infinity)).toBe('NULL');\n expect(literalToSQL(NaN)).toBe('NULL');\n });\n\n it('should convert strings correctly', () => {\n expect(literalToSQL('hello')).toBe(\"'hello'\");\n expect(literalToSQL(\"O'Neil\")).toBe(\"'O''Neil'\"); // Escapes single quotes\n });\n\n it('should convert booleans correctly', () => {\n expect(literalToSQL(true)).toBe('TRUE');\n expect(literalToSQL(false)).toBe('FALSE');\n });\n\n it('should convert dates correctly', () => {\n const date = new Date('2024-02-05');\n expect(literalToSQL(date)).toMatch(/^DATE '\\d{4}-\\d{1,2}-\\d{1,2}'$/);\n\n const timestamp = new Date('2024-02-05T12:30:00Z');\n expect(literalToSQL(timestamp)).toMatch(/^epoch_ms\\(\\d+\\)$/);\n });\n\n it('should handle null and undefined', () => {\n expect(literalToSQL(null)).toBe('NULL');\n expect(literalToSQL(undefined)).toBe('NULL');\n });\n\n it('should convert RegExp to string', () => {\n expect(literalToSQL(/test/)).toBe(\"'test'\");\n });\n });\n\n describe('sqlFrom', () => {\n it('should create SQL query from array of objects', () => {\n const data = [\n {id: 1, name: 'John'},\n {id: 2, name: 'Jane'},\n ] as Record<string, unknown>[];\n\n const result = sqlFrom(data);\n expect(result).toBe(\n '(SELECT 1 AS \"id\", \\'John\\' AS \"name\") ' +\n 'UNION ALL ' +\n '(SELECT 2 AS \"id\", \\'Jane\\' AS \"name\")',\n );\n });\n\n it('should handle custom column mapping', () => {\n const data = [\n {id: 1, firstName: 'John'},\n {id: 2, firstName: 'Jane'},\n ] as Record<string, unknown>[];\n\n const result = sqlFrom(data, {\n columns: {id: 'user_id', firstName: 'name'},\n });\n expect(result).toBe(\n '(SELECT 1 AS \"user_id\", \\'John\\' AS \"name\") ' +\n 'UNION ALL ' +\n '(SELECT 2 AS \"user_id\", \\'Jane\\' AS \"name\")',\n );\n });\n\n it('should handle column subset selection', () => {\n const data = [\n {id: 1, name: 'John', age: 30},\n {id: 2, name: 'Jane', age: 25},\n ] as Record<string, unknown>[];\n\n const result = sqlFrom(data, {columns: ['id', 'name']});\n expect(result).toBe(\n '(SELECT 1 AS \"id\", \\'John\\' AS \"name\") ' +\n 'UNION ALL ' +\n '(SELECT 2 AS \"id\", \\'Jane\\' AS \"name\")',\n );\n });\n\n it('should throw error for empty column set', () => {\n const data = [] as Record<string, unknown>[];\n expect(() => sqlFrom(data)).toThrow(\n 'Can not create table from empty column set.',\n );\n });\n });\n});\n"]}
|
package/dist/duckdb.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import * as arrow from 'apache-arrow';
|
|
2
|
-
/**
|
|
3
|
-
* Create a table from a query.
|
|
4
|
-
* @param tableName - The name of the table to create.
|
|
5
|
-
* @param query - The query to create the table from.
|
|
6
|
-
* @returns The table that was created.
|
|
7
|
-
*/
|
|
8
|
-
export declare function createTableFromQuery(tableName: string, query: string): Promise<{
|
|
9
|
-
tableName: string;
|
|
10
|
-
rowCount: number;
|
|
11
|
-
}>;
|
|
12
|
-
/**
|
|
13
|
-
* Create a view from a registered file.
|
|
14
|
-
* @param filePath - The path to the file to create the view from.
|
|
15
|
-
* @param schema - The schema to create the view in.
|
|
16
|
-
* @param tableName - The name of the table to create.
|
|
17
|
-
* @param opts - The options to create the view with.
|
|
18
|
-
* @returns The view that was created.
|
|
19
|
-
*/
|
|
20
|
-
export declare function createViewFromRegisteredFile(filePath: string, schema: string, tableName: string, opts?: {
|
|
21
|
-
mode: 'table' | 'view';
|
|
22
|
-
}): Promise<{
|
|
23
|
-
tableName: string;
|
|
24
|
-
rowCount: number;
|
|
25
|
-
}>;
|
|
26
|
-
/**
|
|
27
|
-
* Create a view from a file.
|
|
28
|
-
* @param filePath - The path to the file to create the view from.
|
|
29
|
-
* @param schema - The schema to create the view in.
|
|
30
|
-
* @param tableName - The name of the table to create.
|
|
31
|
-
* @param file - The file to create the view from.
|
|
32
|
-
*/
|
|
33
|
-
export declare function createViewFromFile(filePath: string, schema: string, tableName: string, file: File | Uint8Array): Promise<{
|
|
34
|
-
tableName: string;
|
|
35
|
-
rowCount: number;
|
|
36
|
-
}>;
|
|
37
|
-
/**
|
|
38
|
-
* Create a table from an Arrow table.
|
|
39
|
-
* @param tableName - The name of the table to create.
|
|
40
|
-
* @param arrowTable - The Arrow table to create the table from.
|
|
41
|
-
*/
|
|
42
|
-
export declare function createTableFromArrowTable(tableName: string, data: arrow.Table): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Create a table from an array of objects.
|
|
45
|
-
* @param tableName - The name of the table to create.
|
|
46
|
-
* @param data - The array of objects to create the table from.
|
|
47
|
-
*/
|
|
48
|
-
export declare function createTableFromObjects(tableName: string, data: Record<string, unknown>[]): Promise<void>;
|
|
49
|
-
//# sourceMappingURL=duckdb.d.ts.map
|
package/dist/duckdb.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb.d.ts","sourceRoot":"","sources":["../src/duckdb.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;GAU1E;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IACL,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB,GACA,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAC,CAwBhD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,GAAG,UAAU,GACtB,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAC,CAgBhD;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,CAAC,KAAK,iBAIlB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,iBAKhC"}
|
package/dist/duckdb.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { DuckDBDataProtocol } from '@duckdb/duckdb-wasm';
|
|
2
|
-
import { escapeVal, getColValAsNumber, getDuckDb } from './useDuckDb';
|
|
3
|
-
import { sqlFrom } from './sql-from';
|
|
4
|
-
/**
|
|
5
|
-
* Create a table from a query.
|
|
6
|
-
* @param tableName - The name of the table to create.
|
|
7
|
-
* @param query - The query to create the table from.
|
|
8
|
-
* @returns The table that was created.
|
|
9
|
-
*/
|
|
10
|
-
export async function createTableFromQuery(tableName, query) {
|
|
11
|
-
const { conn } = await getDuckDb();
|
|
12
|
-
const rowCount = getColValAsNumber(await conn.query(`CREATE OR REPLACE TABLE main.${tableName} AS (
|
|
13
|
-
${query}
|
|
14
|
-
)`));
|
|
15
|
-
return { tableName, rowCount };
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Create a view from a registered file.
|
|
19
|
-
* @param filePath - The path to the file to create the view from.
|
|
20
|
-
* @param schema - The schema to create the view in.
|
|
21
|
-
* @param tableName - The name of the table to create.
|
|
22
|
-
* @param opts - The options to create the view with.
|
|
23
|
-
* @returns The view that was created.
|
|
24
|
-
*/
|
|
25
|
-
export async function createViewFromRegisteredFile(filePath, schema, tableName, opts) {
|
|
26
|
-
const { mode = 'table' } = opts ?? {};
|
|
27
|
-
const { conn } = await getDuckDb();
|
|
28
|
-
const fileNameLower = filePath.toLowerCase();
|
|
29
|
-
const quotedFileName = escapeVal(filePath);
|
|
30
|
-
const readFileQuery = fileNameLower.endsWith('.json') ||
|
|
31
|
-
fileNameLower.endsWith('.geojson') ||
|
|
32
|
-
fileNameLower.endsWith('.ndjson')
|
|
33
|
-
? `read_json_auto(${quotedFileName}, maximum_object_size=104857600)` // 100MB
|
|
34
|
-
: fileNameLower.endsWith('.parquet')
|
|
35
|
-
? `parquet_scan(${quotedFileName})`
|
|
36
|
-
: fileNameLower.endsWith('.csv') || fileNameLower.endsWith('.tsv')
|
|
37
|
-
? `read_csv(${quotedFileName}, SAMPLE_SIZE=-1, AUTO_DETECT=TRUE)`
|
|
38
|
-
: quotedFileName;
|
|
39
|
-
// TODO: tableName generate
|
|
40
|
-
const rowCount = getColValAsNumber(await conn.query(`CREATE OR REPLACE ${mode} ${schema}.${tableName} AS
|
|
41
|
-
SELECT * FROM ${readFileQuery}`));
|
|
42
|
-
// }
|
|
43
|
-
return { tableName, rowCount };
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Create a view from a file.
|
|
47
|
-
* @param filePath - The path to the file to create the view from.
|
|
48
|
-
* @param schema - The schema to create the view in.
|
|
49
|
-
* @param tableName - The name of the table to create.
|
|
50
|
-
* @param file - The file to create the view from.
|
|
51
|
-
*/
|
|
52
|
-
export async function createViewFromFile(filePath, schema, tableName, file) {
|
|
53
|
-
const duckConn = await getDuckDb();
|
|
54
|
-
await duckConn.db.dropFile(filePath);
|
|
55
|
-
if (file instanceof File) {
|
|
56
|
-
await duckConn.db.registerFileHandle(filePath, file, DuckDBDataProtocol.BROWSER_FILEREADER, true);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
await duckConn.db.registerFileBuffer(filePath, file);
|
|
60
|
-
}
|
|
61
|
-
return createViewFromRegisteredFile(filePath, schema, tableName);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Create a table from an Arrow table.
|
|
65
|
-
* @param tableName - The name of the table to create.
|
|
66
|
-
* @param arrowTable - The Arrow table to create the table from.
|
|
67
|
-
*/
|
|
68
|
-
export async function createTableFromArrowTable(tableName, data) {
|
|
69
|
-
const { conn } = await getDuckDb();
|
|
70
|
-
await conn.insertArrowTable(data, { name: tableName });
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Create a table from an array of objects.
|
|
74
|
-
* @param tableName - The name of the table to create.
|
|
75
|
-
* @param data - The array of objects to create the table from.
|
|
76
|
-
*/
|
|
77
|
-
export async function createTableFromObjects(tableName, data) {
|
|
78
|
-
const { conn } = await getDuckDb();
|
|
79
|
-
const query = sqlFrom(data);
|
|
80
|
-
await conn.query(`CREATE OR REPLACE TABLE ${tableName} AS ${query}`);
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=duckdb.js.map
|
package/dist/duckdb.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb.js","sourceRoot":"","sources":["../src/duckdb.ts"],"names":[],"mappings":"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","sourcesContent":["import {DuckDBDataProtocol} from '@duckdb/duckdb-wasm';\nimport {escapeVal, getColValAsNumber, getDuckDb} from './useDuckDb';\nimport * as arrow from 'apache-arrow';\nimport {sqlFrom} from './sql-from';\n\n/**\n * Create a table from a query.\n * @param tableName - The name of the table to create.\n * @param query - The query to create the table from.\n * @returns The table that was created.\n */\nexport async function createTableFromQuery(tableName: string, query: string) {\n const {conn} = await getDuckDb();\n const rowCount = getColValAsNumber(\n await conn.query(\n `CREATE OR REPLACE TABLE main.${tableName} AS (\n ${query}\n )`,\n ),\n );\n return {tableName, rowCount};\n}\n\n/**\n * Create a view from a registered file.\n * @param filePath - The path to the file to create the view from.\n * @param schema - The schema to create the view in.\n * @param tableName - The name of the table to create.\n * @param opts - The options to create the view with.\n * @returns The view that was created.\n */\nexport async function createViewFromRegisteredFile(\n filePath: string,\n schema: string,\n tableName: string,\n opts?: {\n mode: 'table' | 'view';\n },\n): Promise<{tableName: string; rowCount: number}> {\n const {mode = 'table'} = opts ?? {};\n const {conn} = await getDuckDb();\n const fileNameLower = filePath.toLowerCase();\n const quotedFileName = escapeVal(filePath);\n const readFileQuery =\n fileNameLower.endsWith('.json') ||\n fileNameLower.endsWith('.geojson') ||\n fileNameLower.endsWith('.ndjson')\n ? `read_json_auto(${quotedFileName}, maximum_object_size=104857600)` // 100MB\n : fileNameLower.endsWith('.parquet')\n ? `parquet_scan(${quotedFileName})`\n : fileNameLower.endsWith('.csv') || fileNameLower.endsWith('.tsv')\n ? `read_csv(${quotedFileName}, SAMPLE_SIZE=-1, AUTO_DETECT=TRUE)`\n : quotedFileName;\n // TODO: tableName generate\n const rowCount = getColValAsNumber(\n await conn.query(\n `CREATE OR REPLACE ${mode} ${schema}.${tableName} AS\n SELECT * FROM ${readFileQuery}`,\n ),\n );\n // }\n return {tableName, rowCount};\n}\n\n/**\n * Create a view from a file.\n * @param filePath - The path to the file to create the view from.\n * @param schema - The schema to create the view in.\n * @param tableName - The name of the table to create.\n * @param file - The file to create the view from.\n */\nexport async function createViewFromFile(\n filePath: string,\n schema: string,\n tableName: string,\n file: File | Uint8Array,\n): Promise<{tableName: string; rowCount: number}> {\n const duckConn = await getDuckDb();\n\n await duckConn.db.dropFile(filePath);\n if (file instanceof File) {\n await duckConn.db.registerFileHandle(\n filePath,\n file,\n DuckDBDataProtocol.BROWSER_FILEREADER,\n true,\n );\n } else {\n await duckConn.db.registerFileBuffer(filePath, file);\n }\n\n return createViewFromRegisteredFile(filePath, schema, tableName);\n}\n\n/**\n * Create a table from an Arrow table.\n * @param tableName - The name of the table to create.\n * @param arrowTable - The Arrow table to create the table from.\n */\nexport async function createTableFromArrowTable(\n tableName: string,\n data: arrow.Table,\n) {\n const {conn} = await getDuckDb();\n await conn.insertArrowTable(data, {name: tableName});\n}\n\n/**\n * Create a table from an array of objects.\n * @param tableName - The name of the table to create.\n * @param data - The array of objects to create the table from.\n */\nexport async function createTableFromObjects(\n tableName: string,\n data: Record<string, unknown>[],\n) {\n const {conn} = await getDuckDb();\n const query = sqlFrom(data);\n await conn.query(`CREATE OR REPLACE TABLE ${tableName} AS ${query}`);\n}\n"]}
|
package/dist/sql-from.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-from.d.ts","sourceRoot":"","sources":["../src/sql-from.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,EACE,OAAsC,GACvC,GAAE;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAM,UAsBtD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,UA2B1C"}
|
package/dist/sql-from.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-from.js","sourceRoot":"","sources":["../src/sql-from.ts"],"names":[],"mappings":"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","sourcesContent":["// Adapted from https://github.com/uwdata/mosaic/blob/main/packages/sql/src/load/sql-from.js\n// BSD 3-Clause License Copyright (c) 2023, UW Interactive Data Lab\n\n/**\n * Create a SQL query that embeds the given data for loading.\n * @param {*} data The dataset as an array of objects.\n * @param {object} [options] Loading options.\n * @param {string[]|Record<string,string>} [options.columns] The columns to include.\n * If not specified, the keys of the first data object are used.\n * @returns {string} SQL query string to load data.\n */\nexport function sqlFrom(\n data: Record<string, unknown>[],\n {\n columns = Object.keys(data?.[0] || {}),\n }: {columns?: string[] | Record<string, string>} = {},\n) {\n let keys: string[] = [];\n let columnMap: Record<string, string>;\n if (Array.isArray(columns)) {\n keys = columns;\n columnMap = keys.reduce((m, k) => ({...m, [k]: k}), {});\n } else {\n columnMap = columns;\n keys = Object.keys(columns);\n }\n if (!keys.length) {\n throw new Error('Can not create table from empty column set.');\n }\n const subq = [];\n for (const datum of data) {\n const sel = keys.map(\n (k) => `${literalToSQL(datum[k])} AS \"${columnMap[k]}\"`,\n );\n subq.push(`(SELECT ${sel.join(', ')})`);\n }\n return subq.join(' UNION ALL ');\n}\n\n/**\n * Convert a value to a SQL literal.\n * @param {*} value The value to convert.\n * @returns {string} The SQL literal.\n */\nexport function literalToSQL(value: unknown) {\n switch (typeof value) {\n case 'number':\n return Number.isFinite(value) ? `${value}` : 'NULL';\n case 'string':\n return `'${value.replace(`'`, `''`)}'`;\n case 'boolean':\n return value ? 'TRUE' : 'FALSE';\n default:\n if (value == null) {\n return 'NULL';\n } else if (value instanceof Date) {\n const ts = +value;\n if (Number.isNaN(ts)) return 'NULL';\n const y = value.getUTCFullYear();\n const m = value.getUTCMonth();\n const d = value.getUTCDate();\n return ts === Date.UTC(y, m, d)\n ? `DATE '${y}-${m + 1}-${d}'` // utc date\n : `epoch_ms(${ts})`; // timestamp\n } else if (value instanceof RegExp) {\n return `'${value.source}'`;\n } else {\n // otherwise rely on string coercion\n return `${value}`;\n }\n }\n}\n"]}
|
|
File without changes
|