@duckcodeailabs/dql-core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/semantic/index.d.ts +4 -0
- package/dist/semantic/index.d.ts.map +1 -1
- package/dist/semantic/index.js +2 -0
- package/dist/semantic/index.js.map +1 -1
- package/dist/semantic/providers/cubejs-provider.d.ts +11 -0
- package/dist/semantic/providers/cubejs-provider.d.ts.map +1 -0
- package/dist/semantic/providers/cubejs-provider.js +190 -0
- package/dist/semantic/providers/cubejs-provider.js.map +1 -0
- package/dist/semantic/providers/dbt-provider.d.ts +12 -0
- package/dist/semantic/providers/dbt-provider.d.ts.map +1 -0
- package/dist/semantic/providers/dbt-provider.js +233 -0
- package/dist/semantic/providers/dbt-provider.js.map +1 -0
- package/dist/semantic/providers/dql-provider.d.ts +11 -0
- package/dist/semantic/providers/dql-provider.d.ts.map +1 -0
- package/dist/semantic/providers/dql-provider.js +16 -0
- package/dist/semantic/providers/dql-provider.js.map +1 -0
- package/dist/semantic/providers/index.d.ts +3 -0
- package/dist/semantic/providers/index.d.ts.map +1 -0
- package/dist/semantic/providers/index.js +2 -0
- package/dist/semantic/providers/index.js.map +1 -0
- package/dist/semantic/providers/provider.d.ts +14 -0
- package/dist/semantic/providers/provider.d.ts.map +1 -0
- package/dist/semantic/providers/provider.js +2 -0
- package/dist/semantic/providers/provider.js.map +1 -0
- package/dist/semantic/providers/registry.d.ts +15 -0
- package/dist/semantic/providers/registry.d.ts.map +1 -0
- package/dist/semantic/providers/registry.js +51 -0
- package/dist/semantic/providers/registry.js.map +1 -0
- package/dist/semantic/semantic-layer.d.ts +5 -0
- package/dist/semantic/semantic-layer.d.ts.map +1 -1
- package/dist/semantic/semantic-layer.js +8 -14
- package/dist/semantic/semantic-layer.js.map +1 -1
- package/dist/semantic/sql-dialect.d.ts +37 -0
- package/dist/semantic/sql-dialect.d.ts.map +1 -0
- package/dist/semantic/sql-dialect.js +350 -0
- package/dist/semantic/sql-dialect.js.map +1 -0
- package/package.json +1 -1
package/dist/semantic/index.d.ts
CHANGED
|
@@ -2,4 +2,8 @@ export { SemanticAnalyzer, analyze } from './analyzer.js';
|
|
|
2
2
|
export { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseBlockCompanionDefinition, parseCubeDefinition, } from './semantic-layer.js';
|
|
3
3
|
export type { MetricDefinition, DimensionDefinition, HierarchyDefinition, BlockCompanionDefinition, HierarchyLevelDefinition, HierarchyDrillPathDefinition, HierarchyRollupType, SemanticLayerConfig, JoinDefinition, TimeDimensionDefinition, CubeDefinition, ComposeQueryOptions, ComposeQueryResult, } from './semantic-layer.js';
|
|
4
4
|
export { loadSemanticLayerFromDir, loadSemanticLayerFromConfig, } from './yaml-loader.js';
|
|
5
|
+
export { resolveSemanticLayer } from './providers/index.js';
|
|
6
|
+
export type { SemanticLayerProviderConfig } from './providers/index.js';
|
|
7
|
+
export { getDialect, listDialectDrivers } from './sql-dialect.js';
|
|
8
|
+
export type { SQLDialect } from './sql-dialect.js';
|
|
5
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/semantic/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { SemanticAnalyzer, analyze } from './analyzer.js';
|
|
2
2
|
export { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseBlockCompanionDefinition, parseCubeDefinition, } from './semantic-layer.js';
|
|
3
3
|
export { loadSemanticLayerFromDir, loadSemanticLayerFromConfig, } from './yaml-loader.js';
|
|
4
|
+
export { resolveSemanticLayer } from './providers/index.js';
|
|
5
|
+
export { getDialect, listDialectDrivers } from './sql-dialect.js';
|
|
4
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAgB7B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAgB7B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cube.js semantic layer provider.
|
|
3
|
+
* Reads Cube.js YAML schema format and maps cubes to DQL SemanticLayer definitions.
|
|
4
|
+
*/
|
|
5
|
+
import { SemanticLayer } from '../semantic-layer.js';
|
|
6
|
+
import type { SemanticLayerProvider, SemanticLayerProviderConfig } from './provider.js';
|
|
7
|
+
export declare class CubejsProvider implements SemanticLayerProvider {
|
|
8
|
+
readonly name = "cubejs";
|
|
9
|
+
load(config: SemanticLayerProviderConfig, projectRoot: string): SemanticLayer;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=cubejs-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cubejs-provider.d.ts","sourceRoot":"","sources":["../../../src/semantic/providers/cubejs-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACL,aAAa,EAMd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAkExF,qBAAa,cAAe,YAAW,qBAAqB;IAC1D,QAAQ,CAAC,IAAI,YAAY;IAEzB,IAAI,CAAC,MAAM,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;CAyC9E"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cube.js semantic layer provider.
|
|
3
|
+
* Reads Cube.js YAML schema format and maps cubes to DQL SemanticLayer definitions.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
|
|
6
|
+
import { join, extname } from 'node:path';
|
|
7
|
+
import * as yaml from 'js-yaml';
|
|
8
|
+
import { SemanticLayer, } from '../semantic-layer.js';
|
|
9
|
+
/** Map Cube.js measure types to DQL metric types. */
|
|
10
|
+
const MEASURE_TYPE_MAP = {
|
|
11
|
+
count: 'count',
|
|
12
|
+
count_distinct: 'count_distinct',
|
|
13
|
+
countDistinct: 'count_distinct',
|
|
14
|
+
sum: 'sum',
|
|
15
|
+
avg: 'avg',
|
|
16
|
+
min: 'min',
|
|
17
|
+
max: 'max',
|
|
18
|
+
number: 'custom',
|
|
19
|
+
};
|
|
20
|
+
/** Map Cube.js dimension types to DQL dimension types. */
|
|
21
|
+
const DIM_TYPE_MAP = {
|
|
22
|
+
string: 'string',
|
|
23
|
+
number: 'number',
|
|
24
|
+
boolean: 'boolean',
|
|
25
|
+
time: 'date',
|
|
26
|
+
geo: 'string',
|
|
27
|
+
};
|
|
28
|
+
/** Map Cube.js relationship types to DQL join types. */
|
|
29
|
+
const JOIN_TYPE_MAP = {
|
|
30
|
+
one_to_one: 'inner',
|
|
31
|
+
one_to_many: 'left',
|
|
32
|
+
many_to_one: 'left',
|
|
33
|
+
many_to_many: 'full',
|
|
34
|
+
// Also support camelCase variants
|
|
35
|
+
oneToOne: 'inner',
|
|
36
|
+
oneToMany: 'left',
|
|
37
|
+
manyToOne: 'left',
|
|
38
|
+
manyToMany: 'full',
|
|
39
|
+
};
|
|
40
|
+
export class CubejsProvider {
|
|
41
|
+
name = 'cubejs';
|
|
42
|
+
load(config, projectRoot) {
|
|
43
|
+
const layer = new SemanticLayer();
|
|
44
|
+
const cubeRoot = config.projectPath
|
|
45
|
+
? join(projectRoot, config.projectPath)
|
|
46
|
+
: projectRoot;
|
|
47
|
+
// Cube.js stores schemas in model/ or schema/ directory
|
|
48
|
+
let schemaDir;
|
|
49
|
+
for (const candidate of ['model', 'schema']) {
|
|
50
|
+
const candidatePath = join(cubeRoot, candidate);
|
|
51
|
+
if (existsSync(candidatePath)) {
|
|
52
|
+
schemaDir = candidatePath;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!schemaDir)
|
|
57
|
+
return layer;
|
|
58
|
+
const yamlFiles = collectYamlFiles(schemaDir);
|
|
59
|
+
for (const filePath of yamlFiles) {
|
|
60
|
+
try {
|
|
61
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
62
|
+
const doc = yaml.load(content);
|
|
63
|
+
if (!doc || typeof doc !== 'object')
|
|
64
|
+
continue;
|
|
65
|
+
if (Array.isArray(doc.cubes)) {
|
|
66
|
+
for (const rawCube of doc.cubes) {
|
|
67
|
+
if (rawCube && typeof rawCube === 'object') {
|
|
68
|
+
const cube = convertCube(rawCube);
|
|
69
|
+
layer.addCube(cube);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Skip malformed YAML files
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return layer;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Recursively collect all .yml/.yaml files in a directory. */
|
|
82
|
+
function collectYamlFiles(dir) {
|
|
83
|
+
const results = [];
|
|
84
|
+
if (!existsSync(dir))
|
|
85
|
+
return results;
|
|
86
|
+
for (const entry of readdirSync(dir)) {
|
|
87
|
+
const fullPath = join(dir, entry);
|
|
88
|
+
try {
|
|
89
|
+
const stat = statSync(fullPath);
|
|
90
|
+
if (stat.isDirectory()) {
|
|
91
|
+
results.push(...collectYamlFiles(fullPath));
|
|
92
|
+
}
|
|
93
|
+
else if (stat.isFile()) {
|
|
94
|
+
const ext = extname(entry).toLowerCase();
|
|
95
|
+
if (ext === '.yml' || ext === '.yaml') {
|
|
96
|
+
results.push(fullPath);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Skip inaccessible entries
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return results;
|
|
105
|
+
}
|
|
106
|
+
/** Convert a Cube.js cube definition to a DQL CubeDefinition. */
|
|
107
|
+
function convertCube(raw) {
|
|
108
|
+
const cubeName = raw.name;
|
|
109
|
+
const tableName = raw.sql_table ?? raw.sqlTable ?? cubeName;
|
|
110
|
+
const measures = (raw.measures ?? []).map((m) => {
|
|
111
|
+
const aggType = MEASURE_TYPE_MAP[m.type] ?? 'custom';
|
|
112
|
+
const sqlExpr = m.sql ?? m.name;
|
|
113
|
+
return {
|
|
114
|
+
name: m.name,
|
|
115
|
+
label: m.title ?? m.name,
|
|
116
|
+
description: m.description ?? '',
|
|
117
|
+
domain: '',
|
|
118
|
+
sql: buildAggSql(aggType, sqlExpr),
|
|
119
|
+
type: aggType,
|
|
120
|
+
table: tableName,
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
const dimensions = [];
|
|
124
|
+
const timeDimensions = [];
|
|
125
|
+
for (const dim of raw.dimensions ?? []) {
|
|
126
|
+
const dqlType = DIM_TYPE_MAP[dim.type] ?? 'string';
|
|
127
|
+
const sqlExpr = dim.sql ?? dim.name;
|
|
128
|
+
if (dim.type === 'time') {
|
|
129
|
+
timeDimensions.push({
|
|
130
|
+
name: dim.name,
|
|
131
|
+
label: dim.title ?? dim.name,
|
|
132
|
+
description: dim.description ?? '',
|
|
133
|
+
sql: sqlExpr,
|
|
134
|
+
type: 'date',
|
|
135
|
+
table: tableName,
|
|
136
|
+
granularities: ['day', 'week', 'month', 'quarter', 'year'],
|
|
137
|
+
primaryTime: Boolean(dim.primary_key ?? dim.primaryKey),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
dimensions.push({
|
|
142
|
+
name: dim.name,
|
|
143
|
+
label: dim.title ?? dim.name,
|
|
144
|
+
description: dim.description ?? '',
|
|
145
|
+
sql: sqlExpr,
|
|
146
|
+
type: dqlType,
|
|
147
|
+
table: tableName,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Convert joins, replacing Cube.js template variables
|
|
152
|
+
const joins = (raw.joins ?? []).map((j) => {
|
|
153
|
+
// Replace {CUBE} with the current cube name and {OtherCube} with the join target
|
|
154
|
+
let resolvedSql = j.sql
|
|
155
|
+
.replace(/\{CUBE\}/g, tableName)
|
|
156
|
+
.replace(new RegExp(`\\{${j.name}\\}`, 'g'), j.name);
|
|
157
|
+
return {
|
|
158
|
+
name: j.name,
|
|
159
|
+
left: cubeName,
|
|
160
|
+
right: j.name,
|
|
161
|
+
type: JOIN_TYPE_MAP[j.relationship] ?? 'left',
|
|
162
|
+
sql: resolvedSql,
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
name: cubeName,
|
|
167
|
+
label: raw.title ?? cubeName,
|
|
168
|
+
description: raw.description ?? '',
|
|
169
|
+
sql: raw.sql ?? `SELECT * FROM ${tableName}`,
|
|
170
|
+
table: tableName,
|
|
171
|
+
domain: '',
|
|
172
|
+
measures,
|
|
173
|
+
dimensions,
|
|
174
|
+
timeDimensions,
|
|
175
|
+
joins,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/** Build an aggregate SQL expression. */
|
|
179
|
+
function buildAggSql(aggType, expr) {
|
|
180
|
+
switch (aggType) {
|
|
181
|
+
case 'sum': return `SUM(${expr})`;
|
|
182
|
+
case 'count': return `COUNT(${expr})`;
|
|
183
|
+
case 'count_distinct': return `COUNT(DISTINCT ${expr})`;
|
|
184
|
+
case 'avg': return `AVG(${expr})`;
|
|
185
|
+
case 'min': return `MIN(${expr})`;
|
|
186
|
+
case 'max': return `MAX(${expr})`;
|
|
187
|
+
default: return expr;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=cubejs-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cubejs-provider.js","sourceRoot":"","sources":["../../../src/semantic/providers/cubejs-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dbt semantic layer provider.
|
|
3
|
+
* Reads dbt's native YAML format (semantic_models + metrics) and maps
|
|
4
|
+
* them to DQL SemanticLayer definitions.
|
|
5
|
+
*/
|
|
6
|
+
import { SemanticLayer } from '../semantic-layer.js';
|
|
7
|
+
import type { SemanticLayerProvider, SemanticLayerProviderConfig } from './provider.js';
|
|
8
|
+
export declare class DbtProvider implements SemanticLayerProvider {
|
|
9
|
+
readonly name = "dbt";
|
|
10
|
+
load(config: SemanticLayerProviderConfig, projectRoot: string): SemanticLayer;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=dbt-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbt-provider.d.ts","sourceRoot":"","sources":["../../../src/semantic/providers/dbt-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EACL,aAAa,EAMd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAuDxF,qBAAa,WAAY,YAAW,qBAAqB;IACvD,QAAQ,CAAC,IAAI,SAAS;IAEtB,IAAI,CAAC,MAAM,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;CAyE9E"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dbt semantic layer provider.
|
|
3
|
+
* Reads dbt's native YAML format (semantic_models + metrics) and maps
|
|
4
|
+
* them to DQL SemanticLayer definitions.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
|
|
7
|
+
import { join, extname } from 'node:path';
|
|
8
|
+
import * as yaml from 'js-yaml';
|
|
9
|
+
import { SemanticLayer, } from '../semantic-layer.js';
|
|
10
|
+
/** Map dbt aggregation types to DQL metric types. */
|
|
11
|
+
const AGG_TYPE_MAP = {
|
|
12
|
+
sum: 'sum',
|
|
13
|
+
count: 'count',
|
|
14
|
+
count_distinct: 'count_distinct',
|
|
15
|
+
average: 'avg',
|
|
16
|
+
avg: 'avg',
|
|
17
|
+
min: 'min',
|
|
18
|
+
max: 'max',
|
|
19
|
+
};
|
|
20
|
+
/** Map dbt dimension types to DQL dimension types. */
|
|
21
|
+
const DIM_TYPE_MAP = {
|
|
22
|
+
categorical: 'string',
|
|
23
|
+
time: 'date',
|
|
24
|
+
boolean: 'boolean',
|
|
25
|
+
number: 'number',
|
|
26
|
+
};
|
|
27
|
+
export class DbtProvider {
|
|
28
|
+
name = 'dbt';
|
|
29
|
+
load(config, projectRoot) {
|
|
30
|
+
const layer = new SemanticLayer();
|
|
31
|
+
const dbtRoot = config.projectPath
|
|
32
|
+
? join(projectRoot, config.projectPath)
|
|
33
|
+
: projectRoot;
|
|
34
|
+
const modelsDir = join(dbtRoot, 'models');
|
|
35
|
+
if (!existsSync(modelsDir))
|
|
36
|
+
return layer;
|
|
37
|
+
// Collect all YAML files recursively
|
|
38
|
+
const yamlFiles = collectYamlFiles(modelsDir);
|
|
39
|
+
// First pass: collect all semantic models so we can resolve measure references
|
|
40
|
+
const allModels = [];
|
|
41
|
+
const allDbtMetrics = [];
|
|
42
|
+
for (const filePath of yamlFiles) {
|
|
43
|
+
try {
|
|
44
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
45
|
+
const doc = yaml.load(content);
|
|
46
|
+
if (!doc || typeof doc !== 'object')
|
|
47
|
+
continue;
|
|
48
|
+
if (Array.isArray(doc.semantic_models)) {
|
|
49
|
+
for (const model of doc.semantic_models) {
|
|
50
|
+
if (model && typeof model === 'object') {
|
|
51
|
+
allModels.push(model);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(doc.metrics)) {
|
|
56
|
+
for (const metric of doc.metrics) {
|
|
57
|
+
if (metric && typeof metric === 'object') {
|
|
58
|
+
allDbtMetrics.push(metric);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Skip malformed YAML files
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Build a measure lookup: measure_name -> { sql, agg, model_name }
|
|
68
|
+
const measureLookup = new Map();
|
|
69
|
+
for (const model of allModels) {
|
|
70
|
+
const tableName = resolveTableName(model);
|
|
71
|
+
for (const measure of model.measures ?? []) {
|
|
72
|
+
measureLookup.set(measure.name, {
|
|
73
|
+
sql: measure.expr ?? measure.name,
|
|
74
|
+
agg: measure.agg,
|
|
75
|
+
modelName: model.name,
|
|
76
|
+
table: tableName,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Convert each semantic model into a DQL CubeDefinition
|
|
81
|
+
for (const model of allModels) {
|
|
82
|
+
const cube = convertSemanticModel(model);
|
|
83
|
+
layer.addCube(cube);
|
|
84
|
+
}
|
|
85
|
+
// Convert dbt metrics (resolve measure references)
|
|
86
|
+
for (const dbtMetric of allDbtMetrics) {
|
|
87
|
+
const metric = convertDbtMetric(dbtMetric, measureLookup);
|
|
88
|
+
if (metric) {
|
|
89
|
+
layer.addMetric(metric);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return layer;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Recursively collect all .yml/.yaml files in a directory. */
|
|
96
|
+
function collectYamlFiles(dir) {
|
|
97
|
+
const results = [];
|
|
98
|
+
if (!existsSync(dir))
|
|
99
|
+
return results;
|
|
100
|
+
for (const entry of readdirSync(dir)) {
|
|
101
|
+
const fullPath = join(dir, entry);
|
|
102
|
+
try {
|
|
103
|
+
const stat = statSync(fullPath);
|
|
104
|
+
if (stat.isDirectory()) {
|
|
105
|
+
results.push(...collectYamlFiles(fullPath));
|
|
106
|
+
}
|
|
107
|
+
else if (stat.isFile()) {
|
|
108
|
+
const ext = extname(entry).toLowerCase();
|
|
109
|
+
if (ext === '.yml' || ext === '.yaml') {
|
|
110
|
+
results.push(fullPath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Skip inaccessible entries
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return results;
|
|
119
|
+
}
|
|
120
|
+
/** Extract a table name from a dbt semantic model. */
|
|
121
|
+
function resolveTableName(model) {
|
|
122
|
+
if (model.model) {
|
|
123
|
+
// dbt model refs look like "ref('stg_orders')" - extract the model name
|
|
124
|
+
const match = model.model.match(/ref\(['"](.+?)['"]\)/);
|
|
125
|
+
if (match)
|
|
126
|
+
return match[1];
|
|
127
|
+
return model.model;
|
|
128
|
+
}
|
|
129
|
+
return model.name;
|
|
130
|
+
}
|
|
131
|
+
/** Convert a dbt semantic model to a DQL CubeDefinition. */
|
|
132
|
+
function convertSemanticModel(model) {
|
|
133
|
+
const tableName = resolveTableName(model);
|
|
134
|
+
const measures = (model.measures ?? []).map((m) => ({
|
|
135
|
+
name: m.name,
|
|
136
|
+
label: m.name,
|
|
137
|
+
description: m.description ?? '',
|
|
138
|
+
domain: '',
|
|
139
|
+
sql: buildAggSql(m.agg, m.expr ?? m.name),
|
|
140
|
+
type: AGG_TYPE_MAP[m.agg] ?? 'custom',
|
|
141
|
+
table: tableName,
|
|
142
|
+
}));
|
|
143
|
+
const dimensions = [];
|
|
144
|
+
const timeDimensions = [];
|
|
145
|
+
for (const dim of model.dimensions ?? []) {
|
|
146
|
+
const dqlType = DIM_TYPE_MAP[dim.type] ?? 'string';
|
|
147
|
+
const sqlExpr = dim.expr ?? dim.name;
|
|
148
|
+
if (dim.type === 'time') {
|
|
149
|
+
const granularity = dim.type_params?.time_granularity ?? 'day';
|
|
150
|
+
const validGranularities = ['day', 'week', 'month', 'quarter', 'year'];
|
|
151
|
+
const defaultGrans = ['day', 'week', 'month', 'quarter', 'year'];
|
|
152
|
+
const isPrimary = model.defaults?.agg_time_dimension === dim.name;
|
|
153
|
+
timeDimensions.push({
|
|
154
|
+
name: dim.name,
|
|
155
|
+
label: dim.name,
|
|
156
|
+
description: '',
|
|
157
|
+
sql: sqlExpr,
|
|
158
|
+
type: 'date',
|
|
159
|
+
table: tableName,
|
|
160
|
+
granularities: defaultGrans,
|
|
161
|
+
primaryTime: isPrimary,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
dimensions.push({
|
|
166
|
+
name: dim.name,
|
|
167
|
+
label: dim.name,
|
|
168
|
+
description: '',
|
|
169
|
+
sql: sqlExpr,
|
|
170
|
+
type: dqlType,
|
|
171
|
+
table: tableName,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Convert entities with foreign type to joins
|
|
176
|
+
const joins = [];
|
|
177
|
+
for (const entity of model.entities ?? []) {
|
|
178
|
+
if (entity.type === 'foreign') {
|
|
179
|
+
joins.push({
|
|
180
|
+
name: entity.name,
|
|
181
|
+
left: model.name,
|
|
182
|
+
right: entity.name,
|
|
183
|
+
type: 'left',
|
|
184
|
+
sql: `\${left}.${entity.expr ?? entity.name} = \${right}.${entity.name}`,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
name: model.name,
|
|
190
|
+
label: model.name,
|
|
191
|
+
description: '',
|
|
192
|
+
sql: `SELECT * FROM ${tableName}`,
|
|
193
|
+
table: tableName,
|
|
194
|
+
domain: '',
|
|
195
|
+
measures,
|
|
196
|
+
dimensions,
|
|
197
|
+
timeDimensions,
|
|
198
|
+
joins,
|
|
199
|
+
defaultTimeDimension: model.defaults?.agg_time_dimension,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** Build an aggregate SQL expression from a dbt agg type and expression. */
|
|
203
|
+
function buildAggSql(agg, expr) {
|
|
204
|
+
switch (agg) {
|
|
205
|
+
case 'sum': return `SUM(${expr})`;
|
|
206
|
+
case 'count': return `COUNT(${expr})`;
|
|
207
|
+
case 'count_distinct': return `COUNT(DISTINCT ${expr})`;
|
|
208
|
+
case 'average':
|
|
209
|
+
case 'avg': return `AVG(${expr})`;
|
|
210
|
+
case 'min': return `MIN(${expr})`;
|
|
211
|
+
case 'max': return `MAX(${expr})`;
|
|
212
|
+
default: return expr;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** Convert a dbt metric definition to a DQL MetricDefinition. */
|
|
216
|
+
function convertDbtMetric(dbtMetric, measureLookup) {
|
|
217
|
+
const measureName = dbtMetric.type_params?.measure;
|
|
218
|
+
if (!measureName)
|
|
219
|
+
return null;
|
|
220
|
+
const measureInfo = measureLookup.get(measureName);
|
|
221
|
+
if (!measureInfo)
|
|
222
|
+
return null;
|
|
223
|
+
return {
|
|
224
|
+
name: dbtMetric.name,
|
|
225
|
+
label: dbtMetric.label ?? dbtMetric.name,
|
|
226
|
+
description: dbtMetric.description ?? '',
|
|
227
|
+
domain: '',
|
|
228
|
+
sql: buildAggSql(measureInfo.agg, measureInfo.sql),
|
|
229
|
+
type: AGG_TYPE_MAP[measureInfo.agg] ?? 'custom',
|
|
230
|
+
table: measureInfo.table,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=dbt-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbt-provider.js","sourceRoot":"","sources":["../../../src/semantic/providers/dbt-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DQL Native semantic layer provider.
|
|
3
|
+
* Reads from the project's semantic-layer/ directory using the existing YAML loader.
|
|
4
|
+
*/
|
|
5
|
+
import type { SemanticLayerProvider, SemanticLayerProviderConfig } from './provider.js';
|
|
6
|
+
import type { SemanticLayer } from '../semantic-layer.js';
|
|
7
|
+
export declare class DqlProvider implements SemanticLayerProvider {
|
|
8
|
+
readonly name = "dql";
|
|
9
|
+
load(config: SemanticLayerProviderConfig, projectRoot: string): SemanticLayer;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=dql-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dql-provider.d.ts","sourceRoot":"","sources":["../../../src/semantic/providers/dql-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,WAAY,YAAW,qBAAqB;IACvD,QAAQ,CAAC,IAAI,SAAS;IAEtB,IAAI,CAAC,MAAM,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;CAM9E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DQL Native semantic layer provider.
|
|
3
|
+
* Reads from the project's semantic-layer/ directory using the existing YAML loader.
|
|
4
|
+
*/
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { loadSemanticLayerFromDir } from '../yaml-loader.js';
|
|
7
|
+
export class DqlProvider {
|
|
8
|
+
name = 'dql';
|
|
9
|
+
load(config, projectRoot) {
|
|
10
|
+
const semanticDir = config.path
|
|
11
|
+
? join(projectRoot, config.path)
|
|
12
|
+
: join(projectRoot, 'semantic-layer');
|
|
13
|
+
return loadSemanticLayerFromDir(semanticDir);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=dql-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dql-provider.js","sourceRoot":"","sources":["../../../src/semantic/providers/dql-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAI7D,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,KAAK,CAAC;IAEtB,IAAI,CAAC,MAAmC,EAAE,WAAmB;QAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI;YAC7B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACxC,OAAO,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/semantic/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/semantic/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SemanticLayer } from '../semantic-layer.js';
|
|
2
|
+
export interface SemanticLayerProviderConfig {
|
|
3
|
+
provider: 'dql' | 'dbt' | 'cubejs' | 'lookml';
|
|
4
|
+
/** Path to the external project (for dbt, cubejs, lookml). */
|
|
5
|
+
projectPath?: string;
|
|
6
|
+
/** Path to DQL's native semantic-layer/ directory. */
|
|
7
|
+
path?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SemanticLayerProvider {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
/** Load semantic definitions and populate a SemanticLayer instance. */
|
|
12
|
+
load(config: SemanticLayerProviderConfig, projectRoot: string): SemanticLayer;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/semantic/providers/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC9C,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,IAAI,CAAC,MAAM,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAAC;CAC/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/semantic/providers/provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry: resolves a SemanticLayerProviderConfig to a loaded SemanticLayer.
|
|
3
|
+
* Supports auto-detection when no config is provided.
|
|
4
|
+
*/
|
|
5
|
+
import type { SemanticLayer } from '../semantic-layer.js';
|
|
6
|
+
import type { SemanticLayerProviderConfig } from './provider.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the semantic layer from config, or auto-detect if no config is given.
|
|
9
|
+
*
|
|
10
|
+
* Auto-detection order:
|
|
11
|
+
* 1. If `semantic-layer/` exists in projectRoot, use DQL native provider.
|
|
12
|
+
* 2. Otherwise return undefined.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveSemanticLayer(config: SemanticLayerProviderConfig | undefined, projectRoot: string): SemanticLayer | undefined;
|
|
15
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/semantic/providers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAKjE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,2BAA2B,GAAG,SAAS,EAC/C,WAAW,EAAE,MAAM,GAClB,aAAa,GAAG,SAAS,CAa3B"}
|