@hypequery/clickhouse 1.4.0 → 1.5.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/README.md +1 -1
- package/dist/cli/generate-types.js +1 -1
- package/dist/core/cache/types.d.ts +2 -2
- package/dist/core/query-builder.d.ts +2 -14
- package/dist/core/query-builder.d.ts.map +1 -1
- package/dist/core/query-builder.js +10 -21
- package/dist/core/tests/integration/setup.d.ts +1 -0
- package/dist/core/tests/integration/setup.d.ts.map +1 -1
- package/dist/core/tests/integration/setup.js +2 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/types/base.d.ts +0 -22
- package/dist/types/base.d.ts.map +1 -1
- package/dist/types/clickhouse-types.d.ts +1 -1
- package/dist/types/clickhouse-types.d.ts.map +1 -1
- package/package.json +8 -12
- package/dist/core/features/pagination.d.ts +0 -21
- package/dist/core/features/pagination.d.ts.map +0 -1
- package/dist/core/features/pagination.js +0 -165
- package/dist/core/tests/integration/pagination-test-tbc.d.ts +0 -2
- package/dist/core/tests/integration/pagination-test-tbc.d.ts.map +0 -1
- package/dist/core/tests/integration/pagination-test-tbc.js +0 -190
package/README.md
CHANGED
|
@@ -263,7 +263,7 @@ Run the fast feedback loop with:
|
|
|
263
263
|
npm run test
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
-
This command runs type checks + unit tests only. To exercise the ClickHouse-backed integration suite,
|
|
266
|
+
This command runs type checks + unit tests only. To exercise the ClickHouse-backed integration suite, copy `.env.test.example` to `.env.test`, point it at a ClickHouse instance, and run:
|
|
267
267
|
|
|
268
268
|
```bash
|
|
269
269
|
npm run test:integration
|
|
@@ -193,7 +193,7 @@ export interface IntrospectedSchema {`;
|
|
|
193
193
|
*
|
|
194
194
|
* // Now you have full type safety and autocomplete
|
|
195
195
|
* const results = await db
|
|
196
|
-
* .
|
|
196
|
+
* .table('${tables.length > 0 ? tables[0].name : 'table_name'}')
|
|
197
197
|
* .select(['column1', 'column2'])
|
|
198
198
|
* .where('column1', 'eq', 'value')
|
|
199
199
|
* .execute();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type hypequeryCacheMode = 'no-store' | 'cache-first' | 'network-first' | 'stale-while-revalidate';
|
|
2
2
|
export interface CacheSerializationResult {
|
|
3
3
|
payload: string | Uint8Array;
|
|
4
4
|
byteSize: number;
|
|
@@ -7,7 +7,7 @@ export type CacheSerializeFn = (value: unknown) => CacheSerializationResult | Pr
|
|
|
7
7
|
export type CacheDeserializeFn<T = unknown> = (raw: string | Uint8Array) => T | Promise<T>;
|
|
8
8
|
export type CacheStatus = 'hit' | 'miss' | 'stale-hit' | 'revalidate' | 'bypass';
|
|
9
9
|
export interface CacheOptions {
|
|
10
|
-
mode?:
|
|
10
|
+
mode?: hypequeryCacheMode;
|
|
11
11
|
ttlMs?: number;
|
|
12
12
|
staleTtlMs?: number;
|
|
13
13
|
cacheTimeMs?: number;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CrossFilter } from './cross-filter.js';
|
|
2
|
-
import { FilterOperator, OperatorValueMap, OrderDirection,
|
|
2
|
+
import { FilterOperator, OperatorValueMap, OrderDirection, QueryConfig } from '../types/index.js';
|
|
3
3
|
import { AnySchema } from '../types/schema.js';
|
|
4
4
|
import { SQLFormatter } from './formatters/sql-formatter.js';
|
|
5
5
|
import { ExecutorFeature } from './features/executor.js';
|
|
@@ -51,7 +51,6 @@ export declare class QueryBuilder<Schema extends SchemaDefinition<Schema>, State
|
|
|
51
51
|
private analytics;
|
|
52
52
|
private executor;
|
|
53
53
|
private modifiers;
|
|
54
|
-
private pagination;
|
|
55
54
|
private crossFiltering;
|
|
56
55
|
private runtime;
|
|
57
56
|
private cacheOptions?;
|
|
@@ -216,18 +215,6 @@ export declare class QueryBuilder<Schema extends SchemaDefinition<Schema>, State
|
|
|
216
215
|
fullJoin<TableName extends Extract<keyof Schema, string>, Alias extends string | undefined = undefined>(table: TableName, leftColumn: keyof BaseRow<State>, rightColumn: `${TableName & string}.${keyof Schema[TableName] & string}`, alias?: Alias): QueryBuilder<Schema, Alias extends string ? AddAlias<WidenTables<State, TableName>, Alias, TableName> : WidenTables<State, TableName>>;
|
|
217
216
|
private applyJoin;
|
|
218
217
|
getConfig(): QueryConfig<State["output"], Schema>;
|
|
219
|
-
/**
|
|
220
|
-
* Paginates the query results using cursor-based pagination
|
|
221
|
-
*/
|
|
222
|
-
paginate(options: PaginationOptions<State['output']>): Promise<PaginatedResult<State['output']>>;
|
|
223
|
-
/**
|
|
224
|
-
* Gets the first page of results
|
|
225
|
-
*/
|
|
226
|
-
firstPage(pageSize: number): Promise<PaginatedResult<State['output']>>;
|
|
227
|
-
/**
|
|
228
|
-
* Returns an async iterator that yields all pages
|
|
229
|
-
*/
|
|
230
|
-
iteratePages(pageSize: number): AsyncGenerator<PaginatedResult<State['output']>>;
|
|
231
218
|
static setJoinRelationships<S extends SchemaDefinition<S>>(relationships: JoinRelationships<S>): void;
|
|
232
219
|
/**
|
|
233
220
|
* Apply a predefined join relationship
|
|
@@ -240,6 +227,7 @@ export type CreateQueryBuilderConfig = ClickHouseConfig & {
|
|
|
240
227
|
};
|
|
241
228
|
export declare function createQueryBuilder<Schema extends SchemaDefinition<Schema>>(config: CreateQueryBuilderConfig): {
|
|
242
229
|
cache: import("./cache/controller.js").CacheController;
|
|
230
|
+
rawQuery<TResult = any>(sql: string, params?: unknown[]): Promise<TResult[][]>;
|
|
243
231
|
table<TableName extends Extract<keyof Schema, string>>(tableName: TableName): SelectQB<Schema, TableName, InitialState<Schema, TableName>["output"], TableName>;
|
|
244
232
|
};
|
|
245
233
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../src/core/query-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../src/core/query-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAK7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAiB,MAAM,yBAAyB,CAAC;AAE5F,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EAEpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AACvG,OAAO,KAAK,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,OAAO,EACP,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAEjC,KAAK,WAAW,CAAC,KAAK,SAAS,eAAe,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAE1E,KAAK,mBAAmB,CACtB,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACvC,KAAK,SAAS,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC,EACpG,MAAM,SAAS,WAAW,CAAC,KAAK,CAAC,EACjC,EAAE,SAAS,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,IAC5C,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AAGtE,KAAK,gBAAgB,GAAG,oBAAoB,GAAG,mBAAmB,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,iCAAiC;IAC/E,iDAAiD;IACjD,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,iCAAiC,GAAG,sBAAsB,CAAC;AAE1F;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,sBAAsB,CAEzF;AAED;;;GAGG;AACH,qBAAa,YAAY,CACvB,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACvC,KAAK,SAAS,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC;IAEpG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAyB;IAErD,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,YAAY,CAAC,CAAe;gBAGlC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,mBAAmB;IAc9B,OAAO,CAAC,IAAI;IAkBZ,KAAK;IAQL,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK,GAAG,IAAI;IAU1C,OAAO,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,MAAM,GACpD,IAAI;IAKP;;;;;;;;;;;KAWC;IACD,mBAAmB,CACjB,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,mBAAmB,GAAG,iBAAiB,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,eAAqC,GACnL,IAAI;IAMP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAStB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAKxC;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,SAAS,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI;IACrH,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI;IAUpE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,iBAAiB,EAAE,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,UAAU,SAAS,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAC5D,iBAAiB,EAAE,UAAU,GAC5B,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAgDxF,WAAW,CAAC,UAAU,SAAS,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EACjE,GAAG,OAAO,EAAE,UAAU,GACrB,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAIxF,GAAG,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,MAAM,EACtF,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAMrE,KAAK,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,QAAQ,EAC1F,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAMrE,GAAG,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,MAAM,EACtF,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAMrE,GAAG,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,MAAM,EACtF,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAMrE,GAAG,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,MAAM,EACtF,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAMrE,OAAO,CAAC,gBAAgB;IAoBxB,YAAY;IAIZ,YAAY;IAIZ,iBAAiB;IAIjB,eAAe;IAIf,WAAW;IAKX,KAAK,IAAI,MAAM;IAIf,eAAe,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,GAAG,EAAE,CAAA;KAAE;IAIrD,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAIvD,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAI1D;;;OAGG;IACG,aAAa,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhG,OAAO,CAAC,mBAAmB;IAgC3B;;;;;;;;;;;OAWG;IACH,KAAK,CACH,iBAAiB,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,mBAAmB,GACxE,IAAI;IACP,KAAK,CAAC,MAAM,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,EACrF,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,EAClC,QAAQ,EAAE,EAAE,EACZ,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GACpD,IAAI;IACP;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,MAAM,SAAS,WAAW,CAAC,KAAK,CAAC,EACrC,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,SAAS,GAAG,eAAe,EACrC,KAAK,EAAE,GAAG,GACT,IAAI;IA8BP,OAAO,CACL,iBAAiB,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,mBAAmB,GACxE,IAAI;IACP,OAAO,CAAC,MAAM,SAAS,WAAW,CAAC,KAAK,CAAC,EACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,GAAG,GACT,IAAI;IACP,OAAO,CAAC,MAAM,SAAS,WAAW,CAAC,KAAK,CAAC,EACvC,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,SAAS,GAAG,eAAe,EACrC,KAAK,EAAE,GAAG,GACT,IAAI;IA6BP;;;;;;;;;;OAUG;IACH,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAOnD;;;;;;;;;;OAUG;IACH,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAOrD;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI;IAMhF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B;;;;;;;;;OASG;IACH,OAAO,CACL,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAC/B,SAAS,GAAE,cAAsB,GAChC,IAAI;IAKP;;;;;;;;OAQG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI;IAKnD,QAAQ,IAAI,IAAI;IAKhB,YAAY,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAC3D,IAAI;IAOP,SAAS,CAAC,SAAS,SAAS,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACrG,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAChC,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,EACxE,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CACb,MAAM,EACN,KAAK,SAAS,MAAM,GAClB,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GACzD,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAChC;IAID,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACpG,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAChC,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,EACxE,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CACb,MAAM,EACN,KAAK,SAAS,MAAM,GAClB,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GACzD,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAChC;IAID,SAAS,CAAC,SAAS,SAAS,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACrG,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAChC,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,EACxE,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CACb,MAAM,EACN,KAAK,SAAS,MAAM,GAClB,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GACzD,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAChC;IAID,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACpG,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAChC,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,EACxE,KAAK,CAAC,EAAE,KAAK,GACZ,YAAY,CACb,MAAM,EACN,KAAK,SAAS,MAAM,GAClB,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GACzD,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAChC;IAID,OAAO,CAAC,SAAS;IAyBjB,SAAS;IAIT,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAAC,EACvD,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAClC,IAAI;IAIP;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;CA2B5D;AAED,MAAM,MAAM,QAAQ,CAClB,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACvC,MAAM,SAAS,MAAM,EACrB,MAAM,EACN,SAAS,SAAS,MAAM,MAAM,IAC5B,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AAE9E,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GAAG;IACxD,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAYF,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACxE,MAAM,EAAE,wBAAwB;;aAUf,OAAO,aAAa,MAAM,WAAU,OAAO,EAAE;UAStD,SAAS,SAAS,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,aAAa,SAAS,GAAG,QAAQ,CACpF,MAAM,EACN,SAAS,EACT,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,EACzC,SAAS,CACV;EAaJ"}
|
|
@@ -7,10 +7,10 @@ import { AnalyticsFeature } from './features/analytics.js';
|
|
|
7
7
|
import { ExecutorFeature } from './features/executor.js';
|
|
8
8
|
import { QueryModifiersFeature } from './features/query-modifiers.js';
|
|
9
9
|
import { FilterValidator } from './validators/filter-validator.js';
|
|
10
|
-
import { PaginationFeature } from './features/pagination.js';
|
|
11
10
|
import { createPredicateBuilder, } from './utils/predicate-builder.js';
|
|
12
11
|
import { CrossFilteringFeature } from './features/cross-filtering.js';
|
|
13
12
|
import { executeWithCache } from './cache/cache-manager.js';
|
|
13
|
+
import { substituteParameters } from './utils.js';
|
|
14
14
|
import { mergeCacheOptionsPartial, initializeCacheRuntime } from './cache/utils.js';
|
|
15
15
|
/**
|
|
16
16
|
* Type guard to check if a config is a client-based configuration.
|
|
@@ -34,7 +34,6 @@ export class QueryBuilder {
|
|
|
34
34
|
analytics;
|
|
35
35
|
executor;
|
|
36
36
|
modifiers;
|
|
37
|
-
pagination;
|
|
38
37
|
crossFiltering;
|
|
39
38
|
runtime;
|
|
40
39
|
cacheOptions;
|
|
@@ -48,7 +47,6 @@ export class QueryBuilder {
|
|
|
48
47
|
this.analytics = new AnalyticsFeature(this);
|
|
49
48
|
this.executor = new ExecutorFeature(this);
|
|
50
49
|
this.modifiers = new QueryModifiersFeature(this);
|
|
51
|
-
this.pagination = new PaginationFeature(this);
|
|
52
50
|
this.crossFiltering = new CrossFilteringFeature(this);
|
|
53
51
|
}
|
|
54
52
|
fork(state, config) {
|
|
@@ -406,24 +404,6 @@ export class QueryBuilder {
|
|
|
406
404
|
getConfig() {
|
|
407
405
|
return this.config;
|
|
408
406
|
}
|
|
409
|
-
/**
|
|
410
|
-
* Paginates the query results using cursor-based pagination
|
|
411
|
-
*/
|
|
412
|
-
async paginate(options) {
|
|
413
|
-
return this.pagination.paginate(options);
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* Gets the first page of results
|
|
417
|
-
*/
|
|
418
|
-
async firstPage(pageSize) {
|
|
419
|
-
return this.pagination.firstPage(pageSize);
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* Returns an async iterator that yields all pages
|
|
423
|
-
*/
|
|
424
|
-
iteratePages(pageSize) {
|
|
425
|
-
return this.pagination.iteratePages(pageSize);
|
|
426
|
-
}
|
|
427
407
|
static setJoinRelationships(relationships) {
|
|
428
408
|
this.relationships = relationships;
|
|
429
409
|
}
|
|
@@ -471,6 +451,15 @@ export function createQueryBuilder(config) {
|
|
|
471
451
|
const { runtime, cacheController } = initializeCacheRuntime(cacheConfig, namespace);
|
|
472
452
|
return {
|
|
473
453
|
cache: cacheController,
|
|
454
|
+
async rawQuery(sql, params = []) {
|
|
455
|
+
const client = ClickHouseConnection.getClient();
|
|
456
|
+
const finalSQL = substituteParameters(sql, params);
|
|
457
|
+
const result = await client.query({
|
|
458
|
+
query: finalSQL,
|
|
459
|
+
format: 'JSONEachRow'
|
|
460
|
+
});
|
|
461
|
+
return result.json();
|
|
462
|
+
},
|
|
474
463
|
table(tableName) {
|
|
475
464
|
const state = {
|
|
476
465
|
schema: {},
|
|
@@ -6,6 +6,7 @@ export declare const TEST_CONNECTION_CONFIG: {
|
|
|
6
6
|
};
|
|
7
7
|
export declare const initializeTestConnection: () => Promise<{
|
|
8
8
|
cache: import("../../cache/controller.js").CacheController;
|
|
9
|
+
rawQuery<TResult = any>(sql: string, params?: unknown[]): Promise<TResult[][]>;
|
|
9
10
|
table<TableName extends never>(tableName: TableName): import("../../query-builder.js").SelectQB<import("../../types/builder-state.js").SchemaDefinition<unknown>, TableName, import("../../../index.js").TableRecord<import("../../types/builder-state.js").SchemaDefinition<unknown>[TableName]>, TableName>;
|
|
10
11
|
}>;
|
|
11
12
|
export declare const ensureConnectionInitialized: () => import("@clickhouse/client").ClickHouseClient | import("@clickhouse/client-web").ClickHouseClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/core/tests/integration/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/core/tests/integration/setup.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,sBAAsB;;;;;CAAS,CAAC;AAG7C,eAAO,MAAM,wBAAwB;;;;EAyBpC,CAAC;AAGF,eAAO,MAAM,2BAA2B,yGAevC,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,OAAO,CAOzD,CAAC;AAGF,eAAO,MAAM,wBAAwB,QAAa,OAAO,CAAC,OAAO,CAahE,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAAU,eAAe,MAAM,KAAG,OAAO,CAAC,OAAO,CAO/E,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,OAAO,CAQzD,CAAC;AAGF,eAAO,MAAM,wBAAwB,QAAa,OAAO,CAAC,IAAI,CAwC7D,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAC5B,oBAAgB,EAChB,sBAAoB,KACnB,OAAO,CAAC,IAAI,CAad,CAAC;AAGF,eAAO,MAAM,uBAAuB,QAAa,OAAO,CAAC,IAAI,CA0B5D,CAAC;AAGF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAkDD,eAAO,MAAM,SAAS,EAAE,cAAoC,CAAC;AAK7D,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,IAAI,CAkGtD,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { ClickHouseConnection } from '../../connection.js';
|
|
|
4
4
|
import { exec } from 'child_process';
|
|
5
5
|
import { promisify } from 'util';
|
|
6
6
|
import { logger as hypeQueryLogger } from '../../utils/logger.js';
|
|
7
|
-
|
|
7
|
+
// @ts-expect-error: raw JSON import for supplying fixture data
|
|
8
8
|
import rawTestData from './test-data.json';
|
|
9
9
|
// Disable the hypequery logger to prevent "logs after tests" errors
|
|
10
10
|
// This must be done early in the setup, before any queries run
|
|
@@ -13,6 +13,7 @@ hypeQueryLogger.configure({ enabled: false });
|
|
|
13
13
|
const logger = {
|
|
14
14
|
info: (message, ...args) => {
|
|
15
15
|
if (process.env.DEBUG === 'true') {
|
|
16
|
+
console.info(`[INFO] ${message}`, ...args);
|
|
16
17
|
}
|
|
17
18
|
},
|
|
18
19
|
error: (message, ...args) => {
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { MemoryCacheProvider } from './core/cache/providers/memory-lru.js';
|
|
|
9
9
|
export { MemoryCacheProvider as MemoryLRUCacheProvider } from './core/cache/providers/memory-lru.js';
|
|
10
10
|
export { NoopCacheProvider } from './core/cache/providers/noop.js';
|
|
11
11
|
export type { ColumnType, TableColumn, TableSchema, TableRecord, DatabaseSchema, InferColumnType, } from './types/schema.js';
|
|
12
|
-
export type { OrderDirection, QueryConfig,
|
|
12
|
+
export type { OrderDirection, QueryConfig, AggregationType } from './types/base.js';
|
|
13
13
|
export type { FilterOperator, OperatorValueMap, FilterConditionInput } from './types/filters.js';
|
|
14
14
|
export type { JoinPath, JoinPathOptions } from './core/join-relationships.js';
|
|
15
15
|
export { CrossFilter } from './core/cross-filter.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,YAAY,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,YAAY,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,WAAW,EACX,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EACL,GAAG,EACH,KAAK,EACL,UAAU,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACT,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACb,MAAM,mCAAmC,CAAC"}
|
package/dist/types/base.d.ts
CHANGED
|
@@ -47,26 +47,4 @@ export interface JoinClause {
|
|
|
47
47
|
export type AggregationType<T, Aggregations, Column, A extends string, Suffix extends string, HasSelect extends boolean> = HasSelect extends true ? {
|
|
48
48
|
[K in keyof T | A]: K extends keyof T ? T[K] : string;
|
|
49
49
|
} : Aggregations extends Record<string, string> ? Aggregations & Record<A extends undefined ? `${Column & string}_${Suffix}` : A, string> : Record<A extends undefined ? `${Column & string}_${Suffix}` : A, string>;
|
|
50
|
-
export interface PaginationOptions<T> {
|
|
51
|
-
pageSize: number;
|
|
52
|
-
after?: string;
|
|
53
|
-
before?: string;
|
|
54
|
-
orderBy?: Array<{
|
|
55
|
-
column: keyof T | TableColumn<any>;
|
|
56
|
-
direction: OrderDirection;
|
|
57
|
-
}>;
|
|
58
|
-
}
|
|
59
|
-
export interface PageInfo {
|
|
60
|
-
hasNextPage: boolean;
|
|
61
|
-
hasPreviousPage: boolean;
|
|
62
|
-
startCursor: string;
|
|
63
|
-
endCursor: string;
|
|
64
|
-
totalCount: number;
|
|
65
|
-
totalPages: number;
|
|
66
|
-
pageSize: number;
|
|
67
|
-
}
|
|
68
|
-
export interface PaginatedResult<T> {
|
|
69
|
-
data: T[];
|
|
70
|
-
pageInfo: PageInfo;
|
|
71
|
-
}
|
|
72
50
|
//# sourceMappingURL=base.d.ts.map
|
package/dist/types/base.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/types/base.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/types/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export type ClickHouseBoolean = 'Bool' | 'Boolean';
|
|
|
7
7
|
export type ClickHouseEnum = `Enum8(${string})` | `Enum16(${string})`;
|
|
8
8
|
export type ClickHouseBaseType = ClickHouseInteger | ClickHouseFloat | ClickHouseDecimal | ClickHouseDateTime | ClickHouseString | ClickHouseBoolean | ClickHouseEnum;
|
|
9
9
|
export type ClickHouseType = ClickHouseBaseType | `Array(${ClickHouseBaseType})` | `Array(Nullable(${ClickHouseBaseType}))` | `Array(LowCardinality(String))` | `Array(LowCardinality(${ClickHouseEnum}))` | `Nullable(${ClickHouseBaseType})` | `Nullable(Array(${ClickHouseBaseType}))` | `LowCardinality(${ClickHouseString})` | `LowCardinality(${ClickHouseEnum})` | `LowCardinality(Nullable(${ClickHouseString}))` | `LowCardinality(Nullable(${ClickHouseEnum}))` | `Map(String, ${ClickHouseBaseType})` | `Map(String, Array(${ClickHouseBaseType}))` | `Map(String, Nullable(${ClickHouseBaseType}))` | `Map(LowCardinality(String), ${ClickHouseBaseType})` | `Map(LowCardinality(String), Array(${ClickHouseBaseType}))` | `Map(LowCardinality(String), Nullable(${ClickHouseBaseType}))` | `Map(${ClickHouseInteger}, ${ClickHouseBaseType})` | `Map(${ClickHouseInteger}, Array(${ClickHouseBaseType}))` | `Map(${ClickHouseInteger}, Nullable(${ClickHouseBaseType}))` | `Array(Map(String, ${ClickHouseBaseType}))` | `Array(Map(LowCardinality(String), ${ClickHouseBaseType}))` | `Array(Map(${ClickHouseInteger}, ${ClickHouseBaseType}))` | `Nullable(Map(String, ${ClickHouseBaseType}))` | `Nullable(Map(LowCardinality(String), ${ClickHouseBaseType}))`;
|
|
10
|
-
export type InferClickHouseType<T extends ClickHouseType, Depth extends number = 0> = Depth extends 5 ? unknown : T extends ClickHouseInteger ? number : T extends ClickHouseFloat ? number : T extends ClickHouseDecimal ? number : T extends ClickHouseDateTime ?
|
|
10
|
+
export type InferClickHouseType<T extends ClickHouseType, Depth extends number = 0> = Depth extends 5 ? unknown : T extends ClickHouseInteger ? number : T extends ClickHouseFloat ? number : T extends ClickHouseDecimal ? number : T extends ClickHouseDateTime ? string : T extends ClickHouseString ? string : T extends ClickHouseEnum ? string : T extends ClickHouseBoolean ? boolean : T extends `Array(${infer U})` ? U extends ClickHouseType ? Array<InferClickHouseType<U, Add1<Depth>>> : unknown[] : T extends `Nullable(${infer U})` ? U extends ClickHouseType ? InferClickHouseType<U, Add1<Depth>> | null : unknown | null : T extends `LowCardinality(${infer U})` ? U extends `Nullable(${infer V})` ? V extends ClickHouseString | ClickHouseEnum ? InferClickHouseType<V, Add1<Depth>> | null : unknown | null : U extends ClickHouseString | ClickHouseEnum ? InferClickHouseType<U, Add1<Depth>> : unknown : T extends `Map(${string}, ${infer V})` ? V extends ClickHouseType ? Record<string, InferClickHouseType<V, Add1<Depth>>> : Record<string, unknown> : unknown;
|
|
11
11
|
type Add1<T extends number> = T extends 0 ? 1 : T extends 1 ? 2 : T extends 2 ? 3 : T extends 3 ? 4 : 5;
|
|
12
12
|
export type ClickHouseSchema = Record<string, ClickHouseType>;
|
|
13
13
|
export type InferSchemaType<T extends ClickHouseSchema> = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickhouse-types.d.ts","sourceRoot":"","sources":["../../src/types/clickhouse-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAC1D,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GACzB,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GACvD,WAAW,MAAM,KAAK,MAAM,GAAG,CAAC;AAEpC,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GAAG,QAAQ,GACjB,UAAU,GACV,aAAa,MAAM,IAAI,GACvB,cAAc,MAAM,GAAG,GACvB,cAAc,MAAM,MAAM,MAAM,IAAI,CAAC;AAEzC,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,eAAe,MAAM,GAAG,GACxB,MAAM,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnD,MAAM,MAAM,cAAc,GACtB,SAAS,MAAM,GAAG,GAClB,UAAU,MAAM,GAAG,CAAC;AAExB,MAAM,MAAM,kBAAkB,GAC1B,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,CAAC;AAEnB,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,SAAS,kBAAkB,GAAG,GAC9B,kBAAkB,kBAAkB,IAAI,GACxC,+BAA+B,GAC/B,wBAAwB,cAAc,IAAI,GAC1C,YAAY,kBAAkB,GAAG,GACjC,kBAAkB,kBAAkB,IAAI,GACxC,kBAAkB,gBAAgB,GAAG,GACrC,kBAAkB,cAAc,GAAG,GACnC,2BAA2B,gBAAgB,IAAI,GAC/C,2BAA2B,cAAc,IAAI,GAC7C,eAAe,kBAAkB,GAAG,GACpC,qBAAqB,kBAAkB,IAAI,GAC3C,wBAAwB,kBAAkB,IAAI,GAC9C,+BAA+B,kBAAkB,GAAG,GACpD,qCAAqC,kBAAkB,IAAI,GAC3D,wCAAwC,kBAAkB,IAAI,GAC9D,OAAO,iBAAiB,KAAK,kBAAkB,GAAG,GAClD,OAAO,iBAAiB,WAAW,kBAAkB,IAAI,GACzD,OAAO,iBAAiB,cAAc,kBAAkB,IAAI,GAC5D,qBAAqB,kBAAkB,IAAI,GAC3C,qCAAqC,kBAAkB,IAAI,GAC3D,aAAa,iBAAiB,KAAK,kBAAkB,IAAI,GACzD,wBAAwB,kBAAkB,IAAI,GAC9C,wCAAwC,kBAAkB,IAAI,CAAC;AAEnE,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,SAAS,MAAM,GAAG,CAAC,IAChF,KAAK,SAAS,CAAC,GACb,OAAO,GACP,CAAC,SAAS,iBAAiB,GAAG,MAAM,GACpC,CAAC,SAAS,eAAe,GAAG,MAAM,GAClC,CAAC,SAAS,iBAAiB,GAAG,MAAM,GACpC,CAAC,SAAS,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"clickhouse-types.d.ts","sourceRoot":"","sources":["../../src/types/clickhouse-types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hypequery/clickhouse",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "ClickHouse typescript query builder",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
"types": "./dist/index.d.ts",
|
|
14
14
|
"import": "./dist/index.js",
|
|
15
15
|
"require": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./cli": {
|
|
18
|
+
"types": "./dist/cli/index.d.ts",
|
|
19
|
+
"import": "./dist/cli/index.js",
|
|
20
|
+
"require": "./dist/cli/index.js"
|
|
16
21
|
}
|
|
17
22
|
},
|
|
18
23
|
"license": "Apache-2.0",
|
|
@@ -31,9 +36,7 @@
|
|
|
31
36
|
"test:watch": "vitest watch --config vitest.config.ts",
|
|
32
37
|
"test:coverage": "vitest run --coverage --config vitest.config.ts",
|
|
33
38
|
"test:cli": "node scripts/test-cli-integration.js",
|
|
34
|
-
"lint": "eslint src/**/*.ts",
|
|
35
|
-
"semantic-release": "npx semantic-release",
|
|
36
|
-
"release": "npx semantic-release --extends ./.releaserc.cjs --no-ci",
|
|
39
|
+
"lint": "eslint --ext .ts \"src/**/*.ts\"",
|
|
37
40
|
"docs:api": "typedoc --options typedoc.json",
|
|
38
41
|
"docs:mdx": "npm run docs:api && node scripts/process-typedoc-markdown.js"
|
|
39
42
|
},
|
|
@@ -60,15 +63,8 @@
|
|
|
60
63
|
"@clickhouse/client": "^1.11.2",
|
|
61
64
|
"@clickhouse/client-common": "^1.11.2",
|
|
62
65
|
"@clickhouse/client-web": "^1.11.2",
|
|
63
|
-
"@semantic-release/changelog": "^6.0.3",
|
|
64
|
-
"@semantic-release/commit-analyzer": "^11.1.0",
|
|
65
|
-
"@semantic-release/git": "^10.0.1",
|
|
66
|
-
"@semantic-release/github": "^9.2.6",
|
|
67
|
-
"@semantic-release/npm": "^11.0.2",
|
|
68
|
-
"@semantic-release/release-notes-generator": "^12.1.0",
|
|
69
66
|
"@types/node": "^18.19.80",
|
|
70
67
|
"glob": "^11.0.3",
|
|
71
|
-
"semantic-release": "^23.0.2",
|
|
72
68
|
"ts-node": "^10.9.0",
|
|
73
69
|
"typedoc": "^0.28.1",
|
|
74
70
|
"typedoc-plugin-markdown": "^4.6.0",
|
|
@@ -91,4 +87,4 @@
|
|
|
91
87
|
"publishConfig": {
|
|
92
88
|
"access": "public"
|
|
93
89
|
}
|
|
94
|
-
}
|
|
90
|
+
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { BuilderState, SchemaDefinition } from '../types/builder-state.js';
|
|
2
|
-
import { QueryBuilder } from '../query-builder.js';
|
|
3
|
-
import { PaginatedResult, PaginationOptions } from '../../types/index.js';
|
|
4
|
-
export declare class PaginationFeature<Schema extends SchemaDefinition<Schema>, State extends BuilderState<Schema, string, any, keyof Schema, Partial<Record<string, keyof Schema>>>> {
|
|
5
|
-
private builder;
|
|
6
|
-
private static cursorStacks;
|
|
7
|
-
private stackKey;
|
|
8
|
-
constructor(builder: QueryBuilder<Schema, State>);
|
|
9
|
-
private get cursorStack();
|
|
10
|
-
private set cursorStack(value);
|
|
11
|
-
private get currentPosition();
|
|
12
|
-
private set currentPosition(value);
|
|
13
|
-
private encodeCursor;
|
|
14
|
-
private decodeCursor;
|
|
15
|
-
paginate(options: PaginationOptions<State['output']>): Promise<PaginatedResult<State['output']>>;
|
|
16
|
-
private generateCursor;
|
|
17
|
-
firstPage(pageSize: number): Promise<PaginatedResult<State['output']>>;
|
|
18
|
-
iteratePages(pageSize: number): AsyncGenerator<PaginatedResult<State['output']>>;
|
|
19
|
-
private paginationGenerator;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/core/features/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACvC,KAAK,SAAS,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC;IAKxF,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAiE;IAC5F,OAAO,CAAC,QAAQ,CAAS;gBAEL,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;IAOxD,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,WAAW,QAGtB;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,eAAe,QAG1B;IAED,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAId,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAgHtG,OAAO,CAAC,cAAc;IAkBhB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAI5E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAIjE,mBAAmB;CAWnC"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
export class PaginationFeature {
|
|
2
|
-
builder;
|
|
3
|
-
static cursorStacks = new Map();
|
|
4
|
-
stackKey;
|
|
5
|
-
constructor(builder) {
|
|
6
|
-
this.builder = builder;
|
|
7
|
-
this.stackKey = builder.getTableName();
|
|
8
|
-
if (!PaginationFeature.cursorStacks.has(this.stackKey)) {
|
|
9
|
-
PaginationFeature.cursorStacks.set(this.stackKey, { stack: [], position: -1 });
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
get cursorStack() {
|
|
13
|
-
return PaginationFeature.cursorStacks.get(this.stackKey).stack;
|
|
14
|
-
}
|
|
15
|
-
set cursorStack(value) {
|
|
16
|
-
const current = PaginationFeature.cursorStacks.get(this.stackKey);
|
|
17
|
-
PaginationFeature.cursorStacks.set(this.stackKey, { ...current, stack: value });
|
|
18
|
-
}
|
|
19
|
-
get currentPosition() {
|
|
20
|
-
return PaginationFeature.cursorStacks.get(this.stackKey).position;
|
|
21
|
-
}
|
|
22
|
-
set currentPosition(value) {
|
|
23
|
-
const current = PaginationFeature.cursorStacks.get(this.stackKey);
|
|
24
|
-
PaginationFeature.cursorStacks.set(this.stackKey, { ...current, position: value });
|
|
25
|
-
}
|
|
26
|
-
encodeCursor(values) {
|
|
27
|
-
return Buffer.from(JSON.stringify(values)).toString('base64');
|
|
28
|
-
}
|
|
29
|
-
decodeCursor(cursor) {
|
|
30
|
-
return JSON.parse(Buffer.from(cursor, 'base64').toString());
|
|
31
|
-
}
|
|
32
|
-
async paginate(options) {
|
|
33
|
-
const { pageSize, after, before, orderBy = [] } = options;
|
|
34
|
-
const requestSize = pageSize + 1;
|
|
35
|
-
if (after) {
|
|
36
|
-
if (this.currentPosition < this.cursorStack.length - 1) {
|
|
37
|
-
this.cursorStack = this.cursorStack.slice(0, this.currentPosition + 1);
|
|
38
|
-
}
|
|
39
|
-
this.cursorStack = [...this.cursorStack, after];
|
|
40
|
-
this.currentPosition = this.cursorStack.length - 1;
|
|
41
|
-
}
|
|
42
|
-
else if (before) {
|
|
43
|
-
const cursorIndex = this.cursorStack.indexOf(before);
|
|
44
|
-
if (cursorIndex === -1) {
|
|
45
|
-
if (this.currentPosition === this.cursorStack.length - 1) {
|
|
46
|
-
this.cursorStack = [...this.cursorStack, before];
|
|
47
|
-
}
|
|
48
|
-
this.currentPosition = Math.max(-1, this.currentPosition - 1);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
this.currentPosition = Math.max(-1, cursorIndex - 1);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
if (!this.cursorStack.length) {
|
|
56
|
-
this.cursorStack = [];
|
|
57
|
-
this.currentPosition = -1;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
orderBy.forEach(({ column, direction }) => {
|
|
61
|
-
this.builder.orderBy(column, direction);
|
|
62
|
-
});
|
|
63
|
-
const cursor = after || before;
|
|
64
|
-
if (cursor && orderBy && orderBy.length > 0) {
|
|
65
|
-
const [{ column, direction }] = orderBy;
|
|
66
|
-
const columnName = String(column);
|
|
67
|
-
const cursorValues = this.decodeCursor(cursor);
|
|
68
|
-
const value = cursorValues[columnName];
|
|
69
|
-
if (before) {
|
|
70
|
-
const operator = direction === 'DESC' ? 'gt' : 'lt';
|
|
71
|
-
this.builder.where(columnName, operator, value);
|
|
72
|
-
orderBy.forEach(({ column, direction }) => {
|
|
73
|
-
const reversedDirection = direction === 'DESC' ? 'ASC' : 'DESC';
|
|
74
|
-
this.builder.orderBy(column, reversedDirection);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
const operator = direction === 'DESC' ? 'lt' : 'gt';
|
|
79
|
-
this.builder.where(columnName, operator, value);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
this.builder.limit(requestSize);
|
|
83
|
-
// Pagination mutates builder state per page; bypass caching until pagination-specific caching is designed.
|
|
84
|
-
let results = await this.builder.execute({ cache: { mode: 'no-store' } });
|
|
85
|
-
if (before) {
|
|
86
|
-
results = results.reverse();
|
|
87
|
-
}
|
|
88
|
-
const data = results.slice(0, pageSize);
|
|
89
|
-
const startCursor = data.length > 0 ? this.generateCursor(data[0], orderBy) : '';
|
|
90
|
-
const endCursor = data.length > 0 ? this.generateCursor(data[data.length - 1], orderBy) : '';
|
|
91
|
-
const hasMore = results.length > pageSize;
|
|
92
|
-
if (!cursor) {
|
|
93
|
-
return {
|
|
94
|
-
data,
|
|
95
|
-
pageInfo: {
|
|
96
|
-
hasNextPage: hasMore,
|
|
97
|
-
hasPreviousPage: data.length > 0 && this.currentPosition > 0,
|
|
98
|
-
startCursor,
|
|
99
|
-
endCursor,
|
|
100
|
-
totalCount: 0,
|
|
101
|
-
totalPages: 0,
|
|
102
|
-
pageSize
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
if (before) {
|
|
107
|
-
return {
|
|
108
|
-
data,
|
|
109
|
-
pageInfo: {
|
|
110
|
-
hasNextPage: true,
|
|
111
|
-
hasPreviousPage: data.length > 0 && (this.currentPosition >= 0 || hasMore),
|
|
112
|
-
startCursor,
|
|
113
|
-
endCursor,
|
|
114
|
-
totalCount: 0,
|
|
115
|
-
totalPages: 0,
|
|
116
|
-
pageSize
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
data,
|
|
122
|
-
pageInfo: {
|
|
123
|
-
hasNextPage: hasMore,
|
|
124
|
-
hasPreviousPage: data.length > 0,
|
|
125
|
-
startCursor,
|
|
126
|
-
endCursor,
|
|
127
|
-
totalCount: 0,
|
|
128
|
-
totalPages: 0,
|
|
129
|
-
pageSize
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
generateCursor(record, orderBy) {
|
|
134
|
-
const cursorData = {};
|
|
135
|
-
if (orderBy) {
|
|
136
|
-
orderBy.forEach(({ column }) => {
|
|
137
|
-
const columnName = String(column);
|
|
138
|
-
cursorData[columnName] = record[columnName];
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
const [firstColumn] = Object.keys(record);
|
|
143
|
-
if (firstColumn) {
|
|
144
|
-
cursorData[firstColumn] = record[firstColumn];
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return this.encodeCursor(cursorData);
|
|
148
|
-
}
|
|
149
|
-
async firstPage(pageSize) {
|
|
150
|
-
return this.paginate({ pageSize });
|
|
151
|
-
}
|
|
152
|
-
iteratePages(pageSize) {
|
|
153
|
-
return this.paginationGenerator(pageSize);
|
|
154
|
-
}
|
|
155
|
-
async *paginationGenerator(pageSize) {
|
|
156
|
-
let cursor;
|
|
157
|
-
while (true) {
|
|
158
|
-
const result = await this.paginate({ pageSize, after: cursor });
|
|
159
|
-
yield result;
|
|
160
|
-
if (!result.pageInfo.hasNextPage)
|
|
161
|
-
break;
|
|
162
|
-
cursor = result.pageInfo.endCursor;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-test-tbc.d.ts","sourceRoot":"","sources":["../../../../src/core/tests/integration/pagination-test-tbc.ts"],"names":[],"mappings":""}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
// Skipping tests becuase this feature is not ready
|
|
3
|
-
const SKIP_INTEGRATION_TESTS = true; // process.env.SKIP_INTEGRATION_TESTS === 'true' || process.env.CI === 'true';
|
|
4
|
-
describe('Integration Tests - Pagination', () => {
|
|
5
|
-
// Only run these tests if not skipped
|
|
6
|
-
// Removing until this feature is ready
|
|
7
|
-
// (SKIP_INTEGRATION_TESTS ? describe.skip : describe)('ClickHouse Integration', () => {
|
|
8
|
-
// let db: Awaited<ReturnType<typeof initializeTestConnection>>;
|
|
9
|
-
// beforeAll(async () => {
|
|
10
|
-
// if (!SKIP_INTEGRATION_TESTS) {
|
|
11
|
-
// try {
|
|
12
|
-
// // Start ClickHouse container
|
|
13
|
-
// startClickHouseContainer();
|
|
14
|
-
// // Initialize connection
|
|
15
|
-
// db = await initializeTestConnection();
|
|
16
|
-
// // Set up test database
|
|
17
|
-
// await setupTestDatabase();
|
|
18
|
-
// } catch (error) {
|
|
19
|
-
// console.error('Failed to set up integration tests:', error);
|
|
20
|
-
// throw error;
|
|
21
|
-
// }
|
|
22
|
-
// }
|
|
23
|
-
// }, 60000); // Allow up to 60 seconds for setup
|
|
24
|
-
// afterAll(async () => {
|
|
25
|
-
// if (!SKIP_INTEGRATION_TESTS) {
|
|
26
|
-
// try {
|
|
27
|
-
// // Wait for any pending operations to complete
|
|
28
|
-
// console.log('Starting test cleanup...');
|
|
29
|
-
// await new Promise(resolve => setTimeout(resolve, 1000));
|
|
30
|
-
// // Close any active client connections to prevent lingering queries
|
|
31
|
-
// if (db) {
|
|
32
|
-
// try {
|
|
33
|
-
// const client = ClickHouseConnection.getClient();
|
|
34
|
-
// console.log('Closing ClickHouse client connection...');
|
|
35
|
-
// // Wait for any in-flight queries to complete
|
|
36
|
-
// await new Promise(resolve => setTimeout(resolve, 500));
|
|
37
|
-
// // Ensure we're not running any more queries
|
|
38
|
-
// await client.close().catch(err => {
|
|
39
|
-
// console.error('Error closing ClickHouse client:', err);
|
|
40
|
-
// });
|
|
41
|
-
// console.log('ClickHouse client closed successfully');
|
|
42
|
-
// } catch (closeError) {
|
|
43
|
-
// console.error('Error during client close:', closeError);
|
|
44
|
-
// }
|
|
45
|
-
// }
|
|
46
|
-
// // Then stop the container
|
|
47
|
-
// console.log('Stopping ClickHouse container...');
|
|
48
|
-
// await stopClickHouseContainer();
|
|
49
|
-
// console.log('Cleanup completed');
|
|
50
|
-
// // Make sure all async operations have a chance to complete
|
|
51
|
-
// await new Promise(resolve => setTimeout(resolve, 500));
|
|
52
|
-
// } catch (error) {
|
|
53
|
-
// console.error('Error during test cleanup:', error);
|
|
54
|
-
// }
|
|
55
|
-
// }
|
|
56
|
-
// }, 15000); // Allow up to 15 seconds for teardown
|
|
57
|
-
// test('should paginate results with cursor-based pagination', async () => {
|
|
58
|
-
// // Get first page
|
|
59
|
-
// const firstPage = await db.table('test_table')
|
|
60
|
-
// .orderBy('id', 'ASC')
|
|
61
|
-
// .paginate({
|
|
62
|
-
// pageSize: 2,
|
|
63
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
64
|
-
// });
|
|
65
|
-
// expect(firstPage.data).toHaveLength(2);
|
|
66
|
-
// expect(firstPage.pageInfo.hasNextPage).toBe(true);
|
|
67
|
-
// expect(firstPage.pageInfo.hasPreviousPage).toBe(false);
|
|
68
|
-
// expect(firstPage.pageInfo.startCursor).toBeTruthy();
|
|
69
|
-
// expect(firstPage.pageInfo.endCursor).toBeTruthy();
|
|
70
|
-
// expect(firstPage.data[0].id).toBe(1);
|
|
71
|
-
// expect(firstPage.data[1].id).toBe(2);
|
|
72
|
-
// // Get second page using the cursor
|
|
73
|
-
// const secondPage = await db.table('test_table')
|
|
74
|
-
// .orderBy('id', 'ASC')
|
|
75
|
-
// .paginate({
|
|
76
|
-
// pageSize: 2,
|
|
77
|
-
// after: firstPage.pageInfo.endCursor,
|
|
78
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
79
|
-
// });
|
|
80
|
-
// expect(secondPage.data).toHaveLength(2);
|
|
81
|
-
// expect(secondPage.pageInfo.hasNextPage).toBe(true);
|
|
82
|
-
// expect(secondPage.pageInfo.hasPreviousPage).toBe(true);
|
|
83
|
-
// expect(secondPage.data[0].id).toBe(3);
|
|
84
|
-
// expect(secondPage.data[1].id).toBe(4);
|
|
85
|
-
// // Get third page using the cursor
|
|
86
|
-
// const thirdPage = await db.table('test_table')
|
|
87
|
-
// .orderBy('id', 'ASC')
|
|
88
|
-
// .paginate({
|
|
89
|
-
// pageSize: 2,
|
|
90
|
-
// after: secondPage.pageInfo.endCursor,
|
|
91
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
92
|
-
// });
|
|
93
|
-
// expect(thirdPage.data).toHaveLength(1); // Only one record left
|
|
94
|
-
// expect(thirdPage.pageInfo.hasNextPage).toBe(false);
|
|
95
|
-
// expect(thirdPage.pageInfo.hasPreviousPage).toBe(true);
|
|
96
|
-
// expect(thirdPage.data[0].id).toBe(5);
|
|
97
|
-
// });
|
|
98
|
-
// test('should navigate backwards with cursor-based pagination', async () => {
|
|
99
|
-
// // Get first page
|
|
100
|
-
// const firstPage = await db.table('test_table')
|
|
101
|
-
// .orderBy('id', 'ASC')
|
|
102
|
-
// .paginate({
|
|
103
|
-
// pageSize: 2,
|
|
104
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
105
|
-
// });
|
|
106
|
-
// // Get second page
|
|
107
|
-
// const secondPage = await db.table('test_table')
|
|
108
|
-
// .orderBy('id', 'ASC')
|
|
109
|
-
// .paginate({
|
|
110
|
-
// pageSize: 2,
|
|
111
|
-
// after: firstPage.pageInfo.endCursor,
|
|
112
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
113
|
-
// });
|
|
114
|
-
// // Navigate back to first page
|
|
115
|
-
// const backToFirstPage = await db.table('test_table')
|
|
116
|
-
// .orderBy('id', 'ASC')
|
|
117
|
-
// .paginate({
|
|
118
|
-
// pageSize: 2,
|
|
119
|
-
// before: secondPage.pageInfo.startCursor,
|
|
120
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
121
|
-
// });
|
|
122
|
-
// expect(backToFirstPage.data).toHaveLength(2);
|
|
123
|
-
// expect(backToFirstPage.pageInfo.hasNextPage).toBe(true);
|
|
124
|
-
// expect(backToFirstPage.pageInfo.hasPreviousPage).toBe(false);
|
|
125
|
-
// expect(backToFirstPage.data[0].id).toBe(1);
|
|
126
|
-
// expect(backToFirstPage.data[1].id).toBe(2);
|
|
127
|
-
// });
|
|
128
|
-
// test('should handle empty results', async () => {
|
|
129
|
-
// const result = await db.table('test_table')
|
|
130
|
-
// .where('id', 'gt', 100) // No records with id > 100
|
|
131
|
-
// .paginate({
|
|
132
|
-
// pageSize: 10,
|
|
133
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
134
|
-
// });
|
|
135
|
-
// expect(result.data).toHaveLength(0);
|
|
136
|
-
// expect(result.pageInfo.hasNextPage).toBe(false);
|
|
137
|
-
// expect(result.pageInfo.hasPreviousPage).toBe(false);
|
|
138
|
-
// expect(result.pageInfo.startCursor).toBe('');
|
|
139
|
-
// expect(result.pageInfo.endCursor).toBe('');
|
|
140
|
-
// });
|
|
141
|
-
// test('should handle exactly pageSize results', async () => {
|
|
142
|
-
// const result = await db.table('test_table')
|
|
143
|
-
// .where('id', 'lte', 2) // Only 2 records
|
|
144
|
-
// .paginate({
|
|
145
|
-
// pageSize: 2,
|
|
146
|
-
// orderBy: [{ column: 'id', direction: 'ASC' }]
|
|
147
|
-
// });
|
|
148
|
-
// console.log('CHECK!!!!: ', result.pageInfo)
|
|
149
|
-
// expect(result.data).toHaveLength(2);
|
|
150
|
-
// expect(result.pageInfo.hasNextPage).toBe(false);
|
|
151
|
-
// expect(result.pageInfo.hasPreviousPage).toBe(false);
|
|
152
|
-
// });
|
|
153
|
-
// test('should iterate through all pages', async () => {
|
|
154
|
-
// const allResults: any[] = [];
|
|
155
|
-
// for await (const page of db.table('test_table')
|
|
156
|
-
// .orderBy('id', 'ASC')
|
|
157
|
-
// .iteratePages(2)) {
|
|
158
|
-
// allResults.push(...page.data);
|
|
159
|
-
// }
|
|
160
|
-
// expect(allResults).toHaveLength(TEST_DATA.test_table.length);
|
|
161
|
-
// // Check that all records were retrieved in the correct order
|
|
162
|
-
// for (let i = 0; i < allResults.length; i++) {
|
|
163
|
-
// expect(allResults[i].id).toBe(i + 1);
|
|
164
|
-
// }
|
|
165
|
-
// });
|
|
166
|
-
// test('should paginate with complex ordering', async () => {
|
|
167
|
-
// // First page ordered by price descending
|
|
168
|
-
// const firstPage = await db.table('test_table')
|
|
169
|
-
// .paginate({
|
|
170
|
-
// pageSize: 2,
|
|
171
|
-
// orderBy: [{ column: 'price', direction: 'DESC' }]
|
|
172
|
-
// });
|
|
173
|
-
// expect(firstPage.data).toHaveLength(2);
|
|
174
|
-
// // Verify ordering
|
|
175
|
-
// expect(Number(firstPage.data[0].price)).toBeGreaterThanOrEqual(Number(firstPage.data[1].price));
|
|
176
|
-
// // Get second page
|
|
177
|
-
// const secondPage = await db.table('test_table')
|
|
178
|
-
// .paginate({
|
|
179
|
-
// pageSize: 2,
|
|
180
|
-
// after: firstPage.pageInfo.endCursor,
|
|
181
|
-
// orderBy: [{ column: 'price', direction: 'DESC' }]
|
|
182
|
-
// });
|
|
183
|
-
// expect(secondPage.data).toHaveLength(2);
|
|
184
|
-
// // Verify ordering continues correctly
|
|
185
|
-
// expect(Number(firstPage.data[1].price)).toBeGreaterThanOrEqual(Number(secondPage.data[0].price));
|
|
186
|
-
// expect(Number(secondPage.data[0].price)).toBeGreaterThanOrEqual(Number(secondPage.data[1].price));
|
|
187
|
-
// });
|
|
188
|
-
// });
|
|
189
|
-
});
|
|
190
|
-
export {};
|