@dotdo/postgres 0.1.1 → 0.1.3
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 +73 -1
- package/dist/client/index.d.ts +47 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +47 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/postgres-client.d.ts +273 -0
- package/dist/client/postgres-client.d.ts.map +1 -0
- package/dist/client/postgres-client.js +389 -0
- package/dist/client/postgres-client.js.map +1 -0
- package/dist/client/types.d.ts +167 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +7 -0
- package/dist/client/types.js.map +1 -0
- package/dist/do/index.d.ts +18 -0
- package/dist/do/index.d.ts.map +1 -0
- package/dist/do/index.js +18 -0
- package/dist/do/index.js.map +1 -0
- package/dist/do/postgres.d.ts +110 -0
- package/dist/do/postgres.d.ts.map +1 -0
- package/dist/do/postgres.js +266 -0
- package/dist/do/postgres.js.map +1 -0
- package/dist/do/sql.d.ts +92 -0
- package/dist/do/sql.d.ts.map +1 -0
- package/dist/do/sql.js +204 -0
- package/dist/do/sql.js.map +1 -0
- package/dist/index.d.ts +25 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -30
- package/dist/index.js.map +1 -1
- package/dist/mcp/binding.d.ts +47 -0
- package/dist/mcp/binding.d.ts.map +1 -0
- package/dist/mcp/binding.js +183 -0
- package/dist/mcp/binding.js.map +1 -0
- package/dist/mcp/index.d.ts +92 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +91 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +62 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +278 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +58 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +356 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +139 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/pglite/workers-pglite.d.ts +13 -4
- package/dist/pglite/workers-pglite.d.ts.map +1 -1
- package/dist/pglite/workers-pglite.js +110 -5
- package/dist/pglite/workers-pglite.js.map +1 -1
- package/dist/pglite-assets/pglite.data +0 -0
- package/dist/pglite-assets/pglite.wasm +0 -0
- package/dist/worker/auth.d.ts.map +1 -1
- package/dist/worker/auth.js +16 -6
- package/dist/worker/auth.js.map +1 -1
- package/dist/worker/background-pglite-manager.d.ts +243 -0
- package/dist/worker/background-pglite-manager.d.ts.map +1 -0
- package/dist/worker/background-pglite-manager.js +528 -0
- package/dist/worker/background-pglite-manager.js.map +1 -0
- package/dist/worker/do-pglite-manager.d.ts +77 -0
- package/dist/worker/do-pglite-manager.d.ts.map +1 -1
- package/dist/worker/do-pglite-manager.js +189 -12
- package/dist/worker/do-pglite-manager.js.map +1 -1
- package/dist/worker/entry.d.ts.map +1 -1
- package/dist/worker/entry.js +108 -26
- package/dist/worker/entry.js.map +1 -1
- package/dist/worker/index.d.ts +7 -1
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +19 -1
- package/dist/worker/index.js.map +1 -1
- package/dist/worker/lazy-pglite-manager.d.ts +242 -0
- package/dist/worker/lazy-pglite-manager.d.ts.map +1 -0
- package/dist/worker/lazy-pglite-manager.js +463 -0
- package/dist/worker/lazy-pglite-manager.js.map +1 -0
- package/package.json +20 -6
- package/src/client/index.ts +61 -0
- package/src/client/postgres-client.ts +442 -0
- package/src/client/types.ts +211 -0
- package/src/do/index.ts +18 -0
- package/src/do/postgres.ts +367 -0
- package/src/do/sql.ts +280 -0
- package/src/index.ts +50 -30
- package/src/mcp/binding.ts +236 -0
- package/src/mcp/index.ts +122 -0
- package/src/mcp/server.ts +361 -0
- package/src/mcp/tools.ts +464 -0
- package/src/mcp/types.ts +148 -0
- package/src/pglite/workers-pglite.ts +141 -12
- package/src/pglite-assets/pglite.data +0 -0
- package/src/pglite-assets/pglite.wasm +0 -0
- package/src/worker/auth.ts +17 -6
- package/src/worker/background-pglite-manager.ts +680 -0
- package/src/worker/do-pglite-manager.ts +235 -19
- package/src/worker/entry.ts +112 -30
- package/src/worker/index.ts +71 -1
- package/src/worker/lazy-pglite-manager.ts +595 -0
- package/dist/iceberg/duckdb-wasm.d.ts +0 -447
- package/dist/iceberg/duckdb-wasm.d.ts.map +0 -1
- package/dist/iceberg/duckdb-wasm.js +0 -600
- package/dist/iceberg/duckdb-wasm.js.map +0 -1
- package/dist/iceberg/test-fixtures.d.ts +0 -151
- package/dist/iceberg/test-fixtures.d.ts.map +0 -1
- package/dist/iceberg/test-fixtures.js +0 -446
- package/dist/iceberg/test-fixtures.js.map +0 -1
- package/dist/worker/__mocks__/cloudflare-workers.d.ts +0 -31
- package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +0 -1
- package/dist/worker/__mocks__/cloudflare-workers.js +0 -33
- package/dist/worker/__mocks__/cloudflare-workers.js.map +0 -1
|
@@ -1,600 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DuckDB-WASM Integration for Iceberg Tables
|
|
3
|
-
* Task: postgres-m5p - pg_lake: Add Iceberg/data lake extension support
|
|
4
|
-
*
|
|
5
|
-
* Provides utilities for querying Iceberg tables from browser/WASM environments
|
|
6
|
-
* using DuckDB-WASM as the query engine. This is the recommended approach for
|
|
7
|
-
* data lake access since direct pg_lake is not feasible in WASM.
|
|
8
|
-
*
|
|
9
|
-
* Architecture:
|
|
10
|
-
* ```
|
|
11
|
-
* Browser/Worker <-> DuckDB-WASM <-> R2/S3 (via HTTP) <-> Iceberg Tables
|
|
12
|
-
* ```
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* import { createDuckDBIcebergClient, IcebergQueryBuilder } from '@dotdo/postgres/iceberg'
|
|
17
|
-
*
|
|
18
|
-
* // Create client with R2 Data Catalog
|
|
19
|
-
* const client = await createDuckDBIcebergClient({
|
|
20
|
-
* catalogEndpoint: 'https://account.r2.cloudflarestorage.com',
|
|
21
|
-
* catalogName: 'my_catalog',
|
|
22
|
-
* accessKeyId: process.env.R2_ACCESS_KEY_ID,
|
|
23
|
-
* secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
|
|
24
|
-
* })
|
|
25
|
-
*
|
|
26
|
-
* // Query Iceberg table
|
|
27
|
-
* const result = await client.query(`
|
|
28
|
-
* SELECT * FROM my_catalog.namespace.table
|
|
29
|
-
* WHERE timestamp >= '2024-01-01'
|
|
30
|
-
* LIMIT 100
|
|
31
|
-
* `)
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* @module iceberg/duckdb-wasm
|
|
35
|
-
*/
|
|
36
|
-
// ============================================================================
|
|
37
|
-
// DuckDB-WASM Iceberg Client
|
|
38
|
-
// ============================================================================
|
|
39
|
-
/**
|
|
40
|
-
* DuckDB-WASM Iceberg Client
|
|
41
|
-
*
|
|
42
|
-
* A client for querying Iceberg tables using DuckDB-WASM in browser environments.
|
|
43
|
-
* Supports R2 Data Catalog and any Iceberg REST Catalog compatible endpoint.
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* const client = new DuckDBIcebergClient({
|
|
48
|
-
* catalogEndpoint: 'https://account.r2.cloudflarestorage.com',
|
|
49
|
-
* catalogName: 'analytics',
|
|
50
|
-
* accessKeyId: '...',
|
|
51
|
-
* secretAccessKey: '...',
|
|
52
|
-
* })
|
|
53
|
-
*
|
|
54
|
-
* await client.initialize()
|
|
55
|
-
*
|
|
56
|
-
* // Query with time travel
|
|
57
|
-
* const result = await client.query(`
|
|
58
|
-
* SELECT * FROM analytics.events.page_views
|
|
59
|
-
* WHERE event_date = '2024-01-15'
|
|
60
|
-
* `, { asOf: '2024-01-16T00:00:00Z' })
|
|
61
|
-
* ```
|
|
62
|
-
*/
|
|
63
|
-
export class DuckDBIcebergClient {
|
|
64
|
-
config;
|
|
65
|
-
db = null;
|
|
66
|
-
conn = null;
|
|
67
|
-
initialized = false;
|
|
68
|
-
constructor(config) {
|
|
69
|
-
this.config = {
|
|
70
|
-
catalogEndpoint: config.catalogEndpoint,
|
|
71
|
-
catalogName: config.catalogName,
|
|
72
|
-
accessKeyId: config.accessKeyId ?? '',
|
|
73
|
-
secretAccessKey: config.secretAccessKey ?? '',
|
|
74
|
-
region: config.region ?? 'auto',
|
|
75
|
-
s3Endpoint: config.s3Endpoint ?? config.catalogEndpoint,
|
|
76
|
-
bundle: config.bundle ?? 'eh',
|
|
77
|
-
memoryLimit: config.memoryLimit ?? 256 * 1024 * 1024,
|
|
78
|
-
enableLogging: config.enableLogging ?? false,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Initialize the DuckDB-WASM instance and attach Iceberg catalog
|
|
83
|
-
*
|
|
84
|
-
* @param duckdbModule - DuckDB WASM module (from @duckdb/duckdb-wasm)
|
|
85
|
-
*/
|
|
86
|
-
async initialize(duckdbModule) {
|
|
87
|
-
if (this.initialized) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
// Instantiate DuckDB
|
|
91
|
-
this.db = await duckdbModule.instantiate();
|
|
92
|
-
this.conn = await this.db.connect();
|
|
93
|
-
// Load required extensions
|
|
94
|
-
await this.loadExtensions();
|
|
95
|
-
// Attach Iceberg catalog
|
|
96
|
-
await this.attachCatalog();
|
|
97
|
-
this.initialized = true;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Load required DuckDB extensions
|
|
101
|
-
*/
|
|
102
|
-
async loadExtensions() {
|
|
103
|
-
if (!this.conn)
|
|
104
|
-
throw new Error('Connection not initialized');
|
|
105
|
-
// Load and install extensions
|
|
106
|
-
await this.conn.run('INSTALL iceberg');
|
|
107
|
-
await this.conn.run('LOAD iceberg');
|
|
108
|
-
await this.conn.run('INSTALL httpfs');
|
|
109
|
-
await this.conn.run('LOAD httpfs');
|
|
110
|
-
await this.conn.run('INSTALL parquet');
|
|
111
|
-
await this.conn.run('LOAD parquet');
|
|
112
|
-
// Configure S3/R2 credentials if provided
|
|
113
|
-
if (this.config.accessKeyId && this.config.secretAccessKey) {
|
|
114
|
-
await this.conn.run(`
|
|
115
|
-
SET s3_access_key_id='${this.config.accessKeyId}';
|
|
116
|
-
SET s3_secret_access_key='${this.config.secretAccessKey}';
|
|
117
|
-
SET s3_region='${this.config.region}';
|
|
118
|
-
SET s3_endpoint='${this.config.s3Endpoint}';
|
|
119
|
-
`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Attach Iceberg catalog
|
|
124
|
-
*/
|
|
125
|
-
async attachCatalog() {
|
|
126
|
-
if (!this.conn)
|
|
127
|
-
throw new Error('Connection not initialized');
|
|
128
|
-
// Attach Iceberg REST catalog
|
|
129
|
-
await this.conn.run(`
|
|
130
|
-
ATTACH '${this.config.catalogEndpoint}' AS ${this.config.catalogName} (
|
|
131
|
-
TYPE ICEBERG,
|
|
132
|
-
ENDPOINT '${this.config.catalogEndpoint}'
|
|
133
|
-
)
|
|
134
|
-
`);
|
|
135
|
-
if (this.config.enableLogging) {
|
|
136
|
-
console.log(`[DuckDBIcebergClient] Attached catalog: ${this.config.catalogName}`);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Execute a SQL query
|
|
141
|
-
*
|
|
142
|
-
* @param sql - SQL query to execute
|
|
143
|
-
* @param options - Optional time travel options
|
|
144
|
-
* @returns Query result
|
|
145
|
-
*/
|
|
146
|
-
async query(sql, options) {
|
|
147
|
-
if (!this.conn)
|
|
148
|
-
throw new Error('Client not initialized');
|
|
149
|
-
const startTime = performance.now();
|
|
150
|
-
// Apply time travel if specified
|
|
151
|
-
let modifiedSql = sql;
|
|
152
|
-
if (options?.snapshotId) {
|
|
153
|
-
modifiedSql = this.addSnapshotIdHint(sql, options.snapshotId);
|
|
154
|
-
}
|
|
155
|
-
else if (options?.asOf) {
|
|
156
|
-
modifiedSql = this.addAsOfHint(sql, options.asOf);
|
|
157
|
-
}
|
|
158
|
-
// Execute query
|
|
159
|
-
const result = await this.conn.query(modifiedSql);
|
|
160
|
-
const executionTimeMs = performance.now() - startTime;
|
|
161
|
-
// Convert Arrow result to plain objects
|
|
162
|
-
const rows = result.toArray();
|
|
163
|
-
const columns = result.schema.fields.map((f) => f.name);
|
|
164
|
-
const types = result.schema.fields.map((f) => f.type.toString());
|
|
165
|
-
if (this.config.enableLogging) {
|
|
166
|
-
console.log(`[DuckDBIcebergClient] Query completed: ${result.numRows} rows in ${executionTimeMs.toFixed(2)}ms`);
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
rows,
|
|
170
|
-
columns,
|
|
171
|
-
types,
|
|
172
|
-
executionTimeMs,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Add snapshot ID hint to query for time travel
|
|
177
|
-
*/
|
|
178
|
-
addSnapshotIdHint(sql, snapshotId) {
|
|
179
|
-
// DuckDB Iceberg time travel syntax
|
|
180
|
-
return sql.replace(/FROM\s+([a-zA-Z0-9_.]+)/gi, `FROM iceberg_scan('$1', allow_moved_paths = true, snapshot_id = ${snapshotId})`);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Add AS OF timestamp hint to query
|
|
184
|
-
*/
|
|
185
|
-
addAsOfHint(sql, asOf) {
|
|
186
|
-
const timestamp = typeof asOf === 'string' ? asOf : asOf.toISOString();
|
|
187
|
-
return sql.replace(/FROM\s+([a-zA-Z0-9_.]+)/gi, `FROM iceberg_scan('$1', allow_moved_paths = true, as_of_timestamp = '${timestamp}')`);
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* List all namespaces in the catalog
|
|
191
|
-
*/
|
|
192
|
-
async listNamespaces() {
|
|
193
|
-
const result = await this.query(`SELECT * FROM information_schema.schemata WHERE catalog_name = '${this.config.catalogName}'`);
|
|
194
|
-
return result.rows.map((r) => r.namespace);
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* List all tables in a namespace
|
|
198
|
-
*/
|
|
199
|
-
async listTables(namespace) {
|
|
200
|
-
const result = await this.query(`SELECT table_name FROM information_schema.tables
|
|
201
|
-
WHERE table_catalog = '${this.config.catalogName}'
|
|
202
|
-
AND table_schema = '${namespace}'`);
|
|
203
|
-
return result.rows.map((r) => r.table_name);
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Get table metadata
|
|
207
|
-
*/
|
|
208
|
-
async getTableMetadata(namespace, tableName) {
|
|
209
|
-
try {
|
|
210
|
-
const fullName = `${this.config.catalogName}.${namespace}.${tableName}`;
|
|
211
|
-
// Get schema info
|
|
212
|
-
const schemaResult = await this.query(`SELECT column_name, ordinal_position, data_type, is_nullable, column_comment
|
|
213
|
-
FROM information_schema.columns
|
|
214
|
-
WHERE table_catalog = '${this.config.catalogName}'
|
|
215
|
-
AND table_schema = '${namespace}'
|
|
216
|
-
AND table_name = '${tableName}'
|
|
217
|
-
ORDER BY ordinal_position`);
|
|
218
|
-
if (schemaResult.rows.length === 0) {
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
const schema = schemaResult.rows.map((col) => {
|
|
222
|
-
const field = {
|
|
223
|
-
id: col.ordinal_position,
|
|
224
|
-
name: col.column_name,
|
|
225
|
-
type: col.data_type,
|
|
226
|
-
required: col.is_nullable === 'NO',
|
|
227
|
-
};
|
|
228
|
-
if (col.column_comment !== null) {
|
|
229
|
-
field.doc = col.column_comment;
|
|
230
|
-
}
|
|
231
|
-
return field;
|
|
232
|
-
});
|
|
233
|
-
return {
|
|
234
|
-
identifier: fullName,
|
|
235
|
-
name: tableName,
|
|
236
|
-
namespace: [namespace],
|
|
237
|
-
schema,
|
|
238
|
-
partitionColumns: [], // Would need iceberg metadata for this
|
|
239
|
-
properties: {},
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
catch {
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Get table snapshots for time travel
|
|
248
|
-
*/
|
|
249
|
-
async getSnapshots(namespace, tableName) {
|
|
250
|
-
const fullName = `${this.config.catalogName}.${namespace}.${tableName}`;
|
|
251
|
-
const result = await this.query(`SELECT * FROM iceberg_snapshots('${fullName}')`);
|
|
252
|
-
return result.rows.map((row) => ({
|
|
253
|
-
snapshotId: Number(row.snapshot_id),
|
|
254
|
-
timestamp: new Date(Number(row.timestamp_ms)),
|
|
255
|
-
operation: row.operation,
|
|
256
|
-
summary: row.summary ? JSON.parse(row.summary) : {},
|
|
257
|
-
}));
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Close the connection and cleanup
|
|
261
|
-
*/
|
|
262
|
-
async close() {
|
|
263
|
-
if (this.conn) {
|
|
264
|
-
await this.conn.close();
|
|
265
|
-
this.conn = null;
|
|
266
|
-
}
|
|
267
|
-
if (this.db) {
|
|
268
|
-
await this.db.close();
|
|
269
|
-
this.db = null;
|
|
270
|
-
}
|
|
271
|
-
this.initialized = false;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Create a DuckDB-WASM Iceberg client
|
|
276
|
-
*
|
|
277
|
-
* @example
|
|
278
|
-
* ```typescript
|
|
279
|
-
* import * as duckdb from '@duckdb/duckdb-wasm'
|
|
280
|
-
*
|
|
281
|
-
* const client = createDuckDBIcebergClient({
|
|
282
|
-
* catalogEndpoint: 'https://account.r2.cloudflarestorage.com',
|
|
283
|
-
* catalogName: 'my_catalog',
|
|
284
|
-
* })
|
|
285
|
-
*
|
|
286
|
-
* await client.initialize(duckdb)
|
|
287
|
-
*
|
|
288
|
-
* const result = await client.query('SELECT * FROM my_catalog.ns.table LIMIT 10')
|
|
289
|
-
* ```
|
|
290
|
-
*/
|
|
291
|
-
export function createDuckDBIcebergClient(config) {
|
|
292
|
-
return new DuckDBIcebergClient(config);
|
|
293
|
-
}
|
|
294
|
-
// ============================================================================
|
|
295
|
-
// Iceberg Query Builder
|
|
296
|
-
// ============================================================================
|
|
297
|
-
/**
|
|
298
|
-
* Fluent query builder for Iceberg tables
|
|
299
|
-
*
|
|
300
|
-
* Provides a type-safe, fluent API for building Iceberg queries with
|
|
301
|
-
* automatic partition pruning, time travel, and column projection.
|
|
302
|
-
*
|
|
303
|
-
* @example
|
|
304
|
-
* ```typescript
|
|
305
|
-
* const query = new IcebergQueryBuilder('my_catalog.events.page_views')
|
|
306
|
-
* .select('user_id', 'page_url', 'timestamp')
|
|
307
|
-
* .where('event_date', '>=', '2024-01-01')
|
|
308
|
-
* .where('country', 'IN', ['US', 'CA', 'UK'])
|
|
309
|
-
* .asOf('2024-01-15T00:00:00Z')
|
|
310
|
-
* .orderBy('timestamp', 'DESC')
|
|
311
|
-
* .limit(100)
|
|
312
|
-
* .build()
|
|
313
|
-
* ```
|
|
314
|
-
*/
|
|
315
|
-
export class IcebergQueryBuilder {
|
|
316
|
-
tableName;
|
|
317
|
-
selectColumns = ['*'];
|
|
318
|
-
whereClauses = [];
|
|
319
|
-
orderByClauses = [];
|
|
320
|
-
groupByClauses = [];
|
|
321
|
-
havingClauses = [];
|
|
322
|
-
limitValue;
|
|
323
|
-
offsetValue;
|
|
324
|
-
timeTravelOptions;
|
|
325
|
-
constructor(tableName) {
|
|
326
|
-
this.tableName = tableName;
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Specify columns to select
|
|
330
|
-
*/
|
|
331
|
-
select(...columns) {
|
|
332
|
-
this.selectColumns = columns.length > 0 ? columns : ['*'];
|
|
333
|
-
return this;
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Add a WHERE clause
|
|
337
|
-
*/
|
|
338
|
-
where(column, operator, value) {
|
|
339
|
-
let clause;
|
|
340
|
-
if (operator === 'IN' && Array.isArray(value)) {
|
|
341
|
-
const values = value.map((v) => (typeof v === 'string' ? `'${v}'` : v)).join(', ');
|
|
342
|
-
clause = `${column} IN (${values})`;
|
|
343
|
-
}
|
|
344
|
-
else if (operator === 'BETWEEN' && Array.isArray(value) && value.length === 2) {
|
|
345
|
-
const [start, end] = value;
|
|
346
|
-
const startVal = typeof start === 'string' ? `'${start}'` : start;
|
|
347
|
-
const endVal = typeof end === 'string' ? `'${end}'` : end;
|
|
348
|
-
clause = `${column} BETWEEN ${startVal} AND ${endVal}`;
|
|
349
|
-
}
|
|
350
|
-
else if (typeof value === 'string') {
|
|
351
|
-
clause = `${column} ${operator} '${value}'`;
|
|
352
|
-
}
|
|
353
|
-
else if (value === null) {
|
|
354
|
-
clause = operator === '=' ? `${column} IS NULL` : `${column} IS NOT NULL`;
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
clause = `${column} ${operator} ${value}`;
|
|
358
|
-
}
|
|
359
|
-
this.whereClauses.push(clause);
|
|
360
|
-
return this;
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Add raw WHERE clause
|
|
364
|
-
*/
|
|
365
|
-
whereRaw(clause) {
|
|
366
|
-
this.whereClauses.push(clause);
|
|
367
|
-
return this;
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Add GROUP BY clause
|
|
371
|
-
*/
|
|
372
|
-
groupBy(...columns) {
|
|
373
|
-
this.groupByClauses.push(...columns);
|
|
374
|
-
return this;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Add HAVING clause
|
|
378
|
-
*/
|
|
379
|
-
having(clause) {
|
|
380
|
-
this.havingClauses.push(clause);
|
|
381
|
-
return this;
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Add ORDER BY clause
|
|
385
|
-
*/
|
|
386
|
-
orderBy(column, direction = 'ASC') {
|
|
387
|
-
this.orderByClauses.push(`${column} ${direction}`);
|
|
388
|
-
return this;
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Set LIMIT
|
|
392
|
-
*/
|
|
393
|
-
limit(n) {
|
|
394
|
-
this.limitValue = n;
|
|
395
|
-
return this;
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Set OFFSET
|
|
399
|
-
*/
|
|
400
|
-
offset(n) {
|
|
401
|
-
this.offsetValue = n;
|
|
402
|
-
return this;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Query at specific snapshot ID
|
|
406
|
-
*/
|
|
407
|
-
atSnapshot(snapshotId) {
|
|
408
|
-
this.timeTravelOptions = { snapshotId };
|
|
409
|
-
return this;
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Query as of specific timestamp
|
|
413
|
-
*/
|
|
414
|
-
asOf(timestamp) {
|
|
415
|
-
this.timeTravelOptions = { asOf: timestamp };
|
|
416
|
-
return this;
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Build the SQL query string
|
|
420
|
-
*/
|
|
421
|
-
build() {
|
|
422
|
-
const parts = [];
|
|
423
|
-
// SELECT
|
|
424
|
-
parts.push(`SELECT ${this.selectColumns.join(', ')}`);
|
|
425
|
-
// FROM (with optional time travel)
|
|
426
|
-
if (this.timeTravelOptions?.snapshotId) {
|
|
427
|
-
parts.push(`FROM iceberg_scan('${this.tableName}', snapshot_id = ${this.timeTravelOptions.snapshotId})`);
|
|
428
|
-
}
|
|
429
|
-
else if (this.timeTravelOptions?.asOf) {
|
|
430
|
-
const ts = typeof this.timeTravelOptions.asOf === 'string'
|
|
431
|
-
? this.timeTravelOptions.asOf
|
|
432
|
-
: this.timeTravelOptions.asOf.toISOString();
|
|
433
|
-
parts.push(`FROM iceberg_scan('${this.tableName}', as_of_timestamp = '${ts}')`);
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
parts.push(`FROM ${this.tableName}`);
|
|
437
|
-
}
|
|
438
|
-
// WHERE
|
|
439
|
-
if (this.whereClauses.length > 0) {
|
|
440
|
-
parts.push(`WHERE ${this.whereClauses.join(' AND ')}`);
|
|
441
|
-
}
|
|
442
|
-
// GROUP BY
|
|
443
|
-
if (this.groupByClauses.length > 0) {
|
|
444
|
-
parts.push(`GROUP BY ${this.groupByClauses.join(', ')}`);
|
|
445
|
-
}
|
|
446
|
-
// HAVING
|
|
447
|
-
if (this.havingClauses.length > 0) {
|
|
448
|
-
parts.push(`HAVING ${this.havingClauses.join(' AND ')}`);
|
|
449
|
-
}
|
|
450
|
-
// ORDER BY
|
|
451
|
-
if (this.orderByClauses.length > 0) {
|
|
452
|
-
parts.push(`ORDER BY ${this.orderByClauses.join(', ')}`);
|
|
453
|
-
}
|
|
454
|
-
// LIMIT
|
|
455
|
-
if (this.limitValue !== undefined) {
|
|
456
|
-
parts.push(`LIMIT ${this.limitValue}`);
|
|
457
|
-
}
|
|
458
|
-
// OFFSET
|
|
459
|
-
if (this.offsetValue !== undefined) {
|
|
460
|
-
parts.push(`OFFSET ${this.offsetValue}`);
|
|
461
|
-
}
|
|
462
|
-
return {
|
|
463
|
-
sql: parts.join('\n'),
|
|
464
|
-
timeTravel: this.timeTravelOptions,
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
/**
|
|
469
|
-
* Create an Iceberg query builder
|
|
470
|
-
*/
|
|
471
|
-
export function icebergQuery(tableName) {
|
|
472
|
-
return new IcebergQueryBuilder(tableName);
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Build R2 Data Catalog endpoint URL
|
|
476
|
-
*/
|
|
477
|
-
export function buildR2CatalogEndpoint(accountId) {
|
|
478
|
-
return `https://${accountId}.r2.cloudflarestorage.com`;
|
|
479
|
-
}
|
|
480
|
-
/**
|
|
481
|
-
* Build DuckDB attach statement for R2 Data Catalog
|
|
482
|
-
*
|
|
483
|
-
* @example
|
|
484
|
-
* ```typescript
|
|
485
|
-
* const attachSql = buildR2AttachStatement({
|
|
486
|
-
* accountId: 'abc123',
|
|
487
|
-
* bucketName: 'my-iceberg-bucket',
|
|
488
|
-
* catalogName: 'my_catalog',
|
|
489
|
-
* })
|
|
490
|
-
*
|
|
491
|
-
* // Returns:
|
|
492
|
-
* // ATTACH 'r2://my-iceberg-bucket' AS my_catalog (
|
|
493
|
-
* // TYPE ICEBERG,
|
|
494
|
-
* // ENDPOINT 'https://abc123.r2.cloudflarestorage.com'
|
|
495
|
-
* // );
|
|
496
|
-
* ```
|
|
497
|
-
*/
|
|
498
|
-
export function buildR2AttachStatement(config) {
|
|
499
|
-
const endpoint = buildR2CatalogEndpoint(config.accountId);
|
|
500
|
-
return `ATTACH 'r2://${config.bucketName}' AS ${config.catalogName} (
|
|
501
|
-
TYPE ICEBERG,
|
|
502
|
-
ENDPOINT '${endpoint}'
|
|
503
|
-
);`;
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* Build DuckDB S3 credentials configuration
|
|
507
|
-
*/
|
|
508
|
-
export function buildR2CredentialsSQL(config) {
|
|
509
|
-
const endpoint = buildR2CatalogEndpoint(config.accountId);
|
|
510
|
-
return `
|
|
511
|
-
SET s3_access_key_id='${config.accessKeyId}';
|
|
512
|
-
SET s3_secret_access_key='${config.secretAccessKey}';
|
|
513
|
-
SET s3_region='auto';
|
|
514
|
-
SET s3_endpoint='${endpoint}';
|
|
515
|
-
SET s3_url_style='path';
|
|
516
|
-
`.trim();
|
|
517
|
-
}
|
|
518
|
-
/**
|
|
519
|
-
* Read Iceberg table metadata from R2
|
|
520
|
-
*
|
|
521
|
-
* This is a lightweight approach that doesn't require DuckDB-WASM,
|
|
522
|
-
* suitable for scenarios where you need minimal bundle size.
|
|
523
|
-
*
|
|
524
|
-
* @example
|
|
525
|
-
* ```typescript
|
|
526
|
-
* const metadata = await readIcebergMetadata(
|
|
527
|
-
* 'r2://my-bucket/iceberg/my-table',
|
|
528
|
-
* { endpoint: 'https://account.r2.cloudflarestorage.com' }
|
|
529
|
-
* )
|
|
530
|
-
*
|
|
531
|
-
* console.log(metadata.currentSnapshotId)
|
|
532
|
-
* console.log(metadata.schema)
|
|
533
|
-
* ```
|
|
534
|
-
*/
|
|
535
|
-
export async function readIcebergMetadata(tableUrl, config) {
|
|
536
|
-
try {
|
|
537
|
-
// Parse table URL
|
|
538
|
-
const urlMatch = tableUrl.match(/^r2:\/\/([^/]+)\/(.+)$/);
|
|
539
|
-
if (!urlMatch) {
|
|
540
|
-
throw new Error('Invalid table URL format. Expected: r2://bucket/path');
|
|
541
|
-
}
|
|
542
|
-
const [, bucket, tablePath] = urlMatch;
|
|
543
|
-
// Build metadata URL
|
|
544
|
-
const metadataUrl = `${config.endpoint}/${bucket}/${tablePath}/metadata/version-hint.text`;
|
|
545
|
-
// Fetch version hint
|
|
546
|
-
const headers = {};
|
|
547
|
-
if (config.accessKeyId && config.secretAccessKey) {
|
|
548
|
-
// Would need to implement AWS Signature V4 here
|
|
549
|
-
// For simplicity, assuming public access or pre-signed URLs
|
|
550
|
-
}
|
|
551
|
-
const versionHintResponse = await fetch(metadataUrl, { headers });
|
|
552
|
-
if (!versionHintResponse.ok) {
|
|
553
|
-
return null;
|
|
554
|
-
}
|
|
555
|
-
const version = await versionHintResponse.text();
|
|
556
|
-
// Fetch metadata file
|
|
557
|
-
const metadataFileUrl = `${config.endpoint}/${bucket}/${tablePath}/metadata/v${version.trim()}.metadata.json`;
|
|
558
|
-
const metadataResponse = await fetch(metadataFileUrl, { headers });
|
|
559
|
-
if (!metadataResponse.ok) {
|
|
560
|
-
return null;
|
|
561
|
-
}
|
|
562
|
-
const metadata = (await metadataResponse.json());
|
|
563
|
-
return {
|
|
564
|
-
formatVersion: metadata['format-version'],
|
|
565
|
-
tableUuid: metadata['table-uuid'],
|
|
566
|
-
location: metadata.location,
|
|
567
|
-
currentSnapshotId: metadata['current-snapshot-id'] ?? null,
|
|
568
|
-
lastSequenceNumber: metadata['last-sequence-number'],
|
|
569
|
-
schemas: metadata.schemas.map((s) => ({
|
|
570
|
-
schemaId: s['schema-id'],
|
|
571
|
-
fields: s.fields.map((f) => ({
|
|
572
|
-
id: f.id,
|
|
573
|
-
name: f.name,
|
|
574
|
-
type: typeof f.type === 'string' ? f.type : JSON.stringify(f.type),
|
|
575
|
-
required: f.required,
|
|
576
|
-
})),
|
|
577
|
-
})),
|
|
578
|
-
partitionSpecs: metadata['partition-specs'].map((p) => ({
|
|
579
|
-
specId: p['spec-id'],
|
|
580
|
-
fields: p.fields.map((f) => ({
|
|
581
|
-
sourceId: f['source-id'],
|
|
582
|
-
fieldId: f['field-id'],
|
|
583
|
-
name: f.name,
|
|
584
|
-
transform: f.transform,
|
|
585
|
-
})),
|
|
586
|
-
})),
|
|
587
|
-
snapshots: (metadata.snapshots ?? []).map((s) => ({
|
|
588
|
-
snapshotId: s['snapshot-id'],
|
|
589
|
-
sequenceNumber: s['sequence-number'],
|
|
590
|
-
timestampMs: s['timestamp-ms'],
|
|
591
|
-
operation: s.summary.operation,
|
|
592
|
-
manifestList: s['manifest-list'],
|
|
593
|
-
})),
|
|
594
|
-
};
|
|
595
|
-
}
|
|
596
|
-
catch {
|
|
597
|
-
return null;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
//# sourceMappingURL=duckdb-wasm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-wasm.js","sourceRoot":"","sources":["../../src/iceberg/duckdb-wasm.ts"],"names":[],"mappings":"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"}
|