drizzle-cube 0.4.30 → 0.4.32
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-B8vuFQYP.cjs → handler-ClgB__a-.cjs} +2 -2
- package/dist/adapters/{handler-D-2-6uLM.js → handler-rPpxuopb.js} +4 -4
- 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-DPpei63d.cjs +255 -0
- package/dist/adapters/{mcp-transport-CuugoG8t.js → mcp-transport-DWSNkwUY.js} +1588 -962
- 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-Bc8qwEKW.cjs} +1 -1
- package/dist/adapters/openai-C96O8M75.cjs +16 -0
- package/dist/adapters/{openai-CjBvA6mK.js → openai-Ckpe7iU7.js} +659 -637
- package/dist/adapters/{openai-Zjw4Zo4R.js → openai-DxeVtl8X.js} +1 -1
- package/dist/adapters/{utils-ChhNGUOF.js → utils-B7VkyzMv.js} +7 -3
- package/dist/adapters/{utils-CwJplXR5.cjs → utils-BLFzzCI9.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 +42 -40
- package/dist/server/index.d.ts +77 -9
- package/dist/server/index.js +1868 -1238
- package/dist/server/{openai-CLsoLaue.cjs → openai-0HbLlZq6.cjs} +1 -1
- package/dist/server/openai-DKpZPCay.cjs +16 -0
- package/dist/server/{openai-D1kZ5sdM.js → openai-DnGeU9PT.js} +1 -1
- package/dist/server/{openai-BPhmb8mi.js → openai-DqCEogm0.js} +659 -637
- package/package.json +24 -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-B7VkyzMv.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");
|
|
@@ -271,9 +271,9 @@ var y = class extends l {
|
|
|
271
271
|
}
|
|
272
272
|
build(e) {
|
|
273
273
|
let t = this.config.baseBuilder.build(e);
|
|
274
|
-
return new
|
|
274
|
+
return new S(e, this.config, t);
|
|
275
275
|
}
|
|
276
|
-
},
|
|
276
|
+
}, S = 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,42 @@ var U = class {
|
|
|
834
834
|
supportsWindowFunctions: !0,
|
|
835
835
|
supportsFrameClause: !0,
|
|
836
836
|
supportsLateralJoins: !0,
|
|
837
|
-
supportsPercentileSubqueries: !0
|
|
837
|
+
supportsPercentileSubqueries: !0,
|
|
838
|
+
supportsDerivedTablesInCTE: !0,
|
|
839
|
+
supportsLateralSubqueriesInCTE: !0
|
|
838
840
|
};
|
|
839
841
|
}
|
|
840
842
|
buildStddev(e, t = !1) {
|
|
841
843
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
842
|
-
return
|
|
844
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
843
845
|
}
|
|
844
846
|
buildVariance(e, t = !1) {
|
|
845
847
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
846
|
-
return
|
|
848
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
847
849
|
}
|
|
848
850
|
buildPercentile(e, t) {
|
|
849
|
-
return
|
|
851
|
+
return F`PERCENTILE_CONT(${t / 100}) WITHIN GROUP (ORDER BY ${e})`;
|
|
850
852
|
}
|
|
851
853
|
buildWindowFunction(e, t, n, r, i) {
|
|
852
|
-
let a = n && n.length > 0 ?
|
|
854
|
+
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
855
|
if (i?.frame) {
|
|
854
856
|
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 =
|
|
857
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
856
858
|
}
|
|
857
859
|
let c = [];
|
|
858
860
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
859
|
-
let l =
|
|
861
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
860
862
|
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
|
|
863
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
864
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
865
|
+
case "rank": return F`RANK() ${l}`;
|
|
866
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
867
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
868
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
869
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
870
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
871
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
872
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
871
873
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
872
874
|
}
|
|
873
875
|
}
|
|
@@ -880,25 +882,25 @@ var U = class {
|
|
|
880
882
|
}
|
|
881
883
|
buildIntervalFromISO(e) {
|
|
882
884
|
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`),
|
|
885
|
+
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
886
|
}
|
|
885
887
|
buildTimeDifferenceSeconds(e, t) {
|
|
886
|
-
return
|
|
888
|
+
return F`TIMESTAMPDIFF(SECOND, ${t}, ${e})`;
|
|
887
889
|
}
|
|
888
890
|
buildDateAddInterval(e, t) {
|
|
889
891
|
let n = this.parseISODuration(t), r = e;
|
|
890
|
-
return n.years && (r =
|
|
892
|
+
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
893
|
}
|
|
892
894
|
buildConditionalAggregation(e, t, n) {
|
|
893
895
|
let r = e.toUpperCase();
|
|
894
|
-
return e === "count" && !t ?
|
|
896
|
+
return e === "count" && !t ? F`COUNT(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
895
897
|
}
|
|
896
898
|
buildDateDiffPeriods(e, t, n) {
|
|
897
899
|
let r = n.toUpperCase();
|
|
898
|
-
return
|
|
900
|
+
return F`TIMESTAMPDIFF(${F.raw(r)}, ${e}, ${t})`;
|
|
899
901
|
}
|
|
900
902
|
buildPeriodSeriesSubquery(e) {
|
|
901
|
-
return
|
|
903
|
+
return F`(
|
|
902
904
|
WITH RECURSIVE periods(period_number) AS (
|
|
903
905
|
SELECT 0
|
|
904
906
|
UNION ALL
|
|
@@ -919,45 +921,45 @@ var U = class {
|
|
|
919
921
|
second: "%Y-%m-%d %H:%i:%s"
|
|
920
922
|
};
|
|
921
923
|
switch (e) {
|
|
922
|
-
case "quarter": return
|
|
923
|
-
case "week": return
|
|
924
|
+
case "quarter": return F`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;
|
|
925
|
+
case "week": return F`DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY)`;
|
|
924
926
|
default: {
|
|
925
927
|
let r = n[e];
|
|
926
|
-
return r ?
|
|
928
|
+
return r ? F`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')` : t;
|
|
927
929
|
}
|
|
928
930
|
}
|
|
929
931
|
}
|
|
930
932
|
buildStringCondition(e, t, n) {
|
|
931
933
|
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
|
|
934
|
+
case "contains": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
935
|
+
case "notContains": return F`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
936
|
+
case "startsWith": return F`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
937
|
+
case "endsWith": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
938
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
939
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
940
|
+
case "ilike": return F`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
941
|
+
case "regex": return F`${e} REGEXP ${n}`;
|
|
942
|
+
case "notRegex": return F`${e} NOT REGEXP ${n}`;
|
|
941
943
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
942
944
|
}
|
|
943
945
|
}
|
|
944
946
|
castToType(e, t) {
|
|
945
947
|
switch (t) {
|
|
946
|
-
case "timestamp": return
|
|
947
|
-
case "decimal": return
|
|
948
|
-
case "integer": return
|
|
948
|
+
case "timestamp": return F`CAST(${e} AS DATETIME)`;
|
|
949
|
+
case "decimal": return F`CAST(${e} AS DECIMAL(10,2))`;
|
|
950
|
+
case "integer": return F`CAST(${e} AS SIGNED INTEGER)`;
|
|
949
951
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
950
952
|
}
|
|
951
953
|
}
|
|
952
954
|
buildAvg(e) {
|
|
953
|
-
return
|
|
955
|
+
return F`IFNULL(AVG(${e}), 0)`;
|
|
954
956
|
}
|
|
955
957
|
buildCaseWhen(e, t) {
|
|
956
|
-
let n = e.map((e) =>
|
|
957
|
-
return t === void 0 ?
|
|
958
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
959
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
958
960
|
}
|
|
959
961
|
buildBooleanLiteral(e) {
|
|
960
|
-
return e ?
|
|
962
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
961
963
|
}
|
|
962
964
|
convertFilterValue(e) {
|
|
963
965
|
return e;
|
|
@@ -979,40 +981,42 @@ var U = class {
|
|
|
979
981
|
supportsWindowFunctions: !0,
|
|
980
982
|
supportsFrameClause: !0,
|
|
981
983
|
supportsLateralJoins: !0,
|
|
982
|
-
supportsPercentileSubqueries: !1
|
|
984
|
+
supportsPercentileSubqueries: !1,
|
|
985
|
+
supportsDerivedTablesInCTE: !0,
|
|
986
|
+
supportsLateralSubqueriesInCTE: !0
|
|
983
987
|
};
|
|
984
988
|
}
|
|
985
989
|
buildStddev(e, t = !1) {
|
|
986
990
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
987
|
-
return
|
|
991
|
+
return F`IFNULL(${F.raw(n)}(${e}), 0)`;
|
|
988
992
|
}
|
|
989
993
|
buildVariance(e, t = !1) {
|
|
990
994
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
991
|
-
return
|
|
995
|
+
return F`IFNULL(${F.raw(n)}(${e}), 0)`;
|
|
992
996
|
}
|
|
993
997
|
buildPercentile(e, t) {
|
|
994
998
|
return null;
|
|
995
999
|
}
|
|
996
1000
|
buildWindowFunction(e, t, n, r, i) {
|
|
997
|
-
let a = n && n.length > 0 ?
|
|
1001
|
+
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
1002
|
if (i?.frame) {
|
|
999
1003
|
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 =
|
|
1004
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1001
1005
|
}
|
|
1002
1006
|
let c = [];
|
|
1003
1007
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1004
|
-
let l =
|
|
1008
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1005
1009
|
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
|
|
1010
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1011
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1012
|
+
case "rank": return F`RANK() ${l}`;
|
|
1013
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1014
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1015
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1016
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1017
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1018
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1019
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1016
1020
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1017
1021
|
}
|
|
1018
1022
|
}
|
|
@@ -1024,28 +1028,28 @@ var U = class {
|
|
|
1024
1028
|
return !1;
|
|
1025
1029
|
}
|
|
1026
1030
|
buildIntervalFromISO(e) {
|
|
1027
|
-
return
|
|
1031
|
+
return F`${this.durationToSeconds(e)}`;
|
|
1028
1032
|
}
|
|
1029
1033
|
buildTimeDifferenceSeconds(e, t) {
|
|
1030
|
-
return
|
|
1034
|
+
return F`(${e} - ${t})`;
|
|
1031
1035
|
}
|
|
1032
1036
|
buildDateAddInterval(e, t) {
|
|
1033
|
-
return
|
|
1037
|
+
return F`(${e} + ${this.durationToSeconds(t)})`;
|
|
1034
1038
|
}
|
|
1035
1039
|
buildConditionalAggregation(e, t, n) {
|
|
1036
1040
|
let r = e.toUpperCase();
|
|
1037
|
-
return e === "count" && !t ?
|
|
1041
|
+
return e === "count" && !t ? F`COUNT(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1038
1042
|
}
|
|
1039
1043
|
buildDateDiffPeriods(e, t, n) {
|
|
1040
1044
|
switch (n) {
|
|
1041
|
-
case "day": return
|
|
1042
|
-
case "week": return
|
|
1043
|
-
case "month": return
|
|
1045
|
+
case "day": return F`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;
|
|
1046
|
+
case "week": return F`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;
|
|
1047
|
+
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
1048
|
default: throw Error(`Unsupported date diff unit for SQLite: ${n}`);
|
|
1045
1049
|
}
|
|
1046
1050
|
}
|
|
1047
1051
|
buildPeriodSeriesSubquery(e) {
|
|
1048
|
-
return
|
|
1052
|
+
return F`(
|
|
1049
1053
|
WITH RECURSIVE periods(period_number) AS (
|
|
1050
1054
|
SELECT 0
|
|
1051
1055
|
UNION ALL
|
|
@@ -1056,55 +1060,55 @@ var U = class {
|
|
|
1056
1060
|
}
|
|
1057
1061
|
buildTimeDimension(e, t) {
|
|
1058
1062
|
switch (e) {
|
|
1059
|
-
case "year": return
|
|
1063
|
+
case "year": return F`datetime(${t}, 'unixepoch', 'start of year')`;
|
|
1060
1064
|
case "quarter": {
|
|
1061
|
-
let e =
|
|
1062
|
-
return
|
|
1065
|
+
let e = F`datetime(${t}, 'unixepoch')`;
|
|
1066
|
+
return F`datetime(${e}, 'start of year',
|
|
1063
1067
|
'+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`;
|
|
1064
1068
|
}
|
|
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
|
|
1069
|
+
case "month": return F`datetime(${t}, 'unixepoch', 'start of month')`;
|
|
1070
|
+
case "week": return F`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;
|
|
1071
|
+
case "day": return F`datetime(${t}, 'unixepoch', 'start of day')`;
|
|
1072
|
+
case "hour": return F`datetime(strftime('%Y-%m-%d %H:00:00', ${F`datetime(${t}, 'unixepoch')`}))`;
|
|
1073
|
+
case "minute": return F`datetime(strftime('%Y-%m-%d %H:%M:00', ${F`datetime(${t}, 'unixepoch')`}))`;
|
|
1074
|
+
case "second": return F`datetime(strftime('%Y-%m-%d %H:%M:%S', ${F`datetime(${t}, 'unixepoch')`}))`;
|
|
1075
|
+
default: return F`datetime(${t}, 'unixepoch')`;
|
|
1072
1076
|
}
|
|
1073
1077
|
}
|
|
1074
1078
|
buildStringCondition(e, t, n) {
|
|
1075
1079
|
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
|
|
1080
|
+
case "contains": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
1081
|
+
case "notContains": return F`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
1082
|
+
case "startsWith": return F`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
1083
|
+
case "endsWith": return F`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
1084
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1085
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1086
|
+
case "ilike": return F`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
1087
|
+
case "regex": return F`${e} GLOB ${n}`;
|
|
1088
|
+
case "notRegex": return F`${e} NOT GLOB ${n}`;
|
|
1085
1089
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1086
1090
|
}
|
|
1087
1091
|
}
|
|
1088
1092
|
castToType(e, t) {
|
|
1089
1093
|
switch (t) {
|
|
1090
|
-
case "timestamp": return
|
|
1091
|
-
case "decimal": return
|
|
1092
|
-
case "integer": return
|
|
1094
|
+
case "timestamp": return F`datetime(${e} / 1000, 'unixepoch')`;
|
|
1095
|
+
case "decimal": return F`CAST(${e} AS REAL)`;
|
|
1096
|
+
case "integer": return F`CAST(${e} AS INTEGER)`;
|
|
1093
1097
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1094
1098
|
}
|
|
1095
1099
|
}
|
|
1096
1100
|
buildAvg(e) {
|
|
1097
|
-
return
|
|
1101
|
+
return F`IFNULL(AVG(${e}), 0)`;
|
|
1098
1102
|
}
|
|
1099
1103
|
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 ?
|
|
1104
|
+
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}`);
|
|
1105
|
+
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
1106
|
}
|
|
1103
1107
|
buildBooleanLiteral(e) {
|
|
1104
|
-
return e ?
|
|
1108
|
+
return e ? F`1` : F`0`;
|
|
1105
1109
|
}
|
|
1106
1110
|
preprocessCalculatedTemplate(e) {
|
|
1107
|
-
return e.replace(/(\{[^}]+\})\s*\/\s*/g, (e, t) => `${t.replace(/\{([^}]+)\}/, "CAST({$1} AS REAL)")} / `);
|
|
1111
|
+
return e.length > 1e3 ? e : e.replace(/(\{[^}]+\})\s*\/\s*/g, (e, t) => `${t.replace(/\{([^}]+)\}/, "CAST({$1} AS REAL)")} / `);
|
|
1108
1112
|
}
|
|
1109
1113
|
convertFilterValue(e) {
|
|
1110
1114
|
return typeof e == "boolean" ? e ? 1 : 0 : e instanceof Date ? e.getTime() : Array.isArray(e) ? e.map((e) => this.convertFilterValue(e)) : e;
|
|
@@ -1131,7 +1135,9 @@ var U = class {
|
|
|
1131
1135
|
supportsWindowFunctions: !0,
|
|
1132
1136
|
supportsFrameClause: !0,
|
|
1133
1137
|
supportsLateralJoins: !1,
|
|
1134
|
-
supportsPercentileSubqueries: !1
|
|
1138
|
+
supportsPercentileSubqueries: !1,
|
|
1139
|
+
supportsDerivedTablesInCTE: !0,
|
|
1140
|
+
supportsLateralSubqueriesInCTE: !1
|
|
1135
1141
|
};
|
|
1136
1142
|
}
|
|
1137
1143
|
buildStddev(e, t = !1) {
|
|
@@ -1144,25 +1150,25 @@ var U = class {
|
|
|
1144
1150
|
return null;
|
|
1145
1151
|
}
|
|
1146
1152
|
buildWindowFunction(e, t, n, r, i) {
|
|
1147
|
-
let a = n && n.length > 0 ?
|
|
1153
|
+
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
1154
|
if (i?.frame) {
|
|
1149
1155
|
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 =
|
|
1156
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1151
1157
|
}
|
|
1152
1158
|
let c = [];
|
|
1153
1159
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1154
|
-
let l =
|
|
1160
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1155
1161
|
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
|
|
1162
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1163
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1164
|
+
case "rank": return F`RANK() ${l}`;
|
|
1165
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1166
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1167
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1168
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1169
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1170
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1171
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1166
1172
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1167
1173
|
}
|
|
1168
1174
|
}
|
|
@@ -1181,68 +1187,68 @@ var U = class {
|
|
|
1181
1187
|
let t = this.parseISODuration(e), n = [];
|
|
1182
1188
|
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
1189
|
let r = n.join(" ") || "0 seconds";
|
|
1184
|
-
return
|
|
1190
|
+
return F`INTERVAL '${F.raw(r)}'`;
|
|
1185
1191
|
}
|
|
1186
1192
|
buildTimeDifferenceSeconds(e, t) {
|
|
1187
|
-
return
|
|
1193
|
+
return F`(EPOCH(${e}) - EPOCH(${t}))`;
|
|
1188
1194
|
}
|
|
1189
1195
|
buildDateAddInterval(e, t) {
|
|
1190
|
-
return
|
|
1196
|
+
return F`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
1191
1197
|
}
|
|
1192
1198
|
buildConditionalAggregation(e, t, n) {
|
|
1193
1199
|
let r = e.toUpperCase();
|
|
1194
|
-
return e === "count" && !t ?
|
|
1200
|
+
return e === "count" && !t ? F`COUNT(*) FILTER (WHERE ${n})` : F`${F.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
1195
1201
|
}
|
|
1196
1202
|
buildDateDiffPeriods(e, t, n) {
|
|
1197
|
-
return
|
|
1203
|
+
return F`DATE_DIFF('${F.raw(n)}', ${e}::timestamp, ${t}::timestamp)`;
|
|
1198
1204
|
}
|
|
1199
1205
|
buildPeriodSeriesSubquery(e) {
|
|
1200
|
-
return
|
|
1206
|
+
return F`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`;
|
|
1201
1207
|
}
|
|
1202
1208
|
buildTimeDimension(e, t) {
|
|
1203
1209
|
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
|
|
1210
|
+
case "year": return F`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
1211
|
+
case "quarter": return F`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
1212
|
+
case "month": return F`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
1213
|
+
case "week": return F`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
1214
|
+
case "day": return F`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
1215
|
+
case "hour": return F`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
1216
|
+
case "minute": return F`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
1217
|
+
case "second": return F`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
1212
1218
|
default: return t;
|
|
1213
1219
|
}
|
|
1214
1220
|
}
|
|
1215
1221
|
buildStringCondition(e, t, n) {
|
|
1216
1222
|
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
|
|
1223
|
+
case "contains": return F`${e} ILIKE ${`%${n}%`}`;
|
|
1224
|
+
case "notContains": return F`${e} NOT ILIKE ${`%${n}%`}`;
|
|
1225
|
+
case "startsWith": return F`${e} ILIKE ${`${n}%`}`;
|
|
1226
|
+
case "endsWith": return F`${e} ILIKE ${`%${n}`}`;
|
|
1227
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1228
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1229
|
+
case "ilike": return F`${e} ILIKE ${n}`;
|
|
1230
|
+
case "regex": return F`regexp_matches(${e}, ${n})`;
|
|
1231
|
+
case "notRegex": return F`NOT regexp_matches(${e}, ${n})`;
|
|
1226
1232
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1227
1233
|
}
|
|
1228
1234
|
}
|
|
1229
1235
|
castToType(e, t) {
|
|
1230
1236
|
switch (t) {
|
|
1231
|
-
case "timestamp": return
|
|
1232
|
-
case "decimal": return
|
|
1233
|
-
case "integer": return
|
|
1237
|
+
case "timestamp": return F`${e}::timestamp`;
|
|
1238
|
+
case "decimal": return F`${e}::decimal`;
|
|
1239
|
+
case "integer": return F`${e}::integer`;
|
|
1234
1240
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1235
1241
|
}
|
|
1236
1242
|
}
|
|
1237
1243
|
buildAvg(e) {
|
|
1238
|
-
return
|
|
1244
|
+
return F`COALESCE(AVG(${e}), 0)`;
|
|
1239
1245
|
}
|
|
1240
1246
|
buildCaseWhen(e, t) {
|
|
1241
|
-
let n = e.map((e) =>
|
|
1242
|
-
return t === void 0 ?
|
|
1247
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
1248
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
1243
1249
|
}
|
|
1244
1250
|
buildBooleanLiteral(e) {
|
|
1245
|
-
return e ?
|
|
1251
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
1246
1252
|
}
|
|
1247
1253
|
convertFilterValue(e) {
|
|
1248
1254
|
return e;
|
|
@@ -1264,53 +1270,324 @@ var U = class {
|
|
|
1264
1270
|
supportsWindowFunctions: !0,
|
|
1265
1271
|
supportsFrameClause: !0,
|
|
1266
1272
|
supportsLateralJoins: !1,
|
|
1267
|
-
supportsPercentileSubqueries: !1
|
|
1273
|
+
supportsPercentileSubqueries: !1,
|
|
1274
|
+
supportsDerivedTablesInCTE: !0,
|
|
1275
|
+
supportsLateralSubqueriesInCTE: !1
|
|
1268
1276
|
};
|
|
1269
1277
|
}
|
|
1270
1278
|
buildStddev(e, t = !1) {
|
|
1271
1279
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1272
|
-
return
|
|
1280
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1273
1281
|
}
|
|
1274
1282
|
buildVariance(e, t = !1) {
|
|
1275
1283
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
1276
|
-
return
|
|
1284
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1277
1285
|
}
|
|
1278
1286
|
buildPercentile(e, t) {
|
|
1279
|
-
return
|
|
1287
|
+
return F`QUANTILE_CONT(${e}, ${t / 100})`;
|
|
1280
1288
|
}
|
|
1281
1289
|
buildWindowFunction(e, t, n, r, i) {
|
|
1282
|
-
let a = n && n.length > 0 ?
|
|
1290
|
+
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
1291
|
if (i?.frame) {
|
|
1284
1292
|
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 =
|
|
1293
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1286
1294
|
}
|
|
1287
1295
|
let c = [];
|
|
1288
1296
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1289
|
-
let l =
|
|
1297
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1290
1298
|
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
|
|
1299
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1300
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1301
|
+
case "rank": return F`RANK() ${l}`;
|
|
1302
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1303
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1304
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1305
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1306
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1307
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1308
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1309
|
+
default: throw Error(`Unsupported window function: ${e}`);
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
}, Ie = class extends U {
|
|
1313
|
+
getEngineType() {
|
|
1314
|
+
return "databend";
|
|
1315
|
+
}
|
|
1316
|
+
supportsLateralJoins() {
|
|
1317
|
+
return !1;
|
|
1318
|
+
}
|
|
1319
|
+
buildIntervalFromISO(e) {
|
|
1320
|
+
let t = this.parseISODuration(e), n = [];
|
|
1321
|
+
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`;
|
|
1322
|
+
if (n.length === 1) return F`INTERVAL ${F.raw(n[0])}`;
|
|
1323
|
+
let r = n.map((e) => `INTERVAL ${e}`);
|
|
1324
|
+
return F`(${F.raw(r.join(" + "))})`;
|
|
1325
|
+
}
|
|
1326
|
+
buildTimeDifferenceSeconds(e, t) {
|
|
1327
|
+
return F`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`;
|
|
1328
|
+
}
|
|
1329
|
+
buildDateAddInterval(e, t) {
|
|
1330
|
+
return F`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
1331
|
+
}
|
|
1332
|
+
buildConditionalAggregation(e, t, n) {
|
|
1333
|
+
let r = e.toUpperCase();
|
|
1334
|
+
return e === "count" && !t ? F`${F.raw(r)}(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1335
|
+
}
|
|
1336
|
+
buildDateDiffPeriods(e, t, n) {
|
|
1337
|
+
return F`DATE_DIFF('${F.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1338
|
+
}
|
|
1339
|
+
buildPeriodSeriesSubquery(e) {
|
|
1340
|
+
return F`(SELECT number as period_number FROM numbers(${e + 1})) p`;
|
|
1341
|
+
}
|
|
1342
|
+
buildTimeDimension(e, t) {
|
|
1343
|
+
switch (e) {
|
|
1344
|
+
case "year": return F`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;
|
|
1345
|
+
case "quarter": return F`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;
|
|
1346
|
+
case "month": return F`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;
|
|
1347
|
+
case "week": return F`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;
|
|
1348
|
+
case "day": return F`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1349
|
+
case "hour": return F`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;
|
|
1350
|
+
case "minute": return F`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;
|
|
1351
|
+
case "second": return F`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;
|
|
1352
|
+
default: return t;
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
buildStringCondition(e, t, n) {
|
|
1356
|
+
switch (t) {
|
|
1357
|
+
case "contains": return F`LOWER(${e}) LIKE LOWER(${`%${n}%`})`;
|
|
1358
|
+
case "notContains": return F`LOWER(${e}) NOT LIKE LOWER(${`%${n}%`})`;
|
|
1359
|
+
case "startsWith": return F`LOWER(${e}) LIKE LOWER(${`${n}%`})`;
|
|
1360
|
+
case "endsWith": return F`LOWER(${e}) LIKE LOWER(${`%${n}`})`;
|
|
1361
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1362
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1363
|
+
case "ilike": return F`LOWER(${e}) LIKE LOWER(${n})`;
|
|
1364
|
+
case "regex": return F`${e} REGEXP ${n}`;
|
|
1365
|
+
case "notRegex": return F`NOT (${e} REGEXP ${n})`;
|
|
1366
|
+
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
castToType(e, t) {
|
|
1370
|
+
switch (t) {
|
|
1371
|
+
case "timestamp": return F`${e}::TIMESTAMP`;
|
|
1372
|
+
case "decimal": return F`${e}::DECIMAL`;
|
|
1373
|
+
case "integer": return F`${e}::INTEGER`;
|
|
1374
|
+
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
buildAvg(e) {
|
|
1378
|
+
return F`COALESCE(AVG(${e}), 0)`;
|
|
1379
|
+
}
|
|
1380
|
+
buildCaseWhen(e, t) {
|
|
1381
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
1382
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
1383
|
+
}
|
|
1384
|
+
buildBooleanLiteral(e) {
|
|
1385
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
1386
|
+
}
|
|
1387
|
+
convertFilterValue(e) {
|
|
1388
|
+
return e;
|
|
1389
|
+
}
|
|
1390
|
+
prepareDateValue(e) {
|
|
1391
|
+
return e;
|
|
1392
|
+
}
|
|
1393
|
+
isTimestampInteger() {
|
|
1394
|
+
return !1;
|
|
1395
|
+
}
|
|
1396
|
+
convertTimeDimensionResult(e) {
|
|
1397
|
+
return e;
|
|
1398
|
+
}
|
|
1399
|
+
getCapabilities() {
|
|
1400
|
+
return {
|
|
1401
|
+
supportsStddev: !0,
|
|
1402
|
+
supportsVariance: !0,
|
|
1403
|
+
supportsPercentile: !1,
|
|
1404
|
+
supportsWindowFunctions: !0,
|
|
1405
|
+
supportsFrameClause: !0,
|
|
1406
|
+
supportsLateralJoins: !1,
|
|
1407
|
+
supportsPercentileSubqueries: !1,
|
|
1408
|
+
supportsDerivedTablesInCTE: !1,
|
|
1409
|
+
supportsLateralSubqueriesInCTE: !1
|
|
1410
|
+
};
|
|
1411
|
+
}
|
|
1412
|
+
buildStddev(e, t = !1) {
|
|
1413
|
+
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1414
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1415
|
+
}
|
|
1416
|
+
buildVariance(e, t = !1) {
|
|
1417
|
+
let n = t ? "COVAR_SAMP" : "COVAR_POP";
|
|
1418
|
+
return F`COALESCE(${F.raw(n)}(${e}, ${e}), 0)`;
|
|
1419
|
+
}
|
|
1420
|
+
buildPercentile(e, t) {
|
|
1421
|
+
throw Error("Percentile functions are not yet supported for Databend");
|
|
1422
|
+
}
|
|
1423
|
+
buildWindowFunction(e, t, n, r, i) {
|
|
1424
|
+
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``;
|
|
1425
|
+
if (i?.frame) {
|
|
1426
|
+
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";
|
|
1427
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1428
|
+
}
|
|
1429
|
+
let c = [];
|
|
1430
|
+
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1431
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1432
|
+
switch (e) {
|
|
1433
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1434
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1435
|
+
case "rank": return F`RANK() ${l}`;
|
|
1436
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1437
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1438
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1439
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1440
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1441
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1442
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1443
|
+
default: throw Error(`Unsupported window function: ${e}`);
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
}, Le = class extends U {
|
|
1447
|
+
getEngineType() {
|
|
1448
|
+
return "snowflake";
|
|
1449
|
+
}
|
|
1450
|
+
supportsLateralJoins() {
|
|
1451
|
+
return !0;
|
|
1452
|
+
}
|
|
1453
|
+
buildIntervalFromISO(e) {
|
|
1454
|
+
return F`${this.durationToSeconds(e)}`;
|
|
1455
|
+
}
|
|
1456
|
+
buildTimeDifferenceSeconds(e, t) {
|
|
1457
|
+
return F`DATEDIFF('SECOND', ${t}, ${e})`;
|
|
1458
|
+
}
|
|
1459
|
+
buildDateAddInterval(e, t) {
|
|
1460
|
+
let n = this.parseISODuration(t), r = e;
|
|
1461
|
+
return n.years && (r = F`DATEADD('YEAR', ${n.years}, ${r})`), n.months && (r = F`DATEADD('MONTH', ${n.months}, ${r})`), n.days && (r = F`DATEADD('DAY', ${n.days}, ${r})`), n.hours && (r = F`DATEADD('HOUR', ${n.hours}, ${r})`), n.minutes && (r = F`DATEADD('MINUTE', ${n.minutes}, ${r})`), n.seconds && (r = F`DATEADD('SECOND', ${n.seconds}, ${r})`), r;
|
|
1462
|
+
}
|
|
1463
|
+
buildConditionalAggregation(e, t, n) {
|
|
1464
|
+
let r = e.toUpperCase();
|
|
1465
|
+
return e === "count" && !t ? F`${F.raw(r)}(CASE WHEN ${n} THEN 1 END)` : F`${F.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1466
|
+
}
|
|
1467
|
+
buildDateDiffPeriods(e, t, n) {
|
|
1468
|
+
let r = n.toUpperCase();
|
|
1469
|
+
return F`DATEDIFF('${F.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1470
|
+
}
|
|
1471
|
+
buildPeriodSeriesSubquery(e) {
|
|
1472
|
+
return F`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${e + 1}))) p`;
|
|
1473
|
+
}
|
|
1474
|
+
buildTimeDimension(e, t) {
|
|
1475
|
+
switch (e) {
|
|
1476
|
+
case "year": return F`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;
|
|
1477
|
+
case "quarter": return F`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;
|
|
1478
|
+
case "month": return F`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;
|
|
1479
|
+
case "week": return F`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;
|
|
1480
|
+
case "day": return F`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1481
|
+
case "hour": return F`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;
|
|
1482
|
+
case "minute": return F`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;
|
|
1483
|
+
case "second": return F`DATE_TRUNC('SECOND', ${t}::TIMESTAMP)`;
|
|
1484
|
+
default: return t;
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
buildStringCondition(e, t, n) {
|
|
1488
|
+
switch (t) {
|
|
1489
|
+
case "contains": return F`${e} ILIKE ${`%${n}%`}`;
|
|
1490
|
+
case "notContains": return F`${e} NOT ILIKE ${`%${n}%`}`;
|
|
1491
|
+
case "startsWith": return F`${e} ILIKE ${`${n}%`}`;
|
|
1492
|
+
case "endsWith": return F`${e} ILIKE ${`%${n}`}`;
|
|
1493
|
+
case "like": return F`${e} LIKE ${n}`;
|
|
1494
|
+
case "notLike": return F`${e} NOT LIKE ${n}`;
|
|
1495
|
+
case "ilike": return F`${e} ILIKE ${n}`;
|
|
1496
|
+
case "regex": return F`REGEXP_LIKE(${e}, ${n})`;
|
|
1497
|
+
case "notRegex": return F`NOT REGEXP_LIKE(${e}, ${n})`;
|
|
1498
|
+
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
castToType(e, t) {
|
|
1502
|
+
switch (t) {
|
|
1503
|
+
case "timestamp": return F`${e}::TIMESTAMP`;
|
|
1504
|
+
case "decimal": return F`${e}::DECIMAL`;
|
|
1505
|
+
case "integer": return F`${e}::INTEGER`;
|
|
1506
|
+
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
buildAvg(e) {
|
|
1510
|
+
return F`COALESCE(AVG(${e}), 0)`;
|
|
1511
|
+
}
|
|
1512
|
+
buildCaseWhen(e, t) {
|
|
1513
|
+
let n = e.map((e) => F`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => F`${e} ${t}`);
|
|
1514
|
+
return t === void 0 ? F`CASE ${n} END` : F`CASE ${n} ELSE ${t} END`;
|
|
1515
|
+
}
|
|
1516
|
+
buildBooleanLiteral(e) {
|
|
1517
|
+
return e ? F`TRUE` : F`FALSE`;
|
|
1518
|
+
}
|
|
1519
|
+
convertFilterValue(e) {
|
|
1520
|
+
return e;
|
|
1521
|
+
}
|
|
1522
|
+
prepareDateValue(e) {
|
|
1523
|
+
return e;
|
|
1524
|
+
}
|
|
1525
|
+
isTimestampInteger() {
|
|
1526
|
+
return !1;
|
|
1527
|
+
}
|
|
1528
|
+
convertTimeDimensionResult(e) {
|
|
1529
|
+
return e;
|
|
1530
|
+
}
|
|
1531
|
+
getCapabilities() {
|
|
1532
|
+
return {
|
|
1533
|
+
supportsStddev: !0,
|
|
1534
|
+
supportsVariance: !0,
|
|
1535
|
+
supportsPercentile: !0,
|
|
1536
|
+
supportsWindowFunctions: !0,
|
|
1537
|
+
supportsFrameClause: !0,
|
|
1538
|
+
supportsLateralJoins: !0,
|
|
1539
|
+
supportsPercentileSubqueries: !0,
|
|
1540
|
+
supportsDerivedTablesInCTE: !0,
|
|
1541
|
+
supportsLateralSubqueriesInCTE: !1
|
|
1542
|
+
};
|
|
1543
|
+
}
|
|
1544
|
+
buildStddev(e, t = !1) {
|
|
1545
|
+
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1546
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1547
|
+
}
|
|
1548
|
+
buildVariance(e, t = !1) {
|
|
1549
|
+
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
1550
|
+
return F`COALESCE(${F.raw(n)}(${e}), 0)`;
|
|
1551
|
+
}
|
|
1552
|
+
buildPercentile(e, t) {
|
|
1553
|
+
let n = (t / 100).toString();
|
|
1554
|
+
return F`PERCENTILE_CONT(${F.raw(n)}) WITHIN GROUP (ORDER BY ${e})`;
|
|
1555
|
+
}
|
|
1556
|
+
buildWindowFunction(e, t, n, r, i) {
|
|
1557
|
+
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``;
|
|
1558
|
+
if (i?.frame) {
|
|
1559
|
+
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";
|
|
1560
|
+
s = F`${F.raw(r)} BETWEEN ${F.raw(a)} AND ${F.raw(o)}`;
|
|
1561
|
+
}
|
|
1562
|
+
let c = [];
|
|
1563
|
+
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1564
|
+
let l = F`OVER (${c.length > 0 ? F.join(c, F` `) : F``})`;
|
|
1565
|
+
switch (e) {
|
|
1566
|
+
case "lag": return F`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1567
|
+
case "lead": return F`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? F`` : F`, ${i.defaultValue}`}) ${l}`;
|
|
1568
|
+
case "rank": return F`RANK() ${l}`;
|
|
1569
|
+
case "denseRank": return F`DENSE_RANK() ${l}`;
|
|
1570
|
+
case "rowNumber": return F`ROW_NUMBER() ${l}`;
|
|
1571
|
+
case "ntile": return F`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1572
|
+
case "firstValue": return F`FIRST_VALUE(${t}) ${l}`;
|
|
1573
|
+
case "lastValue": return F`LAST_VALUE(${t}) ${l}`;
|
|
1574
|
+
case "movingAvg": return F`AVG(${t}) ${l}`;
|
|
1575
|
+
case "movingSum": return F`SUM(${t}) ${l}`;
|
|
1301
1576
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1302
1577
|
}
|
|
1303
1578
|
}
|
|
1304
1579
|
};
|
|
1305
1580
|
//#endregion
|
|
1306
1581
|
//#region src/server/database-utils.ts
|
|
1307
|
-
function
|
|
1582
|
+
function Re(e) {
|
|
1308
1583
|
switch (e) {
|
|
1309
1584
|
case "postgres": return new je();
|
|
1310
1585
|
case "mysql": return new Me();
|
|
1311
1586
|
case "sqlite": return new Ne();
|
|
1312
1587
|
case "singlestore": return new Pe();
|
|
1313
1588
|
case "duckdb": return new Fe();
|
|
1589
|
+
case "databend": return new Ie();
|
|
1590
|
+
case "snowflake": return new Le();
|
|
1314
1591
|
default: throw Error(`Unsupported database engine: ${e}`);
|
|
1315
1592
|
}
|
|
1316
1593
|
}
|
|
@@ -1319,12 +1596,12 @@ function Ie(e) {
|
|
|
1319
1596
|
var W = class {
|
|
1320
1597
|
databaseAdapter;
|
|
1321
1598
|
constructor(e, t, n) {
|
|
1322
|
-
this.db = e, this.schema = t, this.databaseAdapter =
|
|
1599
|
+
this.db = e, this.schema = t, this.databaseAdapter = Re(n || this.getEngineType());
|
|
1323
1600
|
}
|
|
1324
1601
|
};
|
|
1325
1602
|
//#endregion
|
|
1326
1603
|
//#region src/server/explain/postgres-parser.ts
|
|
1327
|
-
function
|
|
1604
|
+
function ze(e, t) {
|
|
1328
1605
|
let n = [], r = [], i = !1, a, o, s, c = [];
|
|
1329
1606
|
for (let t of e) {
|
|
1330
1607
|
let e = t.match(/Planning Time:\s*([\d.]+)\s*ms/i);
|
|
@@ -1337,7 +1614,7 @@ function Le(e, t) {
|
|
|
1337
1614
|
o = parseFloat(l[1]);
|
|
1338
1615
|
continue;
|
|
1339
1616
|
}
|
|
1340
|
-
let u =
|
|
1617
|
+
let u = Be(t);
|
|
1341
1618
|
if (u) {
|
|
1342
1619
|
u.type.includes("Seq Scan") && (i = !0), u.index && r.push(u.index), n.length === 0 && u.estimatedCost !== void 0 && (s = u.estimatedCost);
|
|
1343
1620
|
let e = t.search(/\S/);
|
|
@@ -1367,7 +1644,7 @@ function Le(e, t) {
|
|
|
1367
1644
|
sql: t
|
|
1368
1645
|
};
|
|
1369
1646
|
}
|
|
1370
|
-
function
|
|
1647
|
+
function Be(e) {
|
|
1371
1648
|
let t = e.replace(/^[\s->]+/, "").trim();
|
|
1372
1649
|
if (!t) return null;
|
|
1373
1650
|
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 +1662,7 @@ function Re(e) {
|
|
|
1385
1662
|
}
|
|
1386
1663
|
//#endregion
|
|
1387
1664
|
//#region src/server/executors/postgres-executor.ts
|
|
1388
|
-
var
|
|
1665
|
+
var Ve = class extends W {
|
|
1389
1666
|
async execute(e, t) {
|
|
1390
1667
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1391
1668
|
let n = await e.execute();
|
|
@@ -1427,7 +1704,7 @@ var ze = class extends W {
|
|
|
1427
1704
|
async explainQuery(e, t, n) {
|
|
1428
1705
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1429
1706
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1430
|
-
let i = await this.db.execute(
|
|
1707
|
+
let i = await this.db.execute(F`${F.raw(r)} ${F.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1431
1708
|
let r = t[parseInt(n, 10) - 1];
|
|
1432
1709
|
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
1710
|
}))}`), a = [];
|
|
@@ -1437,7 +1714,7 @@ var ze = class extends W {
|
|
|
1437
1714
|
typeof t == "string" && a.push(t);
|
|
1438
1715
|
}
|
|
1439
1716
|
}
|
|
1440
|
-
return
|
|
1717
|
+
return ze(a, {
|
|
1441
1718
|
sql: e,
|
|
1442
1719
|
params: t
|
|
1443
1720
|
});
|
|
@@ -1446,7 +1723,7 @@ var ze = class extends W {
|
|
|
1446
1723
|
if (!e || e.length === 0) return [];
|
|
1447
1724
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1448
1725
|
try {
|
|
1449
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1726
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(F`
|
|
1450
1727
|
SELECT
|
|
1451
1728
|
t.relname as table_name,
|
|
1452
1729
|
i.relname as index_name,
|
|
@@ -1460,7 +1737,7 @@ var ze = class extends W {
|
|
|
1460
1737
|
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
1461
1738
|
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
1462
1739
|
WHERE n.nspname = 'public'
|
|
1463
|
-
AND t.relname IN (${
|
|
1740
|
+
AND t.relname IN (${F.raw(t)})
|
|
1464
1741
|
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
1465
1742
|
ORDER BY t.relname, i.relname
|
|
1466
1743
|
`);
|
|
@@ -1476,12 +1753,12 @@ var ze = class extends W {
|
|
|
1476
1753
|
}
|
|
1477
1754
|
}
|
|
1478
1755
|
};
|
|
1479
|
-
function
|
|
1480
|
-
return new
|
|
1756
|
+
function He(e, t) {
|
|
1757
|
+
return new Ve(e, t, "postgres");
|
|
1481
1758
|
}
|
|
1482
1759
|
//#endregion
|
|
1483
1760
|
//#region src/server/explain/mysql-parser.ts
|
|
1484
|
-
function
|
|
1761
|
+
function Ue(e, t) {
|
|
1485
1762
|
let n = t?.toLowerCase() || "";
|
|
1486
1763
|
switch (e.toLowerCase()) {
|
|
1487
1764
|
case "all": return "Seq Scan";
|
|
@@ -1495,10 +1772,10 @@ function Ve(e, t) {
|
|
|
1495
1772
|
default: return `MySQL ${e}`;
|
|
1496
1773
|
}
|
|
1497
1774
|
}
|
|
1498
|
-
function
|
|
1775
|
+
function We(e, t) {
|
|
1499
1776
|
let n = [], r = [], i = !1, a = 0;
|
|
1500
1777
|
for (let t of e) {
|
|
1501
|
-
let e =
|
|
1778
|
+
let e = Ue(t.type, t.Extra);
|
|
1502
1779
|
t.type.toLowerCase() === "all" && (i = !0), t.key && r.push(t.key);
|
|
1503
1780
|
let o = {
|
|
1504
1781
|
type: e,
|
|
@@ -1529,7 +1806,7 @@ function He(e, t) {
|
|
|
1529
1806
|
}
|
|
1530
1807
|
//#endregion
|
|
1531
1808
|
//#region src/server/executors/mysql-executor.ts
|
|
1532
|
-
var
|
|
1809
|
+
var Ge = class extends W {
|
|
1533
1810
|
async execute(e, t) {
|
|
1534
1811
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1535
1812
|
let n = await e.execute();
|
|
@@ -1564,7 +1841,7 @@ var Ue = class extends W {
|
|
|
1564
1841
|
});
|
|
1565
1842
|
let a = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1566
1843
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1567
|
-
let o = await this.db.execute(
|
|
1844
|
+
let o = await this.db.execute(F.raw(`${a} ${r}`)), s = [];
|
|
1568
1845
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
1569
1846
|
id: e.id || 1,
|
|
1570
1847
|
select_type: e.select_type || "SIMPLE",
|
|
@@ -1579,7 +1856,7 @@ var Ue = class extends W {
|
|
|
1579
1856
|
filtered: Number(e.filtered) || 100,
|
|
1580
1857
|
Extra: e.Extra || null
|
|
1581
1858
|
});
|
|
1582
|
-
return
|
|
1859
|
+
return We(s, {
|
|
1583
1860
|
sql: e,
|
|
1584
1861
|
params: t
|
|
1585
1862
|
});
|
|
@@ -1588,7 +1865,7 @@ var Ue = class extends W {
|
|
|
1588
1865
|
if (!e || e.length === 0) return [];
|
|
1589
1866
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1590
1867
|
try {
|
|
1591
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1868
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(F`
|
|
1592
1869
|
SELECT
|
|
1593
1870
|
TABLE_NAME as table_name,
|
|
1594
1871
|
INDEX_NAME as index_name,
|
|
@@ -1597,7 +1874,7 @@ var Ue = class extends W {
|
|
|
1597
1874
|
CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
|
|
1598
1875
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
1599
1876
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
1600
|
-
AND LOWER(TABLE_NAME) IN (${
|
|
1877
|
+
AND LOWER(TABLE_NAME) IN (${F.raw(t)})
|
|
1601
1878
|
GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
|
|
1602
1879
|
ORDER BY TABLE_NAME, INDEX_NAME
|
|
1603
1880
|
`);
|
|
@@ -1613,12 +1890,12 @@ var Ue = class extends W {
|
|
|
1613
1890
|
}
|
|
1614
1891
|
}
|
|
1615
1892
|
};
|
|
1616
|
-
function
|
|
1617
|
-
return new
|
|
1893
|
+
function Ke(e, t) {
|
|
1894
|
+
return new Ge(e, t, "mysql");
|
|
1618
1895
|
}
|
|
1619
1896
|
//#endregion
|
|
1620
1897
|
//#region src/server/explain/sqlite-parser.ts
|
|
1621
|
-
function
|
|
1898
|
+
function qe(e) {
|
|
1622
1899
|
let t = e.toLowerCase(), n = e.match(/^SCAN\s+(\S+)/i);
|
|
1623
1900
|
if (n) return {
|
|
1624
1901
|
type: "Seq Scan",
|
|
@@ -1643,10 +1920,10 @@ function Ge(e) {
|
|
|
1643
1920
|
table: a[1]
|
|
1644
1921
|
} : 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
1922
|
}
|
|
1646
|
-
function
|
|
1923
|
+
function Je(e, t) {
|
|
1647
1924
|
let n = [], r = [], i = !1, a = /* @__PURE__ */ new Map();
|
|
1648
1925
|
for (let t of e) {
|
|
1649
|
-
let e =
|
|
1926
|
+
let e = qe(t.detail);
|
|
1650
1927
|
e.type === "Seq Scan" && (i = !0), e.index && r.push(e.index);
|
|
1651
1928
|
let o = {
|
|
1652
1929
|
type: e.type,
|
|
@@ -1677,7 +1954,7 @@ function Ke(e, t) {
|
|
|
1677
1954
|
}
|
|
1678
1955
|
//#endregion
|
|
1679
1956
|
//#region src/server/executors/sqlite-executor.ts
|
|
1680
|
-
var
|
|
1957
|
+
var Ye = class extends W {
|
|
1681
1958
|
async execute(e, t) {
|
|
1682
1959
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1683
1960
|
let n = await e.execute();
|
|
@@ -1717,7 +1994,7 @@ var qe = class extends W {
|
|
|
1717
1994
|
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
1995
|
});
|
|
1719
1996
|
let a = `EXPLAIN QUERY PLAN ${r}`, o;
|
|
1720
|
-
if (this.db.all) o = this.db.all(
|
|
1997
|
+
if (this.db.all) o = this.db.all(F.raw(a));
|
|
1721
1998
|
else throw Error("SQLite database instance must have an all() method for EXPLAIN");
|
|
1722
1999
|
let s = [];
|
|
1723
2000
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
@@ -1726,7 +2003,7 @@ var qe = class extends W {
|
|
|
1726
2003
|
notused: Number(e.notused) || 0,
|
|
1727
2004
|
detail: String(e.detail || "")
|
|
1728
2005
|
});
|
|
1729
|
-
return
|
|
2006
|
+
return Je(s, {
|
|
1730
2007
|
sql: e,
|
|
1731
2008
|
params: t
|
|
1732
2009
|
});
|
|
@@ -1737,9 +2014,9 @@ var qe = class extends W {
|
|
|
1737
2014
|
try {
|
|
1738
2015
|
let t = [];
|
|
1739
2016
|
for (let n of e) {
|
|
1740
|
-
let e = this.db.all(
|
|
2017
|
+
let e = this.db.all(F.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));
|
|
1741
2018
|
if (Array.isArray(e)) for (let r of e) {
|
|
1742
|
-
let e = r.name, i = !!r.unique, a = r.origin, o = this.db.all(
|
|
2019
|
+
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
2020
|
if (Array.isArray(o)) for (let e of o) {
|
|
1744
2021
|
let t = e.name;
|
|
1745
2022
|
typeof t == "string" && s.push(t);
|
|
@@ -1759,29 +2036,29 @@ var qe = class extends W {
|
|
|
1759
2036
|
}
|
|
1760
2037
|
}
|
|
1761
2038
|
};
|
|
1762
|
-
function
|
|
1763
|
-
return new
|
|
2039
|
+
function Xe(e, t) {
|
|
2040
|
+
return new Ye(e, t, "sqlite");
|
|
1764
2041
|
}
|
|
1765
2042
|
//#endregion
|
|
1766
2043
|
//#region src/server/executors/singlestore-executor.ts
|
|
1767
|
-
var
|
|
2044
|
+
var Ze = class extends Ge {
|
|
1768
2045
|
getEngineType() {
|
|
1769
2046
|
return "singlestore";
|
|
1770
2047
|
}
|
|
1771
2048
|
};
|
|
1772
|
-
function
|
|
1773
|
-
return new
|
|
2049
|
+
function Qe(e, t) {
|
|
2050
|
+
return new Ze(e, t);
|
|
1774
2051
|
}
|
|
1775
2052
|
//#endregion
|
|
1776
2053
|
//#region src/server/explain/duckdb-parser.ts
|
|
1777
|
-
function
|
|
2054
|
+
function $e(e, t) {
|
|
1778
2055
|
let n = [], r = [], i = !1, a, o = [];
|
|
1779
2056
|
for (let t of e) {
|
|
1780
2057
|
if (/^[┌├└│─┐┤┘]+$/.test(t.trim()) || /EXPLANATION|QUERY PLAN/i.test(t)) continue;
|
|
1781
|
-
let e =
|
|
2058
|
+
let e = tt(t);
|
|
1782
2059
|
if (e) {
|
|
1783
2060
|
(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 =
|
|
2061
|
+
let s = et(t);
|
|
1785
2062
|
for (; o.length > 0 && o[o.length - 1].indent >= s;) o.pop();
|
|
1786
2063
|
if (o.length === 0) n.push(e);
|
|
1787
2064
|
else {
|
|
@@ -1808,13 +2085,13 @@ function Ze(e, t) {
|
|
|
1808
2085
|
sql: t
|
|
1809
2086
|
};
|
|
1810
2087
|
}
|
|
1811
|
-
function
|
|
2088
|
+
function et(e) {
|
|
1812
2089
|
let t = 0;
|
|
1813
2090
|
for (let n of e) if (n === " " || n === "│" || n === "├" || n === "└" || n === "─") t++;
|
|
1814
2091
|
else break;
|
|
1815
2092
|
return t;
|
|
1816
2093
|
}
|
|
1817
|
-
function
|
|
2094
|
+
function tt(e) {
|
|
1818
2095
|
let t = e.replace(/[┌├└│─┐┤┘]/g, "").replace(/^\s*/, "").trim();
|
|
1819
2096
|
if (!t || t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i)) return null;
|
|
1820
2097
|
let n = t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);
|
|
@@ -1840,7 +2117,7 @@ function $e(e) {
|
|
|
1840
2117
|
}
|
|
1841
2118
|
//#endregion
|
|
1842
2119
|
//#region src/server/executors/duckdb-executor.ts
|
|
1843
|
-
var
|
|
2120
|
+
var nt = class extends W {
|
|
1844
2121
|
async execute(e, t) {
|
|
1845
2122
|
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
1846
2123
|
let n = await e.execute();
|
|
@@ -1924,7 +2201,7 @@ var et = class extends W {
|
|
|
1924
2201
|
async explainQuery(e, t, n) {
|
|
1925
2202
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1926
2203
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1927
|
-
let i = await this.db.execute(
|
|
2204
|
+
let i = await this.db.execute(F`${F.raw(r)} ${F.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1928
2205
|
let r = t[parseInt(n, 10) - 1];
|
|
1929
2206
|
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
2207
|
}))}`), a = [];
|
|
@@ -1934,7 +2211,7 @@ var et = class extends W {
|
|
|
1934
2211
|
typeof t == "string" && a.push(t);
|
|
1935
2212
|
}
|
|
1936
2213
|
}
|
|
1937
|
-
return
|
|
2214
|
+
return $e(a, {
|
|
1938
2215
|
sql: e,
|
|
1939
2216
|
params: t
|
|
1940
2217
|
});
|
|
@@ -1943,7 +2220,7 @@ var et = class extends W {
|
|
|
1943
2220
|
if (!e || e.length === 0) return [];
|
|
1944
2221
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1945
2222
|
try {
|
|
1946
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
2223
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(F`
|
|
1947
2224
|
SELECT
|
|
1948
2225
|
table_name,
|
|
1949
2226
|
index_name,
|
|
@@ -1951,7 +2228,7 @@ var et = class extends W {
|
|
|
1951
2228
|
is_unique,
|
|
1952
2229
|
is_primary
|
|
1953
2230
|
FROM duckdb_indexes()
|
|
1954
|
-
WHERE LOWER(table_name) IN (${
|
|
2231
|
+
WHERE LOWER(table_name) IN (${F.raw(t)})
|
|
1955
2232
|
GROUP BY table_name, index_name, is_unique, is_primary
|
|
1956
2233
|
ORDER BY table_name, index_name
|
|
1957
2234
|
`);
|
|
@@ -1967,21 +2244,346 @@ var et = class extends W {
|
|
|
1967
2244
|
}
|
|
1968
2245
|
}
|
|
1969
2246
|
};
|
|
1970
|
-
function
|
|
1971
|
-
return new
|
|
2247
|
+
function rt(e, t) {
|
|
2248
|
+
return new nt(e, t, "duckdb");
|
|
2249
|
+
}
|
|
2250
|
+
//#endregion
|
|
2251
|
+
//#region src/server/explain/databend-parser.ts
|
|
2252
|
+
function it(e, t) {
|
|
2253
|
+
let n = [], r = [], i = !1, a, o = [];
|
|
2254
|
+
for (let t of e) {
|
|
2255
|
+
if (!t.trim()) continue;
|
|
2256
|
+
let e = ot(t);
|
|
2257
|
+
if (e) {
|
|
2258
|
+
(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);
|
|
2259
|
+
let s = at(t);
|
|
2260
|
+
for (; o.length > 0 && o[o.length - 1].indent >= s;) o.pop();
|
|
2261
|
+
if (o.length === 0) n.push(e);
|
|
2262
|
+
else {
|
|
2263
|
+
let t = o[o.length - 1].op;
|
|
2264
|
+
t.children ||= [], t.children.push(e);
|
|
2265
|
+
}
|
|
2266
|
+
o.push({
|
|
2267
|
+
indent: s,
|
|
2268
|
+
op: e
|
|
2269
|
+
});
|
|
2270
|
+
}
|
|
2271
|
+
}
|
|
2272
|
+
return {
|
|
2273
|
+
operations: n,
|
|
2274
|
+
summary: {
|
|
2275
|
+
database: "databend",
|
|
2276
|
+
planningTime: void 0,
|
|
2277
|
+
executionTime: void 0,
|
|
2278
|
+
totalCost: a,
|
|
2279
|
+
hasSequentialScans: i,
|
|
2280
|
+
usedIndexes: [...new Set(r)]
|
|
2281
|
+
},
|
|
2282
|
+
raw: e.join("\n"),
|
|
2283
|
+
sql: t
|
|
2284
|
+
};
|
|
2285
|
+
}
|
|
2286
|
+
function at(e) {
|
|
2287
|
+
let t = 0;
|
|
2288
|
+
for (let n of e) if (n === " " || n === "│" || n === "├" || n === "└" || n === "─") t++;
|
|
2289
|
+
else break;
|
|
2290
|
+
return t;
|
|
2291
|
+
}
|
|
2292
|
+
function ot(e) {
|
|
2293
|
+
let t = e.replace(/[┌├└│─┐┤┘]/g, "").replace(/^\s*/, "").trim();
|
|
2294
|
+
if (!t || /^(filters|table|estimated rows|output columns|push downs):/.test(t)) return null;
|
|
2295
|
+
let n = t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);
|
|
2296
|
+
if (!n) return null;
|
|
2297
|
+
let r = n[1], i = n[2] || void 0, a = t.match(/estimated rows:\s*(\d+)/i);
|
|
2298
|
+
return {
|
|
2299
|
+
type: r,
|
|
2300
|
+
table: i,
|
|
2301
|
+
estimatedRows: a ? parseInt(a[1], 10) : void 0
|
|
2302
|
+
};
|
|
2303
|
+
}
|
|
2304
|
+
//#endregion
|
|
2305
|
+
//#region src/server/executors/databend-executor.ts
|
|
2306
|
+
var st = class extends W {
|
|
2307
|
+
async execute(e, t) {
|
|
2308
|
+
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
2309
|
+
let n = await e.execute();
|
|
2310
|
+
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
2311
|
+
} catch (t) {
|
|
2312
|
+
let n = this.extractSqlFromQuery(e);
|
|
2313
|
+
throw console.error("[Databend] Query execution failed:", {
|
|
2314
|
+
error: t instanceof Error ? t.message : String(t),
|
|
2315
|
+
sql: n.sql,
|
|
2316
|
+
params: n.params
|
|
2317
|
+
}), t;
|
|
2318
|
+
}
|
|
2319
|
+
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
2320
|
+
try {
|
|
2321
|
+
let n = await this.db.execute(e);
|
|
2322
|
+
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
2323
|
+
} catch (t) {
|
|
2324
|
+
let n = this.extractSqlFromQuery(e);
|
|
2325
|
+
throw console.error("[Databend] Query execution failed:", {
|
|
2326
|
+
error: t instanceof Error ? t.message : String(t),
|
|
2327
|
+
sql: n.sql,
|
|
2328
|
+
params: n.params
|
|
2329
|
+
}), t;
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
extractSqlFromQuery(e) {
|
|
2333
|
+
try {
|
|
2334
|
+
if (e && typeof e.toSQL == "function") {
|
|
2335
|
+
let { sql: t, params: n } = e.toSQL();
|
|
2336
|
+
return {
|
|
2337
|
+
sql: t,
|
|
2338
|
+
params: n
|
|
2339
|
+
};
|
|
2340
|
+
}
|
|
2341
|
+
if (e && typeof e.getSQL == "function") {
|
|
2342
|
+
let t = e.getSQL();
|
|
2343
|
+
if (t && typeof t.toSQL == "function") {
|
|
2344
|
+
let { sql: e, params: n } = t.toSQL();
|
|
2345
|
+
return {
|
|
2346
|
+
sql: e,
|
|
2347
|
+
params: n
|
|
2348
|
+
};
|
|
2349
|
+
}
|
|
2350
|
+
}
|
|
2351
|
+
return {
|
|
2352
|
+
sql: String(e),
|
|
2353
|
+
params: []
|
|
2354
|
+
};
|
|
2355
|
+
} catch {
|
|
2356
|
+
return {
|
|
2357
|
+
sql: "[unable to extract SQL]",
|
|
2358
|
+
params: []
|
|
2359
|
+
};
|
|
2360
|
+
}
|
|
2361
|
+
}
|
|
2362
|
+
convertNumericFields(e, t) {
|
|
2363
|
+
if (!e || typeof e != "object") return e;
|
|
2364
|
+
let n = {};
|
|
2365
|
+
for (let [r, i] of Object.entries(e)) t && t.includes(r) ? n[r] = this.coerceToNumber(i) : n[r] = i;
|
|
2366
|
+
return n;
|
|
2367
|
+
}
|
|
2368
|
+
coerceToNumber(e) {
|
|
2369
|
+
if (e == null || typeof e == "number") return e;
|
|
2370
|
+
if (typeof e == "bigint") return Number(e);
|
|
2371
|
+
if (e && typeof e == "object") {
|
|
2372
|
+
if (typeof e.toString == "function") {
|
|
2373
|
+
let t = e.toString();
|
|
2374
|
+
if (/^-?\d+(\.\d+)?$/.test(t)) return t.includes(".") ? parseFloat(t) : parseInt(t, 10);
|
|
2375
|
+
}
|
|
2376
|
+
return e;
|
|
2377
|
+
}
|
|
2378
|
+
if (typeof e == "string") {
|
|
2379
|
+
if (/^-?\d+(\.\d+)?$/.test(e)) return e.includes(".") ? parseFloat(e) : parseInt(e, 10);
|
|
2380
|
+
if (!isNaN(parseFloat(e)) && isFinite(parseFloat(e))) return parseFloat(e);
|
|
2381
|
+
}
|
|
2382
|
+
return e;
|
|
2383
|
+
}
|
|
2384
|
+
getEngineType() {
|
|
2385
|
+
return "databend";
|
|
2386
|
+
}
|
|
2387
|
+
async explainQuery(e, t, n) {
|
|
2388
|
+
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
2389
|
+
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
2390
|
+
let i = await this.db.execute(F`${F.raw(r)} ${F.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
2391
|
+
let r = t[parseInt(n, 10) - 1];
|
|
2392
|
+
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
2393
|
+
}))}`), a = [];
|
|
2394
|
+
if (Array.isArray(i)) {
|
|
2395
|
+
for (let e of i) if (e && typeof e == "object") {
|
|
2396
|
+
let t = e.explain || e["QUERY PLAN"] || e.query_plan || e.Plan || Object.values(e)[0];
|
|
2397
|
+
typeof t == "string" && a.push(t);
|
|
2398
|
+
}
|
|
2399
|
+
}
|
|
2400
|
+
return it(a, {
|
|
2401
|
+
sql: e,
|
|
2402
|
+
params: t
|
|
2403
|
+
});
|
|
2404
|
+
}
|
|
2405
|
+
async getTableIndexes(e) {
|
|
2406
|
+
return !e || e.length, [];
|
|
2407
|
+
}
|
|
2408
|
+
};
|
|
2409
|
+
function ct(e, t) {
|
|
2410
|
+
return new st(e, t, "databend");
|
|
2411
|
+
}
|
|
2412
|
+
//#endregion
|
|
2413
|
+
//#region src/server/explain/snowflake-parser.ts
|
|
2414
|
+
function lt(e, t) {
|
|
2415
|
+
let n = [], r = [], i = !1, a, o = [];
|
|
2416
|
+
for (let t of e) {
|
|
2417
|
+
if (!t.trim()) continue;
|
|
2418
|
+
let e = dt(t);
|
|
2419
|
+
if (e) {
|
|
2420
|
+
(e.type.includes("TableScan") || e.type.includes("SCAN")) && (i = !0), n.length === 0 && e.estimatedCost !== void 0 && (a = e.estimatedCost);
|
|
2421
|
+
let r = ut(t);
|
|
2422
|
+
for (; o.length > 0 && o[o.length - 1].indent >= r;) o.pop();
|
|
2423
|
+
if (o.length === 0) n.push(e);
|
|
2424
|
+
else {
|
|
2425
|
+
let t = o[o.length - 1].op;
|
|
2426
|
+
t.children ||= [], t.children.push(e);
|
|
2427
|
+
}
|
|
2428
|
+
o.push({
|
|
2429
|
+
indent: r,
|
|
2430
|
+
op: e
|
|
2431
|
+
});
|
|
2432
|
+
}
|
|
2433
|
+
}
|
|
2434
|
+
return {
|
|
2435
|
+
operations: n,
|
|
2436
|
+
summary: {
|
|
2437
|
+
database: "snowflake",
|
|
2438
|
+
planningTime: void 0,
|
|
2439
|
+
executionTime: void 0,
|
|
2440
|
+
totalCost: a,
|
|
2441
|
+
hasSequentialScans: i,
|
|
2442
|
+
usedIndexes: [...new Set(r)]
|
|
2443
|
+
},
|
|
2444
|
+
raw: e.join("\n"),
|
|
2445
|
+
sql: t
|
|
2446
|
+
};
|
|
2447
|
+
}
|
|
2448
|
+
function ut(e) {
|
|
2449
|
+
let t = 0;
|
|
2450
|
+
for (let n of e) if (n === " " || n === "-" || n === ">") t++;
|
|
2451
|
+
else break;
|
|
2452
|
+
return t;
|
|
2453
|
+
}
|
|
2454
|
+
function dt(e) {
|
|
2455
|
+
let t = e.replace(/^[\s\d:]*->/, "").trim();
|
|
2456
|
+
if (!t || /^(GlobalStats|partitions|bytes):/i.test(t) || /^\w+=\d+/.test(t)) return null;
|
|
2457
|
+
let n = t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);
|
|
2458
|
+
if (!n) return null;
|
|
2459
|
+
let r = n[1], i = n[2] || void 0, a = t.match(/estimated rows:\s*(\d+)/i);
|
|
2460
|
+
return {
|
|
2461
|
+
type: r,
|
|
2462
|
+
table: i,
|
|
2463
|
+
estimatedRows: a ? parseInt(a[1], 10) : void 0
|
|
2464
|
+
};
|
|
2465
|
+
}
|
|
2466
|
+
//#endregion
|
|
2467
|
+
//#region src/server/executors/snowflake-executor.ts
|
|
2468
|
+
var ft = class extends W {
|
|
2469
|
+
async execute(e, t) {
|
|
2470
|
+
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
2471
|
+
let n = await e.execute();
|
|
2472
|
+
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
2473
|
+
} catch (t) {
|
|
2474
|
+
let n = this.extractSqlFromQuery(e);
|
|
2475
|
+
throw console.error("[Snowflake] Query execution failed:", {
|
|
2476
|
+
error: t instanceof Error ? t.message : String(t),
|
|
2477
|
+
sql: n.sql,
|
|
2478
|
+
params: n.params
|
|
2479
|
+
}), t;
|
|
2480
|
+
}
|
|
2481
|
+
if (!this.db.execute) throw Error("Snowflake database instance must have an execute method");
|
|
2482
|
+
try {
|
|
2483
|
+
let n = await this.db.execute(e);
|
|
2484
|
+
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
2485
|
+
} catch (t) {
|
|
2486
|
+
let n = this.extractSqlFromQuery(e);
|
|
2487
|
+
throw console.error("[Snowflake] Query execution failed:", {
|
|
2488
|
+
error: t instanceof Error ? t.message : String(t),
|
|
2489
|
+
sql: n.sql,
|
|
2490
|
+
params: n.params
|
|
2491
|
+
}), t;
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
extractSqlFromQuery(e) {
|
|
2495
|
+
try {
|
|
2496
|
+
if (e && typeof e.toSQL == "function") {
|
|
2497
|
+
let { sql: t, params: n } = e.toSQL();
|
|
2498
|
+
return {
|
|
2499
|
+
sql: t,
|
|
2500
|
+
params: n
|
|
2501
|
+
};
|
|
2502
|
+
}
|
|
2503
|
+
if (e && typeof e.getSQL == "function") {
|
|
2504
|
+
let t = e.getSQL();
|
|
2505
|
+
if (t && typeof t.toSQL == "function") {
|
|
2506
|
+
let { sql: e, params: n } = t.toSQL();
|
|
2507
|
+
return {
|
|
2508
|
+
sql: e,
|
|
2509
|
+
params: n
|
|
2510
|
+
};
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
return {
|
|
2514
|
+
sql: String(e),
|
|
2515
|
+
params: []
|
|
2516
|
+
};
|
|
2517
|
+
} catch {
|
|
2518
|
+
return {
|
|
2519
|
+
sql: "[unable to extract SQL]",
|
|
2520
|
+
params: []
|
|
2521
|
+
};
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
convertNumericFields(e, t) {
|
|
2525
|
+
if (!e || typeof e != "object") return e;
|
|
2526
|
+
let n = {};
|
|
2527
|
+
for (let [r, i] of Object.entries(e)) t && t.includes(r) ? n[r] = this.coerceToNumber(i) : n[r] = i;
|
|
2528
|
+
return n;
|
|
2529
|
+
}
|
|
2530
|
+
coerceToNumber(e) {
|
|
2531
|
+
if (e == null || typeof e == "number") return e;
|
|
2532
|
+
if (typeof e == "bigint") return Number(e);
|
|
2533
|
+
if (e && typeof e == "object") {
|
|
2534
|
+
if (typeof e.toString == "function") {
|
|
2535
|
+
let t = e.toString();
|
|
2536
|
+
if (/^-?\d+(\.\d+)?$/.test(t)) return t.includes(".") ? parseFloat(t) : parseInt(t, 10);
|
|
2537
|
+
}
|
|
2538
|
+
return e;
|
|
2539
|
+
}
|
|
2540
|
+
if (typeof e == "string") {
|
|
2541
|
+
if (/^-?\d+(\.\d+)?$/.test(e)) return e.includes(".") ? parseFloat(e) : parseInt(e, 10);
|
|
2542
|
+
if (!isNaN(parseFloat(e)) && isFinite(parseFloat(e))) return parseFloat(e);
|
|
2543
|
+
}
|
|
2544
|
+
return e;
|
|
2545
|
+
}
|
|
2546
|
+
getEngineType() {
|
|
2547
|
+
return "snowflake";
|
|
2548
|
+
}
|
|
2549
|
+
async explainQuery(e, t, n) {
|
|
2550
|
+
if (n?.analyze, !this.db.execute) throw Error("Snowflake database instance must have an execute method");
|
|
2551
|
+
let r = await this.db.execute(F`${F.raw("EXPLAIN")} ${F.raw(e.replace(/\?/g, () => {
|
|
2552
|
+
let e = t.shift();
|
|
2553
|
+
return e === null ? "NULL" : typeof e == "number" ? String(e) : typeof e == "boolean" ? e ? "TRUE" : "FALSE" : e instanceof Date ? `'${e.toISOString()}'` : `'${String(e).replace(/'/g, "''")}'`;
|
|
2554
|
+
}))}`), i = [];
|
|
2555
|
+
if (Array.isArray(r)) {
|
|
2556
|
+
for (let e of r) if (e && typeof e == "object") {
|
|
2557
|
+
let t = e.content || e["QUERY PLAN"] || e.plan || Object.values(e)[0];
|
|
2558
|
+
typeof t == "string" && i.push(t);
|
|
2559
|
+
}
|
|
2560
|
+
}
|
|
2561
|
+
return lt(i, {
|
|
2562
|
+
sql: e,
|
|
2563
|
+
params: t
|
|
2564
|
+
});
|
|
2565
|
+
}
|
|
2566
|
+
async getTableIndexes(e) {
|
|
2567
|
+
return [];
|
|
2568
|
+
}
|
|
2569
|
+
};
|
|
2570
|
+
function pt(e, t) {
|
|
2571
|
+
return new ft(e, t, "snowflake");
|
|
1972
2572
|
}
|
|
1973
2573
|
//#endregion
|
|
1974
2574
|
//#region src/server/executors/index.ts
|
|
1975
|
-
function
|
|
2575
|
+
function mt(e, t, n) {
|
|
1976
2576
|
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
|
-
|
|
2577
|
+
case "postgres": return He(e, t);
|
|
2578
|
+
case "mysql": return Ke(e, t);
|
|
2579
|
+
case "sqlite": return Xe(e, t);
|
|
2580
|
+
case "singlestore": return Qe(e, t);
|
|
2581
|
+
case "duckdb": return rt(e, t);
|
|
2582
|
+
case "databend": return ct(e, t);
|
|
2583
|
+
case "snowflake": return pt(e, t);
|
|
2584
|
+
}
|
|
2585
|
+
if (e.all && e.run) return Xe(e, t);
|
|
2586
|
+
if (e.execute) return He(e, t);
|
|
1985
2587
|
throw Error("Unable to determine database engine type. Please specify engineType parameter.");
|
|
1986
2588
|
}
|
|
1987
2589
|
//#endregion
|
|
@@ -1989,7 +2591,7 @@ function nt(e, t, n) {
|
|
|
1989
2591
|
function G(e, t) {
|
|
1990
2592
|
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
2593
|
}
|
|
1992
|
-
function
|
|
2594
|
+
function ht(e) {
|
|
1993
2595
|
switch (e) {
|
|
1994
2596
|
case "belongsTo": return "hasMany";
|
|
1995
2597
|
case "hasMany": return "belongsTo";
|
|
@@ -1998,7 +2600,7 @@ function rt(e) {
|
|
|
1998
2600
|
default: return e;
|
|
1999
2601
|
}
|
|
2000
2602
|
}
|
|
2001
|
-
function
|
|
2603
|
+
function gt(e, t) {
|
|
2002
2604
|
if (t) return t;
|
|
2003
2605
|
switch (e) {
|
|
2004
2606
|
case "belongsTo": return "inner";
|
|
@@ -2008,22 +2610,26 @@ function it(e, t) {
|
|
|
2008
2610
|
default: return "left";
|
|
2009
2611
|
}
|
|
2010
2612
|
}
|
|
2011
|
-
function
|
|
2012
|
-
return e && typeof e == "object" ?
|
|
2613
|
+
function _t(e) {
|
|
2614
|
+
return e && typeof e == "object" ? F`${F`${e}`}` : e;
|
|
2615
|
+
}
|
|
2616
|
+
function vt(e) {
|
|
2617
|
+
if (e === "__proto__" || e === "constructor" || e === "prototype") throw Error(`Unsafe property key: ${e}`);
|
|
2618
|
+
return e;
|
|
2013
2619
|
}
|
|
2014
2620
|
function K(e, t) {
|
|
2015
|
-
return
|
|
2621
|
+
return _t(typeof e == "function" ? e(t) : e);
|
|
2016
2622
|
}
|
|
2017
|
-
function
|
|
2623
|
+
function yt(e, t) {
|
|
2018
2624
|
if (e.relationship !== "belongsToMany" || !e.through) throw Error("expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration");
|
|
2019
2625
|
let { table: n, sourceKey: r, targetKey: i, securitySql: a } = e.through, o = [];
|
|
2020
2626
|
for (let e of r) {
|
|
2021
|
-
let t = e.as ||
|
|
2627
|
+
let t = e.as || L;
|
|
2022
2628
|
o.push(t(e.source, e.target));
|
|
2023
2629
|
}
|
|
2024
2630
|
let s = [];
|
|
2025
2631
|
for (let e of i) {
|
|
2026
|
-
let t = e.as ||
|
|
2632
|
+
let t = e.as || L;
|
|
2027
2633
|
s.push(t(e.source, e.target));
|
|
2028
2634
|
}
|
|
2029
2635
|
let c;
|
|
@@ -2031,29 +2637,29 @@ function ot(e, t) {
|
|
|
2031
2637
|
let e = a(t);
|
|
2032
2638
|
c = Array.isArray(e) ? e : [e];
|
|
2033
2639
|
}
|
|
2034
|
-
let l =
|
|
2640
|
+
let l = gt("belongsToMany", e.sqlJoinType);
|
|
2035
2641
|
return {
|
|
2036
2642
|
junctionJoins: [{
|
|
2037
2643
|
joinType: l,
|
|
2038
2644
|
table: n,
|
|
2039
|
-
condition:
|
|
2645
|
+
condition: R(...o)
|
|
2040
2646
|
}, {
|
|
2041
2647
|
joinType: l,
|
|
2042
2648
|
table: n,
|
|
2043
|
-
condition:
|
|
2649
|
+
condition: R(...s)
|
|
2044
2650
|
}],
|
|
2045
2651
|
junctionSecurityConditions: c
|
|
2046
2652
|
};
|
|
2047
2653
|
}
|
|
2048
2654
|
//#endregion
|
|
2049
2655
|
//#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(
|
|
2656
|
+
function bt(e) {
|
|
2657
|
+
if ("and" in e) return `and:[${e.and.map(bt).sort().join(",")}]`;
|
|
2658
|
+
if ("or" in e) return `or:[${e.or.map(bt).sort().join(",")}]`;
|
|
2053
2659
|
let t = e, n = JSON.stringify(Array.isArray(t.values) ? [...t.values].sort() : t.values), r = t.dateRange ? `:dr:${JSON.stringify(t.dateRange)}` : "";
|
|
2054
2660
|
return `${t.member}:${t.operator}:${n}${r}`;
|
|
2055
2661
|
}
|
|
2056
|
-
function
|
|
2662
|
+
function xt(e, t) {
|
|
2057
2663
|
return `timeDim:${e}:${JSON.stringify(t)}`;
|
|
2058
2664
|
}
|
|
2059
2665
|
var q = class {
|
|
@@ -2094,37 +2700,37 @@ var q = class {
|
|
|
2094
2700
|
};
|
|
2095
2701
|
}
|
|
2096
2702
|
};
|
|
2097
|
-
function
|
|
2703
|
+
function St(e) {
|
|
2098
2704
|
let t = [];
|
|
2099
|
-
for (let n of e) "and" in n && n.and ? t.push(...
|
|
2705
|
+
for (let n of e) "and" in n && n.and ? t.push(...St(n.and)) : "or" in n && n.or ? t.push(...St(n.or)) : "member" in n && t.push(n);
|
|
2100
2706
|
return t;
|
|
2101
2707
|
}
|
|
2102
2708
|
//#endregion
|
|
2103
2709
|
//#region src/server/cache-utils.ts
|
|
2104
|
-
function
|
|
2105
|
-
let r = n.keyPrefix ?? "drizzle-cube:", i =
|
|
2710
|
+
function Ct(e, t, n = {}) {
|
|
2711
|
+
let r = n.keyPrefix ?? "drizzle-cube:", i = wt(e), a = `${r}query:${At(JSON.stringify(i))}`;
|
|
2106
2712
|
if (n.includeSecurityContext !== !1) {
|
|
2107
|
-
let e =
|
|
2713
|
+
let e = At(n.securityContextSerializer ? n.securityContextSerializer(t) : JSON.stringify(kt(t)));
|
|
2108
2714
|
a += `:ctx:${e}`;
|
|
2109
2715
|
}
|
|
2110
2716
|
return a;
|
|
2111
2717
|
}
|
|
2112
|
-
function
|
|
2718
|
+
function wt(e) {
|
|
2113
2719
|
return {
|
|
2114
2720
|
measures: e.measures ? [...e.measures].sort() : void 0,
|
|
2115
2721
|
dimensions: e.dimensions ? [...e.dimensions].sort() : void 0,
|
|
2116
2722
|
filters: e.filters ? J(e.filters) : void 0,
|
|
2117
|
-
timeDimensions: e.timeDimensions ?
|
|
2723
|
+
timeDimensions: e.timeDimensions ? Ot(e.timeDimensions) : void 0,
|
|
2118
2724
|
limit: e.limit,
|
|
2119
2725
|
offset: e.offset,
|
|
2120
|
-
order: e.order ?
|
|
2726
|
+
order: e.order ? kt(e.order) : void 0,
|
|
2121
2727
|
fillMissingDatesValue: e.fillMissingDatesValue,
|
|
2122
|
-
funnel: e.funnel ?
|
|
2123
|
-
flow: e.flow ?
|
|
2124
|
-
retention: e.retention ?
|
|
2728
|
+
funnel: e.funnel ? Tt(e.funnel) : void 0,
|
|
2729
|
+
flow: e.flow ? Et(e.flow) : void 0,
|
|
2730
|
+
retention: e.retention ? Dt(e.retention) : void 0
|
|
2125
2731
|
};
|
|
2126
2732
|
}
|
|
2127
|
-
function
|
|
2733
|
+
function Tt(e) {
|
|
2128
2734
|
return {
|
|
2129
2735
|
bindingKey: e.bindingKey,
|
|
2130
2736
|
timeDimension: e.timeDimension,
|
|
@@ -2140,7 +2746,7 @@ function ft(e) {
|
|
|
2140
2746
|
globalTimeWindow: e.globalTimeWindow
|
|
2141
2747
|
};
|
|
2142
2748
|
}
|
|
2143
|
-
function
|
|
2749
|
+
function Et(e) {
|
|
2144
2750
|
return {
|
|
2145
2751
|
bindingKey: e.bindingKey,
|
|
2146
2752
|
timeDimension: e.timeDimension,
|
|
@@ -2156,7 +2762,7 @@ function pt(e) {
|
|
|
2156
2762
|
joinStrategy: e.joinStrategy
|
|
2157
2763
|
};
|
|
2158
2764
|
}
|
|
2159
|
-
function
|
|
2765
|
+
function Dt(e) {
|
|
2160
2766
|
return {
|
|
2161
2767
|
timeDimension: e.timeDimension,
|
|
2162
2768
|
bindingKey: e.bindingKey,
|
|
@@ -2180,7 +2786,7 @@ function J(e) {
|
|
|
2180
2786
|
};
|
|
2181
2787
|
}).sort((e, t) => JSON.stringify(e).localeCompare(JSON.stringify(t)));
|
|
2182
2788
|
}
|
|
2183
|
-
function
|
|
2789
|
+
function Ot(e) {
|
|
2184
2790
|
return [...e].map((e) => ({
|
|
2185
2791
|
dimension: e.dimension,
|
|
2186
2792
|
granularity: e.granularity,
|
|
@@ -2192,23 +2798,23 @@ function ht(e) {
|
|
|
2192
2798
|
}) : void 0
|
|
2193
2799
|
})).sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
2194
2800
|
}
|
|
2195
|
-
function
|
|
2196
|
-
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(
|
|
2801
|
+
function kt(e) {
|
|
2802
|
+
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(kt) : Object.keys(e).sort().reduce((t, n) => (t[n] = kt(e[n]), t), {});
|
|
2197
2803
|
}
|
|
2198
|
-
function
|
|
2199
|
-
let t = 2166136261;
|
|
2200
|
-
for (let
|
|
2804
|
+
function At(e) {
|
|
2805
|
+
let t = 2166136261, n = Math.min(e.length, 65536);
|
|
2806
|
+
for (let r = 0; r < n; r++) t ^= e.charCodeAt(r), t = t * 16777619 >>> 0;
|
|
2201
2807
|
return t.toString(16).padStart(8, "0");
|
|
2202
2808
|
}
|
|
2203
2809
|
//#endregion
|
|
2204
2810
|
//#region src/server/builders/date-time-builder.ts
|
|
2205
|
-
var
|
|
2811
|
+
var Y = class {
|
|
2206
2812
|
constructor(e) {
|
|
2207
2813
|
this.databaseAdapter = e;
|
|
2208
2814
|
}
|
|
2209
2815
|
buildTimeDimensionExpression(e, t, n) {
|
|
2210
2816
|
let r = K(e, n);
|
|
2211
|
-
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof
|
|
2817
|
+
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof N ? r : F`${r}`;
|
|
2212
2818
|
}
|
|
2213
2819
|
buildDateRangeCondition(e, t) {
|
|
2214
2820
|
if (!t) return null;
|
|
@@ -2219,13 +2825,13 @@ var X = class {
|
|
|
2219
2825
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2220
2826
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2221
2827
|
}
|
|
2222
|
-
return
|
|
2828
|
+
return R(z(e, n), B(e, r));
|
|
2223
2829
|
}
|
|
2224
2830
|
if (typeof t == "string") {
|
|
2225
2831
|
let n = this.parseRelativeDateRange(t);
|
|
2226
2832
|
if (n) {
|
|
2227
2833
|
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()),
|
|
2834
|
+
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
2835
|
}
|
|
2230
2836
|
let r = this.normalizeDate(t);
|
|
2231
2837
|
if (!r) return null;
|
|
@@ -2234,7 +2840,7 @@ var X = class {
|
|
|
2234
2840
|
let o = new Date(i);
|
|
2235
2841
|
o.setUTCHours(23, 59, 59, 999);
|
|
2236
2842
|
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()),
|
|
2843
|
+
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
2844
|
}
|
|
2239
2845
|
return null;
|
|
2240
2846
|
}
|
|
@@ -2369,7 +2975,7 @@ var X = class {
|
|
|
2369
2975
|
let t = new Date(e);
|
|
2370
2976
|
return isNaN(t.getTime()) ? null : this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2371
2977
|
}
|
|
2372
|
-
},
|
|
2978
|
+
}, jt = class {
|
|
2373
2979
|
constructor(e, t) {
|
|
2374
2980
|
this.databaseAdapter = e, this.dateTimeBuilder = t;
|
|
2375
2981
|
}
|
|
@@ -2384,18 +2990,18 @@ var X = class {
|
|
|
2384
2990
|
if (a.length === 0 && !["set", "notSet"].includes(t)) return t === "equals" ? this.databaseAdapter.buildBooleanLiteral(!1) : null;
|
|
2385
2991
|
let o = a[0];
|
|
2386
2992
|
switch (t) {
|
|
2387
|
-
case "equals": return a.length > 1 ? r?.type === "time" ?
|
|
2388
|
-
case "notEquals": return a.length > 1 ?
|
|
2993
|
+
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);
|
|
2994
|
+
case "notEquals": return a.length > 1 ? be(e, a) : a.length === 1 ? he(e, o) : null;
|
|
2389
2995
|
case "contains": return this.databaseAdapter.buildStringCondition(e, "contains", o);
|
|
2390
2996
|
case "notContains": return this.databaseAdapter.buildStringCondition(e, "notContains", o);
|
|
2391
2997
|
case "startsWith": return this.databaseAdapter.buildStringCondition(e, "startsWith", o);
|
|
2392
2998
|
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
|
|
2999
|
+
case "gt": return _e(e, o);
|
|
3000
|
+
case "gte": return z(e, o);
|
|
3001
|
+
case "lt": return ve(e, o);
|
|
3002
|
+
case "lte": return B(e, o);
|
|
3003
|
+
case "set": return Se(e);
|
|
3004
|
+
case "notSet": return xe(e);
|
|
2399
3005
|
case "inDateRange":
|
|
2400
3006
|
if (a.length >= 2) {
|
|
2401
3007
|
let t = this.dateTimeBuilder.normalizeDate(a[0]), r = this.dateTimeBuilder.normalizeDate(a[1]);
|
|
@@ -2405,43 +3011,43 @@ var X = class {
|
|
|
2405
3011
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2406
3012
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2407
3013
|
}
|
|
2408
|
-
return
|
|
3014
|
+
return R(z(e, t), B(e, r));
|
|
2409
3015
|
}
|
|
2410
3016
|
}
|
|
2411
3017
|
return null;
|
|
2412
3018
|
case "beforeDate": {
|
|
2413
3019
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2414
|
-
return t ?
|
|
3020
|
+
return t ? ve(e, t) : null;
|
|
2415
3021
|
}
|
|
2416
3022
|
case "afterDate": {
|
|
2417
3023
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2418
|
-
return t ?
|
|
3024
|
+
return t ? _e(e, t) : null;
|
|
2419
3025
|
}
|
|
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 ?
|
|
3026
|
+
case "between": return a.length >= 2 ? R(z(e, a[0]), B(e, a[1])) : null;
|
|
3027
|
+
case "notBetween": return a.length >= 2 ? ge(ve(e, a[0]), _e(e, a[1])) : null;
|
|
3028
|
+
case "in": return a.length > 0 ? ye(e, a) : null;
|
|
3029
|
+
case "notIn": return a.length > 0 ? be(e, a) : null;
|
|
2424
3030
|
case "like": return this.databaseAdapter.buildStringCondition(e, "like", o);
|
|
2425
3031
|
case "notLike": return this.databaseAdapter.buildStringCondition(e, "notLike", o);
|
|
2426
3032
|
case "ilike": return this.databaseAdapter.buildStringCondition(e, "ilike", o);
|
|
2427
3033
|
case "regex": return this.databaseAdapter.buildStringCondition(e, "regex", o);
|
|
2428
3034
|
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" ?
|
|
3035
|
+
case "isEmpty": return ge(xe(e), L(e, ""));
|
|
3036
|
+
case "isNotEmpty": return R(Se(e), he(e, ""));
|
|
3037
|
+
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ? Ce(e, a) : null;
|
|
3038
|
+
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ? Te(e, a) : null;
|
|
3039
|
+
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ? we(e, a) : null;
|
|
2434
3040
|
default: return null;
|
|
2435
3041
|
}
|
|
2436
3042
|
}
|
|
2437
3043
|
buildLogicalFilter(e, t, n) {
|
|
2438
3044
|
if ("and" in e && e.and) {
|
|
2439
3045
|
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] :
|
|
3046
|
+
return r.length > 0 ? r.length === 1 ? r[0] : R(...r) : null;
|
|
2441
3047
|
}
|
|
2442
3048
|
if ("or" in e && e.or) {
|
|
2443
3049
|
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] :
|
|
3050
|
+
return r.length > 0 ? r.length === 1 ? r[0] : ge(...r) : null;
|
|
2445
3051
|
}
|
|
2446
3052
|
return null;
|
|
2447
3053
|
}
|
|
@@ -2454,13 +3060,14 @@ var X = class {
|
|
|
2454
3060
|
let c = s.type === "time" ? K(s.sql, n) : typeof s.sql == "function" ? s.sql(n) : s.sql;
|
|
2455
3061
|
return this.buildFilterCondition(c, r.operator, r.values, s, r.dateRange);
|
|
2456
3062
|
}
|
|
2457
|
-
},
|
|
3063
|
+
}, X = class {
|
|
2458
3064
|
dependencyGraph;
|
|
2459
3065
|
cubes;
|
|
2460
3066
|
constructor(e) {
|
|
2461
3067
|
this.cubes = e instanceof Map ? e : new Map([[e.name, e]]), this.dependencyGraph = /* @__PURE__ */ new Map();
|
|
2462
3068
|
}
|
|
2463
3069
|
extractDependencies(e) {
|
|
3070
|
+
if (e.length > 1e3) return [];
|
|
2464
3071
|
let t = e.matchAll(/\{([^}]+)\}/g), n = [];
|
|
2465
3072
|
for (let e of t) {
|
|
2466
3073
|
let t = e[1].trim();
|
|
@@ -2581,14 +3188,14 @@ var X = class {
|
|
|
2581
3188
|
};
|
|
2582
3189
|
//#endregion
|
|
2583
3190
|
//#region src/server/template-substitution.ts
|
|
2584
|
-
function
|
|
2585
|
-
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a =
|
|
3191
|
+
function Mt(e, t) {
|
|
3192
|
+
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a = Nt(e), o = /* @__PURE__ */ new Map();
|
|
2586
3193
|
for (let e of a) {
|
|
2587
3194
|
let { originalRef: t, cubeName: a, fieldName: s } = e, c = a || n.name;
|
|
2588
3195
|
if (!r.get(c)) throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);
|
|
2589
3196
|
let l = `${c}.${s}`, u = i.get(l);
|
|
2590
3197
|
if (!u) throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);
|
|
2591
|
-
let d =
|
|
3198
|
+
let d = F`${u()}`;
|
|
2592
3199
|
o.set(t, d);
|
|
2593
3200
|
}
|
|
2594
3201
|
let s = [], c = [], l = 0;
|
|
@@ -2600,12 +3207,13 @@ function vt(e, t) {
|
|
|
2600
3207
|
i && c.push(i), l = r + n.length;
|
|
2601
3208
|
}
|
|
2602
3209
|
}
|
|
2603
|
-
if (s.push(e.substring(l)), c.length === 0) return
|
|
3210
|
+
if (s.push(e.substring(l)), c.length === 0) return F.raw(e);
|
|
2604
3211
|
let u = [];
|
|
2605
|
-
for (let e = 0; e < s.length; e++) s[e] && u.push(new
|
|
2606
|
-
return
|
|
3212
|
+
for (let e = 0; e < s.length; e++) s[e] && u.push(new M(s[e])), e < c.length && u.push(c[e]);
|
|
3213
|
+
return F.join(u, F.raw(""));
|
|
2607
3214
|
}
|
|
2608
|
-
function
|
|
3215
|
+
function Nt(e) {
|
|
3216
|
+
if (e.length > 1e3) return [];
|
|
2609
3217
|
let t = e.matchAll(/\{([^}]+)\}/g), n = [];
|
|
2610
3218
|
for (let e of t) {
|
|
2611
3219
|
let t = e[1].trim();
|
|
@@ -2624,7 +3232,7 @@ function yt(e) {
|
|
|
2624
3232
|
}
|
|
2625
3233
|
return n;
|
|
2626
3234
|
}
|
|
2627
|
-
function
|
|
3235
|
+
function Pt(e) {
|
|
2628
3236
|
let t = [], n = 0;
|
|
2629
3237
|
for (let r = 0; r < e.length; r++) if (e[r] === "{") n++;
|
|
2630
3238
|
else if (e[r] === "}" && (n--, n < 0)) {
|
|
@@ -2632,7 +3240,7 @@ function bt(e) {
|
|
|
2632
3240
|
break;
|
|
2633
3241
|
}
|
|
2634
3242
|
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 =
|
|
3243
|
+
let r = Nt(e);
|
|
2636
3244
|
for (let e of r) {
|
|
2637
3245
|
let n = e.cubeName ? `${e.cubeName}.${e.fieldName}` : e.fieldName;
|
|
2638
3246
|
/^[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 +3250,8 @@ function bt(e) {
|
|
|
2642
3250
|
errors: t
|
|
2643
3251
|
};
|
|
2644
3252
|
}
|
|
2645
|
-
function
|
|
2646
|
-
let n =
|
|
3253
|
+
function Ft(e, t) {
|
|
3254
|
+
let n = Nt(e), r = /* @__PURE__ */ new Set();
|
|
2647
3255
|
for (let e of n) {
|
|
2648
3256
|
let n = `${e.cubeName || t}.${e.fieldName}`;
|
|
2649
3257
|
r.add(n);
|
|
@@ -2652,12 +3260,12 @@ function xt(e, t) {
|
|
|
2652
3260
|
}
|
|
2653
3261
|
//#endregion
|
|
2654
3262
|
//#region src/server/builders/measure-builder.ts
|
|
2655
|
-
var
|
|
3263
|
+
var Z = class e {
|
|
2656
3264
|
constructor(e) {
|
|
2657
3265
|
this.databaseAdapter = e;
|
|
2658
3266
|
}
|
|
2659
3267
|
buildResolvedMeasures(t, n, r, i) {
|
|
2660
|
-
let a = /* @__PURE__ */ new Map(), o = [], s = [], c = new Set(t), l = new
|
|
3268
|
+
let a = /* @__PURE__ */ new Map(), o = [], s = [], c = new Set(t), l = new X(n);
|
|
2661
3269
|
for (let e of n.values()) l.buildGraph(e);
|
|
2662
3270
|
let u = [];
|
|
2663
3271
|
for (let r of t) {
|
|
@@ -2670,11 +3278,11 @@ var Q = class e {
|
|
|
2670
3278
|
n && c.add(n);
|
|
2671
3279
|
continue;
|
|
2672
3280
|
}
|
|
2673
|
-
|
|
3281
|
+
X.isCalculatedMeasure(d) ? (s.push(r), Ft(d.calculatedSql, t).forEach((e) => c.add(e)), l.getAllDependencies(r).forEach((e) => {
|
|
2674
3282
|
let [t, r] = e.split("."), i = n.get(t);
|
|
2675
3283
|
if (i && i.measures[r]) {
|
|
2676
3284
|
let e = i.measures[r];
|
|
2677
|
-
|
|
3285
|
+
X.isCalculatedMeasure(e) && Ft(e.calculatedSql, t).forEach((e) => c.add(e));
|
|
2678
3286
|
}
|
|
2679
3287
|
})) : o.push(r);
|
|
2680
3288
|
}
|
|
@@ -2684,7 +3292,7 @@ var Q = class e {
|
|
|
2684
3292
|
if (a && a.measures && a.measures[i]) {
|
|
2685
3293
|
let n = a.measures[i];
|
|
2686
3294
|
if (e.isPostAggregationWindow(n)) continue;
|
|
2687
|
-
|
|
3295
|
+
X.isCalculatedMeasure(n) ? s.includes(t) || s.push(t) : o.includes(t) || o.push(t);
|
|
2688
3296
|
}
|
|
2689
3297
|
}
|
|
2690
3298
|
for (let e of o) {
|
|
@@ -2705,7 +3313,7 @@ var Q = class e {
|
|
|
2705
3313
|
}
|
|
2706
3314
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
2707
3315
|
if (!e.calculatedSql) throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);
|
|
2708
|
-
return
|
|
3316
|
+
return Mt(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql), {
|
|
2709
3317
|
cube: t,
|
|
2710
3318
|
allCubes: n,
|
|
2711
3319
|
resolvedMeasures: r,
|
|
@@ -2714,32 +3322,32 @@ var Q = class e {
|
|
|
2714
3322
|
}
|
|
2715
3323
|
buildCTECalculatedMeasure(e, t, n, r, i) {
|
|
2716
3324
|
if (!e.calculatedSql) throw Error(`Calculated measure '${t.name}.${e.name || "unknown"}' missing calculatedSql property`);
|
|
2717
|
-
let a = /* @__PURE__ */ new Map(), o =
|
|
3325
|
+
let a = /* @__PURE__ */ new Map(), o = Ft(e.calculatedSql, t.name);
|
|
2718
3326
|
for (let e of o) {
|
|
2719
3327
|
let [t, i] = e.split("."), o = r.get(t);
|
|
2720
3328
|
if (o && o.measures[i]) {
|
|
2721
3329
|
let t = o.measures[i];
|
|
2722
3330
|
if (n.measures.includes(e)) {
|
|
2723
|
-
let r =
|
|
3331
|
+
let r = F`${F.identifier(n.cteAlias)}.${F.identifier(i)}`, o;
|
|
2724
3332
|
switch (t.type) {
|
|
2725
3333
|
case "count":
|
|
2726
3334
|
case "countDistinct":
|
|
2727
3335
|
case "sum":
|
|
2728
|
-
o =
|
|
3336
|
+
o = V(r);
|
|
2729
3337
|
break;
|
|
2730
3338
|
case "avg":
|
|
2731
3339
|
o = this.databaseAdapter.buildAvg(r);
|
|
2732
3340
|
break;
|
|
2733
3341
|
case "min":
|
|
2734
|
-
o =
|
|
3342
|
+
o = Ae(r);
|
|
2735
3343
|
break;
|
|
2736
3344
|
case "max":
|
|
2737
|
-
o =
|
|
3345
|
+
o = H(r);
|
|
2738
3346
|
break;
|
|
2739
3347
|
case "number":
|
|
2740
|
-
o =
|
|
3348
|
+
o = V(r);
|
|
2741
3349
|
break;
|
|
2742
|
-
default: o =
|
|
3350
|
+
default: o = V(r);
|
|
2743
3351
|
}
|
|
2744
3352
|
a.set(e, () => o);
|
|
2745
3353
|
}
|
|
@@ -2757,16 +3365,16 @@ var Q = class e {
|
|
|
2757
3365
|
if (i.joinCubes) for (let e of i.joinCubes) o.set(e.cube.name, e.cube);
|
|
2758
3366
|
return this.buildCTECalculatedMeasure(n, t, a, o, r);
|
|
2759
3367
|
} else {
|
|
2760
|
-
let e =
|
|
3368
|
+
let e = F`${F.identifier(a.cteAlias)}.${F.identifier(t)}`;
|
|
2761
3369
|
switch (n.type) {
|
|
2762
3370
|
case "count":
|
|
2763
3371
|
case "countDistinct":
|
|
2764
|
-
case "sum": return
|
|
3372
|
+
case "sum": return V(e);
|
|
2765
3373
|
case "avg": return this.databaseAdapter.buildAvg(e);
|
|
2766
|
-
case "min": return
|
|
2767
|
-
case "max": return
|
|
2768
|
-
case "number": return
|
|
2769
|
-
default: return
|
|
3374
|
+
case "min": return Ae(e);
|
|
3375
|
+
case "max": return H(e);
|
|
3376
|
+
case "number": return V(e);
|
|
3377
|
+
default: return V(e);
|
|
2770
3378
|
}
|
|
2771
3379
|
}
|
|
2772
3380
|
}
|
|
@@ -2780,10 +3388,10 @@ var Q = class e {
|
|
|
2780
3388
|
if (t.filters && t.filters.length > 0) {
|
|
2781
3389
|
let e = t.filters.map((e) => {
|
|
2782
3390
|
let t = e(n);
|
|
2783
|
-
return t ?
|
|
3391
|
+
return t ? F`(${t})` : void 0;
|
|
2784
3392
|
}).filter(Boolean);
|
|
2785
3393
|
if (e.length > 0) {
|
|
2786
|
-
let t = e.length === 1 ? e[0] :
|
|
3394
|
+
let t = e.length === 1 ? e[0] : R(...e);
|
|
2787
3395
|
i = this.databaseAdapter.buildCaseWhen([{
|
|
2788
3396
|
when: t,
|
|
2789
3397
|
then: i
|
|
@@ -2791,22 +3399,22 @@ var Q = class e {
|
|
|
2791
3399
|
}
|
|
2792
3400
|
}
|
|
2793
3401
|
switch (t.type) {
|
|
2794
|
-
case "count": return
|
|
2795
|
-
case "countDistinct": return
|
|
2796
|
-
case "sum": return
|
|
3402
|
+
case "count": return Oe(i);
|
|
3403
|
+
case "countDistinct": return ke(i);
|
|
3404
|
+
case "sum": return V(i);
|
|
2797
3405
|
case "avg": return this.databaseAdapter.buildAvg(i);
|
|
2798
|
-
case "min": return
|
|
2799
|
-
case "max": return
|
|
3406
|
+
case "min": return Ae(i);
|
|
3407
|
+
case "max": return H(i);
|
|
2800
3408
|
case "number": return i;
|
|
2801
3409
|
case "stddev":
|
|
2802
3410
|
case "stddevSamp": {
|
|
2803
3411
|
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`),
|
|
3412
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`MAX(NULL)`) : n;
|
|
2805
3413
|
}
|
|
2806
3414
|
case "variance":
|
|
2807
3415
|
case "varianceSamp": {
|
|
2808
3416
|
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`),
|
|
3417
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`MAX(NULL)`) : n;
|
|
2810
3418
|
}
|
|
2811
3419
|
case "percentile":
|
|
2812
3420
|
case "median":
|
|
@@ -2826,7 +3434,7 @@ var Q = class e {
|
|
|
2826
3434
|
default: e = t.statisticalConfig?.percentile ?? 50;
|
|
2827
3435
|
}
|
|
2828
3436
|
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`),
|
|
3437
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`MAX(NULL)`) : n;
|
|
2830
3438
|
}
|
|
2831
3439
|
case "lag":
|
|
2832
3440
|
case "lead":
|
|
@@ -2872,9 +3480,9 @@ var Q = class e {
|
|
|
2872
3480
|
nTile: e.nTile,
|
|
2873
3481
|
frame: e.frame
|
|
2874
3482
|
});
|
|
2875
|
-
return s === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3483
|
+
return s === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), F`NULL`) : s;
|
|
2876
3484
|
}
|
|
2877
|
-
default: return
|
|
3485
|
+
default: return Oe(i);
|
|
2878
3486
|
}
|
|
2879
3487
|
}
|
|
2880
3488
|
static WINDOW_FUNCTION_TYPES = [
|
|
@@ -2948,7 +3556,7 @@ var Q = class e {
|
|
|
2948
3556
|
let { postAggWindowMeasures: r } = e.categorizeForPostAggregation(t, n);
|
|
2949
3557
|
return r.length > 0;
|
|
2950
3558
|
}
|
|
2951
|
-
},
|
|
3559
|
+
}, It = class {
|
|
2952
3560
|
constructor(e) {
|
|
2953
3561
|
this.dateTimeBuilder = e;
|
|
2954
3562
|
}
|
|
@@ -2995,8 +3603,8 @@ var Q = class e {
|
|
|
2995
3603
|
l = !0;
|
|
2996
3604
|
break;
|
|
2997
3605
|
}
|
|
2998
|
-
if (
|
|
2999
|
-
let n =
|
|
3606
|
+
if (Z.isPostAggregationWindow(e)) {
|
|
3607
|
+
let n = Z.getWindowBaseMeasure(e, t);
|
|
3000
3608
|
if (n) {
|
|
3001
3609
|
let [e, t] = n.split("."), r = a.get(e)?.measures?.[t];
|
|
3002
3610
|
if (r && this.isAggregateFunctionType(r.type)) {
|
|
@@ -3016,7 +3624,7 @@ var Q = class e {
|
|
|
3016
3624
|
let t = e.joinKeys.find((e) => e.targetColumn === o);
|
|
3017
3625
|
if (t && t.sourceColumnObj) i.push(t.sourceColumnObj);
|
|
3018
3626
|
else {
|
|
3019
|
-
let t =
|
|
3627
|
+
let t = F`${F.identifier(e.cteAlias)}.${F.identifier(o)}`;
|
|
3020
3628
|
i.push(t);
|
|
3021
3629
|
}
|
|
3022
3630
|
} else {
|
|
@@ -3035,7 +3643,7 @@ var Q = class e {
|
|
|
3035
3643
|
let r = this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj, e.granularity, n);
|
|
3036
3644
|
i.push(r);
|
|
3037
3645
|
} else {
|
|
3038
|
-
let e =
|
|
3646
|
+
let e = F`${F.identifier(a.cteAlias)}.${F.identifier(o)}`;
|
|
3039
3647
|
i.push(e);
|
|
3040
3648
|
}
|
|
3041
3649
|
} else {
|
|
@@ -3046,13 +3654,13 @@ var Q = class e {
|
|
|
3046
3654
|
}
|
|
3047
3655
|
return i;
|
|
3048
3656
|
}
|
|
3049
|
-
},
|
|
3657
|
+
}, Lt = class {
|
|
3050
3658
|
dateTimeBuilder;
|
|
3051
3659
|
filterBuilder;
|
|
3052
3660
|
groupByBuilder;
|
|
3053
3661
|
measureBuilder;
|
|
3054
3662
|
constructor(e) {
|
|
3055
|
-
this.dateTimeBuilder = new
|
|
3663
|
+
this.dateTimeBuilder = new Y(e), this.filterBuilder = new jt(e, this.dateTimeBuilder), this.groupByBuilder = new It(this.dateTimeBuilder), this.measureBuilder = new Z(e);
|
|
3056
3664
|
}
|
|
3057
3665
|
buildResolvedMeasures(e, t, n, r) {
|
|
3058
3666
|
return this.measureBuilder.buildResolvedMeasures(e, t, n, r);
|
|
@@ -3063,24 +3671,24 @@ var Q = class e {
|
|
|
3063
3671
|
let [t, a] = e.split("."), o = i.get(t);
|
|
3064
3672
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3065
3673
|
let t = o.dimensions[a];
|
|
3066
|
-
r[e] =
|
|
3674
|
+
r[e] = F`${K(t.sql, n)}`.as(e);
|
|
3067
3675
|
}
|
|
3068
3676
|
}
|
|
3069
3677
|
if (t.measures) {
|
|
3070
3678
|
let e = this.buildResolvedMeasures(t.measures, i, n);
|
|
3071
3679
|
for (let n of t.measures) {
|
|
3072
3680
|
let t = e.get(n);
|
|
3073
|
-
t && (r[n] =
|
|
3681
|
+
t && typeof t == "function" && (r[n] = F`${t()}`.as(n));
|
|
3074
3682
|
}
|
|
3075
3683
|
}
|
|
3076
3684
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
3077
3685
|
let [t, a] = e.dimension.split("."), o = i.get(t);
|
|
3078
3686
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3079
3687
|
let t = o.dimensions[a], i = this.buildTimeDimensionExpression(t.sql, e.granularity, n);
|
|
3080
|
-
r[e.dimension] =
|
|
3688
|
+
r[e.dimension] = F`${i}`.as(e.dimension);
|
|
3081
3689
|
}
|
|
3082
3690
|
}
|
|
3083
|
-
return Object.keys(r).length === 0 && (r.count =
|
|
3691
|
+
return Object.keys(r).length === 0 && (r.count = Oe()), r;
|
|
3084
3692
|
}
|
|
3085
3693
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
3086
3694
|
return this.measureBuilder.buildCalculatedMeasure(e, t, n, r, i);
|
|
@@ -3116,7 +3724,7 @@ var Q = class e {
|
|
|
3116
3724
|
if (s && s.dimensions[i] && e.dateRange) {
|
|
3117
3725
|
if (r?.preAggregationCTEs && r.preAggregationCTEs.some((e) => e.cube.name === t)) continue;
|
|
3118
3726
|
if (n.filterCache) {
|
|
3119
|
-
let t =
|
|
3727
|
+
let t = xt(e.dimension, e.dateRange), r = n.filterCache.get(t);
|
|
3120
3728
|
if (r) {
|
|
3121
3729
|
a.push(r);
|
|
3122
3730
|
continue;
|
|
@@ -3141,11 +3749,11 @@ var Q = class e {
|
|
|
3141
3749
|
let a = e;
|
|
3142
3750
|
if (a.and) {
|
|
3143
3751
|
let e = a.and.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3144
|
-
return e.length > 0 ?
|
|
3752
|
+
return e.length > 0 ? R(...e) : null;
|
|
3145
3753
|
}
|
|
3146
3754
|
if (a.or) {
|
|
3147
3755
|
let e = a.or.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3148
|
-
return e.length > 0 ?
|
|
3756
|
+
return e.length > 0 ? ge(...e) : null;
|
|
3149
3757
|
}
|
|
3150
3758
|
}
|
|
3151
3759
|
let a = e, [o, s] = a.member.split("."), c = t.get(o);
|
|
@@ -3156,7 +3764,7 @@ var Q = class e {
|
|
|
3156
3764
|
if (i?.preAggregationCTEs && i.preAggregationCTEs.some((e) => e.cube.name === o)) return null;
|
|
3157
3765
|
let t = l.type === "time";
|
|
3158
3766
|
if (n.filterCache) {
|
|
3159
|
-
let t =
|
|
3767
|
+
let t = bt(e), r = n.filterCache.get(t);
|
|
3160
3768
|
if (r) return r;
|
|
3161
3769
|
}
|
|
3162
3770
|
let r = t ? K(l.sql, n) : typeof l.sql == "function" ? l.sql(n) : l.sql;
|
|
@@ -3185,12 +3793,12 @@ var Q = class e {
|
|
|
3185
3793
|
];
|
|
3186
3794
|
if (e.order && Object.keys(e.order).length > 0) for (let [t, i] of Object.entries(e.order)) {
|
|
3187
3795
|
if (!r.includes(t)) throw Error(`Cannot order by '${t}': field is not selected in the query`);
|
|
3188
|
-
let e = i === "desc" ?
|
|
3796
|
+
let e = i === "desc" ? De(F.identifier(t)) : Ee(F.identifier(t));
|
|
3189
3797
|
n.push(e);
|
|
3190
3798
|
}
|
|
3191
3799
|
if (e.timeDimensions && e.timeDimensions.length > 0) {
|
|
3192
3800
|
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(
|
|
3801
|
+
for (let e of r) t.has(e.dimension) || n.push(Ee(F.identifier(e.dimension)));
|
|
3194
3802
|
}
|
|
3195
3803
|
return n;
|
|
3196
3804
|
}
|
|
@@ -3225,7 +3833,7 @@ var Q = class e {
|
|
|
3225
3833
|
buildLogicalFilter(e, t, n) {
|
|
3226
3834
|
return this.filterBuilder.buildLogicalFilter(e, t, n);
|
|
3227
3835
|
}
|
|
3228
|
-
},
|
|
3836
|
+
}, Rt = class {
|
|
3229
3837
|
cubes;
|
|
3230
3838
|
connectivityCache = /* @__PURE__ */ new Map();
|
|
3231
3839
|
reverseIndex;
|
|
@@ -3432,10 +4040,10 @@ var Q = class e {
|
|
|
3432
4040
|
buildJoinCondition(e, t, n) {
|
|
3433
4041
|
let r = [];
|
|
3434
4042
|
for (let i of e.on) {
|
|
3435
|
-
let e = t ?
|
|
4043
|
+
let e = t ? F`${F.identifier(t)}.${F.identifier(i.source.name)}` : _t(i.source), a = n ? F`${F.identifier(n)}.${F.identifier(i.target.name)}` : _t(i.target), o = i.as || L;
|
|
3436
4044
|
r.push(o(e, a));
|
|
3437
4045
|
}
|
|
3438
|
-
return
|
|
4046
|
+
return R(...r);
|
|
3439
4047
|
}
|
|
3440
4048
|
getReachableCubes(e) {
|
|
3441
4049
|
let t = new Set([e]), n = [e];
|
|
@@ -3462,11 +4070,11 @@ var Q = class e {
|
|
|
3462
4070
|
setInCache(e, t) {
|
|
3463
4071
|
this.connectivityCache.set(e, { path: t });
|
|
3464
4072
|
}
|
|
3465
|
-
},
|
|
4073
|
+
}, zt = class {
|
|
3466
4074
|
resolverCache = /* @__PURE__ */ new WeakMap();
|
|
3467
4075
|
getResolver(e) {
|
|
3468
4076
|
let t = this.resolverCache.get(e);
|
|
3469
|
-
return t || (t = new
|
|
4077
|
+
return t || (t = new Rt(e), this.resolverCache.set(e, t)), t;
|
|
3470
4078
|
}
|
|
3471
4079
|
analyzeCubeUsage(e) {
|
|
3472
4080
|
let t = /* @__PURE__ */ new Set();
|
|
@@ -3555,9 +4163,9 @@ var Q = class e {
|
|
|
3555
4163
|
if (s.has(n)) continue;
|
|
3556
4164
|
let c = e.get(n);
|
|
3557
4165
|
if (!c) throw Error(`Cube '${n}' not found`);
|
|
3558
|
-
let u = l ?
|
|
4166
|
+
let u = l ? ht(i.relationship) : i.relationship;
|
|
3559
4167
|
if (u === "belongsToMany" && i.through) {
|
|
3560
|
-
let e =
|
|
4168
|
+
let e = yt(i, r.securityContext);
|
|
3561
4169
|
o.push({
|
|
3562
4170
|
cube: c,
|
|
3563
4171
|
alias: `${n.toLowerCase()}_cube`,
|
|
@@ -3574,7 +4182,7 @@ var Q = class e {
|
|
|
3574
4182
|
}
|
|
3575
4183
|
});
|
|
3576
4184
|
} else {
|
|
3577
|
-
let e = a.buildJoinCondition(i, null, null), t =
|
|
4185
|
+
let e = a.buildJoinCondition(i, null, null), t = gt(u, i.sqlJoinType);
|
|
3578
4186
|
o.push({
|
|
3579
4187
|
cube: c,
|
|
3580
4188
|
alias: `${n.toLowerCase()}_cube`,
|
|
@@ -3632,7 +4240,7 @@ var Q = class e {
|
|
|
3632
4240
|
targetColumnObj: e.target
|
|
3633
4241
|
})), h = void 0;
|
|
3634
4242
|
}
|
|
3635
|
-
let g = this.findPropagatingFilters(r, c, e), _ = new Map([[c.name, c]]), { aggregateMeasures: v, requiredBaseMeasures: y } =
|
|
4243
|
+
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
4244
|
if (b.length > 0) {
|
|
3637
4245
|
let t = this.expandCalculatedMeasureDependencies(c, b), i = this.findDownstreamJoinKeys(c, r, e);
|
|
3638
4246
|
a.push({
|
|
@@ -3670,7 +4278,7 @@ var Q = class e {
|
|
|
3670
4278
|
joinDef: e.joinDef,
|
|
3671
4279
|
reversed: e.reversed
|
|
3672
4280
|
}));
|
|
3673
|
-
if (!c.slice(0, -1).some((e) => (e.reversed ?
|
|
4281
|
+
if (!c.slice(0, -1).some((e) => (e.reversed ? ht(e.joinDef.relationship) : e.joinDef.relationship) === "hasMany")) return {
|
|
3674
4282
|
path: c,
|
|
3675
4283
|
hasIntermediateHasMany: !1,
|
|
3676
4284
|
intermediateJoins: [],
|
|
@@ -3793,6 +4401,7 @@ var Q = class e {
|
|
|
3793
4401
|
return Array.from(n);
|
|
3794
4402
|
}
|
|
3795
4403
|
extractDependenciesFromTemplate(e, t) {
|
|
4404
|
+
if (e.length > 1e3) return [];
|
|
3796
4405
|
let n = e.matchAll(/\{([^}]+)\}/g), r = [];
|
|
3797
4406
|
for (let e of n) {
|
|
3798
4407
|
let n = e[1].trim();
|
|
@@ -3973,7 +4582,7 @@ var Q = class e {
|
|
|
3973
4582
|
}
|
|
3974
4583
|
convertInternalPathToJoinPathSteps(e) {
|
|
3975
4584
|
return e.map((e) => {
|
|
3976
|
-
let t = e.reversed ?
|
|
4585
|
+
let t = e.reversed ? ht(e.joinDef.relationship) : e.joinDef.relationship, n = gt(t, e.joinDef.sqlJoinType), r = e.joinDef.on.map((e) => ({
|
|
3977
4586
|
sourceColumn: e.source.name,
|
|
3978
4587
|
targetColumn: e.target.name
|
|
3979
4588
|
})), i = {
|
|
@@ -4038,7 +4647,7 @@ var Q = class e {
|
|
|
4038
4647
|
suggestion: "Add a dimension to see per-group breakdowns, or add a time dimension with granularity."
|
|
4039
4648
|
};
|
|
4040
4649
|
}
|
|
4041
|
-
},
|
|
4650
|
+
}, Bt = class {
|
|
4042
4651
|
constructor(e) {
|
|
4043
4652
|
this.queryBuilder = e;
|
|
4044
4653
|
}
|
|
@@ -4052,19 +4661,19 @@ var Q = class e {
|
|
|
4052
4661
|
}
|
|
4053
4662
|
} else for (let t of e.joinKeys) if (t.targetColumnObj) {
|
|
4054
4663
|
c[t.targetColumn] = t.targetColumnObj;
|
|
4055
|
-
for (let [e, n] of Object.entries(a.dimensions || {})) n.sql === t.targetColumnObj && e !== t.targetColumn && (c[e] =
|
|
4664
|
+
for (let [e, n] of Object.entries(a.dimensions || {})) n.sql === t.targetColumnObj && e !== t.targetColumn && (c[e] = F`${t.targetColumnObj}`.as(e));
|
|
4056
4665
|
}
|
|
4057
4666
|
if (e.downstreamJoinKeys) for (let t of e.downstreamJoinKeys) for (let e of t.joinKeys) e.sourceColumnObj && (c[e.sourceColumn] = e.sourceColumnObj);
|
|
4058
4667
|
let l = a.name, u = new Map([[l, a]]), d = this.queryBuilder.buildResolvedMeasures(e.measures, u, n);
|
|
4059
4668
|
for (let t of e.measures) {
|
|
4060
4669
|
let [, e] = t.split("."), n = d.get(t);
|
|
4061
|
-
n && (c[e] =
|
|
4670
|
+
n && (c[e] = F`${n()}`.as(e));
|
|
4062
4671
|
}
|
|
4063
4672
|
if (t.dimensions) for (let e of t.dimensions) {
|
|
4064
4673
|
let [t, r] = e.split(".");
|
|
4065
4674
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4066
4675
|
let e = a.dimensions[r];
|
|
4067
|
-
c[r] =
|
|
4676
|
+
c[r] = F`${this.queryBuilder.buildMeasureExpression({
|
|
4068
4677
|
sql: e.sql,
|
|
4069
4678
|
type: "number"
|
|
4070
4679
|
}, n)}`.as(r);
|
|
@@ -4074,7 +4683,7 @@ var Q = class e {
|
|
|
4074
4683
|
let [t, r] = e.dimension.split(".");
|
|
4075
4684
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4076
4685
|
let t = a.dimensions[r];
|
|
4077
|
-
c[r] =
|
|
4686
|
+
c[r] = F`${this.queryBuilder.buildTimeDimensionExpression(t.sql, e.granularity, n)}`.as(r);
|
|
4078
4687
|
}
|
|
4079
4688
|
}
|
|
4080
4689
|
if (Object.keys(c).length === 0) return null;
|
|
@@ -4082,8 +4691,8 @@ var Q = class e {
|
|
|
4082
4691
|
if (s && e.intermediateJoins) {
|
|
4083
4692
|
let t = [...e.intermediateJoins].reverse();
|
|
4084
4693
|
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,
|
|
4694
|
+
let t = e.cube.sql(n), r = [L(e.cteJoinColumn, e.joinDef.on[0]?.target)];
|
|
4695
|
+
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from, R(...r));
|
|
4087
4696
|
}
|
|
4088
4697
|
}
|
|
4089
4698
|
let p = r ? {
|
|
@@ -4121,7 +4730,7 @@ var Q = class e {
|
|
|
4121
4730
|
}
|
|
4122
4731
|
let g = [];
|
|
4123
4732
|
if (o.where && g.push(o.where), g.push(...m, ...h), g.length > 0) {
|
|
4124
|
-
let e = g.length === 1 ? g[0] :
|
|
4733
|
+
let e = g.length === 1 ? g[0] : R(...g);
|
|
4125
4734
|
f = f.where(e);
|
|
4126
4735
|
}
|
|
4127
4736
|
let _ = [], v = /* @__PURE__ */ new Set(), y = (e) => {
|
|
@@ -4154,20 +4763,20 @@ var Q = class e {
|
|
|
4154
4763
|
if (!r) throw Error(`CTE info not found for cube ${e.cube.name}`);
|
|
4155
4764
|
let i = [];
|
|
4156
4765
|
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(
|
|
4766
|
+
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o = F`${F.identifier(t)}.${F.identifier(e.primaryJoinColumn.name)}`;
|
|
4767
|
+
i.push(L(a, o));
|
|
4159
4768
|
} else for (let e of r.joinKeys) {
|
|
4160
|
-
let a = this.resolveCTEJoinSourceColumn(e, r, n), o =
|
|
4161
|
-
i.push(
|
|
4769
|
+
let a = this.resolveCTEJoinSourceColumn(e, r, n), o = F`${F.identifier(t)}.${F.identifier(e.targetColumn)}`;
|
|
4770
|
+
i.push(L(a, o));
|
|
4162
4771
|
}
|
|
4163
|
-
return i.length === 1 ? i[0] :
|
|
4772
|
+
return i.length === 1 ? i[0] : R(...i);
|
|
4164
4773
|
}
|
|
4165
4774
|
resolveCTEJoinSourceColumn(e, t, n) {
|
|
4166
4775
|
if (!e) throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);
|
|
4167
|
-
let r = e.sourceColumnObj ||
|
|
4776
|
+
let r = e.sourceColumnObj || F.identifier(e.sourceColumn);
|
|
4168
4777
|
if (!e.sourceColumnObj || !n.preAggregationCTEs) return r;
|
|
4169
4778
|
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
|
|
4779
|
+
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
4780
|
}
|
|
4172
4781
|
return r;
|
|
4173
4782
|
}
|
|
@@ -4179,24 +4788,24 @@ var Q = class e {
|
|
|
4179
4788
|
i.push(...o);
|
|
4180
4789
|
}
|
|
4181
4790
|
if (i.length === 0) return null;
|
|
4182
|
-
let a = i.length === 1 ? i[0] :
|
|
4791
|
+
let a = i.length === 1 ? i[0] : R(...i), o = e.joinConditions;
|
|
4183
4792
|
if (o.length === 1) {
|
|
4184
4793
|
let { source: e, target: n } = o[0];
|
|
4185
|
-
return
|
|
4794
|
+
return F`${n} IN ${t.db.select({ pk: e }).from(r.from).where(a)}`;
|
|
4186
4795
|
} else {
|
|
4187
|
-
let e =
|
|
4188
|
-
return
|
|
4796
|
+
let e = R(...o.map((e) => L(e.source, e.target)), a);
|
|
4797
|
+
return F`EXISTS ${t.db.select({ one: F`1` }).from(r.from).where(e)}`;
|
|
4189
4798
|
}
|
|
4190
4799
|
}
|
|
4191
4800
|
};
|
|
4192
4801
|
//#endregion
|
|
4193
4802
|
//#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 =
|
|
4803
|
+
function Vt(e, t, n) {
|
|
4804
|
+
let r = [], i = Ht(new Date(e), n), a = Ht(new Date(t), n);
|
|
4805
|
+
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i = Ut(i, n);
|
|
4197
4806
|
return r;
|
|
4198
4807
|
}
|
|
4199
|
-
function
|
|
4808
|
+
function Ht(e, t) {
|
|
4200
4809
|
let n = new Date(e);
|
|
4201
4810
|
switch (t) {
|
|
4202
4811
|
case "second":
|
|
@@ -4230,7 +4839,7 @@ function Ot(e, t) {
|
|
|
4230
4839
|
}
|
|
4231
4840
|
return n;
|
|
4232
4841
|
}
|
|
4233
|
-
function
|
|
4842
|
+
function Ut(e, t) {
|
|
4234
4843
|
let n = new Date(e);
|
|
4235
4844
|
switch (t) {
|
|
4236
4845
|
case "second":
|
|
@@ -4260,7 +4869,7 @@ function kt(e, t) {
|
|
|
4260
4869
|
}
|
|
4261
4870
|
return n;
|
|
4262
4871
|
}
|
|
4263
|
-
function
|
|
4872
|
+
function Wt(e) {
|
|
4264
4873
|
if (e instanceof Date) return e.toISOString();
|
|
4265
4874
|
if (typeof e == "string") {
|
|
4266
4875
|
let t = new Date(e);
|
|
@@ -4268,15 +4877,15 @@ function At(e) {
|
|
|
4268
4877
|
}
|
|
4269
4878
|
return String(e);
|
|
4270
4879
|
}
|
|
4271
|
-
function
|
|
4880
|
+
function Gt(e, t) {
|
|
4272
4881
|
return t.length === 0 ? "__all__" : t.map((t) => String(e[t] ?? "")).join("|||");
|
|
4273
4882
|
}
|
|
4274
|
-
function
|
|
4275
|
-
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c =
|
|
4883
|
+
function Kt(e, t) {
|
|
4884
|
+
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c = Vt(i[0], i[1], r);
|
|
4276
4885
|
if (c.length === 0) return e;
|
|
4277
4886
|
let l = /* @__PURE__ */ new Map();
|
|
4278
4887
|
for (let t of e) {
|
|
4279
|
-
let e =
|
|
4888
|
+
let e = Gt(t, s), r = Wt(t[n]);
|
|
4280
4889
|
l.has(e) || l.set(e, /* @__PURE__ */ new Map()), l.get(e).set(r, t);
|
|
4281
4890
|
}
|
|
4282
4891
|
l.size === 0 && s.length === 0 && l.set("__all__", /* @__PURE__ */ new Map());
|
|
@@ -4296,7 +4905,7 @@ function Mt(e, t) {
|
|
|
4296
4905
|
}
|
|
4297
4906
|
return u;
|
|
4298
4907
|
}
|
|
4299
|
-
function
|
|
4908
|
+
function qt(e) {
|
|
4300
4909
|
if (!e) return null;
|
|
4301
4910
|
if (Array.isArray(e)) {
|
|
4302
4911
|
if (e.length < 2) return null;
|
|
@@ -4306,7 +4915,7 @@ function Nt(e) {
|
|
|
4306
4915
|
let t = new Date(e);
|
|
4307
4916
|
return isNaN(t.getTime()) ? null : [t, t];
|
|
4308
4917
|
}
|
|
4309
|
-
function
|
|
4918
|
+
function Jt(e, t, n) {
|
|
4310
4919
|
if (!t.timeDimensions || t.timeDimensions.length === 0) return e;
|
|
4311
4920
|
let r = t.timeDimensions.filter((e) => {
|
|
4312
4921
|
let t = e.fillMissingDates !== !1, n = e.granularity && e.dateRange;
|
|
@@ -4315,7 +4924,7 @@ function Pt(e, t, n) {
|
|
|
4315
4924
|
if (r.length === 0) return e;
|
|
4316
4925
|
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
4926
|
for (let e of r) {
|
|
4318
|
-
let t =
|
|
4927
|
+
let t = qt(e.dateRange);
|
|
4319
4928
|
if (!t) continue;
|
|
4320
4929
|
let r = {
|
|
4321
4930
|
timeDimensionKey: e.dimension,
|
|
@@ -4325,16 +4934,16 @@ function Pt(e, t, n) {
|
|
|
4325
4934
|
measures: n,
|
|
4326
4935
|
dimensions: o
|
|
4327
4936
|
};
|
|
4328
|
-
s =
|
|
4937
|
+
s = Kt(s, r);
|
|
4329
4938
|
}
|
|
4330
4939
|
return s;
|
|
4331
4940
|
}
|
|
4332
4941
|
//#endregion
|
|
4333
4942
|
//#region src/server/builders/comparison-query-builder.ts
|
|
4334
|
-
var
|
|
4943
|
+
var Yt = class {
|
|
4335
4944
|
dateTimeBuilder;
|
|
4336
4945
|
constructor(e) {
|
|
4337
|
-
this.dateTimeBuilder = new
|
|
4946
|
+
this.dateTimeBuilder = new Y(e);
|
|
4338
4947
|
}
|
|
4339
4948
|
hasComparison(e) {
|
|
4340
4949
|
return e.timeDimensions?.some((e) => e.compareDateRange && e.compareDateRange.length >= 2) ?? !1;
|
|
@@ -4462,11 +5071,11 @@ var Ft = class {
|
|
|
4462
5071
|
return typeof i == "string" && typeof a == "string" ? new Date(i).getTime() - new Date(a).getTime() : 0;
|
|
4463
5072
|
});
|
|
4464
5073
|
}
|
|
4465
|
-
},
|
|
5074
|
+
}, Xt = class {
|
|
4466
5075
|
filterBuilder;
|
|
4467
5076
|
dateTimeBuilder;
|
|
4468
5077
|
constructor(e) {
|
|
4469
|
-
this.databaseAdapter = e, this.dateTimeBuilder = new
|
|
5078
|
+
this.databaseAdapter = e, this.dateTimeBuilder = new Y(e), this.filterBuilder = new jt(e, this.dateTimeBuilder);
|
|
4470
5079
|
}
|
|
4471
5080
|
hasFunnel(e) {
|
|
4472
5081
|
return e.funnel !== void 0 && e.funnel.steps.length >= 2;
|
|
@@ -4501,7 +5110,7 @@ var Ft = class {
|
|
|
4501
5110
|
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
5111
|
let a;
|
|
4503
5112
|
"cube" in i && i.cube ? a = i.cube : typeof e.bindingKey == "string" && ([a] = e.bindingKey.split("."));
|
|
4504
|
-
let o = a ? new
|
|
5113
|
+
let o = a ? new Rt(t) : null, s = Array.isArray(i.filter) ? i.filter : [i.filter];
|
|
4505
5114
|
for (let e of s) if ("member" in e) {
|
|
4506
5115
|
let [i, s] = e.member.split("."), c = t.get(i);
|
|
4507
5116
|
if (!c) n.push(`Step ${r} filter cube not found: ${i}`);
|
|
@@ -4564,7 +5173,7 @@ var Ft = class {
|
|
|
4564
5173
|
return t;
|
|
4565
5174
|
}
|
|
4566
5175
|
resolveSteps(e, t, n) {
|
|
4567
|
-
let r = new
|
|
5176
|
+
let r = new Rt(t);
|
|
4568
5177
|
return e.steps.map((i, a) => {
|
|
4569
5178
|
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
5179
|
for (let e of u) if (e !== o.name) {
|
|
@@ -4655,15 +5264,15 @@ var Ft = class {
|
|
|
4655
5264
|
a && i.push(a);
|
|
4656
5265
|
}
|
|
4657
5266
|
}
|
|
4658
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : o ?
|
|
5267
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : o ? R(...i) : F`(${F.join(i, F` OR `)})`;
|
|
4659
5268
|
}
|
|
4660
5269
|
let o = e, [s, c] = o.member.split("."), l = o.dateRange !== void 0;
|
|
4661
5270
|
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
5271
|
let u = n.get(s);
|
|
4663
5272
|
if (!u) return null;
|
|
4664
5273
|
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;
|
|
5274
|
+
let e = new Rt(n).findPath(t.name, s);
|
|
5275
|
+
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
5276
|
}
|
|
4668
5277
|
let d = u.dimensions?.[c];
|
|
4669
5278
|
if (!d) return null;
|
|
@@ -4677,11 +5286,11 @@ var Ft = class {
|
|
|
4677
5286
|
let n = `step_${e.index}`, r = e.cube.sql(t), i = [];
|
|
4678
5287
|
r.where && i.push(r.where), i.push(...e.filterConditions);
|
|
4679
5288
|
let a = t.db.select({
|
|
4680
|
-
binding_key:
|
|
4681
|
-
step_time:
|
|
5289
|
+
binding_key: F`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5290
|
+
step_time: F`MIN(${e.timeExpr})`.as("step_time")
|
|
4682
5291
|
}).from(r.from);
|
|
4683
5292
|
if (a = this.addCrossJoinsToQuery(a, e, t, i), i.length > 0) {
|
|
4684
|
-
let e = i.length === 1 ? i[0] :
|
|
5293
|
+
let e = i.length === 1 ? i[0] : R(...i);
|
|
4685
5294
|
a = a.where(e);
|
|
4686
5295
|
}
|
|
4687
5296
|
return a = a.groupBy(e.bindingKeyExpr), t.db.$with(n).as(a);
|
|
@@ -4689,18 +5298,18 @@ var Ft = class {
|
|
|
4689
5298
|
buildSubsequentStepCTE(e, t, n) {
|
|
4690
5299
|
let r = `step_${e.index}`, i = `step_${e.index - 1}`, a = e.cube.sql(t), o = [];
|
|
4691
5300
|
a.where && o.push(a.where), o.push(...e.filterConditions);
|
|
4692
|
-
let s =
|
|
5301
|
+
let s = F`${F.identifier(i)}.step_time`, c = F`${e.timeExpr} > ${s}`;
|
|
4693
5302
|
if (e.timeToConvert) {
|
|
4694
5303
|
let t = this.databaseAdapter.buildDateAddInterval(s, e.timeToConvert);
|
|
4695
|
-
c =
|
|
5304
|
+
c = F`${c} AND ${e.timeExpr} <= ${t}`;
|
|
4696
5305
|
}
|
|
4697
5306
|
o.push(c);
|
|
4698
5307
|
let l = t.db.select({
|
|
4699
|
-
binding_key:
|
|
4700
|
-
step_time:
|
|
4701
|
-
}).from(a.from).innerJoin(n,
|
|
5308
|
+
binding_key: F`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5309
|
+
step_time: F`MIN(${e.timeExpr})`.as("step_time")
|
|
5310
|
+
}).from(a.from).innerJoin(n, F`${e.bindingKeyExpr} = ${F.identifier(i)}.binding_key`);
|
|
4702
5311
|
if (l = this.addCrossJoinsToQuery(l, e, t, o), o.length > 0) {
|
|
4703
|
-
let e = o.length === 1 ? o[0] :
|
|
5312
|
+
let e = o.length === 1 ? o[0] : R(...o);
|
|
4704
5313
|
l = l.where(e);
|
|
4705
5314
|
}
|
|
4706
5315
|
return l = l.groupBy(e.bindingKeyExpr), t.db.$with(r).as(l);
|
|
@@ -4709,55 +5318,52 @@ var Ft = class {
|
|
|
4709
5318
|
if (t.joinedCubes.length === 0) return e;
|
|
4710
5319
|
for (let i of t.joinedCubes) for (let t of i.joinPath) {
|
|
4711
5320
|
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] :
|
|
5321
|
+
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(L(e.source, e.target));
|
|
5322
|
+
let s = o.length === 1 ? o[0] : R(...o), c = i.cube.sql(n);
|
|
4714
5323
|
e = e.leftJoin(c.from, s), c.where && r.push(c.where);
|
|
4715
5324
|
}
|
|
4716
5325
|
return e;
|
|
4717
5326
|
}
|
|
4718
5327
|
buildFunnelResultsCTE(e, t, n, r) {
|
|
4719
5328
|
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")
|
|
5329
|
+
binding_key: F`s0.binding_key`,
|
|
5330
|
+
step_0_time: F`s0.step_time`
|
|
4730
5331
|
};
|
|
4731
|
-
for (let e = 1; e < t.length; e++)
|
|
4732
|
-
|
|
5332
|
+
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] = F`s${F.raw(String(e))}.step_time`;
|
|
5333
|
+
let a = F`${F.identifier("step_0")} s0`;
|
|
5334
|
+
for (let e = 1; e < t.length; e++) a = F`${a}
|
|
5335
|
+
LEFT JOIN ${F.identifier(`step_${e}`)} s${F.raw(String(e))} ON s0.binding_key = s${F.raw(String(e))}.binding_key`;
|
|
5336
|
+
let o = Object.entries(i).map(([e, t]) => F`${t} AS ${F.identifier(e)}`), s = F`SELECT ${F.join(o, F`, `)} FROM ${a}`;
|
|
5337
|
+
return r.db.$with("funnel_joined").as(s);
|
|
4733
5338
|
}
|
|
4734
5339
|
buildAggregationCTE(e, t, n, r, i) {
|
|
4735
5340
|
let a = {};
|
|
4736
|
-
a.step_0_count =
|
|
4737
|
-
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] =
|
|
5341
|
+
a.step_0_count = F`COUNT(*)`.as("step_0_count");
|
|
5342
|
+
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] = F`COUNT(${F.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);
|
|
4738
5343
|
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
|
-
|
|
5344
|
+
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`;
|
|
5345
|
+
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) {
|
|
5346
|
+
let n = this.databaseAdapter.buildPercentile(r, 50);
|
|
5347
|
+
n && (a[`step_${e}_median_seconds`] = F`(SELECT ${n} FROM ${F.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));
|
|
5348
|
+
let i = this.databaseAdapter.buildPercentile(r, 90);
|
|
5349
|
+
i && (a[`step_${e}_p90_seconds`] = F`(SELECT ${i} FROM ${F.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`));
|
|
5350
|
+
}
|
|
4745
5351
|
}
|
|
4746
5352
|
let o = i.db.select(a).from(e);
|
|
4747
5353
|
return i.db.$with("funnel_metrics").as(o);
|
|
4748
5354
|
}
|
|
4749
|
-
},
|
|
5355
|
+
}, Zt = class {
|
|
4750
5356
|
filterBuilder;
|
|
4751
5357
|
dateTimeBuilder;
|
|
4752
5358
|
databaseAdapter;
|
|
4753
5359
|
constructor(e) {
|
|
4754
|
-
this.databaseAdapter = e, this.dateTimeBuilder = new
|
|
5360
|
+
this.databaseAdapter = e, this.dateTimeBuilder = new Y(e), this.filterBuilder = new jt(e, this.dateTimeBuilder);
|
|
4755
5361
|
}
|
|
4756
5362
|
hasFlow(e) {
|
|
4757
5363
|
return e.flow !== void 0 && e.flow.startingStep !== void 0 && e.flow.eventDimension !== void 0;
|
|
4758
5364
|
}
|
|
4759
5365
|
validateConfig(e, t) {
|
|
4760
|
-
let n = [], r = [], i = this.databaseAdapter.getEngineType(), a = this.databaseAdapter.
|
|
5366
|
+
let n = [], r = [], i = this.databaseAdapter.getEngineType(), a = this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;
|
|
4761
5367
|
if (i === "sqlite") return n.push("Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis."), {
|
|
4762
5368
|
isValid: !1,
|
|
4763
5369
|
errors: n,
|
|
@@ -4806,8 +5412,8 @@ var Ft = class {
|
|
|
4806
5412
|
}
|
|
4807
5413
|
buildFlowQuery(e, t, n) {
|
|
4808
5414
|
if (this.databaseAdapter.getEngineType() === "sqlite") throw Error("Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis.");
|
|
4809
|
-
let r = this.databaseAdapter.
|
|
4810
|
-
if (i === "lateral" && !r) throw Error("Lateral joins are not supported on this database");
|
|
5415
|
+
let r = this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE, i = e.joinStrategy ?? "auto", a = i === "lateral" || i === "auto" && r;
|
|
5416
|
+
if (i === "lateral" && !r) throw Error("Lateral joins with CTE references are not supported on this database");
|
|
4811
5417
|
let o = {
|
|
4812
5418
|
...e,
|
|
4813
5419
|
stepsBefore: e.outputMode === "sunburst" ? 0 : e.stepsBefore
|
|
@@ -4913,7 +5519,7 @@ var Ft = class {
|
|
|
4913
5519
|
let r = this.buildFilterCondition(e, t, n);
|
|
4914
5520
|
r && i.push(r);
|
|
4915
5521
|
}
|
|
4916
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ?
|
|
5522
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ? R(...i) : F`(${F.join(i, F` OR `)})`;
|
|
4917
5523
|
}
|
|
4918
5524
|
if ("type" in e && "filters" in e) {
|
|
4919
5525
|
let r = e, i = [];
|
|
@@ -4921,7 +5527,7 @@ var Ft = class {
|
|
|
4921
5527
|
let r = this.buildFilterCondition(e, t, n);
|
|
4922
5528
|
r && i.push(r);
|
|
4923
5529
|
}
|
|
4924
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ?
|
|
5530
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ? R(...i) : F`(${F.join(i, F` OR `)})`;
|
|
4925
5531
|
}
|
|
4926
5532
|
let r = e, [, i] = r.member.split("."), a = t.dimensions?.[i];
|
|
4927
5533
|
if (!a) return null;
|
|
@@ -4932,13 +5538,13 @@ var Ft = class {
|
|
|
4932
5538
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o, startingStepFilters: s } = t, c = [];
|
|
4933
5539
|
r.where && c.push(r.where), c.push(...s);
|
|
4934
5540
|
let l = n.db.select({
|
|
4935
|
-
binding_key:
|
|
4936
|
-
start_time:
|
|
4937
|
-
event_type:
|
|
4938
|
-
event_path:
|
|
5541
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5542
|
+
start_time: F`MIN(${a})`.as("start_time"),
|
|
5543
|
+
event_type: F`${o}`.as("event_type"),
|
|
5544
|
+
event_path: F`${o}`.as("event_path")
|
|
4939
5545
|
}).from(r.from);
|
|
4940
5546
|
if (c.length > 0) {
|
|
4941
|
-
let e = c.length === 1 ? c[0] :
|
|
5547
|
+
let e = c.length === 1 ? c[0] : R(...c);
|
|
4942
5548
|
l = l.where(e);
|
|
4943
5549
|
}
|
|
4944
5550
|
return l = l.groupBy(i, o), e.entityLimit && (l = l.limit(e.entityLimit)), n.db.$with("starting_entities").as(l);
|
|
@@ -4947,18 +5553,18 @@ var Ft = class {
|
|
|
4947
5553
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
4948
5554
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
4949
5555
|
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:
|
|
5556
|
+
r.where && d.push(r.where), d.push(F`${i} = ${F.identifier(e)}.binding_key`, F`${a} < ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5557
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${o} || ${"→"} || ${F.identifier(e)}.event_path` : F`${o}`, m = n.db.select({
|
|
5558
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5559
|
+
step_time: F`${a}`.as("step_time"),
|
|
5560
|
+
event_type: F`${o}`.as("event_type"),
|
|
4955
5561
|
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(
|
|
5562
|
+
}).from(r.from).where(f).orderBy(F`${a} DESC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5563
|
+
binding_key: F`e.binding_key`.as("binding_key"),
|
|
5564
|
+
step_time: F`e.step_time`.as("step_time"),
|
|
5565
|
+
event_type: F`e.event_type`.as("event_type"),
|
|
5566
|
+
event_path: F`e.event_path`.as("event_path")
|
|
5567
|
+
}).from(F`${F.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
4962
5568
|
s.push(h);
|
|
4963
5569
|
}
|
|
4964
5570
|
return s;
|
|
@@ -4967,18 +5573,18 @@ var Ft = class {
|
|
|
4967
5573
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
4968
5574
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
4969
5575
|
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:
|
|
5576
|
+
r.where && d.push(r.where), d.push(F`${i} = ${F.identifier(e)}.binding_key`, F`${a} > ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5577
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${F.identifier(e)}.event_path || ${"→"} || ${o}` : F`${o}`, m = n.db.select({
|
|
5578
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5579
|
+
step_time: F`${a}`.as("step_time"),
|
|
5580
|
+
event_type: F`${o}`.as("event_type"),
|
|
4975
5581
|
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(
|
|
5582
|
+
}).from(r.from).where(f).orderBy(F`${a} ASC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5583
|
+
binding_key: F`e.binding_key`.as("binding_key"),
|
|
5584
|
+
step_time: F`e.step_time`.as("step_time"),
|
|
5585
|
+
event_type: F`e.event_type`.as("event_type"),
|
|
5586
|
+
event_path: F`e.event_path`.as("event_path")
|
|
5587
|
+
}).from(F`${F.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
4982
5588
|
s.push(h);
|
|
4983
5589
|
}
|
|
4984
5590
|
return s;
|
|
@@ -4987,19 +5593,19 @@ var Ft = class {
|
|
|
4987
5593
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
4988
5594
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
4989
5595
|
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:
|
|
5596
|
+
r.where && d.push(r.where), d.push(F`${a} < ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5597
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${o} || ${"→"} || ${F.identifier(e)}.event_path` : F`${o}`, m = n.db.select({
|
|
5598
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5599
|
+
step_time: F`${a}`.as("step_time"),
|
|
5600
|
+
event_type: F`${o}`.as("event_type"),
|
|
4995
5601
|
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(
|
|
5602
|
+
rn: F`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as("rn")
|
|
5603
|
+
}).from(r.from).innerJoin(F`${F.identifier(e)}`, F`${i} = ${F.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5604
|
+
binding_key: F`binding_key`.as("binding_key"),
|
|
5605
|
+
step_time: F`step_time`.as("step_time"),
|
|
5606
|
+
event_type: F`event_type`.as("event_type"),
|
|
5607
|
+
event_path: F`event_path`.as("event_path")
|
|
5608
|
+
}).from(m.as("ranked")).where(F`rn = 1`);
|
|
5003
5609
|
s.push(n.db.$with(u).as(h));
|
|
5004
5610
|
}
|
|
5005
5611
|
return s;
|
|
@@ -5008,19 +5614,19 @@ var Ft = class {
|
|
|
5008
5614
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5009
5615
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5010
5616
|
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:
|
|
5617
|
+
r.where && d.push(r.where), d.push(F`${a} > ${F.identifier(e)}.${F.identifier(l)}`);
|
|
5618
|
+
let f = d.length === 1 ? d[0] : R(...d), p = c ? F`${F.identifier(e)}.event_path || ${"→"} || ${o}` : F`${o}`, m = n.db.select({
|
|
5619
|
+
binding_key: F`${i}`.as("binding_key"),
|
|
5620
|
+
step_time: F`${a}`.as("step_time"),
|
|
5621
|
+
event_type: F`${o}`.as("event_type"),
|
|
5016
5622
|
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(
|
|
5623
|
+
rn: F`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as("rn")
|
|
5624
|
+
}).from(r.from).innerJoin(F`${F.identifier(e)}`, F`${i} = ${F.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5625
|
+
binding_key: F`binding_key`.as("binding_key"),
|
|
5626
|
+
step_time: F`step_time`.as("step_time"),
|
|
5627
|
+
event_type: F`event_type`.as("event_type"),
|
|
5628
|
+
event_path: F`event_path`.as("event_path")
|
|
5629
|
+
}).from(m.as("ranked")).where(F`rn = 1`);
|
|
5024
5630
|
s.push(n.db.$with(u).as(h));
|
|
5025
5631
|
}
|
|
5026
5632
|
return s;
|
|
@@ -5029,27 +5635,27 @@ var Ft = class {
|
|
|
5029
5635
|
let n = [], r = e.outputMode === "sunburst";
|
|
5030
5636
|
for (let t = e.stepsBefore; t >= 1; t--) {
|
|
5031
5637
|
let e = -t, i = `before_step_${t}`;
|
|
5032
|
-
r ? n.push(
|
|
5638
|
+
r ? n.push(F`
|
|
5033
5639
|
SELECT
|
|
5034
|
-
${
|
|
5640
|
+
${F.raw(`'before_${t}_'`)} || event_path AS node_id,
|
|
5035
5641
|
event_type AS name,
|
|
5036
|
-
${
|
|
5642
|
+
${F.raw(String(e))} AS layer,
|
|
5037
5643
|
COUNT(*) AS value
|
|
5038
|
-
FROM ${
|
|
5644
|
+
FROM ${F.identifier(i)}
|
|
5039
5645
|
GROUP BY event_path, event_type
|
|
5040
|
-
`) : n.push(
|
|
5646
|
+
`) : n.push(F`
|
|
5041
5647
|
SELECT
|
|
5042
|
-
${
|
|
5648
|
+
${F.raw(`'before_${t}_'`)} || event_type AS node_id,
|
|
5043
5649
|
event_type AS name,
|
|
5044
|
-
${
|
|
5650
|
+
${F.raw(String(e))} AS layer,
|
|
5045
5651
|
COUNT(*) AS value
|
|
5046
|
-
FROM ${
|
|
5652
|
+
FROM ${F.identifier(i)}
|
|
5047
5653
|
GROUP BY event_type
|
|
5048
5654
|
`);
|
|
5049
5655
|
}
|
|
5050
|
-
n.push(
|
|
5656
|
+
n.push(F`
|
|
5051
5657
|
SELECT
|
|
5052
|
-
${
|
|
5658
|
+
${F.raw("'start_'")} || event_type AS node_id,
|
|
5053
5659
|
event_type AS name,
|
|
5054
5660
|
0 AS layer,
|
|
5055
5661
|
COUNT(*) AS value
|
|
@@ -5058,82 +5664,82 @@ var Ft = class {
|
|
|
5058
5664
|
`);
|
|
5059
5665
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5060
5666
|
let e = t, i = `after_step_${t}`;
|
|
5061
|
-
r ? n.push(
|
|
5667
|
+
r ? n.push(F`
|
|
5062
5668
|
SELECT
|
|
5063
|
-
${
|
|
5669
|
+
${F.raw(`'after_${t}_'`)} || event_path AS node_id,
|
|
5064
5670
|
event_type AS name,
|
|
5065
|
-
${
|
|
5671
|
+
${F.raw(String(e))} AS layer,
|
|
5066
5672
|
COUNT(*) AS value
|
|
5067
|
-
FROM ${
|
|
5673
|
+
FROM ${F.identifier(i)}
|
|
5068
5674
|
GROUP BY event_path, event_type
|
|
5069
|
-
`) : n.push(
|
|
5675
|
+
`) : n.push(F`
|
|
5070
5676
|
SELECT
|
|
5071
|
-
${
|
|
5677
|
+
${F.raw(`'after_${t}_'`)} || event_type AS node_id,
|
|
5072
5678
|
event_type AS name,
|
|
5073
|
-
${
|
|
5679
|
+
${F.raw(String(e))} AS layer,
|
|
5074
5680
|
COUNT(*) AS value
|
|
5075
|
-
FROM ${
|
|
5681
|
+
FROM ${F.identifier(i)}
|
|
5076
5682
|
GROUP BY event_type
|
|
5077
5683
|
`);
|
|
5078
5684
|
}
|
|
5079
|
-
let i =
|
|
5080
|
-
node_id:
|
|
5081
|
-
name:
|
|
5082
|
-
layer:
|
|
5083
|
-
value:
|
|
5084
|
-
}).from(
|
|
5685
|
+
let i = F.join(n, F` UNION ALL `), a = t.db.select({
|
|
5686
|
+
node_id: F`node_id`.as("node_id"),
|
|
5687
|
+
name: F`name`.as("name"),
|
|
5688
|
+
layer: F`layer`.as("layer"),
|
|
5689
|
+
value: F`value`.as("value")
|
|
5690
|
+
}).from(F`(${i}) AS nodes_union`);
|
|
5085
5691
|
return t.db.$with("nodes_agg").as(a);
|
|
5086
5692
|
}
|
|
5087
5693
|
buildLinksAggregationCTE(e, t) {
|
|
5088
5694
|
let n = [], r = e.outputMode === "sunburst";
|
|
5089
5695
|
for (let t = e.stepsBefore; t >= 2; t--) {
|
|
5090
5696
|
let e = `before_step_${t}`, i = `before_step_${t - 1}`;
|
|
5091
|
-
r ? n.push(
|
|
5697
|
+
r ? n.push(F`
|
|
5092
5698
|
SELECT
|
|
5093
|
-
${
|
|
5094
|
-
${
|
|
5699
|
+
${F.raw(`'before_${t}_'`)} || f.event_path AS source_id,
|
|
5700
|
+
${F.raw(`'before_${t - 1}_'`)} || t.event_path AS target_id,
|
|
5095
5701
|
COUNT(*) AS value
|
|
5096
|
-
FROM ${
|
|
5097
|
-
INNER JOIN ${
|
|
5702
|
+
FROM ${F.identifier(e)} f
|
|
5703
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5098
5704
|
GROUP BY f.event_path, t.event_path
|
|
5099
|
-
`) : n.push(
|
|
5705
|
+
`) : n.push(F`
|
|
5100
5706
|
SELECT
|
|
5101
|
-
${
|
|
5102
|
-
${
|
|
5707
|
+
${F.raw(`'before_${t}_'`)} || f.event_type AS source_id,
|
|
5708
|
+
${F.raw(`'before_${t - 1}_'`)} || t.event_type AS target_id,
|
|
5103
5709
|
COUNT(*) AS value
|
|
5104
|
-
FROM ${
|
|
5105
|
-
INNER JOIN ${
|
|
5710
|
+
FROM ${F.identifier(e)} f
|
|
5711
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5106
5712
|
GROUP BY f.event_type, t.event_type
|
|
5107
5713
|
`);
|
|
5108
5714
|
}
|
|
5109
|
-
e.stepsBefore >= 1 && (r ? n.push(
|
|
5715
|
+
e.stepsBefore >= 1 && (r ? n.push(F`
|
|
5110
5716
|
SELECT
|
|
5111
|
-
${
|
|
5112
|
-
${
|
|
5717
|
+
${F.raw("'before_1_'")} || b.event_path AS source_id,
|
|
5718
|
+
${F.raw("'start_'")} || s.event_type AS target_id,
|
|
5113
5719
|
COUNT(*) AS value
|
|
5114
5720
|
FROM before_step_1 b
|
|
5115
5721
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5116
5722
|
GROUP BY b.event_path, s.event_type
|
|
5117
|
-
`) : n.push(
|
|
5723
|
+
`) : n.push(F`
|
|
5118
5724
|
SELECT
|
|
5119
|
-
${
|
|
5120
|
-
${
|
|
5725
|
+
${F.raw("'before_1_'")} || b.event_type AS source_id,
|
|
5726
|
+
${F.raw("'start_'")} || s.event_type AS target_id,
|
|
5121
5727
|
COUNT(*) AS value
|
|
5122
5728
|
FROM before_step_1 b
|
|
5123
5729
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5124
5730
|
GROUP BY b.event_type, s.event_type
|
|
5125
|
-
`)), e.stepsAfter >= 1 && (r ? n.push(
|
|
5731
|
+
`)), e.stepsAfter >= 1 && (r ? n.push(F`
|
|
5126
5732
|
SELECT
|
|
5127
|
-
${
|
|
5128
|
-
${
|
|
5733
|
+
${F.raw("'start_'")} || s.event_type AS source_id,
|
|
5734
|
+
${F.raw("'after_1_'")} || a.event_path AS target_id,
|
|
5129
5735
|
COUNT(*) AS value
|
|
5130
5736
|
FROM starting_entities s
|
|
5131
5737
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
5132
5738
|
GROUP BY s.event_type, a.event_path
|
|
5133
|
-
`) : n.push(
|
|
5739
|
+
`) : n.push(F`
|
|
5134
5740
|
SELECT
|
|
5135
|
-
${
|
|
5136
|
-
${
|
|
5741
|
+
${F.raw("'start_'")} || s.event_type AS source_id,
|
|
5742
|
+
${F.raw("'after_1_'")} || a.event_type AS target_id,
|
|
5137
5743
|
COUNT(*) AS value
|
|
5138
5744
|
FROM starting_entities s
|
|
5139
5745
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
@@ -5141,41 +5747,41 @@ var Ft = class {
|
|
|
5141
5747
|
`));
|
|
5142
5748
|
for (let t = 1; t < e.stepsAfter; t++) {
|
|
5143
5749
|
let e = `after_step_${t}`, i = `after_step_${t + 1}`;
|
|
5144
|
-
r ? n.push(
|
|
5750
|
+
r ? n.push(F`
|
|
5145
5751
|
SELECT
|
|
5146
|
-
${
|
|
5147
|
-
${
|
|
5752
|
+
${F.raw(`'after_${t}_'`)} || f.event_path AS source_id,
|
|
5753
|
+
${F.raw(`'after_${t + 1}_'`)} || t.event_path AS target_id,
|
|
5148
5754
|
COUNT(*) AS value
|
|
5149
|
-
FROM ${
|
|
5150
|
-
INNER JOIN ${
|
|
5755
|
+
FROM ${F.identifier(e)} f
|
|
5756
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5151
5757
|
GROUP BY f.event_path, t.event_path
|
|
5152
|
-
`) : n.push(
|
|
5758
|
+
`) : n.push(F`
|
|
5153
5759
|
SELECT
|
|
5154
|
-
${
|
|
5155
|
-
${
|
|
5760
|
+
${F.raw(`'after_${t}_'`)} || f.event_type AS source_id,
|
|
5761
|
+
${F.raw(`'after_${t + 1}_'`)} || t.event_type AS target_id,
|
|
5156
5762
|
COUNT(*) AS value
|
|
5157
|
-
FROM ${
|
|
5158
|
-
INNER JOIN ${
|
|
5763
|
+
FROM ${F.identifier(e)} f
|
|
5764
|
+
INNER JOIN ${F.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5159
5765
|
GROUP BY f.event_type, t.event_type
|
|
5160
5766
|
`);
|
|
5161
5767
|
}
|
|
5162
5768
|
if (n.length === 0) {
|
|
5163
5769
|
let e = t.db.select({
|
|
5164
|
-
source_id:
|
|
5165
|
-
target_id:
|
|
5166
|
-
value:
|
|
5167
|
-
}).from(
|
|
5770
|
+
source_id: F`NULL`.as("source_id"),
|
|
5771
|
+
target_id: F`NULL`.as("target_id"),
|
|
5772
|
+
value: F`0`.as("value")
|
|
5773
|
+
}).from(F`(SELECT 1) AS empty`).where(F`1 = 0`);
|
|
5168
5774
|
return t.db.$with("links_agg").as(e);
|
|
5169
5775
|
}
|
|
5170
|
-
let i =
|
|
5171
|
-
source_id:
|
|
5172
|
-
target_id:
|
|
5173
|
-
value:
|
|
5174
|
-
}).from(
|
|
5776
|
+
let i = F.join(n, F` UNION ALL `), a = t.db.select({
|
|
5777
|
+
source_id: F`source_id`.as("source_id"),
|
|
5778
|
+
target_id: F`target_id`.as("target_id"),
|
|
5779
|
+
value: F`value`.as("value")
|
|
5780
|
+
}).from(F`(${i}) AS links_union`);
|
|
5175
5781
|
return t.db.$with("links_agg").as(a);
|
|
5176
5782
|
}
|
|
5177
5783
|
buildFinalResultCTE(e) {
|
|
5178
|
-
let t =
|
|
5784
|
+
let t = F`
|
|
5179
5785
|
SELECT
|
|
5180
5786
|
'node' AS record_type,
|
|
5181
5787
|
node_id AS id,
|
|
@@ -5197,44 +5803,44 @@ var Ft = class {
|
|
|
5197
5803
|
FROM links_agg
|
|
5198
5804
|
WHERE source_id IS NOT NULL
|
|
5199
5805
|
`, n = e.db.select({
|
|
5200
|
-
record_type:
|
|
5201
|
-
id:
|
|
5202
|
-
name:
|
|
5203
|
-
layer:
|
|
5204
|
-
value:
|
|
5205
|
-
source_id:
|
|
5206
|
-
target_id:
|
|
5207
|
-
}).from(
|
|
5806
|
+
record_type: F`record_type`.as("record_type"),
|
|
5807
|
+
id: F`id`.as("id"),
|
|
5808
|
+
name: F`name`.as("name"),
|
|
5809
|
+
layer: F`layer`.as("layer"),
|
|
5810
|
+
value: F`value`.as("value"),
|
|
5811
|
+
source_id: F`source_id`.as("source_id"),
|
|
5812
|
+
target_id: F`target_id`.as("target_id")
|
|
5813
|
+
}).from(F`(${t}) AS final_union`);
|
|
5208
5814
|
return e.db.$with("final_result").as(n);
|
|
5209
5815
|
}
|
|
5210
5816
|
};
|
|
5211
5817
|
//#endregion
|
|
5212
5818
|
//#region src/server/types/retention.ts
|
|
5213
|
-
function
|
|
5819
|
+
function Qt(e) {
|
|
5214
5820
|
return Array.isArray(e);
|
|
5215
5821
|
}
|
|
5216
|
-
function
|
|
5822
|
+
function $t(e) {
|
|
5217
5823
|
return typeof e == "object" && !!e && "cube" in e;
|
|
5218
5824
|
}
|
|
5219
|
-
function
|
|
5220
|
-
if (
|
|
5825
|
+
function en(e) {
|
|
5826
|
+
if ($t(e)) return e.cube;
|
|
5221
5827
|
let t = e.indexOf(".");
|
|
5222
5828
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5223
5829
|
return e.substring(0, t);
|
|
5224
5830
|
}
|
|
5225
|
-
function
|
|
5226
|
-
if (
|
|
5831
|
+
function tn(e) {
|
|
5832
|
+
if ($t(e)) return e.dimension;
|
|
5227
5833
|
let t = e.indexOf(".");
|
|
5228
5834
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5229
5835
|
return e.substring(t + 1);
|
|
5230
5836
|
}
|
|
5231
5837
|
//#endregion
|
|
5232
5838
|
//#region src/server/builders/retention-query-builder.ts
|
|
5233
|
-
var
|
|
5839
|
+
var nn = class {
|
|
5234
5840
|
filterBuilder;
|
|
5235
5841
|
dateTimeBuilder;
|
|
5236
5842
|
constructor(e) {
|
|
5237
|
-
this.databaseAdapter = e, this.dateTimeBuilder = new
|
|
5843
|
+
this.databaseAdapter = e, this.dateTimeBuilder = new Y(e), this.filterBuilder = new jt(e, this.dateTimeBuilder);
|
|
5238
5844
|
}
|
|
5239
5845
|
hasRetention(e) {
|
|
5240
5846
|
return e.retention !== void 0 && e.retention.timeDimension != null && e.retention.bindingKey != null;
|
|
@@ -5242,12 +5848,12 @@ var Ht = class {
|
|
|
5242
5848
|
validateConfig(e, t) {
|
|
5243
5849
|
let n = [];
|
|
5244
5850
|
try {
|
|
5245
|
-
let r =
|
|
5851
|
+
let r = en(e.timeDimension), i = tn(e.timeDimension), a = t.get(r);
|
|
5246
5852
|
a ? a.dimensions?.[i] || n.push(`Time dimension not found: ${i} in cube ${r}`) : n.push(`Cube not found: ${r}`);
|
|
5247
5853
|
} catch {
|
|
5248
5854
|
n.push(`Invalid time dimension format: ${e.timeDimension}`);
|
|
5249
5855
|
}
|
|
5250
|
-
if (
|
|
5856
|
+
if (Qt(e.bindingKey)) for (let r of e.bindingKey) {
|
|
5251
5857
|
let e = t.get(r.cube);
|
|
5252
5858
|
if (!e) n.push(`Binding key mapping cube not found: ${r.cube}`);
|
|
5253
5859
|
else {
|
|
@@ -5299,23 +5905,23 @@ var Ht = class {
|
|
|
5299
5905
|
}
|
|
5300
5906
|
buildRetentionQuery(e, t, n) {
|
|
5301
5907
|
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:
|
|
5908
|
+
period: F`rc.period_number`.as("period"),
|
|
5909
|
+
cohort_size: F`cs.cohort_size`.as("cohort_size"),
|
|
5910
|
+
retained_users: F`rc.retained_users`.as("retained_users"),
|
|
5911
|
+
retention_rate: F`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as("retention_rate")
|
|
5306
5912
|
};
|
|
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(
|
|
5913
|
+
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] = F.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5914
|
+
let d = n.db.with(a, o, s, c).select(u).from(F`retention_counts rc`);
|
|
5309
5915
|
if (l) {
|
|
5310
|
-
let e = r.breakdowns.map((e, t) =>
|
|
5311
|
-
d = d.innerJoin(
|
|
5312
|
-
} else d = d.innerJoin(
|
|
5916
|
+
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 `);
|
|
5917
|
+
d = d.innerJoin(F`cohort_sizes cs`, t);
|
|
5918
|
+
} else d = d.innerJoin(F`cohort_sizes cs`, F`1 = 1`);
|
|
5313
5919
|
let f = [];
|
|
5314
|
-
for (let e = 0; e < r.breakdowns.length; e++) f.push(
|
|
5315
|
-
return f.push(
|
|
5920
|
+
for (let e = 0; e < r.breakdowns.length; e++) f.push(F.raw(`rc.breakdown_${e}`));
|
|
5921
|
+
return f.push(F`rc.period_number`), d = d.orderBy(...f), d;
|
|
5316
5922
|
}
|
|
5317
5923
|
transformResult(e, t) {
|
|
5318
|
-
let n = t.breakdownDimensions || [], r = n.length > 0;
|
|
5924
|
+
let n = t.breakdownDimensions || [], r = Math.min(n.length, 100), i = r > 0;
|
|
5319
5925
|
return e.map((e) => {
|
|
5320
5926
|
let t = {
|
|
5321
5927
|
period: Number(e.period),
|
|
@@ -5323,19 +5929,19 @@ var Ht = class {
|
|
|
5323
5929
|
retainedUsers: Number(e.retained_users),
|
|
5324
5930
|
retentionRate: e.retention_rate === null ? 0 : Number(e.retention_rate)
|
|
5325
5931
|
};
|
|
5326
|
-
if (
|
|
5327
|
-
let
|
|
5328
|
-
for (let t = 0; t <
|
|
5329
|
-
let
|
|
5330
|
-
r
|
|
5932
|
+
if (i) {
|
|
5933
|
+
let i = {};
|
|
5934
|
+
for (let t = 0; t < r; t++) {
|
|
5935
|
+
let r = n[t], a = e[`breakdown_${t}`];
|
|
5936
|
+
i[r] = a === void 0 ? null : String(a);
|
|
5331
5937
|
}
|
|
5332
|
-
t.breakdownValues =
|
|
5938
|
+
t.breakdownValues = i;
|
|
5333
5939
|
}
|
|
5334
5940
|
return t;
|
|
5335
5941
|
});
|
|
5336
5942
|
}
|
|
5337
5943
|
resolveConfig(e, t, n) {
|
|
5338
|
-
let r =
|
|
5944
|
+
let r = en(e.timeDimension), i = tn(e.timeDimension), a = t.get(r);
|
|
5339
5945
|
if (!a) throw Error(`Cube not found: ${r}`);
|
|
5340
5946
|
let o = a.dimensions?.[i];
|
|
5341
5947
|
if (!o) throw Error(`Time dimension not found: ${i}`);
|
|
@@ -5360,7 +5966,7 @@ var Ht = class {
|
|
|
5360
5966
|
};
|
|
5361
5967
|
}
|
|
5362
5968
|
resolveBindingKey(e, t, n, r) {
|
|
5363
|
-
if (
|
|
5969
|
+
if (Qt(e)) {
|
|
5364
5970
|
let i = e.find((e) => e.cube === t.name);
|
|
5365
5971
|
if (!i) throw Error(`No binding key mapping found for cube: ${t.name}`);
|
|
5366
5972
|
let a = this.extractDimensionName(i.dimension), o = n.get(i.cube);
|
|
@@ -5391,7 +5997,7 @@ var Ht = class {
|
|
|
5391
5997
|
let i = this.buildSingleFilterCondition(e, t, n, r);
|
|
5392
5998
|
i && a.push(i);
|
|
5393
5999
|
}
|
|
5394
|
-
return a.length === 0 ? null : a.length === 1 ? a[0] : o ?
|
|
6000
|
+
return a.length === 0 ? null : a.length === 1 ? a[0] : o ? R(...a) : F`(${F.join(a, F` OR `)})`;
|
|
5395
6001
|
}
|
|
5396
6002
|
let i = e, [a, o] = i.member.split("."), s = n.get(a);
|
|
5397
6003
|
if (!s) return null;
|
|
@@ -5407,16 +6013,16 @@ var Ht = class {
|
|
|
5407
6013
|
i.push(n);
|
|
5408
6014
|
}
|
|
5409
6015
|
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = {
|
|
5410
|
-
binding_key:
|
|
5411
|
-
cohort_entry:
|
|
6016
|
+
binding_key: F`${t.bindingKeyExpr}`.as("binding_key"),
|
|
6017
|
+
cohort_entry: F`MIN(${a})`.as("cohort_entry")
|
|
5412
6018
|
};
|
|
5413
6019
|
for (let e = 0; e < t.breakdowns.length; e++) {
|
|
5414
6020
|
let { expr: n } = t.breakdowns[e];
|
|
5415
|
-
o[`breakdown_${e}`] =
|
|
6021
|
+
o[`breakdown_${e}`] = F`MIN(${n})`.as(`breakdown_${e}`);
|
|
5416
6022
|
}
|
|
5417
6023
|
let s = n.db.select(o).from(r.from);
|
|
5418
6024
|
if (i.length > 0) {
|
|
5419
|
-
let e = i.length === 1 ? i[0] :
|
|
6025
|
+
let e = i.length === 1 ? i[0] : R(...i);
|
|
5420
6026
|
s = s.where(e);
|
|
5421
6027
|
}
|
|
5422
6028
|
let c = [t.bindingKeyExpr];
|
|
@@ -5428,36 +6034,36 @@ var Ht = class {
|
|
|
5428
6034
|
return n.db.$with("cohort_base").as(s);
|
|
5429
6035
|
}
|
|
5430
6036
|
buildDateRangeCondition(e, t) {
|
|
5431
|
-
return
|
|
6037
|
+
return F`${e} >= ${t.start}::date AND ${e} < (${t.end}::date + interval '1 day')`;
|
|
5432
6038
|
}
|
|
5433
6039
|
buildDateRangeHavingCondition(e, t) {
|
|
5434
|
-
return
|
|
6040
|
+
return F`MIN(${e}) >= ${t.start}::date AND MIN(${e}) < (${t.end}::date + interval '1 day')`;
|
|
5435
6041
|
}
|
|
5436
6042
|
buildActivityPeriodsCTE(e, t, n) {
|
|
5437
6043
|
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:
|
|
6044
|
+
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(F`${t.timeExpr} >= cohort_base.cohort_entry`);
|
|
6045
|
+
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(F`cohort_base.cohort_entry`, a, e.granularity), s = {
|
|
6046
|
+
binding_key: F`cohort_base.binding_key`.as("binding_key"),
|
|
5441
6047
|
period_number: o.as("period_number")
|
|
5442
6048
|
};
|
|
5443
|
-
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] =
|
|
5444
|
-
let c = n.db.select(s).from(r.from).innerJoin(
|
|
6049
|
+
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] = F.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);
|
|
6050
|
+
let c = n.db.select(s).from(r.from).innerJoin(F`cohort_base`, F`${t.bindingKeyExpr} = cohort_base.binding_key`);
|
|
5445
6051
|
if (i.length > 0) {
|
|
5446
|
-
let e = i.length === 1 ? i[0] :
|
|
6052
|
+
let e = i.length === 1 ? i[0] : R(...i);
|
|
5447
6053
|
c = c.where(e);
|
|
5448
6054
|
}
|
|
5449
|
-
let l = [
|
|
5450
|
-
for (let e = 0; e < t.breakdowns.length; e++) l.push(
|
|
6055
|
+
let l = [F`cohort_base.binding_key`, o];
|
|
6056
|
+
for (let e = 0; e < t.breakdowns.length; e++) l.push(F.raw(`cohort_base.breakdown_${e}`));
|
|
5451
6057
|
return c = c.groupBy(...l), n.db.$with("activity_periods").as(c);
|
|
5452
6058
|
}
|
|
5453
6059
|
buildCohortSizesCTE(e, t, n) {
|
|
5454
6060
|
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(
|
|
6061
|
+
let e = { cohort_size: F`COUNT(*)`.as("cohort_size") }, r = [];
|
|
6062
|
+
for (let t = 0; t < n; t++) e[`breakdown_${t}`] = F.raw(`breakdown_${t}`).as(`breakdown_${t}`), r.push(F.raw(`breakdown_${t}`));
|
|
6063
|
+
let i = t.db.select(e).from(F`cohort_base`).groupBy(...r);
|
|
5458
6064
|
return t.db.$with("cohort_sizes").as(i);
|
|
5459
6065
|
}
|
|
5460
|
-
let r = t.db.select({ cohort_size:
|
|
6066
|
+
let r = t.db.select({ cohort_size: F`COUNT(*)`.as("cohort_size") }).from(F`cohort_base`);
|
|
5461
6067
|
return t.db.$with("cohort_sizes").as(r);
|
|
5462
6068
|
}
|
|
5463
6069
|
buildRetentionCountsCTE(e, t, n) {
|
|
@@ -5465,31 +6071,32 @@ var Ht = class {
|
|
|
5465
6071
|
if (e.retentionType === "rolling") r = this.buildRollingRetentionCountsQuery(e, t, n);
|
|
5466
6072
|
else {
|
|
5467
6073
|
let i = {
|
|
5468
|
-
period_number:
|
|
5469
|
-
retained_users:
|
|
5470
|
-
}, a = [
|
|
5471
|
-
for (let e = 0; e < n; e++) i[`breakdown_${e}`] =
|
|
5472
|
-
|
|
6074
|
+
period_number: F`period_number`.as("period_number"),
|
|
6075
|
+
retained_users: F`COUNT(DISTINCT binding_key)`.as("retained_users")
|
|
6076
|
+
}, a = [F`period_number`];
|
|
6077
|
+
for (let e = 0; e < n; e++) i[`breakdown_${e}`] = F.raw(`breakdown_${e}`).as(`breakdown_${e}`), a.push(F.raw(`breakdown_${e}`));
|
|
6078
|
+
let o = Math.min(e.periods, 52);
|
|
6079
|
+
r = t.db.select(i).from(F`activity_periods`).where(F`period_number >= 0 AND period_number <= ${o}`).groupBy(...a);
|
|
5473
6080
|
}
|
|
5474
6081
|
return t.db.$with("retention_counts").as(r);
|
|
5475
6082
|
}
|
|
5476
6083
|
buildRollingRetentionCountsQuery(e, t, n) {
|
|
5477
6084
|
let r = [];
|
|
5478
6085
|
for (let e = 0; e < n; e++) r.push(`breakdown_${e}`);
|
|
5479
|
-
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a =
|
|
6086
|
+
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a = F`(
|
|
5480
6087
|
SELECT
|
|
5481
6088
|
binding_key,
|
|
5482
|
-
${
|
|
6089
|
+
${F.raw(r.map((e) => `${e}`).join(", ") + (r.length > 0 ? "," : ""))}
|
|
5483
6090
|
MAX(period_number) as max_period
|
|
5484
6091
|
FROM activity_periods
|
|
5485
6092
|
WHERE period_number >= 0 AND period_number <= ${e.periods}
|
|
5486
|
-
GROUP BY binding_key${
|
|
6093
|
+
GROUP BY binding_key${F.raw(i)}
|
|
5487
6094
|
)`, 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(
|
|
6095
|
+
period_number: F`p.period_number`.as("period_number"),
|
|
6096
|
+
retained_users: F`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as("retained_users")
|
|
6097
|
+
}, c = [F`p.period_number`];
|
|
6098
|
+
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}`));
|
|
6099
|
+
return t.db.select(s).from(F`${a} ump`).innerJoin(o, F`TRUE`).groupBy(...c);
|
|
5493
6100
|
}
|
|
5494
6101
|
buildPeriodNumberExpression(e, t, n) {
|
|
5495
6102
|
return this.databaseAdapter.buildDateDiffPeriods(e, t, n);
|
|
@@ -5498,7 +6105,7 @@ var Ht = class {
|
|
|
5498
6105
|
let t = e.split(".");
|
|
5499
6106
|
return t.length > 1 ? t[1] : t[0];
|
|
5500
6107
|
}
|
|
5501
|
-
},
|
|
6108
|
+
}, rn = class {
|
|
5502
6109
|
constructor(e) {
|
|
5503
6110
|
this.queryPlanner = e;
|
|
5504
6111
|
}
|
|
@@ -5515,7 +6122,7 @@ var Ht = class {
|
|
|
5515
6122
|
let n = e.get(t);
|
|
5516
6123
|
n && h.set(t, n);
|
|
5517
6124
|
}
|
|
5518
|
-
let g =
|
|
6125
|
+
let g = Z.hasPostAggregationWindows(t.measures ?? [], h), _ = [...s.filter((e) => !e.pathFound && e.error).map((e) => e.error), ...u.map((e) => e.message)];
|
|
5519
6126
|
return {
|
|
5520
6127
|
plan: p,
|
|
5521
6128
|
analysis: {
|
|
@@ -5933,7 +6540,7 @@ var Ht = class {
|
|
|
5933
6540
|
timeDimensions: []
|
|
5934
6541
|
};
|
|
5935
6542
|
}
|
|
5936
|
-
},
|
|
6543
|
+
}, an = class {
|
|
5937
6544
|
name = "identity";
|
|
5938
6545
|
optimise(e) {
|
|
5939
6546
|
return e;
|
|
@@ -5941,7 +6548,7 @@ var Ht = class {
|
|
|
5941
6548
|
};
|
|
5942
6549
|
//#endregion
|
|
5943
6550
|
//#region src/server/physical-plan/processors/cte-processor.ts
|
|
5944
|
-
function
|
|
6551
|
+
function on(e, t, n, r) {
|
|
5945
6552
|
let i = /* @__PURE__ */ new Map();
|
|
5946
6553
|
if (e.preAggregationCTEs && e.preAggregationCTEs.length > 0) {
|
|
5947
6554
|
for (let t of e.preAggregationCTEs) if (t.propagatingFilters && t.propagatingFilters.length > 0) for (let e of t.propagatingFilters) {
|
|
@@ -5951,7 +6558,7 @@ function Gt(e, t, n, r) {
|
|
|
5951
6558
|
i.set(t, s);
|
|
5952
6559
|
}
|
|
5953
6560
|
let a = i.get(t);
|
|
5954
|
-
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] :
|
|
6561
|
+
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] : R(...a));
|
|
5955
6562
|
}
|
|
5956
6563
|
}
|
|
5957
6564
|
let a = [], o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map();
|
|
@@ -5971,27 +6578,27 @@ function Gt(e, t, n, r) {
|
|
|
5971
6578
|
}
|
|
5972
6579
|
//#endregion
|
|
5973
6580
|
//#region src/server/physical-plan/processors/window-processor.ts
|
|
5974
|
-
function
|
|
6581
|
+
function sn(e, t, n, r, i, a) {
|
|
5975
6582
|
if (n.measures) for (let o of n.measures) {
|
|
5976
6583
|
let [s, c] = o.split("."), l = i.get(s);
|
|
5977
6584
|
if (!l?.measures?.[c]) continue;
|
|
5978
6585
|
let u = l.measures[c];
|
|
5979
|
-
if (!
|
|
5980
|
-
let d =
|
|
6586
|
+
if (!Z.isPostAggregationWindow(u)) continue;
|
|
6587
|
+
let d = Z.getWindowBaseMeasure(u, s);
|
|
5981
6588
|
if (!d) continue;
|
|
5982
6589
|
let [f, p] = d.split("."), m = i.get(f);
|
|
5983
6590
|
if (!m?.measures?.[p]) continue;
|
|
5984
6591
|
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] =
|
|
6592
|
+
_ = g ? F`sum(${F`${F.identifier(g.cteAlias)}.${F.identifier(p)}`})` : a.queryBuilder.buildMeasureExpression(h, r, m), e[d] || (e[d] = F`${_}`.as(d));
|
|
6593
|
+
let v = cn(u, _, n, r, l, t, a);
|
|
6594
|
+
v && (e[o] = F`${v}`.as(o));
|
|
5988
6595
|
}
|
|
5989
6596
|
}
|
|
5990
|
-
function
|
|
6597
|
+
function cn(e, t, n, r, i, a, o) {
|
|
5991
6598
|
let s = e.windowConfig || {}, c = (e, t) => {
|
|
5992
6599
|
if (!a.preAggregationCTEs) return null;
|
|
5993
6600
|
let n = a.preAggregationCTEs.find((t) => t.cube?.name === e);
|
|
5994
|
-
return n && n.cteAlias ?
|
|
6601
|
+
return n && n.cteAlias ? F`${F.identifier(n.cteAlias)}.${F.identifier(t)}` : null;
|
|
5995
6602
|
}, l;
|
|
5996
6603
|
if (s.orderBy && s.orderBy.length > 0) l = s.orderBy.map((e) => {
|
|
5997
6604
|
let a = e.field.includes(".") ? e.field.split(".")[1] : e.field;
|
|
@@ -6048,16 +6655,16 @@ function qt(e, t, n, r, i, a, o) {
|
|
|
6048
6655
|
frame: s.frame
|
|
6049
6656
|
});
|
|
6050
6657
|
if (!d) return null;
|
|
6051
|
-
switch (s.operation ||
|
|
6052
|
-
case "difference": return
|
|
6053
|
-
case "ratio": return
|
|
6054
|
-
case "percentChange": return
|
|
6658
|
+
switch (s.operation || Z.getDefaultWindowOperation(e.type)) {
|
|
6659
|
+
case "difference": return F`${t} - ${d}`;
|
|
6660
|
+
case "ratio": return F`${t} / NULLIF(${d}, 0)`;
|
|
6661
|
+
case "percentChange": return F`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;
|
|
6055
6662
|
default: return d;
|
|
6056
6663
|
}
|
|
6057
6664
|
}
|
|
6058
6665
|
//#endregion
|
|
6059
6666
|
//#region src/server/physical-plan/processors/selection-processor.ts
|
|
6060
|
-
function
|
|
6667
|
+
function ln(e, t, n, r, i) {
|
|
6061
6668
|
let a = { ...i.queryBuilder.buildSelections(e.joinCubes.length > 0 ? r : e.primaryCube, t, n) };
|
|
6062
6669
|
if (e.preAggregationCTEs) for (let o of e.preAggregationCTEs) {
|
|
6063
6670
|
let e = o.cube.name;
|
|
@@ -6065,32 +6672,32 @@ function Jt(e, t, n, r, i) {
|
|
|
6065
6672
|
if (!a[s]) continue;
|
|
6066
6673
|
let [, c] = s.split("."), l = r.get(e);
|
|
6067
6674
|
if (!l?.measures?.[c]) continue;
|
|
6068
|
-
let u = l.measures[c], d =
|
|
6675
|
+
let u = l.measures[c], d = F`${F.identifier(o.cteAlias)}.${F.identifier(c)}`, f;
|
|
6069
6676
|
if (u.type === "calculated" && u.calculatedSql) f = i.queryBuilder.buildCTECalculatedMeasure(u, l, o, r, n);
|
|
6070
6677
|
else {
|
|
6071
|
-
let e = o.cteReason === "fanOutPrevention", n =
|
|
6678
|
+
let e = o.cteReason === "fanOutPrevention", n = un(o, t, r), a = e || n;
|
|
6072
6679
|
switch (u.type) {
|
|
6073
6680
|
case "count":
|
|
6074
6681
|
case "countDistinct":
|
|
6075
6682
|
case "sum":
|
|
6076
|
-
f = a ?
|
|
6683
|
+
f = a ? H(d) : V(d);
|
|
6077
6684
|
break;
|
|
6078
6685
|
case "avg":
|
|
6079
|
-
f = a ?
|
|
6686
|
+
f = a ? H(d) : i.databaseAdapter.buildAvg(d);
|
|
6080
6687
|
break;
|
|
6081
6688
|
case "min":
|
|
6082
|
-
f =
|
|
6689
|
+
f = Ae(d);
|
|
6083
6690
|
break;
|
|
6084
6691
|
case "max":
|
|
6085
|
-
f =
|
|
6692
|
+
f = H(d);
|
|
6086
6693
|
break;
|
|
6087
6694
|
case "number":
|
|
6088
|
-
f =
|
|
6695
|
+
f = H(d);
|
|
6089
6696
|
break;
|
|
6090
|
-
default: f = a ?
|
|
6697
|
+
default: f = a ? H(d) : V(d);
|
|
6091
6698
|
}
|
|
6092
6699
|
}
|
|
6093
|
-
a[s] =
|
|
6700
|
+
a[s] = F`${f}`.as(s);
|
|
6094
6701
|
}
|
|
6095
6702
|
for (let t in a) {
|
|
6096
6703
|
let [n, i] = t.split(".");
|
|
@@ -6102,15 +6709,15 @@ function Jt(e, t, n, r, i) {
|
|
|
6102
6709
|
let e = s.dimensions[i].sql;
|
|
6103
6710
|
u = o.joinKeys.find((t) => t.targetColumnObj === e);
|
|
6104
6711
|
}
|
|
6105
|
-
(u || l && s?.dimensions?.[i]) && (a[t] =
|
|
6712
|
+
(u || l && s?.dimensions?.[i]) && (a[t] = F`${F.identifier(o.cteAlias)}.${F.identifier(i)}`.as(t));
|
|
6106
6713
|
}
|
|
6107
6714
|
}
|
|
6108
|
-
return
|
|
6715
|
+
return sn(a, e, t, n, r, i), a;
|
|
6109
6716
|
}
|
|
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 &&
|
|
6717
|
+
function un(e, t, n) {
|
|
6718
|
+
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 && dn(e.sourceColumnObj, t, n));
|
|
6112
6719
|
}
|
|
6113
|
-
function
|
|
6720
|
+
function dn(e, t, n) {
|
|
6114
6721
|
if (t.dimensions) for (let r of t.dimensions) {
|
|
6115
6722
|
let [t, i] = r.split(".");
|
|
6116
6723
|
if (n.get(t)?.dimensions?.[i]?.sql === e) return !0;
|
|
@@ -6124,7 +6731,7 @@ function Xt(e, t, n) {
|
|
|
6124
6731
|
}
|
|
6125
6732
|
//#endregion
|
|
6126
6733
|
//#region src/server/physical-plan/processors/joins-processor.ts
|
|
6127
|
-
function
|
|
6734
|
+
function fn(e, t, n, r, i, a) {
|
|
6128
6735
|
let o = [], s = t.db.select(r).from(n.from);
|
|
6129
6736
|
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
6737
|
case "left":
|
|
@@ -6155,10 +6762,10 @@ function Zt(e, t, n, r, i, a) {
|
|
|
6155
6762
|
if (t && t.joinKeys.length > 0) {
|
|
6156
6763
|
let e = [];
|
|
6157
6764
|
for (let n of t.joinKeys) {
|
|
6158
|
-
let t =
|
|
6159
|
-
r && e.push(
|
|
6765
|
+
let t = F`${F.identifier(c)}.${F.identifier(n.sourceColumn)}`, r = n.targetColumnObj;
|
|
6766
|
+
r && e.push(L(r, t));
|
|
6160
6767
|
}
|
|
6161
|
-
e.length > 0 && (a =
|
|
6768
|
+
e.length > 0 && (a = R(...e));
|
|
6162
6769
|
}
|
|
6163
6770
|
}
|
|
6164
6771
|
let l = [];
|
|
@@ -6185,19 +6792,19 @@ function Zt(e, t, n, r, i, a) {
|
|
|
6185
6792
|
} catch {}
|
|
6186
6793
|
}
|
|
6187
6794
|
let d, f, p;
|
|
6188
|
-
if (u) d =
|
|
6795
|
+
if (u) d = F`${F.identifier(u)}`, f = a.cteBuilder.buildCTEJoinCondition(n, u, e), p = void 0;
|
|
6189
6796
|
else {
|
|
6190
6797
|
let e = i.downstreamCubeMap.get(n.cube.name), r = n.cube.sql(t);
|
|
6191
6798
|
if (d = r.from, p = r.where, e && !n.junctionTable) {
|
|
6192
6799
|
let t = [];
|
|
6193
6800
|
for (let n of e.joinKeys) {
|
|
6194
|
-
let r =
|
|
6195
|
-
t.push(
|
|
6801
|
+
let r = F`${F.identifier(e.cteAlias)}.${F.identifier(n.sourceColumn)}`, i = n.targetColumnObj || F.identifier(n.targetColumn);
|
|
6802
|
+
t.push(L(r, i));
|
|
6196
6803
|
}
|
|
6197
|
-
f = t.length === 1 ? t[0] :
|
|
6804
|
+
f = t.length === 1 ? t[0] : R(...t);
|
|
6198
6805
|
} else f = n.joinCondition;
|
|
6199
6806
|
}
|
|
6200
|
-
let m = n.joinType || "left", h = m !== "inner" && p ?
|
|
6807
|
+
let m = n.joinType || "left", h = m !== "inner" && p ? R(f, p) : f;
|
|
6201
6808
|
try {
|
|
6202
6809
|
switch (m) {
|
|
6203
6810
|
case "left":
|
|
@@ -6224,7 +6831,7 @@ function Zt(e, t, n, r, i, a) {
|
|
|
6224
6831
|
}
|
|
6225
6832
|
//#endregion
|
|
6226
6833
|
//#region src/server/physical-plan/processors/predicates-processor.ts
|
|
6227
|
-
function
|
|
6834
|
+
function pn(e, t, n, r, i, a, o, s) {
|
|
6228
6835
|
let c = [...o.allWhereConditions];
|
|
6229
6836
|
if (i.where && c.push(i.where), e.joinCubes && e.joinCubes.length > 0) for (let t of e.joinCubes) {
|
|
6230
6837
|
let e = t.cube.name;
|
|
@@ -6236,14 +6843,14 @@ function Qt(e, t, n, r, i, a, o, s) {
|
|
|
6236
6843
|
l.length > 0 && c.push(...l);
|
|
6237
6844
|
let u = o.drizzleQuery;
|
|
6238
6845
|
if (c.length > 0) {
|
|
6239
|
-
let e = c.length === 1 ? c[0] :
|
|
6846
|
+
let e = c.length === 1 ? c[0] : R(...c);
|
|
6240
6847
|
u = u.where(e);
|
|
6241
6848
|
}
|
|
6242
6849
|
let d = s.queryBuilder.buildGroupByFields(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6243
6850
|
d.length > 0 && (u = u.groupBy(...d));
|
|
6244
6851
|
let f = s.queryBuilder.buildHavingConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6245
6852
|
if (f.length > 0) {
|
|
6246
|
-
let e = f.length === 1 ? f[0] :
|
|
6853
|
+
let e = f.length === 1 ? f[0] : R(...f);
|
|
6247
6854
|
u = u.having(e);
|
|
6248
6855
|
}
|
|
6249
6856
|
let p = s.queryBuilder.buildOrderBy(t);
|
|
@@ -6251,14 +6858,14 @@ function Qt(e, t, n, r, i, a, o, s) {
|
|
|
6251
6858
|
}
|
|
6252
6859
|
//#endregion
|
|
6253
6860
|
//#region src/server/physical-plan/processors/shared.ts
|
|
6254
|
-
function
|
|
6861
|
+
function mn(e) {
|
|
6255
6862
|
let t = /* @__PURE__ */ new Map();
|
|
6256
6863
|
if (t.set(e.primaryCube.name, e.primaryCube), e.joinCubes) for (let n of e.joinCubes) t.set(n.cube.name, n.cube);
|
|
6257
6864
|
return t;
|
|
6258
6865
|
}
|
|
6259
6866
|
//#endregion
|
|
6260
6867
|
//#region src/server/physical-plan/drizzle-plan-builder.ts
|
|
6261
|
-
var
|
|
6868
|
+
var hn = class {
|
|
6262
6869
|
constructor(e, t, n) {
|
|
6263
6870
|
this.queryBuilder = e, this.cteBuilder = t, this.databaseAdapter = n;
|
|
6264
6871
|
}
|
|
@@ -6398,13 +7005,13 @@ var en = class {
|
|
|
6398
7005
|
if (i) return i;
|
|
6399
7006
|
let a = this.tryBuildKeysDeduplicationQuery(e, t, n, r);
|
|
6400
7007
|
if (a) return a;
|
|
6401
|
-
let o =
|
|
6402
|
-
return
|
|
7008
|
+
let o = on(e, t, n, r), s = e.primaryCube.sql(n), c = e.joinCubes.length > 0 ? mn(e) : new Map([[e.primaryCube.name, e.primaryCube]]);
|
|
7009
|
+
return pn(e, t, n, c, s, o, fn(e, n, s, ln(e, t, n, c, r), o, r), r);
|
|
6403
7010
|
}
|
|
6404
7011
|
tryBuildKeysDeduplicationQuery(e, t, n, r) {
|
|
6405
7012
|
let i = e.keysDeduplication;
|
|
6406
7013
|
if (!i?.multipliedCubeName || !t.measures?.length) return null;
|
|
6407
|
-
let a = e.joinCubes.length > 0 ?
|
|
7014
|
+
let a = e.joinCubes.length > 0 ? mn(e) : new Map([[e.primaryCube.name, e.primaryCube]]), o = a.get(i.multipliedCubeName);
|
|
6408
7015
|
if (!o || !this.canExecuteKeysDeduplication(t, o, i.multipliedCubeName)) return null;
|
|
6409
7016
|
let s = i.primaryKeyDimensions.length > 0 ? i.primaryKeyDimensions : this.getPrimaryKeyDimensions(o);
|
|
6410
7017
|
if (s.length === 0) return null;
|
|
@@ -6413,20 +7020,20 @@ var en = class {
|
|
|
6413
7020
|
let [t, r] = e.split("."), i = a.get(t), o = i?.dimensions?.[r];
|
|
6414
7021
|
if (!i || !o) return null;
|
|
6415
7022
|
let s = K(o.sql, n);
|
|
6416
|
-
u[e] =
|
|
7023
|
+
u[e] = F`${s}`.as(e), d.push(s);
|
|
6417
7024
|
}
|
|
6418
7025
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
6419
7026
|
let [t, i] = e.dimension.split("."), o = a.get(t), s = o?.dimensions?.[i];
|
|
6420
7027
|
if (!o || !s) return null;
|
|
6421
7028
|
let c = r.queryBuilder.buildTimeDimensionExpression(s.sql, e.granularity, n);
|
|
6422
|
-
u[e.dimension] =
|
|
7029
|
+
u[e.dimension] = F`${c}`.as(e.dimension), d.push(c);
|
|
6423
7030
|
}
|
|
6424
7031
|
let f = [];
|
|
6425
7032
|
for (let e of s) {
|
|
6426
7033
|
let t = o.dimensions?.[e];
|
|
6427
7034
|
if (!t) return null;
|
|
6428
7035
|
let r = K(t.sql, n), i = `__pk__${e}`;
|
|
6429
|
-
u[i] =
|
|
7036
|
+
u[i] = F`${r}`.as(i), d.push(r), f.push(i);
|
|
6430
7037
|
}
|
|
6431
7038
|
let p = i.regularMeasures ?? [], m = new Set(p), h = t.measures.filter((e) => !m.has(e));
|
|
6432
7039
|
if (p.length > 0) {
|
|
@@ -6435,7 +7042,7 @@ var en = class {
|
|
|
6435
7042
|
let n = e.get(t);
|
|
6436
7043
|
if (!n) return null;
|
|
6437
7044
|
let r = `__reg__${t.replace(".", "__")}`;
|
|
6438
|
-
u[r] =
|
|
7045
|
+
u[r] = F`${n()}`.as(r);
|
|
6439
7046
|
}
|
|
6440
7047
|
}
|
|
6441
7048
|
let g = e.primaryCube.sql(n), _ = [];
|
|
@@ -6450,58 +7057,58 @@ var en = class {
|
|
|
6450
7057
|
let e = t.cube.sql(n);
|
|
6451
7058
|
v = this.applyJoinByType(v, t.joinType ?? "left", e.from, t.joinCondition), e.where && _.push(e.where);
|
|
6452
7059
|
}
|
|
6453
|
-
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] :
|
|
7060
|
+
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] : R(..._))), d.length > 0 && (v = v.groupBy(...d));
|
|
6454
7061
|
let y = n.db.$with(c).as(v), b = o.sql(n), x = {}, ee = [];
|
|
6455
7062
|
for (let e of s) {
|
|
6456
7063
|
let t = o.dimensions?.[e];
|
|
6457
7064
|
if (!t) return null;
|
|
6458
7065
|
let r = K(t.sql, n);
|
|
6459
|
-
x[e] =
|
|
7066
|
+
x[e] = F`${r}`.as(e), ee.push(r);
|
|
6460
7067
|
}
|
|
6461
|
-
let
|
|
7068
|
+
let S = /* @__PURE__ */ new Set();
|
|
6462
7069
|
for (let e of h) {
|
|
6463
7070
|
let [, t] = e.split(".");
|
|
6464
|
-
o.measures?.[t]?.type === "avg" &&
|
|
7071
|
+
o.measures?.[t]?.type === "avg" && S.add(t);
|
|
6465
7072
|
}
|
|
6466
|
-
let
|
|
7073
|
+
let C = h.filter((e) => {
|
|
6467
7074
|
let [, t] = e.split(".");
|
|
6468
|
-
return !
|
|
7075
|
+
return !S.has(t);
|
|
6469
7076
|
});
|
|
6470
|
-
if (
|
|
6471
|
-
let e = r.queryBuilder.buildResolvedMeasures(
|
|
6472
|
-
for (let t of
|
|
7077
|
+
if (C.length > 0) {
|
|
7078
|
+
let e = r.queryBuilder.buildResolvedMeasures(C, new Map([[o.name, o]]), n);
|
|
7079
|
+
for (let t of C) {
|
|
6473
7080
|
let [, n] = t.split("."), r = e.get(t);
|
|
6474
|
-
if (!r) return null;
|
|
6475
|
-
x[n] =
|
|
7081
|
+
if (!r || typeof r != "function") return null;
|
|
7082
|
+
x[n] = F`${r()}`.as(n);
|
|
6476
7083
|
}
|
|
6477
7084
|
}
|
|
6478
7085
|
for (let e of h) {
|
|
6479
7086
|
let [, t] = e.split(".");
|
|
6480
|
-
if (!
|
|
7087
|
+
if (!S.has(t)) continue;
|
|
6481
7088
|
let r = o.measures?.[t];
|
|
6482
7089
|
if (!r?.sql) return null;
|
|
6483
7090
|
let i = K(r.sql, n), a = `__avg_sum__${t}`, s = `__avg_count__${t}`;
|
|
6484
|
-
x[a] =
|
|
7091
|
+
x[a] = F`sum(${i})`.as(a), x[s] = F`count(${i})`.as(s);
|
|
6485
7092
|
}
|
|
6486
|
-
let
|
|
6487
|
-
b.where &&
|
|
6488
|
-
let
|
|
6489
|
-
for (let e of t.dimensions ?? [])
|
|
6490
|
-
for (let e of t.timeDimensions ?? [])
|
|
7093
|
+
let w = n.db.select(x).from(b.from), T = [];
|
|
7094
|
+
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))), ee.length > 0 && (w = w.groupBy(...ee));
|
|
7095
|
+
let te = n.db.$with(l).as(w), E = {};
|
|
7096
|
+
for (let e of t.dimensions ?? []) E[e] = F`${F.identifier(c)}.${F.identifier(e)}`.as(e);
|
|
7097
|
+
for (let e of t.timeDimensions ?? []) E[e.dimension] = F`${F.identifier(c)}.${F.identifier(e.dimension)}`.as(e.dimension);
|
|
6491
7098
|
for (let e of h) {
|
|
6492
7099
|
let [, t] = e.split("."), n = o.measures?.[t];
|
|
6493
|
-
|
|
7100
|
+
E[e] = this.buildKeysOuterAggregation(n?.type ?? "sum", l, t, e);
|
|
6494
7101
|
}
|
|
6495
7102
|
for (let e of p) {
|
|
6496
7103
|
let [t, n] = e.split("."), r = a.get(t)?.measures?.[n], i = `__reg__${e.replace(".", "__")}`;
|
|
6497
|
-
|
|
7104
|
+
E[e] = this.buildKeysOuterAggregation(r?.type ?? "sum", c, i, e);
|
|
6498
7105
|
}
|
|
6499
|
-
let
|
|
6500
|
-
|
|
6501
|
-
let
|
|
6502
|
-
|
|
6503
|
-
let
|
|
6504
|
-
return
|
|
7106
|
+
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);
|
|
7107
|
+
D = D.leftJoin(F`${F.identifier(l)}`, ne);
|
|
7108
|
+
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)}`)];
|
|
7109
|
+
k.length > 0 && (D = D.groupBy(...k));
|
|
7110
|
+
let A = r.queryBuilder.buildOrderBy(t, Object.keys(E));
|
|
7111
|
+
return A.length > 0 && (D = D.orderBy(...A)), D = r.queryBuilder.applyLimitAndOffset(D, t), D;
|
|
6505
7112
|
}
|
|
6506
7113
|
tryBuildMultiFactMergeQuery(e, t, n, r) {
|
|
6507
7114
|
let i = e.multiFactMerge;
|
|
@@ -6512,37 +7119,37 @@ var en = class {
|
|
|
6512
7119
|
});
|
|
6513
7120
|
if (s) return this.buildMultiFactUnionKeysFallbackQuery(t, n, r, i, l, o);
|
|
6514
7121
|
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,
|
|
7122
|
+
if (o.length > 0) for (let e of o) f[e] = F`${this.coalesceQualifiedColumn(d, e)}`.as(e);
|
|
7123
|
+
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);
|
|
7124
|
+
let p = n.db.with(...l).select(f).from(F`${F.identifier(u)}`), m = /* @__PURE__ */ new Map();
|
|
7125
|
+
for (let e of o) m.set(e, F`${F.identifier(u)}.${F.identifier(e)}`);
|
|
6519
7126
|
for (let e = 1; e < i.groups.length; e++) {
|
|
6520
7127
|
let t = i.groups[e].alias, n;
|
|
6521
|
-
if (o.length === 0) n =
|
|
7128
|
+
if (o.length === 0) n = F`1 = 1`;
|
|
6522
7129
|
else {
|
|
6523
|
-
let e = o.map((e) =>
|
|
6524
|
-
n = e.length === 1 ? e[0] :
|
|
7130
|
+
let e = o.map((e) => L(m.get(e), F`${F.identifier(t)}.${F.identifier(e)}`));
|
|
7131
|
+
n = e.length === 1 ? e[0] : R(...e);
|
|
6525
7132
|
}
|
|
6526
|
-
if (p = this.applyJoinByType(p, c,
|
|
7133
|
+
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
7134
|
}
|
|
6528
7135
|
let h = r.queryBuilder.buildOrderBy(t, Object.keys(f));
|
|
6529
7136
|
return h.length > 0 && (p = p.orderBy(...h)), r.queryBuilder.applyLimitAndOffset(p, t);
|
|
6530
7137
|
}
|
|
6531
7138
|
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(
|
|
7139
|
+
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 = {};
|
|
7140
|
+
for (let e of a) u[e] = F`${F.identifier(o)}.${F.identifier(e)}`.as(e);
|
|
7141
|
+
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);
|
|
7142
|
+
let d = t.db.with(...i, l).select(u).from(F`${F.identifier(o)}`);
|
|
6536
7143
|
for (let e of r.groups) {
|
|
6537
|
-
let t = a.map((t) =>
|
|
6538
|
-
d = d.leftJoin(
|
|
7144
|
+
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);
|
|
7145
|
+
d = d.leftJoin(F`${F.identifier(e.alias)}`, n);
|
|
6539
7146
|
}
|
|
6540
7147
|
let f = n.queryBuilder.buildOrderBy(e, Object.keys(u));
|
|
6541
7148
|
return f.length > 0 && (d = d.orderBy(...f)), n.queryBuilder.applyLimitAndOffset(d, e);
|
|
6542
7149
|
}
|
|
6543
7150
|
buildSharedKeySelection(e, t) {
|
|
6544
|
-
let n = t.map((t) =>
|
|
6545
|
-
return
|
|
7151
|
+
let n = t.map((t) => F`${F.identifier(e)}.${F.identifier(t)} as ${F.identifier(t)}`);
|
|
7152
|
+
return F.join(n, F`, `);
|
|
6546
7153
|
}
|
|
6547
7154
|
selectRuntimeMergeStrategy(e, t) {
|
|
6548
7155
|
return !t || e === "innerJoin" ? "inner" : e === "leftJoin" ? "left" : this.supportsFullOuterJoin() ? "full" : "left";
|
|
@@ -6552,9 +7159,9 @@ var en = class {
|
|
|
6552
7159
|
return e === "postgres" || e === "duckdb";
|
|
6553
7160
|
}
|
|
6554
7161
|
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 =
|
|
7162
|
+
if (e.length === 1) return F`${F.identifier(e[0])}.${F.identifier(t)}`;
|
|
7163
|
+
let n = e.map((e) => F`${F.identifier(e)}.${F.identifier(t)}`), r = n[0];
|
|
7164
|
+
for (let e = 1; e < n.length; e++) r = F`coalesce(${r}, ${n[e]})`;
|
|
6558
7165
|
return r;
|
|
6559
7166
|
}
|
|
6560
7167
|
canExecuteKeysDeduplication(e, t, n) {
|
|
@@ -6600,10 +7207,10 @@ var en = class {
|
|
|
6600
7207
|
}
|
|
6601
7208
|
buildKeysOuterAggregation(e, t, n, r) {
|
|
6602
7209
|
switch (e) {
|
|
6603
|
-
case "min": return
|
|
6604
|
-
case "max": return
|
|
6605
|
-
case "avg": return
|
|
6606
|
-
default: return
|
|
7210
|
+
case "min": return F`min(${F`${F.identifier(t)}.${F.identifier(n)}`})`.as(r);
|
|
7211
|
+
case "max": return F`max(${F`${F.identifier(t)}.${F.identifier(n)}`})`.as(r);
|
|
7212
|
+
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);
|
|
7213
|
+
default: return F`coalesce(sum(${F`${F.identifier(t)}.${F.identifier(n)}`}), 0)`.as(r);
|
|
6607
7214
|
}
|
|
6608
7215
|
}
|
|
6609
7216
|
applyJoinByType(e, t, n, r) {
|
|
@@ -6614,7 +7221,16 @@ var en = class {
|
|
|
6614
7221
|
default: return e.leftJoin(n, r);
|
|
6615
7222
|
}
|
|
6616
7223
|
}
|
|
6617
|
-
}
|
|
7224
|
+
};
|
|
7225
|
+
//#endregion
|
|
7226
|
+
//#region src/server/executor.ts
|
|
7227
|
+
function Q(e, t) {
|
|
7228
|
+
if (process.env.DC_DEBUG) try {
|
|
7229
|
+
let { sql: n, params: r } = t.toSQL();
|
|
7230
|
+
console.log(`\n[DC_DEBUG] ${e}`), console.log(n), r.length > 0 && console.log("params:", r), console.log();
|
|
7231
|
+
} catch {}
|
|
7232
|
+
}
|
|
7233
|
+
var gn = class {
|
|
6618
7234
|
queryBuilder;
|
|
6619
7235
|
drizzlePlanBuilder;
|
|
6620
7236
|
databaseAdapter;
|
|
@@ -6627,16 +7243,16 @@ var en = class {
|
|
|
6627
7243
|
planOptimiser;
|
|
6628
7244
|
constructor(e, t) {
|
|
6629
7245
|
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
|
|
7246
|
+
this.queryBuilder = new Lt(this.databaseAdapter);
|
|
7247
|
+
let n = new zt(), r = new Bt(this.queryBuilder);
|
|
7248
|
+
this.drizzlePlanBuilder = new hn(this.queryBuilder, r, this.databaseAdapter), this.comparisonQueryBuilder = new Yt(this.databaseAdapter), this.funnelQueryBuilder = new Xt(this.databaseAdapter), this.flowQueryBuilder = new Zt(this.databaseAdapter), this.retentionQueryBuilder = new nn(this.databaseAdapter), this.logicalPlanBuilder = new rn(n), this.planOptimiser = new an(), this.cacheConfig = t;
|
|
6633
7249
|
}
|
|
6634
7250
|
async execute(e, t, n, r) {
|
|
6635
7251
|
try {
|
|
6636
7252
|
let i = this.resolveQueryMode(t);
|
|
6637
7253
|
this.validateQueryForMode(i, e, t);
|
|
6638
7254
|
let a;
|
|
6639
|
-
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) if (a =
|
|
7255
|
+
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) if (a = Ct(t, n, this.cacheConfig), r?.skipCache) this.cacheConfig.onCacheEvent?.({
|
|
6640
7256
|
type: "miss",
|
|
6641
7257
|
key: a,
|
|
6642
7258
|
durationMs: 0
|
|
@@ -6730,13 +7346,15 @@ var en = class {
|
|
|
6730
7346
|
db: this.dbExecutor.db,
|
|
6731
7347
|
schema: this.dbExecutor.schema,
|
|
6732
7348
|
securityContext: n
|
|
6733
|
-
}, o =
|
|
7349
|
+
}, o = this.funnelQueryBuilder.buildFunnelQuery(r, e, a);
|
|
7350
|
+
Q("funnel query", o);
|
|
7351
|
+
let s = await o, c = this.funnelQueryBuilder.transformResult(s, r), l = {
|
|
6734
7352
|
measures: {},
|
|
6735
7353
|
dimensions: {},
|
|
6736
7354
|
segments: {},
|
|
6737
7355
|
timeDimensions: {}
|
|
6738
7356
|
};
|
|
6739
|
-
return
|
|
7357
|
+
return l.funnel = {
|
|
6740
7358
|
config: r,
|
|
6741
7359
|
steps: r.steps.map((e, t) => ({
|
|
6742
7360
|
name: e.name,
|
|
@@ -6744,8 +7362,8 @@ var en = class {
|
|
|
6744
7362
|
timeToConvert: e.timeToConvert
|
|
6745
7363
|
}))
|
|
6746
7364
|
}, {
|
|
6747
|
-
data:
|
|
6748
|
-
annotation:
|
|
7365
|
+
data: c,
|
|
7366
|
+
annotation: l
|
|
6749
7367
|
};
|
|
6750
7368
|
}
|
|
6751
7369
|
async executeFlowQueryWithCache(e, t, n, r) {
|
|
@@ -6762,20 +7380,22 @@ var en = class {
|
|
|
6762
7380
|
db: this.dbExecutor.db,
|
|
6763
7381
|
schema: this.dbExecutor.schema,
|
|
6764
7382
|
securityContext: n
|
|
6765
|
-
}, o =
|
|
7383
|
+
}, o = this.flowQueryBuilder.buildFlowQuery(r, e, a);
|
|
7384
|
+
Q("flow query", o);
|
|
7385
|
+
let s = await o, c = this.flowQueryBuilder.transformResult(s), l = {
|
|
6766
7386
|
measures: {},
|
|
6767
7387
|
dimensions: {},
|
|
6768
7388
|
segments: {},
|
|
6769
7389
|
timeDimensions: {}
|
|
6770
7390
|
};
|
|
6771
|
-
return
|
|
7391
|
+
return l.flow = {
|
|
6772
7392
|
config: r,
|
|
6773
7393
|
startingStep: { name: r.startingStep.name },
|
|
6774
7394
|
stepsBefore: r.stepsBefore,
|
|
6775
7395
|
stepsAfter: r.stepsAfter
|
|
6776
7396
|
}, {
|
|
6777
|
-
data: [
|
|
6778
|
-
annotation:
|
|
7397
|
+
data: [c],
|
|
7398
|
+
annotation: l
|
|
6779
7399
|
};
|
|
6780
7400
|
}
|
|
6781
7401
|
async executeRetentionQueryWithCache(e, t, n, r) {
|
|
@@ -6792,29 +7412,33 @@ var en = class {
|
|
|
6792
7412
|
db: this.dbExecutor.db,
|
|
6793
7413
|
schema: this.dbExecutor.schema,
|
|
6794
7414
|
securityContext: n
|
|
6795
|
-
}, o =
|
|
7415
|
+
}, o = this.retentionQueryBuilder.buildRetentionQuery(r, e, a);
|
|
7416
|
+
Q("retention query", o);
|
|
7417
|
+
let s = await o, c = this.retentionQueryBuilder.transformResult(s, r), l = {
|
|
6796
7418
|
measures: {},
|
|
6797
7419
|
dimensions: {},
|
|
6798
7420
|
segments: {},
|
|
6799
7421
|
timeDimensions: {}
|
|
6800
7422
|
};
|
|
6801
|
-
return
|
|
7423
|
+
return l.retention = {
|
|
6802
7424
|
config: r,
|
|
6803
7425
|
granularity: r.granularity,
|
|
6804
7426
|
periods: r.periods,
|
|
6805
7427
|
retentionType: r.retentionType,
|
|
6806
7428
|
breakdownDimensions: r.breakdownDimensions
|
|
6807
7429
|
}, {
|
|
6808
|
-
data:
|
|
6809
|
-
annotation:
|
|
7430
|
+
data: c,
|
|
7431
|
+
annotation: l
|
|
6810
7432
|
};
|
|
6811
7433
|
}
|
|
6812
7434
|
async executeStandardQuery(e, t, n) {
|
|
6813
7435
|
let r = new q(), i = this.createQueryContext(n, r);
|
|
6814
7436
|
this.preloadFilterCache(t, r, e, i);
|
|
6815
|
-
let { optimisedPlan: a } = this.buildRegularQueryArtifacts(e, t, i), o = this.drizzlePlanBuilder.derivePhysicalPlanContext(a), s = this.drizzlePlanBuilder.build(o, t, i)
|
|
7437
|
+
let { optimisedPlan: a } = this.buildRegularQueryArtifacts(e, t, i), o = this.drizzlePlanBuilder.derivePhysicalPlanContext(a), s = this.drizzlePlanBuilder.build(o, t, i);
|
|
7438
|
+
Q("query", s);
|
|
7439
|
+
let c = this.queryBuilder.collectNumericFields(e, t), l = await this.dbExecutor.execute(s, c);
|
|
6816
7440
|
return {
|
|
6817
|
-
data:
|
|
7441
|
+
data: Jt(Array.isArray(l) ? l.map((e) => {
|
|
6818
7442
|
let n = { ...e };
|
|
6819
7443
|
if (t.timeDimensions) {
|
|
6820
7444
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -6940,7 +7564,7 @@ var en = class {
|
|
|
6940
7564
|
}
|
|
6941
7565
|
validateQueryForMode(e, t, n) {
|
|
6942
7566
|
let r = () => {
|
|
6943
|
-
let e =
|
|
7567
|
+
let e = yn(t, n);
|
|
6944
7568
|
if (!e.isValid) throw Error(`Query validation failed: ${e.errors.join(", ")}`);
|
|
6945
7569
|
};
|
|
6946
7570
|
({
|
|
@@ -6958,7 +7582,7 @@ var en = class {
|
|
|
6958
7582
|
let e = this.retentionQueryBuilder.validateConfig(n.retention, t);
|
|
6959
7583
|
if (!e.isValid) throw Error(`Retention validation failed: ${e.errors.join(", ")}`);
|
|
6960
7584
|
}
|
|
6961
|
-
})[e]();
|
|
7585
|
+
})[vt(e)]();
|
|
6962
7586
|
}
|
|
6963
7587
|
async executeQueryByModeWithCache(e, t, n, r, i) {
|
|
6964
7588
|
return {
|
|
@@ -6967,15 +7591,17 @@ var en = class {
|
|
|
6967
7591
|
funnel: () => this.executeFunnelQueryWithCache(t, n, r, i),
|
|
6968
7592
|
flow: () => this.executeFlowQueryWithCache(t, n, r, i),
|
|
6969
7593
|
retention: () => this.executeRetentionQueryWithCache(t, n, r, i)
|
|
6970
|
-
}[e]();
|
|
7594
|
+
}[vt(e)]();
|
|
6971
7595
|
}
|
|
6972
7596
|
async executeRegularQueryWithCache(e, t, n, r) {
|
|
6973
7597
|
let i = new q(), a = this.createQueryContext(n, i);
|
|
6974
7598
|
this.preloadFilterCache(t, i, e, a);
|
|
6975
7599
|
let { optimisedPlan: o } = this.buildRegularQueryArtifacts(e, t, a), s = this.drizzlePlanBuilder.derivePhysicalPlanContext(o);
|
|
6976
7600
|
this.validateSecurityContext(s, a);
|
|
6977
|
-
let c = this.drizzlePlanBuilder.build(s, t, a)
|
|
6978
|
-
|
|
7601
|
+
let c = this.drizzlePlanBuilder.build(s, t, a);
|
|
7602
|
+
Q("query", c);
|
|
7603
|
+
let l = this.queryBuilder.collectNumericFields(e, t), u = await this.dbExecutor.execute(c, l), d = {
|
|
7604
|
+
data: Jt(Array.isArray(u) ? u.map((e) => {
|
|
6979
7605
|
let n = { ...e };
|
|
6980
7606
|
if (t.timeDimensions) {
|
|
6981
7607
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -7013,7 +7639,7 @@ var en = class {
|
|
|
7013
7639
|
funnel: () => this.dryRunFunnel(t, n, r),
|
|
7014
7640
|
flow: () => this.dryRunFlow(t, n, r),
|
|
7015
7641
|
retention: () => this.dryRunRetention(t, n, r)
|
|
7016
|
-
}[e]();
|
|
7642
|
+
}[vt(e)]();
|
|
7017
7643
|
}
|
|
7018
7644
|
async generateComparisonSQL(e, t, n) {
|
|
7019
7645
|
let r = this.buildComparisonExecutionPlan(t).periodQueries[0];
|
|
@@ -7065,9 +7691,9 @@ var en = class {
|
|
|
7065
7691
|
}
|
|
7066
7692
|
preloadFilterCache(e, t, n, r) {
|
|
7067
7693
|
if (e.filters && e.filters.length > 0) {
|
|
7068
|
-
let i =
|
|
7694
|
+
let i = St(e.filters);
|
|
7069
7695
|
for (let e of i) {
|
|
7070
|
-
let i =
|
|
7696
|
+
let i = bt(e);
|
|
7071
7697
|
if (t.has(i)) continue;
|
|
7072
7698
|
let [a, o] = e.member.split("."), s = n.get(a);
|
|
7073
7699
|
if (!s) continue;
|
|
@@ -7083,7 +7709,7 @@ var en = class {
|
|
|
7083
7709
|
}
|
|
7084
7710
|
if (e.timeDimensions) {
|
|
7085
7711
|
for (let i of e.timeDimensions) if (i.dateRange) {
|
|
7086
|
-
let e =
|
|
7712
|
+
let e = xt(i.dimension, i.dateRange);
|
|
7087
7713
|
if (t.has(e)) continue;
|
|
7088
7714
|
let [a, o] = i.dimension.split("."), s = n.get(a);
|
|
7089
7715
|
if (!s) continue;
|
|
@@ -7094,13 +7720,13 @@ var en = class {
|
|
|
7094
7720
|
}
|
|
7095
7721
|
}
|
|
7096
7722
|
}
|
|
7097
|
-
},
|
|
7723
|
+
}, _n = class e {
|
|
7098
7724
|
cubes = /* @__PURE__ */ new Map();
|
|
7099
7725
|
dbExecutor;
|
|
7100
7726
|
metadataCache;
|
|
7101
7727
|
cacheConfig;
|
|
7102
7728
|
constructor(e) {
|
|
7103
|
-
e?.databaseExecutor ? this.dbExecutor = e.databaseExecutor : e?.drizzle && (this.dbExecutor =
|
|
7729
|
+
e?.databaseExecutor ? this.dbExecutor = e.databaseExecutor : e?.drizzle && (this.dbExecutor = mt(e.drizzle, e.schema, e.engineType)), this.cacheConfig = e?.cache;
|
|
7104
7730
|
}
|
|
7105
7731
|
setDatabaseExecutor(e) {
|
|
7106
7732
|
this.dbExecutor = e;
|
|
@@ -7109,7 +7735,7 @@ var en = class {
|
|
|
7109
7735
|
return this.dbExecutor?.getEngineType();
|
|
7110
7736
|
}
|
|
7111
7737
|
setDrizzle(e, t, n) {
|
|
7112
|
-
this.dbExecutor =
|
|
7738
|
+
this.dbExecutor = mt(e, t, n);
|
|
7113
7739
|
}
|
|
7114
7740
|
hasExecutor() {
|
|
7115
7741
|
return !!this.dbExecutor;
|
|
@@ -7119,7 +7745,7 @@ var en = class {
|
|
|
7119
7745
|
return this.dbExecutor;
|
|
7120
7746
|
}
|
|
7121
7747
|
createQueryExecutor(e = !1) {
|
|
7122
|
-
return new
|
|
7748
|
+
return new gn(this.requireExecutor(), e ? this.cacheConfig : void 0);
|
|
7123
7749
|
}
|
|
7124
7750
|
formatSqlResult(e) {
|
|
7125
7751
|
let t = this.requireExecutor().getEngineType();
|
|
@@ -7129,7 +7755,7 @@ var en = class {
|
|
|
7129
7755
|
};
|
|
7130
7756
|
}
|
|
7131
7757
|
registerCube(e) {
|
|
7132
|
-
this.validateCalculatedMeasures(e), new
|
|
7758
|
+
this.validateCalculatedMeasures(e), new X(this.cubes).populateDependencies(e), this.cubes.set(e.name, e), this.invalidateMetadataCache();
|
|
7133
7759
|
}
|
|
7134
7760
|
validateCubeReferences() {
|
|
7135
7761
|
let e = [];
|
|
@@ -7143,14 +7769,14 @@ var en = class {
|
|
|
7143
7769
|
t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);
|
|
7144
7770
|
continue;
|
|
7145
7771
|
}
|
|
7146
|
-
let i =
|
|
7772
|
+
let i = Pt(r.calculatedSql);
|
|
7147
7773
|
if (!i.isValid) {
|
|
7148
7774
|
t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(", ")}`);
|
|
7149
7775
|
continue;
|
|
7150
7776
|
}
|
|
7151
7777
|
let a = new Map(this.cubes);
|
|
7152
7778
|
a.set(e.name, e);
|
|
7153
|
-
let o = new
|
|
7779
|
+
let o = new X(a);
|
|
7154
7780
|
try {
|
|
7155
7781
|
o.validateDependencies(e);
|
|
7156
7782
|
} catch (e) {
|
|
@@ -7160,7 +7786,7 @@ var en = class {
|
|
|
7160
7786
|
if (t.length === 0) {
|
|
7161
7787
|
let n = new Map(this.cubes);
|
|
7162
7788
|
n.set(e.name, e);
|
|
7163
|
-
let r = new
|
|
7789
|
+
let r = new X(n);
|
|
7164
7790
|
r.buildGraph(e);
|
|
7165
7791
|
let i = r.detectCycle();
|
|
7166
7792
|
i && t.push(`Circular dependency detected in calculated measures: ${i.join(" -> ")}`);
|
|
@@ -7313,18 +7939,18 @@ var en = class {
|
|
|
7313
7939
|
return Array.from(this.cubes.keys());
|
|
7314
7940
|
}
|
|
7315
7941
|
validateQuery(e) {
|
|
7316
|
-
return
|
|
7942
|
+
return yn(this.cubes, e);
|
|
7317
7943
|
}
|
|
7318
7944
|
analyzeQuery(e, t) {
|
|
7319
7945
|
return this.createQueryExecutor(!0).analyzeQuery(this.cubes, e, t);
|
|
7320
7946
|
}
|
|
7321
7947
|
};
|
|
7322
|
-
function
|
|
7948
|
+
function vn(e) {
|
|
7323
7949
|
let t = [];
|
|
7324
7950
|
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
7951
|
}
|
|
7326
|
-
function
|
|
7327
|
-
let n = [], r =
|
|
7952
|
+
function yn(e, t) {
|
|
7953
|
+
let n = [], r = vn(t);
|
|
7328
7954
|
if (r.length > 1) return n.push(`Query contains multiple query modes: ${r.join(", ")}`), {
|
|
7329
7955
|
isValid: !1,
|
|
7330
7956
|
errors: n
|
|
@@ -7345,7 +7971,7 @@ function an(e, t) {
|
|
|
7345
7971
|
}
|
|
7346
7972
|
},
|
|
7347
7973
|
retention: () => {
|
|
7348
|
-
let r = t.retention, i =
|
|
7974
|
+
let r = t.retention, i = xn(r.timeDimension);
|
|
7349
7975
|
i && !e.has(i) && n.push(`Retention cube not found: ${i}`);
|
|
7350
7976
|
let a = r.bindingKey;
|
|
7351
7977
|
if (typeof a == "string") {
|
|
@@ -7411,16 +8037,16 @@ function an(e, t) {
|
|
|
7411
8037
|
}
|
|
7412
8038
|
o.dimensions[i] || n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`);
|
|
7413
8039
|
}
|
|
7414
|
-
if (t.filters) for (let r of t.filters)
|
|
8040
|
+
if (t.filters) for (let r of t.filters) bn(r, e, n, a);
|
|
7415
8041
|
return a.size === 0 && n.push("Query must reference at least one cube through measures, dimensions, or filters"), {
|
|
7416
8042
|
isValid: n.length === 0,
|
|
7417
8043
|
errors: n
|
|
7418
8044
|
};
|
|
7419
8045
|
}
|
|
7420
|
-
function
|
|
8046
|
+
function bn(e, t, n, r) {
|
|
7421
8047
|
if ("and" in e || "or" in e) {
|
|
7422
8048
|
let i = e.and || e.or || [];
|
|
7423
|
-
for (let e of i)
|
|
8049
|
+
for (let e of i) bn(e, t, n, r);
|
|
7424
8050
|
return;
|
|
7425
8051
|
}
|
|
7426
8052
|
if (!("member" in e)) {
|
|
@@ -7443,7 +8069,7 @@ function on(e, t, n, r) {
|
|
|
7443
8069
|
n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`);
|
|
7444
8070
|
}
|
|
7445
8071
|
}
|
|
7446
|
-
function
|
|
8072
|
+
function xn(e) {
|
|
7447
8073
|
if (typeof e == "string") {
|
|
7448
8074
|
let [t] = e.split(".");
|
|
7449
8075
|
return t || null;
|
|
@@ -7452,31 +8078,31 @@ function sn(e) {
|
|
|
7452
8078
|
}
|
|
7453
8079
|
//#endregion
|
|
7454
8080
|
//#region src/adapters/mcp-transport.ts
|
|
7455
|
-
var
|
|
8081
|
+
var Sn = [
|
|
7456
8082
|
"2025-11-25",
|
|
7457
8083
|
"2025-06-18",
|
|
7458
8084
|
"2025-03-26"
|
|
7459
|
-
],
|
|
7460
|
-
function
|
|
7461
|
-
let t =
|
|
8085
|
+
], Cn = "2025-11-25";
|
|
8086
|
+
function wn(e) {
|
|
8087
|
+
let t = Pn(e["mcp-protocol-version"]) || "2025-11-25";
|
|
7462
8088
|
return {
|
|
7463
|
-
ok:
|
|
7464
|
-
negotiated:
|
|
7465
|
-
supported:
|
|
8089
|
+
ok: Sn.includes(t),
|
|
8090
|
+
negotiated: Sn.includes(t) ? t : null,
|
|
8091
|
+
supported: Sn
|
|
7466
8092
|
};
|
|
7467
8093
|
}
|
|
7468
|
-
function
|
|
8094
|
+
function Tn(e) {
|
|
7469
8095
|
if (!e) return !1;
|
|
7470
8096
|
let t = e.split(",").map((e) => e.trim().toLowerCase()), n = t.includes("text/event-stream"), r = t.includes("application/json");
|
|
7471
8097
|
return n && !r;
|
|
7472
8098
|
}
|
|
7473
|
-
var
|
|
7474
|
-
function
|
|
8099
|
+
var En = "mcp-session-id";
|
|
8100
|
+
function Dn(e) {
|
|
7475
8101
|
if (!e) return !1;
|
|
7476
8102
|
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
8103
|
return n && r;
|
|
7478
8104
|
}
|
|
7479
|
-
function
|
|
8105
|
+
function On(e, t = {}) {
|
|
7480
8106
|
let { allowMissingOrigin: n = !0, allowedOrigins: r } = t;
|
|
7481
8107
|
if (!e) return n ? { valid: !0 } : {
|
|
7482
8108
|
valid: !1,
|
|
@@ -7503,11 +8129,11 @@ function mn(e, t = {}) {
|
|
|
7503
8129
|
reason: "Origin not in allowed list"
|
|
7504
8130
|
};
|
|
7505
8131
|
}
|
|
7506
|
-
function
|
|
8132
|
+
function kn(e, t, n) {
|
|
7507
8133
|
let r = [];
|
|
7508
8134
|
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
8135
|
}
|
|
7510
|
-
function
|
|
8136
|
+
function An(e, t, n, r) {
|
|
7511
8137
|
return {
|
|
7512
8138
|
jsonrpc: "2.0",
|
|
7513
8139
|
id: e ?? null,
|
|
@@ -7518,14 +8144,14 @@ function gn(e, t, n, r) {
|
|
|
7518
8144
|
}
|
|
7519
8145
|
};
|
|
7520
8146
|
}
|
|
7521
|
-
function
|
|
8147
|
+
function jn(e, t) {
|
|
7522
8148
|
return {
|
|
7523
8149
|
jsonrpc: "2.0",
|
|
7524
8150
|
id: e ?? null,
|
|
7525
8151
|
result: t
|
|
7526
8152
|
};
|
|
7527
8153
|
}
|
|
7528
|
-
function
|
|
8154
|
+
function Mn(e) {
|
|
7529
8155
|
if (!e || typeof e != "object") return null;
|
|
7530
8156
|
let t = e;
|
|
7531
8157
|
return t.jsonrpc !== "2.0" || typeof t.method != "string" ? null : {
|
|
@@ -7535,12 +8161,12 @@ function vn(e) {
|
|
|
7535
8161
|
params: t.params
|
|
7536
8162
|
};
|
|
7537
8163
|
}
|
|
7538
|
-
async function
|
|
7539
|
-
let { semanticLayer: o, extractSecurityContext: s, rawRequest: c, rawResponse: l } = a, u = a.prompts ??
|
|
8164
|
+
async function Nn(e, i, a) {
|
|
8165
|
+
let { semanticLayer: o, extractSecurityContext: s, rawRequest: c, rawResponse: l } = a, u = a.prompts ?? Bn, d = a.resources ?? Vn;
|
|
7540
8166
|
switch (e) {
|
|
7541
8167
|
case "initialize": {
|
|
7542
8168
|
let e = i?.protocolVersion, t;
|
|
7543
|
-
return t = e &&
|
|
8169
|
+
return t = e && Sn.includes(e) ? e : Cn, {
|
|
7544
8170
|
protocolVersion: t,
|
|
7545
8171
|
capabilities: {
|
|
7546
8172
|
tools: { listChanged: !1 },
|
|
@@ -7548,7 +8174,7 @@ async function yn(e, i, a) {
|
|
|
7548
8174
|
prompts: { listChanged: !1 },
|
|
7549
8175
|
sampling: {}
|
|
7550
8176
|
},
|
|
7551
|
-
sessionId:
|
|
8177
|
+
sessionId: In(),
|
|
7552
8178
|
serverInfo: {
|
|
7553
8179
|
name: "drizzle-cube",
|
|
7554
8180
|
version: typeof process < "u" ? process.env?.npm_package_version || "dev" : "worker"
|
|
@@ -7557,11 +8183,11 @@ async function yn(e, i, a) {
|
|
|
7557
8183
|
}
|
|
7558
8184
|
case "list_tools":
|
|
7559
8185
|
case "tools/list": return {
|
|
7560
|
-
tools:
|
|
8186
|
+
tools: Ln(),
|
|
7561
8187
|
nextCursor: ""
|
|
7562
8188
|
};
|
|
7563
8189
|
case "call_tool":
|
|
7564
|
-
case "tools/call": return
|
|
8190
|
+
case "tools/call": return Rn(i, a);
|
|
7565
8191
|
case "resources/list": return {
|
|
7566
8192
|
resources: d.map(({ uri: e, name: t, description: n, mimeType: r }) => ({
|
|
7567
8193
|
uri: e,
|
|
@@ -7620,16 +8246,16 @@ function $(e, t, n) {
|
|
|
7620
8246
|
let r = Error(t);
|
|
7621
8247
|
return r.code = e, n !== void 0 && (r.data = n), r;
|
|
7622
8248
|
}
|
|
7623
|
-
function
|
|
8249
|
+
function Pn(e) {
|
|
7624
8250
|
return e ? Array.isArray(e) ? e[0] || null : e : null;
|
|
7625
8251
|
}
|
|
7626
|
-
function
|
|
8252
|
+
function Fn(e) {
|
|
7627
8253
|
return e.id === void 0 || e.id === null;
|
|
7628
8254
|
}
|
|
7629
|
-
function
|
|
8255
|
+
function In() {
|
|
7630
8256
|
return `evt-${e()}`;
|
|
7631
8257
|
}
|
|
7632
|
-
function
|
|
8258
|
+
function Ln() {
|
|
7633
8259
|
return [
|
|
7634
8260
|
{
|
|
7635
8261
|
name: "discover",
|
|
@@ -7682,26 +8308,26 @@ function Cn() {
|
|
|
7682
8308
|
}
|
|
7683
8309
|
];
|
|
7684
8310
|
}
|
|
7685
|
-
async function
|
|
8311
|
+
async function Rn(e, i) {
|
|
7686
8312
|
let { semanticLayer: a, extractSecurityContext: o, rawRequest: s, rawResponse: c } = i, l = e || {};
|
|
7687
8313
|
if (!l.name) throw $(-32602, "name is required for tools/call");
|
|
7688
8314
|
let u = l.arguments;
|
|
7689
8315
|
switch (l.name) {
|
|
7690
|
-
case "discover": return
|
|
8316
|
+
case "discover": return zn(await t(a, u || {}));
|
|
7691
8317
|
case "validate": {
|
|
7692
8318
|
let e = u || {};
|
|
7693
8319
|
if (!e.query) throw $(-32602, "query is required");
|
|
7694
|
-
return
|
|
8320
|
+
return zn(await n(a, e));
|
|
7695
8321
|
}
|
|
7696
8322
|
case "load": {
|
|
7697
8323
|
let e = u || {};
|
|
7698
8324
|
if (!e.query) throw $(-32602, "query is required");
|
|
7699
|
-
return
|
|
8325
|
+
return zn(await r(a, await o(s, c), e));
|
|
7700
8326
|
}
|
|
7701
8327
|
default: throw $(-32601, `Unknown tool: ${l.name}`);
|
|
7702
8328
|
}
|
|
7703
8329
|
}
|
|
7704
|
-
function
|
|
8330
|
+
function zn(e) {
|
|
7705
8331
|
return {
|
|
7706
8332
|
content: [{
|
|
7707
8333
|
type: "text",
|
|
@@ -7710,7 +8336,7 @@ function Tn(e) {
|
|
|
7710
8336
|
isError: !1
|
|
7711
8337
|
};
|
|
7712
8338
|
}
|
|
7713
|
-
var
|
|
8339
|
+
var Bn = a(), Vn = [{
|
|
7714
8340
|
uri: "drizzle-cube://quickstart",
|
|
7715
8341
|
name: "Drizzle Cube MCP Quickstart",
|
|
7716
8342
|
description: "Minimal guide for using discover/suggest/validate/load",
|
|
@@ -7811,11 +8437,11 @@ var En = a(), Dn = [{
|
|
|
7811
8437
|
"- Both can be combined: inDateRange filter + timeDimensions granularity."
|
|
7812
8438
|
].join("\n")
|
|
7813
8439
|
}];
|
|
7814
|
-
function
|
|
7815
|
-
return
|
|
8440
|
+
function Hn() {
|
|
8441
|
+
return Vn;
|
|
7816
8442
|
}
|
|
7817
|
-
function
|
|
7818
|
-
return
|
|
8443
|
+
function Un() {
|
|
8444
|
+
return Bn;
|
|
7819
8445
|
}
|
|
7820
8446
|
//#endregion
|
|
7821
|
-
export {
|
|
8447
|
+
export { Un as a, wn as c, kn as d, Dn as f, _n as h, Nn as i, Mn as l, Tn as m, An as n, Hn as o, On as p, jn as r, Fn as s, En as t, In as u };
|