@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.
Files changed (118) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +19 -14
  3. package/dist/cli/generate-types.js +5 -12
  4. package/dist/core/adapters/clickhouse-adapter.d.ts +14 -0
  5. package/dist/core/adapters/clickhouse-adapter.d.ts.map +1 -0
  6. package/dist/core/adapters/clickhouse-adapter.js +58 -0
  7. package/dist/core/adapters/database-adapter.d.ts +13 -0
  8. package/dist/core/adapters/database-adapter.d.ts.map +1 -0
  9. package/dist/core/adapters/database-adapter.js +1 -0
  10. package/dist/core/cache/cache-manager.d.ts.map +1 -1
  11. package/dist/core/cache/cache-manager.js +6 -5
  12. package/dist/core/dialects/clickhouse-dialect.d.ts +10 -0
  13. package/dist/core/dialects/clickhouse-dialect.d.ts.map +1 -0
  14. package/dist/core/dialects/clickhouse-dialect.js +47 -0
  15. package/dist/core/dialects/sql-dialect.d.ts +11 -0
  16. package/dist/core/dialects/sql-dialect.d.ts.map +1 -0
  17. package/dist/core/dialects/sql-dialect.js +1 -0
  18. package/dist/core/features/aggregations.d.ts +5 -5
  19. package/dist/core/features/analytics.d.ts +822 -4
  20. package/dist/core/features/analytics.d.ts.map +1 -1
  21. package/dist/core/features/analytics.js +15 -9
  22. package/dist/core/features/executor.d.ts.map +1 -1
  23. package/dist/core/features/executor.js +26 -53
  24. package/dist/core/features/filtering.d.ts +5 -5
  25. package/dist/core/features/joins.d.ts +1 -1
  26. package/dist/core/features/query-modifiers.d.ts +6 -6
  27. package/dist/core/query-builder.d.ts +20 -7
  28. package/dist/core/query-builder.d.ts.map +1 -1
  29. package/dist/core/query-builder.js +45 -32
  30. package/dist/core/tests/integration/setup.d.ts +3 -1
  31. package/dist/core/tests/integration/setup.d.ts.map +1 -1
  32. package/dist/core/tests/test-utils.d.ts.map +1 -1
  33. package/dist/core/tests/test-utils.js +16 -4
  34. package/dist/core/types/builder-state.d.ts +7 -5
  35. package/dist/core/types/builder-state.d.ts.map +1 -1
  36. package/dist/core/types/select-types.d.ts +4 -3
  37. package/dist/core/types/select-types.d.ts.map +1 -1
  38. package/dist/core/utils/predicate-builder.d.ts +4 -0
  39. package/dist/core/utils/predicate-builder.d.ts.map +1 -1
  40. package/dist/core/utils/predicate-builder.js +4 -1
  41. package/dist/core/utils/streaming-helpers.d.ts.map +1 -1
  42. package/dist/core/utils/streaming-helpers.js +8 -0
  43. package/dist/core/utils.d.ts.map +1 -1
  44. package/dist/core/utils.js +3 -0
  45. package/dist/dataset/definition.d.ts +135 -0
  46. package/dist/dataset/definition.d.ts.map +1 -0
  47. package/dist/dataset/definition.js +265 -0
  48. package/dist/dataset/helpers.d.ts +136 -0
  49. package/dist/dataset/helpers.d.ts.map +1 -0
  50. package/dist/dataset/helpers.js +189 -0
  51. package/dist/dataset/index.d.ts +51 -0
  52. package/dist/dataset/index.d.ts.map +1 -0
  53. package/dist/dataset/index.js +59 -0
  54. package/dist/dataset/introspection.d.ts +133 -0
  55. package/dist/dataset/introspection.d.ts.map +1 -0
  56. package/dist/dataset/introspection.js +239 -0
  57. package/dist/dataset/sql-tag.d.ts +51 -0
  58. package/dist/dataset/sql-tag.d.ts.map +1 -0
  59. package/dist/dataset/sql-tag.js +86 -0
  60. package/dist/dataset/types.d.ts +300 -0
  61. package/dist/dataset/types.d.ts.map +1 -0
  62. package/dist/dataset/types.js +11 -0
  63. package/dist/index.d.ts +21 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +25 -15
  66. package/dist/migrations/config/index.d.ts +3 -0
  67. package/dist/migrations/config/index.d.ts.map +1 -0
  68. package/dist/migrations/config/index.js +1 -0
  69. package/dist/migrations/config/types.d.ts +45 -0
  70. package/dist/migrations/config/types.d.ts.map +1 -0
  71. package/dist/migrations/config/types.js +28 -0
  72. package/dist/migrations/diff/diff.d.ts +11 -0
  73. package/dist/migrations/diff/diff.d.ts.map +1 -0
  74. package/dist/migrations/diff/diff.js +240 -0
  75. package/dist/migrations/diff/index.d.ts +3 -0
  76. package/dist/migrations/diff/index.d.ts.map +1 -0
  77. package/dist/migrations/diff/index.js +1 -0
  78. package/dist/migrations/diff/types.d.ts +74 -0
  79. package/dist/migrations/diff/types.d.ts.map +1 -0
  80. package/dist/migrations/diff/types.js +1 -0
  81. package/dist/migrations/schema/column.d.ts +71 -0
  82. package/dist/migrations/schema/column.d.ts.map +1 -0
  83. package/dist/migrations/schema/column.js +123 -0
  84. package/dist/migrations/schema/define.d.ts +24 -0
  85. package/dist/migrations/schema/define.d.ts.map +1 -0
  86. package/dist/migrations/schema/define.js +47 -0
  87. package/dist/migrations/schema/index.d.ts +4 -0
  88. package/dist/migrations/schema/index.d.ts.map +1 -0
  89. package/dist/migrations/schema/index.js +2 -0
  90. package/dist/migrations/schema/types.d.ts +74 -0
  91. package/dist/migrations/schema/types.d.ts.map +1 -0
  92. package/dist/migrations/schema/types.js +1 -0
  93. package/dist/migrations/snapshot/index.d.ts +3 -0
  94. package/dist/migrations/snapshot/index.d.ts.map +1 -0
  95. package/dist/migrations/snapshot/index.js +1 -0
  96. package/dist/migrations/snapshot/serialize.d.ts +21 -0
  97. package/dist/migrations/snapshot/serialize.d.ts.map +1 -0
  98. package/dist/migrations/snapshot/serialize.js +127 -0
  99. package/dist/migrations/snapshot/types.d.ts +47 -0
  100. package/dist/migrations/snapshot/types.d.ts.map +1 -0
  101. package/dist/migrations/snapshot/types.js +1 -0
  102. package/dist/migrations/sql/index.d.ts +4 -0
  103. package/dist/migrations/sql/index.d.ts.map +1 -0
  104. package/dist/migrations/sql/index.js +2 -0
  105. package/dist/migrations/sql/render.d.ts +11 -0
  106. package/dist/migrations/sql/render.d.ts.map +1 -0
  107. package/dist/migrations/sql/render.js +334 -0
  108. package/dist/migrations/sql/types.d.ts +48 -0
  109. package/dist/migrations/sql/types.d.ts.map +1 -0
  110. package/dist/migrations/sql/types.js +1 -0
  111. package/dist/migrations/sql/write.d.ts +9 -0
  112. package/dist/migrations/sql/write.d.ts.map +1 -0
  113. package/dist/migrations/sql/write.js +31 -0
  114. package/dist/types/base.d.ts +2 -1
  115. package/dist/types/base.d.ts.map +1 -1
  116. package/dist/types/clickhouse-types.d.ts +3 -1
  117. package/dist/types/clickhouse-types.d.ts.map +1 -1
  118. 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,IACxD;IACF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpE,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,eAAe,IAAI,QAAQ,CAAC;KAC3D,CAAC,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAC7D,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GACjC,KAAK;CACR,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,CACrB,KAAK,SAAS,eAAe,EAC7B,KAAK,SAAS,MAAM,KAAK,CAAC,QAAQ,CAAC,IACjC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAE7H,MAAM,MAAM,YAAY,CACtB,KAAK,SAAS,eAAe,EAC7B,MAAM,IACJ,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAEjG,MAAM,MAAM,YAAY,CACtB,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,EACvC,KAAK,SAAS,MAAM,MAAM,IACxB,YAAY,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,sBAAsB,CAAC,KAAK,SAAS,eAAe,IAC9D,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,QAAQ,CAAC,GACpC,KAAK,CAAC,QAAQ,CAAC,SAAS,OAAO,CAAC,KAAK,CAAC,GACtC,KAAK,GACL,IAAI,GACJ,IAAI,CAAC;AAET,MAAM,MAAM,cAAc,CACxB,KAAK,SAAS,eAAe,EAC7B,KAAK,IACH,YAAY,CACd,KAAK,EACL,sBAAsB,CAAC,KAAK,CAAC,SAAS,IAAI,GACxC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GACjC,QAAQ,CAAC,KAAK,CAAC,CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,CAClB,KAAK,SAAS,eAAe,EAC7B,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,MAAM,KAAK,CAAC,QAAQ,CAAC,IACjC,YAAY,CACd,KAAK,CAAC,QAAQ,CAAC,EACf,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,EACvB,KAAK,CAAC,QAAQ,CAAC,EACf,KAAK,CAAC,WAAW,CAAC,EAClB,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAC5B,KAAK,SAAS,eAAe,EAC7B,KAAK,SAAS,MAAM,IAClB,KAAK,SAAS,MAAM,KAAK,CAAC,QAAQ,CAAC,GACnC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GACtB,KAAK,SAAS,MAAM,KAAK,CAAC,SAAS,CAAC,GACpC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GACxC,KAAK,CAAC"}
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 SelectableColumn<State extends AnyBuilderState> = OutputColumnKeys<State> | BaseColumnKeys<State> | QualifiedColumnKeys<State>;
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":"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"}
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;CACtE;AA4GD,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,eAAe,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAY/F"}
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":"AAoIA,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAwCnH"}
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();
@@ -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,CAavE"}
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"}
@@ -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
+ }