yamchart 0.9.5 → 0.10.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.
Files changed (74) hide show
  1. package/dist/{advisor-SC64RTZO.js → advisor-O2BRAI4T.js} +24 -14
  2. package/dist/advisor-O2BRAI4T.js.map +1 -0
  3. package/dist/{chunk-NXQ6ZO3V.js → chunk-5FHV22X2.js} +6 -6
  4. package/dist/chunk-5FHV22X2.js.map +1 -0
  5. package/dist/chunk-FN6R2LAC.js +15442 -0
  6. package/dist/chunk-FN6R2LAC.js.map +1 -0
  7. package/dist/chunk-QJ5CPQJK.js +2053 -0
  8. package/dist/chunk-QJ5CPQJK.js.map +1 -0
  9. package/dist/{chunk-S7YQXEKM.js → chunk-QUIDZO5G.js} +103 -275
  10. package/dist/chunk-QUIDZO5G.js.map +1 -0
  11. package/dist/{chunk-RMIDEBHD.js → chunk-S2CH4HUZ.js} +6 -6
  12. package/dist/{chunk-UND73EOB.js → chunk-UFDQ3C7Q.js} +473 -4
  13. package/dist/chunk-UFDQ3C7Q.js.map +1 -0
  14. package/dist/{chunk-H4L3FNLS.js → chunk-ZBCQNWVN.js} +2 -2
  15. package/dist/{chunk-RM6MNDVF.js → chunk-ZIY22VO7.js} +192 -11
  16. package/dist/chunk-ZIY22VO7.js.map +1 -0
  17. package/dist/{connection-utils-C4FQGBW6.js → connection-utils-FEUWER5I.js} +5 -5
  18. package/dist/{describe-X75C2VDU.js → describe-MEP72B56.js} +6 -6
  19. package/dist/{dev-GWXHBBWB.js → dev-LZ4YHNDJ.js} +1315 -73
  20. package/dist/dev-LZ4YHNDJ.js.map +1 -0
  21. package/dist/dist-5IFWLWND.js +48 -0
  22. package/dist/{dist-MX5K2ABB.js → dist-PPAD6KOM.js} +44 -2
  23. package/dist/{dist-JMLAZUL7.js → dist-XNCED7JW.js} +29 -12
  24. package/dist/fileFromPath-7TNUU6RI.js +130 -0
  25. package/dist/fileFromPath-7TNUU6RI.js.map +1 -0
  26. package/dist/index.js +24 -24
  27. package/dist/public/assets/DataView-DUCz_96y.js +9 -0
  28. package/dist/public/assets/{EventManagement-CTuAJ0eF.js → EventManagement-BnmeJDQl.js} +1 -1
  29. package/dist/public/assets/{ExplorePage-ZJ3zNjNQ.js → ExplorePage-kk4z9ldZ.js} +1 -1
  30. package/dist/public/assets/{LoginPage-wygea4BI.js → LoginPage-CzaFkkjg.js} +1 -1
  31. package/dist/public/assets/{PublicViewer-8YqGrVVB.js → PublicViewer-irjxqH6a.js} +1 -1
  32. package/dist/public/assets/{SetupWizard-DqDBwHrF.js → SetupWizard-ConWIcmy.js} +1 -1
  33. package/dist/public/assets/{ShareManagement-TAAdI_gY.js → ShareManagement-CP4wdwLR.js} +1 -1
  34. package/dist/public/assets/SourceDetailView-DZS5518E.js +1 -0
  35. package/dist/public/assets/{UserManagement-B4kZHyri.js → UserManagement-AubGd9hl.js} +1 -1
  36. package/dist/public/assets/data-3vtzSuAZ.js +1 -0
  37. package/dist/public/assets/{index-CfyF2Wf-.css → index-C1X8RW4Z.css} +1 -1
  38. package/dist/public/assets/{index-BgzSjgIu.js → index-jlfTO7f5.js} +44 -44
  39. package/dist/public/assets/{index.es-AB-GdGyc.js → index.es-CgnvEWi5.js} +1 -1
  40. package/dist/public/assets/{jspdf.es.min-ChRx2mOQ.js → jspdf.es.min-Cw5WefMt.js} +3 -3
  41. package/dist/public/index.html +2 -2
  42. package/dist/{query-QNRDS74I.js → query-2H3YOPI2.js} +5 -5
  43. package/dist/{sample-SKLHBZBU.js → sample-ODUGGSFA.js} +5 -5
  44. package/dist/{search-4KMETZVX.js → search-IPE4ISFB.js} +6 -6
  45. package/dist/{semantic-6WKELH5V.js → semantic-K3MYXXJI.js} +3 -2
  46. package/dist/{semantic-6WKELH5V.js.map → semantic-K3MYXXJI.js.map} +1 -1
  47. package/dist/{source-resolver-R7WBIL7M.js → source-resolver-HZQLOODU.js} +6 -6
  48. package/dist/source-resolver-HZQLOODU.js.map +1 -0
  49. package/dist/{sync-warehouse-UWRNUXE7.js → sync-warehouse-26L6JDSV.js} +10 -10
  50. package/dist/{tables-V65QUGHK.js → tables-K5NAN2WK.js} +6 -6
  51. package/dist/templates/default/docs/yamchart-reference.md +42 -0
  52. package/dist/{test-UE5OWG3E.js → test-SRHVOXZB.js} +8 -7
  53. package/dist/{test-UE5OWG3E.js.map → test-SRHVOXZB.js.map} +1 -1
  54. package/package.json +3 -3
  55. package/dist/advisor-SC64RTZO.js.map +0 -1
  56. package/dist/chunk-NXQ6ZO3V.js.map +0 -1
  57. package/dist/chunk-RM6MNDVF.js.map +0 -1
  58. package/dist/chunk-S7YQXEKM.js.map +0 -1
  59. package/dist/chunk-UND73EOB.js.map +0 -1
  60. package/dist/dev-GWXHBBWB.js.map +0 -1
  61. package/dist/dist-MNXSMGV6.js +0 -790
  62. package/dist/dist-MNXSMGV6.js.map +0 -1
  63. /package/dist/{chunk-RMIDEBHD.js.map → chunk-S2CH4HUZ.js.map} +0 -0
  64. /package/dist/{chunk-H4L3FNLS.js.map → chunk-ZBCQNWVN.js.map} +0 -0
  65. /package/dist/{connection-utils-C4FQGBW6.js.map → connection-utils-FEUWER5I.js.map} +0 -0
  66. /package/dist/{describe-X75C2VDU.js.map → describe-MEP72B56.js.map} +0 -0
  67. /package/dist/{dist-JMLAZUL7.js.map → dist-5IFWLWND.js.map} +0 -0
  68. /package/dist/{dist-MX5K2ABB.js.map → dist-PPAD6KOM.js.map} +0 -0
  69. /package/dist/{source-resolver-R7WBIL7M.js.map → dist-XNCED7JW.js.map} +0 -0
  70. /package/dist/{query-QNRDS74I.js.map → query-2H3YOPI2.js.map} +0 -0
  71. /package/dist/{sample-SKLHBZBU.js.map → sample-ODUGGSFA.js.map} +0 -0
  72. /package/dist/{search-4KMETZVX.js.map → search-IPE4ISFB.js.map} +0 -0
  73. /package/dist/{sync-warehouse-UWRNUXE7.js.map → sync-warehouse-26L6JDSV.js.map} +0 -0
  74. /package/dist/{tables-V65QUGHK.js.map → tables-K5NAN2WK.js.map} +0 -0
@@ -1,3 +1,262 @@
1
+ import {
2
+ SemanticDefinitionSchema
3
+ } from "./chunk-ZIY22VO7.js";
4
+
5
+ // ../../packages/query/dist/presets.js
6
+ import { subDays, subWeeks, subMonths, subYears, subQuarters, addDays, addWeeks, addMonths, addYears, addQuarters, startOfDay, startOfWeek, startOfYear, startOfMonth, startOfQuarter, endOfWeek, endOfMonth, endOfQuarter, endOfYear, differenceInDays, parseISO, format } from "date-fns";
7
+ function isCustomDateRange(value) {
8
+ return typeof value === "object" && value !== null && "type" in value && value.type === "custom" && "start" in value && "end" in value;
9
+ }
10
+ function expandCustomDateRange(range) {
11
+ return {
12
+ start_date: range.start,
13
+ end_date: range.end
14
+ };
15
+ }
16
+ var DATE_PRESETS = [
17
+ "today",
18
+ "yesterday",
19
+ "last_7_days",
20
+ "last_30_days",
21
+ "last_90_days",
22
+ "last_12_months",
23
+ "year_to_date",
24
+ "month_to_date",
25
+ "quarter_to_date",
26
+ "previous_month",
27
+ "previous_quarter",
28
+ "previous_year"
29
+ ];
30
+ var DATE_FORMAT = "yyyy-MM-dd";
31
+ function formatDate(date) {
32
+ return format(date, DATE_FORMAT);
33
+ }
34
+ function expandDatePreset(preset) {
35
+ const now = /* @__PURE__ */ new Date();
36
+ const today = formatDate(now);
37
+ switch (preset) {
38
+ case "today":
39
+ return {
40
+ start_date: today,
41
+ end_date: today
42
+ };
43
+ case "yesterday": {
44
+ const yesterday = formatDate(subDays(now, 1));
45
+ return {
46
+ start_date: yesterday,
47
+ end_date: yesterday
48
+ };
49
+ }
50
+ case "last_7_days": {
51
+ const yesterday = formatDate(subDays(now, 1));
52
+ return {
53
+ start_date: formatDate(subDays(now, 7)),
54
+ end_date: yesterday
55
+ };
56
+ }
57
+ case "last_30_days": {
58
+ const yesterday = formatDate(subDays(now, 1));
59
+ return {
60
+ start_date: formatDate(subDays(now, 30)),
61
+ end_date: yesterday
62
+ };
63
+ }
64
+ case "last_90_days": {
65
+ const yesterday = formatDate(subDays(now, 1));
66
+ return {
67
+ start_date: formatDate(subDays(now, 90)),
68
+ end_date: yesterday
69
+ };
70
+ }
71
+ case "last_12_months": {
72
+ const yesterday = formatDate(subDays(now, 1));
73
+ return {
74
+ start_date: formatDate(subMonths(now, 12)),
75
+ end_date: yesterday
76
+ };
77
+ }
78
+ case "year_to_date":
79
+ return {
80
+ start_date: formatDate(startOfYear(now)),
81
+ end_date: today
82
+ };
83
+ case "month_to_date":
84
+ return {
85
+ start_date: formatDate(startOfMonth(now)),
86
+ end_date: today
87
+ };
88
+ case "quarter_to_date":
89
+ return {
90
+ start_date: formatDate(startOfQuarter(now)),
91
+ end_date: today
92
+ };
93
+ case "previous_month": {
94
+ const lastMonth = subMonths(now, 1);
95
+ return {
96
+ start_date: formatDate(startOfMonth(lastMonth)),
97
+ end_date: formatDate(endOfMonth(lastMonth))
98
+ };
99
+ }
100
+ case "previous_quarter": {
101
+ const lastQuarter = subMonths(now, 3);
102
+ return {
103
+ start_date: formatDate(startOfQuarter(lastQuarter)),
104
+ end_date: formatDate(endOfQuarter(lastQuarter))
105
+ };
106
+ }
107
+ case "previous_year": {
108
+ const lastYear = subYears(now, 1);
109
+ return {
110
+ start_date: formatDate(startOfYear(lastYear)),
111
+ end_date: formatDate(endOfYear(lastYear))
112
+ };
113
+ }
114
+ default:
115
+ return null;
116
+ }
117
+ }
118
+ function computePreviousPeriod(startDate, endDate, presetName) {
119
+ const start = parseISO(startDate);
120
+ const end = parseISO(endDate);
121
+ switch (presetName) {
122
+ case "today":
123
+ case "yesterday": {
124
+ return {
125
+ start_date: formatDate(subDays(start, 1)),
126
+ end_date: formatDate(subDays(end, 1))
127
+ };
128
+ }
129
+ case "last_7_days": {
130
+ return {
131
+ start_date: formatDate(subDays(start, 7)),
132
+ end_date: formatDate(subDays(end, 7))
133
+ };
134
+ }
135
+ case "last_30_days": {
136
+ return {
137
+ start_date: formatDate(subDays(start, 30)),
138
+ end_date: formatDate(subDays(end, 30))
139
+ };
140
+ }
141
+ case "last_90_days": {
142
+ return {
143
+ start_date: formatDate(subDays(start, 90)),
144
+ end_date: formatDate(subDays(end, 90))
145
+ };
146
+ }
147
+ case "last_12_months":
148
+ case "last_365_days": {
149
+ return {
150
+ start_date: formatDate(subMonths(start, 12)),
151
+ end_date: formatDate(subMonths(end, 12))
152
+ };
153
+ }
154
+ case "year_to_date": {
155
+ return {
156
+ start_date: formatDate(subYears(start, 1)),
157
+ end_date: formatDate(subYears(end, 1))
158
+ };
159
+ }
160
+ case "month_to_date": {
161
+ return {
162
+ start_date: formatDate(subMonths(start, 1)),
163
+ end_date: formatDate(subMonths(end, 1))
164
+ };
165
+ }
166
+ case "quarter_to_date": {
167
+ return {
168
+ start_date: formatDate(subQuarters(start, 1)),
169
+ end_date: formatDate(subQuarters(end, 1))
170
+ };
171
+ }
172
+ case "previous_month": {
173
+ const shifted = subMonths(start, 1);
174
+ return {
175
+ start_date: formatDate(startOfMonth(shifted)),
176
+ end_date: formatDate(endOfMonth(shifted))
177
+ };
178
+ }
179
+ case "previous_quarter": {
180
+ const shifted = subQuarters(start, 1);
181
+ return {
182
+ start_date: formatDate(startOfQuarter(shifted)),
183
+ end_date: formatDate(endOfQuarter(shifted))
184
+ };
185
+ }
186
+ case "previous_year": {
187
+ const shifted = subYears(start, 1);
188
+ return {
189
+ start_date: formatDate(startOfYear(shifted)),
190
+ end_date: formatDate(endOfYear(shifted))
191
+ };
192
+ }
193
+ default: {
194
+ const days = differenceInDays(end, start);
195
+ return {
196
+ start_date: formatDate(subDays(start, days)),
197
+ end_date: formatDate(subDays(end, days))
198
+ };
199
+ }
200
+ }
201
+ }
202
+ function formatPeriodLabel(startDate, endDate) {
203
+ const start = parseISO(startDate);
204
+ const end = parseISO(endDate);
205
+ if (startDate === endDate) {
206
+ return format(start, "MMM d");
207
+ }
208
+ const startYear = start.getFullYear();
209
+ const endYear = end.getFullYear();
210
+ if (startYear === endYear) {
211
+ return `${format(start, "MMM d")} \u2013 ${format(end, "MMM d")}`;
212
+ }
213
+ return `${format(start, "MMM d, yyyy")} \u2013 ${format(end, "MMM d, yyyy")}`;
214
+ }
215
+ function isDatePreset(value) {
216
+ return DATE_PRESETS.includes(value);
217
+ }
218
+ function isRelativeDateRange(value) {
219
+ return typeof value === "object" && value !== null && "type" in value && value.type === "relative";
220
+ }
221
+ function expandRelativeDateRange(rel) {
222
+ const now = /* @__PURE__ */ new Date();
223
+ const today = startOfDay(now);
224
+ if (rel.direction === "current") {
225
+ switch (rel.unit) {
226
+ case "day":
227
+ return { start_date: formatDate(today), end_date: formatDate(today) };
228
+ case "week":
229
+ return {
230
+ start_date: formatDate(startOfWeek(today, { weekStartsOn: 1 })),
231
+ end_date: formatDate(endOfWeek(today, { weekStartsOn: 1 }))
232
+ };
233
+ case "month":
234
+ return { start_date: formatDate(startOfMonth(today)), end_date: formatDate(endOfMonth(today)) };
235
+ case "quarter":
236
+ return { start_date: formatDate(startOfQuarter(today)), end_date: formatDate(endOfQuarter(today)) };
237
+ case "year":
238
+ return { start_date: formatDate(startOfYear(today)), end_date: formatDate(endOfYear(today)) };
239
+ }
240
+ }
241
+ const n = rel.value ?? 1;
242
+ if (rel.direction === "previous") {
243
+ const end2 = rel.includeToday ? today : subDays(today, 1);
244
+ const shiftFns2 = { day: subDays, week: subWeeks, month: subMonths, quarter: subQuarters, year: subYears };
245
+ const start2 = shiftFns2[rel.unit](rel.includeToday ? today : today, n);
246
+ return {
247
+ start_date: formatDate(start2 < end2 ? start2 : end2),
248
+ end_date: formatDate(start2 < end2 ? end2 : start2)
249
+ };
250
+ }
251
+ const start = rel.includeToday ? today : addDays(today, 1);
252
+ const shiftFns = { day: addDays, week: addWeeks, month: addMonths, quarter: addQuarters, year: addYears };
253
+ const end = shiftFns[rel.unit](start, n);
254
+ return {
255
+ start_date: formatDate(start < end ? start : end),
256
+ end_date: formatDate(start < end ? end : start)
257
+ };
258
+ }
259
+
1
260
  // ../../packages/query/dist/semantic/field-classifier.js
2
261
  var DIMENSION_ID_PATTERN = /(_id|_key|_code)$/i;
3
262
  var DIMENSION_NAME_PATTERN = /(_name|_label|_title|_slug)$/i;
@@ -259,10 +518,10 @@ var SemanticModelBuilder = class {
259
518
  if (dim)
260
519
  dim.type = "time";
261
520
  }
262
- for (const [field, format] of Object.entries(hint.formats)) {
521
+ for (const [field, format2] of Object.entries(hint.formats)) {
263
522
  const measure = entity.measures.find((m) => m.name === field);
264
523
  if (measure)
265
- measure.format = format;
524
+ measure.format = format2;
266
525
  }
267
526
  }
268
527
  }
@@ -437,13 +696,223 @@ function validateSemanticQuery(model, query) {
437
696
  }
438
697
  }
439
698
 
699
+ // ../../packages/query/dist/semantic/loader.js
700
+ import { readFileSync, existsSync, readdirSync } from "fs";
701
+ import { join } from "path";
702
+ import { parse as parseYaml } from "yaml";
703
+ function toResolvedEntity(def, resolveTable) {
704
+ const sourceRef = def.source.table ?? resolveTable(def.source.model);
705
+ return {
706
+ name: def.entity,
707
+ sourceRef,
708
+ timeDimension: def.time_dimension,
709
+ dimensions: def.dimensions,
710
+ filters: def.filters ?? {},
711
+ metrics: def.metrics
712
+ };
713
+ }
714
+ function buildSemanticLayer(defs, resolveTable = (m) => m) {
715
+ const entities = defs.map((d) => toResolvedEntity(d, resolveTable));
716
+ const byMetricKey = /* @__PURE__ */ new Map();
717
+ const list = [];
718
+ for (const entity of entities) {
719
+ for (const metric of entity.metrics) {
720
+ const resolved = { metric, entity };
721
+ byMetricKey.set(metric.name.toLowerCase(), resolved);
722
+ for (const syn of metric.synonyms ?? []) {
723
+ if (!byMetricKey.has(syn.toLowerCase()))
724
+ byMetricKey.set(syn.toLowerCase(), resolved);
725
+ }
726
+ list.push({
727
+ name: metric.name,
728
+ label: metric.label,
729
+ description: metric.description,
730
+ entity: entity.name,
731
+ agg: metric.agg,
732
+ synonyms: metric.synonyms ?? [],
733
+ format: metric.format,
734
+ dimensions: entity.dimensions.map((d) => d.name)
735
+ });
736
+ }
737
+ }
738
+ return {
739
+ listMetrics: () => list,
740
+ resolveMetric: (key) => byMetricKey.get(key.toLowerCase()),
741
+ getEntity: (name) => entities.find((e) => e.name === name)
742
+ };
743
+ }
744
+ function loadSemanticDefinitions(projectDir) {
745
+ const dir = join(projectDir, "semantic");
746
+ if (!existsSync(dir))
747
+ return [];
748
+ const defs = [];
749
+ for (const file of readdirSync(dir)) {
750
+ if (!/\.ya?ml$/.test(file))
751
+ continue;
752
+ const raw = parseYaml(readFileSync(join(dir, file), "utf8"));
753
+ const entries = Array.isArray(raw?.entities) ? raw.entities : [raw];
754
+ for (const entry of entries) {
755
+ defs.push(SemanticDefinitionSchema.parse(entry));
756
+ }
757
+ }
758
+ return defs;
759
+ }
760
+
761
+ // ../../packages/query/dist/semantic/dialect.js
762
+ var stringFirst = {
763
+ dateTrunc: (col, grain) => `date_trunc('${grain}', ${col})`,
764
+ quoteIdent: (id) => `"${id}"`
765
+ };
766
+ var bigquery = {
767
+ dateTrunc: (col, grain) => `DATE_TRUNC(${col}, ${grain.toUpperCase()})`,
768
+ quoteIdent: (id) => "`" + id + "`"
769
+ };
770
+ function getDialect(connectionType) {
771
+ switch ((connectionType || "").toLowerCase()) {
772
+ case "bigquery":
773
+ return bigquery;
774
+ case "duckdb":
775
+ case "postgres":
776
+ case "snowflake":
777
+ case "mysql":
778
+ return stringFirst;
779
+ default:
780
+ return stringFirst;
781
+ }
782
+ }
783
+
784
+ // ../../packages/query/dist/semantic/metric-compiler.js
785
+ var AGG_FN = {
786
+ sum: "SUM",
787
+ count: "COUNT",
788
+ avg: "AVG",
789
+ min: "MIN",
790
+ max: "MAX",
791
+ count_distinct: "COUNT(DISTINCT"
792
+ };
793
+ function aggExpr(metric, filterSql) {
794
+ if (metric.sql)
795
+ return `${metric.sql} AS ${metric.name}`;
796
+ const inner = filterSql ? `CASE WHEN ${filterSql} THEN ${metric.field} END` : metric.field;
797
+ if (metric.agg === "count_distinct")
798
+ return `COUNT(DISTINCT ${inner}) AS ${metric.name}`;
799
+ return `${AGG_FN[metric.agg]}(${inner}) AS ${metric.name}`;
800
+ }
801
+ function sqlLiteral(value) {
802
+ if (typeof value === "number" || typeof value === "boolean")
803
+ return String(value);
804
+ if (Array.isArray(value))
805
+ return `(${value.map(sqlLiteral).join(", ")})`;
806
+ return `'${String(value).replace(/'/g, "''")}'`;
807
+ }
808
+ var OPERATORS = {
809
+ equals: "=",
810
+ not_equals: "!=",
811
+ gt: ">",
812
+ gte: ">=",
813
+ lt: "<",
814
+ lte: "<=",
815
+ in: "IN",
816
+ not_in: "NOT IN"
817
+ };
818
+ var DATE_RE = /^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2}(\.\d+)?)?Z?)?$/;
819
+ function compileMetricQuery(entity, query, connectionType) {
820
+ const dialect = getDialect(connectionType);
821
+ const select = [];
822
+ const groupCols = [];
823
+ for (const dimName of query.dimensions ?? []) {
824
+ const dim = entity.dimensions.find((d) => d.name === dimName);
825
+ if (!dim)
826
+ throw new Error(`Unknown dimension "${dimName}" on entity "${entity.name}".`);
827
+ if (dim.type === "time" && query.grain) {
828
+ select.push(`${dialect.dateTrunc(dim.name, query.grain)} AS ${dim.name}`);
829
+ } else {
830
+ select.push(dim.name);
831
+ }
832
+ groupCols.push(dim.name);
833
+ }
834
+ if (query.grain && entity.timeDimension && !(query.dimensions ?? []).includes(entity.timeDimension)) {
835
+ select.unshift(`${dialect.dateTrunc(entity.timeDimension, query.grain)} AS ${entity.timeDimension}`);
836
+ groupCols.unshift(entity.timeDimension);
837
+ }
838
+ const resolvedMetrics = [];
839
+ for (const metricName of query.metrics) {
840
+ const metric = entity.metrics.find((m) => m.name === metricName);
841
+ if (!metric)
842
+ throw new Error(`Unknown metric "${metricName}" on entity "${entity.name}".`);
843
+ const filterSql = metric.filter ? entity.filters[metric.filter]?.sql : void 0;
844
+ if (metric.filter && !filterSql) {
845
+ throw new Error(`Metric "${metricName}" references unknown filter "${metric.filter}".`);
846
+ }
847
+ select.push(aggExpr(metric, filterSql));
848
+ resolvedMetrics.push(metric);
849
+ }
850
+ const where = [];
851
+ if (query.time_range && entity.timeDimension) {
852
+ let start_date;
853
+ let end_date;
854
+ if ("preset" in query.time_range) {
855
+ const expanded = expandDatePreset(query.time_range.preset);
856
+ if (!expanded) {
857
+ throw new Error(`Unrecognized date preset "${query.time_range.preset}".`);
858
+ }
859
+ start_date = expanded.start_date;
860
+ end_date = expanded.end_date;
861
+ } else {
862
+ start_date = query.time_range.start;
863
+ end_date = query.time_range.end;
864
+ if (!DATE_RE.test(start_date) || !DATE_RE.test(end_date)) {
865
+ throw new Error("time_range.start and time_range.end must be YYYY-MM-DD (optionally with a time).");
866
+ }
867
+ }
868
+ where.push(`${entity.timeDimension} >= '${start_date}'`);
869
+ where.push(`${entity.timeDimension} <= '${end_date}'`);
870
+ }
871
+ for (const f of query.filters ?? []) {
872
+ const op = OPERATORS[f.operator];
873
+ if (!op)
874
+ throw new Error(`Unsupported filter operator "${f.operator}".`);
875
+ if (!entity.dimensions.some((d) => d.name === f.dimension)) {
876
+ throw new Error(`Unknown filter dimension "${f.dimension}" on entity "${entity.name}".`);
877
+ }
878
+ where.push(`${dialect.quoteIdent(f.dimension)} ${op} ${sqlLiteral(f.value)}`);
879
+ }
880
+ const lines = [`SELECT ${select.join(", ")}`, `FROM ${entity.sourceRef}`];
881
+ if (where.length)
882
+ lines.push(`WHERE ${where.join(" AND ")}`);
883
+ if (groupCols.length)
884
+ lines.push(`GROUP BY ${groupCols.map((_, i) => i + 1).join(", ")}`);
885
+ if (query.order_by) {
886
+ const selectable = /* @__PURE__ */ new Set([...groupCols, ...resolvedMetrics.map((m) => m.name)]);
887
+ if (!selectable.has(query.order_by.field)) {
888
+ throw new Error(`order_by.field "${query.order_by.field}" is not a selected column. Choose one of: ${[...selectable].join(", ")}.`);
889
+ }
890
+ lines.push(`ORDER BY ${dialect.quoteIdent(query.order_by.field)} ${(query.order_by.direction ?? "asc").toUpperCase()}`);
891
+ }
892
+ lines.push(`LIMIT ${query.limit ?? 1e3}`);
893
+ return { sql: lines.join("\n"), metrics: resolvedMetrics, groupCols };
894
+ }
895
+
440
896
  export {
897
+ isCustomDateRange,
898
+ expandCustomDateRange,
899
+ DATE_PRESETS,
900
+ expandDatePreset,
901
+ computePreviousPeriod,
902
+ formatPeriodLabel,
903
+ isDatePreset,
904
+ isRelativeDateRange,
905
+ expandRelativeDateRange,
441
906
  classifyField,
442
907
  inferAggregationType,
443
908
  classifyCatalogColumns,
444
909
  SemanticModelBuilder,
445
910
  SemanticQueryCompiler,
446
911
  SemanticValidationError,
447
- validateSemanticQuery
912
+ validateSemanticQuery,
913
+ buildSemanticLayer,
914
+ loadSemanticDefinitions,
915
+ getDialect,
916
+ compileMetricQuery
448
917
  };
449
- //# sourceMappingURL=chunk-UND73EOB.js.map
918
+ //# sourceMappingURL=chunk-UFDQ3C7Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/query/src/presets.ts","../../../packages/query/src/semantic/field-classifier.ts","../../../packages/query/src/semantic/model-builder.ts","../../../packages/query/src/semantic/query-compiler.ts","../../../packages/query/src/semantic/validators.ts","../../../packages/query/src/semantic/loader.ts","../../../packages/query/src/semantic/dialect.ts","../../../packages/query/src/semantic/metric-compiler.ts"],"sourcesContent":["import {\n subDays,\n subWeeks,\n subMonths,\n subYears,\n subQuarters,\n addDays,\n addWeeks,\n addMonths,\n addYears,\n addQuarters,\n startOfDay,\n startOfWeek,\n startOfYear,\n startOfMonth,\n startOfQuarter,\n endOfDay,\n endOfWeek,\n endOfMonth,\n endOfQuarter,\n endOfYear,\n differenceInDays,\n parseISO,\n format,\n} from 'date-fns';\n\nexport interface DateRange {\n start_date: string;\n end_date: string;\n}\n\nexport interface CustomDateRange {\n type: 'custom';\n start: string;\n end: string;\n}\n\n/**\n * Check if a value is a custom date range object.\n */\nexport function isCustomDateRange(value: unknown): value is CustomDateRange {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as CustomDateRange).type === 'custom' &&\n 'start' in value &&\n 'end' in value\n );\n}\n\n/**\n * Expand a custom date range into start_date and end_date.\n */\nexport function expandCustomDateRange(range: CustomDateRange): DateRange {\n return {\n start_date: range.start,\n end_date: range.end,\n };\n}\n\nexport const DATE_PRESETS = [\n 'today',\n 'yesterday',\n 'last_7_days',\n 'last_30_days',\n 'last_90_days',\n 'last_12_months',\n 'year_to_date',\n 'month_to_date',\n 'quarter_to_date',\n 'previous_month',\n 'previous_quarter',\n 'previous_year',\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number];\n\nconst DATE_FORMAT = 'yyyy-MM-dd';\n\nfunction formatDate(date: Date): string {\n return format(date, DATE_FORMAT);\n}\n\n/**\n * Expand a date preset into start_date and end_date.\n * Returns null if preset is not recognized.\n */\nexport function expandDatePreset(preset: string): DateRange | null {\n const now = new Date();\n const today = formatDate(now);\n\n switch (preset) {\n case 'today':\n return {\n start_date: today,\n end_date: today,\n };\n\n case 'yesterday': {\n const yesterday = formatDate(subDays(now, 1));\n return {\n start_date: yesterday,\n end_date: yesterday,\n };\n }\n\n case 'last_7_days': {\n const yesterday = formatDate(subDays(now, 1));\n return {\n start_date: formatDate(subDays(now, 7)),\n end_date: yesterday,\n };\n }\n\n case 'last_30_days': {\n const yesterday = formatDate(subDays(now, 1));\n return {\n start_date: formatDate(subDays(now, 30)),\n end_date: yesterday,\n };\n }\n\n case 'last_90_days': {\n const yesterday = formatDate(subDays(now, 1));\n return {\n start_date: formatDate(subDays(now, 90)),\n end_date: yesterday,\n };\n }\n\n case 'last_12_months': {\n const yesterday = formatDate(subDays(now, 1));\n return {\n start_date: formatDate(subMonths(now, 12)),\n end_date: yesterday,\n };\n }\n\n case 'year_to_date':\n return {\n start_date: formatDate(startOfYear(now)),\n end_date: today,\n };\n\n case 'month_to_date':\n return {\n start_date: formatDate(startOfMonth(now)),\n end_date: today,\n };\n\n case 'quarter_to_date':\n return {\n start_date: formatDate(startOfQuarter(now)),\n end_date: today,\n };\n\n case 'previous_month': {\n const lastMonth = subMonths(now, 1);\n return {\n start_date: formatDate(startOfMonth(lastMonth)),\n end_date: formatDate(endOfMonth(lastMonth)),\n };\n }\n\n case 'previous_quarter': {\n const lastQuarter = subMonths(now, 3);\n return {\n start_date: formatDate(startOfQuarter(lastQuarter)),\n end_date: formatDate(endOfQuarter(lastQuarter)),\n };\n }\n\n case 'previous_year': {\n const lastYear = subYears(now, 1);\n return {\n start_date: formatDate(startOfYear(lastYear)),\n end_date: formatDate(endOfYear(lastYear)),\n };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Compute the equivalent previous period for a given date range.\n * Uses semantic shifting for named presets, day-length shifting for custom ranges.\n */\nexport function computePreviousPeriod(\n startDate: string,\n endDate: string,\n presetName?: string\n): DateRange {\n const start = parseISO(startDate);\n const end = parseISO(endDate);\n\n switch (presetName) {\n case 'today':\n case 'yesterday': {\n return {\n start_date: formatDate(subDays(start, 1)),\n end_date: formatDate(subDays(end, 1)),\n };\n }\n case 'last_7_days': {\n return {\n start_date: formatDate(subDays(start, 7)),\n end_date: formatDate(subDays(end, 7)),\n };\n }\n case 'last_30_days': {\n return {\n start_date: formatDate(subDays(start, 30)),\n end_date: formatDate(subDays(end, 30)),\n };\n }\n case 'last_90_days': {\n return {\n start_date: formatDate(subDays(start, 90)),\n end_date: formatDate(subDays(end, 90)),\n };\n }\n case 'last_12_months':\n case 'last_365_days': {\n return {\n start_date: formatDate(subMonths(start, 12)),\n end_date: formatDate(subMonths(end, 12)),\n };\n }\n case 'year_to_date': {\n return {\n start_date: formatDate(subYears(start, 1)),\n end_date: formatDate(subYears(end, 1)),\n };\n }\n case 'month_to_date': {\n return {\n start_date: formatDate(subMonths(start, 1)),\n end_date: formatDate(subMonths(end, 1)),\n };\n }\n case 'quarter_to_date': {\n return {\n start_date: formatDate(subQuarters(start, 1)),\n end_date: formatDate(subQuarters(end, 1)),\n };\n }\n case 'previous_month': {\n const shifted = subMonths(start, 1);\n return {\n start_date: formatDate(startOfMonth(shifted)),\n end_date: formatDate(endOfMonth(shifted)),\n };\n }\n case 'previous_quarter': {\n const shifted = subQuarters(start, 1);\n return {\n start_date: formatDate(startOfQuarter(shifted)),\n end_date: formatDate(endOfQuarter(shifted)),\n };\n }\n case 'previous_year': {\n const shifted = subYears(start, 1);\n return {\n start_date: formatDate(startOfYear(shifted)),\n end_date: formatDate(endOfYear(shifted)),\n };\n }\n default: {\n // Custom range: shift back by the range length in days\n const days = differenceInDays(end, start);\n return {\n start_date: formatDate(subDays(start, days)),\n end_date: formatDate(subDays(end, days)),\n };\n }\n }\n}\n\n/**\n * Format a date range as a human-readable label.\n * Same year: \"Jan 17 – Feb 16\"\n * Cross year: \"Dec 18, 2025 – Jan 17, 2026\"\n * Single day: \"Feb 16\"\n */\nexport function formatPeriodLabel(startDate: string, endDate: string): string {\n const start = parseISO(startDate);\n const end = parseISO(endDate);\n\n if (startDate === endDate) {\n return format(start, 'MMM d');\n }\n\n const startYear = start.getFullYear();\n const endYear = end.getFullYear();\n\n if (startYear === endYear) {\n return `${format(start, 'MMM d')} – ${format(end, 'MMM d')}`;\n }\n\n return `${format(start, 'MMM d, yyyy')} – ${format(end, 'MMM d, yyyy')}`;\n}\n\n/**\n * Check if a string is a known date preset.\n */\nexport function isDatePreset(value: string): value is DatePreset {\n return DATE_PRESETS.includes(value as DatePreset);\n}\n\n// --- Relative date range support ---\n\nexport interface RelativeDateRange {\n type: 'relative';\n direction: 'previous' | 'current' | 'next';\n value?: number;\n unit: 'day' | 'week' | 'month' | 'quarter' | 'year';\n includeToday?: boolean;\n}\n\n/**\n * Check if a value is a relative date range object.\n */\nexport function isRelativeDateRange(value: unknown): value is RelativeDateRange {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as RelativeDateRange).type === 'relative'\n );\n}\n\n/**\n * Expand a relative date range into start_date and end_date.\n */\nexport function expandRelativeDateRange(rel: RelativeDateRange): DateRange {\n const now = new Date();\n const today = startOfDay(now);\n\n if (rel.direction === 'current') {\n switch (rel.unit) {\n case 'day':\n return { start_date: formatDate(today), end_date: formatDate(today) };\n case 'week':\n return {\n start_date: formatDate(startOfWeek(today, { weekStartsOn: 1 })),\n end_date: formatDate(endOfWeek(today, { weekStartsOn: 1 })),\n };\n case 'month':\n return { start_date: formatDate(startOfMonth(today)), end_date: formatDate(endOfMonth(today)) };\n case 'quarter':\n return { start_date: formatDate(startOfQuarter(today)), end_date: formatDate(endOfQuarter(today)) };\n case 'year':\n return { start_date: formatDate(startOfYear(today)), end_date: formatDate(endOfYear(today)) };\n }\n }\n\n const n = rel.value ?? 1;\n\n if (rel.direction === 'previous') {\n const end = rel.includeToday ? today : subDays(today, 1);\n const shiftFns = { day: subDays, week: subWeeks, month: subMonths, quarter: subQuarters, year: subYears };\n const start = shiftFns[rel.unit](rel.includeToday ? today : today, n);\n return {\n start_date: formatDate(start < end ? start : end),\n end_date: formatDate(start < end ? end : start),\n };\n }\n\n // next\n const start = rel.includeToday ? today : addDays(today, 1);\n const shiftFns = { day: addDays, week: addWeeks, month: addMonths, quarter: addQuarters, year: addYears };\n const end = shiftFns[rel.unit](start, n);\n return {\n start_date: formatDate(start < end ? start : end),\n end_date: formatDate(start < end ? end : start),\n };\n}\n","import type { MeasureType, DimensionType } from '@yamchart/schema';\nimport type { CatalogColumn } from './types.js';\n\nexport interface FieldClassification {\n role: 'measure' | 'dimension';\n measureType?: MeasureType;\n dimensionType?: DimensionType;\n}\n\ninterface ClassifyInput {\n name: string;\n data_type?: string;\n description?: string;\n}\n\n// --- Name pattern matchers ---\n\nconst DIMENSION_ID_PATTERN = /(_id|_key|_code)$/i;\nconst DIMENSION_NAME_PATTERN = /(_name|_label|_title|_slug)$/i;\nconst DIMENSION_TYPE_PATTERN = /(_type|_status|_category|_class|_group|_tier|_level|_kind|_role)$/i;\nconst DIMENSION_EXACT = new Set([\n 'id', 'name', 'category', 'channel', 'country', 'region', 'city', 'state',\n 'source', 'medium', 'campaign', 'status', 'type', 'tier', 'segment',\n 'department', 'team', 'brand', 'product', 'currency', 'email', 'url',\n]);\n\nconst TIME_PATTERN = /(_at|_date|_time|_timestamp|_ts|_day|_week|_month|_year|_quarter)$/i;\nconst TIME_EXACT = new Set([\n 'date', 'period', 'timestamp', 'date_day', 'month', 'year', 'quarter', 'week',\n 'created', 'updated', 'deleted', 'started', 'ended',\n]);\n\nconst MEASURE_COUNT_PATTERN = /(_count$|^count_|^num_|^number_of_|_total_count$)/i;\nconst MEASURE_AMOUNT_PATTERN = /(_amount$|_total$|_revenue$|_cost$|_price$|_spend$|_profit$|_margin$|_fee$|_tax$|_discount$|_balance$|_qty$|_quantity$|_sum$|_volume$|_weight$|_size$|_value$|_rate$|_ratio$|_score$|_percent$|_pct$)/i;\nconst MEASURE_EXACT = new Set([\n 'quantity', 'revenue', 'amount', 'total', 'cost', 'price', 'profit', 'margin',\n 'balance', 'score', 'rate', 'ratio', 'volume', 'weight', 'spend', 'fee',\n]);\nconst MEASURE_AVG_PATTERN = /(_avg$|_average$|_mean$|^avg_|^average_|^mean_)/i;\nconst MEASURE_MIN_PATTERN = /(^min_|_min$)/i;\nconst MEASURE_MAX_PATTERN = /(^max_|_max$)/i;\n\n// --- Data type matchers ---\n\nconst NUMERIC_TYPES = /^(number|numeric|int|integer|bigint|smallint|tinyint|float|double|decimal|real|money)/i;\nconst STRING_TYPES = /^(varchar|text|string|char|nchar|nvarchar|clob|binary|varbinary)/i;\nconst TIME_TYPES = /^(date|time|timestamp|datetime|interval)/i;\nconst BOOLEAN_TYPES = /^(bool|boolean|bit)/i;\n\n// --- Description keyword matchers ---\n\nconst MEASURE_DESCRIPTION_KEYWORDS = /\\b(total|sum of|count of|number of|amount|revenue|average|aggregate)\\b/i;\n\nexport function classifyField(input: ClassifyInput): FieldClassification {\n const name = input.name.toLowerCase();\n\n // Priority 3: Strong name heuristics (check first because they override data_type)\n\n // Time dimensions\n if (TIME_PATTERN.test(name) || TIME_EXACT.has(name)) {\n return { role: 'dimension', dimensionType: 'time' };\n }\n\n // Dimension IDs, names, types\n if (DIMENSION_ID_PATTERN.test(name) || DIMENSION_NAME_PATTERN.test(name) ||\n DIMENSION_TYPE_PATTERN.test(name) || DIMENSION_EXACT.has(name)) {\n return { role: 'dimension', dimensionType: 'string' };\n }\n\n // Measure patterns\n if (MEASURE_COUNT_PATTERN.test(name)) {\n return { role: 'measure', measureType: 'count' };\n }\n if (MEASURE_AVG_PATTERN.test(name)) {\n return { role: 'measure', measureType: 'avg' };\n }\n if (MEASURE_MIN_PATTERN.test(name)) {\n return { role: 'measure', measureType: 'min' };\n }\n if (MEASURE_MAX_PATTERN.test(name)) {\n return { role: 'measure', measureType: 'max' };\n }\n if (MEASURE_AMOUNT_PATTERN.test(name) || MEASURE_EXACT.has(name)) {\n return { role: 'measure', measureType: 'sum' };\n }\n\n // Priority 2: Data type (when name is ambiguous)\n if (input.data_type) {\n if (TIME_TYPES.test(input.data_type)) {\n return { role: 'dimension', dimensionType: 'time' };\n }\n if (BOOLEAN_TYPES.test(input.data_type)) {\n return { role: 'dimension', dimensionType: 'boolean' };\n }\n if (NUMERIC_TYPES.test(input.data_type)) {\n return { role: 'measure', measureType: 'sum' };\n }\n if (STRING_TYPES.test(input.data_type)) {\n return { role: 'dimension', dimensionType: 'string' };\n }\n }\n\n // Priority 4: Description keywords\n if (input.description && MEASURE_DESCRIPTION_KEYWORDS.test(input.description)) {\n return { role: 'measure', measureType: 'sum' };\n }\n\n // Priority 5: Fallback — unknown → dimension (safer default)\n return { role: 'dimension', dimensionType: 'string' };\n}\n\nexport function inferAggregationType(name: string): MeasureType {\n const lower = name.toLowerCase();\n if (MEASURE_COUNT_PATTERN.test(lower) || lower.startsWith('num_')) return 'count';\n if (MEASURE_AVG_PATTERN.test(lower)) return 'avg';\n if (MEASURE_MIN_PATTERN.test(lower)) return 'min';\n if (MEASURE_MAX_PATTERN.test(lower)) return 'max';\n return 'sum';\n}\n\nexport function classifyCatalogColumns(columns: CatalogColumn[]): {\n measures: Array<{ name: string; type: MeasureType; description?: string }>;\n dimensions: Array<{ name: string; type: DimensionType; description?: string }>;\n} {\n const measures: Array<{ name: string; type: MeasureType; description?: string }> = [];\n const dimensions: Array<{ name: string; type: DimensionType; description?: string }> = [];\n\n for (const col of columns) {\n const result = classifyField({\n name: col.name,\n data_type: col.data_type,\n description: col.description,\n });\n\n if (result.role === 'measure') {\n measures.push({\n name: col.name,\n type: result.measureType ?? 'sum',\n description: col.description || undefined,\n });\n } else {\n dimensions.push({\n name: col.name,\n type: result.dimensionType ?? 'string',\n description: col.description || undefined,\n });\n }\n }\n\n return { measures, dimensions };\n}\n","import type { SemanticModel, SemanticEntity, Measure, Dimension, SemanticConfig } from '@yamchart/schema';\nimport type { CatalogData, CatalogEntry, GoldFilterConfig } from './types.js';\nimport { classifyCatalogColumns } from './field-classifier.js';\n\nconst DEFAULT_FILTER: GoldFilterConfig = {\n paths: ['gold/', 'marts/', 'core/'],\n prefixes: ['dim_', 'fct_', 'fact_'],\n};\n\ninterface YamchartModel {\n name: string;\n description?: string;\n sql: string;\n metadata: {\n name: string;\n description?: string;\n returns?: Array<{ name: string; type?: string }>;\n params?: Array<{ name: string; type: string; default?: string | number; options?: string[] }>;\n };\n sourceTable?: string;\n}\n\ninterface ChartHint {\n modelName: string;\n measures: string[];\n dimensions: string[];\n timeDimensions: string[];\n formats: Record<string, string>;\n}\n\nexport interface BuildInput {\n catalog?: CatalogData;\n models?: YamchartModel[];\n chartHints?: ChartHint[];\n}\n\nexport class SemanticModelBuilder {\n private filter: GoldFilterConfig;\n\n constructor(config?: SemanticConfig) {\n this.filter = config?.include ?? DEFAULT_FILTER;\n }\n\n build(input: BuildInput): SemanticModel {\n const { catalog, models, chartHints } = input;\n\n // Step 1: Build catalog entities (gold only)\n const catalogEntities = catalog ? this.buildCatalogEntities(catalog) : [];\n\n // Step 2: Build yamchart model entities\n const modelEntities = models ? this.buildModelEntities(models) : [];\n\n // Step 3: Apply chart hints to enrich classification\n const allEntities = [...catalogEntities, ...modelEntities];\n if (chartHints) {\n this.applyChartHints(allEntities, chartHints);\n }\n\n // Step 4: Merge — yamchart model wins over catalog for same source_table\n const merged = this.mergeEntities(catalogEntities, modelEntities);\n\n // Step 5: Extract relationships\n const relationships = catalog ? this.extractRelationships(catalog, merged) : [];\n\n return {\n entities: merged,\n relationships,\n generated_at: new Date().toISOString(),\n };\n }\n\n private isGoldModel(entry: CatalogEntry): boolean {\n const path = entry.path?.toLowerCase() ?? '';\n const name = entry.name.toLowerCase();\n\n const pathMatch = this.filter.paths.some((p) => path.includes(p.toLowerCase()));\n const prefixMatch = this.filter.prefixes.some((p) => name.startsWith(p.toLowerCase()));\n\n return pathMatch || prefixMatch;\n }\n\n private buildCatalogEntities(catalog: CatalogData): SemanticEntity[] {\n return catalog.models\n .filter((entry) => this.isGoldModel(entry))\n .filter((entry) => entry.table) // must have a table path\n .map((entry) => {\n const { measures, dimensions } = classifyCatalogColumns(entry.columns ?? []);\n return {\n name: entry.name,\n description: entry.description && entry.description !== 'No description'\n ? entry.description\n : undefined,\n source: 'catalog' as const,\n source_table: entry.table!,\n measures,\n dimensions,\n };\n });\n }\n\n private buildModelEntities(models: YamchartModel[]): SemanticEntity[] {\n return models\n .filter((m) => m.metadata.returns && m.metadata.returns.length > 0)\n .map((m) => {\n const measures: Measure[] = [];\n const dimensions: Dimension[] = [];\n\n for (const col of m.metadata.returns!) {\n const colType = col.type?.toLowerCase();\n if (colType === 'number') {\n measures.push({\n name: col.name,\n type: this.inferAggType(col.name),\n });\n } else if (colType === 'date' || colType === 'datetime' || colType === 'timestamp') {\n dimensions.push({ name: col.name, type: 'time' });\n } else {\n dimensions.push({ name: col.name, type: 'string' });\n }\n }\n\n const parameters = m.metadata.params?.map((p) => ({\n name: p.name,\n type: p.type,\n default: p.default,\n options: p.options,\n }));\n\n return {\n name: m.name,\n description: m.description ?? m.metadata.description,\n source: 'model' as const,\n source_table: m.sourceTable ?? m.name,\n measures,\n dimensions,\n parameters: parameters?.length ? parameters : undefined,\n };\n });\n }\n\n private inferAggType(name: string): Measure['type'] {\n const lower = name.toLowerCase();\n if (/(_count$|^count_|^num_)/.test(lower)) return 'count';\n if (/(_avg$|_average$|_mean$|^avg_)/.test(lower)) return 'avg';\n if (/(^min_|_min$)/.test(lower)) return 'min';\n if (/(^max_|_max$)/.test(lower)) return 'max';\n return 'sum';\n }\n\n private applyChartHints(entities: SemanticEntity[], hints: ChartHint[]): void {\n for (const hint of hints) {\n const entity = entities.find((e) =>\n e.name === hint.modelName || e.source_table.toLowerCase().includes(hint.modelName.toLowerCase())\n );\n if (!entity) continue;\n\n // Promote fields to measures if chart uses them as y-axis\n for (const measureName of hint.measures) {\n const dimIdx = entity.dimensions.findIndex((d) => d.name === measureName);\n if (dimIdx !== -1) {\n const dim = entity.dimensions.splice(dimIdx, 1)[0]!;\n entity.measures.push({ name: dim.name, type: this.inferAggType(dim.name) });\n }\n }\n\n // Promote fields to time dimensions if chart uses them as temporal x-axis\n for (const timeDim of hint.timeDimensions) {\n const dim = entity.dimensions.find((d) => d.name === timeDim);\n if (dim) dim.type = 'time';\n }\n\n // Apply format hints\n for (const [field, format] of Object.entries(hint.formats)) {\n const measure = entity.measures.find((m) => m.name === field);\n if (measure) measure.format = format;\n }\n }\n }\n\n private mergeEntities(catalogEntities: SemanticEntity[], modelEntities: SemanticEntity[]): SemanticEntity[] {\n // Collect source tables claimed by yamchart models\n const modelTables = new Set(\n modelEntities.map((e) => e.source_table.toLowerCase())\n );\n\n // Filter out catalog entities whose source_table is claimed by a model entity\n const filteredCatalog = catalogEntities.filter(\n (e) => !modelTables.has(e.source_table.toLowerCase())\n );\n\n return [...filteredCatalog, ...modelEntities];\n }\n\n private extractRelationships(catalog: CatalogData, entities: SemanticEntity[]): SemanticModel['relationships'] {\n const entityNames = new Set(entities.map((e) => e.name));\n const relationships: SemanticModel['relationships'] = [];\n\n for (const entry of catalog.models) {\n if (!entityNames.has(entry.name)) continue;\n if (!entry.dependsOn) continue;\n\n for (const dep of entry.dependsOn) {\n // dependsOn format: \"model.project_name.model_name\"\n const parts = dep.split('.');\n const depName = parts[parts.length - 1]!;\n if (!entityNames.has(depName)) continue;\n\n // Find shared column names (likely join keys)\n const fromEntity = entities.find((e) => e.name === entry.name);\n const toEntity = entities.find((e) => e.name === depName);\n if (!fromEntity || !toEntity) continue;\n\n const fromFields = [...fromEntity.measures, ...fromEntity.dimensions].map((f) => f.name.toLowerCase());\n const toFields = [...toEntity.measures, ...toEntity.dimensions].map((f) => f.name.toLowerCase());\n const shared = fromFields.filter((f) => toFields.includes(f) && f.endsWith('_id'));\n\n if (shared.length > 0) {\n relationships.push({\n from: { entity: entry.name, field: shared[0]! },\n to: { entity: depName, field: shared[0]! },\n type: 'many_to_one',\n });\n }\n }\n }\n\n return relationships;\n }\n}\n","import type { SemanticModel, SemanticQuery, SemanticFilter, MeasureType } from '@yamchart/schema';\n\nexport class SemanticQueryCompiler {\n compile(model: SemanticModel, query: SemanticQuery): string {\n const entity = model.entities.find((e) => e.name === query.model);\n if (!entity) throw new Error(`Entity '${query.model}' not found`);\n\n const selectParts: string[] = [];\n const groupByParts: string[] = [];\n\n // Dimensions\n for (const dimName of query.dimensions) {\n selectParts.push(`\"${dimName}\"`);\n groupByParts.push(`\"${dimName}\"`);\n }\n\n // Measures with aggregation\n for (const measureName of query.measures) {\n const measure = entity.measures.find((m) => m.name === measureName);\n if (!measure) throw new Error(`Measure '${measureName}' not found`);\n selectParts.push(`${this.formatMeasure(measure.type, measureName)} AS \"${measureName}\"`);\n }\n\n // Build SQL\n const parts: string[] = [];\n parts.push(`SELECT ${selectParts.join(', ')}`);\n parts.push(`FROM ${entity.source_table}`);\n\n // WHERE\n if (query.filters.length > 0) {\n const conditions = query.filters.map((f) => this.compileFilter(f));\n parts.push(`WHERE ${conditions.join(' AND ')}`);\n }\n\n // GROUP BY\n if (groupByParts.length > 0) {\n parts.push(`GROUP BY ${groupByParts.join(', ')}`);\n }\n\n // ORDER BY\n if (query.order_by) {\n parts.push(`ORDER BY \"${query.order_by.field}\" ${query.order_by.direction.toUpperCase()}`);\n }\n\n // LIMIT\n parts.push(`LIMIT ${query.limit}`);\n\n return parts.join('\\n');\n }\n\n private formatMeasure(type: MeasureType, column: string): string {\n if (type === 'count_distinct') {\n return `COUNT(DISTINCT \"${column}\")`;\n }\n return `${this.aggFunction(type)}(\"${column}\")`;\n }\n\n private aggFunction(type: Exclude<MeasureType, 'count_distinct'>): string {\n switch (type) {\n case 'sum': return 'SUM';\n case 'count': return 'COUNT';\n case 'avg': return 'AVG';\n case 'min': return 'MIN';\n case 'max': return 'MAX';\n }\n }\n\n private compileFilter(filter: SemanticFilter): string {\n const field = `\"${filter.dimension}\"`;\n const value = filter.value;\n\n switch (filter.operator) {\n case 'equals':\n return `${field} = ${this.quoteValue(value)}`;\n case 'not_equals':\n return `${field} != ${this.quoteValue(value)}`;\n case 'contains':\n return `${field} LIKE '%${this.escapeString(String(value))}%'`;\n case 'gt':\n return `${field} > ${this.quoteValue(value)}`;\n case 'gte':\n return `${field} >= ${this.quoteValue(value)}`;\n case 'lt':\n return `${field} < ${this.quoteValue(value)}`;\n case 'lte':\n return `${field} <= ${this.quoteValue(value)}`;\n case 'in':\n return `${field} IN (${(value as Array<string | number>).map((v) => this.quoteValue(v)).join(', ')})`;\n case 'not_in':\n return `${field} NOT IN (${(value as Array<string | number>).map((v) => this.quoteValue(v)).join(', ')})`;\n default:\n throw new Error(`Unknown filter operator: ${filter.operator}`);\n }\n }\n\n private quoteValue(value: string | number | boolean | Array<string | number>): string {\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return String(value);\n return `'${this.escapeString(String(value))}'`;\n }\n\n private escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n}\n","import type { SemanticModel, SemanticQuery } from '@yamchart/schema';\n\nexport class SemanticValidationError extends Error {\n code: string;\n available?: string[];\n\n constructor(code: string, message: string, available?: string[]) {\n super(message);\n this.name = 'SemanticValidationError';\n this.code = code;\n this.available = available;\n }\n}\n\nexport function validateSemanticQuery(model: SemanticModel, query: SemanticQuery): void {\n // Validate model exists\n const entity = model.entities.find((e) => e.name === query.model);\n if (!entity) {\n throw new SemanticValidationError(\n 'unknown_model',\n `Unknown model '${query.model}'. Available models: ${model.entities.map((e) => e.name).join(', ')}`,\n model.entities.map((e) => e.name),\n );\n }\n\n const measureNames = entity.measures.map((m) => m.name);\n const dimensionNames = entity.dimensions.map((d) => d.name);\n const allFields = [...measureNames, ...dimensionNames];\n\n // Validate measures\n for (const m of query.measures) {\n if (!measureNames.includes(m)) {\n throw new SemanticValidationError(\n 'unknown_measure',\n `Unknown measure '${m}' on entity '${query.model}'. Available measures: ${measureNames.join(', ')}`,\n measureNames,\n );\n }\n }\n\n // Validate dimensions\n for (const d of query.dimensions) {\n if (!dimensionNames.includes(d)) {\n throw new SemanticValidationError(\n 'unknown_dimension',\n `Unknown dimension '${d}' on entity '${query.model}'. Available dimensions: ${dimensionNames.join(', ')}`,\n dimensionNames,\n );\n }\n }\n\n // Validate filter dimensions\n for (const f of query.filters) {\n if (!dimensionNames.includes(f.dimension)) {\n throw new SemanticValidationError(\n 'unknown_filter_dimension',\n `Unknown filter dimension '${f.dimension}' on entity '${query.model}'. Available dimensions: ${dimensionNames.join(', ')}`,\n dimensionNames,\n );\n }\n }\n\n // Validate order_by field\n if (query.order_by) {\n if (!allFields.includes(query.order_by.field)) {\n throw new SemanticValidationError(\n 'unknown_order_field',\n `Unknown order_by field '${query.order_by.field}' on entity '${query.model}'. Available fields: ${allFields.join(', ')}`,\n allFields,\n );\n }\n }\n}\n","// packages/query/src/semantic/loader.ts\nimport type { SemanticDefinition, CuratedMetric } from '@yamchart/schema';\nimport type { ResolvedEntity } from './metric-compiler.js';\n\nexport interface MetricListItem {\n name: string;\n label?: string;\n description?: string;\n entity: string;\n agg: string;\n synonyms: string[];\n format?: string;\n dimensions: string[];\n}\n\nexport interface ResolvedMetric {\n metric: CuratedMetric;\n entity: ResolvedEntity;\n}\n\nexport interface SemanticLayer {\n listMetrics(): MetricListItem[];\n resolveMetric(nameOrSynonym: string): ResolvedMetric | undefined;\n getEntity(name: string): ResolvedEntity | undefined;\n}\n\nfunction toResolvedEntity(def: SemanticDefinition, resolveTable: (model: string) => string): ResolvedEntity {\n const sourceRef = def.source.table ?? resolveTable(def.source.model!);\n return {\n name: def.entity,\n sourceRef,\n timeDimension: def.time_dimension,\n dimensions: def.dimensions,\n filters: def.filters ?? {},\n metrics: def.metrics,\n };\n}\n\nexport function buildSemanticLayer(\n defs: SemanticDefinition[],\n resolveTable: (model: string) => string = (m) => m,\n): SemanticLayer {\n const entities = defs.map((d) => toResolvedEntity(d, resolveTable));\n const byMetricKey = new Map<string, ResolvedMetric>();\n const list: MetricListItem[] = [];\n\n for (const entity of entities) {\n for (const metric of entity.metrics) {\n const resolved: ResolvedMetric = { metric, entity };\n byMetricKey.set(metric.name.toLowerCase(), resolved);\n for (const syn of metric.synonyms ?? []) {\n if (!byMetricKey.has(syn.toLowerCase())) byMetricKey.set(syn.toLowerCase(), resolved);\n }\n list.push({\n name: metric.name,\n label: metric.label,\n description: metric.description,\n entity: entity.name,\n agg: metric.agg,\n synonyms: metric.synonyms ?? [],\n format: metric.format,\n dimensions: entity.dimensions.map((d) => d.name),\n });\n }\n }\n\n return {\n listMetrics: () => list,\n resolveMetric: (key) => byMetricKey.get(key.toLowerCase()),\n getEntity: (name) => entities.find((e) => e.name === name),\n };\n}\n\n// --- Filesystem loader (project-level, reads semantic/*.yaml) ---\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { SemanticDefinitionSchema } from '@yamchart/schema';\n\n/** Load and validate all semantic/*.yaml files under a project dir. */\nexport function loadSemanticDefinitions(projectDir: string): SemanticDefinition[] {\n const dir = join(projectDir, 'semantic');\n if (!existsSync(dir)) return [];\n const defs: SemanticDefinition[] = [];\n for (const file of readdirSync(dir)) {\n if (!/\\.ya?ml$/.test(file)) continue;\n const raw = parseYaml(readFileSync(join(dir, file), 'utf8'));\n const entries = Array.isArray(raw?.entities) ? raw.entities : [raw];\n for (const entry of entries) {\n defs.push(SemanticDefinitionSchema.parse(entry));\n }\n }\n return defs;\n}\n","export type Grain = 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface Dialect {\n dateTrunc(column: string, grain: Grain): string;\n quoteIdent(ident: string): string;\n}\n\nconst stringFirst: Dialect = {\n dateTrunc: (col, grain) => `date_trunc('${grain}', ${col})`,\n quoteIdent: (id) => `\"${id}\"`,\n};\n\nconst bigquery: Dialect = {\n dateTrunc: (col, grain) => `DATE_TRUNC(${col}, ${grain.toUpperCase()})`,\n quoteIdent: (id) => '`' + id + '`',\n};\n\nexport function getDialect(connectionType: string | undefined): Dialect {\n switch ((connectionType || '').toLowerCase()) {\n case 'bigquery':\n return bigquery;\n case 'duckdb':\n case 'postgres':\n case 'snowflake':\n case 'mysql':\n return stringFirst;\n default:\n return stringFirst; // safe generic fallback\n }\n}\n","// packages/query/src/semantic/metric-compiler.ts\nimport type { CuratedMetric, CuratedDimension, NamedFilter } from '@yamchart/schema';\nimport { getDialect, type Grain } from './dialect.js';\nimport { expandDatePreset } from '../presets.js';\n\nexport interface ResolvedEntity {\n name: string;\n sourceRef: string;\n timeDimension?: string;\n dimensions: CuratedDimension[];\n filters: Record<string, NamedFilter>;\n metrics: CuratedMetric[];\n}\n\nexport interface MetricQuery {\n metrics: string[];\n dimensions?: string[];\n grain?: Grain;\n time_range?: { preset: string } | { start: string; end: string };\n filters?: Array<{ dimension: string; operator: string; value: unknown }>;\n order_by?: { field: string; direction?: 'asc' | 'desc' };\n limit?: number;\n}\n\nconst AGG_FN: Record<string, string> = {\n sum: 'SUM', count: 'COUNT', avg: 'AVG', min: 'MIN', max: 'MAX', count_distinct: 'COUNT(DISTINCT',\n};\n\nfunction aggExpr(metric: CuratedMetric, filterSql?: string): string {\n if (metric.sql) return `${metric.sql} AS ${metric.name}`;\n const inner = filterSql ? `CASE WHEN ${filterSql} THEN ${metric.field} END` : metric.field!;\n if (metric.agg === 'count_distinct') return `COUNT(DISTINCT ${inner}) AS ${metric.name}`;\n return `${AGG_FN[metric.agg]}(${inner}) AS ${metric.name}`;\n}\n\nfunction sqlLiteral(value: unknown): string {\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `(${value.map(sqlLiteral).join(', ')})`;\n return `'${String(value).replace(/'/g, \"''\")}'`;\n}\n\nconst OPERATORS: Record<string, string> = {\n equals: '=', not_equals: '!=', gt: '>', gte: '>=', lt: '<', lte: '<=', in: 'IN', not_in: 'NOT IN',\n};\n\n// time_range bounds are LLM-supplied; only accept a literal date or datetime so\n// nothing can break out of the quoted SQL string.\nconst DATE_RE = /^\\d{4}-\\d{2}-\\d{2}([ T]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?Z?)?$/;\n\nexport function compileMetricQuery(\n entity: ResolvedEntity,\n query: MetricQuery,\n connectionType: string | undefined,\n): { sql: string; metrics: CuratedMetric[]; groupCols: string[] } {\n const dialect = getDialect(connectionType);\n const select: string[] = [];\n const groupCols: string[] = [];\n\n // dimensions (with optional time grain on the entity time dimension)\n for (const dimName of query.dimensions ?? []) {\n const dim = entity.dimensions.find((d) => d.name === dimName);\n if (!dim) throw new Error(`Unknown dimension \"${dimName}\" on entity \"${entity.name}\".`);\n if (dim.type === 'time' && query.grain) {\n select.push(`${dialect.dateTrunc(dim.name, query.grain)} AS ${dim.name}`);\n } else {\n select.push(dim.name);\n }\n groupCols.push(dim.name);\n }\n // implicit time grain even without an explicit dimension\n if (query.grain && entity.timeDimension && !(query.dimensions ?? []).includes(entity.timeDimension)) {\n select.unshift(`${dialect.dateTrunc(entity.timeDimension, query.grain)} AS ${entity.timeDimension}`);\n groupCols.unshift(entity.timeDimension);\n }\n\n // metrics\n const resolvedMetrics: CuratedMetric[] = [];\n for (const metricName of query.metrics) {\n const metric = entity.metrics.find((m) => m.name === metricName);\n if (!metric) throw new Error(`Unknown metric \"${metricName}\" on entity \"${entity.name}\".`);\n const filterSql = metric.filter ? entity.filters[metric.filter]?.sql : undefined;\n if (metric.filter && !filterSql) {\n throw new Error(`Metric \"${metricName}\" references unknown filter \"${metric.filter}\".`);\n }\n select.push(aggExpr(metric, filterSql));\n resolvedMetrics.push(metric);\n }\n\n // WHERE\n const where: string[] = [];\n if (query.time_range && entity.timeDimension) {\n let start_date: string;\n let end_date: string;\n if ('preset' in query.time_range) {\n const expanded = expandDatePreset(query.time_range.preset);\n if (!expanded) {\n throw new Error(`Unrecognized date preset \"${query.time_range.preset}\".`);\n }\n start_date = expanded.start_date;\n end_date = expanded.end_date;\n } else {\n start_date = query.time_range.start;\n end_date = query.time_range.end;\n if (!DATE_RE.test(start_date) || !DATE_RE.test(end_date)) {\n throw new Error('time_range.start and time_range.end must be YYYY-MM-DD (optionally with a time).');\n }\n }\n where.push(`${entity.timeDimension} >= '${start_date}'`);\n where.push(`${entity.timeDimension} <= '${end_date}'`);\n }\n for (const f of query.filters ?? []) {\n const op = OPERATORS[f.operator];\n if (!op) throw new Error(`Unsupported filter operator \"${f.operator}\".`);\n // f.dimension is LLM-supplied — only allow declared dimensions, then quote it.\n if (!entity.dimensions.some((d) => d.name === f.dimension)) {\n throw new Error(`Unknown filter dimension \"${f.dimension}\" on entity \"${entity.name}\".`);\n }\n where.push(`${dialect.quoteIdent(f.dimension)} ${op} ${sqlLiteral(f.value)}`);\n }\n\n // assemble\n const lines = [`SELECT ${select.join(', ')}`, `FROM ${entity.sourceRef}`];\n if (where.length) lines.push(`WHERE ${where.join(' AND ')}`);\n if (groupCols.length) lines.push(`GROUP BY ${groupCols.map((_, i) => i + 1).join(', ')}`);\n if (query.order_by) {\n // order_by.field is LLM-supplied — only allow a selected column (a grouped\n // dimension or a metric alias), then quote it.\n const selectable = new Set([...groupCols, ...resolvedMetrics.map((m) => m.name)]);\n if (!selectable.has(query.order_by.field)) {\n throw new Error(`order_by.field \"${query.order_by.field}\" is not a selected column. Choose one of: ${[...selectable].join(', ')}.`);\n }\n lines.push(`ORDER BY ${dialect.quoteIdent(query.order_by.field)} ${(query.order_by.direction ?? 'asc').toUpperCase()}`);\n }\n lines.push(`LIMIT ${query.limit ?? 1000}`);\n\n return { sql: lines.join('\\n'), metrics: resolvedMetrics, groupCols };\n}\n"],"mappings":"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","names":["end","shiftFns","start","format"]}
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  createConnector,
11
11
  resolveConnection
12
- } from "./chunk-NXQ6ZO3V.js";
12
+ } from "./chunk-5FHV22X2.js";
13
13
 
14
14
  // src/commands/source-resolver.ts
15
15
  import { readFile as readFile2, access as access2 } from "fs/promises";
@@ -369,4 +369,4 @@ export {
369
369
  resolveTablesSource,
370
370
  resolveSearchSource
371
371
  };
372
- //# sourceMappingURL=chunk-H4L3FNLS.js.map
372
+ //# sourceMappingURL=chunk-ZBCQNWVN.js.map