@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
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Dataset Helper Functions
3
+ *
4
+ * Provides declarative helper functions for defining dimensions and metrics:
5
+ * - dimension.string(), dimension.number(), dimension.date(), dimension.boolean()
6
+ * - metric.count(), metric.sum(), metric.avg(), metric.min(), metric.max(), metric.countDistinct(), metric.custom()
7
+ */
8
+ import type { DimensionDefinition, MetricDefinition, MetricFormat } from './types.js';
9
+ import { type SQLExpression } from './sql-tag.js';
10
+ /**
11
+ * Options for dimension helpers
12
+ */
13
+ export interface DimensionOptions {
14
+ /** Human-readable description (for AI agents) */
15
+ description: string;
16
+ /** Example values (for AI context) */
17
+ examples?: string[];
18
+ /** Join name (if dimension requires a join) */
19
+ join?: string;
20
+ }
21
+ /**
22
+ * Dimension helper namespace
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * dimensions: {
27
+ * region: dimension.string('region', {
28
+ * description: 'Geographic region',
29
+ * examples: ['US', 'EU', 'APAC']
30
+ * }),
31
+ * orderDate: dimension.date(sql`DATE(created_at)`, {
32
+ * description: 'Order date'
33
+ * }),
34
+ * amount: dimension.number('amount', {
35
+ * description: 'Order amount'
36
+ * })
37
+ * }
38
+ * ```
39
+ */
40
+ export declare const dimension: {
41
+ /**
42
+ * Create a string dimension
43
+ */
44
+ string: (columnOrExpression: string | SQLExpression, options: DimensionOptions) => DimensionDefinition;
45
+ /**
46
+ * Create a number dimension
47
+ */
48
+ number: (columnOrExpression: string | SQLExpression, options: DimensionOptions) => DimensionDefinition;
49
+ /**
50
+ * Create a date dimension
51
+ */
52
+ date: (columnOrExpression: string | SQLExpression, options: DimensionOptions) => DimensionDefinition;
53
+ /**
54
+ * Create a boolean dimension
55
+ */
56
+ boolean: (columnOrExpression: string | SQLExpression, options: DimensionOptions) => DimensionDefinition;
57
+ };
58
+ /**
59
+ * Options for metric helpers
60
+ */
61
+ export interface MetricOptions {
62
+ /** Human-readable description (for AI agents) */
63
+ description: string;
64
+ /** Format hint for display */
65
+ format?: MetricFormat;
66
+ /** Join name (if metric requires a join) */
67
+ join?: string;
68
+ /** Allow fan-out (for oneToMany joins) - advanced use only */
69
+ allowFanout?: boolean;
70
+ }
71
+ /**
72
+ * Metric helper namespace
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * metrics: {
77
+ * revenue: metric.sum('amount', {
78
+ * description: 'Total revenue',
79
+ * format: 'currency'
80
+ * }),
81
+ * orderCount: metric.count({
82
+ * description: 'Total number of orders'
83
+ * }),
84
+ * avgOrderValue: metric.avg('total_amount', {
85
+ * description: 'Average order value',
86
+ * format: 'currency'
87
+ * }),
88
+ * revenuePerCustomer: metric.custom(
89
+ * sql`sum(total_amount) / count(DISTINCT customer_id)`,
90
+ * {
91
+ * description: 'Average revenue per customer',
92
+ * format: 'currency'
93
+ * }
94
+ * )
95
+ * }
96
+ * ```
97
+ */
98
+ export declare const metric: {
99
+ /**
100
+ * Create a COUNT(*) metric
101
+ */
102
+ count: (options: MetricOptions) => MetricDefinition;
103
+ /**
104
+ * Create a SUM() metric
105
+ */
106
+ sum: (columnOrExpression: string | SQLExpression, options: MetricOptions) => MetricDefinition;
107
+ /**
108
+ * Create an AVG() metric
109
+ */
110
+ avg: (columnOrExpression: string | SQLExpression, options: MetricOptions) => MetricDefinition;
111
+ /**
112
+ * Create a MIN() metric
113
+ */
114
+ min: (columnOrExpression: string | SQLExpression, options: MetricOptions) => MetricDefinition;
115
+ /**
116
+ * Create a MAX() metric
117
+ */
118
+ max: (columnOrExpression: string | SQLExpression, options: MetricOptions) => MetricDefinition;
119
+ /**
120
+ * Create a COUNT(DISTINCT) metric
121
+ */
122
+ countDistinct: (columnOrExpression: string | SQLExpression, options: MetricOptions) => MetricDefinition;
123
+ /**
124
+ * Create a custom metric with a SQL expression
125
+ */
126
+ custom: (columnOrExpression: string | SQLExpression, options: MetricOptions) => MetricDefinition;
127
+ };
128
+ /**
129
+ * Validate that a dimension definition has required metadata
130
+ */
131
+ export declare function validateDimensionDefinition(name: string, definition: unknown): void;
132
+ /**
133
+ * Validate that a metric definition has required metadata
134
+ */
135
+ export declare function validateMetricDefinition(name: string, definition: unknown): void;
136
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/dataset/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,gBAAgB,EAEhB,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,SAAS;IACpB;;OAEG;iCAnCmB,MAAM,GAAG,aAAa,WACjC,gBAAgB,KACxB,mBAAmB;IAoCtB;;OAEG;iCAxCmB,MAAM,GAAG,aAAa,WACjC,gBAAgB,KACxB,mBAAmB;IAyCtB;;OAEG;+BA7CmB,MAAM,GAAG,aAAa,WACjC,gBAAgB,KACxB,mBAAmB;IA8CtB;;OAEG;kCAlDmB,MAAM,GAAG,aAAa,WACjC,gBAAgB,KACxB,mBAAmB;CAkDvB,CAAC;AAMF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,MAAM;IACjB;;OAEG;qBACc,aAAa,KAAG,gBAAgB;IAWjD;;OAEG;8BA1DmB,MAAM,GAAG,aAAa,WACjC,aAAa,KACrB,gBAAgB;IA2DnB;;OAEG;8BA/DmB,MAAM,GAAG,aAAa,WACjC,aAAa,KACrB,gBAAgB;IAgEnB;;OAEG;8BApEmB,MAAM,GAAG,aAAa,WACjC,aAAa,KACrB,gBAAgB;IAqEnB;;OAEG;8BAzEmB,MAAM,GAAG,aAAa,WACjC,aAAa,KACrB,gBAAgB;IA0EnB;;OAEG;wCA9EmB,MAAM,GAAG,aAAa,WACjC,aAAa,KACrB,gBAAgB;IA+EnB;;OAEG;iCAnFmB,MAAM,GAAG,aAAa,WACjC,aAAa,KACrB,gBAAgB;CAmFpB,CAAC;AAMF;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,OAAO,GAClB,IAAI,CA8BN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,OAAO,GAClB,IAAI,CA8BN"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Dataset Helper Functions
3
+ *
4
+ * Provides declarative helper functions for defining dimensions and metrics:
5
+ * - dimension.string(), dimension.number(), dimension.date(), dimension.boolean()
6
+ * - metric.count(), metric.sum(), metric.avg(), metric.min(), metric.max(), metric.countDistinct(), metric.custom()
7
+ */
8
+ import { sql } from './sql-tag.js';
9
+ /**
10
+ * Create a dimension definition helper
11
+ */
12
+ function createDimensionHelper(type) {
13
+ return (columnOrExpression, options) => {
14
+ return {
15
+ sql: columnOrExpression,
16
+ type,
17
+ description: options.description,
18
+ examples: options.examples,
19
+ join: options.join,
20
+ };
21
+ };
22
+ }
23
+ /**
24
+ * Dimension helper namespace
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * dimensions: {
29
+ * region: dimension.string('region', {
30
+ * description: 'Geographic region',
31
+ * examples: ['US', 'EU', 'APAC']
32
+ * }),
33
+ * orderDate: dimension.date(sql`DATE(created_at)`, {
34
+ * description: 'Order date'
35
+ * }),
36
+ * amount: dimension.number('amount', {
37
+ * description: 'Order amount'
38
+ * })
39
+ * }
40
+ * ```
41
+ */
42
+ export const dimension = {
43
+ /**
44
+ * Create a string dimension
45
+ */
46
+ string: createDimensionHelper('string'),
47
+ /**
48
+ * Create a number dimension
49
+ */
50
+ number: createDimensionHelper('number'),
51
+ /**
52
+ * Create a date dimension
53
+ */
54
+ date: createDimensionHelper('date'),
55
+ /**
56
+ * Create a boolean dimension
57
+ */
58
+ boolean: createDimensionHelper('boolean'),
59
+ };
60
+ /**
61
+ * Create a metric definition helper
62
+ */
63
+ function createMetricHelper(type) {
64
+ return (columnOrExpression, options) => {
65
+ return {
66
+ type,
67
+ sql: columnOrExpression,
68
+ description: options.description,
69
+ format: options.format,
70
+ join: options.join,
71
+ allowFanout: options.allowFanout,
72
+ };
73
+ };
74
+ }
75
+ /**
76
+ * Metric helper namespace
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * metrics: {
81
+ * revenue: metric.sum('amount', {
82
+ * description: 'Total revenue',
83
+ * format: 'currency'
84
+ * }),
85
+ * orderCount: metric.count({
86
+ * description: 'Total number of orders'
87
+ * }),
88
+ * avgOrderValue: metric.avg('total_amount', {
89
+ * description: 'Average order value',
90
+ * format: 'currency'
91
+ * }),
92
+ * revenuePerCustomer: metric.custom(
93
+ * sql`sum(total_amount) / count(DISTINCT customer_id)`,
94
+ * {
95
+ * description: 'Average revenue per customer',
96
+ * format: 'currency'
97
+ * }
98
+ * )
99
+ * }
100
+ * ```
101
+ */
102
+ export const metric = {
103
+ /**
104
+ * Create a COUNT(*) metric
105
+ */
106
+ count: (options) => {
107
+ return {
108
+ type: 'count',
109
+ sql: sql `*`,
110
+ description: options.description,
111
+ format: options.format,
112
+ join: options.join,
113
+ allowFanout: options.allowFanout,
114
+ };
115
+ },
116
+ /**
117
+ * Create a SUM() metric
118
+ */
119
+ sum: createMetricHelper('sum'),
120
+ /**
121
+ * Create an AVG() metric
122
+ */
123
+ avg: createMetricHelper('avg'),
124
+ /**
125
+ * Create a MIN() metric
126
+ */
127
+ min: createMetricHelper('min'),
128
+ /**
129
+ * Create a MAX() metric
130
+ */
131
+ max: createMetricHelper('max'),
132
+ /**
133
+ * Create a COUNT(DISTINCT) metric
134
+ */
135
+ countDistinct: createMetricHelper('countDistinct'),
136
+ /**
137
+ * Create a custom metric with a SQL expression
138
+ */
139
+ custom: createMetricHelper('custom'),
140
+ };
141
+ // =============================================================================
142
+ // VALIDATION HELPERS
143
+ // =============================================================================
144
+ /**
145
+ * Validate that a dimension definition has required metadata
146
+ */
147
+ export function validateDimensionDefinition(name, definition) {
148
+ if (typeof definition === 'string') {
149
+ // Simple column reference - no validation needed
150
+ return;
151
+ }
152
+ if (typeof definition === 'object' && definition !== null) {
153
+ const def = definition;
154
+ if (!def.sql) {
155
+ throw new Error(`Dimension '${name}' is missing 'sql' property. ` +
156
+ `Expected a column name (string) or SQLExpression.`);
157
+ }
158
+ if (!def.type) {
159
+ throw new Error(`Dimension '${name}' is missing 'type' property. ` +
160
+ `Expected: 'string', 'number', 'date', or 'boolean'.`);
161
+ }
162
+ if (!def.description) {
163
+ console.warn(`⚠️ Dimension '${name}' is missing 'description'. ` +
164
+ `Descriptions help AI agents understand your data.`);
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * Validate that a metric definition has required metadata
170
+ */
171
+ export function validateMetricDefinition(name, definition) {
172
+ if (typeof definition !== 'object' || definition === null) {
173
+ throw new Error(`Metric '${name}' must be a MetricDefinition object. ` +
174
+ `Use metric.sum(), metric.count(), etc. helpers.`);
175
+ }
176
+ const def = definition;
177
+ if (!def.type) {
178
+ throw new Error(`Metric '${name}' is missing 'type' property. ` +
179
+ `Expected: 'count', 'sum', 'avg', 'min', 'max', 'countDistinct', or 'custom'.`);
180
+ }
181
+ if (!def.sql) {
182
+ throw new Error(`Metric '${name}' is missing 'sql' property. ` +
183
+ `Expected a column name (string) or SQLExpression.`);
184
+ }
185
+ if (!def.description) {
186
+ console.warn(`⚠️ Metric '${name}' is missing 'description'. ` +
187
+ `Descriptions help AI agents understand your metrics.`);
188
+ }
189
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Dataset API Module
3
+ *
4
+ * Provides a declarative API for defining dynamic datasets with:
5
+ * - Type-safe dimension and metric definitions
6
+ * - SQL expression support via tagged templates
7
+ * - Helper functions for common patterns
8
+ * - Introspection for AI agents
9
+ * - Full TypeScript type inference
10
+ *
11
+ * @module @hypequery/clickhouse/dataset
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { sql, dimension, metric } from '@hypequery/clickhouse/dataset';
16
+ *
17
+ * const datasets = {
18
+ * orders: {
19
+ * name: 'orders',
20
+ * description: 'Customer orders and revenue data',
21
+ * table: 'orders',
22
+ * dimensions: {
23
+ * region: dimension.string('region', {
24
+ * description: 'Geographic region',
25
+ * examples: ['US', 'EU', 'APAC']
26
+ * }),
27
+ * date: dimension.date(sql`DATE(created_at)`, {
28
+ * description: 'Order date'
29
+ * })
30
+ * },
31
+ * metrics: {
32
+ * revenue: metric.sum('amount', {
33
+ * description: 'Total revenue',
34
+ * format: 'currency'
35
+ * }),
36
+ * orderCount: metric.count({
37
+ * description: 'Number of orders'
38
+ * })
39
+ * }
40
+ * }
41
+ * };
42
+ * ```
43
+ */
44
+ export { sql, isSQLExpression, toSQLString } from './sql-tag.js';
45
+ export type { SQLExpression } from './sql-tag.js';
46
+ export type { DimensionType, SimpleDimension, DimensionDefinition, Dimension, DimensionsMap, MetricAggregationType, MetricFormat, MetricDefinition, MetricsMap, DatasetDefinition, DatasetsMap, TenantConfig, DatasetLimits, FilterOperator, DateRangeValue, FilterValue, FilterDefinition, Filters, SortDirection, OrderByDimension, OrderByMetric, OrderBy, CacheOptions, DatasetQuery, QueryContext, QueryResultMetadata, QueryResult, InferDimensionType, InferMetricType, InferQueryRowType, InferQueryResult, IntrospectedDimension, IntrospectedMetric, IntrospectedDataset, } from './types.js';
47
+ export { dimension, metric } from './helpers.js';
48
+ export type { DimensionOptions, MetricOptions } from './helpers.js';
49
+ export { validateDatasetDefinition, validateDatasets, normalizeDimension, normalizeDimensions, inferDimensionType, getDimensionSQL, getMetricSQL, getDataset, listDatasets, hasDataset, getDimensionNames, getMetricNames, hasDimension, hasMetric, getDimension, getMetric, } from './definition.js';
50
+ export { introspectDimension, introspectMetric, getDatasetSchema, listDatasets as listDatasetSchemas, getAllDatasetSchemas, summarizeDataset, datasetsToJSON, summarizeAllDatasets, } from './introspection.js';
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dataset/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAMH,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD,YAAY,EAEV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,aAAa,EAGb,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EAGV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EAGb,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EAGP,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,OAAO,EAGP,YAAY,EAGZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,WAAW,EAGX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAGhB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMpE,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAS,GACV,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,IAAI,kBAAkB,EAClC,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Dataset API Module
3
+ *
4
+ * Provides a declarative API for defining dynamic datasets with:
5
+ * - Type-safe dimension and metric definitions
6
+ * - SQL expression support via tagged templates
7
+ * - Helper functions for common patterns
8
+ * - Introspection for AI agents
9
+ * - Full TypeScript type inference
10
+ *
11
+ * @module @hypequery/clickhouse/dataset
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { sql, dimension, metric } from '@hypequery/clickhouse/dataset';
16
+ *
17
+ * const datasets = {
18
+ * orders: {
19
+ * name: 'orders',
20
+ * description: 'Customer orders and revenue data',
21
+ * table: 'orders',
22
+ * dimensions: {
23
+ * region: dimension.string('region', {
24
+ * description: 'Geographic region',
25
+ * examples: ['US', 'EU', 'APAC']
26
+ * }),
27
+ * date: dimension.date(sql`DATE(created_at)`, {
28
+ * description: 'Order date'
29
+ * })
30
+ * },
31
+ * metrics: {
32
+ * revenue: metric.sum('amount', {
33
+ * description: 'Total revenue',
34
+ * format: 'currency'
35
+ * }),
36
+ * orderCount: metric.count({
37
+ * description: 'Number of orders'
38
+ * })
39
+ * }
40
+ * }
41
+ * };
42
+ * ```
43
+ */
44
+ // =============================================================================
45
+ // SQL TAGGED TEMPLATE
46
+ // =============================================================================
47
+ export { sql, isSQLExpression, toSQLString } from './sql-tag.js';
48
+ // =============================================================================
49
+ // HELPERS
50
+ // =============================================================================
51
+ export { dimension, metric } from './helpers.js';
52
+ // =============================================================================
53
+ // DEFINITION UTILITIES
54
+ // =============================================================================
55
+ export { validateDatasetDefinition, validateDatasets, normalizeDimension, normalizeDimensions, inferDimensionType, getDimensionSQL, getMetricSQL, getDataset, listDatasets, hasDataset, getDimensionNames, getMetricNames, hasDimension, hasMetric, getDimension, getMetric, } from './definition.js';
56
+ // =============================================================================
57
+ // INTROSPECTION
58
+ // =============================================================================
59
+ export { introspectDimension, introspectMetric, getDatasetSchema, listDatasets as listDatasetSchemas, getAllDatasetSchemas, summarizeDataset, datasetsToJSON, summarizeAllDatasets, } from './introspection.js';
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Dataset Introspection API
3
+ *
4
+ * Provides introspection capabilities for datasets, enabling AI agents
5
+ * and other tools to understand the structure and metadata of datasets.
6
+ *
7
+ * Key functions:
8
+ * - getDatasetSchema(): Get full schema for a dataset
9
+ * - listDatasets(): List all available datasets
10
+ * - introspectDimension(): Get metadata for a specific dimension
11
+ * - introspectMetric(): Get metadata for a specific metric
12
+ */
13
+ import type { DatasetDefinition, DatasetsMap, IntrospectedDataset, IntrospectedDimension, IntrospectedMetric } from './types.js';
14
+ /**
15
+ * Introspect a dimension definition to extract metadata
16
+ *
17
+ * @param dimension - Dimension definition (any format)
18
+ * @returns Introspected dimension metadata
19
+ */
20
+ export declare function introspectDimension(dimension: DatasetDefinition['dimensions'][string]): IntrospectedDimension;
21
+ /**
22
+ * Introspect a metric definition to extract metadata
23
+ *
24
+ * @param metric - Metric definition
25
+ * @returns Introspected metric metadata
26
+ */
27
+ export declare function introspectMetric(metric: DatasetDefinition['metrics'][string]): IntrospectedMetric;
28
+ /**
29
+ * Get the complete schema for a dataset (for AI agents)
30
+ *
31
+ * @param datasets - Map of all dataset definitions
32
+ * @param datasetName - Name of the dataset to introspect
33
+ * @returns Introspected dataset schema
34
+ * @throws Error if dataset not found
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const schema = getDatasetSchema(datasets, 'orders');
39
+ * console.log(schema.dimensions.region.description);
40
+ * console.log(schema.metrics.revenue.format);
41
+ * ```
42
+ */
43
+ export declare function getDatasetSchema(datasets: DatasetsMap, datasetName: string): IntrospectedDataset;
44
+ /**
45
+ * List all available datasets
46
+ *
47
+ * @param datasets - Map of all dataset definitions
48
+ * @returns Array of dataset names
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const allDatasets = listDatasets(datasets);
53
+ * // ['orders', 'customers', 'products']
54
+ * ```
55
+ */
56
+ export declare function listDatasets(datasets: DatasetsMap): string[];
57
+ /**
58
+ * Get introspected schemas for all datasets
59
+ *
60
+ * @param datasets - Map of all dataset definitions
61
+ * @returns Map of dataset names to introspected schemas
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const allSchemas = getAllDatasetSchemas(datasets);
66
+ * for (const [name, schema] of Object.entries(allSchemas)) {
67
+ * console.log(`Dataset: ${name}`);
68
+ * console.log(`Description: ${schema.description}`);
69
+ * }
70
+ * ```
71
+ */
72
+ export declare function getAllDatasetSchemas(datasets: DatasetsMap): Record<string, IntrospectedDataset>;
73
+ /**
74
+ * Generate a human-readable summary of a dataset (for LLMs)
75
+ *
76
+ * @param datasets - Map of all dataset definitions
77
+ * @param datasetName - Name of the dataset to summarize
78
+ * @returns Markdown-formatted summary
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const summary = summarizeDataset(datasets, 'orders');
83
+ * console.log(summary);
84
+ * // # Dataset: orders
85
+ * // Customer orders and revenue data
86
+ * //
87
+ * // ## Dimensions
88
+ * // - region (string): Geographic region
89
+ * // Examples: US, EU, APAC
90
+ * // ...
91
+ * ```
92
+ */
93
+ export declare function summarizeDataset(datasets: DatasetsMap, datasetName: string): string;
94
+ /**
95
+ * Generate a JSON representation of all datasets (for AI context)
96
+ *
97
+ * @param datasets - Map of all dataset definitions
98
+ * @returns JSON string with all dataset schemas
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const json = datasetsToJSON(datasets);
103
+ * // Send to LLM as context for query generation
104
+ * ```
105
+ */
106
+ export declare function datasetsToJSON(datasets: DatasetsMap): string;
107
+ /**
108
+ * Get a concise summary of all datasets (for LLM context)
109
+ *
110
+ * @param datasets - Map of all dataset definitions
111
+ * @returns Array of dataset summaries
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const summaries = summarizeAllDatasets(datasets);
116
+ * // [
117
+ * // {
118
+ * // name: 'orders',
119
+ * // description: 'Customer orders and revenue data',
120
+ * // dimensionCount: 5,
121
+ * // metricCount: 4
122
+ * // },
123
+ * // ...
124
+ * // ]
125
+ * ```
126
+ */
127
+ export declare function summarizeAllDatasets(datasets: DatasetsMap): Array<{
128
+ name: string;
129
+ description: string;
130
+ dimensionCount: number;
131
+ metricCount: number;
132
+ }>;
133
+ //# sourceMappingURL=introspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.d.ts","sourceRoot":"","sources":["../../src/dataset/introspection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAapB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GACjD,qBAAqB,CASvB;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAC3C,kBAAkB,CAQpB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAwBrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,EAAE,CAE5D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,GACpB,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAQrC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CA0DR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,GACpB,KAAK,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAUD"}