@hypequery/clickhouse 1.5.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +19 -14
- package/dist/cli/generate-types.js +5 -12
- package/dist/core/adapters/clickhouse-adapter.d.ts +14 -0
- package/dist/core/adapters/clickhouse-adapter.d.ts.map +1 -0
- package/dist/core/adapters/clickhouse-adapter.js +58 -0
- package/dist/core/adapters/database-adapter.d.ts +13 -0
- package/dist/core/adapters/database-adapter.d.ts.map +1 -0
- package/dist/core/adapters/database-adapter.js +1 -0
- package/dist/core/cache/cache-manager.d.ts.map +1 -1
- package/dist/core/cache/cache-manager.js +6 -5
- package/dist/core/dialects/clickhouse-dialect.d.ts +10 -0
- package/dist/core/dialects/clickhouse-dialect.d.ts.map +1 -0
- package/dist/core/dialects/clickhouse-dialect.js +47 -0
- package/dist/core/dialects/sql-dialect.d.ts +11 -0
- package/dist/core/dialects/sql-dialect.d.ts.map +1 -0
- package/dist/core/dialects/sql-dialect.js +1 -0
- package/dist/core/features/aggregations.d.ts +5 -5
- package/dist/core/features/analytics.d.ts +822 -4
- package/dist/core/features/analytics.d.ts.map +1 -1
- package/dist/core/features/analytics.js +15 -9
- package/dist/core/features/executor.d.ts.map +1 -1
- package/dist/core/features/executor.js +26 -53
- package/dist/core/features/filtering.d.ts +5 -5
- package/dist/core/features/joins.d.ts +1 -1
- package/dist/core/features/query-modifiers.d.ts +6 -6
- package/dist/core/query-builder.d.ts +20 -7
- package/dist/core/query-builder.d.ts.map +1 -1
- package/dist/core/query-builder.js +45 -32
- package/dist/core/tests/integration/setup.d.ts +3 -1
- package/dist/core/tests/integration/setup.d.ts.map +1 -1
- package/dist/core/tests/test-utils.d.ts.map +1 -1
- package/dist/core/tests/test-utils.js +16 -4
- package/dist/core/types/builder-state.d.ts +7 -5
- package/dist/core/types/builder-state.d.ts.map +1 -1
- package/dist/core/types/select-types.d.ts +4 -3
- package/dist/core/types/select-types.d.ts.map +1 -1
- package/dist/core/utils/predicate-builder.d.ts +4 -0
- package/dist/core/utils/predicate-builder.d.ts.map +1 -1
- package/dist/core/utils/predicate-builder.js +4 -1
- package/dist/core/utils/streaming-helpers.d.ts.map +1 -1
- package/dist/core/utils/streaming-helpers.js +8 -0
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +3 -0
- package/dist/dataset/definition.d.ts +135 -0
- package/dist/dataset/definition.d.ts.map +1 -0
- package/dist/dataset/definition.js +265 -0
- package/dist/dataset/helpers.d.ts +136 -0
- package/dist/dataset/helpers.d.ts.map +1 -0
- package/dist/dataset/helpers.js +189 -0
- package/dist/dataset/index.d.ts +51 -0
- package/dist/dataset/index.d.ts.map +1 -0
- package/dist/dataset/index.js +59 -0
- package/dist/dataset/introspection.d.ts +133 -0
- package/dist/dataset/introspection.d.ts.map +1 -0
- package/dist/dataset/introspection.js +239 -0
- package/dist/dataset/sql-tag.d.ts +51 -0
- package/dist/dataset/sql-tag.d.ts.map +1 -0
- package/dist/dataset/sql-tag.js +86 -0
- package/dist/dataset/types.d.ts +300 -0
- package/dist/dataset/types.d.ts.map +1 -0
- package/dist/dataset/types.js +11 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -15
- package/dist/migrations/config/index.d.ts +3 -0
- package/dist/migrations/config/index.d.ts.map +1 -0
- package/dist/migrations/config/index.js +1 -0
- package/dist/migrations/config/types.d.ts +45 -0
- package/dist/migrations/config/types.d.ts.map +1 -0
- package/dist/migrations/config/types.js +28 -0
- package/dist/migrations/diff/diff.d.ts +11 -0
- package/dist/migrations/diff/diff.d.ts.map +1 -0
- package/dist/migrations/diff/diff.js +240 -0
- package/dist/migrations/diff/index.d.ts +3 -0
- package/dist/migrations/diff/index.d.ts.map +1 -0
- package/dist/migrations/diff/index.js +1 -0
- package/dist/migrations/diff/types.d.ts +74 -0
- package/dist/migrations/diff/types.d.ts.map +1 -0
- package/dist/migrations/diff/types.js +1 -0
- package/dist/migrations/schema/column.d.ts +71 -0
- package/dist/migrations/schema/column.d.ts.map +1 -0
- package/dist/migrations/schema/column.js +123 -0
- package/dist/migrations/schema/define.d.ts +24 -0
- package/dist/migrations/schema/define.d.ts.map +1 -0
- package/dist/migrations/schema/define.js +47 -0
- package/dist/migrations/schema/index.d.ts +4 -0
- package/dist/migrations/schema/index.d.ts.map +1 -0
- package/dist/migrations/schema/index.js +2 -0
- package/dist/migrations/schema/types.d.ts +74 -0
- package/dist/migrations/schema/types.d.ts.map +1 -0
- package/dist/migrations/schema/types.js +1 -0
- package/dist/migrations/snapshot/index.d.ts +3 -0
- package/dist/migrations/snapshot/index.d.ts.map +1 -0
- package/dist/migrations/snapshot/index.js +1 -0
- package/dist/migrations/snapshot/serialize.d.ts +21 -0
- package/dist/migrations/snapshot/serialize.d.ts.map +1 -0
- package/dist/migrations/snapshot/serialize.js +127 -0
- package/dist/migrations/snapshot/types.d.ts +47 -0
- package/dist/migrations/snapshot/types.d.ts.map +1 -0
- package/dist/migrations/snapshot/types.js +1 -0
- package/dist/migrations/sql/index.d.ts +4 -0
- package/dist/migrations/sql/index.d.ts.map +1 -0
- package/dist/migrations/sql/index.js +2 -0
- package/dist/migrations/sql/render.d.ts +11 -0
- package/dist/migrations/sql/render.d.ts.map +1 -0
- package/dist/migrations/sql/render.js +334 -0
- package/dist/migrations/sql/types.d.ts +48 -0
- package/dist/migrations/sql/types.d.ts.map +1 -0
- package/dist/migrations/sql/types.js +1 -0
- package/dist/migrations/sql/write.d.ts +9 -0
- package/dist/migrations/sql/write.d.ts.map +1 -0
- package/dist/migrations/sql/write.js +31 -0
- package/dist/types/base.d.ts +2 -1
- package/dist/types/base.d.ts.map +1 -1
- package/dist/types/clickhouse-types.d.ts +3 -1
- package/dist/types/clickhouse-types.d.ts.map +1 -1
- package/package.json +20 -20
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { QueryBuilder } from '../query-builder.js';
|
|
2
|
+
import { ClickHouseDialect } from '../dialects/clickhouse-dialect.js';
|
|
2
3
|
import { buildRuntimeContext, resolveCacheConfig } from '../cache/runtime-context.js';
|
|
4
|
+
import { substituteParameters } from '../utils.js';
|
|
3
5
|
export const TEST_SCHEMAS = {
|
|
4
6
|
test_table: {
|
|
5
7
|
id: 'Int32',
|
|
@@ -39,6 +41,14 @@ export const TEST_SCHEMAS = {
|
|
|
39
41
|
function createTestRuntime() {
|
|
40
42
|
return buildRuntimeContext(resolveCacheConfig(undefined, 'tests'));
|
|
41
43
|
}
|
|
44
|
+
const testAdapter = {
|
|
45
|
+
name: 'test',
|
|
46
|
+
query: async () => {
|
|
47
|
+
throw new Error('Test adapter does not execute queries.');
|
|
48
|
+
},
|
|
49
|
+
render: (sql, params = []) => substituteParameters(sql, params)
|
|
50
|
+
};
|
|
51
|
+
const testDialect = new ClickHouseDialect();
|
|
42
52
|
export function setupUsersBuilder() {
|
|
43
53
|
const state = {
|
|
44
54
|
schema: TEST_SCHEMAS,
|
|
@@ -46,9 +56,10 @@ export function setupUsersBuilder() {
|
|
|
46
56
|
output: {},
|
|
47
57
|
baseTable: 'users',
|
|
48
58
|
base: TEST_SCHEMAS.users,
|
|
49
|
-
aliases: {}
|
|
59
|
+
aliases: {},
|
|
60
|
+
scalars: {}
|
|
50
61
|
};
|
|
51
|
-
return new QueryBuilder('users', state, createTestRuntime());
|
|
62
|
+
return new QueryBuilder('users', state, createTestRuntime(), testAdapter, testDialect);
|
|
52
63
|
}
|
|
53
64
|
export function setupTestBuilder() {
|
|
54
65
|
const state = {
|
|
@@ -57,7 +68,8 @@ export function setupTestBuilder() {
|
|
|
57
68
|
output: {},
|
|
58
69
|
baseTable: 'test_table',
|
|
59
70
|
base: TEST_SCHEMAS.test_table,
|
|
60
|
-
aliases: {}
|
|
71
|
+
aliases: {},
|
|
72
|
+
scalars: {}
|
|
61
73
|
};
|
|
62
|
-
return new QueryBuilder('test_table', state, createTestRuntime());
|
|
74
|
+
return new QueryBuilder('test_table', state, createTestRuntime(), testAdapter, testDialect);
|
|
63
75
|
}
|
|
@@ -3,23 +3,25 @@ import type { Simplify } from './type-helpers.js';
|
|
|
3
3
|
export type SchemaDefinition<Schema extends Record<string, any> = Record<string, any>> = {
|
|
4
4
|
[K in keyof Schema]: Record<string, ColumnType>;
|
|
5
5
|
};
|
|
6
|
-
export type BuilderState<Schema extends SchemaDefinition<Schema>, VisibleTables extends string, OutputRow, BaseTable extends keyof Schema, Aliases extends Partial<Record<string, keyof Schema>> = {}> = {
|
|
6
|
+
export type BuilderState<Schema extends SchemaDefinition<Schema>, VisibleTables extends string, OutputRow, BaseTable extends keyof Schema, Aliases extends Partial<Record<string, keyof Schema>> = {}, Scalars extends Record<string, unknown> = {}> = {
|
|
7
7
|
schema: Schema;
|
|
8
8
|
tables: VisibleTables;
|
|
9
9
|
output: OutputRow;
|
|
10
10
|
baseTable: BaseTable;
|
|
11
11
|
base: Schema[BaseTable];
|
|
12
12
|
aliases: Aliases;
|
|
13
|
+
scalars: Scalars;
|
|
13
14
|
};
|
|
14
15
|
export type AnyBuilderState = BuilderState<any, any, any, any, any>;
|
|
15
16
|
export type BaseRow<State extends AnyBuilderState> = Simplify<{
|
|
16
17
|
[K in keyof State['base']]: State['base'][K] extends ColumnType ? InferColumnType<State['base'][K]> : never;
|
|
17
18
|
}>;
|
|
18
|
-
export type WidenTables<State extends AnyBuilderState, Table extends keyof State['schema']> = BuilderState<State['schema'], State['tables'] | (Table & string), State['output'], State['baseTable'], State['aliases']>;
|
|
19
|
-
export type UpdateOutput<State extends AnyBuilderState, Output> = BuilderState<State['schema'], State['tables'], Output, State['baseTable'], State['aliases']>;
|
|
20
|
-
export type InitialState<Schema extends SchemaDefinition<Schema>, Table extends keyof Schema> = BuilderState<Schema, Table & string, TableRecord<Schema[Table]>, Table, {}>;
|
|
19
|
+
export type WidenTables<State extends AnyBuilderState, Table extends keyof State['schema']> = BuilderState<State['schema'], State['tables'] | (Table & string), State['output'], State['baseTable'], State['aliases'], State['scalars']>;
|
|
20
|
+
export type UpdateOutput<State extends AnyBuilderState, Output> = BuilderState<State['schema'], State['tables'], Output, State['baseTable'], State['aliases'], State['scalars']>;
|
|
21
|
+
export type InitialState<Schema extends SchemaDefinition<Schema>, Table extends keyof Schema> = BuilderState<Schema, Table & string, TableRecord<Schema[Table]>, Table, {}, {}>;
|
|
21
22
|
export type ExplicitSelectionState<State extends AnyBuilderState> = BaseRow<State> extends State['output'] ? State['output'] extends BaseRow<State> ? false : true : true;
|
|
22
23
|
export type AppendToOutput<State extends AnyBuilderState, Added> = UpdateOutput<State, ExplicitSelectionState<State> extends true ? Simplify<State['output'] & Added> : Simplify<Added>>;
|
|
23
|
-
export type AddAlias<State extends AnyBuilderState, Alias extends string, Table extends keyof State['schema']> = BuilderState<State['schema'], State['tables'] | Alias, State['output'], State['baseTable'], State['aliases'] & Record<Alias, Table
|
|
24
|
+
export type AddAlias<State extends AnyBuilderState, Alias extends string, Table extends keyof State['schema']> = BuilderState<State['schema'], State['tables'] | Alias, State['output'], State['baseTable'], State['aliases'] & Record<Alias, Table>, State['scalars']>;
|
|
25
|
+
export type AddScalar<State extends AnyBuilderState, Alias extends string, Value> = BuilderState<State['schema'], State['tables'], State['output'], State['baseTable'], State['aliases'], State['scalars'] & Record<Alias, Value>>;
|
|
24
26
|
export type ResolveTableSchema<State extends AnyBuilderState, Table extends string> = Table extends keyof State['schema'] ? State['schema'][Table] : Table extends keyof State['aliases'] ? State['schema'][State['aliases'][Table]] : never;
|
|
25
27
|
//# sourceMappingURL=builder-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder-state.d.ts","sourceRoot":"","sources":["../../../src/core/types/builder-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,gBAAgB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;KACtF,CAAC,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,YAAY,CACtB,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACvC,aAAa,SAAS,MAAM,EAC5B,SAAS,EACT,SAAS,SAAS,MAAM,MAAM,EAC9B,OAAO,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"builder-state.d.ts","sourceRoot":"","sources":["../../../src/core/types/builder-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,14 +9,15 @@ export type QualifiedColumnKeys<State extends AnyBuilderState> = {
|
|
|
9
9
|
}[TableIdentifiers<State>];
|
|
10
10
|
export type BaseColumnKeys<State extends AnyBuilderState> = keyof BaseRow<State>;
|
|
11
11
|
export type OutputColumnKeys<State extends AnyBuilderState> = keyof State['output'];
|
|
12
|
-
export type
|
|
12
|
+
export type ScalarColumnKeys<State extends AnyBuilderState> = keyof State['scalars'];
|
|
13
|
+
export type SelectableColumn<State extends AnyBuilderState> = OutputColumnKeys<State> | ScalarColumnKeys<State> | BaseColumnKeys<State> | QualifiedColumnKeys<State>;
|
|
13
14
|
type StringSelectableColumn<State extends AnyBuilderState> = Extract<SelectableColumn<State>, string>;
|
|
14
15
|
type AsKeyword = 'as' | 'AS' | 'As' | 'aS';
|
|
15
16
|
type AliasedColumnString<State extends AnyBuilderState> = `${StringSelectableColumn<State>} ${AsKeyword} ${string}`;
|
|
16
|
-
export type SelectableItem<State extends AnyBuilderState> = SelectableColumn<State> | AliasedColumnString<State> | SqlExpression
|
|
17
|
+
export type SelectableItem<State extends AnyBuilderState> = SelectableColumn<State> | AliasedColumnString<State> | AliasedExpression<any, string> | SqlExpression<any>;
|
|
17
18
|
export type ColumnSelectionKey<P> = P extends `${string}.${infer C}` ? C : P;
|
|
18
19
|
type QualifiedColumnValue<State extends AnyBuilderState, P> = P extends `${infer Table}.${infer Column}` ? ResolveTableSchema<State, Table> extends Record<string, ColumnType> ? Column extends keyof ResolveTableSchema<State, Table> ? ResolveTableSchema<State, Table>[Column] extends ColumnType ? InferColumnType<ResolveTableSchema<State, Table>[Column]> : never : never : never : never;
|
|
19
|
-
export type ColumnSelectionValue<State extends AnyBuilderState, P> = P extends OutputColumnKeys<State> ? State['output'][P] : P extends BaseColumnKeys<State> ? BaseRow<State>[P] : QualifiedColumnValue<State, P>;
|
|
20
|
+
export type ColumnSelectionValue<State extends AnyBuilderState, P> = P extends OutputColumnKeys<State> ? State['output'][P] : P extends ScalarColumnKeys<State> ? State['scalars'][P] : P extends BaseColumnKeys<State> ? BaseRow<State>[P] : QualifiedColumnValue<State, P>;
|
|
20
21
|
export type ColumnSelectionRecord<State extends AnyBuilderState, K> = {
|
|
21
22
|
[P in Extract<K, SelectableColumn<State>> as ColumnSelectionKey<P>]: ColumnSelectionValue<State, P>;
|
|
22
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-types.d.ts","sourceRoot":"","sources":["../../../src/core/types/select-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAElE,KAAK,gBAAgB,CAAC,KAAK,SAAS,eAAe,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;AAEhF,KAAK,mBAAmB,CAAC,KAAK,SAAS,eAAe,EAAE,KAAK,SAAS,MAAM,IAC1E,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GACjE,GAAG,KAAK,IAAI,OAAO,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,GACrE,KAAK,CAAC;AAEV,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,eAAe,IAAI;KAC9D,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;CACtE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAE3B,MAAM,MAAM,cAAc,CAAC,KAAK,SAAS,eAAe,IAAI,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;AACjF,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,eAAe,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"select-types.d.ts","sourceRoot":"","sources":["../../../src/core/types/select-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,9 @@ export interface PredicateLiteral<T = PredicatePrimitive> {
|
|
|
14
14
|
}
|
|
15
15
|
export type ColumnReference<State extends AnyBuilderState> = keyof BaseRow<State> | keyof State['output'] | Extract<SelectableColumn<State>, string>;
|
|
16
16
|
export type PredicateArg<State extends AnyBuilderState> = ColumnReference<State> | PredicateExpression | PredicateLiteral | PredicateValue | PredicatePrimitive[];
|
|
17
|
+
export interface ClickHousePredicateBuilder<State extends AnyBuilderState> {
|
|
18
|
+
dictGet<T = unknown>(dictionary: string, attribute: string, key: PredicateArg<State>): PredicateExpression<T>;
|
|
19
|
+
}
|
|
17
20
|
export interface PredicateBuilder<State extends AnyBuilderState> {
|
|
18
21
|
fn<T = unknown>(name: string, ...args: Array<PredicateArg<State>>): PredicateExpression<T>;
|
|
19
22
|
col(column: ColumnReference<State>): PredicateExpression;
|
|
@@ -23,6 +26,7 @@ export interface PredicateBuilder<State extends AnyBuilderState> {
|
|
|
23
26
|
raw(sql: string): PredicateExpression;
|
|
24
27
|
and(expressions: PredicateExpression[]): PredicateExpression<boolean>;
|
|
25
28
|
or(expressions: PredicateExpression[]): PredicateExpression<boolean>;
|
|
29
|
+
ch: ClickHousePredicateBuilder<State>;
|
|
26
30
|
}
|
|
27
31
|
export declare function createPredicateBuilder<State extends AnyBuilderState>(): PredicateBuilder<State>;
|
|
28
32
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predicate-builder.d.ts","sourceRoot":"","sources":["../../../src/core/utils/predicate-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AACzE,KAAK,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,kBAAkB;IACtD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;CACV;AAED,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,eAAe,IACrD,MAAM,OAAO,CAAC,KAAK,CAAC,GACpB,MAAM,KAAK,CAAC,QAAQ,CAAC,GACrB,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AAE7C,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,eAAe,IAClD,eAAe,CAAC,KAAK,CAAC,GACtB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,kBAAkB,EAAE,CAAC;AAEzB,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,eAAe;IAC7D,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC3F,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC;IACzD,KAAK,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,mBAAmB,CAAC;IACjF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACtC,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtE,EAAE,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"predicate-builder.d.ts","sourceRoot":"","sources":["../../../src/core/utils/predicate-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AACzE,KAAK,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,kBAAkB;IACtD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;CACV;AAED,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,eAAe,IACrD,MAAM,OAAO,CAAC,KAAK,CAAC,GACpB,MAAM,KAAK,CAAC,QAAQ,CAAC,GACrB,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AAE7C,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,eAAe,IAClD,eAAe,CAAC,KAAK,CAAC,GACtB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,kBAAkB,EAAE,CAAC;AAEzB,MAAM,WAAW,0BAA0B,CAAC,KAAK,SAAS,eAAe;IACvE,OAAO,CAAC,CAAC,GAAG,OAAO,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,GACvB,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,eAAe;IAC7D,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC3F,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC;IACzD,KAAK,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,mBAAmB,CAAC;IACjF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACtC,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtE,EAAE,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACrE,EAAE,EAAE,0BAA0B,CAAC,KAAK,CAAC,CAAC;CACvC;AA4GD,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,eAAe,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAgB/F"}
|
|
@@ -87,6 +87,9 @@ export function createPredicateBuilder() {
|
|
|
87
87
|
array: values => buildArrayLiteral(values),
|
|
88
88
|
raw: sql => createExpression(sql),
|
|
89
89
|
and: expressions => buildLogical('AND', expressions),
|
|
90
|
-
or: expressions => buildLogical('OR', expressions)
|
|
90
|
+
or: expressions => buildLogical('OR', expressions),
|
|
91
|
+
ch: {
|
|
92
|
+
dictGet: (dictionary, attribute, key) => buildFunctionExpression('dictGet', [literal(dictionary), literal(attribute), key])
|
|
93
|
+
}
|
|
91
94
|
};
|
|
92
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-helpers.d.ts","sourceRoot":"","sources":["../../../src/core/utils/streaming-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"streaming-helpers.d.ts","sourceRoot":"","sources":["../../../src/core/utils/streaming-helpers.ts"],"names":[],"mappings":"AA8IA,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAwCnH"}
|
|
@@ -47,6 +47,14 @@ async function normalizeChunk(chunk, flush, append) {
|
|
|
47
47
|
append(chunk);
|
|
48
48
|
return flush();
|
|
49
49
|
}
|
|
50
|
+
if (chunk instanceof Uint8Array) {
|
|
51
|
+
append(Buffer.from(chunk));
|
|
52
|
+
return flush();
|
|
53
|
+
}
|
|
54
|
+
if (chunk instanceof ArrayBuffer) {
|
|
55
|
+
append(Buffer.from(chunk));
|
|
56
|
+
return flush();
|
|
57
|
+
}
|
|
50
58
|
if (typeof chunk === 'string') {
|
|
51
59
|
append(chunk);
|
|
52
60
|
return flush();
|
package/dist/core/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAa9C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAa9C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAgBvE"}
|
package/dist/core/utils.js
CHANGED
|
@@ -16,6 +16,9 @@ export function escapeValue(value) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
export function substituteParameters(sql, params) {
|
|
19
|
+
if (!params.length) {
|
|
20
|
+
return sql;
|
|
21
|
+
}
|
|
19
22
|
const parts = sql.split('?');
|
|
20
23
|
if (parts.length - 1 !== params.length) {
|
|
21
24
|
throw new Error(`Mismatch between placeholders and parameters. Found ${parts.length - 1} placeholders but ${params.length} parameters.`);
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataset Definition Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating and managing dataset definitions:
|
|
5
|
+
* - Dataset validation
|
|
6
|
+
* - Dimension/metric normalization
|
|
7
|
+
* - Type inference helpers
|
|
8
|
+
*/
|
|
9
|
+
import type { DatasetDefinition, DatasetsMap, DimensionsMap, Dimension, DimensionDefinition, DimensionType } from './types.js';
|
|
10
|
+
import { type SQLExpression } from './sql-tag.js';
|
|
11
|
+
/**
|
|
12
|
+
* Validate a complete dataset definition
|
|
13
|
+
*
|
|
14
|
+
* @param name - Dataset name
|
|
15
|
+
* @param definition - Dataset definition
|
|
16
|
+
* @throws Error if validation fails
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateDatasetDefinition(name: string, definition: DatasetDefinition): void;
|
|
19
|
+
/**
|
|
20
|
+
* Validate all datasets in a datasets map
|
|
21
|
+
*
|
|
22
|
+
* @param datasets - Map of dataset definitions
|
|
23
|
+
* @throws Error if any dataset is invalid
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateDatasets(datasets: DatasetsMap): void;
|
|
26
|
+
/**
|
|
27
|
+
* Normalize a dimension definition to full DimensionDefinition object
|
|
28
|
+
*
|
|
29
|
+
* @param dimension - Dimension definition (simple or complex)
|
|
30
|
+
* @returns Normalized DimensionDefinition
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeDimension(dimension: Dimension): DimensionDefinition;
|
|
33
|
+
/**
|
|
34
|
+
* Normalize all dimensions in a dimensions map
|
|
35
|
+
*
|
|
36
|
+
* @param dimensions - Map of dimension definitions
|
|
37
|
+
* @returns Map of normalized dimension definitions
|
|
38
|
+
*/
|
|
39
|
+
export declare function normalizeDimensions(dimensions: DimensionsMap): Record<string, DimensionDefinition>;
|
|
40
|
+
/**
|
|
41
|
+
* Infer the TypeScript type from a dimension definition
|
|
42
|
+
*
|
|
43
|
+
* @param dimension - Dimension definition
|
|
44
|
+
* @returns Inferred type name
|
|
45
|
+
*/
|
|
46
|
+
export declare function inferDimensionType(dimension: Dimension): DimensionType;
|
|
47
|
+
/**
|
|
48
|
+
* Get the SQL string from a dimension definition
|
|
49
|
+
*
|
|
50
|
+
* @param dimension - Dimension definition
|
|
51
|
+
* @returns SQL string
|
|
52
|
+
*/
|
|
53
|
+
export declare function getDimensionSQL(dimension: Dimension): string;
|
|
54
|
+
/**
|
|
55
|
+
* Get the SQL string from a metric definition
|
|
56
|
+
*
|
|
57
|
+
* @param metric - Metric definition
|
|
58
|
+
* @returns SQL string
|
|
59
|
+
*/
|
|
60
|
+
export declare function getMetricSQL(metric: {
|
|
61
|
+
sql: string | SQLExpression;
|
|
62
|
+
}): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get a dataset definition by name
|
|
65
|
+
*
|
|
66
|
+
* @param datasets - Map of dataset definitions
|
|
67
|
+
* @param name - Dataset name
|
|
68
|
+
* @returns Dataset definition
|
|
69
|
+
* @throws Error if dataset not found
|
|
70
|
+
*/
|
|
71
|
+
export declare function getDataset(datasets: DatasetsMap, name: string): DatasetDefinition;
|
|
72
|
+
/**
|
|
73
|
+
* List all dataset names
|
|
74
|
+
*
|
|
75
|
+
* @param datasets - Map of dataset definitions
|
|
76
|
+
* @returns Array of dataset names
|
|
77
|
+
*/
|
|
78
|
+
export declare function listDatasets(datasets: DatasetsMap): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Check if a dataset exists
|
|
81
|
+
*
|
|
82
|
+
* @param datasets - Map of dataset definitions
|
|
83
|
+
* @param name - Dataset name
|
|
84
|
+
* @returns True if dataset exists
|
|
85
|
+
*/
|
|
86
|
+
export declare function hasDataset(datasets: DatasetsMap, name: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Get dimension names for a dataset
|
|
89
|
+
*
|
|
90
|
+
* @param dataset - Dataset definition
|
|
91
|
+
* @returns Array of dimension names
|
|
92
|
+
*/
|
|
93
|
+
export declare function getDimensionNames(dataset: DatasetDefinition): string[];
|
|
94
|
+
/**
|
|
95
|
+
* Get metric names for a dataset
|
|
96
|
+
*
|
|
97
|
+
* @param dataset - Dataset definition
|
|
98
|
+
* @returns Array of metric names
|
|
99
|
+
*/
|
|
100
|
+
export declare function getMetricNames(dataset: DatasetDefinition): string[];
|
|
101
|
+
/**
|
|
102
|
+
* Check if a dimension exists in a dataset
|
|
103
|
+
*
|
|
104
|
+
* @param dataset - Dataset definition
|
|
105
|
+
* @param dimensionName - Dimension name
|
|
106
|
+
* @returns True if dimension exists
|
|
107
|
+
*/
|
|
108
|
+
export declare function hasDimension(dataset: DatasetDefinition, dimensionName: string): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Check if a metric exists in a dataset
|
|
111
|
+
*
|
|
112
|
+
* @param dataset - Dataset definition
|
|
113
|
+
* @param metricName - Metric name
|
|
114
|
+
* @returns True if metric exists
|
|
115
|
+
*/
|
|
116
|
+
export declare function hasMetric(dataset: DatasetDefinition, metricName: string): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Get a dimension definition from a dataset
|
|
119
|
+
*
|
|
120
|
+
* @param dataset - Dataset definition
|
|
121
|
+
* @param dimensionName - Dimension name
|
|
122
|
+
* @returns Normalized dimension definition
|
|
123
|
+
* @throws Error if dimension not found
|
|
124
|
+
*/
|
|
125
|
+
export declare function getDimension(dataset: DatasetDefinition, dimensionName: string): DimensionDefinition;
|
|
126
|
+
/**
|
|
127
|
+
* Get a metric definition from a dataset
|
|
128
|
+
*
|
|
129
|
+
* @param dataset - Dataset definition
|
|
130
|
+
* @param metricName - Metric name
|
|
131
|
+
* @returns Metric definition
|
|
132
|
+
* @throws Error if metric not found
|
|
133
|
+
*/
|
|
134
|
+
export declare function getMetric(dataset: DatasetDefinition, metricName: string): import("./types.js").MetricDefinition;
|
|
135
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/dataset/definition.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAUhF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,iBAAiB,GAC5B,IAAI,CA8EN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAU5D;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,mBAAmB,CAqB5E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,aAAa,GACxB,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAQrC;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,CAGtE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAG5D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAC7B,GAAG,MAAM,CAET;AAMD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,GACX,iBAAiB,CAWnB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,EAAE,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAEnE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,iBAAiB,EAC1B,aAAa,EAAE,MAAM,GACpB,OAAO,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,iBAAiB,EAC1B,aAAa,EAAE,MAAM,GACpB,mBAAmB,CASrB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,yCAUnB"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataset Definition Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating and managing dataset definitions:
|
|
5
|
+
* - Dataset validation
|
|
6
|
+
* - Dimension/metric normalization
|
|
7
|
+
* - Type inference helpers
|
|
8
|
+
*/
|
|
9
|
+
import { isSQLExpression, toSQLString } from './sql-tag.js';
|
|
10
|
+
import { validateDimensionDefinition, validateMetricDefinition, } from './helpers.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// DATASET VALIDATION
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Validate a complete dataset definition
|
|
16
|
+
*
|
|
17
|
+
* @param name - Dataset name
|
|
18
|
+
* @param definition - Dataset definition
|
|
19
|
+
* @throws Error if validation fails
|
|
20
|
+
*/
|
|
21
|
+
export function validateDatasetDefinition(name, definition) {
|
|
22
|
+
// Validate required fields
|
|
23
|
+
if (!definition.name) {
|
|
24
|
+
throw new Error(`Dataset '${name}' is missing 'name' property.`);
|
|
25
|
+
}
|
|
26
|
+
if (!definition.description) {
|
|
27
|
+
console.warn(`⚠️ Dataset '${name}' is missing 'description'. ` +
|
|
28
|
+
`Descriptions help AI agents understand your data.`);
|
|
29
|
+
}
|
|
30
|
+
if (!definition.table) {
|
|
31
|
+
throw new Error(`Dataset '${name}' is missing 'table' property.`);
|
|
32
|
+
}
|
|
33
|
+
// Validate dimensions
|
|
34
|
+
if (!definition.dimensions || Object.keys(definition.dimensions).length === 0) {
|
|
35
|
+
throw new Error(`Dataset '${name}' must have at least one dimension. ` +
|
|
36
|
+
`Dimensions define the grouping keys for your data.`);
|
|
37
|
+
}
|
|
38
|
+
for (const [dimName, dimDef] of Object.entries(definition.dimensions)) {
|
|
39
|
+
validateDimensionDefinition(dimName, dimDef);
|
|
40
|
+
}
|
|
41
|
+
// Validate metrics
|
|
42
|
+
if (!definition.metrics || Object.keys(definition.metrics).length === 0) {
|
|
43
|
+
throw new Error(`Dataset '${name}' must have at least one metric. ` +
|
|
44
|
+
`Metrics define the aggregations for your data.`);
|
|
45
|
+
}
|
|
46
|
+
for (const [metricName, metricDef] of Object.entries(definition.metrics)) {
|
|
47
|
+
validateMetricDefinition(metricName, metricDef);
|
|
48
|
+
}
|
|
49
|
+
// Validate tenant config
|
|
50
|
+
if (definition.tenant) {
|
|
51
|
+
if (!definition.tenant.column) {
|
|
52
|
+
throw new Error(`Dataset '${name}' tenant config is missing 'column' property.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Validate limits
|
|
56
|
+
if (definition.limits) {
|
|
57
|
+
const limits = definition.limits;
|
|
58
|
+
if (limits.maxDimensions !== undefined && limits.maxDimensions < 1) {
|
|
59
|
+
throw new Error(`Dataset '${name}' limits.maxDimensions must be at least 1.`);
|
|
60
|
+
}
|
|
61
|
+
if (limits.maxMetrics !== undefined && limits.maxMetrics < 1) {
|
|
62
|
+
throw new Error(`Dataset '${name}' limits.maxMetrics must be at least 1.`);
|
|
63
|
+
}
|
|
64
|
+
if (limits.maxFilters !== undefined && limits.maxFilters < 0) {
|
|
65
|
+
throw new Error(`Dataset '${name}' limits.maxFilters must be non-negative.`);
|
|
66
|
+
}
|
|
67
|
+
if (limits.maxResultSize !== undefined && limits.maxResultSize < 1) {
|
|
68
|
+
throw new Error(`Dataset '${name}' limits.maxResultSize must be at least 1.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate all datasets in a datasets map
|
|
74
|
+
*
|
|
75
|
+
* @param datasets - Map of dataset definitions
|
|
76
|
+
* @throws Error if any dataset is invalid
|
|
77
|
+
*/
|
|
78
|
+
export function validateDatasets(datasets) {
|
|
79
|
+
if (!datasets || Object.keys(datasets).length === 0) {
|
|
80
|
+
throw new Error('No datasets defined. Please define at least one dataset.');
|
|
81
|
+
}
|
|
82
|
+
for (const [name, definition] of Object.entries(datasets)) {
|
|
83
|
+
validateDatasetDefinition(name, definition);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// =============================================================================
|
|
87
|
+
// DIMENSION NORMALIZATION
|
|
88
|
+
// =============================================================================
|
|
89
|
+
/**
|
|
90
|
+
* Normalize a dimension definition to full DimensionDefinition object
|
|
91
|
+
*
|
|
92
|
+
* @param dimension - Dimension definition (simple or complex)
|
|
93
|
+
* @returns Normalized DimensionDefinition
|
|
94
|
+
*/
|
|
95
|
+
export function normalizeDimension(dimension) {
|
|
96
|
+
// Simple string column reference
|
|
97
|
+
if (typeof dimension === 'string') {
|
|
98
|
+
return {
|
|
99
|
+
sql: dimension,
|
|
100
|
+
type: 'string', // Default type for simple columns
|
|
101
|
+
description: '', // Empty description (should be filled by user)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// SQLExpression
|
|
105
|
+
if (isSQLExpression(dimension)) {
|
|
106
|
+
return {
|
|
107
|
+
sql: dimension,
|
|
108
|
+
type: 'string', // Default type for SQL expressions
|
|
109
|
+
description: '', // Empty description (should be filled by user)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Already a full DimensionDefinition
|
|
113
|
+
return dimension;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Normalize all dimensions in a dimensions map
|
|
117
|
+
*
|
|
118
|
+
* @param dimensions - Map of dimension definitions
|
|
119
|
+
* @returns Map of normalized dimension definitions
|
|
120
|
+
*/
|
|
121
|
+
export function normalizeDimensions(dimensions) {
|
|
122
|
+
const normalized = {};
|
|
123
|
+
for (const [name, dimension] of Object.entries(dimensions)) {
|
|
124
|
+
normalized[name] = normalizeDimension(dimension);
|
|
125
|
+
}
|
|
126
|
+
return normalized;
|
|
127
|
+
}
|
|
128
|
+
// =============================================================================
|
|
129
|
+
// TYPE INFERENCE HELPERS
|
|
130
|
+
// =============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Infer the TypeScript type from a dimension definition
|
|
133
|
+
*
|
|
134
|
+
* @param dimension - Dimension definition
|
|
135
|
+
* @returns Inferred type name
|
|
136
|
+
*/
|
|
137
|
+
export function inferDimensionType(dimension) {
|
|
138
|
+
const normalized = normalizeDimension(dimension);
|
|
139
|
+
return normalized.type;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the SQL string from a dimension definition
|
|
143
|
+
*
|
|
144
|
+
* @param dimension - Dimension definition
|
|
145
|
+
* @returns SQL string
|
|
146
|
+
*/
|
|
147
|
+
export function getDimensionSQL(dimension) {
|
|
148
|
+
const normalized = normalizeDimension(dimension);
|
|
149
|
+
return toSQLString(normalized.sql);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get the SQL string from a metric definition
|
|
153
|
+
*
|
|
154
|
+
* @param metric - Metric definition
|
|
155
|
+
* @returns SQL string
|
|
156
|
+
*/
|
|
157
|
+
export function getMetricSQL(metric) {
|
|
158
|
+
return toSQLString(metric.sql);
|
|
159
|
+
}
|
|
160
|
+
// =============================================================================
|
|
161
|
+
// DATASET UTILITIES
|
|
162
|
+
// =============================================================================
|
|
163
|
+
/**
|
|
164
|
+
* Get a dataset definition by name
|
|
165
|
+
*
|
|
166
|
+
* @param datasets - Map of dataset definitions
|
|
167
|
+
* @param name - Dataset name
|
|
168
|
+
* @returns Dataset definition
|
|
169
|
+
* @throws Error if dataset not found
|
|
170
|
+
*/
|
|
171
|
+
export function getDataset(datasets, name) {
|
|
172
|
+
const dataset = datasets[name];
|
|
173
|
+
if (!dataset) {
|
|
174
|
+
throw new Error(`Dataset '${name}' not found. ` +
|
|
175
|
+
`Available datasets: ${Object.keys(datasets).join(', ')}`);
|
|
176
|
+
}
|
|
177
|
+
return dataset;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* List all dataset names
|
|
181
|
+
*
|
|
182
|
+
* @param datasets - Map of dataset definitions
|
|
183
|
+
* @returns Array of dataset names
|
|
184
|
+
*/
|
|
185
|
+
export function listDatasets(datasets) {
|
|
186
|
+
return Object.keys(datasets);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if a dataset exists
|
|
190
|
+
*
|
|
191
|
+
* @param datasets - Map of dataset definitions
|
|
192
|
+
* @param name - Dataset name
|
|
193
|
+
* @returns True if dataset exists
|
|
194
|
+
*/
|
|
195
|
+
export function hasDataset(datasets, name) {
|
|
196
|
+
return name in datasets;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get dimension names for a dataset
|
|
200
|
+
*
|
|
201
|
+
* @param dataset - Dataset definition
|
|
202
|
+
* @returns Array of dimension names
|
|
203
|
+
*/
|
|
204
|
+
export function getDimensionNames(dataset) {
|
|
205
|
+
return Object.keys(dataset.dimensions);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get metric names for a dataset
|
|
209
|
+
*
|
|
210
|
+
* @param dataset - Dataset definition
|
|
211
|
+
* @returns Array of metric names
|
|
212
|
+
*/
|
|
213
|
+
export function getMetricNames(dataset) {
|
|
214
|
+
return Object.keys(dataset.metrics);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if a dimension exists in a dataset
|
|
218
|
+
*
|
|
219
|
+
* @param dataset - Dataset definition
|
|
220
|
+
* @param dimensionName - Dimension name
|
|
221
|
+
* @returns True if dimension exists
|
|
222
|
+
*/
|
|
223
|
+
export function hasDimension(dataset, dimensionName) {
|
|
224
|
+
return dimensionName in dataset.dimensions;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Check if a metric exists in a dataset
|
|
228
|
+
*
|
|
229
|
+
* @param dataset - Dataset definition
|
|
230
|
+
* @param metricName - Metric name
|
|
231
|
+
* @returns True if metric exists
|
|
232
|
+
*/
|
|
233
|
+
export function hasMetric(dataset, metricName) {
|
|
234
|
+
return metricName in dataset.metrics;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get a dimension definition from a dataset
|
|
238
|
+
*
|
|
239
|
+
* @param dataset - Dataset definition
|
|
240
|
+
* @param dimensionName - Dimension name
|
|
241
|
+
* @returns Normalized dimension definition
|
|
242
|
+
* @throws Error if dimension not found
|
|
243
|
+
*/
|
|
244
|
+
export function getDimension(dataset, dimensionName) {
|
|
245
|
+
if (!hasDimension(dataset, dimensionName)) {
|
|
246
|
+
throw new Error(`Dimension '${dimensionName}' not found in dataset '${dataset.name}'. ` +
|
|
247
|
+
`Available dimensions: ${getDimensionNames(dataset).join(', ')}`);
|
|
248
|
+
}
|
|
249
|
+
return normalizeDimension(dataset.dimensions[dimensionName]);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get a metric definition from a dataset
|
|
253
|
+
*
|
|
254
|
+
* @param dataset - Dataset definition
|
|
255
|
+
* @param metricName - Metric name
|
|
256
|
+
* @returns Metric definition
|
|
257
|
+
* @throws Error if metric not found
|
|
258
|
+
*/
|
|
259
|
+
export function getMetric(dataset, metricName) {
|
|
260
|
+
if (!hasMetric(dataset, metricName)) {
|
|
261
|
+
throw new Error(`Metric '${metricName}' not found in dataset '${dataset.name}'. ` +
|
|
262
|
+
`Available metrics: ${getMetricNames(dataset).join(', ')}`);
|
|
263
|
+
}
|
|
264
|
+
return dataset.metrics[metricName];
|
|
265
|
+
}
|