drizzle-cube 0.4.30 → 0.4.31
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/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.d.ts +1 -1
- package/dist/adapters/express/index.js +7 -7
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.d.ts +1 -1
- package/dist/adapters/fastify/index.js +7 -7
- package/dist/adapters/{handler-D-2-6uLM.js → handler-BiVT5Sa4.js} +4 -4
- package/dist/adapters/{handler-B8vuFQYP.cjs → handler-GLMhjuwG.cjs} +2 -2
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.d.ts +1 -1
- package/dist/adapters/hono/index.js +3 -3
- package/dist/adapters/{mcp-transport-CuugoG8t.js → mcp-transport-Cs6gEFCi.js} +1254 -948
- package/dist/adapters/mcp-transport-nyTtswLM.cjs +254 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.d.ts +1 -1
- package/dist/adapters/nextjs/index.js +3 -3
- package/dist/adapters/{openai-DhLE0A9Z.cjs → openai-C5Brybjm.cjs} +1 -1
- package/dist/adapters/openai-D1zCEi6A.cjs +16 -0
- package/dist/adapters/{openai-CjBvA6mK.js → openai-DPuFtYsB.js} +659 -637
- package/dist/adapters/{openai-Zjw4Zo4R.js → openai-wU05wYGL.js} +1 -1
- package/dist/adapters/{utils-ChhNGUOF.js → utils-Dj1adfDc.js} +6 -3
- package/dist/adapters/{utils-CwJplXR5.cjs → utils-cb6OWP7J.cjs} +1 -1
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.d.ts +1 -1
- package/dist/adapters/utils.js +1 -1
- package/dist/client/charts.js +13 -13
- package/dist/client/chunks/{DashboardEditModal-C076pscL.js → DashboardEditModal-DenRJiYr.js} +11 -11
- package/dist/client/chunks/{DashboardEditModal-C076pscL.js.map → DashboardEditModal-DenRJiYr.js.map} +1 -1
- package/dist/client/chunks/{FieldSearchModal-C0DjSWk3.js → FieldSearchModal-BQS1v1up.js} +3 -3
- package/dist/client/chunks/{FieldSearchModal-C0DjSWk3.js.map → FieldSearchModal-BQS1v1up.js.map} +1 -1
- package/dist/client/chunks/{RetentionCombinedChart-DuGXc-AP.js → RetentionCombinedChart-D4Yf1TnQ.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-DuGXc-AP.js.map → RetentionCombinedChart-D4Yf1TnQ.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-DF0XntqC.js → analysis-builder-DG38V1gO.js} +14 -20
- package/dist/client/chunks/{analysis-builder-DF0XntqC.js.map → analysis-builder-DG38V1gO.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-2QhKYbs6.js → analysis-builder-shared-DaFu78dk.js} +19 -17
- package/dist/client/chunks/analysis-builder-shared-DaFu78dk.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-CNES9VBk.js → chart-activity-grid-wR2Twpo7.js} +9 -6
- package/dist/client/chunks/chart-activity-grid-wR2Twpo7.js.map +1 -0
- package/dist/client/chunks/{chart-area-CRJc3KOu.js → chart-area-e9ysnatQ.js} +2 -2
- package/dist/client/chunks/{chart-area-CRJc3KOu.js.map → chart-area-e9ysnatQ.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-DD2PjJ5n.js → chart-bar-Bx4oKlqo.js} +3 -3
- package/dist/client/chunks/{chart-bar-DD2PjJ5n.js.map → chart-bar-Bx4oKlqo.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-BcqleldJ.js → chart-box-plot-CVIi1aM5.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-BcqleldJ.js.map → chart-box-plot-CVIi1aM5.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-BmQkVk4K.js → chart-bubble-DvyG15UB.js} +2 -2
- package/dist/client/chunks/{chart-bubble-BmQkVk4K.js.map → chart-bubble-DvyG15UB.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-C3Rep469.js → chart-candlestick-caHyxB9O.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-C3Rep469.js.map → chart-candlestick-caHyxB9O.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-DehW1C1G.js → chart-data-table-B2m_6EZe.js} +2 -2
- package/dist/client/chunks/{chart-data-table-DehW1C1G.js.map → chart-data-table-B2m_6EZe.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-BjkpnG5g.js → chart-funnel-C9JRW79j.js} +2 -2
- package/dist/client/chunks/{chart-funnel-BjkpnG5g.js.map → chart-funnel-C9JRW79j.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-BWW_HEfg.js → chart-gauge-BLLJqeXo.js} +2 -2
- package/dist/client/chunks/{chart-gauge-BWW_HEfg.js.map → chart-gauge-BLLJqeXo.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-BWuOuDcm.js → chart-heat-map-f2fM2mDC.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-BWuOuDcm.js.map → chart-heat-map-f2fM2mDC.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-D5OHtDJx.js → chart-kpi-delta-S6qDEoJO.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-D5OHtDJx.js.map → chart-kpi-delta-S6qDEoJO.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-C9zH-aKC.js → chart-kpi-number-CEUBsVW2.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-C9zH-aKC.js.map → chart-kpi-number-CEUBsVW2.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-ChVn3S7j.js → chart-kpi-text-DgRig_jQ.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-ChVn3S7j.js.map → chart-kpi-text-DgRig_jQ.js.map} +1 -1
- package/dist/client/chunks/{chart-line-DOIMkP0b.js → chart-line-CPhQRMZ7.js} +4 -3
- package/dist/client/chunks/chart-line-CPhQRMZ7.js.map +1 -0
- package/dist/client/chunks/{chart-measure-profile-C6wrr9il.js → chart-measure-profile-CVlqGslU.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-C6wrr9il.js.map → chart-measure-profile-CVlqGslU.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-BU_FgwDc.js → chart-pie-DafSc9sE.js} +3 -3
- package/dist/client/chunks/{chart-pie-BU_FgwDc.js.map → chart-pie-DafSc9sE.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-DlufwnAX.js → chart-radar-Dz9F5k-B.js} +3 -3
- package/dist/client/chunks/{chart-radar-DlufwnAX.js.map → chart-radar-Dz9F5k-B.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-B5vS_Aw5.js → chart-radial-bar-N3MNUL7o.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar-B5vS_Aw5.js.map → chart-radial-bar-N3MNUL7o.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-FChb26UX.js → chart-sankey-8nRYnupt.js} +2 -2
- package/dist/client/chunks/{chart-sankey-FChb26UX.js.map → chart-sankey-8nRYnupt.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-DW0cAZ2H.js → chart-scatter-J2JNi88S.js} +3 -3
- package/dist/client/chunks/{chart-scatter-DW0cAZ2H.js.map → chart-scatter-J2JNi88S.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-Clf-6WxW.js → chart-sunburst-D1NFQjqk.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-Clf-6WxW.js.map → chart-sunburst-D1NFQjqk.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-p_VwUJPF.js → chart-tree-map-CbYjko2s.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-p_VwUJPF.js.map → chart-tree-map-CbYjko2s.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-jt44IQ-w.js → chart-waterfall-Z65TGMUO.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-jt44IQ-w.js.map → chart-waterfall-Z65TGMUO.js.map} +1 -1
- package/dist/client/chunks/{charts-core-CUVzf4cV.js → charts-core-CJlGzwsW.js} +2 -2
- package/dist/client/chunks/{charts-core-CUVzf4cV.js.map → charts-core-CJlGzwsW.js.map} +1 -1
- package/dist/client/chunks/{charts-loader-AGpph8_I.js → charts-loader-BI07yxaQ.js} +25 -25
- package/dist/client/chunks/{charts-loader-AGpph8_I.js.map → charts-loader-BI07yxaQ.js.map} +1 -1
- package/dist/client/chunks/{schema-visualization-ZugB4Io9.js → schema-visualization-DPL5_Tkh.js} +2 -2
- package/dist/client/chunks/{schema-visualization-ZugB4Io9.js.map → schema-visualization-DPL5_Tkh.js.map} +1 -1
- package/dist/client/chunks/{useDebounce-BQjNWndQ.js → useDebounce-DkuM7nQk.js} +4 -4
- package/dist/client/chunks/{useDebounce-BQjNWndQ.js.map → useDebounce-DkuM7nQk.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-c_bHxZe5.js → useExplainAI-RflLTDVL.js} +7 -7
- package/dist/client/chunks/useExplainAI-RflLTDVL.js.map +1 -0
- package/dist/client/chunks/{utils-A54Ny29G.js → utils--32ZtfbZ.js} +2 -2
- package/dist/client/chunks/{utils-A54Ny29G.js.map → utils--32ZtfbZ.js.map} +1 -1
- package/dist/client/chunks/{vendor-CoPBRumI.js → vendor-CZX7UVzM.js} +2 -2
- package/dist/client/chunks/{vendor-CoPBRumI.js.map → vendor-CZX7UVzM.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisModeErrorBoundary.d.ts +0 -1
- package/dist/client/components.js +3 -3
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +15 -15
- package/dist/client/providers.js +1 -1
- package/dist/client/utils.js +5 -5
- package/dist/client-bundle-stats.html +1 -1
- package/dist/server/index.cjs +41 -40
- package/dist/server/index.d.ts +43 -9
- package/dist/server/index.js +1421 -1112
- package/dist/server/openai-CucrxPHM.cjs +16 -0
- package/dist/server/{openai-CLsoLaue.cjs → openai-DiyuZ3ds.cjs} +1 -1
- package/dist/server/{openai-BPhmb8mi.js → openai-nZJcAzON.js} +659 -637
- package/dist/server/{openai-D1kZ5sdM.js → openai-owPdq1yN.js} +1 -1
- package/package.json +14 -4
- package/dist/adapters/mcp-transport-Dpp6hdZe.cjs +0 -253
- package/dist/adapters/openai-eJBw3LfQ.cjs +0 -16
- package/dist/client/chunks/analysis-builder-shared-2QhKYbs6.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-CNES9VBk.js.map +0 -1
- package/dist/client/chunks/chart-line-DOIMkP0b.js.map +0 -1
- package/dist/client/chunks/useExplainAI-c_bHxZe5.js.map +0 -1
- package/dist/server/openai-DkOKbVLC.cjs +0 -16
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as e, d as t, h as n, p as r, s as i } from "./utils-
|
|
1
|
+
import { c as e, d as t, h as n, p as r, s as i } from "./utils-Dj1adfDc.js";
|
|
2
2
|
import { a } from "./mcp-prompts-BAutSQYA.js";
|
|
3
3
|
//#region node_modules/drizzle-orm/entity.js
|
|
4
4
|
var o = Symbol.for("drizzle:entityKind");
|
|
@@ -196,7 +196,7 @@ var y = class extends l {
|
|
|
196
196
|
foreignKeyConfigs = [];
|
|
197
197
|
static [o] = "PgColumnBuilder";
|
|
198
198
|
array(e) {
|
|
199
|
-
return new
|
|
199
|
+
return new S(this.config.name, this, e);
|
|
200
200
|
}
|
|
201
201
|
references(e, t = {}) {
|
|
202
202
|
return this.foreignKeyConfigs.push({
|
|
@@ -264,16 +264,16 @@ var y = class extends l {
|
|
|
264
264
|
op(e) {
|
|
265
265
|
return this.indexConfig.opClass = e, this;
|
|
266
266
|
}
|
|
267
|
-
},
|
|
267
|
+
}, S = class extends y {
|
|
268
268
|
static [o] = "PgArrayBuilder";
|
|
269
269
|
constructor(e, t, n) {
|
|
270
270
|
super(e, "array", "PgArray"), this.config.baseBuilder = t, this.config.size = n;
|
|
271
271
|
}
|
|
272
272
|
build(e) {
|
|
273
273
|
let t = this.config.baseBuilder.build(e);
|
|
274
|
-
return new
|
|
274
|
+
return new ee(e, this.config, t);
|
|
275
275
|
}
|
|
276
|
-
},
|
|
276
|
+
}, ee = class e extends b {
|
|
277
277
|
constructor(e, t, n, r) {
|
|
278
278
|
super(e, t), this.baseColumn = n, this.range = r, this.size = t.size;
|
|
279
279
|
}
|
|
@@ -289,11 +289,11 @@ var y = class extends l {
|
|
|
289
289
|
let r = t.map((t) => t === null ? null : s(this.baseColumn, e) ? this.baseColumn.mapToDriverValue(t, !0) : this.baseColumn.mapToDriverValue(t));
|
|
290
290
|
return n ? r : v(r);
|
|
291
291
|
}
|
|
292
|
-
},
|
|
293
|
-
function
|
|
294
|
-
return !!e && typeof e == "function" &&
|
|
292
|
+
}, C = Symbol.for("drizzle:isPgEnum");
|
|
293
|
+
function w(e) {
|
|
294
|
+
return !!e && typeof e == "function" && C in e && e[C] === !0;
|
|
295
295
|
}
|
|
296
|
-
var
|
|
296
|
+
var T = class {
|
|
297
297
|
static [o] = "Subquery";
|
|
298
298
|
constructor(e, t, n, r = !1, i = []) {
|
|
299
299
|
this._ = {
|
|
@@ -305,37 +305,37 @@ var w = class {
|
|
|
305
305
|
usedTables: i
|
|
306
306
|
};
|
|
307
307
|
}
|
|
308
|
-
},
|
|
308
|
+
}, te = { startActiveSpan(e, t) {
|
|
309
309
|
return t();
|
|
310
|
-
} },
|
|
310
|
+
} }, E = Symbol.for("drizzle:ViewBaseConfig"), D = Symbol.for("drizzle:Schema"), O = Symbol.for("drizzle:Columns"), ne = Symbol.for("drizzle:ExtraConfigColumns"), k = Symbol.for("drizzle:OriginalName"), A = Symbol.for("drizzle:BaseName"), re = Symbol.for("drizzle:IsAlias"), ie = Symbol.for("drizzle:ExtraConfigBuilder"), ae = Symbol.for("drizzle:IsDrizzleTable"), j = class {
|
|
311
311
|
static [o] = "Table";
|
|
312
312
|
static Symbol = {
|
|
313
313
|
Name: u,
|
|
314
|
-
Schema:
|
|
315
|
-
OriginalName:
|
|
316
|
-
Columns:
|
|
317
|
-
ExtraConfigColumns:
|
|
318
|
-
BaseName:
|
|
319
|
-
IsAlias:
|
|
320
|
-
ExtraConfigBuilder:
|
|
314
|
+
Schema: D,
|
|
315
|
+
OriginalName: k,
|
|
316
|
+
Columns: O,
|
|
317
|
+
ExtraConfigColumns: ne,
|
|
318
|
+
BaseName: A,
|
|
319
|
+
IsAlias: re,
|
|
320
|
+
ExtraConfigBuilder: ie
|
|
321
321
|
};
|
|
322
322
|
[u];
|
|
323
|
-
[O];
|
|
324
|
-
[E];
|
|
325
|
-
[D];
|
|
326
|
-
[re];
|
|
327
323
|
[k];
|
|
328
|
-
[
|
|
329
|
-
[
|
|
330
|
-
[
|
|
324
|
+
[D];
|
|
325
|
+
[O];
|
|
326
|
+
[ne];
|
|
327
|
+
[A];
|
|
328
|
+
[re] = !1;
|
|
329
|
+
[ae] = !0;
|
|
330
|
+
[ie] = void 0;
|
|
331
331
|
constructor(e, t, n) {
|
|
332
|
-
this[u] = this[
|
|
332
|
+
this[u] = this[k] = e, this[D] = t, this[A] = n;
|
|
333
333
|
}
|
|
334
334
|
};
|
|
335
|
-
function
|
|
335
|
+
function oe(e) {
|
|
336
336
|
return e != null && typeof e.getSQL == "function";
|
|
337
337
|
}
|
|
338
|
-
function
|
|
338
|
+
function se(e) {
|
|
339
339
|
let t = {
|
|
340
340
|
sql: "",
|
|
341
341
|
params: []
|
|
@@ -343,32 +343,32 @@ function ce(e) {
|
|
|
343
343
|
for (let n of e) t.sql += n.sql, t.params.push(...n.params), n.typings?.length && (t.typings ||= [], t.typings.push(...n.typings));
|
|
344
344
|
return t;
|
|
345
345
|
}
|
|
346
|
-
var
|
|
346
|
+
var M = class {
|
|
347
347
|
static [o] = "StringChunk";
|
|
348
348
|
value;
|
|
349
349
|
constructor(e) {
|
|
350
350
|
this.value = Array.isArray(e) ? e : [e];
|
|
351
351
|
}
|
|
352
352
|
getSQL() {
|
|
353
|
-
return new
|
|
353
|
+
return new N([this]);
|
|
354
354
|
}
|
|
355
|
-
},
|
|
355
|
+
}, N = class e {
|
|
356
356
|
constructor(e) {
|
|
357
357
|
this.queryChunks = e;
|
|
358
|
-
for (let t of e) if (s(t,
|
|
359
|
-
let e = t[
|
|
360
|
-
this.usedTables.push(e === void 0 ? t[
|
|
358
|
+
for (let t of e) if (s(t, j)) {
|
|
359
|
+
let e = t[j.Symbol.Schema];
|
|
360
|
+
this.usedTables.push(e === void 0 ? t[j.Symbol.Name] : e + "." + t[j.Symbol.Name]);
|
|
361
361
|
}
|
|
362
362
|
}
|
|
363
363
|
static [o] = "SQL";
|
|
364
|
-
decoder =
|
|
364
|
+
decoder = ue;
|
|
365
365
|
shouldInlineParams = !1;
|
|
366
366
|
usedTables = [];
|
|
367
367
|
append(e) {
|
|
368
368
|
return this.queryChunks.push(...e.queryChunks), this;
|
|
369
369
|
}
|
|
370
370
|
toQuery(e) {
|
|
371
|
-
return
|
|
371
|
+
return te.startActiveSpan("drizzle.buildSQL", (t) => {
|
|
372
372
|
let n = this.buildQueryFromSourceParams(this.queryChunks, e);
|
|
373
373
|
return t?.setAttributes({
|
|
374
374
|
"drizzle.query.text": n.sql,
|
|
@@ -381,12 +381,12 @@ var j = class {
|
|
|
381
381
|
inlineParams: n.inlineParams || this.shouldInlineParams,
|
|
382
382
|
paramStartIndex: n.paramStartIndex || { value: 0 }
|
|
383
383
|
}), { casing: i, escapeName: a, escapeParam: o, prepareTyping: l, inlineParams: u, paramStartIndex: d } = r;
|
|
384
|
-
return
|
|
385
|
-
if (s(t,
|
|
384
|
+
return se(t.map((t) => {
|
|
385
|
+
if (s(t, M)) return {
|
|
386
386
|
sql: t.value.join(""),
|
|
387
387
|
params: []
|
|
388
388
|
};
|
|
389
|
-
if (s(t,
|
|
389
|
+
if (s(t, ce)) return {
|
|
390
390
|
sql: a(t.value),
|
|
391
391
|
params: []
|
|
392
392
|
};
|
|
@@ -395,18 +395,18 @@ var j = class {
|
|
|
395
395
|
params: []
|
|
396
396
|
};
|
|
397
397
|
if (Array.isArray(t)) {
|
|
398
|
-
let e = [new
|
|
399
|
-
for (let [n, r] of t.entries()) e.push(r), n < t.length - 1 && e.push(new
|
|
400
|
-
return e.push(new
|
|
398
|
+
let e = [new M("(")];
|
|
399
|
+
for (let [n, r] of t.entries()) e.push(r), n < t.length - 1 && e.push(new M(", "));
|
|
400
|
+
return e.push(new M(")")), this.buildQueryFromSourceParams(e, r);
|
|
401
401
|
}
|
|
402
402
|
if (s(t, e)) return this.buildQueryFromSourceParams(t.queryChunks, {
|
|
403
403
|
...r,
|
|
404
404
|
inlineParams: u || t.shouldInlineParams
|
|
405
405
|
});
|
|
406
|
-
if (s(t,
|
|
407
|
-
let e = t[
|
|
406
|
+
if (s(t, j)) {
|
|
407
|
+
let e = t[j.Symbol.Schema], n = t[j.Symbol.Name];
|
|
408
408
|
return {
|
|
409
|
-
sql: e === void 0 || t[
|
|
409
|
+
sql: e === void 0 || t[re] ? a(n) : a(e) + "." + a(n),
|
|
410
410
|
params: []
|
|
411
411
|
};
|
|
412
412
|
}
|
|
@@ -416,21 +416,21 @@ var j = class {
|
|
|
416
416
|
sql: a(e),
|
|
417
417
|
params: []
|
|
418
418
|
};
|
|
419
|
-
let r = t.table[
|
|
419
|
+
let r = t.table[j.Symbol.Schema];
|
|
420
420
|
return {
|
|
421
|
-
sql: t.table[
|
|
421
|
+
sql: t.table[re] || r === void 0 ? a(t.table[j.Symbol.Name]) + "." + a(e) : a(r) + "." + a(t.table[j.Symbol.Name]) + "." + a(e),
|
|
422
422
|
params: []
|
|
423
423
|
};
|
|
424
424
|
}
|
|
425
|
-
if (s(t,
|
|
426
|
-
let e = t[
|
|
425
|
+
if (s(t, me)) {
|
|
426
|
+
let e = t[E].schema, n = t[E].name;
|
|
427
427
|
return {
|
|
428
|
-
sql: e === void 0 || t[
|
|
428
|
+
sql: e === void 0 || t[E].isAlias ? a(n) : a(e) + "." + a(n),
|
|
429
429
|
params: []
|
|
430
430
|
};
|
|
431
431
|
}
|
|
432
|
-
if (s(t,
|
|
433
|
-
if (s(t.value,
|
|
432
|
+
if (s(t, P)) {
|
|
433
|
+
if (s(t.value, fe)) return {
|
|
434
434
|
sql: o(d.value++, t),
|
|
435
435
|
params: [t],
|
|
436
436
|
typings: ["none"]
|
|
@@ -448,31 +448,31 @@ var j = class {
|
|
|
448
448
|
typings: i
|
|
449
449
|
};
|
|
450
450
|
}
|
|
451
|
-
return s(t,
|
|
451
|
+
return s(t, fe) ? {
|
|
452
452
|
sql: o(d.value++, t),
|
|
453
453
|
params: [t],
|
|
454
454
|
typings: ["none"]
|
|
455
455
|
} : s(t, e.Aliased) && t.fieldAlias !== void 0 ? {
|
|
456
456
|
sql: a(t.fieldAlias),
|
|
457
457
|
params: []
|
|
458
|
-
} : s(t,
|
|
458
|
+
} : s(t, T) ? t._.isWith ? {
|
|
459
459
|
sql: a(t._.alias),
|
|
460
460
|
params: []
|
|
461
461
|
} : this.buildQueryFromSourceParams([
|
|
462
|
-
new
|
|
462
|
+
new M("("),
|
|
463
463
|
t._.sql,
|
|
464
|
-
new
|
|
465
|
-
new
|
|
466
|
-
], r) :
|
|
464
|
+
new M(") "),
|
|
465
|
+
new ce(t._.alias)
|
|
466
|
+
], r) : w(t) ? t.schema ? {
|
|
467
467
|
sql: a(t.schema) + "." + a(t.enumName),
|
|
468
468
|
params: []
|
|
469
469
|
} : {
|
|
470
470
|
sql: a(t.enumName),
|
|
471
471
|
params: []
|
|
472
|
-
} :
|
|
473
|
-
new
|
|
472
|
+
} : oe(t) ? t.shouldOmitSQLParens?.() ? this.buildQueryFromSourceParams([t.getSQL()], r) : this.buildQueryFromSourceParams([
|
|
473
|
+
new M("("),
|
|
474
474
|
t.getSQL(),
|
|
475
|
-
new
|
|
475
|
+
new M(")")
|
|
476
476
|
], r) : u ? {
|
|
477
477
|
sql: this.mapInlineParam(t, r),
|
|
478
478
|
params: []
|
|
@@ -508,72 +508,72 @@ var j = class {
|
|
|
508
508
|
if(e) {
|
|
509
509
|
return e ? this : void 0;
|
|
510
510
|
}
|
|
511
|
-
},
|
|
511
|
+
}, ce = class {
|
|
512
512
|
constructor(e) {
|
|
513
513
|
this.value = e;
|
|
514
514
|
}
|
|
515
515
|
static [o] = "Name";
|
|
516
516
|
brand;
|
|
517
517
|
getSQL() {
|
|
518
|
-
return new
|
|
518
|
+
return new N([this]);
|
|
519
519
|
}
|
|
520
520
|
};
|
|
521
|
-
function
|
|
521
|
+
function le(e) {
|
|
522
522
|
return typeof e == "object" && !!e && "mapToDriverValue" in e && typeof e.mapToDriverValue == "function";
|
|
523
523
|
}
|
|
524
|
-
var
|
|
524
|
+
var ue = { mapFromDriverValue: (e) => e }, de = { mapToDriverValue: (e) => e };
|
|
525
525
|
({
|
|
526
|
-
...
|
|
527
|
-
...
|
|
526
|
+
...ue,
|
|
527
|
+
...de
|
|
528
528
|
});
|
|
529
|
-
var
|
|
530
|
-
constructor(e, t =
|
|
529
|
+
var P = class {
|
|
530
|
+
constructor(e, t = de) {
|
|
531
531
|
this.value = e, this.encoder = t;
|
|
532
532
|
}
|
|
533
533
|
static [o] = "Param";
|
|
534
534
|
brand;
|
|
535
535
|
getSQL() {
|
|
536
|
-
return new
|
|
536
|
+
return new N([this]);
|
|
537
537
|
}
|
|
538
538
|
};
|
|
539
|
-
function
|
|
539
|
+
function F(e, ...t) {
|
|
540
540
|
let n = [];
|
|
541
|
-
(t.length > 0 || e.length > 0 && e[0] !== "") && n.push(new
|
|
542
|
-
for (let [r, i] of t.entries()) n.push(i, new
|
|
543
|
-
return new
|
|
541
|
+
(t.length > 0 || e.length > 0 && e[0] !== "") && n.push(new M(e[0]));
|
|
542
|
+
for (let [r, i] of t.entries()) n.push(i, new M(e[r + 1]));
|
|
543
|
+
return new N(n);
|
|
544
544
|
}
|
|
545
545
|
((e) => {
|
|
546
546
|
function t() {
|
|
547
|
-
return new
|
|
547
|
+
return new N([]);
|
|
548
548
|
}
|
|
549
549
|
e.empty = t;
|
|
550
550
|
function n(e) {
|
|
551
|
-
return new
|
|
551
|
+
return new N(e);
|
|
552
552
|
}
|
|
553
553
|
e.fromList = n;
|
|
554
554
|
function r(e) {
|
|
555
|
-
return new
|
|
555
|
+
return new N([new M(e)]);
|
|
556
556
|
}
|
|
557
557
|
e.raw = r;
|
|
558
558
|
function i(e, t) {
|
|
559
559
|
let n = [];
|
|
560
560
|
for (let [r, i] of e.entries()) r > 0 && t !== void 0 && n.push(t), n.push(i);
|
|
561
|
-
return new
|
|
561
|
+
return new N(n);
|
|
562
562
|
}
|
|
563
563
|
e.join = i;
|
|
564
564
|
function a(e) {
|
|
565
|
-
return new
|
|
565
|
+
return new ce(e);
|
|
566
566
|
}
|
|
567
567
|
e.identifier = a;
|
|
568
568
|
function o(e) {
|
|
569
|
-
return new
|
|
569
|
+
return new fe(e);
|
|
570
570
|
}
|
|
571
571
|
e.placeholder = o;
|
|
572
572
|
function s(e, t) {
|
|
573
|
-
return new
|
|
573
|
+
return new P(e, t);
|
|
574
574
|
}
|
|
575
575
|
e.param = s;
|
|
576
|
-
})(
|
|
576
|
+
})(F ||= {}), ((e) => {
|
|
577
577
|
class t {
|
|
578
578
|
constructor(e, t) {
|
|
579
579
|
this.sql = e, this.fieldAlias = t;
|
|
@@ -588,21 +588,21 @@ function N(e, ...t) {
|
|
|
588
588
|
}
|
|
589
589
|
}
|
|
590
590
|
e.Aliased = t;
|
|
591
|
-
})(
|
|
592
|
-
var
|
|
591
|
+
})(N ||= {});
|
|
592
|
+
var fe = class {
|
|
593
593
|
constructor(e) {
|
|
594
594
|
this.name = e;
|
|
595
595
|
}
|
|
596
596
|
static [o] = "Placeholder";
|
|
597
597
|
getSQL() {
|
|
598
|
-
return new
|
|
598
|
+
return new N([this]);
|
|
599
599
|
}
|
|
600
|
-
},
|
|
600
|
+
}, pe = Symbol.for("drizzle:IsDrizzleView"), me = class {
|
|
601
601
|
static [o] = "View";
|
|
602
|
-
[
|
|
603
|
-
[
|
|
602
|
+
[E];
|
|
603
|
+
[pe] = !0;
|
|
604
604
|
constructor({ name: e, schema: t, selectedFields: n, query: r }) {
|
|
605
|
-
this[
|
|
605
|
+
this[E] = {
|
|
606
606
|
name: e,
|
|
607
607
|
originalName: e,
|
|
608
608
|
schema: t,
|
|
@@ -613,96 +613,96 @@ var P = class {
|
|
|
613
613
|
};
|
|
614
614
|
}
|
|
615
615
|
getSQL() {
|
|
616
|
-
return new
|
|
616
|
+
return new N([this]);
|
|
617
617
|
}
|
|
618
618
|
};
|
|
619
619
|
c.prototype.getSQL = function() {
|
|
620
|
-
return new
|
|
621
|
-
},
|
|
622
|
-
return new
|
|
623
|
-
},
|
|
624
|
-
return new
|
|
620
|
+
return new N([this]);
|
|
621
|
+
}, j.prototype.getSQL = function() {
|
|
622
|
+
return new N([this]);
|
|
623
|
+
}, T.prototype.getSQL = function() {
|
|
624
|
+
return new N([this]);
|
|
625
625
|
};
|
|
626
626
|
//#endregion
|
|
627
627
|
//#region node_modules/drizzle-orm/sql/expressions/conditions.js
|
|
628
|
-
function
|
|
629
|
-
return
|
|
628
|
+
function I(e, t) {
|
|
629
|
+
return le(t) && !oe(e) && !s(e, P) && !s(e, fe) && !s(e, c) && !s(e, j) && !s(e, me) ? new P(e, t) : e;
|
|
630
630
|
}
|
|
631
|
-
var
|
|
632
|
-
function
|
|
631
|
+
var L = (e, t) => F`${e} = ${I(t, e)}`, he = (e, t) => F`${e} <> ${I(t, e)}`;
|
|
632
|
+
function R(...e) {
|
|
633
633
|
let t = e.filter((e) => e !== void 0);
|
|
634
|
-
if (t.length !== 0) return t.length === 1 ? new
|
|
635
|
-
new
|
|
636
|
-
|
|
637
|
-
new
|
|
634
|
+
if (t.length !== 0) return t.length === 1 ? new N(t) : new N([
|
|
635
|
+
new M("("),
|
|
636
|
+
F.join(t, new M(" and ")),
|
|
637
|
+
new M(")")
|
|
638
638
|
]);
|
|
639
639
|
}
|
|
640
|
-
function
|
|
640
|
+
function ge(...e) {
|
|
641
641
|
let t = e.filter((e) => e !== void 0);
|
|
642
|
-
if (t.length !== 0) return t.length === 1 ? new
|
|
643
|
-
new
|
|
644
|
-
|
|
645
|
-
new
|
|
642
|
+
if (t.length !== 0) return t.length === 1 ? new N(t) : new N([
|
|
643
|
+
new M("("),
|
|
644
|
+
F.join(t, new M(" or ")),
|
|
645
|
+
new M(")")
|
|
646
646
|
]);
|
|
647
647
|
}
|
|
648
|
-
var
|
|
648
|
+
var _e = (e, t) => F`${e} > ${I(t, e)}`, z = (e, t) => F`${e} >= ${I(t, e)}`, ve = (e, t) => F`${e} < ${I(t, e)}`, B = (e, t) => F`${e} <= ${I(t, e)}`;
|
|
649
|
+
function ye(e, t) {
|
|
650
|
+
return Array.isArray(t) ? t.length === 0 ? F`false` : F`${e} in ${t.map((t) => I(t, e))}` : F`${e} in ${I(t, e)}`;
|
|
651
|
+
}
|
|
649
652
|
function be(e, t) {
|
|
650
|
-
return Array.isArray(t) ? t.length === 0 ?
|
|
653
|
+
return Array.isArray(t) ? t.length === 0 ? F`true` : F`${e} not in ${t.map((t) => I(t, e))}` : F`${e} not in ${I(t, e)}`;
|
|
651
654
|
}
|
|
652
|
-
function xe(e
|
|
653
|
-
return
|
|
655
|
+
function xe(e) {
|
|
656
|
+
return F`${e} is null`;
|
|
654
657
|
}
|
|
655
658
|
function Se(e) {
|
|
656
|
-
return
|
|
657
|
-
}
|
|
658
|
-
function Ce(e) {
|
|
659
|
-
return N`${e} is not null`;
|
|
659
|
+
return F`${e} is not null`;
|
|
660
660
|
}
|
|
661
|
-
function
|
|
661
|
+
function Ce(e, t) {
|
|
662
662
|
if (Array.isArray(t)) {
|
|
663
663
|
if (t.length === 0) throw Error("arrayContains requires at least one value");
|
|
664
|
-
return
|
|
664
|
+
return F`${e} @> ${F`${I(t, e)}`}`;
|
|
665
665
|
}
|
|
666
|
-
return
|
|
666
|
+
return F`${e} @> ${I(t, e)}`;
|
|
667
667
|
}
|
|
668
|
-
function
|
|
668
|
+
function we(e, t) {
|
|
669
669
|
if (Array.isArray(t)) {
|
|
670
670
|
if (t.length === 0) throw Error("arrayContained requires at least one value");
|
|
671
|
-
return
|
|
671
|
+
return F`${e} <@ ${F`${I(t, e)}`}`;
|
|
672
672
|
}
|
|
673
|
-
return
|
|
673
|
+
return F`${e} <@ ${I(t, e)}`;
|
|
674
674
|
}
|
|
675
|
-
function
|
|
675
|
+
function Te(e, t) {
|
|
676
676
|
if (Array.isArray(t)) {
|
|
677
677
|
if (t.length === 0) throw Error("arrayOverlaps requires at least one value");
|
|
678
|
-
return
|
|
678
|
+
return F`${e} && ${F`${I(t, e)}`}`;
|
|
679
679
|
}
|
|
680
|
-
return
|
|
680
|
+
return F`${e} && ${I(t, e)}`;
|
|
681
681
|
}
|
|
682
682
|
//#endregion
|
|
683
683
|
//#region node_modules/drizzle-orm/sql/expressions/select.js
|
|
684
|
-
function
|
|
685
|
-
return
|
|
684
|
+
function Ee(e) {
|
|
685
|
+
return F`${e} asc`;
|
|
686
686
|
}
|
|
687
|
-
function
|
|
688
|
-
return
|
|
687
|
+
function De(e) {
|
|
688
|
+
return F`${e} desc`;
|
|
689
689
|
}
|
|
690
690
|
//#endregion
|
|
691
691
|
//#region node_modules/drizzle-orm/sql/functions/aggregate.js
|
|
692
|
-
function
|
|
693
|
-
return
|
|
694
|
-
}
|
|
695
|
-
function Ae(e) {
|
|
696
|
-
return N`count(distinct ${e})`.mapWith(Number);
|
|
692
|
+
function Oe(e) {
|
|
693
|
+
return F`count(${e || F.raw("*")})`.mapWith(Number);
|
|
697
694
|
}
|
|
698
|
-
function
|
|
699
|
-
return
|
|
695
|
+
function ke(e) {
|
|
696
|
+
return F`count(distinct ${e})`.mapWith(Number);
|
|
700
697
|
}
|
|
701
698
|
function V(e) {
|
|
702
|
-
return
|
|
699
|
+
return F`sum(${e})`.mapWith(String);
|
|
703
700
|
}
|
|
704
701
|
function H(e) {
|
|
705
|
-
return
|
|
702
|
+
return F`max(${e})`.mapWith(s(e, c) ? e : String);
|
|
703
|
+
}
|
|
704
|
+
function Ae(e) {
|
|
705
|
+
return F`min(${e})`.mapWith(s(e, c) ? e : String);
|
|
706
706
|
}
|
|
707
707
|
//#endregion
|
|
708
708
|
//#region src/server/adapters/base-adapter.ts
|
|
@@ -746,73 +746,73 @@ var U = class {
|
|
|
746
746
|
let t = this.parseISODuration(e), n = [];
|
|
747
747
|
t.years && n.push(`${t.years} years`), t.months && n.push(`${t.months} months`), t.days && n.push(`${t.days} days`), t.hours && n.push(`${t.hours} hours`), t.minutes && n.push(`${t.minutes} minutes`), t.seconds && n.push(`${t.seconds} seconds`);
|
|
748
748
|
let r = n.join(" ") || "0 seconds";
|
|
749
|
-
return
|
|
749
|
+
return F`INTERVAL '${F.raw(r)}'`;
|
|
750
750
|
}
|
|
751
751
|
buildTimeDifferenceSeconds(e, t) {
|
|
752
|
-
return
|
|
752
|
+
return F`EXTRACT(EPOCH FROM (${e} - ${t}))`;
|
|
753
753
|
}
|
|
754
754
|
buildDateAddInterval(e, t) {
|
|
755
|
-
return
|
|
755
|
+
return F`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
756
756
|
}
|
|
757
757
|
buildConditionalAggregation(e, t, n) {
|
|
758
758
|
let r = e.toUpperCase();
|
|
759
|
-
return e === "count" && !t ?
|
|
759
|
+
return e === "count" && !t ? F`COUNT(*) FILTER (WHERE ${n})` : F`${F.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
760
760
|
}
|
|
761
761
|
buildDateDiffPeriods(e, t, n) {
|
|
762
762
|
switch (n) {
|
|
763
|
-
case "day": return
|
|
764
|
-
case "week": return
|
|
765
|
-
case "month": return
|
|
763
|
+
case "day": return F`(${t}::date - ${e}::date)`;
|
|
764
|
+
case "week": return F`FLOOR((${t}::date - ${e}::date) / 7)`;
|
|
765
|
+
case "month": return F`(EXTRACT(YEAR FROM AGE(${t}::timestamp, ${e}::timestamp)) * 12 + EXTRACT(MONTH FROM AGE(${t}::timestamp, ${e}::timestamp)))::integer`;
|
|
766
766
|
default: throw Error(`Unsupported date diff unit: ${n}`);
|
|
767
767
|
}
|
|
768
768
|
}
|
|
769
769
|
buildPeriodSeriesSubquery(e) {
|
|
770
|
-
return
|
|
770
|
+
return F`(SELECT generate_series(0, ${e}) as period_number) p`;
|
|
771
771
|
}
|
|
772
772
|
buildTimeDimension(e, t) {
|
|
773
773
|
switch (e) {
|
|
774
|
-
case "year": return
|
|
775
|
-
case "quarter": return
|
|
776
|
-
case "month": return
|
|
777
|
-
case "week": return
|
|
778
|
-
case "day": return
|
|
779
|
-
case "hour": return
|
|
780
|
-
case "minute": return
|
|
781
|
-
case "second": return
|
|
774
|
+
case "year": return F`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
775
|
+
case "quarter": return F`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
776
|
+
case "month": return F`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
777
|
+
case "week": return F`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
778
|
+
case "day": return F`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
779
|
+
case "hour": return F`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
780
|
+
case "minute": return F`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
781
|
+
case "second": return F`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
782
782
|
default: return t;
|
|
783
783
|
}
|
|
784
784
|
}
|
|
785
785
|
buildStringCondition(e, t, n) {
|
|
786
786
|
switch (t) {
|
|
787
|
-
case "contains": return
|
|
788
|
-
case "notContains": return
|
|
789
|
-
case "startsWith": return
|
|
790
|
-
case "endsWith": return
|
|
791
|
-
case "like": return
|
|
792
|
-
case "notLike": return
|
|
793
|
-
case "ilike": return
|
|
794
|
-
case "regex": return
|
|
795
|
-
case "notRegex": return
|
|
787
|
+
case "contains": return F`${e} ILIKE ${`%${n}%`}`;
|
|
788
|
+
case "notContains": return F`${e} NOT ILIKE ${`%${n}%`}`;
|
|
789
|
+
case "startsWith": return F`${e} ILIKE ${`${n}%`}`;
|
|
790
|
+
case "endsWith": return F`${e} ILIKE ${`%${n}`}`;
|
|
791
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
792
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
793
|
+
case "ilike": return F`${e} ILIKE ${n}`;
|
|
794
|
+
case "regex": return F`${e} ~* ${n}`;
|
|
795
|
+
case "notRegex": return F`${e} !~* ${n}`;
|
|
796
796
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
797
797
|
}
|
|
798
798
|
}
|
|
799
799
|
castToType(e, t) {
|
|
800
800
|
switch (t) {
|
|
801
|
-
case "timestamp": return
|
|
802
|
-
case "decimal": return
|
|
803
|
-
case "integer": return
|
|
801
|
+
case "timestamp": return F`${e}::timestamp`;
|
|
802
|
+
case "decimal": return F`${e}::decimal`;
|
|
803
|
+
case "integer": return F`${e}::integer`;
|
|
804
804
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
805
805
|
}
|
|
806
806
|
}
|
|
807
807
|
buildAvg(e) {
|
|
808
|
-
return
|
|
808
|
+
return F`COALESCE(AVG(${e}), 0)`;
|
|
809
809
|
}
|
|
810
810
|
buildCaseWhen(e, t) {
|
|
811
|
-
let n = e.map((e) =>
|
|
812
|
-
return t === void 0 ?
|
|
811
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
812
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
813
813
|
}
|
|
814
814
|
buildBooleanLiteral(e) {
|
|
815
|
-
return e ?
|
|
815
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
816
816
|
}
|
|
817
817
|
convertFilterValue(e) {
|
|
818
818
|
return e;
|
|
@@ -834,40 +834,41 @@ var U = class {
|
|
|
834
834
|
supportsWindowFunctions: !0,
|
|
835
835
|
supportsFrameClause: !0,
|
|
836
836
|
supportsLateralJoins: !0,
|
|
837
|
-
supportsPercentileSubqueries: !0
|
|
837
|
+
supportsPercentileSubqueries: !0,
|
|
838
|
+
supportsDerivedTablesInCTE: !0
|
|
838
839
|
};
|
|
839
840
|
}
|
|
840
841
|
buildStddev(e, t = !1) {
|
|
841
842
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
842
|
-
return
|
|
843
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
843
844
|
}
|
|
844
845
|
buildVariance(e, t = !1) {
|
|
845
846
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
846
|
-
return
|
|
847
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
847
848
|
}
|
|
848
849
|
buildPercentile(e, t) {
|
|
849
|
-
return
|
|
850
|
+
return F`PERCENTILE_CONT(${t / 100}) WITHIN GROUP (ORDER BY ${e})`;
|
|
850
851
|
}
|
|
851
852
|
buildWindowFunction(e, t, n, r, i) {
|
|
852
|
-
let a = n && n.length > 0 ?
|
|
853
|
+
let a = n && n.length > 0 ? F`PARTITION BY ${F.join(n, F`, `)}` : F``, o = r && r.length > 0 ? F`ORDER BY ${F.join(r.map((e) => e.direction === "desc" ? F`${e.field} DESC` : F`${e.field} ASC`), F`, `)}` : F``, s = F``;
|
|
853
854
|
if (i?.frame) {
|
|
854
855
|
let { type: e, start: t, end: n } = i.frame, r = e.toUpperCase(), a = t === "unbounded" ? "UNBOUNDED PRECEDING" : typeof t == "number" ? `${t} PRECEDING` : "CURRENT ROW", o = n === "unbounded" ? "UNBOUNDED FOLLOWING" : n === "current" ? "CURRENT ROW" : typeof n == "number" ? `${n} FOLLOWING` : "CURRENT ROW";
|
|
855
|
-
s =
|
|
856
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
856
857
|
}
|
|
857
858
|
let c = [];
|
|
858
859
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
859
|
-
let l =
|
|
860
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
860
861
|
switch (e) {
|
|
861
|
-
case "lag": return
|
|
862
|
-
case "lead": return
|
|
863
|
-
case "rank": return
|
|
864
|
-
case "denseRank": return
|
|
865
|
-
case "rowNumber": return
|
|
866
|
-
case "ntile": return
|
|
867
|
-
case "firstValue": return
|
|
868
|
-
case "lastValue": return
|
|
869
|
-
case "movingAvg": return
|
|
870
|
-
case "movingSum": return
|
|
862
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
863
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
864
|
+
case "rank": return F`RANK() ${l}`;
|
|
865
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
866
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
867
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
868
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
869
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
870
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
871
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
871
872
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
872
873
|
}
|
|
873
874
|
}
|
|
@@ -880,25 +881,25 @@ var U = class {
|
|
|
880
881
|
}
|
|
881
882
|
buildIntervalFromISO(e) {
|
|
882
883
|
let t = this.parseISODuration(e), n = [];
|
|
883
|
-
return t.years && n.push(`${t.years} YEAR`), t.months && n.push(`${t.months} MONTH`), t.days && n.push(`${t.days} DAY`), t.hours && n.push(`${t.hours} HOUR`), t.minutes && n.push(`${t.minutes} MINUTE`), t.seconds && n.push(`${t.seconds} SECOND`),
|
|
884
|
+
return t.years && n.push(`${t.years} YEAR`), t.months && n.push(`${t.months} MONTH`), t.days && n.push(`${t.days} DAY`), t.hours && n.push(`${t.hours} HOUR`), t.minutes && n.push(`${t.minutes} MINUTE`), t.seconds && n.push(`${t.seconds} SECOND`), F`${this.durationToSeconds(e)}`;
|
|
884
885
|
}
|
|
885
886
|
buildTimeDifferenceSeconds(e, t) {
|
|
886
|
-
return
|
|
887
|
+
return F`TIMESTAMPDIFF(SECOND, ${t}, ${e})`;
|
|
887
888
|
}
|
|
888
889
|
buildDateAddInterval(e, t) {
|
|
889
890
|
let n = this.parseISODuration(t), r = e;
|
|
890
|
-
return n.years && (r =
|
|
891
|
+
return n.years && (r = F`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`), n.months && (r = F`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`), n.days && (r = F`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`), n.hours && (r = F`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`), n.minutes && (r = F`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`), n.seconds && (r = F`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`), r;
|
|
891
892
|
}
|
|
892
893
|
buildConditionalAggregation(e, t, n) {
|
|
893
894
|
let r = e.toUpperCase();
|
|
894
|
-
return e === "count" && !t ?
|
|
895
|
+
return e === "count" && !t ? F`COUNT(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
895
896
|
}
|
|
896
897
|
buildDateDiffPeriods(e, t, n) {
|
|
897
898
|
let r = n.toUpperCase();
|
|
898
|
-
return
|
|
899
|
+
return F`TIMESTAMPDIFF(${F.raw(r)}, ${e}, ${t})`;
|
|
899
900
|
}
|
|
900
901
|
buildPeriodSeriesSubquery(e) {
|
|
901
|
-
return
|
|
902
|
+
return F`(
|
|
902
903
|
WITH RECURSIVE periods(period_number) AS (
|
|
903
904
|
SELECT 0
|
|
904
905
|
UNION ALL
|
|
@@ -919,45 +920,45 @@ var U = class {
|
|
|
919
920
|
second: "%Y-%m-%d %H:%i:%s"
|
|
920
921
|
};
|
|
921
922
|
switch (e) {
|
|
922
|
-
case "quarter": return
|
|
923
|
-
case "week": return
|
|
923
|
+
case "quarter": return F`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;
|
|
924
|
+
case "week": return F`DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY)`;
|
|
924
925
|
default: {
|
|
925
926
|
let r = n[e];
|
|
926
|
-
return r ?
|
|
927
|
+
return r ? F`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')` : t;
|
|
927
928
|
}
|
|
928
929
|
}
|
|
929
930
|
}
|
|
930
931
|
buildStringCondition(e, t, n) {
|
|
931
932
|
switch (t) {
|
|
932
|
-
case "contains": return
|
|
933
|
-
case "notContains": return
|
|
934
|
-
case "startsWith": return
|
|
935
|
-
case "endsWith": return
|
|
936
|
-
case "like": return
|
|
937
|
-
case "notLike": return
|
|
938
|
-
case "ilike": return
|
|
939
|
-
case "regex": return
|
|
940
|
-
case "notRegex": return
|
|
933
|
+
case "contains": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
934
|
+
case "notContains": return F`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
935
|
+
case "startsWith": return F`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
936
|
+
case "endsWith": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
937
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
938
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
939
|
+
case "ilike": return F`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
940
|
+
case "regex": return F`${e} REGEXP ${n}`;
|
|
941
|
+
case "notRegex": return F`${e} NOT REGEXP ${n}`;
|
|
941
942
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
942
943
|
}
|
|
943
944
|
}
|
|
944
945
|
castToType(e, t) {
|
|
945
946
|
switch (t) {
|
|
946
|
-
case "timestamp": return
|
|
947
|
-
case "decimal": return
|
|
948
|
-
case "integer": return
|
|
947
|
+
case "timestamp": return F`CAST(${e} AS DATETIME)`;
|
|
948
|
+
case "decimal": return F`CAST(${e} AS DECIMAL(10,2))`;
|
|
949
|
+
case "integer": return F`CAST(${e} AS SIGNED INTEGER)`;
|
|
949
950
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
950
951
|
}
|
|
951
952
|
}
|
|
952
953
|
buildAvg(e) {
|
|
953
|
-
return
|
|
954
|
+
return F`IFNULL(AVG(${e}), 0)`;
|
|
954
955
|
}
|
|
955
956
|
buildCaseWhen(e, t) {
|
|
956
|
-
let n = e.map((e) =>
|
|
957
|
-
return t === void 0 ?
|
|
957
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
958
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
958
959
|
}
|
|
959
960
|
buildBooleanLiteral(e) {
|
|
960
|
-
return e ?
|
|
961
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
961
962
|
}
|
|
962
963
|
convertFilterValue(e) {
|
|
963
964
|
return e;
|
|
@@ -979,40 +980,41 @@ var U = class {
|
|
|
979
980
|
supportsWindowFunctions: !0,
|
|
980
981
|
supportsFrameClause: !0,
|
|
981
982
|
supportsLateralJoins: !0,
|
|
982
|
-
supportsPercentileSubqueries: !1
|
|
983
|
+
supportsPercentileSubqueries: !1,
|
|
984
|
+
supportsDerivedTablesInCTE: !0
|
|
983
985
|
};
|
|
984
986
|
}
|
|
985
987
|
buildStddev(e, t = !1) {
|
|
986
988
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
987
|
-
return
|
|
989
|
+
return F`IFNULL(${F.raw(n)}(${e}), 0)`;
|
|
988
990
|
}
|
|
989
991
|
buildVariance(e, t = !1) {
|
|
990
992
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
991
|
-
return
|
|
993
|
+
return F`IFNULL(${F.raw(n)}(${e}), 0)`;
|
|
992
994
|
}
|
|
993
995
|
buildPercentile(e, t) {
|
|
994
996
|
return null;
|
|
995
997
|
}
|
|
996
998
|
buildWindowFunction(e, t, n, r, i) {
|
|
997
|
-
let a = n && n.length > 0 ?
|
|
999
|
+
let a = n && n.length > 0 ? F`PARTITION BY ${F.join(n, F`, `)}` : F``, o = r && r.length > 0 ? F`ORDER BY ${F.join(r.map((e) => e.direction === "desc" ? F`${e.field} DESC` : F`${e.field} ASC`), F`, `)}` : F``, s = F``;
|
|
998
1000
|
if (i?.frame) {
|
|
999
1001
|
let { type: e, start: t, end: n } = i.frame, r = e.toUpperCase(), a = t === "unbounded" ? "UNBOUNDED PRECEDING" : typeof t == "number" ? `${t} PRECEDING` : "CURRENT ROW", o = n === "unbounded" ? "UNBOUNDED FOLLOWING" : n === "current" ? "CURRENT ROW" : typeof n == "number" ? `${n} FOLLOWING` : "CURRENT ROW";
|
|
1000
|
-
s =
|
|
1002
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1001
1003
|
}
|
|
1002
1004
|
let c = [];
|
|
1003
1005
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1004
|
-
let l =
|
|
1006
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1005
1007
|
switch (e) {
|
|
1006
|
-
case "lag": return
|
|
1007
|
-
case "lead": return
|
|
1008
|
-
case "rank": return
|
|
1009
|
-
case "denseRank": return
|
|
1010
|
-
case "rowNumber": return
|
|
1011
|
-
case "ntile": return
|
|
1012
|
-
case "firstValue": return
|
|
1013
|
-
case "lastValue": return
|
|
1014
|
-
case "movingAvg": return
|
|
1015
|
-
case "movingSum": return
|
|
1008
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1009
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1010
|
+
case "rank": return F`RANK() ${l}`;
|
|
1011
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1012
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1013
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1014
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1015
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1016
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1017
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1016
1018
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1017
1019
|
}
|
|
1018
1020
|
}
|
|
@@ -1024,28 +1026,28 @@ var U = class {
|
|
|
1024
1026
|
return !1;
|
|
1025
1027
|
}
|
|
1026
1028
|
buildIntervalFromISO(e) {
|
|
1027
|
-
return
|
|
1029
|
+
return F`${this.durationToSeconds(e)}`;
|
|
1028
1030
|
}
|
|
1029
1031
|
buildTimeDifferenceSeconds(e, t) {
|
|
1030
|
-
return
|
|
1032
|
+
return F`(${e} - ${t})`;
|
|
1031
1033
|
}
|
|
1032
1034
|
buildDateAddInterval(e, t) {
|
|
1033
|
-
return
|
|
1035
|
+
return F`(${e} + ${this.durationToSeconds(t)})`;
|
|
1034
1036
|
}
|
|
1035
1037
|
buildConditionalAggregation(e, t, n) {
|
|
1036
1038
|
let r = e.toUpperCase();
|
|
1037
|
-
return e === "count" && !t ?
|
|
1039
|
+
return e === "count" && !t ? F`COUNT(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1038
1040
|
}
|
|
1039
1041
|
buildDateDiffPeriods(e, t, n) {
|
|
1040
1042
|
switch (n) {
|
|
1041
|
-
case "day": return
|
|
1042
|
-
case "week": return
|
|
1043
|
-
case "month": return
|
|
1043
|
+
case "day": return F`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;
|
|
1044
|
+
case "week": return F`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;
|
|
1045
|
+
case "month": return F`((CAST(strftime('%Y', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%Y', datetime(${e}, 'unixepoch')) AS INTEGER)) * 12 + (CAST(strftime('%m', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%m', datetime(${e}, 'unixepoch')) AS INTEGER)))`;
|
|
1044
1046
|
default: throw Error(`Unsupported date diff unit for SQLite: ${n}`);
|
|
1045
1047
|
}
|
|
1046
1048
|
}
|
|
1047
1049
|
buildPeriodSeriesSubquery(e) {
|
|
1048
|
-
return
|
|
1050
|
+
return F`(
|
|
1049
1051
|
WITH RECURSIVE periods(period_number) AS (
|
|
1050
1052
|
SELECT 0
|
|
1051
1053
|
UNION ALL
|
|
@@ -1056,55 +1058,55 @@ var U = class {
|
|
|
1056
1058
|
}
|
|
1057
1059
|
buildTimeDimension(e, t) {
|
|
1058
1060
|
switch (e) {
|
|
1059
|
-
case "year": return
|
|
1061
|
+
case "year": return F`datetime(${t}, 'unixepoch', 'start of year')`;
|
|
1060
1062
|
case "quarter": {
|
|
1061
|
-
let e =
|
|
1062
|
-
return
|
|
1063
|
+
let e = F`datetime(${t}, 'unixepoch')`;
|
|
1064
|
+
return F`datetime(${e}, 'start of year',
|
|
1063
1065
|
'+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`;
|
|
1064
1066
|
}
|
|
1065
|
-
case "month": return
|
|
1066
|
-
case "week": return
|
|
1067
|
-
case "day": return
|
|
1068
|
-
case "hour": return
|
|
1069
|
-
case "minute": return
|
|
1070
|
-
case "second": return
|
|
1071
|
-
default: return
|
|
1067
|
+
case "month": return F`datetime(${t}, 'unixepoch', 'start of month')`;
|
|
1068
|
+
case "week": return F`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;
|
|
1069
|
+
case "day": return F`datetime(${t}, 'unixepoch', 'start of day')`;
|
|
1070
|
+
case "hour": return F`datetime(strftime('%Y-%m-%d %H:00:00', ${F`datetime(${t}, 'unixepoch')`}))`;
|
|
1071
|
+
case "minute": return F`datetime(strftime('%Y-%m-%d %H:%M:00', ${F`datetime(${t}, 'unixepoch')`}))`;
|
|
1072
|
+
case "second": return F`datetime(strftime('%Y-%m-%d %H:%M:%S', ${F`datetime(${t}, 'unixepoch')`}))`;
|
|
1073
|
+
default: return F`datetime(${t}, 'unixepoch')`;
|
|
1072
1074
|
}
|
|
1073
1075
|
}
|
|
1074
1076
|
buildStringCondition(e, t, n) {
|
|
1075
1077
|
switch (t) {
|
|
1076
|
-
case "contains": return
|
|
1077
|
-
case "notContains": return
|
|
1078
|
-
case "startsWith": return
|
|
1079
|
-
case "endsWith": return
|
|
1080
|
-
case "like": return
|
|
1081
|
-
case "notLike": return
|
|
1082
|
-
case "ilike": return
|
|
1083
|
-
case "regex": return
|
|
1084
|
-
case "notRegex": return
|
|
1078
|
+
case "contains": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
1079
|
+
case "notContains": return F`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
1080
|
+
case "startsWith": return F`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
1081
|
+
case "endsWith": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
1082
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1083
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1084
|
+
case "ilike": return F`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
1085
|
+
case "regex": return F`${e} GLOB ${n}`;
|
|
1086
|
+
case "notRegex": return F`${e} NOT GLOB ${n}`;
|
|
1085
1087
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1086
1088
|
}
|
|
1087
1089
|
}
|
|
1088
1090
|
castToType(e, t) {
|
|
1089
1091
|
switch (t) {
|
|
1090
|
-
case "timestamp": return
|
|
1091
|
-
case "decimal": return
|
|
1092
|
-
case "integer": return
|
|
1092
|
+
case "timestamp": return F`datetime(${e} / 1000, 'unixepoch')`;
|
|
1093
|
+
case "decimal": return F`CAST(${e} AS REAL)`;
|
|
1094
|
+
case "integer": return F`CAST(${e} AS INTEGER)`;
|
|
1093
1095
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1094
1096
|
}
|
|
1095
1097
|
}
|
|
1096
1098
|
buildAvg(e) {
|
|
1097
|
-
return
|
|
1099
|
+
return F`IFNULL(AVG(${e}), 0)`;
|
|
1098
1100
|
}
|
|
1099
1101
|
buildCaseWhen(e, t) {
|
|
1100
|
-
let n = e.map((e) => e.then && typeof e.then == "object" && (e.then.queryChunks || e.then._ || e.then.sql) ?
|
|
1101
|
-
return t === void 0 ?
|
|
1102
|
+
let n = e.map((e) => e.then && typeof e.then == "object" && (e.then.queryChunks || e.then._ || e.then.sql) ? F`WHEN ${e.when} THEN ${F.raw("(")}${e.then}${F.raw(")")}` : F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
1103
|
+
return t === void 0 ? F`CASE ${n} END` : t && typeof t == "object" && (t.queryChunks || t._ || t.sql) ? F`CASE ${n} ELSE ${F.raw("(")}${t}${F.raw(")")} END` : F`CASE ${n} ELSE ${t} END`;
|
|
1102
1104
|
}
|
|
1103
1105
|
buildBooleanLiteral(e) {
|
|
1104
|
-
return e ?
|
|
1106
|
+
return e ? F`1` : F`0`;
|
|
1105
1107
|
}
|
|
1106
1108
|
preprocessCalculatedTemplate(e) {
|
|
1107
|
-
return e.replace(/(\{[^}]+\})\s*\/\s*/g, (e, t) => `${t.replace(/\{([^}]+)\}/, "CAST({$1} AS REAL)")} / `);
|
|
1109
|
+
return e.length > 1e3 ? e : e.replace(/(\{[^}]+\})\s*\/\s*/g, (e, t) => `${t.replace(/\{([^}]+)\}/, "CAST({$1} AS REAL)")} / `);
|
|
1108
1110
|
}
|
|
1109
1111
|
convertFilterValue(e) {
|
|
1110
1112
|
return typeof e == "boolean" ? e ? 1 : 0 : e instanceof Date ? e.getTime() : Array.isArray(e) ? e.map((e) => this.convertFilterValue(e)) : e;
|
|
@@ -1131,7 +1133,8 @@ var U = class {
|
|
|
1131
1133
|
supportsWindowFunctions: !0,
|
|
1132
1134
|
supportsFrameClause: !0,
|
|
1133
1135
|
supportsLateralJoins: !1,
|
|
1134
|
-
supportsPercentileSubqueries: !1
|
|
1136
|
+
supportsPercentileSubqueries: !1,
|
|
1137
|
+
supportsDerivedTablesInCTE: !0
|
|
1135
1138
|
};
|
|
1136
1139
|
}
|
|
1137
1140
|
buildStddev(e, t = !1) {
|
|
@@ -1144,25 +1147,25 @@ var U = class {
|
|
|
1144
1147
|
return null;
|
|
1145
1148
|
}
|
|
1146
1149
|
buildWindowFunction(e, t, n, r, i) {
|
|
1147
|
-
let a = n && n.length > 0 ?
|
|
1150
|
+
let a = n && n.length > 0 ? F`PARTITION BY ${F.join(n, F`, `)}` : F``, o = r && r.length > 0 ? F`ORDER BY ${F.join(r.map((e) => e.direction === "desc" ? F`${e.field} DESC` : F`${e.field} ASC`), F`, `)}` : F``, s = F``;
|
|
1148
1151
|
if (i?.frame) {
|
|
1149
1152
|
let { type: e, start: t, end: n } = i.frame, r = e.toUpperCase(), a = t === "unbounded" ? "UNBOUNDED PRECEDING" : typeof t == "number" ? `${t} PRECEDING` : "CURRENT ROW", o = n === "unbounded" ? "UNBOUNDED FOLLOWING" : n === "current" ? "CURRENT ROW" : typeof n == "number" ? `${n} FOLLOWING` : "CURRENT ROW";
|
|
1150
|
-
s =
|
|
1153
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1151
1154
|
}
|
|
1152
1155
|
let c = [];
|
|
1153
1156
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1154
|
-
let l =
|
|
1157
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1155
1158
|
switch (e) {
|
|
1156
|
-
case "lag": return
|
|
1157
|
-
case "lead": return
|
|
1158
|
-
case "rank": return
|
|
1159
|
-
case "denseRank": return
|
|
1160
|
-
case "rowNumber": return
|
|
1161
|
-
case "ntile": return
|
|
1162
|
-
case "firstValue": return
|
|
1163
|
-
case "lastValue": return
|
|
1164
|
-
case "movingAvg": return
|
|
1165
|
-
case "movingSum": return
|
|
1159
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1160
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1161
|
+
case "rank": return F`RANK() ${l}`;
|
|
1162
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1163
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1164
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1165
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1166
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1167
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1168
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1166
1169
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1167
1170
|
}
|
|
1168
1171
|
}
|
|
@@ -1181,68 +1184,68 @@ var U = class {
|
|
|
1181
1184
|
let t = this.parseISODuration(e), n = [];
|
|
1182
1185
|
t.years && n.push(`${t.years} years`), t.months && n.push(`${t.months} months`), t.days && n.push(`${t.days} days`), t.hours && n.push(`${t.hours} hours`), t.minutes && n.push(`${t.minutes} minutes`), t.seconds && n.push(`${t.seconds} seconds`);
|
|
1183
1186
|
let r = n.join(" ") || "0 seconds";
|
|
1184
|
-
return
|
|
1187
|
+
return F`INTERVAL '${F.raw(r)}'`;
|
|
1185
1188
|
}
|
|
1186
1189
|
buildTimeDifferenceSeconds(e, t) {
|
|
1187
|
-
return
|
|
1190
|
+
return F`(EPOCH(${e}) - EPOCH(${t}))`;
|
|
1188
1191
|
}
|
|
1189
1192
|
buildDateAddInterval(e, t) {
|
|
1190
|
-
return
|
|
1193
|
+
return F`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
1191
1194
|
}
|
|
1192
1195
|
buildConditionalAggregation(e, t, n) {
|
|
1193
1196
|
let r = e.toUpperCase();
|
|
1194
|
-
return e === "count" && !t ?
|
|
1197
|
+
return e === "count" && !t ? F`COUNT(*) FILTER (WHERE ${n})` : F`${F.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
1195
1198
|
}
|
|
1196
1199
|
buildDateDiffPeriods(e, t, n) {
|
|
1197
|
-
return
|
|
1200
|
+
return F`DATE_DIFF('${F.raw(n)}', ${e}::timestamp, ${t}::timestamp)`;
|
|
1198
1201
|
}
|
|
1199
1202
|
buildPeriodSeriesSubquery(e) {
|
|
1200
|
-
return
|
|
1203
|
+
return F`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`;
|
|
1201
1204
|
}
|
|
1202
1205
|
buildTimeDimension(e, t) {
|
|
1203
1206
|
switch (e) {
|
|
1204
|
-
case "year": return
|
|
1205
|
-
case "quarter": return
|
|
1206
|
-
case "month": return
|
|
1207
|
-
case "week": return
|
|
1208
|
-
case "day": return
|
|
1209
|
-
case "hour": return
|
|
1210
|
-
case "minute": return
|
|
1211
|
-
case "second": return
|
|
1207
|
+
case "year": return F`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
1208
|
+
case "quarter": return F`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
1209
|
+
case "month": return F`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
1210
|
+
case "week": return F`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
1211
|
+
case "day": return F`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
1212
|
+
case "hour": return F`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
1213
|
+
case "minute": return F`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
1214
|
+
case "second": return F`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
1212
1215
|
default: return t;
|
|
1213
1216
|
}
|
|
1214
1217
|
}
|
|
1215
1218
|
buildStringCondition(e, t, n) {
|
|
1216
1219
|
switch (t) {
|
|
1217
|
-
case "contains": return
|
|
1218
|
-
case "notContains": return
|
|
1219
|
-
case "startsWith": return
|
|
1220
|
-
case "endsWith": return
|
|
1221
|
-
case "like": return
|
|
1222
|
-
case "notLike": return
|
|
1223
|
-
case "ilike": return
|
|
1224
|
-
case "regex": return
|
|
1225
|
-
case "notRegex": return
|
|
1220
|
+
case "contains": return F`${e} ILIKE ${`%${n}%`}`;
|
|
1221
|
+
case "notContains": return F`${e} NOT ILIKE ${`%${n}%`}`;
|
|
1222
|
+
case "startsWith": return F`${e} ILIKE ${`${n}%`}`;
|
|
1223
|
+
case "endsWith": return F`${e} ILIKE ${`%${n}`}`;
|
|
1224
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1225
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1226
|
+
case "ilike": return F`${e} ILIKE ${n}`;
|
|
1227
|
+
case "regex": return F`regexp_matches(${e}, ${n})`;
|
|
1228
|
+
case "notRegex": return F`NOT regexp_matches(${e}, ${n})`;
|
|
1226
1229
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1227
1230
|
}
|
|
1228
1231
|
}
|
|
1229
1232
|
castToType(e, t) {
|
|
1230
1233
|
switch (t) {
|
|
1231
|
-
case "timestamp": return
|
|
1232
|
-
case "decimal": return
|
|
1233
|
-
case "integer": return
|
|
1234
|
+
case "timestamp": return F`${e}::timestamp`;
|
|
1235
|
+
case "decimal": return F`${e}::decimal`;
|
|
1236
|
+
case "integer": return F`${e}::integer`;
|
|
1234
1237
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1235
1238
|
}
|
|
1236
1239
|
}
|
|
1237
1240
|
buildAvg(e) {
|
|
1238
|
-
return
|
|
1241
|
+
return F`COALESCE(AVG(${e}), 0)`;
|
|
1239
1242
|
}
|
|
1240
1243
|
buildCaseWhen(e, t) {
|
|
1241
|
-
let n = e.map((e) =>
|
|
1242
|
-
return t === void 0 ?
|
|
1244
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
1245
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
1243
1246
|
}
|
|
1244
1247
|
buildBooleanLiteral(e) {
|
|
1245
|
-
return e ?
|
|
1248
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
1246
1249
|
}
|
|
1247
1250
|
convertFilterValue(e) {
|
|
1248
1251
|
return e;
|
|
@@ -1264,53 +1267,188 @@ var U = class {
|
|
|
1264
1267
|
supportsWindowFunctions: !0,
|
|
1265
1268
|
supportsFrameClause: !0,
|
|
1266
1269
|
supportsLateralJoins: !1,
|
|
1267
|
-
supportsPercentileSubqueries: !1
|
|
1270
|
+
supportsPercentileSubqueries: !1,
|
|
1271
|
+
supportsDerivedTablesInCTE: !0
|
|
1268
1272
|
};
|
|
1269
1273
|
}
|
|
1270
1274
|
buildStddev(e, t = !1) {
|
|
1271
1275
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1272
|
-
return
|
|
1276
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1273
1277
|
}
|
|
1274
1278
|
buildVariance(e, t = !1) {
|
|
1275
1279
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
1276
|
-
return
|
|
1280
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1281
|
+
}
|
|
1282
|
+
buildPercentile(e, t) {
|
|
1283
|
+
return F`QUANTILE_CONT(${e}, ${t / 100})`;
|
|
1284
|
+
}
|
|
1285
|
+
buildWindowFunction(e, t, n, r, i) {
|
|
1286
|
+
let a = n && n.length > 0 ? F`PARTITION BY ${F.join(n, F`, `)}` : F``, o = r && r.length > 0 ? F`ORDER BY ${F.join(r.map((e) => e.direction === "desc" ? F`${e.field} DESC` : F`${e.field} ASC`), F`, `)}` : F``, s = F``;
|
|
1287
|
+
if (i?.frame) {
|
|
1288
|
+
let { type: e, start: t, end: n } = i.frame, r = e.toUpperCase(), a = t === "unbounded" ? "UNBOUNDED PRECEDING" : typeof t == "number" ? `${t} PRECEDING` : "CURRENT ROW", o = n === "unbounded" ? "UNBOUNDED FOLLOWING" : n === "current" ? "CURRENT ROW" : typeof n == "number" ? `${n} FOLLOWING` : "CURRENT ROW";
|
|
1289
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1290
|
+
}
|
|
1291
|
+
let c = [];
|
|
1292
|
+
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1293
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1294
|
+
switch (e) {
|
|
1295
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1296
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1297
|
+
case "rank": return F`RANK() ${l}`;
|
|
1298
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1299
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1300
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1301
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1302
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1303
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1304
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1305
|
+
default: throw Error(`Unsupported window function: ${e}`);
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
}, Ie = class extends U {
|
|
1309
|
+
getEngineType() {
|
|
1310
|
+
return "databend";
|
|
1311
|
+
}
|
|
1312
|
+
supportsLateralJoins() {
|
|
1313
|
+
return !1;
|
|
1314
|
+
}
|
|
1315
|
+
buildIntervalFromISO(e) {
|
|
1316
|
+
let t = this.parseISODuration(e), n = [];
|
|
1317
|
+
if (t.years && n.push(`${t.years} YEAR`), t.months && n.push(`${t.months} MONTH`), t.days && n.push(`${t.days} DAY`), t.hours && n.push(`${t.hours} HOUR`), t.minutes && n.push(`${t.minutes} MINUTE`), t.seconds && n.push(`${t.seconds} SECOND`), n.length === 0) return F`INTERVAL 0 SECOND`;
|
|
1318
|
+
if (n.length === 1) return F`INTERVAL ${F.raw(n[0])}`;
|
|
1319
|
+
let r = n.map((e) => `INTERVAL ${e}`);
|
|
1320
|
+
return F`(${F.raw(r.join(" + "))})`;
|
|
1321
|
+
}
|
|
1322
|
+
buildTimeDifferenceSeconds(e, t) {
|
|
1323
|
+
return F`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`;
|
|
1324
|
+
}
|
|
1325
|
+
buildDateAddInterval(e, t) {
|
|
1326
|
+
return F`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
1327
|
+
}
|
|
1328
|
+
buildConditionalAggregation(e, t, n) {
|
|
1329
|
+
let r = e.toUpperCase();
|
|
1330
|
+
return e === "count" && !t ? F`${F.raw(r)}(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1331
|
+
}
|
|
1332
|
+
buildDateDiffPeriods(e, t, n) {
|
|
1333
|
+
return F`DATE_DIFF('${F.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1334
|
+
}
|
|
1335
|
+
buildPeriodSeriesSubquery(e) {
|
|
1336
|
+
return F`(SELECT number as period_number FROM numbers(${e + 1})) p`;
|
|
1337
|
+
}
|
|
1338
|
+
buildTimeDimension(e, t) {
|
|
1339
|
+
switch (e) {
|
|
1340
|
+
case "year": return F`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;
|
|
1341
|
+
case "quarter": return F`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;
|
|
1342
|
+
case "month": return F`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;
|
|
1343
|
+
case "week": return F`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;
|
|
1344
|
+
case "day": return F`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1345
|
+
case "hour": return F`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;
|
|
1346
|
+
case "minute": return F`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;
|
|
1347
|
+
case "second": return F`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;
|
|
1348
|
+
default: return t;
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
buildStringCondition(e, t, n) {
|
|
1352
|
+
switch (t) {
|
|
1353
|
+
case "contains": return F`LOWER(${e}) LIKE LOWER(${`%${n}%`})`;
|
|
1354
|
+
case "notContains": return F`LOWER(${e}) NOT LIKE LOWER(${`%${n}%`})`;
|
|
1355
|
+
case "startsWith": return F`LOWER(${e}) LIKE LOWER(${`${n}%`})`;
|
|
1356
|
+
case "endsWith": return F`LOWER(${e}) LIKE LOWER(${`%${n}`})`;
|
|
1357
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1358
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1359
|
+
case "ilike": return F`LOWER(${e}) LIKE LOWER(${n})`;
|
|
1360
|
+
case "regex": return F`${e} REGEXP ${n}`;
|
|
1361
|
+
case "notRegex": return F`NOT (${e} REGEXP ${n})`;
|
|
1362
|
+
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
castToType(e, t) {
|
|
1366
|
+
switch (t) {
|
|
1367
|
+
case "timestamp": return F`${e}::TIMESTAMP`;
|
|
1368
|
+
case "decimal": return F`${e}::DECIMAL`;
|
|
1369
|
+
case "integer": return F`${e}::INTEGER`;
|
|
1370
|
+
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
buildAvg(e) {
|
|
1374
|
+
return F`COALESCE(AVG(${e}), 0)`;
|
|
1375
|
+
}
|
|
1376
|
+
buildCaseWhen(e, t) {
|
|
1377
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
1378
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
1379
|
+
}
|
|
1380
|
+
buildBooleanLiteral(e) {
|
|
1381
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
1382
|
+
}
|
|
1383
|
+
convertFilterValue(e) {
|
|
1384
|
+
return e;
|
|
1385
|
+
}
|
|
1386
|
+
prepareDateValue(e) {
|
|
1387
|
+
return e;
|
|
1388
|
+
}
|
|
1389
|
+
isTimestampInteger() {
|
|
1390
|
+
return !1;
|
|
1391
|
+
}
|
|
1392
|
+
convertTimeDimensionResult(e) {
|
|
1393
|
+
return e;
|
|
1394
|
+
}
|
|
1395
|
+
getCapabilities() {
|
|
1396
|
+
return {
|
|
1397
|
+
supportsStddev: !0,
|
|
1398
|
+
supportsVariance: !0,
|
|
1399
|
+
supportsPercentile: !1,
|
|
1400
|
+
supportsWindowFunctions: !0,
|
|
1401
|
+
supportsFrameClause: !0,
|
|
1402
|
+
supportsLateralJoins: !1,
|
|
1403
|
+
supportsPercentileSubqueries: !1,
|
|
1404
|
+
supportsDerivedTablesInCTE: !1
|
|
1405
|
+
};
|
|
1406
|
+
}
|
|
1407
|
+
buildStddev(e, t = !1) {
|
|
1408
|
+
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1409
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1410
|
+
}
|
|
1411
|
+
buildVariance(e, t = !1) {
|
|
1412
|
+
let n = t ? "COVAR_SAMP" : "COVAR_POP";
|
|
1413
|
+
return F`COALESCE(${F.raw(n)}(${e}, ${e}), 0)`;
|
|
1277
1414
|
}
|
|
1278
1415
|
buildPercentile(e, t) {
|
|
1279
|
-
|
|
1416
|
+
throw Error("Percentile functions are not yet supported for Databend");
|
|
1280
1417
|
}
|
|
1281
1418
|
buildWindowFunction(e, t, n, r, i) {
|
|
1282
|
-
let a = n && n.length > 0 ?
|
|
1419
|
+
let a = n && n.length > 0 ? F`PARTITION BY ${F.join(n, F`, `)}` : F``, o = r && r.length > 0 ? F`ORDER BY ${F.join(r.map((e) => e.direction === "desc" ? F`${e.field} DESC` : F`${e.field} ASC`), F`, `)}` : F``, s = F``;
|
|
1283
1420
|
if (i?.frame) {
|
|
1284
1421
|
let { type: e, start: t, end: n } = i.frame, r = e.toUpperCase(), a = t === "unbounded" ? "UNBOUNDED PRECEDING" : typeof t == "number" ? `${t} PRECEDING` : "CURRENT ROW", o = n === "unbounded" ? "UNBOUNDED FOLLOWING" : n === "current" ? "CURRENT ROW" : typeof n == "number" ? `${n} FOLLOWING` : "CURRENT ROW";
|
|
1285
|
-
s =
|
|
1422
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1286
1423
|
}
|
|
1287
1424
|
let c = [];
|
|
1288
1425
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1289
|
-
let l =
|
|
1426
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1290
1427
|
switch (e) {
|
|
1291
|
-
case "lag": return
|
|
1292
|
-
case "lead": return
|
|
1293
|
-
case "rank": return
|
|
1294
|
-
case "denseRank": return
|
|
1295
|
-
case "rowNumber": return
|
|
1296
|
-
case "ntile": return
|
|
1297
|
-
case "firstValue": return
|
|
1298
|
-
case "lastValue": return
|
|
1299
|
-
case "movingAvg": return
|
|
1300
|
-
case "movingSum": return
|
|
1428
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1429
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1430
|
+
case "rank": return F`RANK() ${l}`;
|
|
1431
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1432
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1433
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1434
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1435
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1436
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1437
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1301
1438
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1302
1439
|
}
|
|
1303
1440
|
}
|
|
1304
1441
|
};
|
|
1305
1442
|
//#endregion
|
|
1306
1443
|
//#region src/server/database-utils.ts
|
|
1307
|
-
function
|
|
1444
|
+
function Le(e) {
|
|
1308
1445
|
switch (e) {
|
|
1309
1446
|
case "postgres": return new je();
|
|
1310
1447
|
case "mysql": return new Me();
|
|
1311
1448
|
case "sqlite": return new Ne();
|
|
1312
1449
|
case "singlestore": return new Pe();
|
|
1313
1450
|
case "duckdb": return new Fe();
|
|
1451
|
+
case "databend": return new Ie();
|
|
1314
1452
|
default: throw Error(`Unsupported database engine: ${e}`);
|
|
1315
1453
|
}
|
|
1316
1454
|
}
|
|
@@ -1319,12 +1457,12 @@ function Ie(e) {
|
|
|
1319
1457
|
var W = class {
|
|
1320
1458
|
databaseAdapter;
|
|
1321
1459
|
constructor(e, t, n) {
|
|
1322
|
-
this.db = e, this.schema = t, this.databaseAdapter =
|
|
1460
|
+
this.db = e, this.schema = t, this.databaseAdapter = Le(n || this.getEngineType());
|
|
1323
1461
|
}
|
|
1324
1462
|
};
|
|
1325
1463
|
//#endregion
|
|
1326
1464
|
//#region src/server/explain/postgres-parser.ts
|
|
1327
|
-
function
|
|
1465
|
+
function Re(e, t) {
|
|
1328
1466
|
let n = [], r = [], i = !1, a, o, s, c = [];
|
|
1329
1467
|
for (let t of e) {
|
|
1330
1468
|
let e = t.match(/Planning Time:\s*([\d.]+)\s*ms/i);
|
|
@@ -1337,7 +1475,7 @@ function Le(e, t) {
|
|
|
1337
1475
|
o = parseFloat(l[1]);
|
|
1338
1476
|
continue;
|
|
1339
1477
|
}
|
|
1340
|
-
let u =
|
|
1478
|
+
let u = ze(t);
|
|
1341
1479
|
if (u) {
|
|
1342
1480
|
u.type.includes("Seq Scan") && (i = !0), u.index && r.push(u.index), n.length === 0 && u.estimatedCost !== void 0 && (s = u.estimatedCost);
|
|
1343
1481
|
let e = t.search(/\S/);
|
|
@@ -1367,7 +1505,7 @@ function Le(e, t) {
|
|
|
1367
1505
|
sql: t
|
|
1368
1506
|
};
|
|
1369
1507
|
}
|
|
1370
|
-
function
|
|
1508
|
+
function ze(e) {
|
|
1371
1509
|
let t = e.replace(/^[\s->]+/, "").trim();
|
|
1372
1510
|
if (!t) return null;
|
|
1373
1511
|
let n = t.match(/^([A-Za-z][A-Za-z0-9 ]+?)(?:\s+using\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\w+)?(?:\s+\(cost=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)(?:\s+width=\d+)?\))?(?:\s+\(actual time=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)\s+loops=(\d+)\))?/i);
|
|
@@ -1385,7 +1523,7 @@ function Re(e) {
|
|
|
1385
1523
|
}
|
|
1386
1524
|
//#endregion
|
|
1387
1525
|
//#region src/server/executors/postgres-executor.ts
|
|
1388
|
-
var
|
|
1526
|
+
var Be = class extends W {
|
|
1389
1527
|
async execute(e, t) {
|
|
1390
1528
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1391
1529
|
let n = await e.execute();
|
|
@@ -1427,7 +1565,7 @@ var ze = class extends W {
|
|
|
1427
1565
|
async explainQuery(e, t, n) {
|
|
1428
1566
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1429
1567
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1430
|
-
let i = await this.db.execute(
|
|
1568
|
+
let i = await this.db.execute(F`${F.raw(r)} ${F.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1431
1569
|
let r = t[parseInt(n, 10) - 1];
|
|
1432
1570
|
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
1433
1571
|
}))}`), a = [];
|
|
@@ -1437,7 +1575,7 @@ var ze = class extends W {
|
|
|
1437
1575
|
typeof t == "string" && a.push(t);
|
|
1438
1576
|
}
|
|
1439
1577
|
}
|
|
1440
|
-
return
|
|
1578
|
+
return Re(a, {
|
|
1441
1579
|
sql: e,
|
|
1442
1580
|
params: t
|
|
1443
1581
|
});
|
|
@@ -1446,7 +1584,7 @@ var ze = class extends W {
|
|
|
1446
1584
|
if (!e || e.length === 0) return [];
|
|
1447
1585
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1448
1586
|
try {
|
|
1449
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1587
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(F`
|
|
1450
1588
|
SELECT
|
|
1451
1589
|
t.relname as table_name,
|
|
1452
1590
|
i.relname as index_name,
|
|
@@ -1460,7 +1598,7 @@ var ze = class extends W {
|
|
|
1460
1598
|
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
1461
1599
|
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
1462
1600
|
WHERE n.nspname = 'public'
|
|
1463
|
-
AND t.relname IN (${
|
|
1601
|
+
AND t.relname IN (${F.raw(t)})
|
|
1464
1602
|
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
1465
1603
|
ORDER BY t.relname, i.relname
|
|
1466
1604
|
`);
|
|
@@ -1476,12 +1614,12 @@ var ze = class extends W {
|
|
|
1476
1614
|
}
|
|
1477
1615
|
}
|
|
1478
1616
|
};
|
|
1479
|
-
function
|
|
1480
|
-
return new
|
|
1617
|
+
function Ve(e, t) {
|
|
1618
|
+
return new Be(e, t, "postgres");
|
|
1481
1619
|
}
|
|
1482
1620
|
//#endregion
|
|
1483
1621
|
//#region src/server/explain/mysql-parser.ts
|
|
1484
|
-
function
|
|
1622
|
+
function He(e, t) {
|
|
1485
1623
|
let n = t?.toLowerCase() || "";
|
|
1486
1624
|
switch (e.toLowerCase()) {
|
|
1487
1625
|
case "all": return "Seq Scan";
|
|
@@ -1495,10 +1633,10 @@ function Ve(e, t) {
|
|
|
1495
1633
|
default: return `MySQL ${e}`;
|
|
1496
1634
|
}
|
|
1497
1635
|
}
|
|
1498
|
-
function
|
|
1636
|
+
function Ue(e, t) {
|
|
1499
1637
|
let n = [], r = [], i = !1, a = 0;
|
|
1500
1638
|
for (let t of e) {
|
|
1501
|
-
let e =
|
|
1639
|
+
let e = He(t.type, t.Extra);
|
|
1502
1640
|
t.type.toLowerCase() === "all" && (i = !0), t.key && r.push(t.key);
|
|
1503
1641
|
let o = {
|
|
1504
1642
|
type: e,
|
|
@@ -1529,7 +1667,7 @@ function He(e, t) {
|
|
|
1529
1667
|
}
|
|
1530
1668
|
//#endregion
|
|
1531
1669
|
//#region src/server/executors/mysql-executor.ts
|
|
1532
|
-
var
|
|
1670
|
+
var We = class extends W {
|
|
1533
1671
|
async execute(e, t) {
|
|
1534
1672
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1535
1673
|
let n = await e.execute();
|
|
@@ -1564,7 +1702,7 @@ var Ue = class extends W {
|
|
|
1564
1702
|
});
|
|
1565
1703
|
let a = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1566
1704
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1567
|
-
let o = await this.db.execute(
|
|
1705
|
+
let o = await this.db.execute(F.raw(`${a} ${r}`)), s = [];
|
|
1568
1706
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
1569
1707
|
id: e.id || 1,
|
|
1570
1708
|
select_type: e.select_type || "SIMPLE",
|
|
@@ -1579,7 +1717,7 @@ var Ue = class extends W {
|
|
|
1579
1717
|
filtered: Number(e.filtered) || 100,
|
|
1580
1718
|
Extra: e.Extra || null
|
|
1581
1719
|
});
|
|
1582
|
-
return
|
|
1720
|
+
return Ue(s, {
|
|
1583
1721
|
sql: e,
|
|
1584
1722
|
params: t
|
|
1585
1723
|
});
|
|
@@ -1588,7 +1726,7 @@ var Ue = class extends W {
|
|
|
1588
1726
|
if (!e || e.length === 0) return [];
|
|
1589
1727
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1590
1728
|
try {
|
|
1591
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1729
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(F`
|
|
1592
1730
|
SELECT
|
|
1593
1731
|
TABLE_NAME as table_name,
|
|
1594
1732
|
INDEX_NAME as index_name,
|
|
@@ -1597,7 +1735,7 @@ var Ue = class extends W {
|
|
|
1597
1735
|
CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
|
|
1598
1736
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
1599
1737
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
1600
|
-
AND LOWER(TABLE_NAME) IN (${
|
|
1738
|
+
AND LOWER(TABLE_NAME) IN (${F.raw(t)})
|
|
1601
1739
|
GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
|
|
1602
1740
|
ORDER BY TABLE_NAME, INDEX_NAME
|
|
1603
1741
|
`);
|
|
@@ -1613,12 +1751,12 @@ var Ue = class extends W {
|
|
|
1613
1751
|
}
|
|
1614
1752
|
}
|
|
1615
1753
|
};
|
|
1616
|
-
function
|
|
1617
|
-
return new
|
|
1754
|
+
function Ge(e, t) {
|
|
1755
|
+
return new We(e, t, "mysql");
|
|
1618
1756
|
}
|
|
1619
1757
|
//#endregion
|
|
1620
1758
|
//#region src/server/explain/sqlite-parser.ts
|
|
1621
|
-
function
|
|
1759
|
+
function Ke(e) {
|
|
1622
1760
|
let t = e.toLowerCase(), n = e.match(/^SCAN\s+(\S+)/i);
|
|
1623
1761
|
if (n) return {
|
|
1624
1762
|
type: "Seq Scan",
|
|
@@ -1643,10 +1781,10 @@ function Ge(e) {
|
|
|
1643
1781
|
table: a[1]
|
|
1644
1782
|
} : t.includes("temp b-tree") ? t.includes("order by") ? { type: "Sort" } : t.includes("group by") ? { type: "Group" } : t.includes("distinct") ? { type: "Distinct" } : { type: "Temp B-Tree" } : t.includes("compound") ? { type: "Compound Query" } : t.includes("subquery") ? { type: "Subquery" } : t.includes("co-routine") ? { type: "Coroutine" } : { type: e };
|
|
1645
1783
|
}
|
|
1646
|
-
function
|
|
1784
|
+
function qe(e, t) {
|
|
1647
1785
|
let n = [], r = [], i = !1, a = /* @__PURE__ */ new Map();
|
|
1648
1786
|
for (let t of e) {
|
|
1649
|
-
let e =
|
|
1787
|
+
let e = Ke(t.detail);
|
|
1650
1788
|
e.type === "Seq Scan" && (i = !0), e.index && r.push(e.index);
|
|
1651
1789
|
let o = {
|
|
1652
1790
|
type: e.type,
|
|
@@ -1677,7 +1815,7 @@ function Ke(e, t) {
|
|
|
1677
1815
|
}
|
|
1678
1816
|
//#endregion
|
|
1679
1817
|
//#region src/server/executors/sqlite-executor.ts
|
|
1680
|
-
var
|
|
1818
|
+
var Je = class extends W {
|
|
1681
1819
|
async execute(e, t) {
|
|
1682
1820
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1683
1821
|
let n = await e.execute();
|
|
@@ -1717,7 +1855,7 @@ var qe = class extends W {
|
|
|
1717
1855
|
return e === null ? "NULL" : typeof e == "number" ? String(e) : typeof e == "boolean" ? e ? "1" : "0" : e instanceof Date ? `'${e.toISOString()}'` : `'${String(e).replace(/'/g, "''")}'`;
|
|
1718
1856
|
});
|
|
1719
1857
|
let a = `EXPLAIN QUERY PLAN ${r}`, o;
|
|
1720
|
-
if (this.db.all) o = this.db.all(
|
|
1858
|
+
if (this.db.all) o = this.db.all(F.raw(a));
|
|
1721
1859
|
else throw Error("SQLite database instance must have an all() method for EXPLAIN");
|
|
1722
1860
|
let s = [];
|
|
1723
1861
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
@@ -1726,7 +1864,7 @@ var qe = class extends W {
|
|
|
1726
1864
|
notused: Number(e.notused) || 0,
|
|
1727
1865
|
detail: String(e.detail || "")
|
|
1728
1866
|
});
|
|
1729
|
-
return
|
|
1867
|
+
return qe(s, {
|
|
1730
1868
|
sql: e,
|
|
1731
1869
|
params: t
|
|
1732
1870
|
});
|
|
@@ -1737,9 +1875,9 @@ var qe = class extends W {
|
|
|
1737
1875
|
try {
|
|
1738
1876
|
let t = [];
|
|
1739
1877
|
for (let n of e) {
|
|
1740
|
-
let e = this.db.all(
|
|
1878
|
+
let e = this.db.all(F.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));
|
|
1741
1879
|
if (Array.isArray(e)) for (let r of e) {
|
|
1742
|
-
let e = r.name, i = !!r.unique, a = r.origin, o = this.db.all(
|
|
1880
|
+
let e = r.name, i = !!r.unique, a = r.origin, o = this.db.all(F.raw(`SELECT name FROM pragma_index_info('${e}') ORDER BY seqno`)), s = [];
|
|
1743
1881
|
if (Array.isArray(o)) for (let e of o) {
|
|
1744
1882
|
let t = e.name;
|
|
1745
1883
|
typeof t == "string" && s.push(t);
|
|
@@ -1759,29 +1897,29 @@ var qe = class extends W {
|
|
|
1759
1897
|
}
|
|
1760
1898
|
}
|
|
1761
1899
|
};
|
|
1762
|
-
function
|
|
1763
|
-
return new
|
|
1900
|
+
function Ye(e, t) {
|
|
1901
|
+
return new Je(e, t, "sqlite");
|
|
1764
1902
|
}
|
|
1765
1903
|
//#endregion
|
|
1766
1904
|
//#region src/server/executors/singlestore-executor.ts
|
|
1767
|
-
var
|
|
1905
|
+
var Xe = class extends We {
|
|
1768
1906
|
getEngineType() {
|
|
1769
1907
|
return "singlestore";
|
|
1770
1908
|
}
|
|
1771
1909
|
};
|
|
1772
|
-
function
|
|
1773
|
-
return new
|
|
1910
|
+
function Ze(e, t) {
|
|
1911
|
+
return new Xe(e, t);
|
|
1774
1912
|
}
|
|
1775
1913
|
//#endregion
|
|
1776
1914
|
//#region src/server/explain/duckdb-parser.ts
|
|
1777
|
-
function
|
|
1915
|
+
function Qe(e, t) {
|
|
1778
1916
|
let n = [], r = [], i = !1, a, o = [];
|
|
1779
1917
|
for (let t of e) {
|
|
1780
1918
|
if (/^[┌├└│─┐┤┘]+$/.test(t.trim()) || /EXPLANATION|QUERY PLAN/i.test(t)) continue;
|
|
1781
|
-
let e =
|
|
1919
|
+
let e = et(t);
|
|
1782
1920
|
if (e) {
|
|
1783
1921
|
(e.type.includes("SEQ_SCAN") || e.type.includes("TABLE_SCAN")) && (i = !0), e.type.includes("INDEX_SCAN") && e.index && r.push(e.index), n.length === 0 && e.estimatedCost !== void 0 && (a = e.estimatedCost);
|
|
1784
|
-
let s =
|
|
1922
|
+
let s = $e(t);
|
|
1785
1923
|
for (; o.length > 0 && o[o.length - 1].indent >= s;) o.pop();
|
|
1786
1924
|
if (o.length === 0) n.push(e);
|
|
1787
1925
|
else {
|
|
@@ -1808,13 +1946,13 @@ function Ze(e, t) {
|
|
|
1808
1946
|
sql: t
|
|
1809
1947
|
};
|
|
1810
1948
|
}
|
|
1811
|
-
function
|
|
1949
|
+
function $e(e) {
|
|
1812
1950
|
let t = 0;
|
|
1813
1951
|
for (let n of e) if (n === " " || n === "│" || n === "├" || n === "└" || n === "─") t++;
|
|
1814
1952
|
else break;
|
|
1815
1953
|
return t;
|
|
1816
1954
|
}
|
|
1817
|
-
function
|
|
1955
|
+
function et(e) {
|
|
1818
1956
|
let t = e.replace(/[┌├└│─┐┤┘]/g, "").replace(/^\s*/, "").trim();
|
|
1819
1957
|
if (!t || t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i)) return null;
|
|
1820
1958
|
let n = t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);
|
|
@@ -1840,7 +1978,7 @@ function $e(e) {
|
|
|
1840
1978
|
}
|
|
1841
1979
|
//#endregion
|
|
1842
1980
|
//#region src/server/executors/duckdb-executor.ts
|
|
1843
|
-
var
|
|
1981
|
+
var tt = class extends W {
|
|
1844
1982
|
async execute(e, t) {
|
|
1845
1983
|
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
1846
1984
|
let n = await e.execute();
|
|
@@ -1924,7 +2062,7 @@ var et = class extends W {
|
|
|
1924
2062
|
async explainQuery(e, t, n) {
|
|
1925
2063
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1926
2064
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1927
|
-
let i = await this.db.execute(
|
|
2065
|
+
let i = await this.db.execute(F`${F.raw(r)} ${F.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1928
2066
|
let r = t[parseInt(n, 10) - 1];
|
|
1929
2067
|
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
1930
2068
|
}))}`), a = [];
|
|
@@ -1934,7 +2072,7 @@ var et = class extends W {
|
|
|
1934
2072
|
typeof t == "string" && a.push(t);
|
|
1935
2073
|
}
|
|
1936
2074
|
}
|
|
1937
|
-
return
|
|
2075
|
+
return Qe(a, {
|
|
1938
2076
|
sql: e,
|
|
1939
2077
|
params: t
|
|
1940
2078
|
});
|
|
@@ -1943,7 +2081,7 @@ var et = class extends W {
|
|
|
1943
2081
|
if (!e || e.length === 0) return [];
|
|
1944
2082
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1945
2083
|
try {
|
|
1946
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
2084
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(F`
|
|
1947
2085
|
SELECT
|
|
1948
2086
|
table_name,
|
|
1949
2087
|
index_name,
|
|
@@ -1951,7 +2089,7 @@ var et = class extends W {
|
|
|
1951
2089
|
is_unique,
|
|
1952
2090
|
is_primary
|
|
1953
2091
|
FROM duckdb_indexes()
|
|
1954
|
-
WHERE LOWER(table_name) IN (${
|
|
2092
|
+
WHERE LOWER(table_name) IN (${F.raw(t)})
|
|
1955
2093
|
GROUP BY table_name, index_name, is_unique, is_primary
|
|
1956
2094
|
ORDER BY table_name, index_name
|
|
1957
2095
|
`);
|
|
@@ -1967,21 +2105,184 @@ var et = class extends W {
|
|
|
1967
2105
|
}
|
|
1968
2106
|
}
|
|
1969
2107
|
};
|
|
1970
|
-
function
|
|
1971
|
-
return new
|
|
2108
|
+
function nt(e, t) {
|
|
2109
|
+
return new tt(e, t, "duckdb");
|
|
2110
|
+
}
|
|
2111
|
+
//#endregion
|
|
2112
|
+
//#region src/server/explain/databend-parser.ts
|
|
2113
|
+
function rt(e, t) {
|
|
2114
|
+
let n = [], r = [], i = !1, a, o = [];
|
|
2115
|
+
for (let t of e) {
|
|
2116
|
+
if (!t.trim()) continue;
|
|
2117
|
+
let e = at(t);
|
|
2118
|
+
if (e) {
|
|
2119
|
+
(e.type.includes("TableScan") || e.type.includes("SCAN")) && (i = !0), e.type.includes("IndexScan") && e.index && r.push(e.index), n.length === 0 && e.estimatedCost !== void 0 && (a = e.estimatedCost);
|
|
2120
|
+
let s = it(t);
|
|
2121
|
+
for (; o.length > 0 && o[o.length - 1].indent >= s;) o.pop();
|
|
2122
|
+
if (o.length === 0) n.push(e);
|
|
2123
|
+
else {
|
|
2124
|
+
let t = o[o.length - 1].op;
|
|
2125
|
+
t.children ||= [], t.children.push(e);
|
|
2126
|
+
}
|
|
2127
|
+
o.push({
|
|
2128
|
+
indent: s,
|
|
2129
|
+
op: e
|
|
2130
|
+
});
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
return {
|
|
2134
|
+
operations: n,
|
|
2135
|
+
summary: {
|
|
2136
|
+
database: "databend",
|
|
2137
|
+
planningTime: void 0,
|
|
2138
|
+
executionTime: void 0,
|
|
2139
|
+
totalCost: a,
|
|
2140
|
+
hasSequentialScans: i,
|
|
2141
|
+
usedIndexes: [...new Set(r)]
|
|
2142
|
+
},
|
|
2143
|
+
raw: e.join("\n"),
|
|
2144
|
+
sql: t
|
|
2145
|
+
};
|
|
2146
|
+
}
|
|
2147
|
+
function it(e) {
|
|
2148
|
+
let t = 0;
|
|
2149
|
+
for (let n of e) if (n === " " || n === "│" || n === "├" || n === "└" || n === "─") t++;
|
|
2150
|
+
else break;
|
|
2151
|
+
return t;
|
|
2152
|
+
}
|
|
2153
|
+
function at(e) {
|
|
2154
|
+
let t = e.replace(/[┌├└│─┐┤┘]/g, "").replace(/^\s*/, "").trim();
|
|
2155
|
+
if (!t || /^(filters|table|estimated rows|output columns|push downs):/.test(t)) return null;
|
|
2156
|
+
let n = t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);
|
|
2157
|
+
if (!n) return null;
|
|
2158
|
+
let r = n[1], i = n[2] || void 0, a = t.match(/estimated rows:\s*(\d+)/i);
|
|
2159
|
+
return {
|
|
2160
|
+
type: r,
|
|
2161
|
+
table: i,
|
|
2162
|
+
estimatedRows: a ? parseInt(a[1], 10) : void 0
|
|
2163
|
+
};
|
|
2164
|
+
}
|
|
2165
|
+
//#endregion
|
|
2166
|
+
//#region src/server/executors/databend-executor.ts
|
|
2167
|
+
var ot = class extends W {
|
|
2168
|
+
async execute(e, t) {
|
|
2169
|
+
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
2170
|
+
let n = await e.execute();
|
|
2171
|
+
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
2172
|
+
} catch (t) {
|
|
2173
|
+
let n = this.extractSqlFromQuery(e);
|
|
2174
|
+
throw console.error("[Databend] Query execution failed:", {
|
|
2175
|
+
error: t instanceof Error ? t.message : String(t),
|
|
2176
|
+
sql: n.sql,
|
|
2177
|
+
params: n.params
|
|
2178
|
+
}), t;
|
|
2179
|
+
}
|
|
2180
|
+
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
2181
|
+
try {
|
|
2182
|
+
let n = await this.db.execute(e);
|
|
2183
|
+
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
2184
|
+
} catch (t) {
|
|
2185
|
+
let n = this.extractSqlFromQuery(e);
|
|
2186
|
+
throw console.error("[Databend] Query execution failed:", {
|
|
2187
|
+
error: t instanceof Error ? t.message : String(t),
|
|
2188
|
+
sql: n.sql,
|
|
2189
|
+
params: n.params
|
|
2190
|
+
}), t;
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
extractSqlFromQuery(e) {
|
|
2194
|
+
try {
|
|
2195
|
+
if (e && typeof e.toSQL == "function") {
|
|
2196
|
+
let { sql: t, params: n } = e.toSQL();
|
|
2197
|
+
return {
|
|
2198
|
+
sql: t,
|
|
2199
|
+
params: n
|
|
2200
|
+
};
|
|
2201
|
+
}
|
|
2202
|
+
if (e && typeof e.getSQL == "function") {
|
|
2203
|
+
let t = e.getSQL();
|
|
2204
|
+
if (t && typeof t.toSQL == "function") {
|
|
2205
|
+
let { sql: e, params: n } = t.toSQL();
|
|
2206
|
+
return {
|
|
2207
|
+
sql: e,
|
|
2208
|
+
params: n
|
|
2209
|
+
};
|
|
2210
|
+
}
|
|
2211
|
+
}
|
|
2212
|
+
return {
|
|
2213
|
+
sql: String(e),
|
|
2214
|
+
params: []
|
|
2215
|
+
};
|
|
2216
|
+
} catch {
|
|
2217
|
+
return {
|
|
2218
|
+
sql: "[unable to extract SQL]",
|
|
2219
|
+
params: []
|
|
2220
|
+
};
|
|
2221
|
+
}
|
|
2222
|
+
}
|
|
2223
|
+
convertNumericFields(e, t) {
|
|
2224
|
+
if (!e || typeof e != "object") return e;
|
|
2225
|
+
let n = {};
|
|
2226
|
+
for (let [r, i] of Object.entries(e)) t && t.includes(r) ? n[r] = this.coerceToNumber(i) : n[r] = i;
|
|
2227
|
+
return n;
|
|
2228
|
+
}
|
|
2229
|
+
coerceToNumber(e) {
|
|
2230
|
+
if (e == null || typeof e == "number") return e;
|
|
2231
|
+
if (typeof e == "bigint") return Number(e);
|
|
2232
|
+
if (e && typeof e == "object") {
|
|
2233
|
+
if (typeof e.toString == "function") {
|
|
2234
|
+
let t = e.toString();
|
|
2235
|
+
if (/^-?\d+(\.\d+)?$/.test(t)) return t.includes(".") ? parseFloat(t) : parseInt(t, 10);
|
|
2236
|
+
}
|
|
2237
|
+
return e;
|
|
2238
|
+
}
|
|
2239
|
+
if (typeof e == "string") {
|
|
2240
|
+
if (/^-?\d+(\.\d+)?$/.test(e)) return e.includes(".") ? parseFloat(e) : parseInt(e, 10);
|
|
2241
|
+
if (!isNaN(parseFloat(e)) && isFinite(parseFloat(e))) return parseFloat(e);
|
|
2242
|
+
}
|
|
2243
|
+
return e;
|
|
2244
|
+
}
|
|
2245
|
+
getEngineType() {
|
|
2246
|
+
return "databend";
|
|
2247
|
+
}
|
|
2248
|
+
async explainQuery(e, t, n) {
|
|
2249
|
+
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
2250
|
+
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
2251
|
+
let i = await this.db.execute(F`${F.raw(r)} ${F.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
2252
|
+
let r = t[parseInt(n, 10) - 1];
|
|
2253
|
+
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
2254
|
+
}))}`), a = [];
|
|
2255
|
+
if (Array.isArray(i)) {
|
|
2256
|
+
for (let e of i) if (e && typeof e == "object") {
|
|
2257
|
+
let t = e.explain || e["QUERY PLAN"] || e.query_plan || e.Plan || Object.values(e)[0];
|
|
2258
|
+
typeof t == "string" && a.push(t);
|
|
2259
|
+
}
|
|
2260
|
+
}
|
|
2261
|
+
return rt(a, {
|
|
2262
|
+
sql: e,
|
|
2263
|
+
params: t
|
|
2264
|
+
});
|
|
2265
|
+
}
|
|
2266
|
+
async getTableIndexes(e) {
|
|
2267
|
+
return !e || e.length, [];
|
|
2268
|
+
}
|
|
2269
|
+
};
|
|
2270
|
+
function st(e, t) {
|
|
2271
|
+
return new ot(e, t, "databend");
|
|
1972
2272
|
}
|
|
1973
2273
|
//#endregion
|
|
1974
2274
|
//#region src/server/executors/index.ts
|
|
1975
|
-
function
|
|
2275
|
+
function ct(e, t, n) {
|
|
1976
2276
|
if (n) switch (n) {
|
|
1977
|
-
case "postgres": return
|
|
1978
|
-
case "mysql": return
|
|
1979
|
-
case "sqlite": return
|
|
1980
|
-
case "singlestore": return
|
|
1981
|
-
case "duckdb": return
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
if (e.
|
|
2277
|
+
case "postgres": return Ve(e, t);
|
|
2278
|
+
case "mysql": return Ge(e, t);
|
|
2279
|
+
case "sqlite": return Ye(e, t);
|
|
2280
|
+
case "singlestore": return Ze(e, t);
|
|
2281
|
+
case "duckdb": return nt(e, t);
|
|
2282
|
+
case "databend": return st(e, t);
|
|
2283
|
+
}
|
|
2284
|
+
if (e.all && e.run) return Ye(e, t);
|
|
2285
|
+
if (e.execute) return Ve(e, t);
|
|
1985
2286
|
throw Error("Unable to determine database engine type. Please specify engineType parameter.");
|
|
1986
2287
|
}
|
|
1987
2288
|
//#endregion
|
|
@@ -1989,7 +2290,7 @@ function nt(e, t, n) {
|
|
|
1989
2290
|
function G(e, t) {
|
|
1990
2291
|
return typeof e == "string" ? t ? t.get(e) || (console.warn(`[drizzle-cube] Cannot resolve cube reference '${e}': no cube with that name is registered. Registered cubes: ${Array.from(t.keys()).join(", ") || "(none)"}. Join will be skipped.`), null) : (console.warn(`[drizzle-cube] Cannot resolve string cube reference '${e}': no cube registry provided. Join will be skipped.`), null) : typeof e == "function" ? e() : e;
|
|
1991
2292
|
}
|
|
1992
|
-
function
|
|
2293
|
+
function lt(e) {
|
|
1993
2294
|
switch (e) {
|
|
1994
2295
|
case "belongsTo": return "hasMany";
|
|
1995
2296
|
case "hasMany": return "belongsTo";
|
|
@@ -1998,7 +2299,7 @@ function rt(e) {
|
|
|
1998
2299
|
default: return e;
|
|
1999
2300
|
}
|
|
2000
2301
|
}
|
|
2001
|
-
function
|
|
2302
|
+
function ut(e, t) {
|
|
2002
2303
|
if (t) return t;
|
|
2003
2304
|
switch (e) {
|
|
2004
2305
|
case "belongsTo": return "inner";
|
|
@@ -2008,22 +2309,26 @@ function it(e, t) {
|
|
|
2008
2309
|
default: return "left";
|
|
2009
2310
|
}
|
|
2010
2311
|
}
|
|
2011
|
-
function
|
|
2012
|
-
return e && typeof e == "object" ?
|
|
2312
|
+
function dt(e) {
|
|
2313
|
+
return e && typeof e == "object" ? F`${F`${e}`}` : e;
|
|
2314
|
+
}
|
|
2315
|
+
function ft(e) {
|
|
2316
|
+
if (e === "__proto__" || e === "constructor" || e === "prototype") throw Error(`Unsafe property key: ${e}`);
|
|
2317
|
+
return e;
|
|
2013
2318
|
}
|
|
2014
2319
|
function K(e, t) {
|
|
2015
|
-
return
|
|
2320
|
+
return dt(typeof e == "function" ? e(t) : e);
|
|
2016
2321
|
}
|
|
2017
|
-
function
|
|
2322
|
+
function pt(e, t) {
|
|
2018
2323
|
if (e.relationship !== "belongsToMany" || !e.through) throw Error("expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration");
|
|
2019
2324
|
let { table: n, sourceKey: r, targetKey: i, securitySql: a } = e.through, o = [];
|
|
2020
2325
|
for (let e of r) {
|
|
2021
|
-
let t = e.as ||
|
|
2326
|
+
let t = e.as || L;
|
|
2022
2327
|
o.push(t(e.source, e.target));
|
|
2023
2328
|
}
|
|
2024
2329
|
let s = [];
|
|
2025
2330
|
for (let e of i) {
|
|
2026
|
-
let t = e.as ||
|
|
2331
|
+
let t = e.as || L;
|
|
2027
2332
|
s.push(t(e.source, e.target));
|
|
2028
2333
|
}
|
|
2029
2334
|
let c;
|
|
@@ -2031,29 +2336,29 @@ function ot(e, t) {
|
|
|
2031
2336
|
let e = a(t);
|
|
2032
2337
|
c = Array.isArray(e) ? e : [e];
|
|
2033
2338
|
}
|
|
2034
|
-
let l =
|
|
2339
|
+
let l = ut("belongsToMany", e.sqlJoinType);
|
|
2035
2340
|
return {
|
|
2036
2341
|
junctionJoins: [{
|
|
2037
2342
|
joinType: l,
|
|
2038
2343
|
table: n,
|
|
2039
|
-
condition:
|
|
2344
|
+
condition: R(...o)
|
|
2040
2345
|
}, {
|
|
2041
2346
|
joinType: l,
|
|
2042
2347
|
table: n,
|
|
2043
|
-
condition:
|
|
2348
|
+
condition: R(...s)
|
|
2044
2349
|
}],
|
|
2045
2350
|
junctionSecurityConditions: c
|
|
2046
2351
|
};
|
|
2047
2352
|
}
|
|
2048
2353
|
//#endregion
|
|
2049
2354
|
//#region src/server/filter-cache.ts
|
|
2050
|
-
function
|
|
2051
|
-
if ("and" in e) return `and:[${e.and.map(
|
|
2052
|
-
if ("or" in e) return `or:[${e.or.map(
|
|
2355
|
+
function mt(e) {
|
|
2356
|
+
if ("and" in e) return `and:[${e.and.map(mt).sort().join(",")}]`;
|
|
2357
|
+
if ("or" in e) return `or:[${e.or.map(mt).sort().join(",")}]`;
|
|
2053
2358
|
let t = e, n = JSON.stringify(Array.isArray(t.values) ? [...t.values].sort() : t.values), r = t.dateRange ? `:dr:${JSON.stringify(t.dateRange)}` : "";
|
|
2054
2359
|
return `${t.member}:${t.operator}:${n}${r}`;
|
|
2055
2360
|
}
|
|
2056
|
-
function
|
|
2361
|
+
function ht(e, t) {
|
|
2057
2362
|
return `timeDim:${e}:${JSON.stringify(t)}`;
|
|
2058
2363
|
}
|
|
2059
2364
|
var q = class {
|
|
@@ -2094,37 +2399,37 @@ var q = class {
|
|
|
2094
2399
|
};
|
|
2095
2400
|
}
|
|
2096
2401
|
};
|
|
2097
|
-
function
|
|
2402
|
+
function gt(e) {
|
|
2098
2403
|
let t = [];
|
|
2099
|
-
for (let n of e) "and" in n && n.and ? t.push(...
|
|
2404
|
+
for (let n of e) "and" in n && n.and ? t.push(...gt(n.and)) : "or" in n && n.or ? t.push(...gt(n.or)) : "member" in n && t.push(n);
|
|
2100
2405
|
return t;
|
|
2101
2406
|
}
|
|
2102
2407
|
//#endregion
|
|
2103
2408
|
//#region src/server/cache-utils.ts
|
|
2104
|
-
function
|
|
2105
|
-
let r = n.keyPrefix ?? "drizzle-cube:", i =
|
|
2409
|
+
function _t(e, t, n = {}) {
|
|
2410
|
+
let r = n.keyPrefix ?? "drizzle-cube:", i = vt(e), a = `${r}query:${wt(JSON.stringify(i))}`;
|
|
2106
2411
|
if (n.includeSecurityContext !== !1) {
|
|
2107
|
-
let e =
|
|
2412
|
+
let e = wt(n.securityContextSerializer ? n.securityContextSerializer(t) : JSON.stringify(Ct(t)));
|
|
2108
2413
|
a += `:ctx:${e}`;
|
|
2109
2414
|
}
|
|
2110
2415
|
return a;
|
|
2111
2416
|
}
|
|
2112
|
-
function
|
|
2417
|
+
function vt(e) {
|
|
2113
2418
|
return {
|
|
2114
2419
|
measures: e.measures ? [...e.measures].sort() : void 0,
|
|
2115
2420
|
dimensions: e.dimensions ? [...e.dimensions].sort() : void 0,
|
|
2116
2421
|
filters: e.filters ? J(e.filters) : void 0,
|
|
2117
|
-
timeDimensions: e.timeDimensions ?
|
|
2422
|
+
timeDimensions: e.timeDimensions ? St(e.timeDimensions) : void 0,
|
|
2118
2423
|
limit: e.limit,
|
|
2119
2424
|
offset: e.offset,
|
|
2120
|
-
order: e.order ?
|
|
2425
|
+
order: e.order ? Ct(e.order) : void 0,
|
|
2121
2426
|
fillMissingDatesValue: e.fillMissingDatesValue,
|
|
2122
|
-
funnel: e.funnel ?
|
|
2123
|
-
flow: e.flow ?
|
|
2124
|
-
retention: e.retention ?
|
|
2427
|
+
funnel: e.funnel ? yt(e.funnel) : void 0,
|
|
2428
|
+
flow: e.flow ? bt(e.flow) : void 0,
|
|
2429
|
+
retention: e.retention ? xt(e.retention) : void 0
|
|
2125
2430
|
};
|
|
2126
2431
|
}
|
|
2127
|
-
function
|
|
2432
|
+
function yt(e) {
|
|
2128
2433
|
return {
|
|
2129
2434
|
bindingKey: e.bindingKey,
|
|
2130
2435
|
timeDimension: e.timeDimension,
|
|
@@ -2140,7 +2445,7 @@ function ft(e) {
|
|
|
2140
2445
|
globalTimeWindow: e.globalTimeWindow
|
|
2141
2446
|
};
|
|
2142
2447
|
}
|
|
2143
|
-
function
|
|
2448
|
+
function bt(e) {
|
|
2144
2449
|
return {
|
|
2145
2450
|
bindingKey: e.bindingKey,
|
|
2146
2451
|
timeDimension: e.timeDimension,
|
|
@@ -2156,7 +2461,7 @@ function pt(e) {
|
|
|
2156
2461
|
joinStrategy: e.joinStrategy
|
|
2157
2462
|
};
|
|
2158
2463
|
}
|
|
2159
|
-
function
|
|
2464
|
+
function xt(e) {
|
|
2160
2465
|
return {
|
|
2161
2466
|
timeDimension: e.timeDimension,
|
|
2162
2467
|
bindingKey: e.bindingKey,
|
|
@@ -2180,7 +2485,7 @@ function J(e) {
|
|
|
2180
2485
|
};
|
|
2181
2486
|
}).sort((e, t) => JSON.stringify(e).localeCompare(JSON.stringify(t)));
|
|
2182
2487
|
}
|
|
2183
|
-
function
|
|
2488
|
+
function St(e) {
|
|
2184
2489
|
return [...e].map((e) => ({
|
|
2185
2490
|
dimension: e.dimension,
|
|
2186
2491
|
granularity: e.granularity,
|
|
@@ -2192,23 +2497,23 @@ function ht(e) {
|
|
|
2192
2497
|
}) : void 0
|
|
2193
2498
|
})).sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
2194
2499
|
}
|
|
2195
|
-
function
|
|
2196
|
-
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(
|
|
2500
|
+
function Ct(e) {
|
|
2501
|
+
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(Ct) : Object.keys(e).sort().reduce((t, n) => (t[n] = Ct(e[n]), t), {});
|
|
2197
2502
|
}
|
|
2198
|
-
function
|
|
2199
|
-
let t = 2166136261;
|
|
2200
|
-
for (let
|
|
2503
|
+
function wt(e) {
|
|
2504
|
+
let t = 2166136261, n = Math.min(e.length, 65536);
|
|
2505
|
+
for (let r = 0; r < n; r++) t ^= e.charCodeAt(r), t = t * 16777619 >>> 0;
|
|
2201
2506
|
return t.toString(16).padStart(8, "0");
|
|
2202
2507
|
}
|
|
2203
2508
|
//#endregion
|
|
2204
2509
|
//#region src/server/builders/date-time-builder.ts
|
|
2205
|
-
var
|
|
2510
|
+
var Y = class {
|
|
2206
2511
|
constructor(e) {
|
|
2207
2512
|
this.databaseAdapter = e;
|
|
2208
2513
|
}
|
|
2209
2514
|
buildTimeDimensionExpression(e, t, n) {
|
|
2210
2515
|
let r = K(e, n);
|
|
2211
|
-
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof
|
|
2516
|
+
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof N ? r : F`${r}`;
|
|
2212
2517
|
}
|
|
2213
2518
|
buildDateRangeCondition(e, t) {
|
|
2214
2519
|
if (!t) return null;
|
|
@@ -2219,13 +2524,13 @@ var X = class {
|
|
|
2219
2524
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2220
2525
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2221
2526
|
}
|
|
2222
|
-
return
|
|
2527
|
+
return R(z(e, n), B(e, r));
|
|
2223
2528
|
}
|
|
2224
2529
|
if (typeof t == "string") {
|
|
2225
2530
|
let n = this.parseRelativeDateRange(t);
|
|
2226
2531
|
if (n) {
|
|
2227
2532
|
let t, r;
|
|
2228
|
-
return this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? (t = Math.floor(n.start.getTime() / 1e3), r = Math.floor(n.end.getTime() / 1e3)) : (t = n.start.getTime(), r = n.end.getTime()) : (t = n.start.toISOString(), r = n.end.toISOString()),
|
|
2533
|
+
return this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? (t = Math.floor(n.start.getTime() / 1e3), r = Math.floor(n.end.getTime() / 1e3)) : (t = n.start.getTime(), r = n.end.getTime()) : (t = n.start.toISOString(), r = n.end.toISOString()), R(z(e, t), B(e, r));
|
|
2229
2534
|
}
|
|
2230
2535
|
let r = this.normalizeDate(t);
|
|
2231
2536
|
if (!r) return null;
|
|
@@ -2234,7 +2539,7 @@ var X = class {
|
|
|
2234
2539
|
let o = new Date(i);
|
|
2235
2540
|
o.setUTCHours(23, 59, 59, 999);
|
|
2236
2541
|
let s, c;
|
|
2237
|
-
return this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? (s = Math.floor(a.getTime() / 1e3), c = Math.floor(o.getTime() / 1e3)) : (s = a.getTime(), c = o.getTime()) : (s = a.toISOString(), c = o.toISOString()),
|
|
2542
|
+
return this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? (s = Math.floor(a.getTime() / 1e3), c = Math.floor(o.getTime() / 1e3)) : (s = a.getTime(), c = o.getTime()) : (s = a.toISOString(), c = o.toISOString()), R(z(e, s), B(e, c));
|
|
2238
2543
|
}
|
|
2239
2544
|
return null;
|
|
2240
2545
|
}
|
|
@@ -2369,7 +2674,7 @@ var X = class {
|
|
|
2369
2674
|
let t = new Date(e);
|
|
2370
2675
|
return isNaN(t.getTime()) ? null : this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2371
2676
|
}
|
|
2372
|
-
},
|
|
2677
|
+
}, Tt = class {
|
|
2373
2678
|
constructor(e, t) {
|
|
2374
2679
|
this.databaseAdapter = e, this.dateTimeBuilder = t;
|
|
2375
2680
|
}
|
|
@@ -2384,18 +2689,18 @@ var X = class {
|
|
|
2384
2689
|
if (a.length === 0 && !["set", "notSet"].includes(t)) return t === "equals" ? this.databaseAdapter.buildBooleanLiteral(!1) : null;
|
|
2385
2690
|
let o = a[0];
|
|
2386
2691
|
switch (t) {
|
|
2387
|
-
case "equals": return a.length > 1 ? r?.type === "time" ?
|
|
2388
|
-
case "notEquals": return a.length > 1 ?
|
|
2692
|
+
case "equals": return a.length > 1 ? r?.type === "time" ? ye(e, a.map((e) => this.dateTimeBuilder.normalizeDate(e) || e)) : ye(e, a) : a.length === 1 ? L(e, r?.type === "time" && this.dateTimeBuilder.normalizeDate(o) || o) : this.databaseAdapter.buildBooleanLiteral(!1);
|
|
2693
|
+
case "notEquals": return a.length > 1 ? be(e, a) : a.length === 1 ? he(e, o) : null;
|
|
2389
2694
|
case "contains": return this.databaseAdapter.buildStringCondition(e, "contains", o);
|
|
2390
2695
|
case "notContains": return this.databaseAdapter.buildStringCondition(e, "notContains", o);
|
|
2391
2696
|
case "startsWith": return this.databaseAdapter.buildStringCondition(e, "startsWith", o);
|
|
2392
2697
|
case "endsWith": return this.databaseAdapter.buildStringCondition(e, "endsWith", o);
|
|
2393
|
-
case "gt": return
|
|
2394
|
-
case "gte": return
|
|
2395
|
-
case "lt": return
|
|
2396
|
-
case "lte": return
|
|
2397
|
-
case "set": return
|
|
2398
|
-
case "notSet": return
|
|
2698
|
+
case "gt": return _e(e, o);
|
|
2699
|
+
case "gte": return z(e, o);
|
|
2700
|
+
case "lt": return ve(e, o);
|
|
2701
|
+
case "lte": return B(e, o);
|
|
2702
|
+
case "set": return Se(e);
|
|
2703
|
+
case "notSet": return xe(e);
|
|
2399
2704
|
case "inDateRange":
|
|
2400
2705
|
if (a.length >= 2) {
|
|
2401
2706
|
let t = this.dateTimeBuilder.normalizeDate(a[0]), r = this.dateTimeBuilder.normalizeDate(a[1]);
|
|
@@ -2405,43 +2710,43 @@ var X = class {
|
|
|
2405
2710
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2406
2711
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2407
2712
|
}
|
|
2408
|
-
return
|
|
2713
|
+
return R(z(e, t), B(e, r));
|
|
2409
2714
|
}
|
|
2410
2715
|
}
|
|
2411
2716
|
return null;
|
|
2412
2717
|
case "beforeDate": {
|
|
2413
2718
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2414
|
-
return t ?
|
|
2719
|
+
return t ? ve(e, t) : null;
|
|
2415
2720
|
}
|
|
2416
2721
|
case "afterDate": {
|
|
2417
2722
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2418
|
-
return t ?
|
|
2723
|
+
return t ? _e(e, t) : null;
|
|
2419
2724
|
}
|
|
2420
|
-
case "between": return a.length >= 2 ?
|
|
2421
|
-
case "notBetween": return a.length >= 2 ?
|
|
2422
|
-
case "in": return a.length > 0 ?
|
|
2423
|
-
case "notIn": return a.length > 0 ?
|
|
2725
|
+
case "between": return a.length >= 2 ? R(z(e, a[0]), B(e, a[1])) : null;
|
|
2726
|
+
case "notBetween": return a.length >= 2 ? ge(ve(e, a[0]), _e(e, a[1])) : null;
|
|
2727
|
+
case "in": return a.length > 0 ? ye(e, a) : null;
|
|
2728
|
+
case "notIn": return a.length > 0 ? be(e, a) : null;
|
|
2424
2729
|
case "like": return this.databaseAdapter.buildStringCondition(e, "like", o);
|
|
2425
2730
|
case "notLike": return this.databaseAdapter.buildStringCondition(e, "notLike", o);
|
|
2426
2731
|
case "ilike": return this.databaseAdapter.buildStringCondition(e, "ilike", o);
|
|
2427
2732
|
case "regex": return this.databaseAdapter.buildStringCondition(e, "regex", o);
|
|
2428
2733
|
case "notRegex": return this.databaseAdapter.buildStringCondition(e, "notRegex", o);
|
|
2429
|
-
case "isEmpty": return
|
|
2430
|
-
case "isNotEmpty": return
|
|
2431
|
-
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2432
|
-
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2433
|
-
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2734
|
+
case "isEmpty": return ge(xe(e), L(e, ""));
|
|
2735
|
+
case "isNotEmpty": return R(Se(e), he(e, ""));
|
|
2736
|
+
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ? Ce(e, a) : null;
|
|
2737
|
+
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ? Te(e, a) : null;
|
|
2738
|
+
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ? we(e, a) : null;
|
|
2434
2739
|
default: return null;
|
|
2435
2740
|
}
|
|
2436
2741
|
}
|
|
2437
2742
|
buildLogicalFilter(e, t, n) {
|
|
2438
2743
|
if ("and" in e && e.and) {
|
|
2439
2744
|
let r = e.and.map((e) => this.buildSingleFilter(e, t, n)).filter((e) => e !== null);
|
|
2440
|
-
return r.length > 0 ? r.length === 1 ? r[0] :
|
|
2745
|
+
return r.length > 0 ? r.length === 1 ? r[0] : R(...r) : null;
|
|
2441
2746
|
}
|
|
2442
2747
|
if ("or" in e && e.or) {
|
|
2443
2748
|
let r = e.or.map((e) => this.buildSingleFilter(e, t, n)).filter((e) => e !== null);
|
|
2444
|
-
return r.length > 0 ? r.length === 1 ? r[0] :
|
|
2749
|
+
return r.length > 0 ? r.length === 1 ? r[0] : ge(...r) : null;
|
|
2445
2750
|
}
|
|
2446
2751
|
return null;
|
|
2447
2752
|
}
|
|
@@ -2454,13 +2759,14 @@ var X = class {
|
|
|
2454
2759
|
let c = s.type === "time" ? K(s.sql, n) : typeof s.sql == "function" ? s.sql(n) : s.sql;
|
|
2455
2760
|
return this.buildFilterCondition(c, r.operator, r.values, s, r.dateRange);
|
|
2456
2761
|
}
|
|
2457
|
-
},
|
|
2762
|
+
}, X = class {
|
|
2458
2763
|
dependencyGraph;
|
|
2459
2764
|
cubes;
|
|
2460
2765
|
constructor(e) {
|
|
2461
2766
|
this.cubes = e instanceof Map ? e : new Map([[e.name, e]]), this.dependencyGraph = /* @__PURE__ */ new Map();
|
|
2462
2767
|
}
|
|
2463
2768
|
extractDependencies(e) {
|
|
2769
|
+
if (e.length > 1e3) return [];
|
|
2464
2770
|
let t = e.matchAll(/\{([^}]+)\}/g), n = [];
|
|
2465
2771
|
for (let e of t) {
|
|
2466
2772
|
let t = e[1].trim();
|
|
@@ -2581,14 +2887,14 @@ var X = class {
|
|
|
2581
2887
|
};
|
|
2582
2888
|
//#endregion
|
|
2583
2889
|
//#region src/server/template-substitution.ts
|
|
2584
|
-
function
|
|
2585
|
-
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a =
|
|
2890
|
+
function Et(e, t) {
|
|
2891
|
+
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a = Dt(e), o = /* @__PURE__ */ new Map();
|
|
2586
2892
|
for (let e of a) {
|
|
2587
2893
|
let { originalRef: t, cubeName: a, fieldName: s } = e, c = a || n.name;
|
|
2588
2894
|
if (!r.get(c)) throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);
|
|
2589
2895
|
let l = `${c}.${s}`, u = i.get(l);
|
|
2590
2896
|
if (!u) throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);
|
|
2591
|
-
let d =
|
|
2897
|
+
let d = F`${u()}`;
|
|
2592
2898
|
o.set(t, d);
|
|
2593
2899
|
}
|
|
2594
2900
|
let s = [], c = [], l = 0;
|
|
@@ -2600,12 +2906,13 @@ function vt(e, t) {
|
|
|
2600
2906
|
i && c.push(i), l = r + n.length;
|
|
2601
2907
|
}
|
|
2602
2908
|
}
|
|
2603
|
-
if (s.push(e.substring(l)), c.length === 0) return
|
|
2909
|
+
if (s.push(e.substring(l)), c.length === 0) return F.raw(e);
|
|
2604
2910
|
let u = [];
|
|
2605
|
-
for (let e = 0; e < s.length; e++) s[e] && u.push(new
|
|
2606
|
-
return
|
|
2911
|
+
for (let e = 0; e < s.length; e++) s[e] && u.push(new M(s[e])), e < c.length && u.push(c[e]);
|
|
2912
|
+
return F.join(u, F.raw(""));
|
|
2607
2913
|
}
|
|
2608
|
-
function
|
|
2914
|
+
function Dt(e) {
|
|
2915
|
+
if (e.length > 1e3) return [];
|
|
2609
2916
|
let t = e.matchAll(/\{([^}]+)\}/g), n = [];
|
|
2610
2917
|
for (let e of t) {
|
|
2611
2918
|
let t = e[1].trim();
|
|
@@ -2624,7 +2931,7 @@ function yt(e) {
|
|
|
2624
2931
|
}
|
|
2625
2932
|
return n;
|
|
2626
2933
|
}
|
|
2627
|
-
function
|
|
2934
|
+
function Ot(e) {
|
|
2628
2935
|
let t = [], n = 0;
|
|
2629
2936
|
for (let r = 0; r < e.length; r++) if (e[r] === "{") n++;
|
|
2630
2937
|
else if (e[r] === "}" && (n--, n < 0)) {
|
|
@@ -2632,7 +2939,7 @@ function bt(e) {
|
|
|
2632
2939
|
break;
|
|
2633
2940
|
}
|
|
2634
2941
|
n > 0 && t.push("Unmatched opening brace in template"), /\{\s*\}/.test(e) && t.push("Empty member reference {} found in template"), /\{[^}]*\{/.test(e) && t.push("Nested braces are not allowed in member references");
|
|
2635
|
-
let r =
|
|
2942
|
+
let r = Dt(e);
|
|
2636
2943
|
for (let e of r) {
|
|
2637
2944
|
let n = e.cubeName ? `${e.cubeName}.${e.fieldName}` : e.fieldName;
|
|
2638
2945
|
/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n) || t.push(`Invalid member reference {${e.originalRef}}: must start with letter or underscore, and contain only letters, numbers, underscores, and dots`), n.split(".").length > 2 && t.push(`Invalid member reference {${e.originalRef}}: only one dot allowed (Cube.measure format)`);
|
|
@@ -2642,8 +2949,8 @@ function bt(e) {
|
|
|
2642
2949
|
errors: t
|
|
2643
2950
|
};
|
|
2644
2951
|
}
|
|
2645
|
-
function
|
|
2646
|
-
let n =
|
|
2952
|
+
function kt(e, t) {
|
|
2953
|
+
let n = Dt(e), r = /* @__PURE__ */ new Set();
|
|
2647
2954
|
for (let e of n) {
|
|
2648
2955
|
let n = `${e.cubeName || t}.${e.fieldName}`;
|
|
2649
2956
|
r.add(n);
|
|
@@ -2652,12 +2959,12 @@ function xt(e, t) {
|
|
|
2652
2959
|
}
|
|
2653
2960
|
//#endregion
|
|
2654
2961
|
//#region src/server/builders/measure-builder.ts
|
|
2655
|
-
var
|
|
2962
|
+
var Z = class e {
|
|
2656
2963
|
constructor(e) {
|
|
2657
2964
|
this.databaseAdapter = e;
|
|
2658
2965
|
}
|
|
2659
2966
|
buildResolvedMeasures(t, n, r, i) {
|
|
2660
|
-
let a = /* @__PURE__ */ new Map(), o = [], s = [], c = new Set(t), l = new
|
|
2967
|
+
let a = /* @__PURE__ */ new Map(), o = [], s = [], c = new Set(t), l = new X(n);
|
|
2661
2968
|
for (let e of n.values()) l.buildGraph(e);
|
|
2662
2969
|
let u = [];
|
|
2663
2970
|
for (let r of t) {
|
|
@@ -2670,11 +2977,11 @@ var Q = class e {
|
|
|
2670
2977
|
n && c.add(n);
|
|
2671
2978
|
continue;
|
|
2672
2979
|
}
|
|
2673
|
-
|
|
2980
|
+
X.isCalculatedMeasure(d) ? (s.push(r), kt(d.calculatedSql, t).forEach((e) => c.add(e)), l.getAllDependencies(r).forEach((e) => {
|
|
2674
2981
|
let [t, r] = e.split("."), i = n.get(t);
|
|
2675
2982
|
if (i && i.measures[r]) {
|
|
2676
2983
|
let e = i.measures[r];
|
|
2677
|
-
|
|
2984
|
+
X.isCalculatedMeasure(e) && kt(e.calculatedSql, t).forEach((e) => c.add(e));
|
|
2678
2985
|
}
|
|
2679
2986
|
})) : o.push(r);
|
|
2680
2987
|
}
|
|
@@ -2684,7 +2991,7 @@ var Q = class e {
|
|
|
2684
2991
|
if (a && a.measures && a.measures[i]) {
|
|
2685
2992
|
let n = a.measures[i];
|
|
2686
2993
|
if (e.isPostAggregationWindow(n)) continue;
|
|
2687
|
-
|
|
2994
|
+
X.isCalculatedMeasure(n) ? s.includes(t) || s.push(t) : o.includes(t) || o.push(t);
|
|
2688
2995
|
}
|
|
2689
2996
|
}
|
|
2690
2997
|
for (let e of o) {
|
|
@@ -2705,7 +3012,7 @@ var Q = class e {
|
|
|
2705
3012
|
}
|
|
2706
3013
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
2707
3014
|
if (!e.calculatedSql) throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);
|
|
2708
|
-
return
|
|
3015
|
+
return Et(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql), {
|
|
2709
3016
|
cube: t,
|
|
2710
3017
|
allCubes: n,
|
|
2711
3018
|
resolvedMeasures: r,
|
|
@@ -2714,32 +3021,32 @@ var Q = class e {
|
|
|
2714
3021
|
}
|
|
2715
3022
|
buildCTECalculatedMeasure(e, t, n, r, i) {
|
|
2716
3023
|
if (!e.calculatedSql) throw Error(`Calculated measure '${t.name}.${e.name || "unknown"}' missing calculatedSql property`);
|
|
2717
|
-
let a = /* @__PURE__ */ new Map(), o =
|
|
3024
|
+
let a = /* @__PURE__ */ new Map(), o = kt(e.calculatedSql, t.name);
|
|
2718
3025
|
for (let e of o) {
|
|
2719
3026
|
let [t, i] = e.split("."), o = r.get(t);
|
|
2720
3027
|
if (o && o.measures[i]) {
|
|
2721
3028
|
let t = o.measures[i];
|
|
2722
3029
|
if (n.measures.includes(e)) {
|
|
2723
|
-
let r =
|
|
3030
|
+
let r = F`${F.identifier(n.cteAlias)}.${F.identifier(i)}`, o;
|
|
2724
3031
|
switch (t.type) {
|
|
2725
3032
|
case "count":
|
|
2726
3033
|
case "countDistinct":
|
|
2727
3034
|
case "sum":
|
|
2728
|
-
o =
|
|
3035
|
+
o = V(r);
|
|
2729
3036
|
break;
|
|
2730
3037
|
case "avg":
|
|
2731
3038
|
o = this.databaseAdapter.buildAvg(r);
|
|
2732
3039
|
break;
|
|
2733
3040
|
case "min":
|
|
2734
|
-
o =
|
|
3041
|
+
o = Ae(r);
|
|
2735
3042
|
break;
|
|
2736
3043
|
case "max":
|
|
2737
|
-
o =
|
|
3044
|
+
o = H(r);
|
|
2738
3045
|
break;
|
|
2739
3046
|
case "number":
|
|
2740
|
-
o =
|
|
3047
|
+
o = V(r);
|
|
2741
3048
|
break;
|
|
2742
|
-
default: o =
|
|
3049
|
+
default: o = V(r);
|
|
2743
3050
|
}
|
|
2744
3051
|
a.set(e, () => o);
|
|
2745
3052
|
}
|
|
@@ -2757,16 +3064,16 @@ var Q = class e {
|
|
|
2757
3064
|
if (i.joinCubes) for (let e of i.joinCubes) o.set(e.cube.name, e.cube);
|
|
2758
3065
|
return this.buildCTECalculatedMeasure(n, t, a, o, r);
|
|
2759
3066
|
} else {
|
|
2760
|
-
let e =
|
|
3067
|
+
let e = F`${F.identifier(a.cteAlias)}.${F.identifier(t)}`;
|
|
2761
3068
|
switch (n.type) {
|
|
2762
3069
|
case "count":
|
|
2763
3070
|
case "countDistinct":
|
|
2764
|
-
case "sum": return
|
|
3071
|
+
case "sum": return V(e);
|
|
2765
3072
|
case "avg": return this.databaseAdapter.buildAvg(e);
|
|
2766
|
-
case "min": return
|
|
2767
|
-
case "max": return
|
|
2768
|
-
case "number": return
|
|
2769
|
-
default: return
|
|
3073
|
+
case "min": return Ae(e);
|
|
3074
|
+
case "max": return H(e);
|
|
3075
|
+
case "number": return V(e);
|
|
3076
|
+
default: return V(e);
|
|
2770
3077
|
}
|
|
2771
3078
|
}
|
|
2772
3079
|
}
|
|
@@ -2780,10 +3087,10 @@ var Q = class e {
|
|
|
2780
3087
|
if (t.filters && t.filters.length > 0) {
|
|
2781
3088
|
let e = t.filters.map((e) => {
|
|
2782
3089
|
let t = e(n);
|
|
2783
|
-
return t ?
|
|
3090
|
+
return t ? F`(${t})` : void 0;
|
|
2784
3091
|
}).filter(Boolean);
|
|
2785
3092
|
if (e.length > 0) {
|
|
2786
|
-
let t = e.length === 1 ? e[0] :
|
|
3093
|
+
let t = e.length === 1 ? e[0] : R(...e);
|
|
2787
3094
|
i = this.databaseAdapter.buildCaseWhen([{
|
|
2788
3095
|
when: t,
|
|
2789
3096
|
then: i
|
|
@@ -2791,22 +3098,22 @@ var Q = class e {
|
|
|
2791
3098
|
}
|
|
2792
3099
|
}
|
|
2793
3100
|
switch (t.type) {
|
|
2794
|
-
case "count": return
|
|
2795
|
-
case "countDistinct": return
|
|
2796
|
-
case "sum": return
|
|
3101
|
+
case "count": return Oe(i);
|
|
3102
|
+
case "countDistinct": return ke(i);
|
|
3103
|
+
case "sum": return V(i);
|
|
2797
3104
|
case "avg": return this.databaseAdapter.buildAvg(i);
|
|
2798
|
-
case "min": return
|
|
2799
|
-
case "max": return
|
|
3105
|
+
case "min": return Ae(i);
|
|
3106
|
+
case "max": return H(i);
|
|
2800
3107
|
case "number": return i;
|
|
2801
3108
|
case "stddev":
|
|
2802
3109
|
case "stddevSamp": {
|
|
2803
3110
|
let e = t.type === "stddevSamp" || t.statisticalConfig?.useSample, n = this.databaseAdapter.buildStddev(i, e);
|
|
2804
|
-
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3111
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`MAX(NULL)`) : n;
|
|
2805
3112
|
}
|
|
2806
3113
|
case "variance":
|
|
2807
3114
|
case "varianceSamp": {
|
|
2808
3115
|
let e = t.type === "varianceSamp" || t.statisticalConfig?.useSample, n = this.databaseAdapter.buildVariance(i, e);
|
|
2809
|
-
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3116
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`MAX(NULL)`) : n;
|
|
2810
3117
|
}
|
|
2811
3118
|
case "percentile":
|
|
2812
3119
|
case "median":
|
|
@@ -2826,7 +3133,7 @@ var Q = class e {
|
|
|
2826
3133
|
default: e = t.statisticalConfig?.percentile ?? 50;
|
|
2827
3134
|
}
|
|
2828
3135
|
let n = this.databaseAdapter.buildPercentile(i, e);
|
|
2829
|
-
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3136
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`MAX(NULL)`) : n;
|
|
2830
3137
|
}
|
|
2831
3138
|
case "lag":
|
|
2832
3139
|
case "lead":
|
|
@@ -2872,9 +3179,9 @@ var Q = class e {
|
|
|
2872
3179
|
nTile: e.nTile,
|
|
2873
3180
|
frame: e.frame
|
|
2874
3181
|
});
|
|
2875
|
-
return s === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3182
|
+
return s === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`NULL`) : s;
|
|
2876
3183
|
}
|
|
2877
|
-
default: return
|
|
3184
|
+
default: return Oe(i);
|
|
2878
3185
|
}
|
|
2879
3186
|
}
|
|
2880
3187
|
static WINDOW_FUNCTION_TYPES = [
|
|
@@ -2948,7 +3255,7 @@ var Q = class e {
|
|
|
2948
3255
|
let { postAggWindowMeasures: r } = e.categorizeForPostAggregation(t, n);
|
|
2949
3256
|
return r.length > 0;
|
|
2950
3257
|
}
|
|
2951
|
-
},
|
|
3258
|
+
}, At = class {
|
|
2952
3259
|
constructor(e) {
|
|
2953
3260
|
this.dateTimeBuilder = e;
|
|
2954
3261
|
}
|
|
@@ -2995,8 +3302,8 @@ var Q = class e {
|
|
|
2995
3302
|
l = !0;
|
|
2996
3303
|
break;
|
|
2997
3304
|
}
|
|
2998
|
-
if (
|
|
2999
|
-
let n =
|
|
3305
|
+
if (Z.isPostAggregationWindow(e)) {
|
|
3306
|
+
let n = Z.getWindowBaseMeasure(e, t);
|
|
3000
3307
|
if (n) {
|
|
3001
3308
|
let [e, t] = n.split("."), r = a.get(e)?.measures?.[t];
|
|
3002
3309
|
if (r && this.isAggregateFunctionType(r.type)) {
|
|
@@ -3016,7 +3323,7 @@ var Q = class e {
|
|
|
3016
3323
|
let t = e.joinKeys.find((e) => e.targetColumn === o);
|
|
3017
3324
|
if (t && t.sourceColumnObj) i.push(t.sourceColumnObj);
|
|
3018
3325
|
else {
|
|
3019
|
-
let t =
|
|
3326
|
+
let t = F`${F.identifier(e.cteAlias)}.${F.identifier(o)}`;
|
|
3020
3327
|
i.push(t);
|
|
3021
3328
|
}
|
|
3022
3329
|
} else {
|
|
@@ -3035,7 +3342,7 @@ var Q = class e {
|
|
|
3035
3342
|
let r = this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj, e.granularity, n);
|
|
3036
3343
|
i.push(r);
|
|
3037
3344
|
} else {
|
|
3038
|
-
let e =
|
|
3345
|
+
let e = F`${F.identifier(a.cteAlias)}.${F.identifier(o)}`;
|
|
3039
3346
|
i.push(e);
|
|
3040
3347
|
}
|
|
3041
3348
|
} else {
|
|
@@ -3046,13 +3353,13 @@ var Q = class e {
|
|
|
3046
3353
|
}
|
|
3047
3354
|
return i;
|
|
3048
3355
|
}
|
|
3049
|
-
},
|
|
3356
|
+
}, jt = class {
|
|
3050
3357
|
dateTimeBuilder;
|
|
3051
3358
|
filterBuilder;
|
|
3052
3359
|
groupByBuilder;
|
|
3053
3360
|
measureBuilder;
|
|
3054
3361
|
constructor(e) {
|
|
3055
|
-
this.dateTimeBuilder = new
|
|
3362
|
+
this.dateTimeBuilder = new Y(e), this.filterBuilder = new Tt(e, this.dateTimeBuilder), this.groupByBuilder = new At(this.dateTimeBuilder), this.measureBuilder = new Z(e);
|
|
3056
3363
|
}
|
|
3057
3364
|
buildResolvedMeasures(e, t, n, r) {
|
|
3058
3365
|
return this.measureBuilder.buildResolvedMeasures(e, t, n, r);
|
|
@@ -3063,24 +3370,24 @@ var Q = class e {
|
|
|
3063
3370
|
let [t, a] = e.split("."), o = i.get(t);
|
|
3064
3371
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3065
3372
|
let t = o.dimensions[a];
|
|
3066
|
-
r[e] =
|
|
3373
|
+
r[e] = F`${K(t.sql, n)}`.as(e);
|
|
3067
3374
|
}
|
|
3068
3375
|
}
|
|
3069
3376
|
if (t.measures) {
|
|
3070
3377
|
let e = this.buildResolvedMeasures(t.measures, i, n);
|
|
3071
3378
|
for (let n of t.measures) {
|
|
3072
3379
|
let t = e.get(n);
|
|
3073
|
-
t && (r[n] =
|
|
3380
|
+
t && typeof t == "function" && (r[n] = F`${t()}`.as(n));
|
|
3074
3381
|
}
|
|
3075
3382
|
}
|
|
3076
3383
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
3077
3384
|
let [t, a] = e.dimension.split("."), o = i.get(t);
|
|
3078
3385
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3079
3386
|
let t = o.dimensions[a], i = this.buildTimeDimensionExpression(t.sql, e.granularity, n);
|
|
3080
|
-
r[e.dimension] =
|
|
3387
|
+
r[e.dimension] = F`${i}`.as(e.dimension);
|
|
3081
3388
|
}
|
|
3082
3389
|
}
|
|
3083
|
-
return Object.keys(r).length === 0 && (r.count =
|
|
3390
|
+
return Object.keys(r).length === 0 && (r.count = Oe()), r;
|
|
3084
3391
|
}
|
|
3085
3392
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
3086
3393
|
return this.measureBuilder.buildCalculatedMeasure(e, t, n, r, i);
|
|
@@ -3116,7 +3423,7 @@ var Q = class e {
|
|
|
3116
3423
|
if (s && s.dimensions[i] && e.dateRange) {
|
|
3117
3424
|
if (r?.preAggregationCTEs && r.preAggregationCTEs.some((e) => e.cube.name === t)) continue;
|
|
3118
3425
|
if (n.filterCache) {
|
|
3119
|
-
let t =
|
|
3426
|
+
let t = ht(e.dimension, e.dateRange), r = n.filterCache.get(t);
|
|
3120
3427
|
if (r) {
|
|
3121
3428
|
a.push(r);
|
|
3122
3429
|
continue;
|
|
@@ -3141,11 +3448,11 @@ var Q = class e {
|
|
|
3141
3448
|
let a = e;
|
|
3142
3449
|
if (a.and) {
|
|
3143
3450
|
let e = a.and.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3144
|
-
return e.length > 0 ?
|
|
3451
|
+
return e.length > 0 ? R(...e) : null;
|
|
3145
3452
|
}
|
|
3146
3453
|
if (a.or) {
|
|
3147
3454
|
let e = a.or.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3148
|
-
return e.length > 0 ?
|
|
3455
|
+
return e.length > 0 ? ge(...e) : null;
|
|
3149
3456
|
}
|
|
3150
3457
|
}
|
|
3151
3458
|
let a = e, [o, s] = a.member.split("."), c = t.get(o);
|
|
@@ -3156,7 +3463,7 @@ var Q = class e {
|
|
|
3156
3463
|
if (i?.preAggregationCTEs && i.preAggregationCTEs.some((e) => e.cube.name === o)) return null;
|
|
3157
3464
|
let t = l.type === "time";
|
|
3158
3465
|
if (n.filterCache) {
|
|
3159
|
-
let t =
|
|
3466
|
+
let t = mt(e), r = n.filterCache.get(t);
|
|
3160
3467
|
if (r) return r;
|
|
3161
3468
|
}
|
|
3162
3469
|
let r = t ? K(l.sql, n) : typeof l.sql == "function" ? l.sql(n) : l.sql;
|
|
@@ -3185,12 +3492,12 @@ var Q = class e {
|
|
|
3185
3492
|
];
|
|
3186
3493
|
if (e.order && Object.keys(e.order).length > 0) for (let [t, i] of Object.entries(e.order)) {
|
|
3187
3494
|
if (!r.includes(t)) throw Error(`Cannot order by '${t}': field is not selected in the query`);
|
|
3188
|
-
let e = i === "desc" ?
|
|
3495
|
+
let e = i === "desc" ? De(F.identifier(t)) : Ee(F.identifier(t));
|
|
3189
3496
|
n.push(e);
|
|
3190
3497
|
}
|
|
3191
3498
|
if (e.timeDimensions && e.timeDimensions.length > 0) {
|
|
3192
3499
|
let t = new Set(Object.keys(e.order || {})), r = [...e.timeDimensions].sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
3193
|
-
for (let e of r) t.has(e.dimension) || n.push(
|
|
3500
|
+
for (let e of r) t.has(e.dimension) || n.push(Ee(F.identifier(e.dimension)));
|
|
3194
3501
|
}
|
|
3195
3502
|
return n;
|
|
3196
3503
|
}
|
|
@@ -3225,7 +3532,7 @@ var Q = class e {
|
|
|
3225
3532
|
buildLogicalFilter(e, t, n) {
|
|
3226
3533
|
return this.filterBuilder.buildLogicalFilter(e, t, n);
|
|
3227
3534
|
}
|
|
3228
|
-
},
|
|
3535
|
+
}, Mt = class {
|
|
3229
3536
|
cubes;
|
|
3230
3537
|
connectivityCache = /* @__PURE__ */ new Map();
|
|
3231
3538
|
reverseIndex;
|
|
@@ -3432,10 +3739,10 @@ var Q = class e {
|
|
|
3432
3739
|
buildJoinCondition(e, t, n) {
|
|
3433
3740
|
let r = [];
|
|
3434
3741
|
for (let i of e.on) {
|
|
3435
|
-
let e = t ?
|
|
3742
|
+
let e = t ? F`${F.identifier(t)}.${F.identifier(i.source.name)}` : dt(i.source), a = n ? F`${F.identifier(n)}.${F.identifier(i.target.name)}` : dt(i.target), o = i.as || L;
|
|
3436
3743
|
r.push(o(e, a));
|
|
3437
3744
|
}
|
|
3438
|
-
return
|
|
3745
|
+
return R(...r);
|
|
3439
3746
|
}
|
|
3440
3747
|
getReachableCubes(e) {
|
|
3441
3748
|
let t = new Set([e]), n = [e];
|
|
@@ -3462,11 +3769,11 @@ var Q = class e {
|
|
|
3462
3769
|
setInCache(e, t) {
|
|
3463
3770
|
this.connectivityCache.set(e, { path: t });
|
|
3464
3771
|
}
|
|
3465
|
-
},
|
|
3772
|
+
}, Nt = class {
|
|
3466
3773
|
resolverCache = /* @__PURE__ */ new WeakMap();
|
|
3467
3774
|
getResolver(e) {
|
|
3468
3775
|
let t = this.resolverCache.get(e);
|
|
3469
|
-
return t || (t = new
|
|
3776
|
+
return t || (t = new Mt(e), this.resolverCache.set(e, t)), t;
|
|
3470
3777
|
}
|
|
3471
3778
|
analyzeCubeUsage(e) {
|
|
3472
3779
|
let t = /* @__PURE__ */ new Set();
|
|
@@ -3555,9 +3862,9 @@ var Q = class e {
|
|
|
3555
3862
|
if (s.has(n)) continue;
|
|
3556
3863
|
let c = e.get(n);
|
|
3557
3864
|
if (!c) throw Error(`Cube '${n}' not found`);
|
|
3558
|
-
let u = l ?
|
|
3865
|
+
let u = l ? lt(i.relationship) : i.relationship;
|
|
3559
3866
|
if (u === "belongsToMany" && i.through) {
|
|
3560
|
-
let e =
|
|
3867
|
+
let e = pt(i, r.securityContext);
|
|
3561
3868
|
o.push({
|
|
3562
3869
|
cube: c,
|
|
3563
3870
|
alias: `${n.toLowerCase()}_cube`,
|
|
@@ -3574,7 +3881,7 @@ var Q = class e {
|
|
|
3574
3881
|
}
|
|
3575
3882
|
});
|
|
3576
3883
|
} else {
|
|
3577
|
-
let e = a.buildJoinCondition(i, null, null), t =
|
|
3884
|
+
let e = a.buildJoinCondition(i, null, null), t = ut(u, i.sqlJoinType);
|
|
3578
3885
|
o.push({
|
|
3579
3886
|
cube: c,
|
|
3580
3887
|
alias: `${n.toLowerCase()}_cube`,
|
|
@@ -3632,7 +3939,7 @@ var Q = class e {
|
|
|
3632
3939
|
targetColumnObj: e.target
|
|
3633
3940
|
})), h = void 0;
|
|
3634
3941
|
}
|
|
3635
|
-
let g = this.findPropagatingFilters(r, c, e), _ = new Map([[c.name, c]]), { aggregateMeasures: v, requiredBaseMeasures: y } =
|
|
3942
|
+
let g = this.findPropagatingFilters(r, c, e), _ = new Map([[c.name, c]]), { aggregateMeasures: v, requiredBaseMeasures: y } = Z.categorizeForPostAggregation(f, _), b = [...new Set([...v, ...Array.from(y).filter((e) => e.startsWith(c.name + "."))])];
|
|
3636
3943
|
if (b.length > 0) {
|
|
3637
3944
|
let t = this.expandCalculatedMeasureDependencies(c, b), i = this.findDownstreamJoinKeys(c, r, e);
|
|
3638
3945
|
a.push({
|
|
@@ -3670,7 +3977,7 @@ var Q = class e {
|
|
|
3670
3977
|
joinDef: e.joinDef,
|
|
3671
3978
|
reversed: e.reversed
|
|
3672
3979
|
}));
|
|
3673
|
-
if (!c.slice(0, -1).some((e) => (e.reversed ?
|
|
3980
|
+
if (!c.slice(0, -1).some((e) => (e.reversed ? lt(e.joinDef.relationship) : e.joinDef.relationship) === "hasMany")) return {
|
|
3674
3981
|
path: c,
|
|
3675
3982
|
hasIntermediateHasMany: !1,
|
|
3676
3983
|
intermediateJoins: [],
|
|
@@ -3793,6 +4100,7 @@ var Q = class e {
|
|
|
3793
4100
|
return Array.from(n);
|
|
3794
4101
|
}
|
|
3795
4102
|
extractDependenciesFromTemplate(e, t) {
|
|
4103
|
+
if (e.length > 1e3) return [];
|
|
3796
4104
|
let n = e.matchAll(/\{([^}]+)\}/g), r = [];
|
|
3797
4105
|
for (let e of n) {
|
|
3798
4106
|
let n = e[1].trim();
|
|
@@ -3973,7 +4281,7 @@ var Q = class e {
|
|
|
3973
4281
|
}
|
|
3974
4282
|
convertInternalPathToJoinPathSteps(e) {
|
|
3975
4283
|
return e.map((e) => {
|
|
3976
|
-
let t = e.reversed ?
|
|
4284
|
+
let t = e.reversed ? lt(e.joinDef.relationship) : e.joinDef.relationship, n = ut(t, e.joinDef.sqlJoinType), r = e.joinDef.on.map((e) => ({
|
|
3977
4285
|
sourceColumn: e.source.name,
|
|
3978
4286
|
targetColumn: e.target.name
|
|
3979
4287
|
})), i = {
|
|
@@ -4038,7 +4346,7 @@ var Q = class e {
|
|
|
4038
4346
|
suggestion: "Add a dimension to see per-group breakdowns, or add a time dimension with granularity."
|
|
4039
4347
|
};
|
|
4040
4348
|
}
|
|
4041
|
-
},
|
|
4349
|
+
}, Pt = class {
|
|
4042
4350
|
constructor(e) {
|
|
4043
4351
|
this.queryBuilder = e;
|
|
4044
4352
|
}
|
|
@@ -4052,19 +4360,19 @@ var Q = class e {
|
|
|
4052
4360
|
}
|
|
4053
4361
|
} else for (let t of e.joinKeys) if (t.targetColumnObj) {
|
|
4054
4362
|
c[t.targetColumn] = t.targetColumnObj;
|
|
4055
|
-
for (let [e, n] of Object.entries(a.dimensions || {})) n.sql === t.targetColumnObj && e !== t.targetColumn && (c[e] =
|
|
4363
|
+
for (let [e, n] of Object.entries(a.dimensions || {})) n.sql === t.targetColumnObj && e !== t.targetColumn && (c[e] = F`${t.targetColumnObj}`.as(e));
|
|
4056
4364
|
}
|
|
4057
4365
|
if (e.downstreamJoinKeys) for (let t of e.downstreamJoinKeys) for (let e of t.joinKeys) e.sourceColumnObj && (c[e.sourceColumn] = e.sourceColumnObj);
|
|
4058
4366
|
let l = a.name, u = new Map([[l, a]]), d = this.queryBuilder.buildResolvedMeasures(e.measures, u, n);
|
|
4059
4367
|
for (let t of e.measures) {
|
|
4060
4368
|
let [, e] = t.split("."), n = d.get(t);
|
|
4061
|
-
n && (c[e] =
|
|
4369
|
+
n && (c[e] = F`${n()}`.as(e));
|
|
4062
4370
|
}
|
|
4063
4371
|
if (t.dimensions) for (let e of t.dimensions) {
|
|
4064
4372
|
let [t, r] = e.split(".");
|
|
4065
4373
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4066
4374
|
let e = a.dimensions[r];
|
|
4067
|
-
c[r] =
|
|
4375
|
+
c[r] = F`${this.queryBuilder.buildMeasureExpression({
|
|
4068
4376
|
sql: e.sql,
|
|
4069
4377
|
type: "number"
|
|
4070
4378
|
}, n)}`.as(r);
|
|
@@ -4074,7 +4382,7 @@ var Q = class e {
|
|
|
4074
4382
|
let [t, r] = e.dimension.split(".");
|
|
4075
4383
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4076
4384
|
let t = a.dimensions[r];
|
|
4077
|
-
c[r] =
|
|
4385
|
+
c[r] = F`${this.queryBuilder.buildTimeDimensionExpression(t.sql, e.granularity, n)}`.as(r);
|
|
4078
4386
|
}
|
|
4079
4387
|
}
|
|
4080
4388
|
if (Object.keys(c).length === 0) return null;
|
|
@@ -4082,8 +4390,8 @@ var Q = class e {
|
|
|
4082
4390
|
if (s && e.intermediateJoins) {
|
|
4083
4391
|
let t = [...e.intermediateJoins].reverse();
|
|
4084
4392
|
for (let e of t) {
|
|
4085
|
-
let t = e.cube.sql(n), r = [
|
|
4086
|
-
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from,
|
|
4393
|
+
let t = e.cube.sql(n), r = [L(e.cteJoinColumn, e.joinDef.on[0]?.target)];
|
|
4394
|
+
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from, R(...r));
|
|
4087
4395
|
}
|
|
4088
4396
|
}
|
|
4089
4397
|
let p = r ? {
|
|
@@ -4121,7 +4429,7 @@ var Q = class e {
|
|
|
4121
4429
|
}
|
|
4122
4430
|
let g = [];
|
|
4123
4431
|
if (o.where && g.push(o.where), g.push(...m, ...h), g.length > 0) {
|
|
4124
|
-
let e = g.length === 1 ? g[0] :
|
|
4432
|
+
let e = g.length === 1 ? g[0] : R(...g);
|
|
4125
4433
|
f = f.where(e);
|
|
4126
4434
|
}
|
|
4127
4435
|
let _ = [], v = /* @__PURE__ */ new Set(), y = (e) => {
|
|
@@ -4154,20 +4462,20 @@ var Q = class e {
|
|
|
4154
4462
|
if (!r) throw Error(`CTE info not found for cube ${e.cube.name}`);
|
|
4155
4463
|
let i = [];
|
|
4156
4464
|
if (r.intermediateJoins && r.intermediateJoins.length > 0) {
|
|
4157
|
-
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o =
|
|
4158
|
-
i.push(
|
|
4465
|
+
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o = F`${F.identifier(t)}.${F.identifier(e.primaryJoinColumn.name)}`;
|
|
4466
|
+
i.push(L(a, o));
|
|
4159
4467
|
} else for (let e of r.joinKeys) {
|
|
4160
|
-
let a = this.resolveCTEJoinSourceColumn(e, r, n), o =
|
|
4161
|
-
i.push(
|
|
4468
|
+
let a = this.resolveCTEJoinSourceColumn(e, r, n), o = F`${F.identifier(t)}.${F.identifier(e.targetColumn)}`;
|
|
4469
|
+
i.push(L(a, o));
|
|
4162
4470
|
}
|
|
4163
|
-
return i.length === 1 ? i[0] :
|
|
4471
|
+
return i.length === 1 ? i[0] : R(...i);
|
|
4164
4472
|
}
|
|
4165
4473
|
resolveCTEJoinSourceColumn(e, t, n) {
|
|
4166
4474
|
if (!e) throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);
|
|
4167
|
-
let r = e.sourceColumnObj ||
|
|
4475
|
+
let r = e.sourceColumnObj || F.identifier(e.sourceColumn);
|
|
4168
4476
|
if (!e.sourceColumnObj || !n.preAggregationCTEs) return r;
|
|
4169
4477
|
for (let r of n.preAggregationCTEs) if (r.cube.name !== t.cube.name) {
|
|
4170
|
-
for (let [t, n] of Object.entries(r.cube.dimensions || {})) if (typeof n.sql != "function" && n.sql === e.sourceColumnObj) return
|
|
4478
|
+
for (let [t, n] of Object.entries(r.cube.dimensions || {})) if (typeof n.sql != "function" && n.sql === e.sourceColumnObj) return F`${F.identifier(r.cteAlias)}.${F.identifier(t)}`;
|
|
4171
4479
|
}
|
|
4172
4480
|
return r;
|
|
4173
4481
|
}
|
|
@@ -4179,24 +4487,24 @@ var Q = class e {
|
|
|
4179
4487
|
i.push(...o);
|
|
4180
4488
|
}
|
|
4181
4489
|
if (i.length === 0) return null;
|
|
4182
|
-
let a = i.length === 1 ? i[0] :
|
|
4490
|
+
let a = i.length === 1 ? i[0] : R(...i), o = e.joinConditions;
|
|
4183
4491
|
if (o.length === 1) {
|
|
4184
4492
|
let { source: e, target: n } = o[0];
|
|
4185
|
-
return
|
|
4493
|
+
return F`${n} IN ${t.db.select({ pk: e }).from(r.from).where(a)}`;
|
|
4186
4494
|
} else {
|
|
4187
|
-
let e =
|
|
4188
|
-
return
|
|
4495
|
+
let e = R(...o.map((e) => L(e.source, e.target)), a);
|
|
4496
|
+
return F`EXISTS ${t.db.select({ one: F`1` }).from(r.from).where(e)}`;
|
|
4189
4497
|
}
|
|
4190
4498
|
}
|
|
4191
4499
|
};
|
|
4192
4500
|
//#endregion
|
|
4193
4501
|
//#region src/server/gap-filler.ts
|
|
4194
|
-
function
|
|
4195
|
-
let r = [], i =
|
|
4196
|
-
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i =
|
|
4502
|
+
function Ft(e, t, n) {
|
|
4503
|
+
let r = [], i = It(new Date(e), n), a = It(new Date(t), n);
|
|
4504
|
+
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i = Lt(i, n);
|
|
4197
4505
|
return r;
|
|
4198
4506
|
}
|
|
4199
|
-
function
|
|
4507
|
+
function It(e, t) {
|
|
4200
4508
|
let n = new Date(e);
|
|
4201
4509
|
switch (t) {
|
|
4202
4510
|
case "second":
|
|
@@ -4230,7 +4538,7 @@ function Ot(e, t) {
|
|
|
4230
4538
|
}
|
|
4231
4539
|
return n;
|
|
4232
4540
|
}
|
|
4233
|
-
function
|
|
4541
|
+
function Lt(e, t) {
|
|
4234
4542
|
let n = new Date(e);
|
|
4235
4543
|
switch (t) {
|
|
4236
4544
|
case "second":
|
|
@@ -4260,7 +4568,7 @@ function kt(e, t) {
|
|
|
4260
4568
|
}
|
|
4261
4569
|
return n;
|
|
4262
4570
|
}
|
|
4263
|
-
function
|
|
4571
|
+
function Rt(e) {
|
|
4264
4572
|
if (e instanceof Date) return e.toISOString();
|
|
4265
4573
|
if (typeof e == "string") {
|
|
4266
4574
|
let t = new Date(e);
|
|
@@ -4268,15 +4576,15 @@ function At(e) {
|
|
|
4268
4576
|
}
|
|
4269
4577
|
return String(e);
|
|
4270
4578
|
}
|
|
4271
|
-
function
|
|
4579
|
+
function zt(e, t) {
|
|
4272
4580
|
return t.length === 0 ? "__all__" : t.map((t) => String(e[t] ?? "")).join("|||");
|
|
4273
4581
|
}
|
|
4274
|
-
function
|
|
4275
|
-
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c =
|
|
4582
|
+
function Bt(e, t) {
|
|
4583
|
+
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c = Ft(i[0], i[1], r);
|
|
4276
4584
|
if (c.length === 0) return e;
|
|
4277
4585
|
let l = /* @__PURE__ */ new Map();
|
|
4278
4586
|
for (let t of e) {
|
|
4279
|
-
let e =
|
|
4587
|
+
let e = zt(t, s), r = Rt(t[n]);
|
|
4280
4588
|
l.has(e) || l.set(e, /* @__PURE__ */ new Map()), l.get(e).set(r, t);
|
|
4281
4589
|
}
|
|
4282
4590
|
l.size === 0 && s.length === 0 && l.set("__all__", /* @__PURE__ */ new Map());
|
|
@@ -4296,7 +4604,7 @@ function Mt(e, t) {
|
|
|
4296
4604
|
}
|
|
4297
4605
|
return u;
|
|
4298
4606
|
}
|
|
4299
|
-
function
|
|
4607
|
+
function Vt(e) {
|
|
4300
4608
|
if (!e) return null;
|
|
4301
4609
|
if (Array.isArray(e)) {
|
|
4302
4610
|
if (e.length < 2) return null;
|
|
@@ -4306,7 +4614,7 @@ function Nt(e) {
|
|
|
4306
4614
|
let t = new Date(e);
|
|
4307
4615
|
return isNaN(t.getTime()) ? null : [t, t];
|
|
4308
4616
|
}
|
|
4309
|
-
function
|
|
4617
|
+
function Ht(e, t, n) {
|
|
4310
4618
|
if (!t.timeDimensions || t.timeDimensions.length === 0) return e;
|
|
4311
4619
|
let r = t.timeDimensions.filter((e) => {
|
|
4312
4620
|
let t = e.fillMissingDates !== !1, n = e.granularity && e.dateRange;
|
|
@@ -4315,7 +4623,7 @@ function Pt(e, t, n) {
|
|
|
4315
4623
|
if (r.length === 0) return e;
|
|
4316
4624
|
let i = t.fillMissingDatesValue === void 0 ? 0 : t.fillMissingDatesValue, a = new Set(t.timeDimensions.map((e) => e.dimension)), o = (t.dimensions || []).filter((e) => !a.has(e)), s = e;
|
|
4317
4625
|
for (let e of r) {
|
|
4318
|
-
let t =
|
|
4626
|
+
let t = Vt(e.dateRange);
|
|
4319
4627
|
if (!t) continue;
|
|
4320
4628
|
let r = {
|
|
4321
4629
|
timeDimensionKey: e.dimension,
|
|
@@ -4325,16 +4633,16 @@ function Pt(e, t, n) {
|
|
|
4325
4633
|
measures: n,
|
|
4326
4634
|
dimensions: o
|
|
4327
4635
|
};
|
|
4328
|
-
s =
|
|
4636
|
+
s = Bt(s, r);
|
|
4329
4637
|
}
|
|
4330
4638
|
return s;
|
|
4331
4639
|
}
|
|
4332
4640
|
//#endregion
|
|
4333
4641
|
//#region src/server/builders/comparison-query-builder.ts
|
|
4334
|
-
var
|
|
4642
|
+
var Ut = class {
|
|
4335
4643
|
dateTimeBuilder;
|
|
4336
4644
|
constructor(e) {
|
|
4337
|
-
this.dateTimeBuilder = new
|
|
4645
|
+
this.dateTimeBuilder = new Y(e);
|
|
4338
4646
|
}
|
|
4339
4647
|
hasComparison(e) {
|
|
4340
4648
|
return e.timeDimensions?.some((e) => e.compareDateRange && e.compareDateRange.length >= 2) ?? !1;
|
|
@@ -4462,11 +4770,11 @@ var Ft = class {
|
|
|
4462
4770
|
return typeof i == "string" && typeof a == "string" ? new Date(i).getTime() - new Date(a).getTime() : 0;
|
|
4463
4771
|
});
|
|
4464
4772
|
}
|
|
4465
|
-
},
|
|
4773
|
+
}, Wt = class {
|
|
4466
4774
|
filterBuilder;
|
|
4467
4775
|
dateTimeBuilder;
|
|
4468
4776
|
constructor(e) {
|
|
4469
|
-
this.databaseAdapter = e, this.dateTimeBuilder = new
|
|
4777
|
+
this.databaseAdapter = e, this.dateTimeBuilder = new Y(e), this.filterBuilder = new Tt(e, this.dateTimeBuilder);
|
|
4470
4778
|
}
|
|
4471
4779
|
hasFunnel(e) {
|
|
4472
4780
|
return e.funnel !== void 0 && e.funnel.steps.length >= 2;
|
|
@@ -4501,7 +4809,7 @@ var Ft = class {
|
|
|
4501
4809
|
if (i.name || n.push(`Step ${r} must have a name`), "cube" in i && i.cube && (t.get(i.cube) || n.push(`Step ${r} cube not found: ${i.cube}`)), i.filter) {
|
|
4502
4810
|
let a;
|
|
4503
4811
|
"cube" in i && i.cube ? a = i.cube : typeof e.bindingKey == "string" && ([a] = e.bindingKey.split("."));
|
|
4504
|
-
let o = a ? new
|
|
4812
|
+
let o = a ? new Mt(t) : null, s = Array.isArray(i.filter) ? i.filter : [i.filter];
|
|
4505
4813
|
for (let e of s) if ("member" in e) {
|
|
4506
4814
|
let [i, s] = e.member.split("."), c = t.get(i);
|
|
4507
4815
|
if (!c) n.push(`Step ${r} filter cube not found: ${i}`);
|
|
@@ -4564,7 +4872,7 @@ var Ft = class {
|
|
|
4564
4872
|
return t;
|
|
4565
4873
|
}
|
|
4566
4874
|
resolveSteps(e, t, n) {
|
|
4567
|
-
let r = new
|
|
4875
|
+
let r = new Mt(t);
|
|
4568
4876
|
return e.steps.map((i, a) => {
|
|
4569
4877
|
let o = this.resolveCubeForStep(i, e, t), s = this.resolveBindingKey(e, o, n), c = this.resolveTimeDimension(e, o, n), l = this.buildStepFilters(i, o, t, n), u = this.extractFilterCubeNames(i), d = [];
|
|
4570
4878
|
for (let e of u) if (e !== o.name) {
|
|
@@ -4655,15 +4963,15 @@ var Ft = class {
|
|
|
4655
4963
|
a && i.push(a);
|
|
4656
4964
|
}
|
|
4657
4965
|
}
|
|
4658
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : o ?
|
|
4966
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : o ? R(...i) : F`(${F.join(i, F` OR `)})`;
|
|
4659
4967
|
}
|
|
4660
4968
|
let o = e, [s, c] = o.member.split("."), l = o.dateRange !== void 0;
|
|
4661
4969
|
if (o.operator !== "set" && o.operator !== "notSet" && !l && (!o.values || o.values.length === 0 || o.values[0] === void 0 || o.values[0] === "")) return null;
|
|
4662
4970
|
let u = n.get(s);
|
|
4663
4971
|
if (!u) return null;
|
|
4664
4972
|
if (s !== t.name) {
|
|
4665
|
-
let e = new
|
|
4666
|
-
if (!e || e.length === 0) return console.warn(`Funnel filter: Cannot filter by '${s}.${c}' in step using '${t.name}'. No join path found. Filter will be skipped.`), null;
|
|
4973
|
+
let e = new Mt(n).findPath(t.name, s);
|
|
4974
|
+
if (!e || e.length === 0) return console.warn(`Funnel filter: Cannot filter by '${String(s).replace(/\n|\r/g, "")}.${String(c).replace(/\n|\r/g, "")}' in step using '${String(t.name).replace(/\n|\r/g, "")}'. No join path found. Filter will be skipped.`), null;
|
|
4667
4975
|
}
|
|
4668
4976
|
let d = u.dimensions?.[c];
|
|
4669
4977
|
if (!d) return null;
|
|
@@ -4677,11 +4985,11 @@ var Ft = class {
|
|
|
4677
4985
|
let n = `step_${e.index}`, r = e.cube.sql(t), i = [];
|
|
4678
4986
|
r.where && i.push(r.where), i.push(...e.filterConditions);
|
|
4679
4987
|
let a = t.db.select({
|
|
4680
|
-
binding_key:
|
|
4681
|
-
step_time:
|
|
4988
|
+
binding_key: F`${e.bindingKeyExpr}`.as("binding_key"),
|
|
4989
|
+
step_time: F`MIN(${e.timeExpr})`.as("step_time")
|
|
4682
4990
|
}).from(r.from);
|
|
4683
4991
|
if (a = this.addCrossJoinsToQuery(a, e, t, i), i.length > 0) {
|
|
4684
|
-
let e = i.length === 1 ? i[0] :
|
|
4992
|
+
let e = i.length === 1 ? i[0] : R(...i);
|
|
4685
4993
|
a = a.where(e);
|
|
4686
4994
|
}
|
|
4687
4995
|
return a = a.groupBy(e.bindingKeyExpr), t.db.$with(n).as(a);
|
|
@@ -4689,18 +4997,18 @@ var Ft = class {
|
|
|
4689
4997
|
buildSubsequentStepCTE(e, t, n) {
|
|
4690
4998
|
let r = `step_${e.index}`, i = `step_${e.index - 1}`, a = e.cube.sql(t), o = [];
|
|
4691
4999
|
a.where && o.push(a.where), o.push(...e.filterConditions);
|
|
4692
|
-
let s =
|
|
5000
|
+
let s = F`${F.identifier(i)}.step_time`, c = F`${e.timeExpr} > ${s}`;
|
|
4693
5001
|
if (e.timeToConvert) {
|
|
4694
5002
|
let t = this.databaseAdapter.buildDateAddInterval(s, e.timeToConvert);
|
|
4695
|
-
c =
|
|
5003
|
+
c = F`${c} AND ${e.timeExpr} <= ${t}`;
|
|
4696
5004
|
}
|
|
4697
5005
|
o.push(c);
|
|
4698
5006
|
let l = t.db.select({
|
|
4699
|
-
binding_key:
|
|
4700
|
-
step_time:
|
|
4701
|
-
}).from(a.from).innerJoin(n,
|
|
5007
|
+
binding_key: F`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5008
|
+
step_time: F`MIN(${e.timeExpr})`.as("step_time")
|
|
5009
|
+
}).from(a.from).innerJoin(n, F`${e.bindingKeyExpr} = ${F.identifier(i)}.binding_key`);
|
|
4702
5010
|
if (l = this.addCrossJoinsToQuery(l, e, t, o), o.length > 0) {
|
|
4703
|
-
let e = o.length === 1 ? o[0] :
|
|
5011
|
+
let e = o.length === 1 ? o[0] : R(...o);
|
|
4704
5012
|
l = l.where(e);
|
|
4705
5013
|
}
|
|
4706
5014
|
return l = l.groupBy(e.bindingKeyExpr), t.db.$with(r).as(l);
|
|
@@ -4709,49 +5017,46 @@ var Ft = class {
|
|
|
4709
5017
|
if (t.joinedCubes.length === 0) return e;
|
|
4710
5018
|
for (let i of t.joinedCubes) for (let t of i.joinPath) {
|
|
4711
5019
|
let a = t.joinDef, o = [];
|
|
4712
|
-
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(
|
|
4713
|
-
let s = o.length === 1 ? o[0] :
|
|
5020
|
+
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(L(e.source, e.target));
|
|
5021
|
+
let s = o.length === 1 ? o[0] : R(...o), c = i.cube.sql(n);
|
|
4714
5022
|
e = e.leftJoin(c.from, s), c.where && r.push(c.where);
|
|
4715
5023
|
}
|
|
4716
5024
|
return e;
|
|
4717
5025
|
}
|
|
4718
5026
|
buildFunnelResultsCTE(e, t, n, r) {
|
|
4719
5027
|
let i = {
|
|
4720
|
-
binding_key:
|
|
4721
|
-
step_0_time:
|
|
4722
|
-
};
|
|
4723
|
-
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] = N`s${N.raw(String(e))}.step_time`;
|
|
4724
|
-
let a = N`${N.identifier("step_0")} s0`;
|
|
4725
|
-
for (let e = 1; e < t.length; e++) a = N`${a}
|
|
4726
|
-
LEFT JOIN ${N.identifier(`step_${e}`)} s${N.raw(String(e))} ON s0.binding_key = s${N.raw(String(e))}.binding_key`;
|
|
4727
|
-
let o = Object.entries(i).map(([e, t]) => N`${t} AS ${N.identifier(e)}`), s = N`SELECT ${N.join(o, N`, `)} FROM ${a}`, c = {
|
|
4728
|
-
binding_key: N`binding_key`.as("binding_key"),
|
|
4729
|
-
step_0_time: N`step_0_time`.as("step_0_time")
|
|
5028
|
+
binding_key: F`s0.binding_key`,
|
|
5029
|
+
step_0_time: F`s0.step_time`
|
|
4730
5030
|
};
|
|
4731
|
-
for (let e = 1; e < t.length; e++)
|
|
4732
|
-
|
|
5031
|
+
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] = F`s${F.raw(String(e))}.step_time`;
|
|
5032
|
+
let a = F`${F.identifier("step_0")} s0`;
|
|
5033
|
+
for (let e = 1; e < t.length; e++) a = F`${a}
|
|
5034
|
+
LEFT JOIN ${F.identifier(`step_${e}`)} s${F.raw(String(e))} ON s0.binding_key = s${F.raw(String(e))}.binding_key`;
|
|
5035
|
+
let o = Object.entries(i).map(([e, t]) => F`${t} AS ${F.identifier(e)}`), s = F`SELECT ${F.join(o, F`, `)} FROM ${a}`;
|
|
5036
|
+
return r.db.$with("funnel_joined").as(s);
|
|
4733
5037
|
}
|
|
4734
5038
|
buildAggregationCTE(e, t, n, r, i) {
|
|
4735
5039
|
let a = {};
|
|
4736
|
-
a.step_0_count =
|
|
4737
|
-
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] =
|
|
5040
|
+
a.step_0_count = F`COUNT(*)`.as("step_0_count");
|
|
5041
|
+
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] = F`COUNT(${F.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);
|
|
4738
5042
|
if (r.includeTimeMetrics) for (let e = 1; e < n.length; e++) {
|
|
4739
|
-
let t =
|
|
4740
|
-
a[`step_${e}_avg_seconds`] = this.databaseAdapter.buildConditionalAggregation("avg", r, i).as(`step_${e}_avg_seconds`), a[`step_${e}_min_seconds`] = this.databaseAdapter.buildConditionalAggregation("min", r, i).as(`step_${e}_min_seconds`), a[`step_${e}_max_seconds`] = this.databaseAdapter.buildConditionalAggregation("max", r, i).as(`step_${e}_max_seconds`)
|
|
4741
|
-
|
|
4742
|
-
|
|
4743
|
-
|
|
4744
|
-
|
|
5043
|
+
let t = F.identifier(`step_${e}_time`), n = F.identifier(`step_${e - 1}_time`), r = this.databaseAdapter.buildTimeDifferenceSeconds(F`${t}`, F`${n}`), i = F`${t} IS NOT NULL`;
|
|
5044
|
+
if (a[`step_${e}_avg_seconds`] = this.databaseAdapter.buildConditionalAggregation("avg", r, i).as(`step_${e}_avg_seconds`), a[`step_${e}_min_seconds`] = this.databaseAdapter.buildConditionalAggregation("min", r, i).as(`step_${e}_min_seconds`), a[`step_${e}_max_seconds`] = this.databaseAdapter.buildConditionalAggregation("max", r, i).as(`step_${e}_max_seconds`), this.databaseAdapter.getCapabilities().supportsPercentileSubqueries) {
|
|
5045
|
+
let n = this.databaseAdapter.buildPercentile(r, 50);
|
|
5046
|
+
n && (a[`step_${e}_median_seconds`] = F`(SELECT ${n} FROM ${F.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));
|
|
5047
|
+
let i = this.databaseAdapter.buildPercentile(r, 90);
|
|
5048
|
+
i && (a[`step_${e}_p90_seconds`] = F`(SELECT ${i} FROM ${F.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`));
|
|
5049
|
+
}
|
|
4745
5050
|
}
|
|
4746
5051
|
let o = i.db.select(a).from(e);
|
|
4747
5052
|
return i.db.$with("funnel_metrics").as(o);
|
|
4748
5053
|
}
|
|
4749
|
-
},
|
|
5054
|
+
}, Gt = class {
|
|
4750
5055
|
filterBuilder;
|
|
4751
5056
|
dateTimeBuilder;
|
|
4752
5057
|
databaseAdapter;
|
|
4753
5058
|
constructor(e) {
|
|
4754
|
-
this.databaseAdapter = e, this.dateTimeBuilder = new
|
|
5059
|
+
this.databaseAdapter = e, this.dateTimeBuilder = new Y(e), this.filterBuilder = new Tt(e, this.dateTimeBuilder);
|
|
4755
5060
|
}
|
|
4756
5061
|
hasFlow(e) {
|
|
4757
5062
|
return e.flow !== void 0 && e.flow.startingStep !== void 0 && e.flow.eventDimension !== void 0;
|
|
@@ -4913,7 +5218,7 @@ var Ft = class {
|
|
|
4913
5218
|
let r = this.buildFilterCondition(e, t, n);
|
|
4914
5219
|
r && i.push(r);
|
|
4915
5220
|
}
|
|
4916
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ?
|
|
5221
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ? R(...i) : F`(${F.join(i, F` OR `)})`;
|
|
4917
5222
|
}
|
|
4918
5223
|
if ("type" in e && "filters" in e) {
|
|
4919
5224
|
let r = e, i = [];
|
|
@@ -4921,7 +5226,7 @@ var Ft = class {
|
|
|
4921
5226
|
let r = this.buildFilterCondition(e, t, n);
|
|
4922
5227
|
r && i.push(r);
|
|
4923
5228
|
}
|
|
4924
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ?
|
|
5229
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ? R(...i) : F`(${F.join(i, F` OR `)})`;
|
|
4925
5230
|
}
|
|
4926
5231
|
let r = e, [, i] = r.member.split("."), a = t.dimensions?.[i];
|
|
4927
5232
|
if (!a) return null;
|
|
@@ -4932,13 +5237,13 @@ var Ft = class {
|
|
|
4932
5237
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o, startingStepFilters: s } = t, c = [];
|
|
4933
5238
|
r.where && c.push(r.where), c.push(...s);
|
|
4934
5239
|
let l = n.db.select({
|
|
4935
|
-
binding_key:
|
|
4936
|
-
start_time:
|
|
4937
|
-
event_type:
|
|
4938
|
-
event_path:
|
|
5240
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5241
|
+
start_time: F`MIN(${a})`.as("start_time"),
|
|
5242
|
+
event_type: F`${o}`.as("event_type"),
|
|
5243
|
+
event_path: F`${o}`.as("event_path")
|
|
4939
5244
|
}).from(r.from);
|
|
4940
5245
|
if (c.length > 0) {
|
|
4941
|
-
let e = c.length === 1 ? c[0] :
|
|
5246
|
+
let e = c.length === 1 ? c[0] : R(...c);
|
|
4942
5247
|
l = l.where(e);
|
|
4943
5248
|
}
|
|
4944
5249
|
return l = l.groupBy(i, o), e.entityLimit && (l = l.limit(e.entityLimit)), n.db.$with("starting_entities").as(l);
|
|
@@ -4947,18 +5252,18 @@ var Ft = class {
|
|
|
4947
5252
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
4948
5253
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
4949
5254
|
let e = t === 1 ? "starting_entities" : `before_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `before_step_${t}`, d = [];
|
|
4950
|
-
r.where && d.push(r.where), d.push(
|
|
4951
|
-
let f = d.length === 1 ? d[0] :
|
|
4952
|
-
binding_key:
|
|
4953
|
-
step_time:
|
|
4954
|
-
event_type:
|
|
5255
|
+
r.where && d.push(r.where), d.push(F`${i} = ${F.identifier(e)}.binding_key`, F`${a} < ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5256
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${o} || ${"→"} || ${F.identifier(e)}.event_path` : F`${o}`, m = n.db.select({
|
|
5257
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5258
|
+
step_time: F`${a}`.as("step_time"),
|
|
5259
|
+
event_type: F`${o}`.as("event_type"),
|
|
4955
5260
|
event_path: p.as("event_path")
|
|
4956
|
-
}).from(r.from).where(f).orderBy(
|
|
4957
|
-
binding_key:
|
|
4958
|
-
step_time:
|
|
4959
|
-
event_type:
|
|
4960
|
-
event_path:
|
|
4961
|
-
}).from(
|
|
5261
|
+
}).from(r.from).where(f).orderBy(F`${a} DESC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5262
|
+
binding_key: F`e.binding_key`.as("binding_key"),
|
|
5263
|
+
step_time: F`e.step_time`.as("step_time"),
|
|
5264
|
+
event_type: F`e.event_type`.as("event_type"),
|
|
5265
|
+
event_path: F`e.event_path`.as("event_path")
|
|
5266
|
+
}).from(F`${F.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
4962
5267
|
s.push(h);
|
|
4963
5268
|
}
|
|
4964
5269
|
return s;
|
|
@@ -4967,18 +5272,18 @@ var Ft = class {
|
|
|
4967
5272
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
4968
5273
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
4969
5274
|
let e = t === 1 ? "starting_entities" : `after_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `after_step_${t}`, d = [];
|
|
4970
|
-
r.where && d.push(r.where), d.push(
|
|
4971
|
-
let f = d.length === 1 ? d[0] :
|
|
4972
|
-
binding_key:
|
|
4973
|
-
step_time:
|
|
4974
|
-
event_type:
|
|
5275
|
+
r.where && d.push(r.where), d.push(F`${i} = ${F.identifier(e)}.binding_key`, F`${a} > ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5276
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${F.identifier(e)}.event_path || ${"→"} || ${o}` : F`${o}`, m = n.db.select({
|
|
5277
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5278
|
+
step_time: F`${a}`.as("step_time"),
|
|
5279
|
+
event_type: F`${o}`.as("event_type"),
|
|
4975
5280
|
event_path: p.as("event_path")
|
|
4976
|
-
}).from(r.from).where(f).orderBy(
|
|
4977
|
-
binding_key:
|
|
4978
|
-
step_time:
|
|
4979
|
-
event_type:
|
|
4980
|
-
event_path:
|
|
4981
|
-
}).from(
|
|
5281
|
+
}).from(r.from).where(f).orderBy(F`${a} ASC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5282
|
+
binding_key: F`e.binding_key`.as("binding_key"),
|
|
5283
|
+
step_time: F`e.step_time`.as("step_time"),
|
|
5284
|
+
event_type: F`e.event_type`.as("event_type"),
|
|
5285
|
+
event_path: F`e.event_path`.as("event_path")
|
|
5286
|
+
}).from(F`${F.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
4982
5287
|
s.push(h);
|
|
4983
5288
|
}
|
|
4984
5289
|
return s;
|
|
@@ -4987,19 +5292,19 @@ var Ft = class {
|
|
|
4987
5292
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
4988
5293
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
4989
5294
|
let e = t === 1 ? "starting_entities" : `before_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `before_step_${t}`, d = [];
|
|
4990
|
-
r.where && d.push(r.where), d.push(
|
|
4991
|
-
let f = d.length === 1 ? d[0] :
|
|
4992
|
-
binding_key:
|
|
4993
|
-
step_time:
|
|
4994
|
-
event_type:
|
|
5295
|
+
r.where && d.push(r.where), d.push(F`${a} < ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5296
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${o} || ${"→"} || ${F.identifier(e)}.event_path` : F`${o}`, m = n.db.select({
|
|
5297
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5298
|
+
step_time: F`${a}`.as("step_time"),
|
|
5299
|
+
event_type: F`${o}`.as("event_type"),
|
|
4995
5300
|
event_path: p.as("event_path"),
|
|
4996
|
-
rn:
|
|
4997
|
-
}).from(r.from).innerJoin(
|
|
4998
|
-
binding_key:
|
|
4999
|
-
step_time:
|
|
5000
|
-
event_type:
|
|
5001
|
-
event_path:
|
|
5002
|
-
}).from(m.as("ranked")).where(
|
|
5301
|
+
rn: F`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as("rn")
|
|
5302
|
+
}).from(r.from).innerJoin(F`${F.identifier(e)}`, F`${i} = ${F.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5303
|
+
binding_key: F`binding_key`.as("binding_key"),
|
|
5304
|
+
step_time: F`step_time`.as("step_time"),
|
|
5305
|
+
event_type: F`event_type`.as("event_type"),
|
|
5306
|
+
event_path: F`event_path`.as("event_path")
|
|
5307
|
+
}).from(m.as("ranked")).where(F`rn = 1`);
|
|
5003
5308
|
s.push(n.db.$with(u).as(h));
|
|
5004
5309
|
}
|
|
5005
5310
|
return s;
|
|
@@ -5008,19 +5313,19 @@ var Ft = class {
|
|
|
5008
5313
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5009
5314
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5010
5315
|
let e = t === 1 ? "starting_entities" : `after_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `after_step_${t}`, d = [];
|
|
5011
|
-
r.where && d.push(r.where), d.push(
|
|
5012
|
-
let f = d.length === 1 ? d[0] :
|
|
5013
|
-
binding_key:
|
|
5014
|
-
step_time:
|
|
5015
|
-
event_type:
|
|
5316
|
+
r.where && d.push(r.where), d.push(F`${a} > ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5317
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${F.identifier(e)}.event_path || ${"→"} || ${o}` : F`${o}`, m = n.db.select({
|
|
5318
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5319
|
+
step_time: F`${a}`.as("step_time"),
|
|
5320
|
+
event_type: F`${o}`.as("event_type"),
|
|
5016
5321
|
event_path: p.as("event_path"),
|
|
5017
|
-
rn:
|
|
5018
|
-
}).from(r.from).innerJoin(
|
|
5019
|
-
binding_key:
|
|
5020
|
-
step_time:
|
|
5021
|
-
event_type:
|
|
5022
|
-
event_path:
|
|
5023
|
-
}).from(m.as("ranked")).where(
|
|
5322
|
+
rn: F`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as("rn")
|
|
5323
|
+
}).from(r.from).innerJoin(F`${F.identifier(e)}`, F`${i} = ${F.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5324
|
+
binding_key: F`binding_key`.as("binding_key"),
|
|
5325
|
+
step_time: F`step_time`.as("step_time"),
|
|
5326
|
+
event_type: F`event_type`.as("event_type"),
|
|
5327
|
+
event_path: F`event_path`.as("event_path")
|
|
5328
|
+
}).from(m.as("ranked")).where(F`rn = 1`);
|
|
5024
5329
|
s.push(n.db.$with(u).as(h));
|
|
5025
5330
|
}
|
|
5026
5331
|
return s;
|
|
@@ -5029,27 +5334,27 @@ var Ft = class {
|
|
|
5029
5334
|
let n = [], r = e.outputMode === "sunburst";
|
|
5030
5335
|
for (let t = e.stepsBefore; t >= 1; t--) {
|
|
5031
5336
|
let e = -t, i = `before_step_${t}`;
|
|
5032
|
-
r ? n.push(
|
|
5337
|
+
r ? n.push(F`
|
|
5033
5338
|
SELECT
|
|
5034
|
-
${
|
|
5339
|
+
${F.raw(`'before_${t}_'`)} || event_path AS node_id,
|
|
5035
5340
|
event_type AS name,
|
|
5036
|
-
${
|
|
5341
|
+
${F.raw(String(e))} AS layer,
|
|
5037
5342
|
COUNT(*) AS value
|
|
5038
|
-
FROM ${
|
|
5343
|
+
FROM ${F.identifier(i)}
|
|
5039
5344
|
GROUP BY event_path, event_type
|
|
5040
|
-
`) : n.push(
|
|
5345
|
+
`) : n.push(F`
|
|
5041
5346
|
SELECT
|
|
5042
|
-
${
|
|
5347
|
+
${F.raw(`'before_${t}_'`)} || event_type AS node_id,
|
|
5043
5348
|
event_type AS name,
|
|
5044
|
-
${
|
|
5349
|
+
${F.raw(String(e))} AS layer,
|
|
5045
5350
|
COUNT(*) AS value
|
|
5046
|
-
FROM ${
|
|
5351
|
+
FROM ${F.identifier(i)}
|
|
5047
5352
|
GROUP BY event_type
|
|
5048
5353
|
`);
|
|
5049
5354
|
}
|
|
5050
|
-
n.push(
|
|
5355
|
+
n.push(F`
|
|
5051
5356
|
SELECT
|
|
5052
|
-
${
|
|
5357
|
+
${F.raw("'start_'")} || event_type AS node_id,
|
|
5053
5358
|
event_type AS name,
|
|
5054
5359
|
0 AS layer,
|
|
5055
5360
|
COUNT(*) AS value
|
|
@@ -5058,82 +5363,82 @@ var Ft = class {
|
|
|
5058
5363
|
`);
|
|
5059
5364
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5060
5365
|
let e = t, i = `after_step_${t}`;
|
|
5061
|
-
r ? n.push(
|
|
5366
|
+
r ? n.push(F`
|
|
5062
5367
|
SELECT
|
|
5063
|
-
${
|
|
5368
|
+
${F.raw(`'after_${t}_'`)} || event_path AS node_id,
|
|
5064
5369
|
event_type AS name,
|
|
5065
|
-
${
|
|
5370
|
+
${F.raw(String(e))} AS layer,
|
|
5066
5371
|
COUNT(*) AS value
|
|
5067
|
-
FROM ${
|
|
5372
|
+
FROM ${F.identifier(i)}
|
|
5068
5373
|
GROUP BY event_path, event_type
|
|
5069
|
-
`) : n.push(
|
|
5374
|
+
`) : n.push(F`
|
|
5070
5375
|
SELECT
|
|
5071
|
-
${
|
|
5376
|
+
${F.raw(`'after_${t}_'`)} || event_type AS node_id,
|
|
5072
5377
|
event_type AS name,
|
|
5073
|
-
${
|
|
5378
|
+
${F.raw(String(e))} AS layer,
|
|
5074
5379
|
COUNT(*) AS value
|
|
5075
|
-
FROM ${
|
|
5380
|
+
FROM ${F.identifier(i)}
|
|
5076
5381
|
GROUP BY event_type
|
|
5077
5382
|
`);
|
|
5078
5383
|
}
|
|
5079
|
-
let i =
|
|
5080
|
-
node_id:
|
|
5081
|
-
name:
|
|
5082
|
-
layer:
|
|
5083
|
-
value:
|
|
5084
|
-
}).from(
|
|
5384
|
+
let i = F.join(n, F` UNION ALL `), a = t.db.select({
|
|
5385
|
+
node_id: F`node_id`.as("node_id"),
|
|
5386
|
+
name: F`name`.as("name"),
|
|
5387
|
+
layer: F`layer`.as("layer"),
|
|
5388
|
+
value: F`value`.as("value")
|
|
5389
|
+
}).from(F`(${i}) AS nodes_union`);
|
|
5085
5390
|
return t.db.$with("nodes_agg").as(a);
|
|
5086
5391
|
}
|
|
5087
5392
|
buildLinksAggregationCTE(e, t) {
|
|
5088
5393
|
let n = [], r = e.outputMode === "sunburst";
|
|
5089
5394
|
for (let t = e.stepsBefore; t >= 2; t--) {
|
|
5090
5395
|
let e = `before_step_${t}`, i = `before_step_${t - 1}`;
|
|
5091
|
-
r ? n.push(
|
|
5396
|
+
r ? n.push(F`
|
|
5092
5397
|
SELECT
|
|
5093
|
-
${
|
|
5094
|
-
${
|
|
5398
|
+
${F.raw(`'before_${t}_'`)} || f.event_path AS source_id,
|
|
5399
|
+
${F.raw(`'before_${t - 1}_'`)} || t.event_path AS target_id,
|
|
5095
5400
|
COUNT(*) AS value
|
|
5096
|
-
FROM ${
|
|
5097
|
-
INNER JOIN ${
|
|
5401
|
+
FROM ${F.identifier(e)} f
|
|
5402
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5098
5403
|
GROUP BY f.event_path, t.event_path
|
|
5099
|
-
`) : n.push(
|
|
5404
|
+
`) : n.push(F`
|
|
5100
5405
|
SELECT
|
|
5101
|
-
${
|
|
5102
|
-
${
|
|
5406
|
+
${F.raw(`'before_${t}_'`)} || f.event_type AS source_id,
|
|
5407
|
+
${F.raw(`'before_${t - 1}_'`)} || t.event_type AS target_id,
|
|
5103
5408
|
COUNT(*) AS value
|
|
5104
|
-
FROM ${
|
|
5105
|
-
INNER JOIN ${
|
|
5409
|
+
FROM ${F.identifier(e)} f
|
|
5410
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5106
5411
|
GROUP BY f.event_type, t.event_type
|
|
5107
5412
|
`);
|
|
5108
5413
|
}
|
|
5109
|
-
e.stepsBefore >= 1 && (r ? n.push(
|
|
5414
|
+
e.stepsBefore >= 1 && (r ? n.push(F`
|
|
5110
5415
|
SELECT
|
|
5111
|
-
${
|
|
5112
|
-
${
|
|
5416
|
+
${F.raw("'before_1_'")} || b.event_path AS source_id,
|
|
5417
|
+
${F.raw("'start_'")} || s.event_type AS target_id,
|
|
5113
5418
|
COUNT(*) AS value
|
|
5114
5419
|
FROM before_step_1 b
|
|
5115
5420
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5116
5421
|
GROUP BY b.event_path, s.event_type
|
|
5117
|
-
`) : n.push(
|
|
5422
|
+
`) : n.push(F`
|
|
5118
5423
|
SELECT
|
|
5119
|
-
${
|
|
5120
|
-
${
|
|
5424
|
+
${F.raw("'before_1_'")} || b.event_type AS source_id,
|
|
5425
|
+
${F.raw("'start_'")} || s.event_type AS target_id,
|
|
5121
5426
|
COUNT(*) AS value
|
|
5122
5427
|
FROM before_step_1 b
|
|
5123
5428
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5124
5429
|
GROUP BY b.event_type, s.event_type
|
|
5125
|
-
`)), e.stepsAfter >= 1 && (r ? n.push(
|
|
5430
|
+
`)), e.stepsAfter >= 1 && (r ? n.push(F`
|
|
5126
5431
|
SELECT
|
|
5127
|
-
${
|
|
5128
|
-
${
|
|
5432
|
+
${F.raw("'start_'")} || s.event_type AS source_id,
|
|
5433
|
+
${F.raw("'after_1_'")} || a.event_path AS target_id,
|
|
5129
5434
|
COUNT(*) AS value
|
|
5130
5435
|
FROM starting_entities s
|
|
5131
5436
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
5132
5437
|
GROUP BY s.event_type, a.event_path
|
|
5133
|
-
`) : n.push(
|
|
5438
|
+
`) : n.push(F`
|
|
5134
5439
|
SELECT
|
|
5135
|
-
${
|
|
5136
|
-
${
|
|
5440
|
+
${F.raw("'start_'")} || s.event_type AS source_id,
|
|
5441
|
+
${F.raw("'after_1_'")} || a.event_type AS target_id,
|
|
5137
5442
|
COUNT(*) AS value
|
|
5138
5443
|
FROM starting_entities s
|
|
5139
5444
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
@@ -5141,41 +5446,41 @@ var Ft = class {
|
|
|
5141
5446
|
`));
|
|
5142
5447
|
for (let t = 1; t < e.stepsAfter; t++) {
|
|
5143
5448
|
let e = `after_step_${t}`, i = `after_step_${t + 1}`;
|
|
5144
|
-
r ? n.push(
|
|
5449
|
+
r ? n.push(F`
|
|
5145
5450
|
SELECT
|
|
5146
|
-
${
|
|
5147
|
-
${
|
|
5451
|
+
${F.raw(`'after_${t}_'`)} || f.event_path AS source_id,
|
|
5452
|
+
${F.raw(`'after_${t + 1}_'`)} || t.event_path AS target_id,
|
|
5148
5453
|
COUNT(*) AS value
|
|
5149
|
-
FROM ${
|
|
5150
|
-
INNER JOIN ${
|
|
5454
|
+
FROM ${F.identifier(e)} f
|
|
5455
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5151
5456
|
GROUP BY f.event_path, t.event_path
|
|
5152
|
-
`) : n.push(
|
|
5457
|
+
`) : n.push(F`
|
|
5153
5458
|
SELECT
|
|
5154
|
-
${
|
|
5155
|
-
${
|
|
5459
|
+
${F.raw(`'after_${t}_'`)} || f.event_type AS source_id,
|
|
5460
|
+
${F.raw(`'after_${t + 1}_'`)} || t.event_type AS target_id,
|
|
5156
5461
|
COUNT(*) AS value
|
|
5157
|
-
FROM ${
|
|
5158
|
-
INNER JOIN ${
|
|
5462
|
+
FROM ${F.identifier(e)} f
|
|
5463
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5159
5464
|
GROUP BY f.event_type, t.event_type
|
|
5160
5465
|
`);
|
|
5161
5466
|
}
|
|
5162
5467
|
if (n.length === 0) {
|
|
5163
5468
|
let e = t.db.select({
|
|
5164
|
-
source_id:
|
|
5165
|
-
target_id:
|
|
5166
|
-
value:
|
|
5167
|
-
}).from(
|
|
5469
|
+
source_id: F`NULL`.as("source_id"),
|
|
5470
|
+
target_id: F`NULL`.as("target_id"),
|
|
5471
|
+
value: F`0`.as("value")
|
|
5472
|
+
}).from(F`(SELECT 1) AS empty`).where(F`1 = 0`);
|
|
5168
5473
|
return t.db.$with("links_agg").as(e);
|
|
5169
5474
|
}
|
|
5170
|
-
let i =
|
|
5171
|
-
source_id:
|
|
5172
|
-
target_id:
|
|
5173
|
-
value:
|
|
5174
|
-
}).from(
|
|
5475
|
+
let i = F.join(n, F` UNION ALL `), a = t.db.select({
|
|
5476
|
+
source_id: F`source_id`.as("source_id"),
|
|
5477
|
+
target_id: F`target_id`.as("target_id"),
|
|
5478
|
+
value: F`value`.as("value")
|
|
5479
|
+
}).from(F`(${i}) AS links_union`);
|
|
5175
5480
|
return t.db.$with("links_agg").as(a);
|
|
5176
5481
|
}
|
|
5177
5482
|
buildFinalResultCTE(e) {
|
|
5178
|
-
let t =
|
|
5483
|
+
let t = F`
|
|
5179
5484
|
SELECT
|
|
5180
5485
|
'node' AS record_type,
|
|
5181
5486
|
node_id AS id,
|
|
@@ -5197,44 +5502,44 @@ var Ft = class {
|
|
|
5197
5502
|
FROM links_agg
|
|
5198
5503
|
WHERE source_id IS NOT NULL
|
|
5199
5504
|
`, n = e.db.select({
|
|
5200
|
-
record_type:
|
|
5201
|
-
id:
|
|
5202
|
-
name:
|
|
5203
|
-
layer:
|
|
5204
|
-
value:
|
|
5205
|
-
source_id:
|
|
5206
|
-
target_id:
|
|
5207
|
-
}).from(
|
|
5505
|
+
record_type: F`record_type`.as("record_type"),
|
|
5506
|
+
id: F`id`.as("id"),
|
|
5507
|
+
name: F`name`.as("name"),
|
|
5508
|
+
layer: F`layer`.as("layer"),
|
|
5509
|
+
value: F`value`.as("value"),
|
|
5510
|
+
source_id: F`source_id`.as("source_id"),
|
|
5511
|
+
target_id: F`target_id`.as("target_id")
|
|
5512
|
+
}).from(F`(${t}) AS final_union`);
|
|
5208
5513
|
return e.db.$with("final_result").as(n);
|
|
5209
5514
|
}
|
|
5210
5515
|
};
|
|
5211
5516
|
//#endregion
|
|
5212
5517
|
//#region src/server/types/retention.ts
|
|
5213
|
-
function
|
|
5518
|
+
function Kt(e) {
|
|
5214
5519
|
return Array.isArray(e);
|
|
5215
5520
|
}
|
|
5216
|
-
function
|
|
5521
|
+
function qt(e) {
|
|
5217
5522
|
return typeof e == "object" && !!e && "cube" in e;
|
|
5218
5523
|
}
|
|
5219
|
-
function
|
|
5220
|
-
if (
|
|
5524
|
+
function Jt(e) {
|
|
5525
|
+
if (qt(e)) return e.cube;
|
|
5221
5526
|
let t = e.indexOf(".");
|
|
5222
5527
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5223
5528
|
return e.substring(0, t);
|
|
5224
5529
|
}
|
|
5225
|
-
function
|
|
5226
|
-
if (
|
|
5530
|
+
function Yt(e) {
|
|
5531
|
+
if (qt(e)) return e.dimension;
|
|
5227
5532
|
let t = e.indexOf(".");
|
|
5228
5533
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5229
5534
|
return e.substring(t + 1);
|
|
5230
5535
|
}
|
|
5231
5536
|
//#endregion
|
|
5232
5537
|
//#region src/server/builders/retention-query-builder.ts
|
|
5233
|
-
var
|
|
5538
|
+
var Xt = class {
|
|
5234
5539
|
filterBuilder;
|
|
5235
5540
|
dateTimeBuilder;
|
|
5236
5541
|
constructor(e) {
|
|
5237
|
-
this.databaseAdapter = e, this.dateTimeBuilder = new
|
|
5542
|
+
this.databaseAdapter = e, this.dateTimeBuilder = new Y(e), this.filterBuilder = new Tt(e, this.dateTimeBuilder);
|
|
5238
5543
|
}
|
|
5239
5544
|
hasRetention(e) {
|
|
5240
5545
|
return e.retention !== void 0 && e.retention.timeDimension != null && e.retention.bindingKey != null;
|
|
@@ -5242,12 +5547,12 @@ var Ht = class {
|
|
|
5242
5547
|
validateConfig(e, t) {
|
|
5243
5548
|
let n = [];
|
|
5244
5549
|
try {
|
|
5245
|
-
let r =
|
|
5550
|
+
let r = Jt(e.timeDimension), i = Yt(e.timeDimension), a = t.get(r);
|
|
5246
5551
|
a ? a.dimensions?.[i] || n.push(`Time dimension not found: ${i} in cube ${r}`) : n.push(`Cube not found: ${r}`);
|
|
5247
5552
|
} catch {
|
|
5248
5553
|
n.push(`Invalid time dimension format: ${e.timeDimension}`);
|
|
5249
5554
|
}
|
|
5250
|
-
if (
|
|
5555
|
+
if (Kt(e.bindingKey)) for (let r of e.bindingKey) {
|
|
5251
5556
|
let e = t.get(r.cube);
|
|
5252
5557
|
if (!e) n.push(`Binding key mapping cube not found: ${r.cube}`);
|
|
5253
5558
|
else {
|
|
@@ -5299,23 +5604,23 @@ var Ht = class {
|
|
|
5299
5604
|
}
|
|
5300
5605
|
buildRetentionQuery(e, t, n) {
|
|
5301
5606
|
let r = this.resolveConfig(e, t, n), i = r.breakdowns.length, a = this.buildCohortBaseCTE(e, r, n), o = this.buildActivityPeriodsCTE(e, r, n), s = this.buildCohortSizesCTE(e, n, i), c = this.buildRetentionCountsCTE(e, n, i), l = r.breakdowns.length > 0, u = {
|
|
5302
|
-
period:
|
|
5303
|
-
cohort_size:
|
|
5304
|
-
retained_users:
|
|
5305
|
-
retention_rate:
|
|
5607
|
+
period: F`rc.period_number`.as("period"),
|
|
5608
|
+
cohort_size: F`cs.cohort_size`.as("cohort_size"),
|
|
5609
|
+
retained_users: F`rc.retained_users`.as("retained_users"),
|
|
5610
|
+
retention_rate: F`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as("retention_rate")
|
|
5306
5611
|
};
|
|
5307
|
-
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] =
|
|
5308
|
-
let d = n.db.with(a, o, s, c).select(u).from(
|
|
5612
|
+
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] = F.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5613
|
+
let d = n.db.with(a, o, s, c).select(u).from(F`retention_counts rc`);
|
|
5309
5614
|
if (l) {
|
|
5310
|
-
let e = r.breakdowns.map((e, t) =>
|
|
5311
|
-
d = d.innerJoin(
|
|
5312
|
-
} else d = d.innerJoin(
|
|
5615
|
+
let e = r.breakdowns.map((e, t) => F`COALESCE(CAST(rc.breakdown_${F.raw(String(t))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${F.raw(String(t))} AS TEXT), '')`), t = e.length === 1 ? e[0] : F.join(e, F` AND `);
|
|
5616
|
+
d = d.innerJoin(F`cohort_sizes cs`, t);
|
|
5617
|
+
} else d = d.innerJoin(F`cohort_sizes cs`, F`1 = 1`);
|
|
5313
5618
|
let f = [];
|
|
5314
|
-
for (let e = 0; e < r.breakdowns.length; e++) f.push(
|
|
5315
|
-
return f.push(
|
|
5619
|
+
for (let e = 0; e < r.breakdowns.length; e++) f.push(F.raw(`rc.breakdown_${e}`));
|
|
5620
|
+
return f.push(F`rc.period_number`), d = d.orderBy(...f), d;
|
|
5316
5621
|
}
|
|
5317
5622
|
transformResult(e, t) {
|
|
5318
|
-
let n = t.breakdownDimensions || [], r = n.length > 0;
|
|
5623
|
+
let n = t.breakdownDimensions || [], r = Math.min(n.length, 100), i = r > 0;
|
|
5319
5624
|
return e.map((e) => {
|
|
5320
5625
|
let t = {
|
|
5321
5626
|
period: Number(e.period),
|
|
@@ -5323,19 +5628,19 @@ var Ht = class {
|
|
|
5323
5628
|
retainedUsers: Number(e.retained_users),
|
|
5324
5629
|
retentionRate: e.retention_rate === null ? 0 : Number(e.retention_rate)
|
|
5325
5630
|
};
|
|
5326
|
-
if (
|
|
5327
|
-
let
|
|
5328
|
-
for (let t = 0; t <
|
|
5329
|
-
let
|
|
5330
|
-
r
|
|
5631
|
+
if (i) {
|
|
5632
|
+
let i = {};
|
|
5633
|
+
for (let t = 0; t < r; t++) {
|
|
5634
|
+
let r = n[t], a = e[`breakdown_${t}`];
|
|
5635
|
+
i[r] = a === void 0 ? null : String(a);
|
|
5331
5636
|
}
|
|
5332
|
-
t.breakdownValues =
|
|
5637
|
+
t.breakdownValues = i;
|
|
5333
5638
|
}
|
|
5334
5639
|
return t;
|
|
5335
5640
|
});
|
|
5336
5641
|
}
|
|
5337
5642
|
resolveConfig(e, t, n) {
|
|
5338
|
-
let r =
|
|
5643
|
+
let r = Jt(e.timeDimension), i = Yt(e.timeDimension), a = t.get(r);
|
|
5339
5644
|
if (!a) throw Error(`Cube not found: ${r}`);
|
|
5340
5645
|
let o = a.dimensions?.[i];
|
|
5341
5646
|
if (!o) throw Error(`Time dimension not found: ${i}`);
|
|
@@ -5360,7 +5665,7 @@ var Ht = class {
|
|
|
5360
5665
|
};
|
|
5361
5666
|
}
|
|
5362
5667
|
resolveBindingKey(e, t, n, r) {
|
|
5363
|
-
if (
|
|
5668
|
+
if (Kt(e)) {
|
|
5364
5669
|
let i = e.find((e) => e.cube === t.name);
|
|
5365
5670
|
if (!i) throw Error(`No binding key mapping found for cube: ${t.name}`);
|
|
5366
5671
|
let a = this.extractDimensionName(i.dimension), o = n.get(i.cube);
|
|
@@ -5391,7 +5696,7 @@ var Ht = class {
|
|
|
5391
5696
|
let i = this.buildSingleFilterCondition(e, t, n, r);
|
|
5392
5697
|
i && a.push(i);
|
|
5393
5698
|
}
|
|
5394
|
-
return a.length === 0 ? null : a.length === 1 ? a[0] : o ?
|
|
5699
|
+
return a.length === 0 ? null : a.length === 1 ? a[0] : o ? R(...a) : F`(${F.join(a, F` OR `)})`;
|
|
5395
5700
|
}
|
|
5396
5701
|
let i = e, [a, o] = i.member.split("."), s = n.get(a);
|
|
5397
5702
|
if (!s) return null;
|
|
@@ -5407,16 +5712,16 @@ var Ht = class {
|
|
|
5407
5712
|
i.push(n);
|
|
5408
5713
|
}
|
|
5409
5714
|
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = {
|
|
5410
|
-
binding_key:
|
|
5411
|
-
cohort_entry:
|
|
5715
|
+
binding_key: F`${t.bindingKeyExpr}`.as("binding_key"),
|
|
5716
|
+
cohort_entry: F`MIN(${a})`.as("cohort_entry")
|
|
5412
5717
|
};
|
|
5413
5718
|
for (let e = 0; e < t.breakdowns.length; e++) {
|
|
5414
5719
|
let { expr: n } = t.breakdowns[e];
|
|
5415
|
-
o[`breakdown_${e}`] =
|
|
5720
|
+
o[`breakdown_${e}`] = F`MIN(${n})`.as(`breakdown_${e}`);
|
|
5416
5721
|
}
|
|
5417
5722
|
let s = n.db.select(o).from(r.from);
|
|
5418
5723
|
if (i.length > 0) {
|
|
5419
|
-
let e = i.length === 1 ? i[0] :
|
|
5724
|
+
let e = i.length === 1 ? i[0] : R(...i);
|
|
5420
5725
|
s = s.where(e);
|
|
5421
5726
|
}
|
|
5422
5727
|
let c = [t.bindingKeyExpr];
|
|
@@ -5428,36 +5733,36 @@ var Ht = class {
|
|
|
5428
5733
|
return n.db.$with("cohort_base").as(s);
|
|
5429
5734
|
}
|
|
5430
5735
|
buildDateRangeCondition(e, t) {
|
|
5431
|
-
return
|
|
5736
|
+
return F`${e} >= ${t.start}::date AND ${e} < (${t.end}::date + interval '1 day')`;
|
|
5432
5737
|
}
|
|
5433
5738
|
buildDateRangeHavingCondition(e, t) {
|
|
5434
|
-
return
|
|
5739
|
+
return F`MIN(${e}) >= ${t.start}::date AND MIN(${e}) < (${t.end}::date + interval '1 day')`;
|
|
5435
5740
|
}
|
|
5436
5741
|
buildActivityPeriodsCTE(e, t, n) {
|
|
5437
5742
|
let r = t.cube.sql(n), i = [];
|
|
5438
|
-
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(
|
|
5439
|
-
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(
|
|
5440
|
-
binding_key:
|
|
5743
|
+
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(F`${t.timeExpr} >= cohort_base.cohort_entry`);
|
|
5744
|
+
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(F`cohort_base.cohort_entry`, a, e.granularity), s = {
|
|
5745
|
+
binding_key: F`cohort_base.binding_key`.as("binding_key"),
|
|
5441
5746
|
period_number: o.as("period_number")
|
|
5442
5747
|
};
|
|
5443
|
-
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] =
|
|
5444
|
-
let c = n.db.select(s).from(r.from).innerJoin(
|
|
5748
|
+
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] = F.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5749
|
+
let c = n.db.select(s).from(r.from).innerJoin(F`cohort_base`, F`${t.bindingKeyExpr} = cohort_base.binding_key`);
|
|
5445
5750
|
if (i.length > 0) {
|
|
5446
|
-
let e = i.length === 1 ? i[0] :
|
|
5751
|
+
let e = i.length === 1 ? i[0] : R(...i);
|
|
5447
5752
|
c = c.where(e);
|
|
5448
5753
|
}
|
|
5449
|
-
let l = [
|
|
5450
|
-
for (let e = 0; e < t.breakdowns.length; e++) l.push(
|
|
5754
|
+
let l = [F`cohort_base.binding_key`, o];
|
|
5755
|
+
for (let e = 0; e < t.breakdowns.length; e++) l.push(F.raw(`cohort_base.breakdown_${e}`));
|
|
5451
5756
|
return c = c.groupBy(...l), n.db.$with("activity_periods").as(c);
|
|
5452
5757
|
}
|
|
5453
5758
|
buildCohortSizesCTE(e, t, n) {
|
|
5454
5759
|
if (n > 0) {
|
|
5455
|
-
let e = { cohort_size:
|
|
5456
|
-
for (let t = 0; t < n; t++) e[`breakdown_${t}`] =
|
|
5457
|
-
let i = t.db.select(e).from(
|
|
5760
|
+
let e = { cohort_size: F`COUNT(*)`.as("cohort_size") }, r = [];
|
|
5761
|
+
for (let t = 0; t < n; t++) e[`breakdown_${t}`] = F.raw(`breakdown_${t}`).as(`breakdown_${t}`), r.push(F.raw(`breakdown_${t}`));
|
|
5762
|
+
let i = t.db.select(e).from(F`cohort_base`).groupBy(...r);
|
|
5458
5763
|
return t.db.$with("cohort_sizes").as(i);
|
|
5459
5764
|
}
|
|
5460
|
-
let r = t.db.select({ cohort_size:
|
|
5765
|
+
let r = t.db.select({ cohort_size: F`COUNT(*)`.as("cohort_size") }).from(F`cohort_base`);
|
|
5461
5766
|
return t.db.$with("cohort_sizes").as(r);
|
|
5462
5767
|
}
|
|
5463
5768
|
buildRetentionCountsCTE(e, t, n) {
|
|
@@ -5465,31 +5770,32 @@ var Ht = class {
|
|
|
5465
5770
|
if (e.retentionType === "rolling") r = this.buildRollingRetentionCountsQuery(e, t, n);
|
|
5466
5771
|
else {
|
|
5467
5772
|
let i = {
|
|
5468
|
-
period_number:
|
|
5469
|
-
retained_users:
|
|
5470
|
-
}, a = [
|
|
5471
|
-
for (let e = 0; e < n; e++) i[`breakdown_${e}`] =
|
|
5472
|
-
|
|
5773
|
+
period_number: F`period_number`.as("period_number"),
|
|
5774
|
+
retained_users: F`COUNT(DISTINCT binding_key)`.as("retained_users")
|
|
5775
|
+
}, a = [F`period_number`];
|
|
5776
|
+
for (let e = 0; e < n; e++) i[`breakdown_${e}`] = F.raw(`breakdown_${e}`).as(`breakdown_${e}`), a.push(F.raw(`breakdown_${e}`));
|
|
5777
|
+
let o = Math.min(e.periods, 52);
|
|
5778
|
+
r = t.db.select(i).from(F`activity_periods`).where(F`period_number >= 0 AND period_number <= ${o}`).groupBy(...a);
|
|
5473
5779
|
}
|
|
5474
5780
|
return t.db.$with("retention_counts").as(r);
|
|
5475
5781
|
}
|
|
5476
5782
|
buildRollingRetentionCountsQuery(e, t, n) {
|
|
5477
5783
|
let r = [];
|
|
5478
5784
|
for (let e = 0; e < n; e++) r.push(`breakdown_${e}`);
|
|
5479
|
-
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a =
|
|
5785
|
+
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a = F`(
|
|
5480
5786
|
SELECT
|
|
5481
5787
|
binding_key,
|
|
5482
|
-
${
|
|
5788
|
+
${F.raw(r.map((e) => `${e}`).join(", ") + (r.length > 0 ? "," : ""))}
|
|
5483
5789
|
MAX(period_number) as max_period
|
|
5484
5790
|
FROM activity_periods
|
|
5485
5791
|
WHERE period_number >= 0 AND period_number <= ${e.periods}
|
|
5486
|
-
GROUP BY binding_key${
|
|
5792
|
+
GROUP BY binding_key${F.raw(i)}
|
|
5487
5793
|
)`, o = this.databaseAdapter.buildPeriodSeriesSubquery(e.periods), s = {
|
|
5488
|
-
period_number:
|
|
5489
|
-
retained_users:
|
|
5490
|
-
}, c = [
|
|
5491
|
-
for (let e = 0; e < n; e++) s[`breakdown_${e}`] =
|
|
5492
|
-
return t.db.select(s).from(
|
|
5794
|
+
period_number: F`p.period_number`.as("period_number"),
|
|
5795
|
+
retained_users: F`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as("retained_users")
|
|
5796
|
+
}, c = [F`p.period_number`];
|
|
5797
|
+
for (let e = 0; e < n; e++) s[`breakdown_${e}`] = F.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`), c.push(F.raw(`ump.breakdown_${e}`));
|
|
5798
|
+
return t.db.select(s).from(F`${a} ump`).innerJoin(o, F`TRUE`).groupBy(...c);
|
|
5493
5799
|
}
|
|
5494
5800
|
buildPeriodNumberExpression(e, t, n) {
|
|
5495
5801
|
return this.databaseAdapter.buildDateDiffPeriods(e, t, n);
|
|
@@ -5498,7 +5804,7 @@ var Ht = class {
|
|
|
5498
5804
|
let t = e.split(".");
|
|
5499
5805
|
return t.length > 1 ? t[1] : t[0];
|
|
5500
5806
|
}
|
|
5501
|
-
},
|
|
5807
|
+
}, Zt = class {
|
|
5502
5808
|
constructor(e) {
|
|
5503
5809
|
this.queryPlanner = e;
|
|
5504
5810
|
}
|
|
@@ -5515,7 +5821,7 @@ var Ht = class {
|
|
|
5515
5821
|
let n = e.get(t);
|
|
5516
5822
|
n && h.set(t, n);
|
|
5517
5823
|
}
|
|
5518
|
-
let g =
|
|
5824
|
+
let g = Z.hasPostAggregationWindows(t.measures ?? [], h), _ = [...s.filter((e) => !e.pathFound && e.error).map((e) => e.error), ...u.map((e) => e.message)];
|
|
5519
5825
|
return {
|
|
5520
5826
|
plan: p,
|
|
5521
5827
|
analysis: {
|
|
@@ -5933,7 +6239,7 @@ var Ht = class {
|
|
|
5933
6239
|
timeDimensions: []
|
|
5934
6240
|
};
|
|
5935
6241
|
}
|
|
5936
|
-
},
|
|
6242
|
+
}, Qt = class {
|
|
5937
6243
|
name = "identity";
|
|
5938
6244
|
optimise(e) {
|
|
5939
6245
|
return e;
|
|
@@ -5941,7 +6247,7 @@ var Ht = class {
|
|
|
5941
6247
|
};
|
|
5942
6248
|
//#endregion
|
|
5943
6249
|
//#region src/server/physical-plan/processors/cte-processor.ts
|
|
5944
|
-
function
|
|
6250
|
+
function $t(e, t, n, r) {
|
|
5945
6251
|
let i = /* @__PURE__ */ new Map();
|
|
5946
6252
|
if (e.preAggregationCTEs && e.preAggregationCTEs.length > 0) {
|
|
5947
6253
|
for (let t of e.preAggregationCTEs) if (t.propagatingFilters && t.propagatingFilters.length > 0) for (let e of t.propagatingFilters) {
|
|
@@ -5951,7 +6257,7 @@ function Gt(e, t, n, r) {
|
|
|
5951
6257
|
i.set(t, s);
|
|
5952
6258
|
}
|
|
5953
6259
|
let a = i.get(t);
|
|
5954
|
-
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] :
|
|
6260
|
+
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] : R(...a));
|
|
5955
6261
|
}
|
|
5956
6262
|
}
|
|
5957
6263
|
let a = [], o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map();
|
|
@@ -5971,27 +6277,27 @@ function Gt(e, t, n, r) {
|
|
|
5971
6277
|
}
|
|
5972
6278
|
//#endregion
|
|
5973
6279
|
//#region src/server/physical-plan/processors/window-processor.ts
|
|
5974
|
-
function
|
|
6280
|
+
function en(e, t, n, r, i, a) {
|
|
5975
6281
|
if (n.measures) for (let o of n.measures) {
|
|
5976
6282
|
let [s, c] = o.split("."), l = i.get(s);
|
|
5977
6283
|
if (!l?.measures?.[c]) continue;
|
|
5978
6284
|
let u = l.measures[c];
|
|
5979
|
-
if (!
|
|
5980
|
-
let d =
|
|
6285
|
+
if (!Z.isPostAggregationWindow(u)) continue;
|
|
6286
|
+
let d = Z.getWindowBaseMeasure(u, s);
|
|
5981
6287
|
if (!d) continue;
|
|
5982
6288
|
let [f, p] = d.split("."), m = i.get(f);
|
|
5983
6289
|
if (!m?.measures?.[p]) continue;
|
|
5984
6290
|
let h = m.measures[p], g = t.preAggregationCTEs?.find((e) => e.cube?.name === f && e.measures?.includes(d)), _;
|
|
5985
|
-
_ = g ?
|
|
5986
|
-
let v =
|
|
5987
|
-
v && (e[o] =
|
|
6291
|
+
_ = g ? F`sum(${F`${F.identifier(g.cteAlias)}.${F.identifier(p)}`})` : a.queryBuilder.buildMeasureExpression(h, r, m), e[d] || (e[d] = F`${_}`.as(d));
|
|
6292
|
+
let v = tn(u, _, n, r, l, t, a);
|
|
6293
|
+
v && (e[o] = F`${v}`.as(o));
|
|
5988
6294
|
}
|
|
5989
6295
|
}
|
|
5990
|
-
function
|
|
6296
|
+
function tn(e, t, n, r, i, a, o) {
|
|
5991
6297
|
let s = e.windowConfig || {}, c = (e, t) => {
|
|
5992
6298
|
if (!a.preAggregationCTEs) return null;
|
|
5993
6299
|
let n = a.preAggregationCTEs.find((t) => t.cube?.name === e);
|
|
5994
|
-
return n && n.cteAlias ?
|
|
6300
|
+
return n && n.cteAlias ? F`${F.identifier(n.cteAlias)}.${F.identifier(t)}` : null;
|
|
5995
6301
|
}, l;
|
|
5996
6302
|
if (s.orderBy && s.orderBy.length > 0) l = s.orderBy.map((e) => {
|
|
5997
6303
|
let a = e.field.includes(".") ? e.field.split(".")[1] : e.field;
|
|
@@ -6048,16 +6354,16 @@ function qt(e, t, n, r, i, a, o) {
|
|
|
6048
6354
|
frame: s.frame
|
|
6049
6355
|
});
|
|
6050
6356
|
if (!d) return null;
|
|
6051
|
-
switch (s.operation ||
|
|
6052
|
-
case "difference": return
|
|
6053
|
-
case "ratio": return
|
|
6054
|
-
case "percentChange": return
|
|
6357
|
+
switch (s.operation || Z.getDefaultWindowOperation(e.type)) {
|
|
6358
|
+
case "difference": return F`${t} - ${d}`;
|
|
6359
|
+
case "ratio": return F`${t} / NULLIF(${d}, 0)`;
|
|
6360
|
+
case "percentChange": return F`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;
|
|
6055
6361
|
default: return d;
|
|
6056
6362
|
}
|
|
6057
6363
|
}
|
|
6058
6364
|
//#endregion
|
|
6059
6365
|
//#region src/server/physical-plan/processors/selection-processor.ts
|
|
6060
|
-
function
|
|
6366
|
+
function nn(e, t, n, r, i) {
|
|
6061
6367
|
let a = { ...i.queryBuilder.buildSelections(e.joinCubes.length > 0 ? r : e.primaryCube, t, n) };
|
|
6062
6368
|
if (e.preAggregationCTEs) for (let o of e.preAggregationCTEs) {
|
|
6063
6369
|
let e = o.cube.name;
|
|
@@ -6065,32 +6371,32 @@ function Jt(e, t, n, r, i) {
|
|
|
6065
6371
|
if (!a[s]) continue;
|
|
6066
6372
|
let [, c] = s.split("."), l = r.get(e);
|
|
6067
6373
|
if (!l?.measures?.[c]) continue;
|
|
6068
|
-
let u = l.measures[c], d =
|
|
6374
|
+
let u = l.measures[c], d = F`${F.identifier(o.cteAlias)}.${F.identifier(c)}`, f;
|
|
6069
6375
|
if (u.type === "calculated" && u.calculatedSql) f = i.queryBuilder.buildCTECalculatedMeasure(u, l, o, r, n);
|
|
6070
6376
|
else {
|
|
6071
|
-
let e = o.cteReason === "fanOutPrevention", n =
|
|
6377
|
+
let e = o.cteReason === "fanOutPrevention", n = rn(o, t, r), a = e || n;
|
|
6072
6378
|
switch (u.type) {
|
|
6073
6379
|
case "count":
|
|
6074
6380
|
case "countDistinct":
|
|
6075
6381
|
case "sum":
|
|
6076
|
-
f = a ?
|
|
6382
|
+
f = a ? H(d) : V(d);
|
|
6077
6383
|
break;
|
|
6078
6384
|
case "avg":
|
|
6079
|
-
f = a ?
|
|
6385
|
+
f = a ? H(d) : i.databaseAdapter.buildAvg(d);
|
|
6080
6386
|
break;
|
|
6081
6387
|
case "min":
|
|
6082
|
-
f =
|
|
6388
|
+
f = Ae(d);
|
|
6083
6389
|
break;
|
|
6084
6390
|
case "max":
|
|
6085
|
-
f =
|
|
6391
|
+
f = H(d);
|
|
6086
6392
|
break;
|
|
6087
6393
|
case "number":
|
|
6088
|
-
f =
|
|
6394
|
+
f = H(d);
|
|
6089
6395
|
break;
|
|
6090
|
-
default: f = a ?
|
|
6396
|
+
default: f = a ? H(d) : V(d);
|
|
6091
6397
|
}
|
|
6092
6398
|
}
|
|
6093
|
-
a[s] =
|
|
6399
|
+
a[s] = F`${f}`.as(s);
|
|
6094
6400
|
}
|
|
6095
6401
|
for (let t in a) {
|
|
6096
6402
|
let [n, i] = t.split(".");
|
|
@@ -6102,15 +6408,15 @@ function Jt(e, t, n, r, i) {
|
|
|
6102
6408
|
let e = s.dimensions[i].sql;
|
|
6103
6409
|
u = o.joinKeys.find((t) => t.targetColumnObj === e);
|
|
6104
6410
|
}
|
|
6105
|
-
(u || l && s?.dimensions?.[i]) && (a[t] =
|
|
6411
|
+
(u || l && s?.dimensions?.[i]) && (a[t] = F`${F.identifier(o.cteAlias)}.${F.identifier(i)}`.as(t));
|
|
6106
6412
|
}
|
|
6107
6413
|
}
|
|
6108
|
-
return
|
|
6414
|
+
return en(a, e, t, n, r, i), a;
|
|
6109
6415
|
}
|
|
6110
|
-
function
|
|
6111
|
-
return e.cteReason !== "hasMany" || e.downstreamJoinKeys && e.downstreamJoinKeys.length > 0 || e.intermediateJoins && e.intermediateJoins.length > 0 || !(t.dimensions && t.dimensions.length > 0 || t.timeDimensions && t.timeDimensions.length > 0) || t.dimensions?.some((t) => t.startsWith(`${e.cube.name}.`)) || t.timeDimensions?.some((t) => t.dimension.startsWith(`${e.cube.name}.`)) ? !1 : e.joinKeys.length > 0 && e.joinKeys.every((e) => !!e.sourceColumnObj &&
|
|
6416
|
+
function rn(e, t, n) {
|
|
6417
|
+
return e.cteReason !== "hasMany" || e.downstreamJoinKeys && e.downstreamJoinKeys.length > 0 || e.intermediateJoins && e.intermediateJoins.length > 0 || !(t.dimensions && t.dimensions.length > 0 || t.timeDimensions && t.timeDimensions.length > 0) || t.dimensions?.some((t) => t.startsWith(`${e.cube.name}.`)) || t.timeDimensions?.some((t) => t.dimension.startsWith(`${e.cube.name}.`)) ? !1 : e.joinKeys.length > 0 && e.joinKeys.every((e) => !!e.sourceColumnObj && an(e.sourceColumnObj, t, n));
|
|
6112
6418
|
}
|
|
6113
|
-
function
|
|
6419
|
+
function an(e, t, n) {
|
|
6114
6420
|
if (t.dimensions) for (let r of t.dimensions) {
|
|
6115
6421
|
let [t, i] = r.split(".");
|
|
6116
6422
|
if (n.get(t)?.dimensions?.[i]?.sql === e) return !0;
|
|
@@ -6124,7 +6430,7 @@ function Xt(e, t, n) {
|
|
|
6124
6430
|
}
|
|
6125
6431
|
//#endregion
|
|
6126
6432
|
//#region src/server/physical-plan/processors/joins-processor.ts
|
|
6127
|
-
function
|
|
6433
|
+
function on(e, t, n, r, i, a) {
|
|
6128
6434
|
let o = [], s = t.db.select(r).from(n.from);
|
|
6129
6435
|
if (i.ctes.length > 0 && (s = t.db.with(...i.ctes).select(r).from(n.from)), n.joins) for (let e of n.joins) switch (e.type || "left") {
|
|
6130
6436
|
case "left":
|
|
@@ -6155,10 +6461,10 @@ function Zt(e, t, n, r, i, a) {
|
|
|
6155
6461
|
if (t && t.joinKeys.length > 0) {
|
|
6156
6462
|
let e = [];
|
|
6157
6463
|
for (let n of t.joinKeys) {
|
|
6158
|
-
let t =
|
|
6159
|
-
r && e.push(
|
|
6464
|
+
let t = F`${F.identifier(c)}.${F.identifier(n.sourceColumn)}`, r = n.targetColumnObj;
|
|
6465
|
+
r && e.push(L(r, t));
|
|
6160
6466
|
}
|
|
6161
|
-
e.length > 0 && (a =
|
|
6467
|
+
e.length > 0 && (a = R(...e));
|
|
6162
6468
|
}
|
|
6163
6469
|
}
|
|
6164
6470
|
let l = [];
|
|
@@ -6185,19 +6491,19 @@ function Zt(e, t, n, r, i, a) {
|
|
|
6185
6491
|
} catch {}
|
|
6186
6492
|
}
|
|
6187
6493
|
let d, f, p;
|
|
6188
|
-
if (u) d =
|
|
6494
|
+
if (u) d = F`${F.identifier(u)}`, f = a.cteBuilder.buildCTEJoinCondition(n, u, e), p = void 0;
|
|
6189
6495
|
else {
|
|
6190
6496
|
let e = i.downstreamCubeMap.get(n.cube.name), r = n.cube.sql(t);
|
|
6191
6497
|
if (d = r.from, p = r.where, e && !n.junctionTable) {
|
|
6192
6498
|
let t = [];
|
|
6193
6499
|
for (let n of e.joinKeys) {
|
|
6194
|
-
let r =
|
|
6195
|
-
t.push(
|
|
6500
|
+
let r = F`${F.identifier(e.cteAlias)}.${F.identifier(n.sourceColumn)}`, i = n.targetColumnObj || F.identifier(n.targetColumn);
|
|
6501
|
+
t.push(L(r, i));
|
|
6196
6502
|
}
|
|
6197
|
-
f = t.length === 1 ? t[0] :
|
|
6503
|
+
f = t.length === 1 ? t[0] : R(...t);
|
|
6198
6504
|
} else f = n.joinCondition;
|
|
6199
6505
|
}
|
|
6200
|
-
let m = n.joinType || "left", h = m !== "inner" && p ?
|
|
6506
|
+
let m = n.joinType || "left", h = m !== "inner" && p ? R(f, p) : f;
|
|
6201
6507
|
try {
|
|
6202
6508
|
switch (m) {
|
|
6203
6509
|
case "left":
|
|
@@ -6224,7 +6530,7 @@ function Zt(e, t, n, r, i, a) {
|
|
|
6224
6530
|
}
|
|
6225
6531
|
//#endregion
|
|
6226
6532
|
//#region src/server/physical-plan/processors/predicates-processor.ts
|
|
6227
|
-
function
|
|
6533
|
+
function sn(e, t, n, r, i, a, o, s) {
|
|
6228
6534
|
let c = [...o.allWhereConditions];
|
|
6229
6535
|
if (i.where && c.push(i.where), e.joinCubes && e.joinCubes.length > 0) for (let t of e.joinCubes) {
|
|
6230
6536
|
let e = t.cube.name;
|
|
@@ -6236,14 +6542,14 @@ function Qt(e, t, n, r, i, a, o, s) {
|
|
|
6236
6542
|
l.length > 0 && c.push(...l);
|
|
6237
6543
|
let u = o.drizzleQuery;
|
|
6238
6544
|
if (c.length > 0) {
|
|
6239
|
-
let e = c.length === 1 ? c[0] :
|
|
6545
|
+
let e = c.length === 1 ? c[0] : R(...c);
|
|
6240
6546
|
u = u.where(e);
|
|
6241
6547
|
}
|
|
6242
6548
|
let d = s.queryBuilder.buildGroupByFields(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6243
6549
|
d.length > 0 && (u = u.groupBy(...d));
|
|
6244
6550
|
let f = s.queryBuilder.buildHavingConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6245
6551
|
if (f.length > 0) {
|
|
6246
|
-
let e = f.length === 1 ? f[0] :
|
|
6552
|
+
let e = f.length === 1 ? f[0] : R(...f);
|
|
6247
6553
|
u = u.having(e);
|
|
6248
6554
|
}
|
|
6249
6555
|
let p = s.queryBuilder.buildOrderBy(t);
|
|
@@ -6251,14 +6557,14 @@ function Qt(e, t, n, r, i, a, o, s) {
|
|
|
6251
6557
|
}
|
|
6252
6558
|
//#endregion
|
|
6253
6559
|
//#region src/server/physical-plan/processors/shared.ts
|
|
6254
|
-
function
|
|
6560
|
+
function cn(e) {
|
|
6255
6561
|
let t = /* @__PURE__ */ new Map();
|
|
6256
6562
|
if (t.set(e.primaryCube.name, e.primaryCube), e.joinCubes) for (let n of e.joinCubes) t.set(n.cube.name, n.cube);
|
|
6257
6563
|
return t;
|
|
6258
6564
|
}
|
|
6259
6565
|
//#endregion
|
|
6260
6566
|
//#region src/server/physical-plan/drizzle-plan-builder.ts
|
|
6261
|
-
var
|
|
6567
|
+
var ln = class {
|
|
6262
6568
|
constructor(e, t, n) {
|
|
6263
6569
|
this.queryBuilder = e, this.cteBuilder = t, this.databaseAdapter = n;
|
|
6264
6570
|
}
|
|
@@ -6398,13 +6704,13 @@ var en = class {
|
|
|
6398
6704
|
if (i) return i;
|
|
6399
6705
|
let a = this.tryBuildKeysDeduplicationQuery(e, t, n, r);
|
|
6400
6706
|
if (a) return a;
|
|
6401
|
-
let o =
|
|
6402
|
-
return
|
|
6707
|
+
let o = $t(e, t, n, r), s = e.primaryCube.sql(n), c = e.joinCubes.length > 0 ? cn(e) : new Map([[e.primaryCube.name, e.primaryCube]]);
|
|
6708
|
+
return sn(e, t, n, c, s, o, on(e, n, s, nn(e, t, n, c, r), o, r), r);
|
|
6403
6709
|
}
|
|
6404
6710
|
tryBuildKeysDeduplicationQuery(e, t, n, r) {
|
|
6405
6711
|
let i = e.keysDeduplication;
|
|
6406
6712
|
if (!i?.multipliedCubeName || !t.measures?.length) return null;
|
|
6407
|
-
let a = e.joinCubes.length > 0 ?
|
|
6713
|
+
let a = e.joinCubes.length > 0 ? cn(e) : new Map([[e.primaryCube.name, e.primaryCube]]), o = a.get(i.multipliedCubeName);
|
|
6408
6714
|
if (!o || !this.canExecuteKeysDeduplication(t, o, i.multipliedCubeName)) return null;
|
|
6409
6715
|
let s = i.primaryKeyDimensions.length > 0 ? i.primaryKeyDimensions : this.getPrimaryKeyDimensions(o);
|
|
6410
6716
|
if (s.length === 0) return null;
|
|
@@ -6413,20 +6719,20 @@ var en = class {
|
|
|
6413
6719
|
let [t, r] = e.split("."), i = a.get(t), o = i?.dimensions?.[r];
|
|
6414
6720
|
if (!i || !o) return null;
|
|
6415
6721
|
let s = K(o.sql, n);
|
|
6416
|
-
u[e] =
|
|
6722
|
+
u[e] = F`${s}`.as(e), d.push(s);
|
|
6417
6723
|
}
|
|
6418
6724
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
6419
6725
|
let [t, i] = e.dimension.split("."), o = a.get(t), s = o?.dimensions?.[i];
|
|
6420
6726
|
if (!o || !s) return null;
|
|
6421
6727
|
let c = r.queryBuilder.buildTimeDimensionExpression(s.sql, e.granularity, n);
|
|
6422
|
-
u[e.dimension] =
|
|
6728
|
+
u[e.dimension] = F`${c}`.as(e.dimension), d.push(c);
|
|
6423
6729
|
}
|
|
6424
6730
|
let f = [];
|
|
6425
6731
|
for (let e of s) {
|
|
6426
6732
|
let t = o.dimensions?.[e];
|
|
6427
6733
|
if (!t) return null;
|
|
6428
6734
|
let r = K(t.sql, n), i = `__pk__${e}`;
|
|
6429
|
-
u[i] =
|
|
6735
|
+
u[i] = F`${r}`.as(i), d.push(r), f.push(i);
|
|
6430
6736
|
}
|
|
6431
6737
|
let p = i.regularMeasures ?? [], m = new Set(p), h = t.measures.filter((e) => !m.has(e));
|
|
6432
6738
|
if (p.length > 0) {
|
|
@@ -6435,7 +6741,7 @@ var en = class {
|
|
|
6435
6741
|
let n = e.get(t);
|
|
6436
6742
|
if (!n) return null;
|
|
6437
6743
|
let r = `__reg__${t.replace(".", "__")}`;
|
|
6438
|
-
u[r] =
|
|
6744
|
+
u[r] = F`${n()}`.as(r);
|
|
6439
6745
|
}
|
|
6440
6746
|
}
|
|
6441
6747
|
let g = e.primaryCube.sql(n), _ = [];
|
|
@@ -6450,58 +6756,58 @@ var en = class {
|
|
|
6450
6756
|
let e = t.cube.sql(n);
|
|
6451
6757
|
v = this.applyJoinByType(v, t.joinType ?? "left", e.from, t.joinCondition), e.where && _.push(e.where);
|
|
6452
6758
|
}
|
|
6453
|
-
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] :
|
|
6454
|
-
let y = n.db.$with(c).as(v), b = o.sql(n), x = {},
|
|
6759
|
+
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] : R(..._))), d.length > 0 && (v = v.groupBy(...d));
|
|
6760
|
+
let y = n.db.$with(c).as(v), b = o.sql(n), x = {}, S = [];
|
|
6455
6761
|
for (let e of s) {
|
|
6456
6762
|
let t = o.dimensions?.[e];
|
|
6457
6763
|
if (!t) return null;
|
|
6458
6764
|
let r = K(t.sql, n);
|
|
6459
|
-
x[e] =
|
|
6765
|
+
x[e] = F`${r}`.as(e), S.push(r);
|
|
6460
6766
|
}
|
|
6461
|
-
let
|
|
6767
|
+
let ee = /* @__PURE__ */ new Set();
|
|
6462
6768
|
for (let e of h) {
|
|
6463
6769
|
let [, t] = e.split(".");
|
|
6464
|
-
o.measures?.[t]?.type === "avg" &&
|
|
6770
|
+
o.measures?.[t]?.type === "avg" && ee.add(t);
|
|
6465
6771
|
}
|
|
6466
|
-
let
|
|
6772
|
+
let C = h.filter((e) => {
|
|
6467
6773
|
let [, t] = e.split(".");
|
|
6468
|
-
return !
|
|
6774
|
+
return !ee.has(t);
|
|
6469
6775
|
});
|
|
6470
|
-
if (
|
|
6471
|
-
let e = r.queryBuilder.buildResolvedMeasures(
|
|
6472
|
-
for (let t of
|
|
6776
|
+
if (C.length > 0) {
|
|
6777
|
+
let e = r.queryBuilder.buildResolvedMeasures(C, new Map([[o.name, o]]), n);
|
|
6778
|
+
for (let t of C) {
|
|
6473
6779
|
let [, n] = t.split("."), r = e.get(t);
|
|
6474
|
-
if (!r) return null;
|
|
6475
|
-
x[n] =
|
|
6780
|
+
if (!r || typeof r != "function") return null;
|
|
6781
|
+
x[n] = F`${r()}`.as(n);
|
|
6476
6782
|
}
|
|
6477
6783
|
}
|
|
6478
6784
|
for (let e of h) {
|
|
6479
6785
|
let [, t] = e.split(".");
|
|
6480
|
-
if (!
|
|
6786
|
+
if (!ee.has(t)) continue;
|
|
6481
6787
|
let r = o.measures?.[t];
|
|
6482
6788
|
if (!r?.sql) return null;
|
|
6483
6789
|
let i = K(r.sql, n), a = `__avg_sum__${t}`, s = `__avg_count__${t}`;
|
|
6484
|
-
x[a] =
|
|
6790
|
+
x[a] = F`sum(${i})`.as(a), x[s] = F`count(${i})`.as(s);
|
|
6485
6791
|
}
|
|
6486
|
-
let
|
|
6487
|
-
b.where &&
|
|
6488
|
-
let
|
|
6489
|
-
for (let e of t.dimensions ?? [])
|
|
6490
|
-
for (let e of t.timeDimensions ?? [])
|
|
6792
|
+
let w = n.db.select(x).from(b.from), T = [];
|
|
6793
|
+
b.where && T.push(b.where), T.push(...r.queryBuilder.buildWhereConditions(o, t, n)), T.length > 0 && (w = w.where(T.length === 1 ? T[0] : R(...T))), S.length > 0 && (w = w.groupBy(...S));
|
|
6794
|
+
let te = n.db.$with(l).as(w), E = {};
|
|
6795
|
+
for (let e of t.dimensions ?? []) E[e] = F`${F.identifier(c)}.${F.identifier(e)}`.as(e);
|
|
6796
|
+
for (let e of t.timeDimensions ?? []) E[e.dimension] = F`${F.identifier(c)}.${F.identifier(e.dimension)}`.as(e.dimension);
|
|
6491
6797
|
for (let e of h) {
|
|
6492
6798
|
let [, t] = e.split("."), n = o.measures?.[t];
|
|
6493
|
-
|
|
6799
|
+
E[e] = this.buildKeysOuterAggregation(n?.type ?? "sum", l, t, e);
|
|
6494
6800
|
}
|
|
6495
6801
|
for (let e of p) {
|
|
6496
6802
|
let [t, n] = e.split("."), r = a.get(t)?.measures?.[n], i = `__reg__${e.replace(".", "__")}`;
|
|
6497
|
-
|
|
6803
|
+
E[e] = this.buildKeysOuterAggregation(r?.type ?? "sum", c, i, e);
|
|
6498
6804
|
}
|
|
6499
|
-
let
|
|
6500
|
-
|
|
6501
|
-
let
|
|
6502
|
-
|
|
6503
|
-
let
|
|
6504
|
-
return
|
|
6805
|
+
let D = n.db.with(y, te).select(E).from(F`${F.identifier(c)}`), O = f.map((e, t) => L(F`${F.identifier(c)}.${F.identifier(e)}`, F`${F.identifier(l)}.${F.identifier(s[t])}`)), ne = O.length === 1 ? O[0] : R(...O);
|
|
6806
|
+
D = D.leftJoin(F`${F.identifier(l)}`, ne);
|
|
6807
|
+
let k = [...(t.dimensions ?? []).map((e) => F`${F.identifier(c)}.${F.identifier(e)}`), ...(t.timeDimensions ?? []).map((e) => F`${F.identifier(c)}.${F.identifier(e.dimension)}`)];
|
|
6808
|
+
k.length > 0 && (D = D.groupBy(...k));
|
|
6809
|
+
let A = r.queryBuilder.buildOrderBy(t, Object.keys(E));
|
|
6810
|
+
return A.length > 0 && (D = D.orderBy(...A)), D = r.queryBuilder.applyLimitAndOffset(D, t), D;
|
|
6505
6811
|
}
|
|
6506
6812
|
tryBuildMultiFactMergeQuery(e, t, n, r) {
|
|
6507
6813
|
let i = e.multiFactMerge;
|
|
@@ -6512,37 +6818,37 @@ var en = class {
|
|
|
6512
6818
|
});
|
|
6513
6819
|
if (s) return this.buildMultiFactUnionKeysFallbackQuery(t, n, r, i, l, o);
|
|
6514
6820
|
let u = i.groups[0].alias, d = i.groups.map((e) => e.alias), f = {};
|
|
6515
|
-
if (o.length > 0) for (let e of o) f[e] =
|
|
6516
|
-
for (let e of i.groups) for (let t of e.measures) f[t] =
|
|
6517
|
-
let p = n.db.with(...l).select(f).from(
|
|
6518
|
-
for (let e of o) m.set(e,
|
|
6821
|
+
if (o.length > 0) for (let e of o) f[e] = F`${this.coalesceQualifiedColumn(d, e)}`.as(e);
|
|
6822
|
+
for (let e of i.groups) for (let t of e.measures) f[t] = F`coalesce(${F`${F.identifier(e.alias)}.${F.identifier(t)}`}, 0)`.as(t);
|
|
6823
|
+
let p = n.db.with(...l).select(f).from(F`${F.identifier(u)}`), m = /* @__PURE__ */ new Map();
|
|
6824
|
+
for (let e of o) m.set(e, F`${F.identifier(u)}.${F.identifier(e)}`);
|
|
6519
6825
|
for (let e = 1; e < i.groups.length; e++) {
|
|
6520
6826
|
let t = i.groups[e].alias, n;
|
|
6521
|
-
if (o.length === 0) n =
|
|
6827
|
+
if (o.length === 0) n = F`1 = 1`;
|
|
6522
6828
|
else {
|
|
6523
|
-
let e = o.map((e) =>
|
|
6524
|
-
n = e.length === 1 ? e[0] :
|
|
6829
|
+
let e = o.map((e) => L(m.get(e), F`${F.identifier(t)}.${F.identifier(e)}`));
|
|
6830
|
+
n = e.length === 1 ? e[0] : R(...e);
|
|
6525
6831
|
}
|
|
6526
|
-
if (p = this.applyJoinByType(p, c,
|
|
6832
|
+
if (p = this.applyJoinByType(p, c, F`${F.identifier(t)}`, n), o.length > 0 && c === "full") for (let e of o) m.set(e, F`coalesce(${m.get(e)}, ${F`${F.identifier(t)}.${F.identifier(e)}`})`);
|
|
6527
6833
|
}
|
|
6528
6834
|
let h = r.queryBuilder.buildOrderBy(t, Object.keys(f));
|
|
6529
6835
|
return h.length > 0 && (p = p.orderBy(...h)), r.queryBuilder.applyLimitAndOffset(p, t);
|
|
6530
6836
|
}
|
|
6531
6837
|
buildMultiFactUnionKeysFallbackQuery(e, t, n, r, i, a) {
|
|
6532
|
-
let o = "mf_all_keys", s = r.groups.map((e) =>
|
|
6533
|
-
for (let e of a) u[e] =
|
|
6534
|
-
for (let e of r.groups) for (let t of e.measures) u[t] =
|
|
6535
|
-
let d = t.db.with(...i, l).select(u).from(
|
|
6838
|
+
let o = "mf_all_keys", s = r.groups.map((e) => F`select ${this.buildSharedKeySelection(e.alias, a)} from ${F.identifier(e.alias)}`), c = F`${F.join(s, F` union `)}`, l = t.db.$with(o).as(c), u = {};
|
|
6839
|
+
for (let e of a) u[e] = F`${F.identifier(o)}.${F.identifier(e)}`.as(e);
|
|
6840
|
+
for (let e of r.groups) for (let t of e.measures) u[t] = F`coalesce(${F`${F.identifier(e.alias)}.${F.identifier(t)}`}, 0)`.as(t);
|
|
6841
|
+
let d = t.db.with(...i, l).select(u).from(F`${F.identifier(o)}`);
|
|
6536
6842
|
for (let e of r.groups) {
|
|
6537
|
-
let t = a.map((t) =>
|
|
6538
|
-
d = d.leftJoin(
|
|
6843
|
+
let t = a.map((t) => L(F`${F.identifier(o)}.${F.identifier(t)}`, F`${F.identifier(e.alias)}.${F.identifier(t)}`)), n = t.length === 1 ? t[0] : R(...t);
|
|
6844
|
+
d = d.leftJoin(F`${F.identifier(e.alias)}`, n);
|
|
6539
6845
|
}
|
|
6540
6846
|
let f = n.queryBuilder.buildOrderBy(e, Object.keys(u));
|
|
6541
6847
|
return f.length > 0 && (d = d.orderBy(...f)), n.queryBuilder.applyLimitAndOffset(d, e);
|
|
6542
6848
|
}
|
|
6543
6849
|
buildSharedKeySelection(e, t) {
|
|
6544
|
-
let n = t.map((t) =>
|
|
6545
|
-
return
|
|
6850
|
+
let n = t.map((t) => F`${F.identifier(e)}.${F.identifier(t)} as ${F.identifier(t)}`);
|
|
6851
|
+
return F.join(n, F`, `);
|
|
6546
6852
|
}
|
|
6547
6853
|
selectRuntimeMergeStrategy(e, t) {
|
|
6548
6854
|
return !t || e === "innerJoin" ? "inner" : e === "leftJoin" ? "left" : this.supportsFullOuterJoin() ? "full" : "left";
|
|
@@ -6552,9 +6858,9 @@ var en = class {
|
|
|
6552
6858
|
return e === "postgres" || e === "duckdb";
|
|
6553
6859
|
}
|
|
6554
6860
|
coalesceQualifiedColumn(e, t) {
|
|
6555
|
-
if (e.length === 1) return
|
|
6556
|
-
let n = e.map((e) =>
|
|
6557
|
-
for (let e = 1; e < n.length; e++) r =
|
|
6861
|
+
if (e.length === 1) return F`${F.identifier(e[0])}.${F.identifier(t)}`;
|
|
6862
|
+
let n = e.map((e) => F`${F.identifier(e)}.${F.identifier(t)}`), r = n[0];
|
|
6863
|
+
for (let e = 1; e < n.length; e++) r = F`coalesce(${r}, ${n[e]})`;
|
|
6558
6864
|
return r;
|
|
6559
6865
|
}
|
|
6560
6866
|
canExecuteKeysDeduplication(e, t, n) {
|
|
@@ -6600,10 +6906,10 @@ var en = class {
|
|
|
6600
6906
|
}
|
|
6601
6907
|
buildKeysOuterAggregation(e, t, n, r) {
|
|
6602
6908
|
switch (e) {
|
|
6603
|
-
case "min": return
|
|
6604
|
-
case "max": return
|
|
6605
|
-
case "avg": return
|
|
6606
|
-
default: return
|
|
6909
|
+
case "min": return F`min(${F`${F.identifier(t)}.${F.identifier(n)}`})`.as(r);
|
|
6910
|
+
case "max": return F`max(${F`${F.identifier(t)}.${F.identifier(n)}`})`.as(r);
|
|
6911
|
+
case "avg": return F`sum(${F`${F.identifier(t)}.${F.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${F`${F.identifier(t)}.${F.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);
|
|
6912
|
+
default: return F`coalesce(sum(${F`${F.identifier(t)}.${F.identifier(n)}`}), 0)`.as(r);
|
|
6607
6913
|
}
|
|
6608
6914
|
}
|
|
6609
6915
|
applyJoinByType(e, t, n, r) {
|
|
@@ -6614,7 +6920,7 @@ var en = class {
|
|
|
6614
6920
|
default: return e.leftJoin(n, r);
|
|
6615
6921
|
}
|
|
6616
6922
|
}
|
|
6617
|
-
},
|
|
6923
|
+
}, un = class {
|
|
6618
6924
|
queryBuilder;
|
|
6619
6925
|
drizzlePlanBuilder;
|
|
6620
6926
|
databaseAdapter;
|
|
@@ -6627,16 +6933,16 @@ var en = class {
|
|
|
6627
6933
|
planOptimiser;
|
|
6628
6934
|
constructor(e, t) {
|
|
6629
6935
|
if (this.dbExecutor = e, this.databaseAdapter = e.databaseAdapter, !this.databaseAdapter) throw Error("DatabaseExecutor must have a databaseAdapter property");
|
|
6630
|
-
this.queryBuilder = new
|
|
6631
|
-
let n = new
|
|
6632
|
-
this.drizzlePlanBuilder = new
|
|
6936
|
+
this.queryBuilder = new jt(this.databaseAdapter);
|
|
6937
|
+
let n = new Nt(), r = new Pt(this.queryBuilder);
|
|
6938
|
+
this.drizzlePlanBuilder = new ln(this.queryBuilder, r, this.databaseAdapter), this.comparisonQueryBuilder = new Ut(this.databaseAdapter), this.funnelQueryBuilder = new Wt(this.databaseAdapter), this.flowQueryBuilder = new Gt(this.databaseAdapter), this.retentionQueryBuilder = new Xt(this.databaseAdapter), this.logicalPlanBuilder = new Zt(n), this.planOptimiser = new Qt(), this.cacheConfig = t;
|
|
6633
6939
|
}
|
|
6634
6940
|
async execute(e, t, n, r) {
|
|
6635
6941
|
try {
|
|
6636
6942
|
let i = this.resolveQueryMode(t);
|
|
6637
6943
|
this.validateQueryForMode(i, e, t);
|
|
6638
6944
|
let a;
|
|
6639
|
-
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) if (a =
|
|
6945
|
+
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) if (a = _t(t, n, this.cacheConfig), r?.skipCache) this.cacheConfig.onCacheEvent?.({
|
|
6640
6946
|
type: "miss",
|
|
6641
6947
|
key: a,
|
|
6642
6948
|
durationMs: 0
|
|
@@ -6814,7 +7120,7 @@ var en = class {
|
|
|
6814
7120
|
this.preloadFilterCache(t, r, e, i);
|
|
6815
7121
|
let { optimisedPlan: a } = this.buildRegularQueryArtifacts(e, t, i), o = this.drizzlePlanBuilder.derivePhysicalPlanContext(a), s = this.drizzlePlanBuilder.build(o, t, i), c = this.queryBuilder.collectNumericFields(e, t), l = await this.dbExecutor.execute(s, c);
|
|
6816
7122
|
return {
|
|
6817
|
-
data:
|
|
7123
|
+
data: Ht(Array.isArray(l) ? l.map((e) => {
|
|
6818
7124
|
let n = { ...e };
|
|
6819
7125
|
if (t.timeDimensions) {
|
|
6820
7126
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -6940,7 +7246,7 @@ var en = class {
|
|
|
6940
7246
|
}
|
|
6941
7247
|
validateQueryForMode(e, t, n) {
|
|
6942
7248
|
let r = () => {
|
|
6943
|
-
let e =
|
|
7249
|
+
let e = pn(t, n);
|
|
6944
7250
|
if (!e.isValid) throw Error(`Query validation failed: ${e.errors.join(", ")}`);
|
|
6945
7251
|
};
|
|
6946
7252
|
({
|
|
@@ -6958,7 +7264,7 @@ var en = class {
|
|
|
6958
7264
|
let e = this.retentionQueryBuilder.validateConfig(n.retention, t);
|
|
6959
7265
|
if (!e.isValid) throw Error(`Retention validation failed: ${e.errors.join(", ")}`);
|
|
6960
7266
|
}
|
|
6961
|
-
})[e]();
|
|
7267
|
+
})[ft(e)]();
|
|
6962
7268
|
}
|
|
6963
7269
|
async executeQueryByModeWithCache(e, t, n, r, i) {
|
|
6964
7270
|
return {
|
|
@@ -6967,7 +7273,7 @@ var en = class {
|
|
|
6967
7273
|
funnel: () => this.executeFunnelQueryWithCache(t, n, r, i),
|
|
6968
7274
|
flow: () => this.executeFlowQueryWithCache(t, n, r, i),
|
|
6969
7275
|
retention: () => this.executeRetentionQueryWithCache(t, n, r, i)
|
|
6970
|
-
}[e]();
|
|
7276
|
+
}[ft(e)]();
|
|
6971
7277
|
}
|
|
6972
7278
|
async executeRegularQueryWithCache(e, t, n, r) {
|
|
6973
7279
|
let i = new q(), a = this.createQueryContext(n, i);
|
|
@@ -6975,7 +7281,7 @@ var en = class {
|
|
|
6975
7281
|
let { optimisedPlan: o } = this.buildRegularQueryArtifacts(e, t, a), s = this.drizzlePlanBuilder.derivePhysicalPlanContext(o);
|
|
6976
7282
|
this.validateSecurityContext(s, a);
|
|
6977
7283
|
let c = this.drizzlePlanBuilder.build(s, t, a), l = this.queryBuilder.collectNumericFields(e, t), u = await this.dbExecutor.execute(c, l), d = {
|
|
6978
|
-
data:
|
|
7284
|
+
data: Ht(Array.isArray(u) ? u.map((e) => {
|
|
6979
7285
|
let n = { ...e };
|
|
6980
7286
|
if (t.timeDimensions) {
|
|
6981
7287
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -7013,7 +7319,7 @@ var en = class {
|
|
|
7013
7319
|
funnel: () => this.dryRunFunnel(t, n, r),
|
|
7014
7320
|
flow: () => this.dryRunFlow(t, n, r),
|
|
7015
7321
|
retention: () => this.dryRunRetention(t, n, r)
|
|
7016
|
-
}[e]();
|
|
7322
|
+
}[ft(e)]();
|
|
7017
7323
|
}
|
|
7018
7324
|
async generateComparisonSQL(e, t, n) {
|
|
7019
7325
|
let r = this.buildComparisonExecutionPlan(t).periodQueries[0];
|
|
@@ -7065,9 +7371,9 @@ var en = class {
|
|
|
7065
7371
|
}
|
|
7066
7372
|
preloadFilterCache(e, t, n, r) {
|
|
7067
7373
|
if (e.filters && e.filters.length > 0) {
|
|
7068
|
-
let i =
|
|
7374
|
+
let i = gt(e.filters);
|
|
7069
7375
|
for (let e of i) {
|
|
7070
|
-
let i =
|
|
7376
|
+
let i = mt(e);
|
|
7071
7377
|
if (t.has(i)) continue;
|
|
7072
7378
|
let [a, o] = e.member.split("."), s = n.get(a);
|
|
7073
7379
|
if (!s) continue;
|
|
@@ -7083,7 +7389,7 @@ var en = class {
|
|
|
7083
7389
|
}
|
|
7084
7390
|
if (e.timeDimensions) {
|
|
7085
7391
|
for (let i of e.timeDimensions) if (i.dateRange) {
|
|
7086
|
-
let e =
|
|
7392
|
+
let e = ht(i.dimension, i.dateRange);
|
|
7087
7393
|
if (t.has(e)) continue;
|
|
7088
7394
|
let [a, o] = i.dimension.split("."), s = n.get(a);
|
|
7089
7395
|
if (!s) continue;
|
|
@@ -7094,13 +7400,13 @@ var en = class {
|
|
|
7094
7400
|
}
|
|
7095
7401
|
}
|
|
7096
7402
|
}
|
|
7097
|
-
},
|
|
7403
|
+
}, dn = class e {
|
|
7098
7404
|
cubes = /* @__PURE__ */ new Map();
|
|
7099
7405
|
dbExecutor;
|
|
7100
7406
|
metadataCache;
|
|
7101
7407
|
cacheConfig;
|
|
7102
7408
|
constructor(e) {
|
|
7103
|
-
e?.databaseExecutor ? this.dbExecutor = e.databaseExecutor : e?.drizzle && (this.dbExecutor =
|
|
7409
|
+
e?.databaseExecutor ? this.dbExecutor = e.databaseExecutor : e?.drizzle && (this.dbExecutor = ct(e.drizzle, e.schema, e.engineType)), this.cacheConfig = e?.cache;
|
|
7104
7410
|
}
|
|
7105
7411
|
setDatabaseExecutor(e) {
|
|
7106
7412
|
this.dbExecutor = e;
|
|
@@ -7109,7 +7415,7 @@ var en = class {
|
|
|
7109
7415
|
return this.dbExecutor?.getEngineType();
|
|
7110
7416
|
}
|
|
7111
7417
|
setDrizzle(e, t, n) {
|
|
7112
|
-
this.dbExecutor =
|
|
7418
|
+
this.dbExecutor = ct(e, t, n);
|
|
7113
7419
|
}
|
|
7114
7420
|
hasExecutor() {
|
|
7115
7421
|
return !!this.dbExecutor;
|
|
@@ -7119,7 +7425,7 @@ var en = class {
|
|
|
7119
7425
|
return this.dbExecutor;
|
|
7120
7426
|
}
|
|
7121
7427
|
createQueryExecutor(e = !1) {
|
|
7122
|
-
return new
|
|
7428
|
+
return new un(this.requireExecutor(), e ? this.cacheConfig : void 0);
|
|
7123
7429
|
}
|
|
7124
7430
|
formatSqlResult(e) {
|
|
7125
7431
|
let t = this.requireExecutor().getEngineType();
|
|
@@ -7129,7 +7435,7 @@ var en = class {
|
|
|
7129
7435
|
};
|
|
7130
7436
|
}
|
|
7131
7437
|
registerCube(e) {
|
|
7132
|
-
this.validateCalculatedMeasures(e), new
|
|
7438
|
+
this.validateCalculatedMeasures(e), new X(this.cubes).populateDependencies(e), this.cubes.set(e.name, e), this.invalidateMetadataCache();
|
|
7133
7439
|
}
|
|
7134
7440
|
validateCubeReferences() {
|
|
7135
7441
|
let e = [];
|
|
@@ -7143,14 +7449,14 @@ var en = class {
|
|
|
7143
7449
|
t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);
|
|
7144
7450
|
continue;
|
|
7145
7451
|
}
|
|
7146
|
-
let i =
|
|
7452
|
+
let i = Ot(r.calculatedSql);
|
|
7147
7453
|
if (!i.isValid) {
|
|
7148
7454
|
t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(", ")}`);
|
|
7149
7455
|
continue;
|
|
7150
7456
|
}
|
|
7151
7457
|
let a = new Map(this.cubes);
|
|
7152
7458
|
a.set(e.name, e);
|
|
7153
|
-
let o = new
|
|
7459
|
+
let o = new X(a);
|
|
7154
7460
|
try {
|
|
7155
7461
|
o.validateDependencies(e);
|
|
7156
7462
|
} catch (e) {
|
|
@@ -7160,7 +7466,7 @@ var en = class {
|
|
|
7160
7466
|
if (t.length === 0) {
|
|
7161
7467
|
let n = new Map(this.cubes);
|
|
7162
7468
|
n.set(e.name, e);
|
|
7163
|
-
let r = new
|
|
7469
|
+
let r = new X(n);
|
|
7164
7470
|
r.buildGraph(e);
|
|
7165
7471
|
let i = r.detectCycle();
|
|
7166
7472
|
i && t.push(`Circular dependency detected in calculated measures: ${i.join(" -> ")}`);
|
|
@@ -7313,18 +7619,18 @@ var en = class {
|
|
|
7313
7619
|
return Array.from(this.cubes.keys());
|
|
7314
7620
|
}
|
|
7315
7621
|
validateQuery(e) {
|
|
7316
|
-
return
|
|
7622
|
+
return pn(this.cubes, e);
|
|
7317
7623
|
}
|
|
7318
7624
|
analyzeQuery(e, t) {
|
|
7319
7625
|
return this.createQueryExecutor(!0).analyzeQuery(this.cubes, e, t);
|
|
7320
7626
|
}
|
|
7321
7627
|
};
|
|
7322
|
-
function
|
|
7628
|
+
function fn(e) {
|
|
7323
7629
|
let t = [];
|
|
7324
7630
|
return e.timeDimensions?.some((e) => e.compareDateRange && e.compareDateRange.length >= 2) && t.push("comparison"), e.funnel !== void 0 && e.funnel.steps?.length >= 2 && t.push("funnel"), e.flow !== void 0 && e.flow.startingStep !== void 0 && e.flow.eventDimension !== void 0 && t.push("flow"), e.retention !== void 0 && e.retention.timeDimension != null && e.retention.bindingKey != null && t.push("retention"), t.length === 0 ? [] : t;
|
|
7325
7631
|
}
|
|
7326
|
-
function
|
|
7327
|
-
let n = [], r =
|
|
7632
|
+
function pn(e, t) {
|
|
7633
|
+
let n = [], r = fn(t);
|
|
7328
7634
|
if (r.length > 1) return n.push(`Query contains multiple query modes: ${r.join(", ")}`), {
|
|
7329
7635
|
isValid: !1,
|
|
7330
7636
|
errors: n
|
|
@@ -7345,7 +7651,7 @@ function an(e, t) {
|
|
|
7345
7651
|
}
|
|
7346
7652
|
},
|
|
7347
7653
|
retention: () => {
|
|
7348
|
-
let r = t.retention, i =
|
|
7654
|
+
let r = t.retention, i = hn(r.timeDimension);
|
|
7349
7655
|
i && !e.has(i) && n.push(`Retention cube not found: ${i}`);
|
|
7350
7656
|
let a = r.bindingKey;
|
|
7351
7657
|
if (typeof a == "string") {
|
|
@@ -7411,16 +7717,16 @@ function an(e, t) {
|
|
|
7411
7717
|
}
|
|
7412
7718
|
o.dimensions[i] || n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`);
|
|
7413
7719
|
}
|
|
7414
|
-
if (t.filters) for (let r of t.filters)
|
|
7720
|
+
if (t.filters) for (let r of t.filters) mn(r, e, n, a);
|
|
7415
7721
|
return a.size === 0 && n.push("Query must reference at least one cube through measures, dimensions, or filters"), {
|
|
7416
7722
|
isValid: n.length === 0,
|
|
7417
7723
|
errors: n
|
|
7418
7724
|
};
|
|
7419
7725
|
}
|
|
7420
|
-
function
|
|
7726
|
+
function mn(e, t, n, r) {
|
|
7421
7727
|
if ("and" in e || "or" in e) {
|
|
7422
7728
|
let i = e.and || e.or || [];
|
|
7423
|
-
for (let e of i)
|
|
7729
|
+
for (let e of i) mn(e, t, n, r);
|
|
7424
7730
|
return;
|
|
7425
7731
|
}
|
|
7426
7732
|
if (!("member" in e)) {
|
|
@@ -7443,7 +7749,7 @@ function on(e, t, n, r) {
|
|
|
7443
7749
|
n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`);
|
|
7444
7750
|
}
|
|
7445
7751
|
}
|
|
7446
|
-
function
|
|
7752
|
+
function hn(e) {
|
|
7447
7753
|
if (typeof e == "string") {
|
|
7448
7754
|
let [t] = e.split(".");
|
|
7449
7755
|
return t || null;
|
|
@@ -7452,31 +7758,31 @@ function sn(e) {
|
|
|
7452
7758
|
}
|
|
7453
7759
|
//#endregion
|
|
7454
7760
|
//#region src/adapters/mcp-transport.ts
|
|
7455
|
-
var
|
|
7761
|
+
var Q = [
|
|
7456
7762
|
"2025-11-25",
|
|
7457
7763
|
"2025-06-18",
|
|
7458
7764
|
"2025-03-26"
|
|
7459
|
-
],
|
|
7460
|
-
function
|
|
7461
|
-
let t =
|
|
7765
|
+
], gn = "2025-11-25";
|
|
7766
|
+
function _n(e) {
|
|
7767
|
+
let t = Dn(e["mcp-protocol-version"]) || "2025-11-25";
|
|
7462
7768
|
return {
|
|
7463
|
-
ok:
|
|
7464
|
-
negotiated:
|
|
7465
|
-
supported:
|
|
7769
|
+
ok: Q.includes(t),
|
|
7770
|
+
negotiated: Q.includes(t) ? t : null,
|
|
7771
|
+
supported: Q
|
|
7466
7772
|
};
|
|
7467
7773
|
}
|
|
7468
|
-
function
|
|
7774
|
+
function vn(e) {
|
|
7469
7775
|
if (!e) return !1;
|
|
7470
7776
|
let t = e.split(",").map((e) => e.trim().toLowerCase()), n = t.includes("text/event-stream"), r = t.includes("application/json");
|
|
7471
7777
|
return n && !r;
|
|
7472
7778
|
}
|
|
7473
|
-
var
|
|
7474
|
-
function
|
|
7779
|
+
var yn = "mcp-session-id";
|
|
7780
|
+
function bn(e) {
|
|
7475
7781
|
if (!e) return !1;
|
|
7476
7782
|
let t = e.split(",").map((e) => e.trim().toLowerCase().split(";")[0]), n = t.some((e) => e === "application/json"), r = t.some((e) => e === "text/event-stream");
|
|
7477
7783
|
return n && r;
|
|
7478
7784
|
}
|
|
7479
|
-
function
|
|
7785
|
+
function xn(e, t = {}) {
|
|
7480
7786
|
let { allowMissingOrigin: n = !0, allowedOrigins: r } = t;
|
|
7481
7787
|
if (!e) return n ? { valid: !0 } : {
|
|
7482
7788
|
valid: !1,
|
|
@@ -7503,11 +7809,11 @@ function mn(e, t = {}) {
|
|
|
7503
7809
|
reason: "Origin not in allowed list"
|
|
7504
7810
|
};
|
|
7505
7811
|
}
|
|
7506
|
-
function
|
|
7812
|
+
function Sn(e, t, n) {
|
|
7507
7813
|
let r = [];
|
|
7508
7814
|
return t && r.push(`id: ${t}`), n && n > 0 && r.push(`retry: ${n}`), r.push("event: message"), r.push(`data: ${JSON.stringify(e)}`), r.push(""), r.join("\n");
|
|
7509
7815
|
}
|
|
7510
|
-
function
|
|
7816
|
+
function Cn(e, t, n, r) {
|
|
7511
7817
|
return {
|
|
7512
7818
|
jsonrpc: "2.0",
|
|
7513
7819
|
id: e ?? null,
|
|
@@ -7518,14 +7824,14 @@ function gn(e, t, n, r) {
|
|
|
7518
7824
|
}
|
|
7519
7825
|
};
|
|
7520
7826
|
}
|
|
7521
|
-
function
|
|
7827
|
+
function wn(e, t) {
|
|
7522
7828
|
return {
|
|
7523
7829
|
jsonrpc: "2.0",
|
|
7524
7830
|
id: e ?? null,
|
|
7525
7831
|
result: t
|
|
7526
7832
|
};
|
|
7527
7833
|
}
|
|
7528
|
-
function
|
|
7834
|
+
function Tn(e) {
|
|
7529
7835
|
if (!e || typeof e != "object") return null;
|
|
7530
7836
|
let t = e;
|
|
7531
7837
|
return t.jsonrpc !== "2.0" || typeof t.method != "string" ? null : {
|
|
@@ -7535,12 +7841,12 @@ function vn(e) {
|
|
|
7535
7841
|
params: t.params
|
|
7536
7842
|
};
|
|
7537
7843
|
}
|
|
7538
|
-
async function
|
|
7539
|
-
let { semanticLayer: o, extractSecurityContext: s, rawRequest: c, rawResponse: l } = a, u = a.prompts ??
|
|
7844
|
+
async function En(e, i, a) {
|
|
7845
|
+
let { semanticLayer: o, extractSecurityContext: s, rawRequest: c, rawResponse: l } = a, u = a.prompts ?? Nn, d = a.resources ?? Pn;
|
|
7540
7846
|
switch (e) {
|
|
7541
7847
|
case "initialize": {
|
|
7542
7848
|
let e = i?.protocolVersion, t;
|
|
7543
|
-
return t = e &&
|
|
7849
|
+
return t = e && Q.includes(e) ? e : gn, {
|
|
7544
7850
|
protocolVersion: t,
|
|
7545
7851
|
capabilities: {
|
|
7546
7852
|
tools: { listChanged: !1 },
|
|
@@ -7548,7 +7854,7 @@ async function yn(e, i, a) {
|
|
|
7548
7854
|
prompts: { listChanged: !1 },
|
|
7549
7855
|
sampling: {}
|
|
7550
7856
|
},
|
|
7551
|
-
sessionId:
|
|
7857
|
+
sessionId: kn(),
|
|
7552
7858
|
serverInfo: {
|
|
7553
7859
|
name: "drizzle-cube",
|
|
7554
7860
|
version: typeof process < "u" ? process.env?.npm_package_version || "dev" : "worker"
|
|
@@ -7557,11 +7863,11 @@ async function yn(e, i, a) {
|
|
|
7557
7863
|
}
|
|
7558
7864
|
case "list_tools":
|
|
7559
7865
|
case "tools/list": return {
|
|
7560
|
-
tools:
|
|
7866
|
+
tools: An(),
|
|
7561
7867
|
nextCursor: ""
|
|
7562
7868
|
};
|
|
7563
7869
|
case "call_tool":
|
|
7564
|
-
case "tools/call": return
|
|
7870
|
+
case "tools/call": return jn(i, a);
|
|
7565
7871
|
case "resources/list": return {
|
|
7566
7872
|
resources: d.map(({ uri: e, name: t, description: n, mimeType: r }) => ({
|
|
7567
7873
|
uri: e,
|
|
@@ -7620,16 +7926,16 @@ function $(e, t, n) {
|
|
|
7620
7926
|
let r = Error(t);
|
|
7621
7927
|
return r.code = e, n !== void 0 && (r.data = n), r;
|
|
7622
7928
|
}
|
|
7623
|
-
function
|
|
7929
|
+
function Dn(e) {
|
|
7624
7930
|
return e ? Array.isArray(e) ? e[0] || null : e : null;
|
|
7625
7931
|
}
|
|
7626
|
-
function
|
|
7932
|
+
function On(e) {
|
|
7627
7933
|
return e.id === void 0 || e.id === null;
|
|
7628
7934
|
}
|
|
7629
|
-
function
|
|
7935
|
+
function kn() {
|
|
7630
7936
|
return `evt-${e()}`;
|
|
7631
7937
|
}
|
|
7632
|
-
function
|
|
7938
|
+
function An() {
|
|
7633
7939
|
return [
|
|
7634
7940
|
{
|
|
7635
7941
|
name: "discover",
|
|
@@ -7682,26 +7988,26 @@ function Cn() {
|
|
|
7682
7988
|
}
|
|
7683
7989
|
];
|
|
7684
7990
|
}
|
|
7685
|
-
async function
|
|
7991
|
+
async function jn(e, i) {
|
|
7686
7992
|
let { semanticLayer: a, extractSecurityContext: o, rawRequest: s, rawResponse: c } = i, l = e || {};
|
|
7687
7993
|
if (!l.name) throw $(-32602, "name is required for tools/call");
|
|
7688
7994
|
let u = l.arguments;
|
|
7689
7995
|
switch (l.name) {
|
|
7690
|
-
case "discover": return
|
|
7996
|
+
case "discover": return Mn(await t(a, u || {}));
|
|
7691
7997
|
case "validate": {
|
|
7692
7998
|
let e = u || {};
|
|
7693
7999
|
if (!e.query) throw $(-32602, "query is required");
|
|
7694
|
-
return
|
|
8000
|
+
return Mn(await n(a, e));
|
|
7695
8001
|
}
|
|
7696
8002
|
case "load": {
|
|
7697
8003
|
let e = u || {};
|
|
7698
8004
|
if (!e.query) throw $(-32602, "query is required");
|
|
7699
|
-
return
|
|
8005
|
+
return Mn(await r(a, await o(s, c), e));
|
|
7700
8006
|
}
|
|
7701
8007
|
default: throw $(-32601, `Unknown tool: ${l.name}`);
|
|
7702
8008
|
}
|
|
7703
8009
|
}
|
|
7704
|
-
function
|
|
8010
|
+
function Mn(e) {
|
|
7705
8011
|
return {
|
|
7706
8012
|
content: [{
|
|
7707
8013
|
type: "text",
|
|
@@ -7710,7 +8016,7 @@ function Tn(e) {
|
|
|
7710
8016
|
isError: !1
|
|
7711
8017
|
};
|
|
7712
8018
|
}
|
|
7713
|
-
var
|
|
8019
|
+
var Nn = a(), Pn = [{
|
|
7714
8020
|
uri: "drizzle-cube://quickstart",
|
|
7715
8021
|
name: "Drizzle Cube MCP Quickstart",
|
|
7716
8022
|
description: "Minimal guide for using discover/suggest/validate/load",
|
|
@@ -7811,11 +8117,11 @@ var En = a(), Dn = [{
|
|
|
7811
8117
|
"- Both can be combined: inDateRange filter + timeDimensions granularity."
|
|
7812
8118
|
].join("\n")
|
|
7813
8119
|
}];
|
|
7814
|
-
function
|
|
7815
|
-
return
|
|
8120
|
+
function Fn() {
|
|
8121
|
+
return Pn;
|
|
7816
8122
|
}
|
|
7817
|
-
function
|
|
7818
|
-
return
|
|
8123
|
+
function In() {
|
|
8124
|
+
return Nn;
|
|
7819
8125
|
}
|
|
7820
8126
|
//#endregion
|
|
7821
|
-
export {
|
|
8127
|
+
export { In as a, _n as c, Sn as d, bn as f, dn as h, En as i, Tn as l, vn as m, Cn as n, Fn as o, xn as p, wn as r, On as s, yn as t, kn as u };
|