@duckcodeailabs/dql-cli 0.8.8 → 0.8.10

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.
@@ -1,278 +1,95 @@
1
- import { afterEach, describe, expect, it } from 'vitest';
2
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- import { loadSemanticLayerFromDir } from '@duckcodeailabs/dql-core';
6
- import { buildSemanticObjectDetail, buildSemanticTree, loadSemanticImportManifest, performSemanticImport, syncSemanticImport, } from './semantic-import.js';
7
- const tempDirs = [];
8
- afterEach(() => {
9
- while (tempDirs.length > 0) {
10
- const dir = tempDirs.pop();
11
- if (dir)
12
- rmSync(dir, { recursive: true, force: true });
13
- }
14
- });
15
- describe('semantic import workflow', () => {
16
- it('imports dbt semantics into canonical local YAML and builds tree/detail views', async () => {
17
- const projectRoot = createTempProject();
18
- const sourceRoot = join(projectRoot, 'dbt-source');
19
- mkdirSync(join(sourceRoot, 'models', 'marts'), { recursive: true });
20
- writeFileSync(join(sourceRoot, 'models', 'marts', 'orders.yml'), [
21
- 'semantic_models:',
22
- ' - name: orders',
23
- ' model: ref("stg_orders")',
24
- ' defaults:',
25
- ' agg_time_dimension: ordered_at',
26
- ' entities:',
27
- ' - name: customer',
28
- ' type: foreign',
29
- ' expr: customer_id',
30
- ' dimensions:',
31
- ' - name: ordered_at',
32
- ' type: time',
33
- ' - name: order_status',
34
- ' type: categorical',
35
- ' expr: status',
36
- ' measures:',
37
- ' - name: revenue',
38
- ' agg: sum',
39
- ' expr: amount',
40
- ' description: Revenue measure',
41
- 'metrics:',
42
- ' - name: total_revenue',
43
- ' label: Total Revenue',
44
- ' description: Revenue metric',
45
- ' type: simple',
46
- ' type_params:',
47
- ' measure: revenue',
48
- '',
49
- ].join('\n'));
50
- const result = await performSemanticImport({
51
- targetProjectRoot: projectRoot,
52
- provider: 'dbt',
53
- sourceConfig: {
54
- provider: 'dbt',
55
- projectPath: 'dbt-source',
56
- },
57
- });
58
- expect(result.counts.cube).toBe(1);
59
- expect(result.counts.metric).toBe(2);
60
- expect(result.counts.dimension).toBe(2);
61
- expect(result.manifest.generatedFiles).toContain('semantic-layer/imports/manifest.json');
62
- expect(result.manifest.warnings).toContain('No dbt hierarchies were imported; dbt semantic models were normalized into cubes, measures, dimensions, and joins.');
63
- const config = JSON.parse(readFileSync(join(projectRoot, 'dql.config.json'), 'utf-8'));
64
- expect(config.semanticLayer).toEqual({ provider: 'dql', path: './semantic-layer' });
65
- const importedLayer = loadSemanticLayerFromDir(join(projectRoot, 'semantic-layer'));
66
- const manifest = loadSemanticImportManifest(projectRoot);
67
- const tree = buildSemanticTree(importedLayer, manifest);
68
- const metricDetail = buildSemanticObjectDetail(importedLayer, manifest, 'metric:total_revenue');
69
- const cubeDetail = buildSemanticObjectDetail(importedLayer, manifest, 'cube:orders');
70
- expect(tree.label).toBe('dbt import');
71
- expect(tree.children?.map((child) => child.id)).toContain('domain:uncategorized');
72
- expect(metricDetail?.source?.provider).toBe('dbt');
73
- expect(metricDetail?.filePath).toBe('semantic-layer/metrics/uncategorized/total_revenue.yaml');
74
- expect(cubeDetail?.joins?.map((join) => join.right)).toContain('customer');
75
- });
76
- it('syncs the last import using the manifest source settings', async () => {
77
- const projectRoot = createTempProject();
78
- const sourceRoot = join(projectRoot, 'dbt-source');
79
- mkdirSync(join(sourceRoot, 'models', 'marts'), { recursive: true });
80
- const sourceFile = join(sourceRoot, 'models', 'marts', 'orders.yml');
81
- writeFileSync(sourceFile, [
82
- 'semantic_models:',
83
- ' - name: orders',
84
- ' model: ref("stg_orders")',
85
- ' dimensions:',
86
- ' - name: ordered_at',
87
- ' type: time',
88
- ' measures:',
89
- ' - name: revenue',
90
- ' agg: sum',
91
- ' expr: amount',
92
- 'metrics:',
93
- ' - name: total_revenue',
94
- ' type: simple',
95
- ' type_params:',
96
- ' measure: revenue',
97
- '',
98
- ].join('\n'));
99
- await performSemanticImport({
100
- targetProjectRoot: projectRoot,
101
- provider: 'dbt',
102
- sourceConfig: {
103
- provider: 'dbt',
104
- projectPath: 'dbt-source',
105
- },
1
+ import { describe, expect, it } from 'vitest';
2
+ import { SemanticLayer } from '@duckcodeailabs/dql-core';
3
+ import { buildSemanticTree } from './semantic-import.js';
4
+ describe('buildSemanticTree', () => {
5
+ it('creates unique group ids for repeated labels across cubes and domains', () => {
6
+ const layer = new SemanticLayer();
7
+ layer.addCube({
8
+ name: 'customers',
9
+ label: 'Customers',
10
+ description: 'Customers cube',
11
+ domain: 'uncategorized',
12
+ table: 'customers',
13
+ sql: 'SELECT * FROM customers',
14
+ tags: [],
15
+ measures: [
16
+ {
17
+ name: 'lifetime_spend',
18
+ label: 'Lifetime Spend',
19
+ description: 'Lifetime spend',
20
+ domain: 'uncategorized',
21
+ sql: 'SUM(lifetime_spend)',
22
+ type: 'sum',
23
+ table: 'customers',
24
+ tags: [],
25
+ },
26
+ ],
27
+ dimensions: [
28
+ {
29
+ name: 'customer_type',
30
+ label: 'Customer Type',
31
+ description: 'Customer type',
32
+ domain: 'uncategorized',
33
+ sql: 'customer_type',
34
+ type: 'string',
35
+ table: 'customers',
36
+ tags: [],
37
+ },
38
+ ],
39
+ timeDimensions: [],
40
+ joins: [],
41
+ segments: [],
42
+ preAggregations: [],
106
43
  });
107
- writeFileSync(sourceFile, [
108
- 'semantic_models:',
109
- ' - name: orders',
110
- ' model: ref("stg_orders")',
111
- ' dimensions:',
112
- ' - name: ordered_at',
113
- ' type: time',
114
- ' measures:',
115
- ' - name: revenue',
116
- ' agg: sum',
117
- ' expr: amount',
118
- 'metrics:',
119
- ' - name: total_revenue',
120
- ' label: Total Revenue',
121
- ' type: simple',
122
- ' type_params:',
123
- ' measure: revenue',
124
- ' - name: total_revenue_duplicate',
125
- ' label: Total Revenue Duplicate',
126
- ' type: simple',
127
- ' type_params:',
128
- ' measure: revenue',
129
- '',
130
- ].join('\n'));
131
- const synced = await syncSemanticImport({ targetProjectRoot: projectRoot });
132
- const importedLayer = loadSemanticLayerFromDir(join(projectRoot, 'semantic-layer'));
133
- expect(synced.counts.metric).toBe(3);
134
- expect(importedLayer.getMetric('total_revenue_duplicate')).toBeDefined();
135
- expect(loadSemanticImportManifest(projectRoot)?.source.projectPath).toBe('dbt-source');
136
- });
137
- it('imports cubejs cubes including joins, segments, and pre-aggregations', async () => {
138
- const projectRoot = createTempProject();
139
- const sourceRoot = join(projectRoot, 'cube-source');
140
- mkdirSync(join(sourceRoot, 'model'), { recursive: true });
141
- writeFileSync(join(sourceRoot, 'model', 'commerce.yml'), [
142
- 'cubes:',
143
- ' - name: orders',
144
- ' sql_table: analytics.orders',
145
- ' title: Orders',
146
- ' description: Orders cube',
147
- ' measures:',
148
- ' - name: revenue',
149
- ' type: sum',
150
- ' sql: amount',
151
- ' title: Revenue',
152
- ' - name: order_count',
153
- ' type: count',
154
- ' sql: id',
155
- ' dimensions:',
156
- ' - name: status',
157
- ' type: string',
158
- ' sql: status',
159
- ' title: Status',
160
- ' - name: created_at',
161
- ' type: time',
162
- ' sql: created_at',
163
- ' title: Created At',
164
- ' joins:',
165
- ' - name: customers',
166
- ' relationship: many_to_one',
167
- ' sql: ${CUBE}.customer_id = ${customers}.id',
168
- ' segments:',
169
- ' - name: completed_orders',
170
- " sql: \"{CUBE}.status = 'completed'\"",
171
- ' title: Completed Orders',
172
- ' pre_aggregations:',
173
- ' - name: revenue_by_day',
174
- ' measures:',
175
- ' - revenue',
176
- ' dimensions:',
177
- ' - status',
178
- ' time_dimension: created_at',
179
- ' granularity: day',
180
- ' refresh_key: every 1 hour',
181
- ' title: Revenue By Day',
182
- ' - name: customers',
183
- ' sql_table: analytics.customers',
184
- ' title: Customers',
185
- ' dimensions:',
186
- ' - name: country',
187
- ' type: string',
188
- ' sql: country',
189
- ' title: Country',
190
- '',
191
- ].join('\n'));
192
- const result = await performSemanticImport({
193
- targetProjectRoot: projectRoot,
194
- provider: 'cubejs',
195
- sourceConfig: {
196
- provider: 'cubejs',
197
- projectPath: 'cube-source',
198
- },
44
+ layer.addCube({
45
+ name: 'orders',
46
+ label: 'Orders',
47
+ description: 'Orders cube',
48
+ domain: 'uncategorized',
49
+ table: 'orders',
50
+ sql: 'SELECT * FROM orders',
51
+ tags: [],
52
+ measures: [
53
+ {
54
+ name: 'order_total',
55
+ label: 'Order Total',
56
+ description: 'Order total',
57
+ domain: 'uncategorized',
58
+ sql: 'SUM(order_total)',
59
+ type: 'sum',
60
+ table: 'orders',
61
+ tags: [],
62
+ },
63
+ ],
64
+ dimensions: [
65
+ {
66
+ name: 'ordered_at',
67
+ label: 'Ordered At',
68
+ description: 'Ordered at',
69
+ domain: 'uncategorized',
70
+ sql: 'ordered_at',
71
+ type: 'date',
72
+ table: 'orders',
73
+ tags: [],
74
+ },
75
+ ],
76
+ timeDimensions: [],
77
+ joins: [],
78
+ segments: [],
79
+ preAggregations: [],
199
80
  });
200
- const importedLayer = loadSemanticLayerFromDir(join(projectRoot, 'semantic-layer'));
201
- const manifest = loadSemanticImportManifest(projectRoot);
202
- const tree = buildSemanticTree(importedLayer, manifest);
203
- const segmentDetail = buildSemanticObjectDetail(importedLayer, manifest, 'segment:completed_orders');
204
- const preAggregationDetail = buildSemanticObjectDetail(importedLayer, manifest, 'pre_aggregation:revenue_by_day');
205
- expect(result.counts.cube).toBe(2);
206
- expect(result.counts.segment).toBe(1);
207
- expect(result.counts.pre_aggregation).toBe(1);
208
- expect(importedLayer.getCube('orders')?.joins.map((join) => join.right)).toContain('customers');
209
- expect(segmentDetail?.cube).toBe('orders');
210
- expect(segmentDetail?.source?.provider).toBe('cubejs');
211
- expect(preAggregationDetail?.timeDimension).toBe('created_at');
212
- expect(preAggregationDetail?.refreshKey).toBe('every 1 hour');
213
- expect(tree.children?.[0]?.children?.some((node) => node.kind === 'cube')).toBe(true);
214
- });
215
- it('imports snowflake semantic views with relationships using the shared manifest workflow', async () => {
216
- const projectRoot = createTempProject();
217
- const executeQuery = async (sql) => {
218
- if (sql.startsWith('SHOW SEMANTIC VIEWS')) {
219
- return {
220
- rows: [
221
- { NAME: 'ORDERS_SV', DATABASE_NAME: 'ANALYTICS', SCHEMA_NAME: 'SALES' },
222
- ],
223
- };
224
- }
225
- if (sql.includes('DESC SEMANTIC VIEW "ANALYTICS"."SALES"."ORDERS_SV"')) {
226
- return {
227
- rows: [
228
- { NAME: 'TOTAL_REVENUE', TYPE: 'NUMBER', SEMANTIC_ROLE: 'MEASURE', EXPRESSION: 'SUM(amount)', COMMENT: 'Revenue metric' },
229
- { NAME: 'ORDER_DATE', TYPE: 'DATE', SEMANTIC_ROLE: 'DIMENSION', COMMENT: 'Order date' },
230
- ],
231
- };
232
- }
233
- if (sql.includes(`INFORMATION_SCHEMA.SEMANTIC_VIEW_RELATIONSHIPS('"ANALYTICS"."SALES"."ORDERS_SV"')`)) {
234
- return {
235
- rows: [
236
- {
237
- LEFT_TABLE: 'ANALYTICS.SALES.ORDERS_SV',
238
- RIGHT_TABLE: 'ANALYTICS.SALES.CUSTOMERS_SV',
239
- JOIN_TYPE: 'LEFT',
240
- JOIN_CONDITION: 'ORDERS_SV.CUSTOMER_ID = CUSTOMERS_SV.ID',
241
- },
242
- ],
243
- };
244
- }
245
- throw new Error(`Unexpected SQL: ${sql}`);
81
+ const tree = buildSemanticTree(layer, null);
82
+ const groupIds = [];
83
+ const visit = (node) => {
84
+ if (node.kind === 'group')
85
+ groupIds.push(node.id);
86
+ for (const child of node.children ?? [])
87
+ visit(child);
246
88
  };
247
- const result = await performSemanticImport({
248
- targetProjectRoot: projectRoot,
249
- provider: 'snowflake',
250
- sourceConfig: {
251
- provider: 'snowflake',
252
- projectPath: 'ANALYTICS',
253
- connection: 'default',
254
- },
255
- executeQuery,
256
- });
257
- const importedLayer = loadSemanticLayerFromDir(join(projectRoot, 'semantic-layer'));
258
- const manifest = loadSemanticImportManifest(projectRoot);
259
- const metricDetail = buildSemanticObjectDetail(importedLayer, manifest, 'metric:ORDERS_SV.TOTAL_REVENUE');
260
- const cubeDetail = buildSemanticObjectDetail(importedLayer, manifest, 'cube:ORDERS_SV');
261
- const tree = buildSemanticTree(importedLayer, manifest);
262
- expect(result.counts.metric).toBe(1);
263
- expect(result.counts.dimension).toBe(1);
264
- expect(result.counts.cube).toBe(2);
265
- expect(manifest?.source.connection).toBe('default');
266
- expect(metricDetail?.source?.provider).toBe('snowflake');
267
- expect(metricDetail?.domain).toBe('SALES');
268
- expect(cubeDetail?.joins?.map((join) => join.right)).toContain('CUSTOMERS_SV');
269
- expect(tree.label).toBe('snowflake import');
89
+ visit(tree);
90
+ expect(new Set(groupIds).size).toBe(groupIds.length);
91
+ expect(groupIds.some((id) => id.includes('cube:customers'))).toBe(true);
92
+ expect(groupIds.some((id) => id.includes('cube:orders'))).toBe(true);
270
93
  });
271
94
  });
272
- function createTempProject() {
273
- const projectRoot = mkdtempSync(join(tmpdir(), 'dql-semantic-import-'));
274
- tempDirs.push(projectRoot);
275
- writeFileSync(join(projectRoot, 'dql.config.json'), JSON.stringify({ project: 'test-project' }, null, 2) + '\n');
276
- return projectRoot;
277
- }
278
95
  //# sourceMappingURL=semantic-import.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-import.test.js","sourceRoot":"","sources":["../src/semantic-import.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantic-import.test.js","sourceRoot":"","sources":["../src/semantic-import.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,19 +1,12 @@
1
1
  {
2
2
  "name": "@duckcodeailabs/dql-cli",
3
- "version": "0.8.8",
3
+ "version": "0.8.10",
4
4
  "description": "Public CLI for parsing, formatting, testing, and certifying DQL blocks",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "dql": "./dist/index.js"
9
9
  },
10
- "scripts": {
11
- "build": "rm -rf dist tsconfig.tsbuildinfo && tsc -b && node ./scripts/copy-runtime-assets.mjs",
12
- "dev": "tsx src/index.ts",
13
- "test": "vitest run --passWithNoTests",
14
- "clean": "rm -rf dist tsconfig.tsbuildinfo",
15
- "prepublishOnly": "pnpm run build"
16
- },
17
10
  "publishConfig": {
18
11
  "access": "public"
19
12
  },
@@ -26,20 +19,26 @@
26
19
  "directory": "apps/cli"
27
20
  },
28
21
  "dependencies": {
29
- "@duckcodeailabs/dql-connectors": "workspace:*",
30
- "@duckcodeailabs/dql-core": "workspace:*",
31
- "@duckcodeailabs/dql-compiler": "workspace:*",
32
- "@duckcodeailabs/dql-project": "workspace:*",
33
- "@duckcodeailabs/dql-governance": "workspace:*",
34
- "@duckcodeailabs/dql-notebook": "workspace:*"
22
+ "@duckcodeailabs/dql-connectors": "^0.8.10",
23
+ "@duckcodeailabs/dql-core": "^0.8.10",
24
+ "@duckcodeailabs/dql-compiler": "^0.8.10",
25
+ "@duckcodeailabs/dql-project": "^0.8.10",
26
+ "@duckcodeailabs/dql-governance": "^0.8.10",
27
+ "@duckcodeailabs/dql-notebook": "^0.8.10"
35
28
  },
36
29
  "devDependencies": {
37
- "@duckcodeailabs/dql-notebook-app": "workspace:*",
38
30
  "typescript": "^5.7.0",
39
31
  "tsx": "^4.19.0",
40
- "vitest": "^3.0.0"
32
+ "vitest": "^3.0.0",
33
+ "@duckcodeailabs/dql-notebook-app": "0.8.10"
41
34
  },
42
35
  "engines": {
43
36
  "node": ">=18.0.0"
37
+ },
38
+ "scripts": {
39
+ "build": "rm -rf dist tsconfig.tsbuildinfo && tsc -b && node ./scripts/copy-runtime-assets.mjs",
40
+ "dev": "tsx src/index.ts",
41
+ "test": "vitest run --passWithNoTests",
42
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
44
43
  }
45
- }
44
+ }