@channel.io/app-sdk-server 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/datasource-runners.test.d.ts +2 -0
- package/dist/__tests__/datasource-runners.test.d.ts.map +1 -0
- package/dist/__tests__/datasource-runners.test.js +244 -0
- package/dist/__tests__/datasource-runners.test.js.map +1 -0
- package/dist/datasource/arrow.d.ts +18 -1
- package/dist/datasource/arrow.d.ts.map +1 -1
- package/dist/datasource/arrow.js +236 -12
- package/dist/datasource/arrow.js.map +1 -1
- package/dist/datasource/bigquery.d.ts +97 -0
- package/dist/datasource/bigquery.d.ts.map +1 -0
- package/dist/datasource/bigquery.js +297 -0
- package/dist/datasource/bigquery.js.map +1 -0
- package/dist/datasource/grpc.d.ts.map +1 -1
- package/dist/datasource/grpc.js +7 -1
- package/dist/datasource/grpc.js.map +1 -1
- package/dist/datasource/index.d.ts +3 -0
- package/dist/datasource/index.d.ts.map +1 -1
- package/dist/datasource/index.js +3 -0
- package/dist/datasource/index.js.map +1 -1
- package/dist/datasource/policy.d.ts +16 -0
- package/dist/datasource/policy.d.ts.map +1 -0
- package/dist/datasource/policy.js +112 -0
- package/dist/datasource/policy.js.map +1 -0
- package/dist/datasource/postgres.d.ts +32 -0
- package/dist/datasource/postgres.d.ts.map +1 -0
- package/dist/datasource/postgres.js +234 -0
- package/dist/datasource/postgres.js.map +1 -0
- package/dist/datasource/types.d.ts +17 -0
- package/dist/datasource/types.d.ts.map +1 -1
- package/dist/datasource/types.js +14 -0
- package/dist/datasource/types.js.map +1 -1
- package/package.json +26 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource-runners.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/datasource-runners.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { BigQueryDataSourceExecutor, DataSourceErrorCode, PostgresDataSourceExecutor, queryWithRowLimit, validateReadOnlyQuery, writeRowsAsArrowIpcBatch, } from "../datasource/index.js";
|
|
4
|
+
describe("datasource policy helpers", () => {
|
|
5
|
+
it("validates read-only queries and wraps row limits", () => {
|
|
6
|
+
expect(() => validateReadOnlyQuery("select * from orders", [], [{ name: "orders" }])).not.toThrow();
|
|
7
|
+
expect(() => validateReadOnlyQuery("delete from orders", [], [{ name: "orders" }])).toThrow("read-only SELECT");
|
|
8
|
+
expect(queryWithRowLimit("select * from orders;", 10)).toBe("SELECT * FROM (select * from orders) AS datasource_query LIMIT 10");
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe("Arrow row conversion", () => {
|
|
12
|
+
it("serializes row batches as schema and body frames", () => {
|
|
13
|
+
const sink = new CaptureSink();
|
|
14
|
+
const result = writeRowsAsArrowIpcBatch(sink, [
|
|
15
|
+
{ name: "id", dataTypeID: 23 },
|
|
16
|
+
{ name: "name", dataTypeID: 25 },
|
|
17
|
+
], [
|
|
18
|
+
[1, "alpha"],
|
|
19
|
+
[2, "beta"],
|
|
20
|
+
]);
|
|
21
|
+
expect(result.schemaSent).toBe(true);
|
|
22
|
+
expect(sink.schemas).toHaveLength(1);
|
|
23
|
+
expect(sink.batches.length).toBeGreaterThan(0);
|
|
24
|
+
const arrow = loadApacheArrowForTest();
|
|
25
|
+
const table = arrow.tableFromIPC(concatBytes([...sink.schemas, ...sink.batches, arrowEos()]));
|
|
26
|
+
expect(table.numRows).toBe(2);
|
|
27
|
+
expect(table.schema.fields.map((field) => field.name)).toEqual(["id", "name"]);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("PostgresDataSourceExecutor", () => {
|
|
31
|
+
it("streams pg-query-stream rows in bounded Arrow batches", async () => {
|
|
32
|
+
const client = new FakePostgresClient([
|
|
33
|
+
[1, "first"],
|
|
34
|
+
[2, "second"],
|
|
35
|
+
[3, "third"],
|
|
36
|
+
]);
|
|
37
|
+
const executor = new PostgresDataSourceExecutor({
|
|
38
|
+
sources: [
|
|
39
|
+
{
|
|
40
|
+
sourceId: "postgresql",
|
|
41
|
+
pool: { connect: async () => client },
|
|
42
|
+
tables: [{ name: "orders" }],
|
|
43
|
+
batchSize: 2,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
const sink = new CaptureSink();
|
|
48
|
+
await executor.executeQuery({
|
|
49
|
+
session: { channelId: "channel-1" },
|
|
50
|
+
sourceId: "postgresql",
|
|
51
|
+
query: "select * from orders",
|
|
52
|
+
rowLimit: 100,
|
|
53
|
+
byteLimit: 1024 * 1024,
|
|
54
|
+
timeoutMs: 1000,
|
|
55
|
+
}, sink);
|
|
56
|
+
expect(client.sqlQueries).toEqual([
|
|
57
|
+
"BEGIN READ ONLY",
|
|
58
|
+
"SET LOCAL statement_timeout = 1000",
|
|
59
|
+
"COMMIT",
|
|
60
|
+
]);
|
|
61
|
+
expect(client.streamQueryText).toBe("SELECT * FROM (select * from orders) AS datasource_query LIMIT 100");
|
|
62
|
+
expect(sink.schemas).toHaveLength(1);
|
|
63
|
+
expect(sink.batches.length).toBeGreaterThanOrEqual(2);
|
|
64
|
+
expect(sink.results).toEqual([{ rowCount: 3, limitExceeded: false }]);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("BigQueryDataSourceExecutor", () => {
|
|
68
|
+
it("runs a query job and relays BigQuery Storage Arrow chunks", async () => {
|
|
69
|
+
const job = new FakeBigQueryJob();
|
|
70
|
+
const bigQueryClient = new FakeBigQueryClient(job);
|
|
71
|
+
const readClient = new FakeBigQueryReadClient();
|
|
72
|
+
const executor = new BigQueryDataSourceExecutor({
|
|
73
|
+
projectId: "project-1",
|
|
74
|
+
bigQueryClient,
|
|
75
|
+
readClient,
|
|
76
|
+
sources: [
|
|
77
|
+
{
|
|
78
|
+
sourceId: "bigquery",
|
|
79
|
+
datasetId: "app_cafe24",
|
|
80
|
+
maximumBytesBilled: "1048576",
|
|
81
|
+
tables: [{ name: "orders" }],
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
});
|
|
85
|
+
const sink = new CaptureSink();
|
|
86
|
+
await executor.executeQuery({
|
|
87
|
+
session: { channelId: "channel-1" },
|
|
88
|
+
sourceId: "bigquery",
|
|
89
|
+
query: "select * from orders",
|
|
90
|
+
rowLimit: 10,
|
|
91
|
+
byteLimit: 1024 * 1024,
|
|
92
|
+
timeoutMs: 2000,
|
|
93
|
+
}, sink);
|
|
94
|
+
expect(bigQueryClient.options?.query).toBe("SELECT * FROM (select * from orders) AS datasource_query LIMIT 10");
|
|
95
|
+
expect(bigQueryClient.options?.maximumBytesBilled).toBe("1048576");
|
|
96
|
+
expect(readClient.createReadSessionRequest?.readSession.table).toBe("projects/project-1/datasets/_anon/tables/job_result");
|
|
97
|
+
expect(sink.schemas).toEqual([new Uint8Array([1, 2, 3])]);
|
|
98
|
+
expect(sink.batches).toEqual([new Uint8Array([4, 5]), new Uint8Array([6])]);
|
|
99
|
+
expect(sink.results).toEqual([{ rowCount: 3, limitExceeded: false }]);
|
|
100
|
+
});
|
|
101
|
+
it("maps BigQuery failures to external datasource errors", async () => {
|
|
102
|
+
const bigQueryClient = {
|
|
103
|
+
createQueryJob: async () => {
|
|
104
|
+
const error = new Error("denied");
|
|
105
|
+
error.code = "accessDenied";
|
|
106
|
+
throw error;
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
const executor = new BigQueryDataSourceExecutor({
|
|
110
|
+
projectId: "project-1",
|
|
111
|
+
bigQueryClient,
|
|
112
|
+
readClient: new FakeBigQueryReadClient(),
|
|
113
|
+
sources: [{ sourceId: "bigquery", datasetId: "app_cafe24" }],
|
|
114
|
+
});
|
|
115
|
+
await expect(executor.executeQuery({
|
|
116
|
+
session: { channelId: "channel-1" },
|
|
117
|
+
sourceId: "bigquery",
|
|
118
|
+
query: "select 1",
|
|
119
|
+
rowLimit: 10,
|
|
120
|
+
byteLimit: 100,
|
|
121
|
+
timeoutMs: 1000,
|
|
122
|
+
}, new CaptureSink())).rejects.toMatchObject({
|
|
123
|
+
code: DataSourceErrorCode.ExternalError,
|
|
124
|
+
upstream: { engine: "bigquery", code: "accessDenied" },
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
class CaptureSink {
|
|
129
|
+
schemas = [];
|
|
130
|
+
batches = [];
|
|
131
|
+
results = [];
|
|
132
|
+
send(chunk) {
|
|
133
|
+
if (chunk.arrow?.dataHeader) {
|
|
134
|
+
this.schemas.push(chunk.arrow.dataHeader);
|
|
135
|
+
}
|
|
136
|
+
if (chunk.arrow?.dataBody) {
|
|
137
|
+
this.batches.push(chunk.arrow.dataBody);
|
|
138
|
+
}
|
|
139
|
+
if (chunk.result) {
|
|
140
|
+
this.results.push({
|
|
141
|
+
rowCount: chunk.result.rowCount ?? 0,
|
|
142
|
+
limitExceeded: chunk.result.limitExceeded ?? false,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
class FakePostgresClient {
|
|
148
|
+
rows;
|
|
149
|
+
sqlQueries = [];
|
|
150
|
+
streamQueryText;
|
|
151
|
+
constructor(rows) {
|
|
152
|
+
this.rows = rows;
|
|
153
|
+
}
|
|
154
|
+
query(query) {
|
|
155
|
+
if (typeof query === "string") {
|
|
156
|
+
this.sqlQueries.push(query);
|
|
157
|
+
return Promise.resolve();
|
|
158
|
+
}
|
|
159
|
+
const queryStream = query;
|
|
160
|
+
if (queryStream.cursor?.text) {
|
|
161
|
+
this.streamQueryText = queryStream.cursor.text;
|
|
162
|
+
}
|
|
163
|
+
queryStream._result = {
|
|
164
|
+
fields: [
|
|
165
|
+
{ name: "id", dataTypeID: 23 },
|
|
166
|
+
{ name: "name", dataTypeID: 25 },
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
return asyncRows(this.rows);
|
|
170
|
+
}
|
|
171
|
+
release() { }
|
|
172
|
+
}
|
|
173
|
+
class FakeBigQueryClient {
|
|
174
|
+
job;
|
|
175
|
+
options;
|
|
176
|
+
constructor(job) {
|
|
177
|
+
this.job = job;
|
|
178
|
+
}
|
|
179
|
+
async createQueryJob(options) {
|
|
180
|
+
this.options = options;
|
|
181
|
+
return [this.job];
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
class FakeBigQueryJob {
|
|
185
|
+
async getQueryResults() {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
async getMetadata() {
|
|
189
|
+
return [
|
|
190
|
+
{
|
|
191
|
+
configuration: {
|
|
192
|
+
query: {
|
|
193
|
+
destinationTable: {
|
|
194
|
+
projectId: "project-1",
|
|
195
|
+
datasetId: "_anon",
|
|
196
|
+
tableId: "job_result",
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
class FakeBigQueryReadClient {
|
|
205
|
+
createReadSessionRequest;
|
|
206
|
+
async createReadSession(request) {
|
|
207
|
+
this.createReadSessionRequest = request;
|
|
208
|
+
return [
|
|
209
|
+
{
|
|
210
|
+
arrowSchema: { serializedSchema: new Uint8Array([1, 2, 3]) },
|
|
211
|
+
streams: [{ name: "stream-1" }],
|
|
212
|
+
},
|
|
213
|
+
];
|
|
214
|
+
}
|
|
215
|
+
readRows() {
|
|
216
|
+
return asyncRows([
|
|
217
|
+
{ arrowRecordBatch: { serializedRecordBatch: new Uint8Array([4, 5]) }, rowCount: 2 },
|
|
218
|
+
{ arrowRecordBatch: { serializedRecordBatch: new Uint8Array([6]) }, rowCount: 1 },
|
|
219
|
+
]);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async function* asyncRows(rows) {
|
|
223
|
+
for (const row of rows) {
|
|
224
|
+
yield row;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function concatBytes(chunks) {
|
|
228
|
+
const total = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
|
|
229
|
+
const out = new Uint8Array(total);
|
|
230
|
+
let offset = 0;
|
|
231
|
+
for (const chunk of chunks) {
|
|
232
|
+
out.set(chunk, offset);
|
|
233
|
+
offset += chunk.byteLength;
|
|
234
|
+
}
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
function arrowEos() {
|
|
238
|
+
return new Uint8Array([255, 255, 255, 255, 0, 0, 0, 0]);
|
|
239
|
+
}
|
|
240
|
+
function loadApacheArrowForTest() {
|
|
241
|
+
const require = createRequire(import.meta.url);
|
|
242
|
+
return require("apache-arrow");
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=datasource-runners.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource-runners.test.js","sourceRoot":"","sources":["../../src/__tests__/datasource-runners.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
import type { QueryChunk } from "./types.js";
|
|
1
|
+
import type { QueryChunk, QueryChunkSink } from "./types.js";
|
|
2
2
|
export interface ArrowColumn {
|
|
3
3
|
name: string;
|
|
4
4
|
type?: string;
|
|
5
5
|
}
|
|
6
|
+
export interface ArrowField extends ArrowColumn {
|
|
7
|
+
dataTypeID?: number;
|
|
8
|
+
databaseType?: string;
|
|
9
|
+
nullable?: boolean;
|
|
10
|
+
}
|
|
6
11
|
export type ArrowRow = Record<string, unknown>;
|
|
12
|
+
export interface ArrowBatchWriteOptions {
|
|
13
|
+
sendSchema?: boolean;
|
|
14
|
+
byteLimit?: ByteLimitTrackerLike;
|
|
15
|
+
}
|
|
16
|
+
export interface ArrowBatchWriteResult {
|
|
17
|
+
schemaSent: boolean;
|
|
18
|
+
frameCount: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ByteLimitTrackerLike {
|
|
21
|
+
reserve(size: number): void;
|
|
22
|
+
}
|
|
7
23
|
export declare function encodeRowsToArrowIPC(columns: ArrowColumn[], rows: ArrowRow[]): Uint8Array;
|
|
8
24
|
export declare function arrowRowsChunk(columns: ArrowColumn[], rows: ArrowRow[]): QueryChunk;
|
|
9
25
|
export declare function resultChunk(rowCount: number, limitExceeded?: boolean, executionMs?: number): QueryChunk;
|
|
26
|
+
export declare function writeRowsAsArrowIpcBatch(sink: QueryChunkSink, fields: readonly ArrowField[], rows: readonly (readonly unknown[])[], options?: ArrowBatchWriteOptions): ArrowBatchWriteResult;
|
|
10
27
|
//# sourceMappingURL=arrow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow.d.ts","sourceRoot":"","sources":["../../src/datasource/arrow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"arrow.d.ts","sourceRoot":"","sources":["../../src/datasource/arrow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AA4BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,UAAU,CAQzF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,UAAU,CAMnF;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,UAAQ,EAAE,WAAW,SAAI,GAAG,UAAU,CAQhG;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,IAAI,EAAE,SAAS,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,EACrC,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAqBvB"}
|
package/dist/datasource/arrow.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { DataSourceErrorCode, DataSourceExecutionError } from "./types.js";
|
|
3
|
+
let cachedArrow;
|
|
2
4
|
export function encodeRowsToArrowIPC(columns, rows) {
|
|
3
5
|
if (columns.length === 0) {
|
|
4
6
|
throw new Error("columns are required");
|
|
5
7
|
}
|
|
6
|
-
|
|
7
|
-
for (const column of columns) {
|
|
8
|
-
arrays[column.name] = rows.map((row) => normalizeValue(row[column.name]));
|
|
9
|
-
}
|
|
10
|
-
return tableToIPC(tableFromArrays(arrays), "stream");
|
|
8
|
+
return rowsToArrowIPC(columns, rows.map((row) => columns.map((column) => row[column.name])));
|
|
11
9
|
}
|
|
12
10
|
export function arrowRowsChunk(columns, rows) {
|
|
13
11
|
return {
|
|
@@ -25,13 +23,239 @@ export function resultChunk(rowCount, limitExceeded = false, executionMs = 0) {
|
|
|
25
23
|
},
|
|
26
24
|
};
|
|
27
25
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
export function writeRowsAsArrowIpcBatch(sink, fields, rows, options = {}) {
|
|
27
|
+
const bytes = rowsToArrowIPC(fields, rows);
|
|
28
|
+
let schemaSent = false;
|
|
29
|
+
let frameCount = 0;
|
|
30
|
+
for (const frame of splitArrowIpcStream(bytes)) {
|
|
31
|
+
if (frame.kind === "schema") {
|
|
32
|
+
if (options.sendSchema !== false) {
|
|
33
|
+
options.byteLimit?.reserve(frame.bytes.byteLength);
|
|
34
|
+
sink.send({ arrow: { dataHeader: frame.bytes } });
|
|
35
|
+
schemaSent = true;
|
|
36
|
+
frameCount++;
|
|
37
|
+
}
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
options.byteLimit?.reserve(frame.bytes.byteLength);
|
|
41
|
+
sink.send({ arrow: { dataBody: frame.bytes } });
|
|
42
|
+
frameCount++;
|
|
43
|
+
}
|
|
44
|
+
return { schemaSent, frameCount };
|
|
45
|
+
}
|
|
46
|
+
function rowsToArrowIPC(fields, rows) {
|
|
47
|
+
if (fields.length === 0) {
|
|
48
|
+
throw new Error("columns are required");
|
|
49
|
+
}
|
|
50
|
+
const arrow = loadApacheArrow();
|
|
51
|
+
const usedNames = new Map();
|
|
52
|
+
const arrays = {};
|
|
53
|
+
fields.forEach((field, index) => {
|
|
54
|
+
const name = uniqueColumnName(field.name || `column_${index + 1}`, usedNames);
|
|
55
|
+
const values = rows.map((row) => normalizeArrowValue(row[index], field));
|
|
56
|
+
const type = arrowTypeFromField(arrow, field);
|
|
57
|
+
arrays[name] = arrow.vectorFromArray ? arrow.vectorFromArray(values, type) : values;
|
|
58
|
+
});
|
|
59
|
+
const table = arrow.vectorFromArray
|
|
60
|
+
? new arrow.Table(arrays)
|
|
61
|
+
: arrow.tableFromArrays(arrays);
|
|
62
|
+
return arrow.tableToIPC(table, "stream");
|
|
63
|
+
}
|
|
64
|
+
function splitArrowIpcStream(bytes) {
|
|
65
|
+
const arrow = loadApacheArrow();
|
|
66
|
+
const frames = [];
|
|
67
|
+
let offset = 0;
|
|
68
|
+
while (offset < bytes.byteLength) {
|
|
69
|
+
const frameStart = offset;
|
|
70
|
+
let metadataLength = readInt32LE(bytes, offset);
|
|
71
|
+
offset += 4;
|
|
72
|
+
if (metadataLength === 0) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (metadataLength === -1) {
|
|
76
|
+
metadataLength = readInt32LE(bytes, offset);
|
|
77
|
+
offset += 4;
|
|
78
|
+
if (metadataLength === 0) {
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const metadataStart = offset;
|
|
83
|
+
const metadataEnd = metadataStart + metadataLength;
|
|
84
|
+
if (metadataEnd > bytes.byteLength) {
|
|
85
|
+
throw new Error("invalid Arrow IPC metadata length");
|
|
86
|
+
}
|
|
87
|
+
const message = arrow.Message.decode(bytes.slice(metadataStart, metadataEnd));
|
|
88
|
+
const bodyLength = Number(message.bodyLength ?? 0);
|
|
89
|
+
const frameEnd = metadataEnd + bodyLength;
|
|
90
|
+
if (frameEnd > bytes.byteLength) {
|
|
91
|
+
throw new Error("invalid Arrow IPC body length");
|
|
92
|
+
}
|
|
93
|
+
if (message.headerType === arrow.MessageHeader.Schema) {
|
|
94
|
+
frames.push({ kind: "schema", bytes: bytes.slice(frameStart, frameEnd) });
|
|
95
|
+
}
|
|
96
|
+
else if (message.headerType === arrow.MessageHeader.RecordBatch ||
|
|
97
|
+
message.headerType === arrow.MessageHeader.DictionaryBatch) {
|
|
98
|
+
frames.push({ kind: "body", bytes: bytes.slice(frameStart, frameEnd) });
|
|
99
|
+
}
|
|
100
|
+
offset = frameEnd;
|
|
101
|
+
}
|
|
102
|
+
return frames;
|
|
103
|
+
}
|
|
104
|
+
function arrowTypeFromField(arrow, field) {
|
|
105
|
+
switch (field.dataTypeID) {
|
|
106
|
+
case 16:
|
|
107
|
+
return new arrow.Bool();
|
|
108
|
+
case 21:
|
|
109
|
+
return new arrow.Int16();
|
|
110
|
+
case 23:
|
|
111
|
+
return new arrow.Int32();
|
|
112
|
+
case 20:
|
|
113
|
+
return new arrow.Int64();
|
|
114
|
+
case 700:
|
|
115
|
+
case 701:
|
|
116
|
+
return new arrow.Float64();
|
|
117
|
+
case 17:
|
|
118
|
+
return new arrow.Binary();
|
|
119
|
+
case 1082:
|
|
120
|
+
return new arrow.DateDay();
|
|
121
|
+
case 1114:
|
|
122
|
+
case 1184:
|
|
123
|
+
return new arrow.TimestampMillisecond("UTC");
|
|
124
|
+
default:
|
|
125
|
+
return arrowTypeFromDatabaseTypeName(arrow, field.databaseType ?? field.type);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function arrowTypeFromDatabaseTypeName(arrow, databaseType) {
|
|
129
|
+
switch (databaseType?.trim().toUpperCase()) {
|
|
130
|
+
case "BOOL":
|
|
131
|
+
case "BOOLEAN":
|
|
132
|
+
return new arrow.Bool();
|
|
133
|
+
case "INT2":
|
|
134
|
+
case "SMALLINT":
|
|
135
|
+
return new arrow.Int16();
|
|
136
|
+
case "INT4":
|
|
137
|
+
case "INTEGER":
|
|
138
|
+
case "SERIAL":
|
|
139
|
+
return new arrow.Int32();
|
|
140
|
+
case "INT8":
|
|
141
|
+
case "BIGINT":
|
|
142
|
+
case "BIGSERIAL":
|
|
143
|
+
return new arrow.Int64();
|
|
144
|
+
case "FLOAT4":
|
|
145
|
+
case "FLOAT8":
|
|
146
|
+
case "REAL":
|
|
147
|
+
case "DOUBLE":
|
|
148
|
+
case "DOUBLE PRECISION":
|
|
149
|
+
case "NUMERIC":
|
|
150
|
+
case "DECIMAL":
|
|
151
|
+
return new arrow.Float64();
|
|
152
|
+
case "BYTEA":
|
|
153
|
+
case "BINARY":
|
|
154
|
+
case "VARBINARY":
|
|
155
|
+
return new arrow.Binary();
|
|
156
|
+
case "DATE":
|
|
157
|
+
return new arrow.DateDay();
|
|
158
|
+
case "TIMESTAMP":
|
|
159
|
+
case "TIMESTAMPTZ":
|
|
160
|
+
case "TIMESTAMPZ":
|
|
161
|
+
case "DATETIME":
|
|
162
|
+
return new arrow.TimestampMillisecond("UTC");
|
|
163
|
+
default:
|
|
164
|
+
return new arrow.Utf8();
|
|
31
165
|
}
|
|
32
|
-
|
|
33
|
-
|
|
166
|
+
}
|
|
167
|
+
function normalizeArrowValue(value, field) {
|
|
168
|
+
if (value === null || value === undefined) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
switch (field.dataTypeID) {
|
|
172
|
+
case 20:
|
|
173
|
+
return typeof value === "bigint" ? value : BigInt(stringifyArrowValue(value));
|
|
174
|
+
case 21:
|
|
175
|
+
case 23:
|
|
176
|
+
case 700:
|
|
177
|
+
case 701:
|
|
178
|
+
return Number(value);
|
|
179
|
+
case 17:
|
|
180
|
+
return value instanceof Uint8Array ? value : Buffer.from(stringifyArrowValue(value));
|
|
181
|
+
case 1082:
|
|
182
|
+
case 1114:
|
|
183
|
+
case 1184:
|
|
184
|
+
return value instanceof Date ? value : new Date(stringifyArrowValue(value));
|
|
185
|
+
case 114:
|
|
186
|
+
case 3802:
|
|
187
|
+
case 1700:
|
|
188
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
189
|
+
default:
|
|
190
|
+
if (value instanceof Date || value instanceof Uint8Array) {
|
|
191
|
+
return value;
|
|
192
|
+
}
|
|
193
|
+
if (typeof value === "bigint") {
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
if (typeof value === "object") {
|
|
197
|
+
return JSON.stringify(value);
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function stringifyArrowValue(value) {
|
|
203
|
+
switch (typeof value) {
|
|
204
|
+
case "string":
|
|
205
|
+
return value;
|
|
206
|
+
case "number":
|
|
207
|
+
case "boolean":
|
|
208
|
+
case "bigint":
|
|
209
|
+
return value.toString();
|
|
210
|
+
case "symbol":
|
|
211
|
+
return value.description ?? "";
|
|
212
|
+
case "undefined":
|
|
213
|
+
return "";
|
|
214
|
+
case "function":
|
|
215
|
+
return "";
|
|
216
|
+
case "object":
|
|
217
|
+
if (value === null) {
|
|
218
|
+
return "";
|
|
219
|
+
}
|
|
220
|
+
if (value instanceof Date) {
|
|
221
|
+
return value.toISOString();
|
|
222
|
+
}
|
|
223
|
+
if (value instanceof Uint8Array) {
|
|
224
|
+
return Buffer.from(value).toString();
|
|
225
|
+
}
|
|
226
|
+
return JSON.stringify(value);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function uniqueColumnName(name, usedNames) {
|
|
230
|
+
const previous = usedNames.get(name) ?? 0;
|
|
231
|
+
usedNames.set(name, previous + 1);
|
|
232
|
+
return previous === 0 ? name : `${name}_${previous + 1}`;
|
|
233
|
+
}
|
|
234
|
+
function readInt32LE(bytes, offset) {
|
|
235
|
+
if (offset + 4 > bytes.byteLength) {
|
|
236
|
+
throw new Error("invalid Arrow IPC frame");
|
|
237
|
+
}
|
|
238
|
+
return new DataView(bytes.buffer, bytes.byteOffset + offset, 4).getInt32(0, true);
|
|
239
|
+
}
|
|
240
|
+
function loadApacheArrow() {
|
|
241
|
+
if (cachedArrow) {
|
|
242
|
+
return cachedArrow;
|
|
34
243
|
}
|
|
35
|
-
|
|
244
|
+
try {
|
|
245
|
+
const require = createRequire(import.meta.url);
|
|
246
|
+
cachedArrow = require("apache-arrow");
|
|
247
|
+
return cachedArrow;
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
throw new DataSourceExecutionError({
|
|
251
|
+
code: DataSourceErrorCode.Unavailable,
|
|
252
|
+
message: `apache-arrow is required for datasource Arrow conversion: ${errorMessage(error)}`,
|
|
253
|
+
retryable: false,
|
|
254
|
+
cause: error,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function errorMessage(error) {
|
|
259
|
+
return error instanceof Error ? error.message : String(error);
|
|
36
260
|
}
|
|
37
261
|
//# sourceMappingURL=arrow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow.js","sourceRoot":"","sources":["../../src/datasource/arrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"arrow.js","sourceRoot":"","sources":["../../src/datasource/arrow.ts"],"names":[],"mappings":"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"}
|