@querypanel/node-sdk 1.0.25 → 1.0.26
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 +23 -0
- package/dist/cjs/__tests__/ingest.test.d.ts +5 -0
- package/dist/cjs/__tests__/ingest.test.d.ts.map +1 -0
- package/dist/cjs/__tests__/ingest.test.js +95 -0
- package/dist/cjs/__tests__/ingest.test.js.map +1 -0
- package/dist/cjs/adapters/clickhouse.d.ts +48 -0
- package/dist/cjs/adapters/clickhouse.d.ts.map +1 -0
- package/dist/cjs/adapters/clickhouse.js +284 -0
- package/dist/cjs/adapters/clickhouse.js.map +1 -0
- package/dist/cjs/adapters/introspection.spec.d.ts +2 -0
- package/dist/cjs/adapters/introspection.spec.d.ts.map +1 -0
- package/dist/cjs/adapters/introspection.spec.js +192 -0
- package/dist/cjs/adapters/introspection.spec.js.map +1 -0
- package/dist/cjs/adapters/postgres.d.ts +46 -0
- package/dist/cjs/adapters/postgres.d.ts.map +1 -0
- package/dist/cjs/adapters/postgres.js +457 -0
- package/dist/cjs/adapters/postgres.js.map +1 -0
- package/dist/cjs/adapters/postgres.spec.d.ts +2 -0
- package/dist/cjs/adapters/postgres.spec.d.ts.map +1 -0
- package/dist/cjs/adapters/postgres.spec.js +37 -0
- package/dist/cjs/adapters/postgres.spec.js.map +1 -0
- package/dist/cjs/adapters/types.d.ts +38 -0
- package/dist/cjs/adapters/types.d.ts.map +1 -0
- package/dist/cjs/adapters/types.js +3 -0
- package/dist/cjs/adapters/types.js.map +1 -0
- package/dist/cjs/anonymize.spec.d.ts +2 -0
- package/dist/cjs/anonymize.spec.d.ts.map +1 -0
- package/dist/cjs/anonymize.spec.js +78 -0
- package/dist/cjs/anonymize.spec.js.map +1 -0
- package/dist/cjs/clickhouseClient.spec.d.ts +2 -0
- package/dist/cjs/clickhouseClient.spec.d.ts.map +1 -0
- package/dist/cjs/clickhouseClient.spec.js +286 -0
- package/dist/cjs/clickhouseClient.spec.js.map +1 -0
- package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.d.ts +2 -0
- package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.d.ts.map +1 -0
- package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.js +119 -0
- package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.js.map +1 -0
- package/dist/cjs/connectors/base.d.ts +13 -0
- package/dist/cjs/connectors/base.d.ts.map +1 -0
- package/dist/cjs/connectors/base.js +3 -0
- package/dist/cjs/connectors/base.js.map +1 -0
- package/dist/cjs/connectors/clickhouse.d.ts +53 -0
- package/dist/cjs/connectors/clickhouse.d.ts.map +1 -0
- package/dist/cjs/connectors/clickhouse.js +270 -0
- package/dist/cjs/connectors/clickhouse.js.map +1 -0
- package/dist/cjs/index.d.ts +490 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +843 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/index.test.d.ts +2 -0
- package/dist/cjs/index.test.d.ts.map +1 -0
- package/dist/cjs/index.test.js +185 -0
- package/dist/cjs/index.test.js.map +1 -0
- package/dist/cjs/introspectV3.d.ts +45 -0
- package/dist/cjs/introspectV3.d.ts.map +1 -0
- package/dist/cjs/introspectV3.js +99 -0
- package/dist/cjs/introspectV3.js.map +1 -0
- package/dist/cjs/multidb.spec.d.ts +2 -0
- package/dist/cjs/multidb.spec.d.ts.map +1 -0
- package/dist/cjs/multidb.spec.js +76 -0
- package/dist/cjs/multidb.spec.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schema/types.d.ts +73 -0
- package/dist/cjs/schema/types.d.ts.map +1 -0
- package/dist/cjs/schema/types.js +3 -0
- package/dist/cjs/schema/types.js.map +1 -0
- package/dist/cjs/tenant-isolation.spec.d.ts +2 -0
- package/dist/cjs/tenant-isolation.spec.d.ts.map +1 -0
- package/dist/cjs/tenant-isolation.spec.js +420 -0
- package/dist/cjs/tenant-isolation.spec.js.map +1 -0
- package/dist/cjs/utils/clickhouse.d.ts +9 -0
- package/dist/cjs/utils/clickhouse.d.ts.map +1 -0
- package/dist/cjs/utils/clickhouse.js +99 -0
- package/dist/cjs/utils/clickhouse.js.map +1 -0
- package/dist/esm/adapters/clickhouse.d.ts +48 -0
- package/dist/esm/adapters/clickhouse.d.ts.map +1 -0
- package/dist/esm/adapters/clickhouse.js +280 -0
- package/dist/esm/adapters/clickhouse.js.map +1 -0
- package/dist/esm/adapters/introspection.spec.d.ts +2 -0
- package/dist/esm/adapters/introspection.spec.d.ts.map +1 -0
- package/dist/esm/adapters/introspection.spec.js +190 -0
- package/dist/esm/adapters/introspection.spec.js.map +1 -0
- package/dist/esm/adapters/postgres.d.ts +46 -0
- package/dist/esm/adapters/postgres.d.ts.map +1 -0
- package/dist/esm/adapters/postgres.js +453 -0
- package/dist/esm/adapters/postgres.js.map +1 -0
- package/dist/esm/adapters/postgres.spec.d.ts +2 -0
- package/dist/esm/adapters/postgres.spec.d.ts.map +1 -0
- package/dist/esm/adapters/postgres.spec.js +35 -0
- package/dist/esm/adapters/postgres.spec.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +38 -0
- package/dist/esm/adapters/types.d.ts.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/anonymize.spec.d.ts +2 -0
- package/dist/esm/anonymize.spec.d.ts.map +1 -0
- package/dist/esm/anonymize.spec.js +76 -0
- package/dist/esm/anonymize.spec.js.map +1 -0
- package/dist/esm/clickhouseClient.spec.d.ts +2 -0
- package/dist/esm/clickhouseClient.spec.d.ts.map +1 -0
- package/dist/esm/clickhouseClient.spec.js +281 -0
- package/dist/esm/clickhouseClient.spec.js.map +1 -0
- package/dist/esm/connectors/base.d.ts +14 -0
- package/dist/esm/connectors/base.d.ts.map +1 -0
- package/dist/esm/connectors/base.js +2 -0
- package/dist/esm/connectors/base.js.map +1 -0
- package/dist/esm/connectors/clickhouse.d.ts +35 -0
- package/dist/esm/connectors/clickhouse.d.ts.map +1 -0
- package/dist/esm/connectors/clickhouse.js +281 -0
- package/dist/esm/connectors/clickhouse.js.map +1 -0
- package/dist/esm/index.d.ts +490 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +838 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.test.d.ts +2 -0
- package/dist/esm/index.test.d.ts.map +1 -0
- package/dist/esm/index.test.js +183 -0
- package/dist/esm/index.test.js.map +1 -0
- package/dist/esm/introspectV3.d.ts +45 -0
- package/dist/esm/introspectV3.d.ts.map +1 -0
- package/dist/esm/introspectV3.js +96 -0
- package/dist/esm/introspectV3.js.map +1 -0
- package/dist/esm/multidb.spec.d.ts +2 -0
- package/dist/esm/multidb.spec.d.ts.map +1 -0
- package/dist/esm/multidb.spec.js +74 -0
- package/dist/esm/multidb.spec.js.map +1 -0
- package/dist/esm/schema/types.d.ts +73 -0
- package/dist/esm/schema/types.d.ts.map +1 -0
- package/dist/esm/schema/types.js +2 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/tenant-isolation.spec.d.ts +2 -0
- package/dist/esm/tenant-isolation.spec.d.ts.map +1 -0
- package/dist/esm/tenant-isolation.spec.js +418 -0
- package/dist/esm/tenant-isolation.spec.js.map +1 -0
- package/dist/esm/utils/clickhouse.d.ts +9 -0
- package/dist/esm/utils/clickhouse.d.ts.map +1 -0
- package/dist/esm/utils/clickhouse.js +92 -0
- package/dist/esm/utils/clickhouse.js.map +1 -0
- package/package.json +73 -53
- package/dist/index.cjs +0 -1471
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -468
- package/dist/index.d.ts +0 -468
- package/dist/index.js +0 -1443
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -90,6 +90,29 @@ Every request is signed with `RS256` using the private key you pass to the const
|
|
|
90
90
|
- Schema ingestion failures are logged to `console.warn` during auto-sync, but you can call `syncSchema(..., { force: true })` to surface them directly.
|
|
91
91
|
- `ask()` raises immediately for guardrail/moderation errors because `/query` responds with 4xx/5xx.
|
|
92
92
|
|
|
93
|
+
### Automatic SQL repair and retry
|
|
94
|
+
|
|
95
|
+
When SQL execution fails (e.g., invalid column name, syntax error), the SDK can automatically retry with a repaired query:
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
const response = await qp.ask("Show revenue by country", {
|
|
99
|
+
tenantId: "tenant_123",
|
|
100
|
+
maxRetry: 3, // Automatically retry up to 3 times on execution error
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
console.log(`Query succeeded after ${response.attempts} attempt(s)`);
|
|
104
|
+
console.table(response.rows);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The SDK will:
|
|
108
|
+
1. Execute the generated SQL
|
|
109
|
+
2. If execution fails, send the error back to the server with the failed SQL
|
|
110
|
+
3. Get a repaired SQL query from the server
|
|
111
|
+
4. Execute the repaired query
|
|
112
|
+
5. Repeat up to `maxRetry` times
|
|
113
|
+
|
|
114
|
+
Without `maxRetry`, execution errors throw immediately (default behavior).
|
|
115
|
+
|
|
93
116
|
## Need more?
|
|
94
117
|
|
|
95
118
|
Open an issue or extend `node-sdk/src/index.ts`—every route lives in one file. Pull requests are welcome for additional adapters, richer param coercion, or convenience helpers around charts/annotations.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/ingest.test.ts"],"names":[],"mappings":"AAKA,OAAO,CAAC,MAAM,CAAC;IAEX,IAAI,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACtC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const index_js_1 = require("../index.js");
|
|
5
|
+
const noop = () => { };
|
|
6
|
+
class StubConnector {
|
|
7
|
+
constructor(introspection) {
|
|
8
|
+
this.introspection = introspection;
|
|
9
|
+
this.connect = vitest_1.vi.fn(async () => { });
|
|
10
|
+
this.close = vitest_1.vi.fn(async () => { });
|
|
11
|
+
this.executeQuery = vitest_1.vi.fn(async () => []);
|
|
12
|
+
this.introspect = vitest_1.vi.fn(async (_options) => this.introspection);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
(0, vitest_1.describe)('Ingestion API', () => {
|
|
16
|
+
const originalFetch = globalThis.fetch;
|
|
17
|
+
const fakeResponse = {
|
|
18
|
+
ok: true,
|
|
19
|
+
status: 200,
|
|
20
|
+
text: async () => JSON.stringify({ message: 'ok', ingestedTables: 1 }),
|
|
21
|
+
};
|
|
22
|
+
let fetchMock;
|
|
23
|
+
(0, vitest_1.beforeEach)(() => {
|
|
24
|
+
fetchMock = vitest_1.vi.fn().mockResolvedValue(fakeResponse);
|
|
25
|
+
globalThis.fetch = fetchMock;
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.afterEach)(() => {
|
|
28
|
+
fetchMock.mockReset();
|
|
29
|
+
if (originalFetch) {
|
|
30
|
+
globalThis.fetch = originalFetch;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
delete globalThis.fetch;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)('posts schema introspection payloads with merged metadata', async () => {
|
|
37
|
+
const sdk = new index_js_1.QueryPanelSdkAPI('https://example.com', 'token');
|
|
38
|
+
const introspection = {
|
|
39
|
+
db: { kind: 'clickhouse', name: 'analytics' },
|
|
40
|
+
tables: [],
|
|
41
|
+
introspectedAt: new Date().toISOString(),
|
|
42
|
+
metadata: { existing: true },
|
|
43
|
+
};
|
|
44
|
+
const response = await sdk.ingestSchema(introspection, {
|
|
45
|
+
tenantId: 'tenant-1',
|
|
46
|
+
metadata: { triggeredBy: 'test' },
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.expect)(response).toMatchObject({ message: 'ok', ingestedTables: 1 });
|
|
49
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(1);
|
|
50
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
51
|
+
(0, vitest_1.expect)(url).toBe('https://example.com/ingest/schema');
|
|
52
|
+
(0, vitest_1.expect)(init.method).toBe('POST');
|
|
53
|
+
(0, vitest_1.expect)(init.headers).toMatchObject({
|
|
54
|
+
Authorization: 'Bearer token',
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
});
|
|
57
|
+
const body = JSON.parse(init.body);
|
|
58
|
+
(0, vitest_1.expect)(body.metadata).toEqual({ existing: true, triggeredBy: 'test' });
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.it)('introspects via connector and closes connections by default', async () => {
|
|
61
|
+
const sdk = new index_js_1.QueryPanelSdkAPI('https://example.com', 'token');
|
|
62
|
+
const introspection = {
|
|
63
|
+
db: { kind: 'clickhouse', name: 'analytics' },
|
|
64
|
+
tables: [],
|
|
65
|
+
introspectedAt: new Date().toISOString(),
|
|
66
|
+
};
|
|
67
|
+
const connector = new StubConnector(introspection);
|
|
68
|
+
const response = await sdk.introspectAndIngest(connector, {
|
|
69
|
+
tenantId: 'tenant-1',
|
|
70
|
+
metadata: { flow: 'batch' },
|
|
71
|
+
tables: ['events'],
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.expect)(response.message).toBe('ok');
|
|
74
|
+
(0, vitest_1.expect)(connector.connect).toHaveBeenCalledTimes(1);
|
|
75
|
+
(0, vitest_1.expect)(connector.introspect).toHaveBeenCalledWith({ tables: ['events'] });
|
|
76
|
+
(0, vitest_1.expect)(connector.close).toHaveBeenCalledTimes(1);
|
|
77
|
+
const [, init] = fetchMock.mock.calls[0];
|
|
78
|
+
const body = JSON.parse(init.body);
|
|
79
|
+
(0, vitest_1.expect)(body.metadata).toEqual({ flow: 'batch' });
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)('respects keepConnectionOpen option', async () => {
|
|
82
|
+
const sdk = new index_js_1.QueryPanelSdkAPI('https://example.com', 'token');
|
|
83
|
+
const connector = new StubConnector({
|
|
84
|
+
db: { kind: 'clickhouse', name: 'analytics' },
|
|
85
|
+
tables: [],
|
|
86
|
+
introspectedAt: new Date().toISOString(),
|
|
87
|
+
});
|
|
88
|
+
await sdk.introspectAndIngest(connector, {
|
|
89
|
+
tenantId: 'tenant-1',
|
|
90
|
+
keepConnectionOpen: true,
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.expect)(connector.close).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=ingest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.test.js","sourceRoot":"","sources":["../../../src/__tests__/ingest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ClickHouseSettings, QueryParams, Row } from "@clickhouse/client";
|
|
2
|
+
import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
|
|
3
|
+
import type { DatabaseAdapter, DatabaseExecutionResult } from "./types.js";
|
|
4
|
+
export interface ClickHouseAdapterOptions {
|
|
5
|
+
/** Optional logical database name used in introspection metadata. */
|
|
6
|
+
database?: string;
|
|
7
|
+
/** Override the default response format used for query execution. */
|
|
8
|
+
defaultFormat?: QueryParams["format"];
|
|
9
|
+
/**
|
|
10
|
+
* Optional database kind label. Defaults to "clickhouse" but allows
|
|
11
|
+
* sub-classing/custom branding if needed.
|
|
12
|
+
*/
|
|
13
|
+
kind?: SchemaIntrospection["db"]["kind"];
|
|
14
|
+
/**
|
|
15
|
+
* Optional allow-list of table names.
|
|
16
|
+
* When specified, introspection and queries are restricted to these tables only.
|
|
17
|
+
* ClickHouse tables are not schema-qualified, so just provide table names.
|
|
18
|
+
*/
|
|
19
|
+
allowedTables?: string[];
|
|
20
|
+
}
|
|
21
|
+
export type ClickHouseQueryResult = {
|
|
22
|
+
json: () => Promise<unknown>;
|
|
23
|
+
};
|
|
24
|
+
export type ClickHouseClientFn = (params: QueryParams & {
|
|
25
|
+
query_params?: Record<string, unknown>;
|
|
26
|
+
clickhouse_settings?: ClickHouseSettings;
|
|
27
|
+
}) => Promise<ClickHouseQueryResult | Array<Record<string, unknown>> | Row[]>;
|
|
28
|
+
export declare class ClickHouseAdapter implements DatabaseAdapter {
|
|
29
|
+
private readonly clientFn;
|
|
30
|
+
private readonly databaseName;
|
|
31
|
+
private readonly defaultFormat;
|
|
32
|
+
private readonly kind;
|
|
33
|
+
private readonly allowedTables?;
|
|
34
|
+
constructor(clientFn: ClickHouseClientFn, options?: ClickHouseAdapterOptions);
|
|
35
|
+
execute(sql: string, params?: Record<string, string | number | boolean | string[] | number[]>): Promise<DatabaseExecutionResult>;
|
|
36
|
+
validate(sql: string, params?: Record<string, string | number | boolean | string[] | number[]>): Promise<void>;
|
|
37
|
+
getDialect(): "clickhouse";
|
|
38
|
+
introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
|
|
39
|
+
/**
|
|
40
|
+
* Validate that the SQL query only references allowed tables.
|
|
41
|
+
* This is a basic validation that extracts table-like patterns from the query.
|
|
42
|
+
*/
|
|
43
|
+
private validateQueryTables;
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
private query;
|
|
46
|
+
private extractRows;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=clickhouse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../../../src/adapters/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAEV,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,WAAW,GAAG;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;CAC1C,KACE,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AA6B7E,qBAAa,iBAAkB,YAAW,eAAe;IAOrD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAW;gBAGvB,QAAQ,EAAE,kBAAkB,EAC7C,OAAO,GAAE,wBAA6B;IAWlC,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GACvE,OAAO,CAAC,uBAAuB,CAAC;IAkB7B,QAAQ,CACZ,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GACvE,OAAO,CAAC,IAAI,CAAC;IAWhB,UAAU,IACD,YAAY;IAGf,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2G3E;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0BrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,KAAK;YAyBL,WAAW;CAiB1B"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClickHouseAdapter = void 0;
|
|
4
|
+
const clickhouse_js_1 = require("../utils/clickhouse.js");
|
|
5
|
+
class ClickHouseAdapter {
|
|
6
|
+
constructor(clientFn, options = {}) {
|
|
7
|
+
this.clientFn = clientFn;
|
|
8
|
+
console.log({ options });
|
|
9
|
+
this.databaseName = options.database ?? "default";
|
|
10
|
+
this.defaultFormat = options.defaultFormat ?? "JSONEachRow";
|
|
11
|
+
this.kind = options.kind ?? "clickhouse";
|
|
12
|
+
if (options.allowedTables) {
|
|
13
|
+
this.allowedTables = normalizeTableFilter(options.allowedTables);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async execute(sql, params) {
|
|
17
|
+
// Validate query against allowed tables if restrictions are in place
|
|
18
|
+
if (this.allowedTables) {
|
|
19
|
+
this.validateQueryTables(sql);
|
|
20
|
+
}
|
|
21
|
+
const queryOptions = {
|
|
22
|
+
format: this.defaultFormat,
|
|
23
|
+
};
|
|
24
|
+
if (params) {
|
|
25
|
+
queryOptions.params = params;
|
|
26
|
+
}
|
|
27
|
+
const rows = await this.query(sql, queryOptions);
|
|
28
|
+
const fields = rows.length > 0 ? Object.keys(rows[0] ?? {}) : [];
|
|
29
|
+
return { fields, rows };
|
|
30
|
+
}
|
|
31
|
+
async validate(sql, params) {
|
|
32
|
+
const queryOptions = {
|
|
33
|
+
format: this.defaultFormat,
|
|
34
|
+
};
|
|
35
|
+
if (params) {
|
|
36
|
+
queryOptions.params = params;
|
|
37
|
+
}
|
|
38
|
+
await this.query(`EXPLAIN ${sql}`, queryOptions);
|
|
39
|
+
}
|
|
40
|
+
getDialect() {
|
|
41
|
+
return "clickhouse";
|
|
42
|
+
}
|
|
43
|
+
async introspect(options) {
|
|
44
|
+
// Use adapter-level allowedTables if no specific tables provided in options
|
|
45
|
+
const tablesToIntrospect = options?.tables
|
|
46
|
+
? normalizeTableFilter(options.tables)
|
|
47
|
+
: this.allowedTables;
|
|
48
|
+
const allowTables = tablesToIntrospect ?? [];
|
|
49
|
+
const hasFilter = allowTables.length > 0;
|
|
50
|
+
const queryParams = {
|
|
51
|
+
db: this.databaseName,
|
|
52
|
+
};
|
|
53
|
+
if (hasFilter) {
|
|
54
|
+
queryParams.tables = allowTables;
|
|
55
|
+
}
|
|
56
|
+
const filterClause = hasFilter ? " AND name IN {tables:Array(String)}" : "";
|
|
57
|
+
const tables = await this.query(`SELECT name, engine, comment, total_rows, total_bytes, primary_key, sorting_key
|
|
58
|
+
FROM system.tables
|
|
59
|
+
WHERE database = {db:String}${filterClause}
|
|
60
|
+
ORDER BY name`, { params: queryParams });
|
|
61
|
+
const columnFilterClause = hasFilter
|
|
62
|
+
? " AND table IN {tables:Array(String)}"
|
|
63
|
+
: "";
|
|
64
|
+
const columns = await this.query(`SELECT table, name, type, position, default_kind, default_expression, comment, is_in_primary_key
|
|
65
|
+
FROM system.columns
|
|
66
|
+
WHERE database = {db:String}${columnFilterClause}
|
|
67
|
+
ORDER BY table, position`, { params: queryParams });
|
|
68
|
+
const columnsByTable = new Map();
|
|
69
|
+
for (const rawColumn of columns) {
|
|
70
|
+
const list = columnsByTable.get(rawColumn.table) ?? [];
|
|
71
|
+
list.push(transformColumnRow(rawColumn));
|
|
72
|
+
columnsByTable.set(rawColumn.table, list);
|
|
73
|
+
}
|
|
74
|
+
const tableSchemas = tables.map((table) => {
|
|
75
|
+
const tableColumns = columnsByTable.get(table.name) ?? [];
|
|
76
|
+
const primaryKeyColumns = (0, clickhouse_js_1.parseKeyExpression)(table.primary_key);
|
|
77
|
+
const totalRows = toNumber(table.total_rows);
|
|
78
|
+
const totalBytes = toNumber(table.total_bytes);
|
|
79
|
+
for (const column of tableColumns) {
|
|
80
|
+
column.isPrimaryKey =
|
|
81
|
+
column.isPrimaryKey || primaryKeyColumns.includes(column.name);
|
|
82
|
+
}
|
|
83
|
+
const indexes = primaryKeyColumns.length
|
|
84
|
+
? [
|
|
85
|
+
{
|
|
86
|
+
name: "primary_key",
|
|
87
|
+
columns: primaryKeyColumns,
|
|
88
|
+
unique: true,
|
|
89
|
+
type: "PRIMARY KEY",
|
|
90
|
+
...(table.primary_key ? { definition: table.primary_key } : {}),
|
|
91
|
+
},
|
|
92
|
+
]
|
|
93
|
+
: [];
|
|
94
|
+
const constraints = primaryKeyColumns.length
|
|
95
|
+
? [
|
|
96
|
+
{
|
|
97
|
+
name: "primary_key",
|
|
98
|
+
type: "PRIMARY KEY",
|
|
99
|
+
columns: primaryKeyColumns,
|
|
100
|
+
},
|
|
101
|
+
]
|
|
102
|
+
: [];
|
|
103
|
+
const base = {
|
|
104
|
+
name: table.name,
|
|
105
|
+
schema: this.databaseName,
|
|
106
|
+
type: asTableType(table.engine),
|
|
107
|
+
engine: table.engine,
|
|
108
|
+
columns: tableColumns,
|
|
109
|
+
indexes,
|
|
110
|
+
constraints,
|
|
111
|
+
};
|
|
112
|
+
const comment = sanitize(table.comment);
|
|
113
|
+
if (comment !== undefined) {
|
|
114
|
+
base.comment = comment;
|
|
115
|
+
}
|
|
116
|
+
const statistics = buildTableStatistics(totalRows, totalBytes);
|
|
117
|
+
if (statistics) {
|
|
118
|
+
base.statistics = statistics;
|
|
119
|
+
}
|
|
120
|
+
return base;
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
db: {
|
|
124
|
+
kind: this.kind,
|
|
125
|
+
name: this.databaseName,
|
|
126
|
+
},
|
|
127
|
+
tables: tableSchemas,
|
|
128
|
+
introspectedAt: new Date().toISOString(),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Validate that the SQL query only references allowed tables.
|
|
133
|
+
* This is a basic validation that extracts table-like patterns from the query.
|
|
134
|
+
*/
|
|
135
|
+
validateQueryTables(sql) {
|
|
136
|
+
if (!this.allowedTables || this.allowedTables.length === 0) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const allowedSet = new Set(this.allowedTables);
|
|
140
|
+
// Extract potential table references from SQL
|
|
141
|
+
// This regex looks for identifiers after FROM/JOIN keywords
|
|
142
|
+
// ClickHouse may use database.table notation
|
|
143
|
+
const tablePattern = /(?:FROM|JOIN)\s+(?:FINAL\s+)?(?:(?:[a-zA-Z_][a-zA-Z0-9_]*)\.)?(["'`]?[a-zA-Z_][a-zA-Z0-9_]*["'`]?)/gi;
|
|
144
|
+
const matches = sql.matchAll(tablePattern);
|
|
145
|
+
for (const match of matches) {
|
|
146
|
+
const table = match[1]?.replace(/["'`]/g, "");
|
|
147
|
+
if (table) {
|
|
148
|
+
if (!allowedSet.has(table)) {
|
|
149
|
+
throw new Error(`Query references table "${table}" which is not in the allowed tables list`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async close() {
|
|
155
|
+
// No-op: lifecycle of the underlying client is controlled by the caller.
|
|
156
|
+
}
|
|
157
|
+
async query(sql, options) {
|
|
158
|
+
const params = {
|
|
159
|
+
query: sql,
|
|
160
|
+
};
|
|
161
|
+
const format = options?.format ?? this.defaultFormat;
|
|
162
|
+
if (format !== undefined) {
|
|
163
|
+
params.format = format;
|
|
164
|
+
}
|
|
165
|
+
if (options?.params) {
|
|
166
|
+
params.query_params = options.params;
|
|
167
|
+
}
|
|
168
|
+
if (options?.settings) {
|
|
169
|
+
params.clickhouse_settings = options.settings;
|
|
170
|
+
}
|
|
171
|
+
const result = await this.clientFn(params);
|
|
172
|
+
return this.extractRows(result);
|
|
173
|
+
}
|
|
174
|
+
async extractRows(result) {
|
|
175
|
+
if (Array.isArray(result)) {
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
if (result &&
|
|
179
|
+
typeof result.json === "function") {
|
|
180
|
+
const payload = await result.json();
|
|
181
|
+
return normalizePayload(payload);
|
|
182
|
+
}
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.ClickHouseAdapter = ClickHouseAdapter;
|
|
187
|
+
function normalizePayload(payload) {
|
|
188
|
+
if (Array.isArray(payload)) {
|
|
189
|
+
return payload;
|
|
190
|
+
}
|
|
191
|
+
if (payload && typeof payload === "object") {
|
|
192
|
+
const maybeData = payload.data;
|
|
193
|
+
if (Array.isArray(maybeData)) {
|
|
194
|
+
return maybeData;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
function normalizeTableFilter(tables) {
|
|
200
|
+
if (!tables?.length)
|
|
201
|
+
return [];
|
|
202
|
+
const seen = new Set();
|
|
203
|
+
const normalized = [];
|
|
204
|
+
for (const table of tables) {
|
|
205
|
+
if (!table)
|
|
206
|
+
continue;
|
|
207
|
+
const trimmed = table.trim();
|
|
208
|
+
if (!trimmed)
|
|
209
|
+
continue;
|
|
210
|
+
const parts = trimmed.split(".");
|
|
211
|
+
const tableName = parts[parts.length - 1];
|
|
212
|
+
if (!tableName || seen.has(tableName))
|
|
213
|
+
continue;
|
|
214
|
+
seen.add(tableName);
|
|
215
|
+
normalized.push(tableName);
|
|
216
|
+
}
|
|
217
|
+
return normalized;
|
|
218
|
+
}
|
|
219
|
+
function transformColumnRow(row) {
|
|
220
|
+
const nullable = (0, clickhouse_js_1.isNullableType)(row.type);
|
|
221
|
+
const unwrappedType = (0, clickhouse_js_1.unwrapTypeModifiers)(row.type);
|
|
222
|
+
const { precision, scale } = (0, clickhouse_js_1.extractPrecisionScale)(row.type);
|
|
223
|
+
const maxLength = (0, clickhouse_js_1.extractFixedStringLength)(row.type);
|
|
224
|
+
const column = {
|
|
225
|
+
name: row.name,
|
|
226
|
+
type: unwrappedType,
|
|
227
|
+
rawType: row.type,
|
|
228
|
+
nullable,
|
|
229
|
+
isPrimaryKey: Boolean(toNumber(row.is_in_primary_key)),
|
|
230
|
+
isForeignKey: false,
|
|
231
|
+
};
|
|
232
|
+
const defaultKind = sanitize(row.default_kind);
|
|
233
|
+
if (defaultKind !== undefined)
|
|
234
|
+
column.defaultKind = defaultKind;
|
|
235
|
+
const defaultExpression = sanitize(row.default_expression);
|
|
236
|
+
if (defaultExpression !== undefined) {
|
|
237
|
+
column.defaultExpression = defaultExpression;
|
|
238
|
+
}
|
|
239
|
+
const comment = sanitize(row.comment);
|
|
240
|
+
if (comment !== undefined)
|
|
241
|
+
column.comment = comment;
|
|
242
|
+
if (maxLength !== undefined)
|
|
243
|
+
column.maxLength = maxLength;
|
|
244
|
+
if (precision !== undefined)
|
|
245
|
+
column.precision = precision;
|
|
246
|
+
if (scale !== undefined)
|
|
247
|
+
column.scale = scale;
|
|
248
|
+
return column;
|
|
249
|
+
}
|
|
250
|
+
function asTableType(engine) {
|
|
251
|
+
if (typeof engine === "string") {
|
|
252
|
+
const normalized = engine.toLowerCase();
|
|
253
|
+
// ClickHouse view engines: View, MaterializedView, LiveView
|
|
254
|
+
if (normalized.includes("view")) {
|
|
255
|
+
return "view";
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return "table";
|
|
259
|
+
}
|
|
260
|
+
function buildTableStatistics(totalRows, totalBytes) {
|
|
261
|
+
if (totalRows === undefined && totalBytes === undefined)
|
|
262
|
+
return undefined;
|
|
263
|
+
const stats = {};
|
|
264
|
+
if (totalRows !== undefined)
|
|
265
|
+
stats.totalRows = totalRows;
|
|
266
|
+
if (totalBytes !== undefined)
|
|
267
|
+
stats.totalBytes = totalBytes;
|
|
268
|
+
return stats;
|
|
269
|
+
}
|
|
270
|
+
function sanitize(value) {
|
|
271
|
+
if (value === null || value === undefined)
|
|
272
|
+
return undefined;
|
|
273
|
+
const trimmed = String(value).trim();
|
|
274
|
+
return trimmed.length ? trimmed : undefined;
|
|
275
|
+
}
|
|
276
|
+
function toNumber(value) {
|
|
277
|
+
if (value === null || value === undefined)
|
|
278
|
+
return undefined;
|
|
279
|
+
if (typeof value === "number")
|
|
280
|
+
return value;
|
|
281
|
+
const parsed = Number.parseFloat(String(value));
|
|
282
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=clickhouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../../src/adapters/clickhouse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspection.spec.d.ts","sourceRoot":"","sources":["../../../src/adapters/introspection.spec.ts"],"names":[],"mappings":""}
|