drizzle-cube 0.4.51 → 0.4.52
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/compiler-Bbsijr3W.cjs +198 -0
- package/dist/adapters/{compiler-BXfrvebp.js → compiler-D_o2IzHn.js} +892 -891
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +1 -1
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +1 -1
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +1 -1
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +1 -1
- package/dist/server/index.cjs +37 -37
- package/dist/server/index.js +892 -891
- package/package.json +1 -1
- package/dist/adapters/compiler-CPE-YZfe.cjs +0 -198
|
@@ -121,7 +121,7 @@ var x = class {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
static [t] = "SQL";
|
|
124
|
-
decoder =
|
|
124
|
+
decoder = T;
|
|
125
125
|
shouldInlineParams = !1;
|
|
126
126
|
usedTables = [];
|
|
127
127
|
append(e) {
|
|
@@ -182,15 +182,15 @@ var x = class {
|
|
|
182
182
|
params: []
|
|
183
183
|
};
|
|
184
184
|
}
|
|
185
|
-
if (n(t,
|
|
185
|
+
if (n(t, j)) {
|
|
186
186
|
let e = t[l].schema, n = t[l].name;
|
|
187
187
|
return {
|
|
188
188
|
sql: e === void 0 || t[l].isAlias ? u(n) : u(e) + "." + u(n),
|
|
189
189
|
params: []
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
|
-
if (n(t,
|
|
193
|
-
if (n(t.value,
|
|
192
|
+
if (n(t, D)) {
|
|
193
|
+
if (n(t.value, k)) return {
|
|
194
194
|
sql: d(m.value++, t),
|
|
195
195
|
params: [t],
|
|
196
196
|
typings: ["none"]
|
|
@@ -208,7 +208,7 @@ var x = class {
|
|
|
208
208
|
typings: i
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
|
-
return n(t,
|
|
211
|
+
return n(t, k) ? {
|
|
212
212
|
sql: d(m.value++, t),
|
|
213
213
|
params: [t],
|
|
214
214
|
typings: ["none"]
|
|
@@ -278,16 +278,16 @@ var x = class {
|
|
|
278
278
|
return new S([this]);
|
|
279
279
|
}
|
|
280
280
|
};
|
|
281
|
-
function
|
|
281
|
+
function w(e) {
|
|
282
282
|
return typeof e == "object" && !!e && "mapToDriverValue" in e && typeof e.mapToDriverValue == "function";
|
|
283
283
|
}
|
|
284
|
-
var
|
|
284
|
+
var T = { mapFromDriverValue: (e) => e }, E = { mapToDriverValue: (e) => e };
|
|
285
285
|
({
|
|
286
|
-
...
|
|
287
|
-
...
|
|
286
|
+
...T,
|
|
287
|
+
...E
|
|
288
288
|
});
|
|
289
|
-
var
|
|
290
|
-
constructor(e, t =
|
|
289
|
+
var D = class {
|
|
290
|
+
constructor(e, t = E) {
|
|
291
291
|
this.value = e, this.encoder = t;
|
|
292
292
|
}
|
|
293
293
|
static [t] = "Param";
|
|
@@ -296,7 +296,7 @@ var E = class {
|
|
|
296
296
|
return new S([this]);
|
|
297
297
|
}
|
|
298
298
|
};
|
|
299
|
-
function
|
|
299
|
+
function O(e, ...t) {
|
|
300
300
|
let n = [];
|
|
301
301
|
(t.length > 0 || e.length > 0 && e[0] !== "") && n.push(new x(e[0]));
|
|
302
302
|
for (let [r, i] of t.entries()) n.push(i, new x(e[r + 1]));
|
|
@@ -326,14 +326,14 @@ function D(e, ...t) {
|
|
|
326
326
|
}
|
|
327
327
|
e.identifier = a;
|
|
328
328
|
function o(e) {
|
|
329
|
-
return new
|
|
329
|
+
return new k(e);
|
|
330
330
|
}
|
|
331
331
|
e.placeholder = o;
|
|
332
332
|
function s(e, t) {
|
|
333
|
-
return new
|
|
333
|
+
return new D(e, t);
|
|
334
334
|
}
|
|
335
335
|
e.param = s;
|
|
336
|
-
})(
|
|
336
|
+
})(O ||= {}), ((e) => {
|
|
337
337
|
class n {
|
|
338
338
|
constructor(e, t) {
|
|
339
339
|
this.sql = e, this.fieldAlias = t;
|
|
@@ -349,7 +349,7 @@ function D(e, ...t) {
|
|
|
349
349
|
}
|
|
350
350
|
e.Aliased = n;
|
|
351
351
|
})(S ||= {});
|
|
352
|
-
var
|
|
352
|
+
var k = class {
|
|
353
353
|
constructor(e) {
|
|
354
354
|
this.name = e;
|
|
355
355
|
}
|
|
@@ -357,10 +357,10 @@ var O = class {
|
|
|
357
357
|
getSQL() {
|
|
358
358
|
return new S([this]);
|
|
359
359
|
}
|
|
360
|
-
},
|
|
360
|
+
}, A = Symbol.for("drizzle:IsDrizzleView"), j = class {
|
|
361
361
|
static [t] = "View";
|
|
362
362
|
[l];
|
|
363
|
-
[
|
|
363
|
+
[A] = !0;
|
|
364
364
|
constructor({ name: e, schema: t, selectedFields: n, query: r }) {
|
|
365
365
|
this[l] = {
|
|
366
366
|
name: e,
|
|
@@ -385,84 +385,84 @@ r.prototype.getSQL = function() {
|
|
|
385
385
|
};
|
|
386
386
|
//#endregion
|
|
387
387
|
//#region node_modules/drizzle-orm/sql/expressions/conditions.js
|
|
388
|
-
function
|
|
389
|
-
return
|
|
388
|
+
function M(e, t) {
|
|
389
|
+
return w(t) && !y(e) && !n(e, D) && !n(e, k) && !n(e, r) && !n(e, v) && !n(e, j) ? new D(e, t) : e;
|
|
390
390
|
}
|
|
391
|
-
var
|
|
392
|
-
function
|
|
391
|
+
var N = (e, t) => O`${e} = ${M(t, e)}`, P = (e, t) => O`${e} <> ${M(t, e)}`;
|
|
392
|
+
function F(...e) {
|
|
393
393
|
let t = e.filter((e) => e !== void 0);
|
|
394
394
|
if (t.length !== 0) return t.length === 1 ? new S(t) : new S([
|
|
395
395
|
new x("("),
|
|
396
|
-
|
|
396
|
+
O.join(t, new x(" and ")),
|
|
397
397
|
new x(")")
|
|
398
398
|
]);
|
|
399
399
|
}
|
|
400
|
-
function
|
|
400
|
+
function I(...e) {
|
|
401
401
|
let t = e.filter((e) => e !== void 0);
|
|
402
402
|
if (t.length !== 0) return t.length === 1 ? new S(t) : new S([
|
|
403
403
|
new x("("),
|
|
404
|
-
|
|
404
|
+
O.join(t, new x(" or ")),
|
|
405
405
|
new x(")")
|
|
406
406
|
]);
|
|
407
407
|
}
|
|
408
|
-
var
|
|
408
|
+
var ee = (e, t) => O`${e} > ${M(t, e)}`, L = (e, t) => O`${e} >= ${M(t, e)}`, te = (e, t) => O`${e} < ${M(t, e)}`, R = (e, t) => O`${e} <= ${M(t, e)}`;
|
|
409
|
+
function ne(e, t) {
|
|
410
|
+
return Array.isArray(t) ? t.length === 0 ? O`false` : O`${e} in ${t.map((t) => M(t, e))}` : O`${e} in ${M(t, e)}`;
|
|
411
|
+
}
|
|
409
412
|
function re(e, t) {
|
|
410
|
-
return Array.isArray(t) ? t.length === 0 ?
|
|
413
|
+
return Array.isArray(t) ? t.length === 0 ? O`true` : O`${e} not in ${t.map((t) => M(t, e))}` : O`${e} not in ${M(t, e)}`;
|
|
411
414
|
}
|
|
412
|
-
function ie(e
|
|
413
|
-
return
|
|
415
|
+
function ie(e) {
|
|
416
|
+
return O`${e} is null`;
|
|
414
417
|
}
|
|
415
418
|
function ae(e) {
|
|
416
|
-
return
|
|
417
|
-
}
|
|
418
|
-
function oe(e) {
|
|
419
|
-
return D`${e} is not null`;
|
|
419
|
+
return O`${e} is not null`;
|
|
420
420
|
}
|
|
421
|
-
function
|
|
421
|
+
function oe(e, t) {
|
|
422
422
|
if (Array.isArray(t)) {
|
|
423
423
|
if (t.length === 0) throw Error("arrayContains requires at least one value");
|
|
424
|
-
return
|
|
424
|
+
return O`${e} @> ${O`${M(t, e)}`}`;
|
|
425
425
|
}
|
|
426
|
-
return
|
|
426
|
+
return O`${e} @> ${M(t, e)}`;
|
|
427
427
|
}
|
|
428
|
-
function
|
|
428
|
+
function se(e, t) {
|
|
429
429
|
if (Array.isArray(t)) {
|
|
430
430
|
if (t.length === 0) throw Error("arrayContained requires at least one value");
|
|
431
|
-
return
|
|
431
|
+
return O`${e} <@ ${O`${M(t, e)}`}`;
|
|
432
432
|
}
|
|
433
|
-
return
|
|
433
|
+
return O`${e} <@ ${M(t, e)}`;
|
|
434
434
|
}
|
|
435
|
-
function
|
|
435
|
+
function ce(e, t) {
|
|
436
436
|
if (Array.isArray(t)) {
|
|
437
437
|
if (t.length === 0) throw Error("arrayOverlaps requires at least one value");
|
|
438
|
-
return
|
|
438
|
+
return O`${e} && ${O`${M(t, e)}`}`;
|
|
439
439
|
}
|
|
440
|
-
return
|
|
440
|
+
return O`${e} && ${M(t, e)}`;
|
|
441
441
|
}
|
|
442
442
|
//#endregion
|
|
443
443
|
//#region node_modules/drizzle-orm/sql/expressions/select.js
|
|
444
|
-
function
|
|
445
|
-
return
|
|
444
|
+
function le(e) {
|
|
445
|
+
return O`${e} asc`;
|
|
446
446
|
}
|
|
447
|
-
function
|
|
448
|
-
return
|
|
447
|
+
function ue(e) {
|
|
448
|
+
return O`${e} desc`;
|
|
449
449
|
}
|
|
450
450
|
//#endregion
|
|
451
451
|
//#region node_modules/drizzle-orm/sql/functions/aggregate.js
|
|
452
|
-
function
|
|
453
|
-
return
|
|
454
|
-
}
|
|
455
|
-
function pe(e) {
|
|
456
|
-
return D`count(distinct ${e})`.mapWith(Number);
|
|
452
|
+
function de(e) {
|
|
453
|
+
return O`count(${e || O.raw("*")})`.mapWith(Number);
|
|
457
454
|
}
|
|
458
|
-
function
|
|
459
|
-
return
|
|
455
|
+
function fe(e) {
|
|
456
|
+
return O`count(distinct ${e})`.mapWith(Number);
|
|
460
457
|
}
|
|
461
458
|
function z(e) {
|
|
462
|
-
return
|
|
459
|
+
return O`sum(${e})`.mapWith(String);
|
|
463
460
|
}
|
|
464
461
|
function B(e) {
|
|
465
|
-
return
|
|
462
|
+
return O`max(${e})`.mapWith(n(e, r) ? e : String);
|
|
463
|
+
}
|
|
464
|
+
function pe(e) {
|
|
465
|
+
return O`min(${e})`.mapWith(n(e, r) ? e : String);
|
|
466
466
|
}
|
|
467
467
|
//#endregion
|
|
468
468
|
//#region src/server/adapters/base-adapter.ts
|
|
@@ -506,73 +506,73 @@ var V = class {
|
|
|
506
506
|
let t = this.parseISODuration(e), n = [];
|
|
507
507
|
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`);
|
|
508
508
|
let r = n.join(" ") || "0 seconds";
|
|
509
|
-
return
|
|
509
|
+
return O`INTERVAL '${O.raw(r)}'`;
|
|
510
510
|
}
|
|
511
511
|
buildTimeDifferenceSeconds(e, t) {
|
|
512
|
-
return
|
|
512
|
+
return O`EXTRACT(EPOCH FROM (${e} - ${t}))`;
|
|
513
513
|
}
|
|
514
514
|
buildDateAddInterval(e, t) {
|
|
515
|
-
return
|
|
515
|
+
return O`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
516
516
|
}
|
|
517
517
|
buildConditionalAggregation(e, t, n) {
|
|
518
518
|
let r = e.toUpperCase();
|
|
519
|
-
return e === "count" && !t ?
|
|
519
|
+
return e === "count" && !t ? O`COUNT(*) FILTER (WHERE ${n})` : O`${O.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
520
520
|
}
|
|
521
521
|
buildDateDiffPeriods(e, t, n) {
|
|
522
522
|
switch (n) {
|
|
523
|
-
case "day": return
|
|
524
|
-
case "week": return
|
|
525
|
-
case "month": return
|
|
523
|
+
case "day": return O`(${t}::date - ${e}::date)`;
|
|
524
|
+
case "week": return O`FLOOR((${t}::date - ${e}::date) / 7)`;
|
|
525
|
+
case "month": return O`(EXTRACT(YEAR FROM AGE(${t}::timestamp, ${e}::timestamp)) * 12 + EXTRACT(MONTH FROM AGE(${t}::timestamp, ${e}::timestamp)))::integer`;
|
|
526
526
|
default: throw Error(`Unsupported date diff unit: ${n}`);
|
|
527
527
|
}
|
|
528
528
|
}
|
|
529
529
|
buildPeriodSeriesSubquery(e) {
|
|
530
|
-
return
|
|
530
|
+
return O`(SELECT generate_series(0, ${e}) as period_number) p`;
|
|
531
531
|
}
|
|
532
532
|
buildTimeDimension(e, t) {
|
|
533
533
|
switch (e) {
|
|
534
|
-
case "year": return
|
|
535
|
-
case "quarter": return
|
|
536
|
-
case "month": return
|
|
537
|
-
case "week": return
|
|
538
|
-
case "day": return
|
|
539
|
-
case "hour": return
|
|
540
|
-
case "minute": return
|
|
541
|
-
case "second": return
|
|
534
|
+
case "year": return O`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
535
|
+
case "quarter": return O`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
536
|
+
case "month": return O`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
537
|
+
case "week": return O`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
538
|
+
case "day": return O`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
539
|
+
case "hour": return O`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
540
|
+
case "minute": return O`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
541
|
+
case "second": return O`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
542
542
|
default: return t;
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
545
|
buildStringCondition(e, t, n) {
|
|
546
546
|
switch (t) {
|
|
547
|
-
case "contains": return
|
|
548
|
-
case "notContains": return
|
|
549
|
-
case "startsWith": return
|
|
550
|
-
case "endsWith": return
|
|
551
|
-
case "like": return
|
|
552
|
-
case "notLike": return
|
|
553
|
-
case "ilike": return
|
|
554
|
-
case "regex": return
|
|
555
|
-
case "notRegex": return
|
|
547
|
+
case "contains": return O`${e} ILIKE ${`%${n}%`}`;
|
|
548
|
+
case "notContains": return O`${e} NOT ILIKE ${`%${n}%`}`;
|
|
549
|
+
case "startsWith": return O`${e} ILIKE ${`${n}%`}`;
|
|
550
|
+
case "endsWith": return O`${e} ILIKE ${`%${n}`}`;
|
|
551
|
+
case "like": return O`${e} LIKE ${n}`;
|
|
552
|
+
case "notLike": return O`${e} NOT LIKE ${n}`;
|
|
553
|
+
case "ilike": return O`${e} ILIKE ${n}`;
|
|
554
|
+
case "regex": return O`${e} ~* ${n}`;
|
|
555
|
+
case "notRegex": return O`${e} !~* ${n}`;
|
|
556
556
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
557
557
|
}
|
|
558
558
|
}
|
|
559
559
|
castToType(e, t) {
|
|
560
560
|
switch (t) {
|
|
561
|
-
case "timestamp": return
|
|
562
|
-
case "decimal": return
|
|
563
|
-
case "integer": return
|
|
561
|
+
case "timestamp": return O`${e}::timestamp`;
|
|
562
|
+
case "decimal": return O`${e}::decimal`;
|
|
563
|
+
case "integer": return O`${e}::integer`;
|
|
564
564
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
565
565
|
}
|
|
566
566
|
}
|
|
567
567
|
buildAvg(e) {
|
|
568
|
-
return
|
|
568
|
+
return O`COALESCE(AVG(${e}), 0)`;
|
|
569
569
|
}
|
|
570
570
|
buildCaseWhen(e, t) {
|
|
571
|
-
let n = e.map((e) =>
|
|
572
|
-
return t === void 0 ?
|
|
571
|
+
let n = e.map((e) => O`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => O`${e} ${t}`);
|
|
572
|
+
return t === void 0 ? O`CASE ${n} END` : O`CASE ${n} ELSE ${t} END`;
|
|
573
573
|
}
|
|
574
574
|
buildBooleanLiteral(e) {
|
|
575
|
-
return e ?
|
|
575
|
+
return e ? O`TRUE` : O`FALSE`;
|
|
576
576
|
}
|
|
577
577
|
convertFilterValue(e) {
|
|
578
578
|
return e;
|
|
@@ -601,35 +601,35 @@ var V = class {
|
|
|
601
601
|
}
|
|
602
602
|
buildStddev(e, t = !1) {
|
|
603
603
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
604
|
-
return
|
|
604
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
605
605
|
}
|
|
606
606
|
buildVariance(e, t = !1) {
|
|
607
607
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
608
|
-
return
|
|
608
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
609
609
|
}
|
|
610
610
|
buildPercentile(e, t) {
|
|
611
|
-
return
|
|
611
|
+
return O`PERCENTILE_CONT(${t / 100}) WITHIN GROUP (ORDER BY ${e})`;
|
|
612
612
|
}
|
|
613
613
|
buildWindowFunction(e, t, n, r, i) {
|
|
614
|
-
let a = n && n.length > 0 ?
|
|
614
|
+
let a = n && n.length > 0 ? O`PARTITION BY ${O.join(n, O`, `)}` : O``, o = r && r.length > 0 ? O`ORDER BY ${O.join(r.map((e) => e.direction === "desc" ? O`${e.field} DESC` : O`${e.field} ASC`), O`, `)}` : O``, s = O``;
|
|
615
615
|
if (i?.frame) {
|
|
616
616
|
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";
|
|
617
|
-
s =
|
|
617
|
+
s = O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`;
|
|
618
618
|
}
|
|
619
619
|
let c = [];
|
|
620
620
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
621
|
-
let l =
|
|
621
|
+
let l = O`OVER (${c.length > 0 ? O.join(c, O` `) : O``})`;
|
|
622
622
|
switch (e) {
|
|
623
|
-
case "lag": return
|
|
624
|
-
case "lead": return
|
|
625
|
-
case "rank": return
|
|
626
|
-
case "denseRank": return
|
|
627
|
-
case "rowNumber": return
|
|
628
|
-
case "ntile": return
|
|
629
|
-
case "firstValue": return
|
|
630
|
-
case "lastValue": return
|
|
631
|
-
case "movingAvg": return
|
|
632
|
-
case "movingSum": return
|
|
623
|
+
case "lag": return O`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
624
|
+
case "lead": return O`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
625
|
+
case "rank": return O`RANK() ${l}`;
|
|
626
|
+
case "denseRank": return O`DENSE_RANK() ${l}`;
|
|
627
|
+
case "rowNumber": return O`ROW_NUMBER() ${l}`;
|
|
628
|
+
case "ntile": return O`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
629
|
+
case "firstValue": return O`FIRST_VALUE(${t}) ${l}`;
|
|
630
|
+
case "lastValue": return O`LAST_VALUE(${t}) ${l}`;
|
|
631
|
+
case "movingAvg": return O`AVG(${t}) ${l}`;
|
|
632
|
+
case "movingSum": return O`SUM(${t}) ${l}`;
|
|
633
633
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
634
634
|
}
|
|
635
635
|
}
|
|
@@ -642,25 +642,25 @@ var V = class {
|
|
|
642
642
|
}
|
|
643
643
|
buildIntervalFromISO(e) {
|
|
644
644
|
let t = this.parseISODuration(e), n = [];
|
|
645
|
-
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`),
|
|
645
|
+
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`), O`${this.durationToSeconds(e)}`;
|
|
646
646
|
}
|
|
647
647
|
buildTimeDifferenceSeconds(e, t) {
|
|
648
|
-
return
|
|
648
|
+
return O`TIMESTAMPDIFF(SECOND, ${t}, ${e})`;
|
|
649
649
|
}
|
|
650
650
|
buildDateAddInterval(e, t) {
|
|
651
651
|
let n = this.parseISODuration(t), r = e;
|
|
652
|
-
return n.years && (r =
|
|
652
|
+
return n.years && (r = O`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`), n.months && (r = O`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`), n.days && (r = O`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`), n.hours && (r = O`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`), n.minutes && (r = O`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`), n.seconds && (r = O`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`), r;
|
|
653
653
|
}
|
|
654
654
|
buildConditionalAggregation(e, t, n) {
|
|
655
655
|
let r = e.toUpperCase();
|
|
656
|
-
return e === "count" && !t ?
|
|
656
|
+
return e === "count" && !t ? O`COUNT(CASE WHEN ${n} THEN 1 END)` : O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
657
657
|
}
|
|
658
658
|
buildDateDiffPeriods(e, t, n) {
|
|
659
659
|
let r = n.toUpperCase();
|
|
660
|
-
return
|
|
660
|
+
return O`TIMESTAMPDIFF(${O.raw(r)}, ${e}, ${t})`;
|
|
661
661
|
}
|
|
662
662
|
buildPeriodSeriesSubquery(e) {
|
|
663
|
-
return
|
|
663
|
+
return O`(
|
|
664
664
|
WITH RECURSIVE periods(period_number) AS (
|
|
665
665
|
SELECT 0
|
|
666
666
|
UNION ALL
|
|
@@ -681,45 +681,45 @@ var V = class {
|
|
|
681
681
|
second: "%Y-%m-%d %H:%i:%s"
|
|
682
682
|
};
|
|
683
683
|
switch (e) {
|
|
684
|
-
case "quarter": return
|
|
685
|
-
case "week": return
|
|
684
|
+
case "quarter": return O`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;
|
|
685
|
+
case "week": return O`DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY)`;
|
|
686
686
|
default: {
|
|
687
687
|
let r = n[e];
|
|
688
|
-
return r ?
|
|
688
|
+
return r ? O`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')` : t;
|
|
689
689
|
}
|
|
690
690
|
}
|
|
691
691
|
}
|
|
692
692
|
buildStringCondition(e, t, n) {
|
|
693
693
|
switch (t) {
|
|
694
|
-
case "contains": return
|
|
695
|
-
case "notContains": return
|
|
696
|
-
case "startsWith": return
|
|
697
|
-
case "endsWith": return
|
|
698
|
-
case "like": return
|
|
699
|
-
case "notLike": return
|
|
700
|
-
case "ilike": return
|
|
701
|
-
case "regex": return
|
|
702
|
-
case "notRegex": return
|
|
694
|
+
case "contains": return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
695
|
+
case "notContains": return O`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
696
|
+
case "startsWith": return O`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
697
|
+
case "endsWith": return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
698
|
+
case "like": return O`${e} LIKE ${n}`;
|
|
699
|
+
case "notLike": return O`${e} NOT LIKE ${n}`;
|
|
700
|
+
case "ilike": return O`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
701
|
+
case "regex": return O`${e} REGEXP ${n}`;
|
|
702
|
+
case "notRegex": return O`${e} NOT REGEXP ${n}`;
|
|
703
703
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
704
704
|
}
|
|
705
705
|
}
|
|
706
706
|
castToType(e, t) {
|
|
707
707
|
switch (t) {
|
|
708
|
-
case "timestamp": return
|
|
709
|
-
case "decimal": return
|
|
710
|
-
case "integer": return
|
|
708
|
+
case "timestamp": return O`CAST(${e} AS DATETIME)`;
|
|
709
|
+
case "decimal": return O`CAST(${e} AS DECIMAL(10,2))`;
|
|
710
|
+
case "integer": return O`CAST(${e} AS SIGNED INTEGER)`;
|
|
711
711
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
712
712
|
}
|
|
713
713
|
}
|
|
714
714
|
buildAvg(e) {
|
|
715
|
-
return
|
|
715
|
+
return O`IFNULL(AVG(${e}), 0)`;
|
|
716
716
|
}
|
|
717
717
|
buildCaseWhen(e, t) {
|
|
718
|
-
let n = e.map((e) =>
|
|
719
|
-
return t === void 0 ?
|
|
718
|
+
let n = e.map((e) => O`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => O`${e} ${t}`);
|
|
719
|
+
return t === void 0 ? O`CASE ${n} END` : O`CASE ${n} ELSE ${t} END`;
|
|
720
720
|
}
|
|
721
721
|
buildBooleanLiteral(e) {
|
|
722
|
-
return e ?
|
|
722
|
+
return e ? O`TRUE` : O`FALSE`;
|
|
723
723
|
}
|
|
724
724
|
convertFilterValue(e) {
|
|
725
725
|
return e;
|
|
@@ -748,35 +748,35 @@ var V = class {
|
|
|
748
748
|
}
|
|
749
749
|
buildStddev(e, t = !1) {
|
|
750
750
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
751
|
-
return
|
|
751
|
+
return O`IFNULL(${O.raw(n)}(${e}), 0)`;
|
|
752
752
|
}
|
|
753
753
|
buildVariance(e, t = !1) {
|
|
754
754
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
755
|
-
return
|
|
755
|
+
return O`IFNULL(${O.raw(n)}(${e}), 0)`;
|
|
756
756
|
}
|
|
757
757
|
buildPercentile(e, t) {
|
|
758
758
|
return null;
|
|
759
759
|
}
|
|
760
760
|
buildWindowFunction(e, t, n, r, i) {
|
|
761
|
-
let a = n && n.length > 0 ?
|
|
761
|
+
let a = n && n.length > 0 ? O`PARTITION BY ${O.join(n, O`, `)}` : O``, o = r && r.length > 0 ? O`ORDER BY ${O.join(r.map((e) => e.direction === "desc" ? O`${e.field} DESC` : O`${e.field} ASC`), O`, `)}` : O``, s = O``;
|
|
762
762
|
if (i?.frame) {
|
|
763
763
|
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";
|
|
764
|
-
s =
|
|
764
|
+
s = O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`;
|
|
765
765
|
}
|
|
766
766
|
let c = [];
|
|
767
767
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
768
|
-
let l =
|
|
768
|
+
let l = O`OVER (${c.length > 0 ? O.join(c, O` `) : O``})`;
|
|
769
769
|
switch (e) {
|
|
770
|
-
case "lag": return
|
|
771
|
-
case "lead": return
|
|
772
|
-
case "rank": return
|
|
773
|
-
case "denseRank": return
|
|
774
|
-
case "rowNumber": return
|
|
775
|
-
case "ntile": return
|
|
776
|
-
case "firstValue": return
|
|
777
|
-
case "lastValue": return
|
|
778
|
-
case "movingAvg": return
|
|
779
|
-
case "movingSum": return
|
|
770
|
+
case "lag": return O`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
771
|
+
case "lead": return O`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
772
|
+
case "rank": return O`RANK() ${l}`;
|
|
773
|
+
case "denseRank": return O`DENSE_RANK() ${l}`;
|
|
774
|
+
case "rowNumber": return O`ROW_NUMBER() ${l}`;
|
|
775
|
+
case "ntile": return O`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
776
|
+
case "firstValue": return O`FIRST_VALUE(${t}) ${l}`;
|
|
777
|
+
case "lastValue": return O`LAST_VALUE(${t}) ${l}`;
|
|
778
|
+
case "movingAvg": return O`AVG(${t}) ${l}`;
|
|
779
|
+
case "movingSum": return O`SUM(${t}) ${l}`;
|
|
780
780
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
781
781
|
}
|
|
782
782
|
}
|
|
@@ -788,28 +788,28 @@ var V = class {
|
|
|
788
788
|
return !1;
|
|
789
789
|
}
|
|
790
790
|
buildIntervalFromISO(e) {
|
|
791
|
-
return
|
|
791
|
+
return O`${this.durationToSeconds(e)}`;
|
|
792
792
|
}
|
|
793
793
|
buildTimeDifferenceSeconds(e, t) {
|
|
794
|
-
return
|
|
794
|
+
return O`(${e} - ${t})`;
|
|
795
795
|
}
|
|
796
796
|
buildDateAddInterval(e, t) {
|
|
797
|
-
return
|
|
797
|
+
return O`(${e} + ${this.durationToSeconds(t)})`;
|
|
798
798
|
}
|
|
799
799
|
buildConditionalAggregation(e, t, n) {
|
|
800
800
|
let r = e.toUpperCase();
|
|
801
|
-
return e === "count" && !t ?
|
|
801
|
+
return e === "count" && !t ? O`COUNT(CASE WHEN ${n} THEN 1 END)` : O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
802
802
|
}
|
|
803
803
|
buildDateDiffPeriods(e, t, n) {
|
|
804
804
|
switch (n) {
|
|
805
|
-
case "day": return
|
|
806
|
-
case "week": return
|
|
807
|
-
case "month": return
|
|
805
|
+
case "day": return O`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;
|
|
806
|
+
case "week": return O`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;
|
|
807
|
+
case "month": return O`((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)))`;
|
|
808
808
|
default: throw Error(`Unsupported date diff unit for SQLite: ${n}`);
|
|
809
809
|
}
|
|
810
810
|
}
|
|
811
811
|
buildPeriodSeriesSubquery(e) {
|
|
812
|
-
return
|
|
812
|
+
return O`(
|
|
813
813
|
WITH RECURSIVE periods(period_number) AS (
|
|
814
814
|
SELECT 0
|
|
815
815
|
UNION ALL
|
|
@@ -820,52 +820,52 @@ var V = class {
|
|
|
820
820
|
}
|
|
821
821
|
buildTimeDimension(e, t) {
|
|
822
822
|
switch (e) {
|
|
823
|
-
case "year": return
|
|
823
|
+
case "year": return O`datetime(${t}, 'unixepoch', 'start of year')`;
|
|
824
824
|
case "quarter": {
|
|
825
|
-
let e =
|
|
826
|
-
return
|
|
825
|
+
let e = O`datetime(${t}, 'unixepoch')`;
|
|
826
|
+
return O`datetime(${e}, 'start of year',
|
|
827
827
|
'+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`;
|
|
828
828
|
}
|
|
829
|
-
case "month": return
|
|
830
|
-
case "week": return
|
|
831
|
-
case "day": return
|
|
832
|
-
case "hour": return
|
|
833
|
-
case "minute": return
|
|
834
|
-
case "second": return
|
|
835
|
-
default: return
|
|
829
|
+
case "month": return O`datetime(${t}, 'unixepoch', 'start of month')`;
|
|
830
|
+
case "week": return O`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;
|
|
831
|
+
case "day": return O`datetime(${t}, 'unixepoch', 'start of day')`;
|
|
832
|
+
case "hour": return O`datetime(strftime('%Y-%m-%d %H:00:00', ${O`datetime(${t}, 'unixepoch')`}))`;
|
|
833
|
+
case "minute": return O`datetime(strftime('%Y-%m-%d %H:%M:00', ${O`datetime(${t}, 'unixepoch')`}))`;
|
|
834
|
+
case "second": return O`datetime(strftime('%Y-%m-%d %H:%M:%S', ${O`datetime(${t}, 'unixepoch')`}))`;
|
|
835
|
+
default: return O`datetime(${t}, 'unixepoch')`;
|
|
836
836
|
}
|
|
837
837
|
}
|
|
838
838
|
buildStringCondition(e, t, n) {
|
|
839
839
|
switch (t) {
|
|
840
|
-
case "contains": return
|
|
841
|
-
case "notContains": return
|
|
842
|
-
case "startsWith": return
|
|
843
|
-
case "endsWith": return
|
|
844
|
-
case "like": return
|
|
845
|
-
case "notLike": return
|
|
846
|
-
case "ilike": return
|
|
847
|
-
case "regex": return
|
|
848
|
-
case "notRegex": return
|
|
840
|
+
case "contains": return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
841
|
+
case "notContains": return O`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
842
|
+
case "startsWith": return O`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
843
|
+
case "endsWith": return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
844
|
+
case "like": return O`${e} LIKE ${n}`;
|
|
845
|
+
case "notLike": return O`${e} NOT LIKE ${n}`;
|
|
846
|
+
case "ilike": return O`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
847
|
+
case "regex": return O`${e} GLOB ${n}`;
|
|
848
|
+
case "notRegex": return O`${e} NOT GLOB ${n}`;
|
|
849
849
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
850
850
|
}
|
|
851
851
|
}
|
|
852
852
|
castToType(e, t) {
|
|
853
853
|
switch (t) {
|
|
854
|
-
case "timestamp": return
|
|
855
|
-
case "decimal": return
|
|
856
|
-
case "integer": return
|
|
854
|
+
case "timestamp": return O`datetime(${e} / 1000, 'unixepoch')`;
|
|
855
|
+
case "decimal": return O`CAST(${e} AS REAL)`;
|
|
856
|
+
case "integer": return O`CAST(${e} AS INTEGER)`;
|
|
857
857
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
858
858
|
}
|
|
859
859
|
}
|
|
860
860
|
buildAvg(e) {
|
|
861
|
-
return
|
|
861
|
+
return O`IFNULL(AVG(${e}), 0)`;
|
|
862
862
|
}
|
|
863
863
|
buildCaseWhen(e, t) {
|
|
864
|
-
let n = e.map((e) => e.then && typeof e.then == "object" && (e.then.queryChunks || e.then._ || e.then.sql) ?
|
|
865
|
-
return t === void 0 ?
|
|
864
|
+
let n = e.map((e) => e.then && typeof e.then == "object" && (e.then.queryChunks || e.then._ || e.then.sql) ? O`WHEN ${e.when} THEN ${O.raw("(")}${e.then}${O.raw(")")}` : O`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => O`${e} ${t}`);
|
|
865
|
+
return t === void 0 ? O`CASE ${n} END` : t && typeof t == "object" && (t.queryChunks || t._ || t.sql) ? O`CASE ${n} ELSE ${O.raw("(")}${t}${O.raw(")")} END` : O`CASE ${n} ELSE ${t} END`;
|
|
866
866
|
}
|
|
867
867
|
buildBooleanLiteral(e) {
|
|
868
|
-
return e ?
|
|
868
|
+
return e ? O`1` : O`0`;
|
|
869
869
|
}
|
|
870
870
|
preprocessCalculatedTemplate(e) {
|
|
871
871
|
return e.length > 1e3 ? e : e.replace(/(\{[^}]+\})\s*\/\s*/g, (e, t) => `${t.replace(/\{([^}]+)\}/, "CAST({$1} AS REAL)")} / `);
|
|
@@ -910,25 +910,25 @@ var V = class {
|
|
|
910
910
|
return null;
|
|
911
911
|
}
|
|
912
912
|
buildWindowFunction(e, t, n, r, i) {
|
|
913
|
-
let a = n && n.length > 0 ?
|
|
913
|
+
let a = n && n.length > 0 ? O`PARTITION BY ${O.join(n, O`, `)}` : O``, o = r && r.length > 0 ? O`ORDER BY ${O.join(r.map((e) => e.direction === "desc" ? O`${e.field} DESC` : O`${e.field} ASC`), O`, `)}` : O``, s = O``;
|
|
914
914
|
if (i?.frame) {
|
|
915
915
|
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";
|
|
916
|
-
s =
|
|
916
|
+
s = O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`;
|
|
917
917
|
}
|
|
918
918
|
let c = [];
|
|
919
919
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
920
|
-
let l =
|
|
920
|
+
let l = O`OVER (${c.length > 0 ? O.join(c, O` `) : O``})`;
|
|
921
921
|
switch (e) {
|
|
922
|
-
case "lag": return
|
|
923
|
-
case "lead": return
|
|
924
|
-
case "rank": return
|
|
925
|
-
case "denseRank": return
|
|
926
|
-
case "rowNumber": return
|
|
927
|
-
case "ntile": return
|
|
928
|
-
case "firstValue": return
|
|
929
|
-
case "lastValue": return
|
|
930
|
-
case "movingAvg": return
|
|
931
|
-
case "movingSum": return
|
|
922
|
+
case "lag": return O`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
923
|
+
case "lead": return O`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
924
|
+
case "rank": return O`RANK() ${l}`;
|
|
925
|
+
case "denseRank": return O`DENSE_RANK() ${l}`;
|
|
926
|
+
case "rowNumber": return O`ROW_NUMBER() ${l}`;
|
|
927
|
+
case "ntile": return O`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
928
|
+
case "firstValue": return O`FIRST_VALUE(${t}) ${l}`;
|
|
929
|
+
case "lastValue": return O`LAST_VALUE(${t}) ${l}`;
|
|
930
|
+
case "movingAvg": return O`AVG(${t}) ${l}`;
|
|
931
|
+
case "movingSum": return O`SUM(${t}) ${l}`;
|
|
932
932
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
933
933
|
}
|
|
934
934
|
}
|
|
@@ -947,68 +947,68 @@ var V = class {
|
|
|
947
947
|
let t = this.parseISODuration(e), n = [];
|
|
948
948
|
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`);
|
|
949
949
|
let r = n.join(" ") || "0 seconds";
|
|
950
|
-
return
|
|
950
|
+
return O`INTERVAL '${O.raw(r)}'`;
|
|
951
951
|
}
|
|
952
952
|
buildTimeDifferenceSeconds(e, t) {
|
|
953
|
-
return
|
|
953
|
+
return O`(EPOCH(${e}) - EPOCH(${t}))`;
|
|
954
954
|
}
|
|
955
955
|
buildDateAddInterval(e, t) {
|
|
956
|
-
return
|
|
956
|
+
return O`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
957
957
|
}
|
|
958
958
|
buildConditionalAggregation(e, t, n) {
|
|
959
959
|
let r = e.toUpperCase();
|
|
960
|
-
return e === "count" && !t ?
|
|
960
|
+
return e === "count" && !t ? O`COUNT(*) FILTER (WHERE ${n})` : O`${O.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
961
961
|
}
|
|
962
962
|
buildDateDiffPeriods(e, t, n) {
|
|
963
|
-
return
|
|
963
|
+
return O`DATE_DIFF('${O.raw(n)}', ${e}::timestamp, ${t}::timestamp)`;
|
|
964
964
|
}
|
|
965
965
|
buildPeriodSeriesSubquery(e) {
|
|
966
|
-
return
|
|
966
|
+
return O`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`;
|
|
967
967
|
}
|
|
968
968
|
buildTimeDimension(e, t) {
|
|
969
969
|
switch (e) {
|
|
970
|
-
case "year": return
|
|
971
|
-
case "quarter": return
|
|
972
|
-
case "month": return
|
|
973
|
-
case "week": return
|
|
974
|
-
case "day": return
|
|
975
|
-
case "hour": return
|
|
976
|
-
case "minute": return
|
|
977
|
-
case "second": return
|
|
970
|
+
case "year": return O`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
971
|
+
case "quarter": return O`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
972
|
+
case "month": return O`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
973
|
+
case "week": return O`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
974
|
+
case "day": return O`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
975
|
+
case "hour": return O`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
976
|
+
case "minute": return O`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
977
|
+
case "second": return O`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
978
978
|
default: return t;
|
|
979
979
|
}
|
|
980
980
|
}
|
|
981
981
|
buildStringCondition(e, t, n) {
|
|
982
982
|
switch (t) {
|
|
983
|
-
case "contains": return
|
|
984
|
-
case "notContains": return
|
|
985
|
-
case "startsWith": return
|
|
986
|
-
case "endsWith": return
|
|
987
|
-
case "like": return
|
|
988
|
-
case "notLike": return
|
|
989
|
-
case "ilike": return
|
|
990
|
-
case "regex": return
|
|
991
|
-
case "notRegex": return
|
|
983
|
+
case "contains": return O`${e} ILIKE ${`%${n}%`}`;
|
|
984
|
+
case "notContains": return O`${e} NOT ILIKE ${`%${n}%`}`;
|
|
985
|
+
case "startsWith": return O`${e} ILIKE ${`${n}%`}`;
|
|
986
|
+
case "endsWith": return O`${e} ILIKE ${`%${n}`}`;
|
|
987
|
+
case "like": return O`${e} LIKE ${n}`;
|
|
988
|
+
case "notLike": return O`${e} NOT LIKE ${n}`;
|
|
989
|
+
case "ilike": return O`${e} ILIKE ${n}`;
|
|
990
|
+
case "regex": return O`regexp_matches(${e}, ${n})`;
|
|
991
|
+
case "notRegex": return O`NOT regexp_matches(${e}, ${n})`;
|
|
992
992
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
993
993
|
}
|
|
994
994
|
}
|
|
995
995
|
castToType(e, t) {
|
|
996
996
|
switch (t) {
|
|
997
|
-
case "timestamp": return
|
|
998
|
-
case "decimal": return
|
|
999
|
-
case "integer": return
|
|
997
|
+
case "timestamp": return O`${e}::timestamp`;
|
|
998
|
+
case "decimal": return O`${e}::decimal`;
|
|
999
|
+
case "integer": return O`${e}::integer`;
|
|
1000
1000
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1001
1001
|
}
|
|
1002
1002
|
}
|
|
1003
1003
|
buildAvg(e) {
|
|
1004
|
-
return
|
|
1004
|
+
return O`COALESCE(AVG(${e}), 0)`;
|
|
1005
1005
|
}
|
|
1006
1006
|
buildCaseWhen(e, t) {
|
|
1007
|
-
let n = e.map((e) =>
|
|
1008
|
-
return t === void 0 ?
|
|
1007
|
+
let n = e.map((e) => O`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => O`${e} ${t}`);
|
|
1008
|
+
return t === void 0 ? O`CASE ${n} END` : O`CASE ${n} ELSE ${t} END`;
|
|
1009
1009
|
}
|
|
1010
1010
|
buildBooleanLiteral(e) {
|
|
1011
|
-
return e ?
|
|
1011
|
+
return e ? O`TRUE` : O`FALSE`;
|
|
1012
1012
|
}
|
|
1013
1013
|
convertFilterValue(e) {
|
|
1014
1014
|
return e;
|
|
@@ -1037,35 +1037,35 @@ var V = class {
|
|
|
1037
1037
|
}
|
|
1038
1038
|
buildStddev(e, t = !1) {
|
|
1039
1039
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1040
|
-
return
|
|
1040
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
1041
1041
|
}
|
|
1042
1042
|
buildVariance(e, t = !1) {
|
|
1043
1043
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
1044
|
-
return
|
|
1044
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
1045
1045
|
}
|
|
1046
1046
|
buildPercentile(e, t) {
|
|
1047
|
-
return
|
|
1047
|
+
return O`QUANTILE_CONT(${e}, ${t / 100})`;
|
|
1048
1048
|
}
|
|
1049
1049
|
buildWindowFunction(e, t, n, r, i) {
|
|
1050
|
-
let a = n && n.length > 0 ?
|
|
1050
|
+
let a = n && n.length > 0 ? O`PARTITION BY ${O.join(n, O`, `)}` : O``, o = r && r.length > 0 ? O`ORDER BY ${O.join(r.map((e) => e.direction === "desc" ? O`${e.field} DESC` : O`${e.field} ASC`), O`, `)}` : O``, s = O``;
|
|
1051
1051
|
if (i?.frame) {
|
|
1052
1052
|
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";
|
|
1053
|
-
s =
|
|
1053
|
+
s = O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`;
|
|
1054
1054
|
}
|
|
1055
1055
|
let c = [];
|
|
1056
1056
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1057
|
-
let l =
|
|
1057
|
+
let l = O`OVER (${c.length > 0 ? O.join(c, O` `) : O``})`;
|
|
1058
1058
|
switch (e) {
|
|
1059
|
-
case "lag": return
|
|
1060
|
-
case "lead": return
|
|
1061
|
-
case "rank": return
|
|
1062
|
-
case "denseRank": return
|
|
1063
|
-
case "rowNumber": return
|
|
1064
|
-
case "ntile": return
|
|
1065
|
-
case "firstValue": return
|
|
1066
|
-
case "lastValue": return
|
|
1067
|
-
case "movingAvg": return
|
|
1068
|
-
case "movingSum": return
|
|
1059
|
+
case "lag": return O`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
1060
|
+
case "lead": return O`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
1061
|
+
case "rank": return O`RANK() ${l}`;
|
|
1062
|
+
case "denseRank": return O`DENSE_RANK() ${l}`;
|
|
1063
|
+
case "rowNumber": return O`ROW_NUMBER() ${l}`;
|
|
1064
|
+
case "ntile": return O`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1065
|
+
case "firstValue": return O`FIRST_VALUE(${t}) ${l}`;
|
|
1066
|
+
case "lastValue": return O`LAST_VALUE(${t}) ${l}`;
|
|
1067
|
+
case "movingAvg": return O`AVG(${t}) ${l}`;
|
|
1068
|
+
case "movingSum": return O`SUM(${t}) ${l}`;
|
|
1069
1069
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1070
1070
|
}
|
|
1071
1071
|
}
|
|
@@ -1078,71 +1078,71 @@ var V = class {
|
|
|
1078
1078
|
}
|
|
1079
1079
|
buildIntervalFromISO(e) {
|
|
1080
1080
|
let t = this.parseISODuration(e), n = [];
|
|
1081
|
-
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
|
|
1082
|
-
if (n.length === 1) return
|
|
1081
|
+
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 O`INTERVAL 0 SECOND`;
|
|
1082
|
+
if (n.length === 1) return O`INTERVAL ${O.raw(n[0])}`;
|
|
1083
1083
|
let r = n.map((e) => `INTERVAL ${e}`);
|
|
1084
|
-
return
|
|
1084
|
+
return O`(${O.raw(r.join(" + "))})`;
|
|
1085
1085
|
}
|
|
1086
1086
|
buildTimeDifferenceSeconds(e, t) {
|
|
1087
|
-
return
|
|
1087
|
+
return O`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`;
|
|
1088
1088
|
}
|
|
1089
1089
|
buildDateAddInterval(e, t) {
|
|
1090
|
-
return
|
|
1090
|
+
return O`(${e} + ${this.buildIntervalFromISO(t)})`;
|
|
1091
1091
|
}
|
|
1092
1092
|
buildConditionalAggregation(e, t, n) {
|
|
1093
1093
|
let r = e.toUpperCase();
|
|
1094
|
-
return e === "count" && !t ?
|
|
1094
|
+
return e === "count" && !t ? O`${O.raw(r)}(CASE WHEN ${n} THEN 1 END)` : O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1095
1095
|
}
|
|
1096
1096
|
buildDateDiffPeriods(e, t, n) {
|
|
1097
|
-
return
|
|
1097
|
+
return O`DATE_DIFF('${O.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1098
1098
|
}
|
|
1099
1099
|
buildPeriodSeriesSubquery(e) {
|
|
1100
|
-
return
|
|
1100
|
+
return O`(SELECT number as period_number FROM numbers(${e + 1})) p`;
|
|
1101
1101
|
}
|
|
1102
1102
|
buildTimeDimension(e, t) {
|
|
1103
1103
|
switch (e) {
|
|
1104
|
-
case "year": return
|
|
1105
|
-
case "quarter": return
|
|
1106
|
-
case "month": return
|
|
1107
|
-
case "week": return
|
|
1108
|
-
case "day": return
|
|
1109
|
-
case "hour": return
|
|
1110
|
-
case "minute": return
|
|
1111
|
-
case "second": return
|
|
1104
|
+
case "year": return O`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;
|
|
1105
|
+
case "quarter": return O`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;
|
|
1106
|
+
case "month": return O`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;
|
|
1107
|
+
case "week": return O`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;
|
|
1108
|
+
case "day": return O`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1109
|
+
case "hour": return O`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;
|
|
1110
|
+
case "minute": return O`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;
|
|
1111
|
+
case "second": return O`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;
|
|
1112
1112
|
default: return t;
|
|
1113
1113
|
}
|
|
1114
1114
|
}
|
|
1115
1115
|
buildStringCondition(e, t, n) {
|
|
1116
1116
|
switch (t) {
|
|
1117
|
-
case "contains": return
|
|
1118
|
-
case "notContains": return
|
|
1119
|
-
case "startsWith": return
|
|
1120
|
-
case "endsWith": return
|
|
1121
|
-
case "like": return
|
|
1122
|
-
case "notLike": return
|
|
1123
|
-
case "ilike": return
|
|
1124
|
-
case "regex": return
|
|
1125
|
-
case "notRegex": return
|
|
1117
|
+
case "contains": return O`LOWER(${e}) LIKE LOWER(${`%${n}%`})`;
|
|
1118
|
+
case "notContains": return O`LOWER(${e}) NOT LIKE LOWER(${`%${n}%`})`;
|
|
1119
|
+
case "startsWith": return O`LOWER(${e}) LIKE LOWER(${`${n}%`})`;
|
|
1120
|
+
case "endsWith": return O`LOWER(${e}) LIKE LOWER(${`%${n}`})`;
|
|
1121
|
+
case "like": return O`${e} LIKE ${n}`;
|
|
1122
|
+
case "notLike": return O`${e} NOT LIKE ${n}`;
|
|
1123
|
+
case "ilike": return O`LOWER(${e}) LIKE LOWER(${n})`;
|
|
1124
|
+
case "regex": return O`${e} REGEXP ${n}`;
|
|
1125
|
+
case "notRegex": return O`NOT (${e} REGEXP ${n})`;
|
|
1126
1126
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1127
1127
|
}
|
|
1128
1128
|
}
|
|
1129
1129
|
castToType(e, t) {
|
|
1130
1130
|
switch (t) {
|
|
1131
|
-
case "timestamp": return
|
|
1132
|
-
case "decimal": return
|
|
1133
|
-
case "integer": return
|
|
1131
|
+
case "timestamp": return O`${e}::TIMESTAMP`;
|
|
1132
|
+
case "decimal": return O`${e}::DECIMAL`;
|
|
1133
|
+
case "integer": return O`${e}::INTEGER`;
|
|
1134
1134
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1135
1135
|
}
|
|
1136
1136
|
}
|
|
1137
1137
|
buildAvg(e) {
|
|
1138
|
-
return
|
|
1138
|
+
return O`COALESCE(AVG(${e}), 0)`;
|
|
1139
1139
|
}
|
|
1140
1140
|
buildCaseWhen(e, t) {
|
|
1141
|
-
let n = e.map((e) =>
|
|
1142
|
-
return t === void 0 ?
|
|
1141
|
+
let n = e.map((e) => O`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => O`${e} ${t}`);
|
|
1142
|
+
return t === void 0 ? O`CASE ${n} END` : O`CASE ${n} ELSE ${t} END`;
|
|
1143
1143
|
}
|
|
1144
1144
|
buildBooleanLiteral(e) {
|
|
1145
|
-
return e ?
|
|
1145
|
+
return e ? O`TRUE` : O`FALSE`;
|
|
1146
1146
|
}
|
|
1147
1147
|
convertFilterValue(e) {
|
|
1148
1148
|
return e;
|
|
@@ -1171,35 +1171,35 @@ var V = class {
|
|
|
1171
1171
|
}
|
|
1172
1172
|
buildStddev(e, t = !1) {
|
|
1173
1173
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1174
|
-
return
|
|
1174
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
1175
1175
|
}
|
|
1176
1176
|
buildVariance(e, t = !1) {
|
|
1177
1177
|
let n = t ? "COVAR_SAMP" : "COVAR_POP";
|
|
1178
|
-
return
|
|
1178
|
+
return O`COALESCE(${O.raw(n)}(${e}, ${e}), 0)`;
|
|
1179
1179
|
}
|
|
1180
1180
|
buildPercentile(e, t) {
|
|
1181
1181
|
throw Error("Percentile functions are not yet supported for Databend");
|
|
1182
1182
|
}
|
|
1183
1183
|
buildWindowFunction(e, t, n, r, i) {
|
|
1184
|
-
let a = n && n.length > 0 ?
|
|
1184
|
+
let a = n && n.length > 0 ? O`PARTITION BY ${O.join(n, O`, `)}` : O``, o = r && r.length > 0 ? O`ORDER BY ${O.join(r.map((e) => e.direction === "desc" ? O`${e.field} DESC` : O`${e.field} ASC`), O`, `)}` : O``, s = O``;
|
|
1185
1185
|
if (i?.frame) {
|
|
1186
1186
|
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";
|
|
1187
|
-
s =
|
|
1187
|
+
s = O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`;
|
|
1188
1188
|
}
|
|
1189
1189
|
let c = [];
|
|
1190
1190
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1191
|
-
let l =
|
|
1191
|
+
let l = O`OVER (${c.length > 0 ? O.join(c, O` `) : O``})`;
|
|
1192
1192
|
switch (e) {
|
|
1193
|
-
case "lag": return
|
|
1194
|
-
case "lead": return
|
|
1195
|
-
case "rank": return
|
|
1196
|
-
case "denseRank": return
|
|
1197
|
-
case "rowNumber": return
|
|
1198
|
-
case "ntile": return
|
|
1199
|
-
case "firstValue": return
|
|
1200
|
-
case "lastValue": return
|
|
1201
|
-
case "movingAvg": return
|
|
1202
|
-
case "movingSum": return
|
|
1193
|
+
case "lag": return O`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
1194
|
+
case "lead": return O`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
1195
|
+
case "rank": return O`RANK() ${l}`;
|
|
1196
|
+
case "denseRank": return O`DENSE_RANK() ${l}`;
|
|
1197
|
+
case "rowNumber": return O`ROW_NUMBER() ${l}`;
|
|
1198
|
+
case "ntile": return O`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1199
|
+
case "firstValue": return O`FIRST_VALUE(${t}) ${l}`;
|
|
1200
|
+
case "lastValue": return O`LAST_VALUE(${t}) ${l}`;
|
|
1201
|
+
case "movingAvg": return O`AVG(${t}) ${l}`;
|
|
1202
|
+
case "movingSum": return O`SUM(${t}) ${l}`;
|
|
1203
1203
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1204
1204
|
}
|
|
1205
1205
|
}
|
|
@@ -1211,70 +1211,70 @@ var V = class {
|
|
|
1211
1211
|
return !0;
|
|
1212
1212
|
}
|
|
1213
1213
|
buildIntervalFromISO(e) {
|
|
1214
|
-
return
|
|
1214
|
+
return O`${this.durationToSeconds(e)}`;
|
|
1215
1215
|
}
|
|
1216
1216
|
buildTimeDifferenceSeconds(e, t) {
|
|
1217
|
-
return
|
|
1217
|
+
return O`DATEDIFF('SECOND', ${t}, ${e})`;
|
|
1218
1218
|
}
|
|
1219
1219
|
buildDateAddInterval(e, t) {
|
|
1220
1220
|
let n = this.parseISODuration(t), r = e;
|
|
1221
|
-
return n.years && (r =
|
|
1221
|
+
return n.years && (r = O`DATEADD('YEAR', ${n.years}, ${r})`), n.months && (r = O`DATEADD('MONTH', ${n.months}, ${r})`), n.days && (r = O`DATEADD('DAY', ${n.days}, ${r})`), n.hours && (r = O`DATEADD('HOUR', ${n.hours}, ${r})`), n.minutes && (r = O`DATEADD('MINUTE', ${n.minutes}, ${r})`), n.seconds && (r = O`DATEADD('SECOND', ${n.seconds}, ${r})`), r;
|
|
1222
1222
|
}
|
|
1223
1223
|
buildConditionalAggregation(e, t, n) {
|
|
1224
1224
|
let r = e.toUpperCase();
|
|
1225
|
-
return e === "count" && !t ?
|
|
1225
|
+
return e === "count" && !t ? O`${O.raw(r)}(CASE WHEN ${n} THEN 1 END)` : O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1226
1226
|
}
|
|
1227
1227
|
buildDateDiffPeriods(e, t, n) {
|
|
1228
1228
|
let r = n.toUpperCase();
|
|
1229
|
-
return
|
|
1229
|
+
return O`DATEDIFF('${O.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1230
1230
|
}
|
|
1231
1231
|
buildPeriodSeriesSubquery(e) {
|
|
1232
|
-
return
|
|
1232
|
+
return O`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${e + 1}))) p`;
|
|
1233
1233
|
}
|
|
1234
1234
|
buildTimeDimension(e, t) {
|
|
1235
1235
|
switch (e) {
|
|
1236
|
-
case "year": return
|
|
1237
|
-
case "quarter": return
|
|
1238
|
-
case "month": return
|
|
1239
|
-
case "week": return
|
|
1240
|
-
case "day": return
|
|
1241
|
-
case "hour": return
|
|
1242
|
-
case "minute": return
|
|
1243
|
-
case "second": return
|
|
1236
|
+
case "year": return O`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;
|
|
1237
|
+
case "quarter": return O`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;
|
|
1238
|
+
case "month": return O`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;
|
|
1239
|
+
case "week": return O`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;
|
|
1240
|
+
case "day": return O`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1241
|
+
case "hour": return O`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;
|
|
1242
|
+
case "minute": return O`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;
|
|
1243
|
+
case "second": return O`DATE_TRUNC('SECOND', ${t}::TIMESTAMP)`;
|
|
1244
1244
|
default: return t;
|
|
1245
1245
|
}
|
|
1246
1246
|
}
|
|
1247
1247
|
buildStringCondition(e, t, n) {
|
|
1248
1248
|
switch (t) {
|
|
1249
|
-
case "contains": return
|
|
1250
|
-
case "notContains": return
|
|
1251
|
-
case "startsWith": return
|
|
1252
|
-
case "endsWith": return
|
|
1253
|
-
case "like": return
|
|
1254
|
-
case "notLike": return
|
|
1255
|
-
case "ilike": return
|
|
1256
|
-
case "regex": return
|
|
1257
|
-
case "notRegex": return
|
|
1249
|
+
case "contains": return O`${e} ILIKE ${`%${n}%`}`;
|
|
1250
|
+
case "notContains": return O`${e} NOT ILIKE ${`%${n}%`}`;
|
|
1251
|
+
case "startsWith": return O`${e} ILIKE ${`${n}%`}`;
|
|
1252
|
+
case "endsWith": return O`${e} ILIKE ${`%${n}`}`;
|
|
1253
|
+
case "like": return O`${e} LIKE ${n}`;
|
|
1254
|
+
case "notLike": return O`${e} NOT LIKE ${n}`;
|
|
1255
|
+
case "ilike": return O`${e} ILIKE ${n}`;
|
|
1256
|
+
case "regex": return O`REGEXP_LIKE(${e}, ${n})`;
|
|
1257
|
+
case "notRegex": return O`NOT REGEXP_LIKE(${e}, ${n})`;
|
|
1258
1258
|
default: throw Error(`Unsupported string operator: ${t}`);
|
|
1259
1259
|
}
|
|
1260
1260
|
}
|
|
1261
1261
|
castToType(e, t) {
|
|
1262
1262
|
switch (t) {
|
|
1263
|
-
case "timestamp": return
|
|
1264
|
-
case "decimal": return
|
|
1265
|
-
case "integer": return
|
|
1263
|
+
case "timestamp": return O`${e}::TIMESTAMP`;
|
|
1264
|
+
case "decimal": return O`${e}::DECIMAL`;
|
|
1265
|
+
case "integer": return O`${e}::INTEGER`;
|
|
1266
1266
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1267
1267
|
}
|
|
1268
1268
|
}
|
|
1269
1269
|
buildAvg(e) {
|
|
1270
|
-
return
|
|
1270
|
+
return O`COALESCE(AVG(${e}), 0)`;
|
|
1271
1271
|
}
|
|
1272
1272
|
buildCaseWhen(e, t) {
|
|
1273
|
-
let n = e.map((e) =>
|
|
1274
|
-
return t === void 0 ?
|
|
1273
|
+
let n = e.map((e) => O`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => O`${e} ${t}`);
|
|
1274
|
+
return t === void 0 ? O`CASE ${n} END` : O`CASE ${n} ELSE ${t} END`;
|
|
1275
1275
|
}
|
|
1276
1276
|
buildBooleanLiteral(e) {
|
|
1277
|
-
return e ?
|
|
1277
|
+
return e ? O`TRUE` : O`FALSE`;
|
|
1278
1278
|
}
|
|
1279
1279
|
convertFilterValue(e) {
|
|
1280
1280
|
return e;
|
|
@@ -1303,36 +1303,36 @@ var V = class {
|
|
|
1303
1303
|
}
|
|
1304
1304
|
buildStddev(e, t = !1) {
|
|
1305
1305
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
1306
|
-
return
|
|
1306
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
1307
1307
|
}
|
|
1308
1308
|
buildVariance(e, t = !1) {
|
|
1309
1309
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
1310
|
-
return
|
|
1310
|
+
return O`COALESCE(${O.raw(n)}(${e}), 0)`;
|
|
1311
1311
|
}
|
|
1312
1312
|
buildPercentile(e, t) {
|
|
1313
1313
|
let n = (t / 100).toString();
|
|
1314
|
-
return
|
|
1314
|
+
return O`PERCENTILE_CONT(${O.raw(n)}) WITHIN GROUP (ORDER BY ${e})`;
|
|
1315
1315
|
}
|
|
1316
1316
|
buildWindowFunction(e, t, n, r, i) {
|
|
1317
|
-
let a = n && n.length > 0 ?
|
|
1317
|
+
let a = n && n.length > 0 ? O`PARTITION BY ${O.join(n, O`, `)}` : O``, o = r && r.length > 0 ? O`ORDER BY ${O.join(r.map((e) => e.direction === "desc" ? O`${e.field} DESC` : O`${e.field} ASC`), O`, `)}` : O``, s = O``;
|
|
1318
1318
|
if (i?.frame) {
|
|
1319
1319
|
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";
|
|
1320
|
-
s =
|
|
1320
|
+
s = O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`;
|
|
1321
1321
|
}
|
|
1322
1322
|
let c = [];
|
|
1323
1323
|
n && n.length > 0 && c.push(a), r && r.length > 0 && c.push(o), i?.frame && c.push(s);
|
|
1324
|
-
let l =
|
|
1324
|
+
let l = O`OVER (${c.length > 0 ? O.join(c, O` `) : O``})`;
|
|
1325
1325
|
switch (e) {
|
|
1326
|
-
case "lag": return
|
|
1327
|
-
case "lead": return
|
|
1328
|
-
case "rank": return
|
|
1329
|
-
case "denseRank": return
|
|
1330
|
-
case "rowNumber": return
|
|
1331
|
-
case "ntile": return
|
|
1332
|
-
case "firstValue": return
|
|
1333
|
-
case "lastValue": return
|
|
1334
|
-
case "movingAvg": return
|
|
1335
|
-
case "movingSum": return
|
|
1326
|
+
case "lag": return O`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
1327
|
+
case "lead": return O`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? O`` : O`, ${i.defaultValue}`}) ${l}`;
|
|
1328
|
+
case "rank": return O`RANK() ${l}`;
|
|
1329
|
+
case "denseRank": return O`DENSE_RANK() ${l}`;
|
|
1330
|
+
case "rowNumber": return O`ROW_NUMBER() ${l}`;
|
|
1331
|
+
case "ntile": return O`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1332
|
+
case "firstValue": return O`FIRST_VALUE(${t}) ${l}`;
|
|
1333
|
+
case "lastValue": return O`LAST_VALUE(${t}) ${l}`;
|
|
1334
|
+
case "movingAvg": return O`AVG(${t}) ${l}`;
|
|
1335
|
+
case "movingSum": return O`SUM(${t}) ${l}`;
|
|
1336
1336
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1337
1337
|
}
|
|
1338
1338
|
}
|
|
@@ -1422,15 +1422,18 @@ function Ce(e) {
|
|
|
1422
1422
|
}
|
|
1423
1423
|
//#endregion
|
|
1424
1424
|
//#region src/server/executors/postgres-executor.ts
|
|
1425
|
-
|
|
1425
|
+
function we(e) {
|
|
1426
|
+
return Array.isArray(e) ? e : e && typeof e == "object" && "rows" in e && Array.isArray(e.rows) ? e.rows : [];
|
|
1427
|
+
}
|
|
1428
|
+
var Te = class extends H {
|
|
1426
1429
|
async execute(e, t) {
|
|
1427
1430
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1428
1431
|
let n = await e.execute();
|
|
1429
1432
|
return Array.isArray(n) ? n.map((e) => this.convertNumericFields(e, t)) : n;
|
|
1430
1433
|
}
|
|
1431
1434
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1432
|
-
let n = await this.db.execute(e);
|
|
1433
|
-
return
|
|
1435
|
+
let n = await this.db.execute(e), r = we(n);
|
|
1436
|
+
return r.length > 0 ? r.map((e) => this.convertNumericFields(e, t)) : n;
|
|
1434
1437
|
}
|
|
1435
1438
|
convertNumericFields(e, t) {
|
|
1436
1439
|
if (!e || typeof e != "object") return e;
|
|
@@ -1464,15 +1467,13 @@ var we = class extends H {
|
|
|
1464
1467
|
async explainQuery(e, t, n) {
|
|
1465
1468
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1466
1469
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1467
|
-
let i = await this.db.execute(
|
|
1470
|
+
let i = await this.db.execute(O`${O.raw(r)} ${O.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1468
1471
|
let r = t[parseInt(n, 10) - 1];
|
|
1469
1472
|
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
1470
1473
|
}))}`), a = [];
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
typeof t == "string" && a.push(t);
|
|
1475
|
-
}
|
|
1474
|
+
for (let e of we(i)) if (e && typeof e == "object") {
|
|
1475
|
+
let t = e["QUERY PLAN"] || e["query plan"] || e.queryplan;
|
|
1476
|
+
typeof t == "string" && a.push(t);
|
|
1476
1477
|
}
|
|
1477
1478
|
return Se(a, {
|
|
1478
1479
|
sql: e,
|
|
@@ -1483,7 +1484,7 @@ var we = class extends H {
|
|
|
1483
1484
|
if (!e || e.length === 0) return [];
|
|
1484
1485
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1485
1486
|
try {
|
|
1486
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1487
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = we(await this.db.execute(O`
|
|
1487
1488
|
SELECT
|
|
1488
1489
|
t.relname as table_name,
|
|
1489
1490
|
i.relname as index_name,
|
|
@@ -1497,28 +1498,28 @@ var we = class extends H {
|
|
|
1497
1498
|
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
1498
1499
|
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
1499
1500
|
WHERE n.nspname = 'public'
|
|
1500
|
-
AND t.relname IN (${
|
|
1501
|
+
AND t.relname IN (${O.raw(t)})
|
|
1501
1502
|
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
1502
1503
|
ORDER BY t.relname, i.relname
|
|
1503
|
-
`);
|
|
1504
|
-
return
|
|
1504
|
+
`));
|
|
1505
|
+
return n.length === 0 ? [] : n.map((e) => ({
|
|
1505
1506
|
table_name: e.table_name,
|
|
1506
1507
|
index_name: e.index_name,
|
|
1507
1508
|
columns: e.columns.split(","),
|
|
1508
1509
|
is_unique: e.is_unique,
|
|
1509
1510
|
is_primary: e.is_primary
|
|
1510
|
-
}))
|
|
1511
|
+
}));
|
|
1511
1512
|
} catch (e) {
|
|
1512
1513
|
return console.warn("Failed to get table indexes:", e), [];
|
|
1513
1514
|
}
|
|
1514
1515
|
}
|
|
1515
1516
|
};
|
|
1516
|
-
function
|
|
1517
|
-
return new
|
|
1517
|
+
function Ee(e, t) {
|
|
1518
|
+
return new Te(e, t, "postgres");
|
|
1518
1519
|
}
|
|
1519
1520
|
//#endregion
|
|
1520
1521
|
//#region src/server/explain/mysql-parser.ts
|
|
1521
|
-
function
|
|
1522
|
+
function De(e, t) {
|
|
1522
1523
|
let n = t?.toLowerCase() || "";
|
|
1523
1524
|
switch (e.toLowerCase()) {
|
|
1524
1525
|
case "all": return "Seq Scan";
|
|
@@ -1532,10 +1533,10 @@ function Ee(e, t) {
|
|
|
1532
1533
|
default: return `MySQL ${e}`;
|
|
1533
1534
|
}
|
|
1534
1535
|
}
|
|
1535
|
-
function
|
|
1536
|
+
function Oe(e, t) {
|
|
1536
1537
|
let n = [], r = [], i = !1, a = 0;
|
|
1537
1538
|
for (let t of e) {
|
|
1538
|
-
let e =
|
|
1539
|
+
let e = De(t.type, t.Extra);
|
|
1539
1540
|
t.type.toLowerCase() === "all" && (i = !0), t.key && r.push(t.key);
|
|
1540
1541
|
let o = {
|
|
1541
1542
|
type: e,
|
|
@@ -1566,7 +1567,7 @@ function De(e, t) {
|
|
|
1566
1567
|
}
|
|
1567
1568
|
//#endregion
|
|
1568
1569
|
//#region src/server/executors/mysql-executor.ts
|
|
1569
|
-
var
|
|
1570
|
+
var ke = class extends H {
|
|
1570
1571
|
async execute(e, t) {
|
|
1571
1572
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1572
1573
|
let n = await e.execute();
|
|
@@ -1601,7 +1602,7 @@ var Oe = class extends H {
|
|
|
1601
1602
|
});
|
|
1602
1603
|
let a = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1603
1604
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1604
|
-
let o = await this.db.execute(
|
|
1605
|
+
let o = await this.db.execute(O.raw(`${a} ${r}`)), s = [];
|
|
1605
1606
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
1606
1607
|
id: e.id || 1,
|
|
1607
1608
|
select_type: e.select_type || "SIMPLE",
|
|
@@ -1616,7 +1617,7 @@ var Oe = class extends H {
|
|
|
1616
1617
|
filtered: Number(e.filtered) || 100,
|
|
1617
1618
|
Extra: e.Extra || null
|
|
1618
1619
|
});
|
|
1619
|
-
return
|
|
1620
|
+
return Oe(s, {
|
|
1620
1621
|
sql: e,
|
|
1621
1622
|
params: t
|
|
1622
1623
|
});
|
|
@@ -1625,7 +1626,7 @@ var Oe = class extends H {
|
|
|
1625
1626
|
if (!e || e.length === 0) return [];
|
|
1626
1627
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1627
1628
|
try {
|
|
1628
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1629
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(O`
|
|
1629
1630
|
SELECT
|
|
1630
1631
|
TABLE_NAME as table_name,
|
|
1631
1632
|
INDEX_NAME as index_name,
|
|
@@ -1634,7 +1635,7 @@ var Oe = class extends H {
|
|
|
1634
1635
|
CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
|
|
1635
1636
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
1636
1637
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
1637
|
-
AND LOWER(TABLE_NAME) IN (${
|
|
1638
|
+
AND LOWER(TABLE_NAME) IN (${O.raw(t)})
|
|
1638
1639
|
GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
|
|
1639
1640
|
ORDER BY TABLE_NAME, INDEX_NAME
|
|
1640
1641
|
`);
|
|
@@ -1650,12 +1651,12 @@ var Oe = class extends H {
|
|
|
1650
1651
|
}
|
|
1651
1652
|
}
|
|
1652
1653
|
};
|
|
1653
|
-
function
|
|
1654
|
-
return new
|
|
1654
|
+
function Ae(e, t) {
|
|
1655
|
+
return new ke(e, t, "mysql");
|
|
1655
1656
|
}
|
|
1656
1657
|
//#endregion
|
|
1657
1658
|
//#region src/server/explain/sqlite-parser.ts
|
|
1658
|
-
function
|
|
1659
|
+
function je(e) {
|
|
1659
1660
|
let t = e.toLowerCase(), n = e.match(/^SCAN\s+(\S+)/i);
|
|
1660
1661
|
if (n) return {
|
|
1661
1662
|
type: "Seq Scan",
|
|
@@ -1680,10 +1681,10 @@ function Ae(e) {
|
|
|
1680
1681
|
table: a[1]
|
|
1681
1682
|
} : 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 };
|
|
1682
1683
|
}
|
|
1683
|
-
function
|
|
1684
|
+
function Me(e, t) {
|
|
1684
1685
|
let n = [], r = [], i = !1, a = /* @__PURE__ */ new Map();
|
|
1685
1686
|
for (let t of e) {
|
|
1686
|
-
let e =
|
|
1687
|
+
let e = je(t.detail);
|
|
1687
1688
|
e.type === "Seq Scan" && (i = !0), e.index && r.push(e.index);
|
|
1688
1689
|
let o = {
|
|
1689
1690
|
type: e.type,
|
|
@@ -1714,7 +1715,7 @@ function je(e, t) {
|
|
|
1714
1715
|
}
|
|
1715
1716
|
//#endregion
|
|
1716
1717
|
//#region src/server/executors/sqlite-executor.ts
|
|
1717
|
-
var
|
|
1718
|
+
var Ne = class extends H {
|
|
1718
1719
|
async execute(e, t) {
|
|
1719
1720
|
if (e && typeof e == "object" && typeof e.execute == "function") {
|
|
1720
1721
|
let n = await e.execute();
|
|
@@ -1754,7 +1755,7 @@ var Me = class extends H {
|
|
|
1754
1755
|
return e === null ? "NULL" : typeof e == "number" ? String(e) : typeof e == "boolean" ? e ? "1" : "0" : e instanceof Date ? `'${e.toISOString()}'` : `'${String(e).replace(/'/g, "''")}'`;
|
|
1755
1756
|
});
|
|
1756
1757
|
let a = `EXPLAIN QUERY PLAN ${r}`, o;
|
|
1757
|
-
if (this.db.all) o = this.db.all(
|
|
1758
|
+
if (this.db.all) o = this.db.all(O.raw(a));
|
|
1758
1759
|
else throw Error("SQLite database instance must have an all() method for EXPLAIN");
|
|
1759
1760
|
let s = [];
|
|
1760
1761
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
@@ -1763,7 +1764,7 @@ var Me = class extends H {
|
|
|
1763
1764
|
notused: Number(e.notused) || 0,
|
|
1764
1765
|
detail: String(e.detail || "")
|
|
1765
1766
|
});
|
|
1766
|
-
return
|
|
1767
|
+
return Me(s, {
|
|
1767
1768
|
sql: e,
|
|
1768
1769
|
params: t
|
|
1769
1770
|
});
|
|
@@ -1774,9 +1775,9 @@ var Me = class extends H {
|
|
|
1774
1775
|
try {
|
|
1775
1776
|
let t = [];
|
|
1776
1777
|
for (let n of e) {
|
|
1777
|
-
let e = this.db.all(
|
|
1778
|
+
let e = this.db.all(O.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));
|
|
1778
1779
|
if (Array.isArray(e)) for (let r of e) {
|
|
1779
|
-
let e = r.name, i = !!r.unique, a = r.origin, o = this.db.all(
|
|
1780
|
+
let e = r.name, i = !!r.unique, a = r.origin, o = this.db.all(O.raw(`SELECT name FROM pragma_index_info('${e}') ORDER BY seqno`)), s = [];
|
|
1780
1781
|
if (Array.isArray(o)) for (let e of o) {
|
|
1781
1782
|
let t = e.name;
|
|
1782
1783
|
typeof t == "string" && s.push(t);
|
|
@@ -1796,29 +1797,29 @@ var Me = class extends H {
|
|
|
1796
1797
|
}
|
|
1797
1798
|
}
|
|
1798
1799
|
};
|
|
1799
|
-
function
|
|
1800
|
-
return new
|
|
1800
|
+
function Pe(e, t) {
|
|
1801
|
+
return new Ne(e, t, "sqlite");
|
|
1801
1802
|
}
|
|
1802
1803
|
//#endregion
|
|
1803
1804
|
//#region src/server/executors/singlestore-executor.ts
|
|
1804
|
-
var
|
|
1805
|
+
var Fe = class extends ke {
|
|
1805
1806
|
getEngineType() {
|
|
1806
1807
|
return "singlestore";
|
|
1807
1808
|
}
|
|
1808
1809
|
};
|
|
1809
|
-
function
|
|
1810
|
-
return new
|
|
1810
|
+
function Ie(e, t) {
|
|
1811
|
+
return new Fe(e, t);
|
|
1811
1812
|
}
|
|
1812
1813
|
//#endregion
|
|
1813
1814
|
//#region src/server/explain/duckdb-parser.ts
|
|
1814
|
-
function
|
|
1815
|
+
function Le(e, t) {
|
|
1815
1816
|
let n = [], r = [], i = !1, a, o = [];
|
|
1816
1817
|
for (let t of e) {
|
|
1817
1818
|
if (/^[┌├└│─┐┤┘]+$/.test(t.trim()) || /EXPLANATION|QUERY PLAN/i.test(t)) continue;
|
|
1818
|
-
let e =
|
|
1819
|
+
let e = ze(t);
|
|
1819
1820
|
if (e) {
|
|
1820
1821
|
(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);
|
|
1821
|
-
let s =
|
|
1822
|
+
let s = Re(t);
|
|
1822
1823
|
for (; o.length > 0 && o[o.length - 1].indent >= s;) o.pop();
|
|
1823
1824
|
if (o.length === 0) n.push(e);
|
|
1824
1825
|
else {
|
|
@@ -1845,13 +1846,13 @@ function Ie(e, t) {
|
|
|
1845
1846
|
sql: t
|
|
1846
1847
|
};
|
|
1847
1848
|
}
|
|
1848
|
-
function
|
|
1849
|
+
function Re(e) {
|
|
1849
1850
|
let t = 0;
|
|
1850
1851
|
for (let n of e) if (n === " " || n === "│" || n === "├" || n === "└" || n === "─") t++;
|
|
1851
1852
|
else break;
|
|
1852
1853
|
return t;
|
|
1853
1854
|
}
|
|
1854
|
-
function
|
|
1855
|
+
function ze(e) {
|
|
1855
1856
|
let t = e.replace(/[┌├└│─┐┤┘]/g, "").replace(/^\s*/, "").trim();
|
|
1856
1857
|
if (!t || t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i)) return null;
|
|
1857
1858
|
let n = t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);
|
|
@@ -1877,7 +1878,7 @@ function Re(e) {
|
|
|
1877
1878
|
}
|
|
1878
1879
|
//#endregion
|
|
1879
1880
|
//#region src/server/executors/duckdb-executor.ts
|
|
1880
|
-
var
|
|
1881
|
+
var Be = class extends H {
|
|
1881
1882
|
async execute(e, t) {
|
|
1882
1883
|
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
1883
1884
|
let n = await e.execute();
|
|
@@ -1961,7 +1962,7 @@ var ze = class extends H {
|
|
|
1961
1962
|
async explainQuery(e, t, n) {
|
|
1962
1963
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1963
1964
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1964
|
-
let i = await this.db.execute(
|
|
1965
|
+
let i = await this.db.execute(O`${O.raw(r)} ${O.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1965
1966
|
let r = t[parseInt(n, 10) - 1];
|
|
1966
1967
|
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
1967
1968
|
}))}`), a = [];
|
|
@@ -1971,7 +1972,7 @@ var ze = class extends H {
|
|
|
1971
1972
|
typeof t == "string" && a.push(t);
|
|
1972
1973
|
}
|
|
1973
1974
|
}
|
|
1974
|
-
return
|
|
1975
|
+
return Le(a, {
|
|
1975
1976
|
sql: e,
|
|
1976
1977
|
params: t
|
|
1977
1978
|
});
|
|
@@ -1980,7 +1981,7 @@ var ze = class extends H {
|
|
|
1980
1981
|
if (!e || e.length === 0) return [];
|
|
1981
1982
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1982
1983
|
try {
|
|
1983
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1984
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(O`
|
|
1984
1985
|
SELECT
|
|
1985
1986
|
table_name,
|
|
1986
1987
|
index_name,
|
|
@@ -1988,7 +1989,7 @@ var ze = class extends H {
|
|
|
1988
1989
|
is_unique,
|
|
1989
1990
|
is_primary
|
|
1990
1991
|
FROM duckdb_indexes()
|
|
1991
|
-
WHERE LOWER(table_name) IN (${
|
|
1992
|
+
WHERE LOWER(table_name) IN (${O.raw(t)})
|
|
1992
1993
|
GROUP BY table_name, index_name, is_unique, is_primary
|
|
1993
1994
|
ORDER BY table_name, index_name
|
|
1994
1995
|
`);
|
|
@@ -2004,19 +2005,19 @@ var ze = class extends H {
|
|
|
2004
2005
|
}
|
|
2005
2006
|
}
|
|
2006
2007
|
};
|
|
2007
|
-
function
|
|
2008
|
-
return new
|
|
2008
|
+
function Ve(e, t) {
|
|
2009
|
+
return new Be(e, t, "duckdb");
|
|
2009
2010
|
}
|
|
2010
2011
|
//#endregion
|
|
2011
2012
|
//#region src/server/explain/databend-parser.ts
|
|
2012
|
-
function
|
|
2013
|
+
function He(e, t) {
|
|
2013
2014
|
let n = [], r = [], i = !1, a, o = [];
|
|
2014
2015
|
for (let t of e) {
|
|
2015
2016
|
if (!t.trim()) continue;
|
|
2016
|
-
let e =
|
|
2017
|
+
let e = We(t);
|
|
2017
2018
|
if (e) {
|
|
2018
2019
|
(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);
|
|
2019
|
-
let s =
|
|
2020
|
+
let s = Ue(t);
|
|
2020
2021
|
for (; o.length > 0 && o[o.length - 1].indent >= s;) o.pop();
|
|
2021
2022
|
if (o.length === 0) n.push(e);
|
|
2022
2023
|
else {
|
|
@@ -2043,13 +2044,13 @@ function Ve(e, t) {
|
|
|
2043
2044
|
sql: t
|
|
2044
2045
|
};
|
|
2045
2046
|
}
|
|
2046
|
-
function
|
|
2047
|
+
function Ue(e) {
|
|
2047
2048
|
let t = 0;
|
|
2048
2049
|
for (let n of e) if (n === " " || n === "│" || n === "├" || n === "└" || n === "─") t++;
|
|
2049
2050
|
else break;
|
|
2050
2051
|
return t;
|
|
2051
2052
|
}
|
|
2052
|
-
function
|
|
2053
|
+
function We(e) {
|
|
2053
2054
|
let t = e.replace(/[┌├└│─┐┤┘]/g, "").replace(/^\s*/, "").trim();
|
|
2054
2055
|
if (!t || /^(filters|table|estimated rows|output columns|push downs):/.test(t)) return null;
|
|
2055
2056
|
let n = t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);
|
|
@@ -2063,7 +2064,7 @@ function Ue(e) {
|
|
|
2063
2064
|
}
|
|
2064
2065
|
//#endregion
|
|
2065
2066
|
//#region src/server/executors/databend-executor.ts
|
|
2066
|
-
var
|
|
2067
|
+
var Ge = class extends H {
|
|
2067
2068
|
async execute(e, t) {
|
|
2068
2069
|
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
2069
2070
|
let n = await e.execute();
|
|
@@ -2147,7 +2148,7 @@ var We = class extends H {
|
|
|
2147
2148
|
async explainQuery(e, t, n) {
|
|
2148
2149
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
2149
2150
|
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
2150
|
-
let i = await this.db.execute(
|
|
2151
|
+
let i = await this.db.execute(O`${O.raw(r)} ${O.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
2151
2152
|
let r = t[parseInt(n, 10) - 1];
|
|
2152
2153
|
return r === null ? "NULL" : typeof r == "number" ? String(r) : typeof r == "boolean" ? r ? "TRUE" : "FALSE" : r instanceof Date ? `'${r.toISOString()}'` : `'${String(r).replace(/'/g, "''")}'`;
|
|
2153
2154
|
}))}`), a = [];
|
|
@@ -2157,7 +2158,7 @@ var We = class extends H {
|
|
|
2157
2158
|
typeof t == "string" && a.push(t);
|
|
2158
2159
|
}
|
|
2159
2160
|
}
|
|
2160
|
-
return
|
|
2161
|
+
return He(a, {
|
|
2161
2162
|
sql: e,
|
|
2162
2163
|
params: t
|
|
2163
2164
|
});
|
|
@@ -2166,19 +2167,19 @@ var We = class extends H {
|
|
|
2166
2167
|
return !e || e.length, [];
|
|
2167
2168
|
}
|
|
2168
2169
|
};
|
|
2169
|
-
function
|
|
2170
|
-
return new
|
|
2170
|
+
function Ke(e, t) {
|
|
2171
|
+
return new Ge(e, t, "databend");
|
|
2171
2172
|
}
|
|
2172
2173
|
//#endregion
|
|
2173
2174
|
//#region src/server/explain/snowflake-parser.ts
|
|
2174
|
-
function
|
|
2175
|
+
function qe(e, t) {
|
|
2175
2176
|
let n = [], r = [], i = !1, a, o = [];
|
|
2176
2177
|
for (let t of e) {
|
|
2177
2178
|
if (!t.trim()) continue;
|
|
2178
|
-
let e =
|
|
2179
|
+
let e = Ye(t);
|
|
2179
2180
|
if (e) {
|
|
2180
2181
|
(e.type.includes("TableScan") || e.type.includes("SCAN")) && (i = !0), n.length === 0 && e.estimatedCost !== void 0 && (a = e.estimatedCost);
|
|
2181
|
-
let r =
|
|
2182
|
+
let r = Je(t);
|
|
2182
2183
|
for (; o.length > 0 && o[o.length - 1].indent >= r;) o.pop();
|
|
2183
2184
|
if (o.length === 0) n.push(e);
|
|
2184
2185
|
else {
|
|
@@ -2205,13 +2206,13 @@ function Ke(e, t) {
|
|
|
2205
2206
|
sql: t
|
|
2206
2207
|
};
|
|
2207
2208
|
}
|
|
2208
|
-
function
|
|
2209
|
+
function Je(e) {
|
|
2209
2210
|
let t = 0;
|
|
2210
2211
|
for (let n of e) if (n === " " || n === "-" || n === ">") t++;
|
|
2211
2212
|
else break;
|
|
2212
2213
|
return t;
|
|
2213
2214
|
}
|
|
2214
|
-
function
|
|
2215
|
+
function Ye(e) {
|
|
2215
2216
|
let t = e.replace(/^[\s\d:]*->/, "").trim();
|
|
2216
2217
|
if (!t || /^(GlobalStats|partitions|bytes):/i.test(t) || /^\w+=\d+/.test(t)) return null;
|
|
2217
2218
|
let n = t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);
|
|
@@ -2225,7 +2226,7 @@ function Je(e) {
|
|
|
2225
2226
|
}
|
|
2226
2227
|
//#endregion
|
|
2227
2228
|
//#region src/server/executors/snowflake-executor.ts
|
|
2228
|
-
var
|
|
2229
|
+
var Xe = class extends H {
|
|
2229
2230
|
async execute(e, t) {
|
|
2230
2231
|
if (e && typeof e == "object" && typeof e.execute == "function") try {
|
|
2231
2232
|
let n = await e.execute();
|
|
@@ -2308,7 +2309,7 @@ var Ye = class extends H {
|
|
|
2308
2309
|
}
|
|
2309
2310
|
async explainQuery(e, t, n) {
|
|
2310
2311
|
if (n?.analyze, !this.db.execute) throw Error("Snowflake database instance must have an execute method");
|
|
2311
|
-
let r = await this.db.execute(
|
|
2312
|
+
let r = await this.db.execute(O`${O.raw("EXPLAIN")} ${O.raw(e.replace(/\?/g, () => {
|
|
2312
2313
|
let e = t.shift();
|
|
2313
2314
|
return e === null ? "NULL" : typeof e == "number" ? String(e) : typeof e == "boolean" ? e ? "TRUE" : "FALSE" : e instanceof Date ? `'${e.toISOString()}'` : `'${String(e).replace(/'/g, "''")}'`;
|
|
2314
2315
|
}))}`), i = [];
|
|
@@ -2318,7 +2319,7 @@ var Ye = class extends H {
|
|
|
2318
2319
|
typeof t == "string" && i.push(t);
|
|
2319
2320
|
}
|
|
2320
2321
|
}
|
|
2321
|
-
return
|
|
2322
|
+
return qe(i, {
|
|
2322
2323
|
sql: e,
|
|
2323
2324
|
params: t
|
|
2324
2325
|
});
|
|
@@ -2327,23 +2328,23 @@ var Ye = class extends H {
|
|
|
2327
2328
|
return [];
|
|
2328
2329
|
}
|
|
2329
2330
|
};
|
|
2330
|
-
function
|
|
2331
|
-
return new
|
|
2331
|
+
function Ze(e, t) {
|
|
2332
|
+
return new Xe(e, t, "snowflake");
|
|
2332
2333
|
}
|
|
2333
2334
|
//#endregion
|
|
2334
2335
|
//#region src/server/executors/index.ts
|
|
2335
|
-
function
|
|
2336
|
+
function Qe(e, t, n) {
|
|
2336
2337
|
if (n) switch (n) {
|
|
2337
|
-
case "postgres": return
|
|
2338
|
-
case "mysql": return
|
|
2339
|
-
case "sqlite": return
|
|
2340
|
-
case "singlestore": return
|
|
2341
|
-
case "duckdb": return
|
|
2342
|
-
case "databend": return
|
|
2343
|
-
case "snowflake": return
|
|
2344
|
-
}
|
|
2345
|
-
if (e.all && e.run) return
|
|
2346
|
-
if (e.execute) return
|
|
2338
|
+
case "postgres": return Ee(e, t);
|
|
2339
|
+
case "mysql": return Ae(e, t);
|
|
2340
|
+
case "sqlite": return Pe(e, t);
|
|
2341
|
+
case "singlestore": return Ie(e, t);
|
|
2342
|
+
case "duckdb": return Ve(e, t);
|
|
2343
|
+
case "databend": return Ke(e, t);
|
|
2344
|
+
case "snowflake": return Ze(e, t);
|
|
2345
|
+
}
|
|
2346
|
+
if (e.all && e.run) return Pe(e, t);
|
|
2347
|
+
if (e.execute) return Ee(e, t);
|
|
2347
2348
|
throw Error("Unable to determine database engine type. Please specify engineType parameter.");
|
|
2348
2349
|
}
|
|
2349
2350
|
//#endregion
|
|
@@ -2351,7 +2352,7 @@ function Ze(e, t, n) {
|
|
|
2351
2352
|
function U(e, t) {
|
|
2352
2353
|
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;
|
|
2353
2354
|
}
|
|
2354
|
-
function
|
|
2355
|
+
function $e(e) {
|
|
2355
2356
|
switch (e) {
|
|
2356
2357
|
case "belongsTo": return "hasMany";
|
|
2357
2358
|
case "hasMany": return "belongsTo";
|
|
@@ -2360,7 +2361,7 @@ function Qe(e) {
|
|
|
2360
2361
|
default: return e;
|
|
2361
2362
|
}
|
|
2362
2363
|
}
|
|
2363
|
-
function
|
|
2364
|
+
function et(e, t) {
|
|
2364
2365
|
if (t) return t;
|
|
2365
2366
|
switch (e) {
|
|
2366
2367
|
case "belongsTo": return "inner";
|
|
@@ -2370,26 +2371,26 @@ function $e(e, t) {
|
|
|
2370
2371
|
default: return "left";
|
|
2371
2372
|
}
|
|
2372
2373
|
}
|
|
2373
|
-
function et(e) {
|
|
2374
|
-
return e && typeof e == "object" ? D`${D`${e}`}` : e;
|
|
2375
|
-
}
|
|
2376
2374
|
function tt(e) {
|
|
2375
|
+
return e && typeof e == "object" ? O`${O`${e}`}` : e;
|
|
2376
|
+
}
|
|
2377
|
+
function nt(e) {
|
|
2377
2378
|
if (e === "__proto__" || e === "constructor" || e === "prototype") throw Error(`Unsafe property key: ${e}`);
|
|
2378
2379
|
return e;
|
|
2379
2380
|
}
|
|
2380
2381
|
function W(e, t) {
|
|
2381
|
-
return
|
|
2382
|
+
return tt(typeof e == "function" ? e(t) : e);
|
|
2382
2383
|
}
|
|
2383
|
-
function
|
|
2384
|
+
function rt(e, t) {
|
|
2384
2385
|
if (e.relationship !== "belongsToMany" || !e.through) throw Error("expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration");
|
|
2385
2386
|
let { table: n, sourceKey: r, targetKey: i, securitySql: a } = e.through, o = [];
|
|
2386
2387
|
for (let e of r) {
|
|
2387
|
-
let t = e.as ||
|
|
2388
|
+
let t = e.as || N;
|
|
2388
2389
|
o.push(t(e.source, e.target));
|
|
2389
2390
|
}
|
|
2390
2391
|
let s = [];
|
|
2391
2392
|
for (let e of i) {
|
|
2392
|
-
let t = e.as ||
|
|
2393
|
+
let t = e.as || N;
|
|
2393
2394
|
s.push(t(e.source, e.target));
|
|
2394
2395
|
}
|
|
2395
2396
|
let c;
|
|
@@ -2397,16 +2398,16 @@ function nt(e, t) {
|
|
|
2397
2398
|
let e = a(t);
|
|
2398
2399
|
c = Array.isArray(e) ? e : [e];
|
|
2399
2400
|
}
|
|
2400
|
-
let l =
|
|
2401
|
+
let l = et("belongsToMany", e.sqlJoinType);
|
|
2401
2402
|
return {
|
|
2402
2403
|
junctionJoins: [{
|
|
2403
2404
|
joinType: l,
|
|
2404
2405
|
table: n,
|
|
2405
|
-
condition:
|
|
2406
|
+
condition: F(...o)
|
|
2406
2407
|
}, {
|
|
2407
2408
|
joinType: l,
|
|
2408
2409
|
table: n,
|
|
2409
|
-
condition:
|
|
2410
|
+
condition: F(...s)
|
|
2410
2411
|
}],
|
|
2411
2412
|
junctionSecurityConditions: c
|
|
2412
2413
|
};
|
|
@@ -2419,7 +2420,7 @@ function G(e) {
|
|
|
2419
2420
|
let t = e, n = JSON.stringify(Array.isArray(t.values) ? [...t.values].sort() : t.values), r = t.dateRange ? `:dr:${JSON.stringify(t.dateRange)}` : "";
|
|
2420
2421
|
return `${t.member}:${t.operator}:${n}${r}`;
|
|
2421
2422
|
}
|
|
2422
|
-
function
|
|
2423
|
+
function it(e, t) {
|
|
2423
2424
|
return `timeDim:${e}:${JSON.stringify(t)}`;
|
|
2424
2425
|
}
|
|
2425
2426
|
var K = class {
|
|
@@ -2460,37 +2461,37 @@ var K = class {
|
|
|
2460
2461
|
};
|
|
2461
2462
|
}
|
|
2462
2463
|
};
|
|
2463
|
-
function
|
|
2464
|
+
function at(e) {
|
|
2464
2465
|
let t = [];
|
|
2465
|
-
for (let n of e) "and" in n && n.and ? t.push(...
|
|
2466
|
+
for (let n of e) "and" in n && n.and ? t.push(...at(n.and)) : "or" in n && n.or ? t.push(...at(n.or)) : "member" in n && t.push(n);
|
|
2466
2467
|
return t;
|
|
2467
2468
|
}
|
|
2468
2469
|
//#endregion
|
|
2469
2470
|
//#region src/server/cache-utils.ts
|
|
2470
|
-
function
|
|
2471
|
-
let r = n.keyPrefix ?? "drizzle-cube:", i =
|
|
2471
|
+
function ot(e, t, n = {}) {
|
|
2472
|
+
let r = n.keyPrefix ?? "drizzle-cube:", i = st(e), a = `${r}query:${ft(JSON.stringify(i))}`;
|
|
2472
2473
|
if (n.includeSecurityContext !== !1) {
|
|
2473
|
-
let e =
|
|
2474
|
+
let e = ft(n.securityContextSerializer ? n.securityContextSerializer(t) : JSON.stringify(J(t)));
|
|
2474
2475
|
a += `:ctx:${e}`;
|
|
2475
2476
|
}
|
|
2476
2477
|
return a;
|
|
2477
2478
|
}
|
|
2478
|
-
function
|
|
2479
|
+
function st(e) {
|
|
2479
2480
|
return {
|
|
2480
2481
|
measures: e.measures ? [...e.measures].sort() : void 0,
|
|
2481
2482
|
dimensions: e.dimensions ? [...e.dimensions].sort() : void 0,
|
|
2482
2483
|
filters: e.filters ? q(e.filters) : void 0,
|
|
2483
|
-
timeDimensions: e.timeDimensions ?
|
|
2484
|
+
timeDimensions: e.timeDimensions ? dt(e.timeDimensions) : void 0,
|
|
2484
2485
|
limit: e.limit,
|
|
2485
2486
|
offset: e.offset,
|
|
2486
2487
|
order: e.order ? J(e.order) : void 0,
|
|
2487
2488
|
fillMissingDatesValue: e.fillMissingDatesValue,
|
|
2488
|
-
funnel: e.funnel ?
|
|
2489
|
-
flow: e.flow ?
|
|
2490
|
-
retention: e.retention ?
|
|
2489
|
+
funnel: e.funnel ? ct(e.funnel) : void 0,
|
|
2490
|
+
flow: e.flow ? lt(e.flow) : void 0,
|
|
2491
|
+
retention: e.retention ? ut(e.retention) : void 0
|
|
2491
2492
|
};
|
|
2492
2493
|
}
|
|
2493
|
-
function
|
|
2494
|
+
function ct(e) {
|
|
2494
2495
|
return {
|
|
2495
2496
|
bindingKey: e.bindingKey,
|
|
2496
2497
|
timeDimension: e.timeDimension,
|
|
@@ -2506,7 +2507,7 @@ function st(e) {
|
|
|
2506
2507
|
globalTimeWindow: e.globalTimeWindow
|
|
2507
2508
|
};
|
|
2508
2509
|
}
|
|
2509
|
-
function
|
|
2510
|
+
function lt(e) {
|
|
2510
2511
|
return {
|
|
2511
2512
|
bindingKey: e.bindingKey,
|
|
2512
2513
|
timeDimension: e.timeDimension,
|
|
@@ -2522,7 +2523,7 @@ function ct(e) {
|
|
|
2522
2523
|
joinStrategy: e.joinStrategy
|
|
2523
2524
|
};
|
|
2524
2525
|
}
|
|
2525
|
-
function
|
|
2526
|
+
function ut(e) {
|
|
2526
2527
|
return {
|
|
2527
2528
|
timeDimension: e.timeDimension,
|
|
2528
2529
|
bindingKey: e.bindingKey,
|
|
@@ -2546,7 +2547,7 @@ function q(e) {
|
|
|
2546
2547
|
};
|
|
2547
2548
|
}).sort((e, t) => JSON.stringify(e).localeCompare(JSON.stringify(t)));
|
|
2548
2549
|
}
|
|
2549
|
-
function
|
|
2550
|
+
function dt(e) {
|
|
2550
2551
|
return [...e].map((e) => ({
|
|
2551
2552
|
dimension: e.dimension,
|
|
2552
2553
|
granularity: e.granularity,
|
|
@@ -2561,7 +2562,7 @@ function ut(e) {
|
|
|
2561
2562
|
function J(e) {
|
|
2562
2563
|
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(J) : Object.keys(e).sort().reduce((t, n) => (t[n] = J(e[n]), t), {});
|
|
2563
2564
|
}
|
|
2564
|
-
function
|
|
2565
|
+
function ft(e) {
|
|
2565
2566
|
let t = 2166136261, n = Math.min(e.length, 65536);
|
|
2566
2567
|
for (let r = 0; r < n; r++) t ^= e.charCodeAt(r), t = t * 16777619 >>> 0;
|
|
2567
2568
|
return t.toString(16).padStart(8, "0");
|
|
@@ -2574,7 +2575,7 @@ var Y = class {
|
|
|
2574
2575
|
}
|
|
2575
2576
|
buildTimeDimensionExpression(e, t, n) {
|
|
2576
2577
|
let r = W(e, n);
|
|
2577
|
-
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof S ? r :
|
|
2578
|
+
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof S ? r : O`${r}`;
|
|
2578
2579
|
}
|
|
2579
2580
|
buildDateRangeCondition(e, t) {
|
|
2580
2581
|
if (!t) return null;
|
|
@@ -2585,13 +2586,13 @@ var Y = class {
|
|
|
2585
2586
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2586
2587
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2587
2588
|
}
|
|
2588
|
-
return
|
|
2589
|
+
return F(L(e, n), R(e, r));
|
|
2589
2590
|
}
|
|
2590
2591
|
if (typeof t == "string") {
|
|
2591
2592
|
let n = this.parseRelativeDateRange(t);
|
|
2592
2593
|
if (n) {
|
|
2593
2594
|
let t, r;
|
|
2594
|
-
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()),
|
|
2595
|
+
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()), F(L(e, t), R(e, r));
|
|
2595
2596
|
}
|
|
2596
2597
|
let r = this.normalizeDate(t);
|
|
2597
2598
|
if (!r) return null;
|
|
@@ -2600,7 +2601,7 @@ var Y = class {
|
|
|
2600
2601
|
let o = new Date(i);
|
|
2601
2602
|
o.setUTCHours(23, 59, 59, 999);
|
|
2602
2603
|
let s, c;
|
|
2603
|
-
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()),
|
|
2604
|
+
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()), F(L(e, s), R(e, c));
|
|
2604
2605
|
}
|
|
2605
2606
|
return null;
|
|
2606
2607
|
}
|
|
@@ -2750,18 +2751,18 @@ var Y = class {
|
|
|
2750
2751
|
if (a.length === 0 && !["set", "notSet"].includes(t)) return t === "equals" ? this.databaseAdapter.buildBooleanLiteral(!1) : null;
|
|
2751
2752
|
let o = a[0];
|
|
2752
2753
|
switch (t) {
|
|
2753
|
-
case "equals": return a.length > 1 ? r?.type === "time" ?
|
|
2754
|
-
case "notEquals": return a.length > 1 ?
|
|
2754
|
+
case "equals": return a.length > 1 ? r?.type === "time" ? ne(e, a.map((e) => this.dateTimeBuilder.normalizeDate(e) || e)) : ne(e, a) : a.length === 1 ? N(e, r?.type === "time" && this.dateTimeBuilder.normalizeDate(o) || o) : this.databaseAdapter.buildBooleanLiteral(!1);
|
|
2755
|
+
case "notEquals": return a.length > 1 ? re(e, a) : a.length === 1 ? P(e, o) : null;
|
|
2755
2756
|
case "contains": return this.databaseAdapter.buildStringCondition(e, "contains", o);
|
|
2756
2757
|
case "notContains": return this.databaseAdapter.buildStringCondition(e, "notContains", o);
|
|
2757
2758
|
case "startsWith": return this.databaseAdapter.buildStringCondition(e, "startsWith", o);
|
|
2758
2759
|
case "endsWith": return this.databaseAdapter.buildStringCondition(e, "endsWith", o);
|
|
2759
|
-
case "gt": return
|
|
2760
|
-
case "gte": return
|
|
2761
|
-
case "lt": return
|
|
2762
|
-
case "lte": return
|
|
2763
|
-
case "set": return
|
|
2764
|
-
case "notSet": return
|
|
2760
|
+
case "gt": return ee(e, o);
|
|
2761
|
+
case "gte": return L(e, o);
|
|
2762
|
+
case "lt": return te(e, o);
|
|
2763
|
+
case "lte": return R(e, o);
|
|
2764
|
+
case "set": return ae(e);
|
|
2765
|
+
case "notSet": return ie(e);
|
|
2765
2766
|
case "inDateRange":
|
|
2766
2767
|
if (a.length >= 2) {
|
|
2767
2768
|
let t = this.dateTimeBuilder.normalizeDate(a[0]), r = this.dateTimeBuilder.normalizeDate(a[1]);
|
|
@@ -2771,43 +2772,43 @@ var Y = class {
|
|
|
2771
2772
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2772
2773
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2773
2774
|
}
|
|
2774
|
-
return
|
|
2775
|
+
return F(L(e, t), R(e, r));
|
|
2775
2776
|
}
|
|
2776
2777
|
}
|
|
2777
2778
|
return null;
|
|
2778
2779
|
case "beforeDate": {
|
|
2779
2780
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2780
|
-
return t ?
|
|
2781
|
+
return t ? te(e, t) : null;
|
|
2781
2782
|
}
|
|
2782
2783
|
case "afterDate": {
|
|
2783
2784
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2784
|
-
return t ?
|
|
2785
|
+
return t ? ee(e, t) : null;
|
|
2785
2786
|
}
|
|
2786
|
-
case "between": return a.length >= 2 ?
|
|
2787
|
-
case "notBetween": return a.length >= 2 ?
|
|
2788
|
-
case "in": return a.length > 0 ?
|
|
2789
|
-
case "notIn": return a.length > 0 ?
|
|
2787
|
+
case "between": return a.length >= 2 ? F(L(e, a[0]), R(e, a[1])) : null;
|
|
2788
|
+
case "notBetween": return a.length >= 2 ? I(te(e, a[0]), ee(e, a[1])) : null;
|
|
2789
|
+
case "in": return a.length > 0 ? ne(e, a) : null;
|
|
2790
|
+
case "notIn": return a.length > 0 ? re(e, a) : null;
|
|
2790
2791
|
case "like": return this.databaseAdapter.buildStringCondition(e, "like", o);
|
|
2791
2792
|
case "notLike": return this.databaseAdapter.buildStringCondition(e, "notLike", o);
|
|
2792
2793
|
case "ilike": return this.databaseAdapter.buildStringCondition(e, "ilike", o);
|
|
2793
2794
|
case "regex": return this.databaseAdapter.buildStringCondition(e, "regex", o);
|
|
2794
2795
|
case "notRegex": return this.databaseAdapter.buildStringCondition(e, "notRegex", o);
|
|
2795
|
-
case "isEmpty": return
|
|
2796
|
-
case "isNotEmpty": return
|
|
2797
|
-
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2798
|
-
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2799
|
-
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2796
|
+
case "isEmpty": return I(ie(e), N(e, ""));
|
|
2797
|
+
case "isNotEmpty": return F(ae(e), P(e, ""));
|
|
2798
|
+
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ? oe(e, a) : null;
|
|
2799
|
+
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ? ce(e, a) : null;
|
|
2800
|
+
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ? se(e, a) : null;
|
|
2800
2801
|
default: return null;
|
|
2801
2802
|
}
|
|
2802
2803
|
}
|
|
2803
2804
|
buildLogicalFilter(e, t, n) {
|
|
2804
2805
|
if ("and" in e && e.and) {
|
|
2805
2806
|
let r = e.and.map((e) => this.buildSingleFilter(e, t, n)).filter((e) => e !== null);
|
|
2806
|
-
return r.length > 0 ? r.length === 1 ? r[0] :
|
|
2807
|
+
return r.length > 0 ? r.length === 1 ? r[0] : F(...r) : null;
|
|
2807
2808
|
}
|
|
2808
2809
|
if ("or" in e && e.or) {
|
|
2809
2810
|
let r = e.or.map((e) => this.buildSingleFilter(e, t, n)).filter((e) => e !== null);
|
|
2810
|
-
return r.length > 0 ? r.length === 1 ? r[0] :
|
|
2811
|
+
return r.length > 0 ? r.length === 1 ? r[0] : I(...r) : null;
|
|
2811
2812
|
}
|
|
2812
2813
|
return null;
|
|
2813
2814
|
}
|
|
@@ -2948,14 +2949,14 @@ var Y = class {
|
|
|
2948
2949
|
};
|
|
2949
2950
|
//#endregion
|
|
2950
2951
|
//#region src/server/template-substitution.ts
|
|
2951
|
-
function
|
|
2952
|
-
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a =
|
|
2952
|
+
function pt(e, t) {
|
|
2953
|
+
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a = mt(e), o = /* @__PURE__ */ new Map();
|
|
2953
2954
|
for (let e of a) {
|
|
2954
2955
|
let { originalRef: t, cubeName: a, fieldName: s } = e, c = a || n.name;
|
|
2955
2956
|
if (!r.get(c)) throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);
|
|
2956
2957
|
let l = `${c}.${s}`, u = i.get(l);
|
|
2957
2958
|
if (!u) throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);
|
|
2958
|
-
let d =
|
|
2959
|
+
let d = O`${u()}`;
|
|
2959
2960
|
o.set(t, d);
|
|
2960
2961
|
}
|
|
2961
2962
|
let s = [], c = [], l = 0;
|
|
@@ -2967,12 +2968,12 @@ function ft(e, t) {
|
|
|
2967
2968
|
i && c.push(i), l = r + n.length;
|
|
2968
2969
|
}
|
|
2969
2970
|
}
|
|
2970
|
-
if (s.push(e.substring(l)), c.length === 0) return
|
|
2971
|
+
if (s.push(e.substring(l)), c.length === 0) return O.raw(e);
|
|
2971
2972
|
let u = [];
|
|
2972
2973
|
for (let e = 0; e < s.length; e++) s[e] && u.push(new x(s[e])), e < c.length && u.push(c[e]);
|
|
2973
|
-
return
|
|
2974
|
+
return O.join(u, O.raw(""));
|
|
2974
2975
|
}
|
|
2975
|
-
function
|
|
2976
|
+
function mt(e) {
|
|
2976
2977
|
if (e.length > 1e3) return [];
|
|
2977
2978
|
let t = e.matchAll(/\{([^}]+)\}/g), n = [];
|
|
2978
2979
|
for (let e of t) {
|
|
@@ -2992,7 +2993,7 @@ function pt(e) {
|
|
|
2992
2993
|
}
|
|
2993
2994
|
return n;
|
|
2994
2995
|
}
|
|
2995
|
-
function
|
|
2996
|
+
function ht(e) {
|
|
2996
2997
|
let t = [], n = 0;
|
|
2997
2998
|
for (let r = 0; r < e.length; r++) if (e[r] === "{") n++;
|
|
2998
2999
|
else if (e[r] === "}" && (n--, n < 0)) {
|
|
@@ -3000,7 +3001,7 @@ function mt(e) {
|
|
|
3000
3001
|
break;
|
|
3001
3002
|
}
|
|
3002
3003
|
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");
|
|
3003
|
-
let r =
|
|
3004
|
+
let r = mt(e);
|
|
3004
3005
|
for (let e of r) {
|
|
3005
3006
|
let n = e.cubeName ? `${e.cubeName}.${e.fieldName}` : e.fieldName;
|
|
3006
3007
|
/^[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)`);
|
|
@@ -3010,8 +3011,8 @@ function mt(e) {
|
|
|
3010
3011
|
errors: t
|
|
3011
3012
|
};
|
|
3012
3013
|
}
|
|
3013
|
-
function
|
|
3014
|
-
let n =
|
|
3014
|
+
function gt(e, t) {
|
|
3015
|
+
let n = mt(e), r = /* @__PURE__ */ new Set();
|
|
3015
3016
|
for (let e of n) {
|
|
3016
3017
|
let n = `${e.cubeName || t}.${e.fieldName}`;
|
|
3017
3018
|
r.add(n);
|
|
@@ -3038,11 +3039,11 @@ var Q = class e {
|
|
|
3038
3039
|
n && c.add(n);
|
|
3039
3040
|
continue;
|
|
3040
3041
|
}
|
|
3041
|
-
Z.isCalculatedMeasure(d) ? (s.push(r),
|
|
3042
|
+
Z.isCalculatedMeasure(d) ? (s.push(r), gt(d.calculatedSql, t).forEach((e) => c.add(e)), l.getAllDependencies(r).forEach((e) => {
|
|
3042
3043
|
let [t, r] = e.split("."), i = n.get(t);
|
|
3043
3044
|
if (i && i.measures[r]) {
|
|
3044
3045
|
let e = i.measures[r];
|
|
3045
|
-
Z.isCalculatedMeasure(e) &&
|
|
3046
|
+
Z.isCalculatedMeasure(e) && gt(e.calculatedSql, t).forEach((e) => c.add(e));
|
|
3046
3047
|
}
|
|
3047
3048
|
})) : o.push(r);
|
|
3048
3049
|
}
|
|
@@ -3073,7 +3074,7 @@ var Q = class e {
|
|
|
3073
3074
|
}
|
|
3074
3075
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
3075
3076
|
if (!e.calculatedSql) throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);
|
|
3076
|
-
return
|
|
3077
|
+
return pt(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql), {
|
|
3077
3078
|
cube: t,
|
|
3078
3079
|
allCubes: n,
|
|
3079
3080
|
resolvedMeasures: r,
|
|
@@ -3082,32 +3083,32 @@ var Q = class e {
|
|
|
3082
3083
|
}
|
|
3083
3084
|
buildCTECalculatedMeasure(e, t, n, r, i) {
|
|
3084
3085
|
if (!e.calculatedSql) throw Error(`Calculated measure '${t.name}.${e.name || "unknown"}' missing calculatedSql property`);
|
|
3085
|
-
let a = /* @__PURE__ */ new Map(), o =
|
|
3086
|
+
let a = /* @__PURE__ */ new Map(), o = gt(e.calculatedSql, t.name);
|
|
3086
3087
|
for (let e of o) {
|
|
3087
3088
|
let [t, i] = e.split("."), o = r.get(t);
|
|
3088
3089
|
if (o && o.measures[i]) {
|
|
3089
3090
|
let t = o.measures[i];
|
|
3090
3091
|
if (n.measures.includes(e)) {
|
|
3091
|
-
let r =
|
|
3092
|
+
let r = O`${O.identifier(n.cteAlias)}.${O.identifier(i)}`, o;
|
|
3092
3093
|
switch (t.type) {
|
|
3093
3094
|
case "count":
|
|
3094
3095
|
case "countDistinct":
|
|
3095
3096
|
case "sum":
|
|
3096
|
-
o =
|
|
3097
|
+
o = z(r);
|
|
3097
3098
|
break;
|
|
3098
3099
|
case "avg":
|
|
3099
3100
|
o = this.databaseAdapter.buildAvg(r);
|
|
3100
3101
|
break;
|
|
3101
3102
|
case "min":
|
|
3102
|
-
o =
|
|
3103
|
+
o = pe(r);
|
|
3103
3104
|
break;
|
|
3104
3105
|
case "max":
|
|
3105
|
-
o =
|
|
3106
|
+
o = B(r);
|
|
3106
3107
|
break;
|
|
3107
3108
|
case "number":
|
|
3108
|
-
o =
|
|
3109
|
+
o = z(r);
|
|
3109
3110
|
break;
|
|
3110
|
-
default: o =
|
|
3111
|
+
default: o = z(r);
|
|
3111
3112
|
}
|
|
3112
3113
|
a.set(e, () => o);
|
|
3113
3114
|
}
|
|
@@ -3125,16 +3126,16 @@ var Q = class e {
|
|
|
3125
3126
|
if (i.joinCubes) for (let e of i.joinCubes) o.set(e.cube.name, e.cube);
|
|
3126
3127
|
return this.buildCTECalculatedMeasure(n, t, a, o, r);
|
|
3127
3128
|
} else {
|
|
3128
|
-
let e =
|
|
3129
|
+
let e = O`${O.identifier(a.cteAlias)}.${O.identifier(t)}`;
|
|
3129
3130
|
switch (n.type) {
|
|
3130
3131
|
case "count":
|
|
3131
3132
|
case "countDistinct":
|
|
3132
|
-
case "sum": return
|
|
3133
|
+
case "sum": return z(e);
|
|
3133
3134
|
case "avg": return this.databaseAdapter.buildAvg(e);
|
|
3134
|
-
case "min": return
|
|
3135
|
-
case "max": return
|
|
3136
|
-
case "number": return
|
|
3137
|
-
default: return
|
|
3135
|
+
case "min": return pe(e);
|
|
3136
|
+
case "max": return B(e);
|
|
3137
|
+
case "number": return z(e);
|
|
3138
|
+
default: return z(e);
|
|
3138
3139
|
}
|
|
3139
3140
|
}
|
|
3140
3141
|
}
|
|
@@ -3149,10 +3150,10 @@ var Q = class e {
|
|
|
3149
3150
|
if (t.filters && t.filters.length > 0) {
|
|
3150
3151
|
let e = t.filters.map((e) => {
|
|
3151
3152
|
let t = e(n);
|
|
3152
|
-
return t ?
|
|
3153
|
+
return t ? O`(${t})` : void 0;
|
|
3153
3154
|
}).filter(Boolean);
|
|
3154
3155
|
if (e.length > 0) {
|
|
3155
|
-
let t = e.length === 1 ? e[0] :
|
|
3156
|
+
let t = e.length === 1 ? e[0] : F(...e);
|
|
3156
3157
|
i = this.databaseAdapter.buildCaseWhen([{
|
|
3157
3158
|
when: t,
|
|
3158
3159
|
then: i
|
|
@@ -3160,22 +3161,22 @@ var Q = class e {
|
|
|
3160
3161
|
}
|
|
3161
3162
|
}
|
|
3162
3163
|
switch (t.type) {
|
|
3163
|
-
case "count": return
|
|
3164
|
-
case "countDistinct": return
|
|
3165
|
-
case "sum": return
|
|
3164
|
+
case "count": return de(i);
|
|
3165
|
+
case "countDistinct": return fe(i);
|
|
3166
|
+
case "sum": return z(i);
|
|
3166
3167
|
case "avg": return this.databaseAdapter.buildAvg(i);
|
|
3167
|
-
case "min": return
|
|
3168
|
-
case "max": return
|
|
3168
|
+
case "min": return pe(i);
|
|
3169
|
+
case "max": return B(i);
|
|
3169
3170
|
case "number": return i;
|
|
3170
3171
|
case "stddev":
|
|
3171
3172
|
case "stddevSamp": {
|
|
3172
3173
|
let e = t.type === "stddevSamp" || t.statisticalConfig?.useSample, n = this.databaseAdapter.buildStddev(i, e);
|
|
3173
|
-
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3174
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), O`MAX(NULL)`) : n;
|
|
3174
3175
|
}
|
|
3175
3176
|
case "variance":
|
|
3176
3177
|
case "varianceSamp": {
|
|
3177
3178
|
let e = t.type === "varianceSamp" || t.statisticalConfig?.useSample, n = this.databaseAdapter.buildVariance(i, e);
|
|
3178
|
-
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3179
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), O`MAX(NULL)`) : n;
|
|
3179
3180
|
}
|
|
3180
3181
|
case "percentile":
|
|
3181
3182
|
case "median":
|
|
@@ -3195,7 +3196,7 @@ var Q = class e {
|
|
|
3195
3196
|
default: e = t.statisticalConfig?.percentile ?? 50;
|
|
3196
3197
|
}
|
|
3197
3198
|
let n = this.databaseAdapter.buildPercentile(i, e);
|
|
3198
|
-
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3199
|
+
return n === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), O`MAX(NULL)`) : n;
|
|
3199
3200
|
}
|
|
3200
3201
|
case "lag":
|
|
3201
3202
|
case "lead":
|
|
@@ -3241,9 +3242,9 @@ var Q = class e {
|
|
|
3241
3242
|
nTile: e.nTile,
|
|
3242
3243
|
frame: e.frame
|
|
3243
3244
|
});
|
|
3244
|
-
return s === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
3245
|
+
return s === null ? (console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), O`NULL`) : s;
|
|
3245
3246
|
}
|
|
3246
|
-
default: return
|
|
3247
|
+
default: return de(i);
|
|
3247
3248
|
}
|
|
3248
3249
|
}
|
|
3249
3250
|
static WINDOW_FUNCTION_TYPES = [
|
|
@@ -3317,7 +3318,7 @@ var Q = class e {
|
|
|
3317
3318
|
let { postAggWindowMeasures: r } = e.categorizeForPostAggregation(t, n);
|
|
3318
3319
|
return r.length > 0;
|
|
3319
3320
|
}
|
|
3320
|
-
},
|
|
3321
|
+
}, _t = class {
|
|
3321
3322
|
constructor(e) {
|
|
3322
3323
|
this.dateTimeBuilder = e;
|
|
3323
3324
|
}
|
|
@@ -3386,7 +3387,7 @@ var Q = class e {
|
|
|
3386
3387
|
let t = e.joinKeys.find((e) => e.targetColumn === o);
|
|
3387
3388
|
if (t && t.sourceColumnObj) i.push(t.sourceColumnObj);
|
|
3388
3389
|
else {
|
|
3389
|
-
let t =
|
|
3390
|
+
let t = O`${O.identifier(e.cteAlias)}.${O.identifier(o)}`;
|
|
3390
3391
|
i.push(t);
|
|
3391
3392
|
}
|
|
3392
3393
|
} else {
|
|
@@ -3405,7 +3406,7 @@ var Q = class e {
|
|
|
3405
3406
|
let r = this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj, e.granularity, n);
|
|
3406
3407
|
i.push(r);
|
|
3407
3408
|
} else {
|
|
3408
|
-
let e =
|
|
3409
|
+
let e = O`${O.identifier(a.cteAlias)}.${O.identifier(o)}`;
|
|
3409
3410
|
i.push(e);
|
|
3410
3411
|
}
|
|
3411
3412
|
} else {
|
|
@@ -3416,13 +3417,13 @@ var Q = class e {
|
|
|
3416
3417
|
}
|
|
3417
3418
|
return i;
|
|
3418
3419
|
}
|
|
3419
|
-
},
|
|
3420
|
+
}, vt = class {
|
|
3420
3421
|
dateTimeBuilder;
|
|
3421
3422
|
filterBuilder;
|
|
3422
3423
|
groupByBuilder;
|
|
3423
3424
|
measureBuilder;
|
|
3424
3425
|
constructor(e) {
|
|
3425
|
-
this.dateTimeBuilder = new Y(e), this.filterBuilder = new X(e, this.dateTimeBuilder), this.groupByBuilder = new
|
|
3426
|
+
this.dateTimeBuilder = new Y(e), this.filterBuilder = new X(e, this.dateTimeBuilder), this.groupByBuilder = new _t(this.dateTimeBuilder), this.measureBuilder = new Q(e);
|
|
3426
3427
|
}
|
|
3427
3428
|
buildResolvedMeasures(e, t, n, r) {
|
|
3428
3429
|
return this.measureBuilder.buildResolvedMeasures(e, t, n, r);
|
|
@@ -3433,24 +3434,24 @@ var Q = class e {
|
|
|
3433
3434
|
let [t, a] = e.split("."), o = i.get(t);
|
|
3434
3435
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3435
3436
|
let t = o.dimensions[a];
|
|
3436
|
-
r[e] =
|
|
3437
|
+
r[e] = O`${W(t.sql, n)}`.as(e);
|
|
3437
3438
|
}
|
|
3438
3439
|
}
|
|
3439
3440
|
if (t.measures) {
|
|
3440
3441
|
let e = this.buildResolvedMeasures(t.measures, i, n);
|
|
3441
3442
|
for (let n of t.measures) {
|
|
3442
3443
|
let t = e.get(n);
|
|
3443
|
-
t && typeof t == "function" && (r[n] =
|
|
3444
|
+
t && typeof t == "function" && (r[n] = O`${t()}`.as(n));
|
|
3444
3445
|
}
|
|
3445
3446
|
}
|
|
3446
3447
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
3447
3448
|
let [t, a] = e.dimension.split("."), o = i.get(t);
|
|
3448
3449
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3449
3450
|
let t = o.dimensions[a], i = this.buildTimeDimensionExpression(t.sql, e.granularity, n);
|
|
3450
|
-
r[e.dimension] =
|
|
3451
|
+
r[e.dimension] = O`${i}`.as(e.dimension);
|
|
3451
3452
|
}
|
|
3452
3453
|
}
|
|
3453
|
-
return Object.keys(r).length === 0 && (r.count =
|
|
3454
|
+
return Object.keys(r).length === 0 && (r.count = de()), r;
|
|
3454
3455
|
}
|
|
3455
3456
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
3456
3457
|
return this.measureBuilder.buildCalculatedMeasure(e, t, n, r, i);
|
|
@@ -3487,7 +3488,7 @@ var Q = class e {
|
|
|
3487
3488
|
if (s && s.dimensions[i] && e.dateRange) {
|
|
3488
3489
|
if (r?.preAggregationCTEs && r.preAggregationCTEs.some((e) => e.cube.name === t)) continue;
|
|
3489
3490
|
if (n.filterCache) {
|
|
3490
|
-
let t =
|
|
3491
|
+
let t = it(e.dimension, e.dateRange), r = n.filterCache.get(t);
|
|
3491
3492
|
if (r) {
|
|
3492
3493
|
a.push(r);
|
|
3493
3494
|
continue;
|
|
@@ -3512,11 +3513,11 @@ var Q = class e {
|
|
|
3512
3513
|
let a = e;
|
|
3513
3514
|
if (a.and) {
|
|
3514
3515
|
let e = a.and.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3515
|
-
return e.length > 0 ?
|
|
3516
|
+
return e.length > 0 ? F(...e) : null;
|
|
3516
3517
|
}
|
|
3517
3518
|
if (a.or) {
|
|
3518
3519
|
let e = a.or.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3519
|
-
return e.length > 0 ?
|
|
3520
|
+
return e.length > 0 ? I(...e) : null;
|
|
3520
3521
|
}
|
|
3521
3522
|
}
|
|
3522
3523
|
let a = e, [o, s] = a.member.split("."), c = t.get(o);
|
|
@@ -3556,12 +3557,12 @@ var Q = class e {
|
|
|
3556
3557
|
];
|
|
3557
3558
|
if (e.order && Object.keys(e.order).length > 0) for (let [t, i] of Object.entries(e.order)) {
|
|
3558
3559
|
if (!r.includes(t)) throw Error(`Cannot order by '${t}': field is not selected in the query`);
|
|
3559
|
-
let e = i === "desc" ?
|
|
3560
|
+
let e = i === "desc" ? ue(O.identifier(t)) : le(O.identifier(t));
|
|
3560
3561
|
n.push(e);
|
|
3561
3562
|
}
|
|
3562
3563
|
if (e.timeDimensions && e.timeDimensions.length > 0) {
|
|
3563
3564
|
let t = new Set(Object.keys(e.order || {})), r = [...e.timeDimensions].sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
3564
|
-
for (let e of r) t.has(e.dimension) || n.push(
|
|
3565
|
+
for (let e of r) t.has(e.dimension) || n.push(le(O.identifier(e.dimension)));
|
|
3565
3566
|
}
|
|
3566
3567
|
return n;
|
|
3567
3568
|
}
|
|
@@ -3596,7 +3597,7 @@ var Q = class e {
|
|
|
3596
3597
|
buildLogicalFilter(e, t, n) {
|
|
3597
3598
|
return this.filterBuilder.buildLogicalFilter(e, t, n);
|
|
3598
3599
|
}
|
|
3599
|
-
},
|
|
3600
|
+
}, yt = class {
|
|
3600
3601
|
cubes;
|
|
3601
3602
|
connectivityCache = /* @__PURE__ */ new Map();
|
|
3602
3603
|
reverseIndex;
|
|
@@ -3803,10 +3804,10 @@ var Q = class e {
|
|
|
3803
3804
|
buildJoinCondition(e, t, n) {
|
|
3804
3805
|
let r = [];
|
|
3805
3806
|
for (let i of e.on) {
|
|
3806
|
-
let e = t ?
|
|
3807
|
+
let e = t ? O`${O.identifier(t)}.${O.identifier(i.source.name)}` : tt(i.source), a = n ? O`${O.identifier(n)}.${O.identifier(i.target.name)}` : tt(i.target), o = i.as || N;
|
|
3807
3808
|
r.push(o(e, a));
|
|
3808
3809
|
}
|
|
3809
|
-
return
|
|
3810
|
+
return F(...r);
|
|
3810
3811
|
}
|
|
3811
3812
|
getReachableCubes(e) {
|
|
3812
3813
|
let t = new Set([e]), n = [e];
|
|
@@ -3833,11 +3834,11 @@ var Q = class e {
|
|
|
3833
3834
|
setInCache(e, t) {
|
|
3834
3835
|
this.connectivityCache.set(e, { path: t });
|
|
3835
3836
|
}
|
|
3836
|
-
},
|
|
3837
|
+
}, bt = class {
|
|
3837
3838
|
resolverCache = /* @__PURE__ */ new WeakMap();
|
|
3838
3839
|
getResolver(e) {
|
|
3839
3840
|
let t = this.resolverCache.get(e);
|
|
3840
|
-
return t || (t = new
|
|
3841
|
+
return t || (t = new yt(e), this.resolverCache.set(e, t)), t;
|
|
3841
3842
|
}
|
|
3842
3843
|
analyzeCubeUsage(e) {
|
|
3843
3844
|
let t = /* @__PURE__ */ new Set();
|
|
@@ -3926,9 +3927,9 @@ var Q = class e {
|
|
|
3926
3927
|
if (s.has(n)) continue;
|
|
3927
3928
|
let c = e.get(n);
|
|
3928
3929
|
if (!c) throw Error(`Cube '${n}' not found`);
|
|
3929
|
-
let u = l ?
|
|
3930
|
+
let u = l ? $e(i.relationship) : i.relationship;
|
|
3930
3931
|
if (u === "belongsToMany" && i.through) {
|
|
3931
|
-
let e =
|
|
3932
|
+
let e = rt(i, r.securityContext);
|
|
3932
3933
|
o.push({
|
|
3933
3934
|
cube: c,
|
|
3934
3935
|
alias: `${n.toLowerCase()}_cube`,
|
|
@@ -3945,7 +3946,7 @@ var Q = class e {
|
|
|
3945
3946
|
}
|
|
3946
3947
|
});
|
|
3947
3948
|
} else {
|
|
3948
|
-
let e = a.buildJoinCondition(i, null, null), t =
|
|
3949
|
+
let e = a.buildJoinCondition(i, null, null), t = et(u, i.sqlJoinType);
|
|
3949
3950
|
o.push({
|
|
3950
3951
|
cube: c,
|
|
3951
3952
|
alias: `${n.toLowerCase()}_cube`,
|
|
@@ -4041,7 +4042,7 @@ var Q = class e {
|
|
|
4041
4042
|
joinDef: e.joinDef,
|
|
4042
4043
|
reversed: e.reversed
|
|
4043
4044
|
}));
|
|
4044
|
-
if (!c.slice(0, -1).some((e) => (e.reversed ?
|
|
4045
|
+
if (!c.slice(0, -1).some((e) => (e.reversed ? $e(e.joinDef.relationship) : e.joinDef.relationship) === "hasMany")) return {
|
|
4045
4046
|
path: c,
|
|
4046
4047
|
hasIntermediateHasMany: !1,
|
|
4047
4048
|
intermediateJoins: [],
|
|
@@ -4345,7 +4346,7 @@ var Q = class e {
|
|
|
4345
4346
|
}
|
|
4346
4347
|
convertInternalPathToJoinPathSteps(e) {
|
|
4347
4348
|
return e.map((e) => {
|
|
4348
|
-
let t = e.reversed ?
|
|
4349
|
+
let t = e.reversed ? $e(e.joinDef.relationship) : e.joinDef.relationship, n = et(t, e.joinDef.sqlJoinType), r = e.joinDef.on.map((e) => ({
|
|
4349
4350
|
sourceColumn: e.source.name,
|
|
4350
4351
|
targetColumn: e.target.name
|
|
4351
4352
|
})), i = {
|
|
@@ -4410,7 +4411,7 @@ var Q = class e {
|
|
|
4410
4411
|
suggestion: "Add a dimension to see per-group breakdowns, or add a time dimension with granularity."
|
|
4411
4412
|
};
|
|
4412
4413
|
}
|
|
4413
|
-
},
|
|
4414
|
+
}, xt = class {
|
|
4414
4415
|
constructor(e) {
|
|
4415
4416
|
this.queryBuilder = e;
|
|
4416
4417
|
}
|
|
@@ -4424,19 +4425,19 @@ var Q = class e {
|
|
|
4424
4425
|
}
|
|
4425
4426
|
} else for (let t of e.joinKeys) if (t.targetColumnObj) {
|
|
4426
4427
|
c[t.targetColumn] = t.targetColumnObj;
|
|
4427
|
-
for (let [e, n] of Object.entries(a.dimensions || {})) n.sql === t.targetColumnObj && e !== t.targetColumn && (c[e] =
|
|
4428
|
+
for (let [e, n] of Object.entries(a.dimensions || {})) n.sql === t.targetColumnObj && e !== t.targetColumn && (c[e] = O`${t.targetColumnObj}`.as(e));
|
|
4428
4429
|
}
|
|
4429
4430
|
if (e.downstreamJoinKeys) for (let t of e.downstreamJoinKeys) for (let e of t.joinKeys) e.sourceColumnObj && (c[e.sourceColumn] = e.sourceColumnObj);
|
|
4430
4431
|
let l = a.name, u = new Map([[l, a]]), d = this.queryBuilder.buildResolvedMeasures(e.measures, u, n);
|
|
4431
4432
|
for (let t of e.measures) {
|
|
4432
4433
|
let [, e] = t.split("."), n = d.get(t);
|
|
4433
|
-
n && (c[e] =
|
|
4434
|
+
n && (c[e] = O`${n()}`.as(e));
|
|
4434
4435
|
}
|
|
4435
4436
|
if (t.dimensions) for (let e of t.dimensions) {
|
|
4436
4437
|
let [t, r] = e.split(".");
|
|
4437
4438
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4438
4439
|
let e = a.dimensions[r];
|
|
4439
|
-
c[r] =
|
|
4440
|
+
c[r] = O`${this.queryBuilder.buildMeasureExpression({
|
|
4440
4441
|
sql: e.sql,
|
|
4441
4442
|
type: "number"
|
|
4442
4443
|
}, n)}`.as(r);
|
|
@@ -4446,7 +4447,7 @@ var Q = class e {
|
|
|
4446
4447
|
let [t, r] = e.dimension.split(".");
|
|
4447
4448
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4448
4449
|
let t = a.dimensions[r];
|
|
4449
|
-
c[r] =
|
|
4450
|
+
c[r] = O`${this.queryBuilder.buildTimeDimensionExpression(t.sql, e.granularity, n)}`.as(r);
|
|
4450
4451
|
}
|
|
4451
4452
|
}
|
|
4452
4453
|
if (Object.keys(c).length === 0) return null;
|
|
@@ -4454,8 +4455,8 @@ var Q = class e {
|
|
|
4454
4455
|
if (s && e.intermediateJoins) {
|
|
4455
4456
|
let t = [...e.intermediateJoins].reverse();
|
|
4456
4457
|
for (let e of t) {
|
|
4457
|
-
let t = e.cube.sql(n), r = [
|
|
4458
|
-
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from,
|
|
4458
|
+
let t = e.cube.sql(n), r = [N(e.cteJoinColumn, e.joinDef.on[0]?.target)];
|
|
4459
|
+
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from, F(...r));
|
|
4459
4460
|
}
|
|
4460
4461
|
}
|
|
4461
4462
|
let p = r ? {
|
|
@@ -4493,7 +4494,7 @@ var Q = class e {
|
|
|
4493
4494
|
}
|
|
4494
4495
|
let g = [];
|
|
4495
4496
|
if (o.where && g.push(o.where), g.push(...m, ...h), g.length > 0) {
|
|
4496
|
-
let e = g.length === 1 ? g[0] :
|
|
4497
|
+
let e = g.length === 1 ? g[0] : F(...g);
|
|
4497
4498
|
f = f.where(e);
|
|
4498
4499
|
}
|
|
4499
4500
|
let _ = [], v = /* @__PURE__ */ new Set(), y = (e) => {
|
|
@@ -4526,20 +4527,20 @@ var Q = class e {
|
|
|
4526
4527
|
if (!r) throw Error(`CTE info not found for cube ${e.cube.name}`);
|
|
4527
4528
|
let i = [];
|
|
4528
4529
|
if (r.intermediateJoins && r.intermediateJoins.length > 0) {
|
|
4529
|
-
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o =
|
|
4530
|
-
i.push(
|
|
4530
|
+
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o = O`${O.identifier(t)}.${O.identifier(e.primaryJoinColumn.name)}`;
|
|
4531
|
+
i.push(N(a, o));
|
|
4531
4532
|
} else for (let e of r.joinKeys) {
|
|
4532
|
-
let a = this.resolveCTEJoinSourceColumn(e, r, n), o =
|
|
4533
|
-
i.push(
|
|
4533
|
+
let a = this.resolveCTEJoinSourceColumn(e, r, n), o = O`${O.identifier(t)}.${O.identifier(e.targetColumn)}`;
|
|
4534
|
+
i.push(N(a, o));
|
|
4534
4535
|
}
|
|
4535
|
-
return i.length === 1 ? i[0] :
|
|
4536
|
+
return i.length === 1 ? i[0] : F(...i);
|
|
4536
4537
|
}
|
|
4537
4538
|
resolveCTEJoinSourceColumn(e, t, n) {
|
|
4538
4539
|
if (!e) throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);
|
|
4539
|
-
let r = e.sourceColumnObj ||
|
|
4540
|
+
let r = e.sourceColumnObj || O.identifier(e.sourceColumn);
|
|
4540
4541
|
if (!e.sourceColumnObj || !n.preAggregationCTEs) return r;
|
|
4541
4542
|
for (let r of n.preAggregationCTEs) if (r.cube.name !== t.cube.name) {
|
|
4542
|
-
for (let [t, n] of Object.entries(r.cube.dimensions || {})) if (typeof n.sql != "function" && n.sql === e.sourceColumnObj) return
|
|
4543
|
+
for (let [t, n] of Object.entries(r.cube.dimensions || {})) if (typeof n.sql != "function" && n.sql === e.sourceColumnObj) return O`${O.identifier(r.cteAlias)}.${O.identifier(t)}`;
|
|
4543
4544
|
}
|
|
4544
4545
|
return r;
|
|
4545
4546
|
}
|
|
@@ -4551,24 +4552,24 @@ var Q = class e {
|
|
|
4551
4552
|
i.push(...o);
|
|
4552
4553
|
}
|
|
4553
4554
|
if (i.length === 0) return null;
|
|
4554
|
-
let a = i.length === 1 ? i[0] :
|
|
4555
|
+
let a = i.length === 1 ? i[0] : F(...i), o = e.joinConditions;
|
|
4555
4556
|
if (o.length === 1) {
|
|
4556
4557
|
let { source: e, target: n } = o[0];
|
|
4557
|
-
return
|
|
4558
|
+
return O`${n} IN ${t.db.select({ pk: e }).from(r.from).where(a)}`;
|
|
4558
4559
|
} else {
|
|
4559
|
-
let e =
|
|
4560
|
-
return
|
|
4560
|
+
let e = F(...o.map((e) => N(e.source, e.target)), a);
|
|
4561
|
+
return O`EXISTS ${t.db.select({ one: O`1` }).from(r.from).where(e)}`;
|
|
4561
4562
|
}
|
|
4562
4563
|
}
|
|
4563
4564
|
};
|
|
4564
4565
|
//#endregion
|
|
4565
4566
|
//#region src/server/gap-filler.ts
|
|
4566
|
-
function
|
|
4567
|
-
let r = [], i =
|
|
4568
|
-
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i =
|
|
4567
|
+
function St(e, t, n) {
|
|
4568
|
+
let r = [], i = Ct(new Date(e), n), a = Ct(new Date(t), n);
|
|
4569
|
+
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i = wt(i, n);
|
|
4569
4570
|
return r;
|
|
4570
4571
|
}
|
|
4571
|
-
function
|
|
4572
|
+
function Ct(e, t) {
|
|
4572
4573
|
let n = new Date(e);
|
|
4573
4574
|
switch (t) {
|
|
4574
4575
|
case "second":
|
|
@@ -4602,7 +4603,7 @@ function St(e, t) {
|
|
|
4602
4603
|
}
|
|
4603
4604
|
return n;
|
|
4604
4605
|
}
|
|
4605
|
-
function
|
|
4606
|
+
function wt(e, t) {
|
|
4606
4607
|
let n = new Date(e);
|
|
4607
4608
|
switch (t) {
|
|
4608
4609
|
case "second":
|
|
@@ -4632,7 +4633,7 @@ function Ct(e, t) {
|
|
|
4632
4633
|
}
|
|
4633
4634
|
return n;
|
|
4634
4635
|
}
|
|
4635
|
-
function
|
|
4636
|
+
function Tt(e) {
|
|
4636
4637
|
if (e instanceof Date) return e.toISOString();
|
|
4637
4638
|
if (typeof e == "string") {
|
|
4638
4639
|
let t = new Date(e);
|
|
@@ -4640,15 +4641,15 @@ function wt(e) {
|
|
|
4640
4641
|
}
|
|
4641
4642
|
return String(e);
|
|
4642
4643
|
}
|
|
4643
|
-
function
|
|
4644
|
+
function Et(e, t) {
|
|
4644
4645
|
return t.length === 0 ? "__all__" : t.map((t) => String(e[t] ?? "")).join("|||");
|
|
4645
4646
|
}
|
|
4646
|
-
function
|
|
4647
|
-
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c =
|
|
4647
|
+
function Dt(e, t) {
|
|
4648
|
+
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c = St(i[0], i[1], r);
|
|
4648
4649
|
if (c.length === 0) return e;
|
|
4649
4650
|
let l = /* @__PURE__ */ new Map();
|
|
4650
4651
|
for (let t of e) {
|
|
4651
|
-
let e =
|
|
4652
|
+
let e = Et(t, s), r = Tt(t[n]);
|
|
4652
4653
|
l.has(e) || l.set(e, /* @__PURE__ */ new Map()), l.get(e).set(r, t);
|
|
4653
4654
|
}
|
|
4654
4655
|
l.size === 0 && s.length === 0 && l.set("__all__", /* @__PURE__ */ new Map());
|
|
@@ -4668,7 +4669,7 @@ function Et(e, t) {
|
|
|
4668
4669
|
}
|
|
4669
4670
|
return u;
|
|
4670
4671
|
}
|
|
4671
|
-
function
|
|
4672
|
+
function Ot(e) {
|
|
4672
4673
|
if (!e) return null;
|
|
4673
4674
|
if (Array.isArray(e)) {
|
|
4674
4675
|
if (e.length < 2) return null;
|
|
@@ -4678,7 +4679,7 @@ function Dt(e) {
|
|
|
4678
4679
|
let t = new Date(e);
|
|
4679
4680
|
return isNaN(t.getTime()) ? null : [t, t];
|
|
4680
4681
|
}
|
|
4681
|
-
function
|
|
4682
|
+
function kt(e, t, n) {
|
|
4682
4683
|
if (!t.timeDimensions || t.timeDimensions.length === 0) return e;
|
|
4683
4684
|
let r = t.timeDimensions.filter((e) => {
|
|
4684
4685
|
let t = e.fillMissingDates !== !1, n = e.granularity && e.dateRange;
|
|
@@ -4687,7 +4688,7 @@ function Ot(e, t, n) {
|
|
|
4687
4688
|
if (r.length === 0) return e;
|
|
4688
4689
|
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;
|
|
4689
4690
|
for (let e of r) {
|
|
4690
|
-
let t =
|
|
4691
|
+
let t = Ot(e.dateRange);
|
|
4691
4692
|
if (!t) continue;
|
|
4692
4693
|
let r = {
|
|
4693
4694
|
timeDimensionKey: e.dimension,
|
|
@@ -4697,13 +4698,13 @@ function Ot(e, t, n) {
|
|
|
4697
4698
|
measures: n,
|
|
4698
4699
|
dimensions: o
|
|
4699
4700
|
};
|
|
4700
|
-
s =
|
|
4701
|
+
s = Dt(s, r);
|
|
4701
4702
|
}
|
|
4702
4703
|
return s;
|
|
4703
4704
|
}
|
|
4704
4705
|
//#endregion
|
|
4705
4706
|
//#region src/server/builders/comparison-query-builder.ts
|
|
4706
|
-
var
|
|
4707
|
+
var At = class {
|
|
4707
4708
|
dateTimeBuilder;
|
|
4708
4709
|
constructor(e) {
|
|
4709
4710
|
this.dateTimeBuilder = new Y(e);
|
|
@@ -4834,7 +4835,7 @@ var kt = class {
|
|
|
4834
4835
|
return typeof i == "string" && typeof a == "string" ? new Date(i).getTime() - new Date(a).getTime() : 0;
|
|
4835
4836
|
});
|
|
4836
4837
|
}
|
|
4837
|
-
},
|
|
4838
|
+
}, jt = class {
|
|
4838
4839
|
filterBuilder;
|
|
4839
4840
|
dateTimeBuilder;
|
|
4840
4841
|
constructor(e) {
|
|
@@ -4873,7 +4874,7 @@ var kt = class {
|
|
|
4873
4874
|
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) {
|
|
4874
4875
|
let a;
|
|
4875
4876
|
"cube" in i && i.cube ? a = i.cube : typeof e.bindingKey == "string" && ([a] = e.bindingKey.split("."));
|
|
4876
|
-
let o = a ? new
|
|
4877
|
+
let o = a ? new yt(t) : null, s = Array.isArray(i.filter) ? i.filter : [i.filter];
|
|
4877
4878
|
for (let e of s) if ("member" in e) {
|
|
4878
4879
|
let [i, s] = e.member.split("."), c = t.get(i);
|
|
4879
4880
|
if (!c) n.push(`Step ${r} filter cube not found: ${i}`);
|
|
@@ -4936,7 +4937,7 @@ var kt = class {
|
|
|
4936
4937
|
return t;
|
|
4937
4938
|
}
|
|
4938
4939
|
resolveSteps(e, t, n) {
|
|
4939
|
-
let r = new
|
|
4940
|
+
let r = new yt(t);
|
|
4940
4941
|
return e.steps.map((i, a) => {
|
|
4941
4942
|
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 = [];
|
|
4942
4943
|
for (let e of u) if (e !== o.name) {
|
|
@@ -5027,14 +5028,14 @@ var kt = class {
|
|
|
5027
5028
|
a && i.push(a);
|
|
5028
5029
|
}
|
|
5029
5030
|
}
|
|
5030
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : o ?
|
|
5031
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : o ? F(...i) : O`(${O.join(i, O` OR `)})`;
|
|
5031
5032
|
}
|
|
5032
5033
|
let o = e, [s, c] = o.member.split("."), l = o.dateRange !== void 0;
|
|
5033
5034
|
if (o.operator !== "set" && o.operator !== "notSet" && !l && (!o.values || o.values.length === 0 || o.values[0] === void 0 || o.values[0] === "")) return null;
|
|
5034
5035
|
let u = n.get(s);
|
|
5035
5036
|
if (!u) return null;
|
|
5036
5037
|
if (s !== t.name) {
|
|
5037
|
-
let e = new
|
|
5038
|
+
let e = new yt(n).findPath(t.name, s);
|
|
5038
5039
|
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;
|
|
5039
5040
|
}
|
|
5040
5041
|
let d = u.dimensions?.[c];
|
|
@@ -5049,11 +5050,11 @@ var kt = class {
|
|
|
5049
5050
|
let n = `step_${e.index}`, r = e.cube.sql(t), i = [];
|
|
5050
5051
|
r.where && i.push(r.where), i.push(...e.filterConditions);
|
|
5051
5052
|
let a = t.db.select({
|
|
5052
|
-
binding_key:
|
|
5053
|
-
step_time:
|
|
5053
|
+
binding_key: O`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5054
|
+
step_time: O`MIN(${e.timeExpr})`.as("step_time")
|
|
5054
5055
|
}).from(r.from);
|
|
5055
5056
|
if (a = this.addCrossJoinsToQuery(a, e, t, i), i.length > 0) {
|
|
5056
|
-
let e = i.length === 1 ? i[0] :
|
|
5057
|
+
let e = i.length === 1 ? i[0] : F(...i);
|
|
5057
5058
|
a = a.where(e);
|
|
5058
5059
|
}
|
|
5059
5060
|
return a = a.groupBy(e.bindingKeyExpr), t.db.$with(n).as(a);
|
|
@@ -5061,18 +5062,18 @@ var kt = class {
|
|
|
5061
5062
|
buildSubsequentStepCTE(e, t, n) {
|
|
5062
5063
|
let r = `step_${e.index}`, i = `step_${e.index - 1}`, a = e.cube.sql(t), o = [];
|
|
5063
5064
|
a.where && o.push(a.where), o.push(...e.filterConditions);
|
|
5064
|
-
let s =
|
|
5065
|
+
let s = O`${O.identifier(i)}.step_time`, c = O`${e.timeExpr} > ${s}`;
|
|
5065
5066
|
if (e.timeToConvert) {
|
|
5066
5067
|
let t = this.databaseAdapter.buildDateAddInterval(s, e.timeToConvert);
|
|
5067
|
-
c =
|
|
5068
|
+
c = O`${c} AND ${e.timeExpr} <= ${t}`;
|
|
5068
5069
|
}
|
|
5069
5070
|
o.push(c);
|
|
5070
5071
|
let l = t.db.select({
|
|
5071
|
-
binding_key:
|
|
5072
|
-
step_time:
|
|
5073
|
-
}).from(a.from).innerJoin(n,
|
|
5072
|
+
binding_key: O`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5073
|
+
step_time: O`MIN(${e.timeExpr})`.as("step_time")
|
|
5074
|
+
}).from(a.from).innerJoin(n, O`${e.bindingKeyExpr} = ${O.identifier(i)}.binding_key`);
|
|
5074
5075
|
if (l = this.addCrossJoinsToQuery(l, e, t, o), o.length > 0) {
|
|
5075
|
-
let e = o.length === 1 ? o[0] :
|
|
5076
|
+
let e = o.length === 1 ? o[0] : F(...o);
|
|
5076
5077
|
l = l.where(e);
|
|
5077
5078
|
}
|
|
5078
5079
|
return l = l.groupBy(e.bindingKeyExpr), t.db.$with(r).as(l);
|
|
@@ -5081,41 +5082,41 @@ var kt = class {
|
|
|
5081
5082
|
if (t.joinedCubes.length === 0) return e;
|
|
5082
5083
|
for (let i of t.joinedCubes) for (let t of i.joinPath) {
|
|
5083
5084
|
let a = t.joinDef, o = [];
|
|
5084
|
-
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(
|
|
5085
|
-
let s = o.length === 1 ? o[0] :
|
|
5085
|
+
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(N(e.source, e.target));
|
|
5086
|
+
let s = o.length === 1 ? o[0] : F(...o), c = i.cube.sql(n);
|
|
5086
5087
|
e = e.leftJoin(c.from, s), c.where && r.push(c.where);
|
|
5087
5088
|
}
|
|
5088
5089
|
return e;
|
|
5089
5090
|
}
|
|
5090
5091
|
buildFunnelResultsCTE(e, t, n, r) {
|
|
5091
5092
|
let i = {
|
|
5092
|
-
binding_key:
|
|
5093
|
-
step_0_time:
|
|
5093
|
+
binding_key: O`s0.binding_key`,
|
|
5094
|
+
step_0_time: O`s0.step_time`
|
|
5094
5095
|
};
|
|
5095
|
-
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] =
|
|
5096
|
-
let a =
|
|
5097
|
-
for (let e = 1; e < t.length; e++) a =
|
|
5098
|
-
LEFT JOIN ${
|
|
5099
|
-
let o = Object.entries(i).map(([e, t]) =>
|
|
5096
|
+
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] = O`s${O.raw(String(e))}.step_time`;
|
|
5097
|
+
let a = O`${O.identifier("step_0")} s0`;
|
|
5098
|
+
for (let e = 1; e < t.length; e++) a = O`${a}
|
|
5099
|
+
LEFT JOIN ${O.identifier(`step_${e}`)} s${O.raw(String(e))} ON s0.binding_key = s${O.raw(String(e))}.binding_key`;
|
|
5100
|
+
let o = Object.entries(i).map(([e, t]) => O`${t} AS ${O.identifier(e)}`), s = O`SELECT ${O.join(o, O`, `)} FROM ${a}`;
|
|
5100
5101
|
return r.db.$with("funnel_joined").as(s);
|
|
5101
5102
|
}
|
|
5102
5103
|
buildAggregationCTE(e, t, n, r, i) {
|
|
5103
5104
|
let a = {};
|
|
5104
|
-
a.step_0_count =
|
|
5105
|
-
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] =
|
|
5105
|
+
a.step_0_count = O`COUNT(*)`.as("step_0_count");
|
|
5106
|
+
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] = O`COUNT(${O.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);
|
|
5106
5107
|
if (r.includeTimeMetrics) for (let e = 1; e < n.length; e++) {
|
|
5107
|
-
let t =
|
|
5108
|
+
let t = O.identifier(`step_${e}_time`), n = O.identifier(`step_${e - 1}_time`), r = this.databaseAdapter.buildTimeDifferenceSeconds(O`${t}`, O`${n}`), i = O`${t} IS NOT NULL`;
|
|
5108
5109
|
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) {
|
|
5109
5110
|
let n = this.databaseAdapter.buildPercentile(r, 50);
|
|
5110
|
-
n && (a[`step_${e}_median_seconds`] =
|
|
5111
|
+
n && (a[`step_${e}_median_seconds`] = O`(SELECT ${n} FROM ${O.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));
|
|
5111
5112
|
let i = this.databaseAdapter.buildPercentile(r, 90);
|
|
5112
|
-
i && (a[`step_${e}_p90_seconds`] =
|
|
5113
|
+
i && (a[`step_${e}_p90_seconds`] = O`(SELECT ${i} FROM ${O.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`));
|
|
5113
5114
|
}
|
|
5114
5115
|
}
|
|
5115
5116
|
let o = i.db.select(a).from(e);
|
|
5116
5117
|
return i.db.$with("funnel_metrics").as(o);
|
|
5117
5118
|
}
|
|
5118
|
-
},
|
|
5119
|
+
}, Mt = class {
|
|
5119
5120
|
filterBuilder;
|
|
5120
5121
|
dateTimeBuilder;
|
|
5121
5122
|
databaseAdapter;
|
|
@@ -5282,7 +5283,7 @@ var kt = class {
|
|
|
5282
5283
|
let r = this.buildFilterCondition(e, t, n);
|
|
5283
5284
|
r && i.push(r);
|
|
5284
5285
|
}
|
|
5285
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ?
|
|
5286
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ? F(...i) : O`(${O.join(i, O` OR `)})`;
|
|
5286
5287
|
}
|
|
5287
5288
|
if ("type" in e && "filters" in e) {
|
|
5288
5289
|
let r = e, i = [];
|
|
@@ -5290,7 +5291,7 @@ var kt = class {
|
|
|
5290
5291
|
let r = this.buildFilterCondition(e, t, n);
|
|
5291
5292
|
r && i.push(r);
|
|
5292
5293
|
}
|
|
5293
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ?
|
|
5294
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ? F(...i) : O`(${O.join(i, O` OR `)})`;
|
|
5294
5295
|
}
|
|
5295
5296
|
let r = e, [, i] = r.member.split("."), a = t.dimensions?.[i];
|
|
5296
5297
|
if (!a) return null;
|
|
@@ -5301,13 +5302,13 @@ var kt = class {
|
|
|
5301
5302
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o, startingStepFilters: s } = t, c = [];
|
|
5302
5303
|
r.where && c.push(r.where), c.push(...s);
|
|
5303
5304
|
let l = n.db.select({
|
|
5304
|
-
binding_key:
|
|
5305
|
-
start_time:
|
|
5306
|
-
event_type:
|
|
5307
|
-
event_path:
|
|
5305
|
+
binding_key: O`${i}`.as("binding_key"),
|
|
5306
|
+
start_time: O`MIN(${a})`.as("start_time"),
|
|
5307
|
+
event_type: O`${o}`.as("event_type"),
|
|
5308
|
+
event_path: O`${o}`.as("event_path")
|
|
5308
5309
|
}).from(r.from);
|
|
5309
5310
|
if (c.length > 0) {
|
|
5310
|
-
let e = c.length === 1 ? c[0] :
|
|
5311
|
+
let e = c.length === 1 ? c[0] : F(...c);
|
|
5311
5312
|
l = l.where(e);
|
|
5312
5313
|
}
|
|
5313
5314
|
return l = l.groupBy(i, o), e.entityLimit && (l = l.limit(e.entityLimit)), n.db.$with("starting_entities").as(l);
|
|
@@ -5316,18 +5317,18 @@ var kt = class {
|
|
|
5316
5317
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5317
5318
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
5318
5319
|
let e = t === 1 ? "starting_entities" : `before_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `before_step_${t}`, d = [];
|
|
5319
|
-
r.where && d.push(r.where), d.push(
|
|
5320
|
-
let f = d.length === 1 ? d[0] :
|
|
5321
|
-
binding_key:
|
|
5322
|
-
step_time:
|
|
5323
|
-
event_type:
|
|
5320
|
+
r.where && d.push(r.where), d.push(O`${i} = ${O.identifier(e)}.binding_key`, O`${a} < ${O.identifier(e)}.${O.identifier(l)}`);
|
|
5321
|
+
let f = d.length === 1 ? d[0] : F(...d), p = c ? O`${o} || ${"→"} || ${O.identifier(e)}.event_path` : O`${o}`, m = n.db.select({
|
|
5322
|
+
binding_key: O`${i}`.as("binding_key"),
|
|
5323
|
+
step_time: O`${a}`.as("step_time"),
|
|
5324
|
+
event_type: O`${o}`.as("event_type"),
|
|
5324
5325
|
event_path: p.as("event_path")
|
|
5325
|
-
}).from(r.from).where(f).orderBy(
|
|
5326
|
-
binding_key:
|
|
5327
|
-
step_time:
|
|
5328
|
-
event_type:
|
|
5329
|
-
event_path:
|
|
5330
|
-
}).from(
|
|
5326
|
+
}).from(r.from).where(f).orderBy(O`${a} DESC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5327
|
+
binding_key: O`e.binding_key`.as("binding_key"),
|
|
5328
|
+
step_time: O`e.step_time`.as("step_time"),
|
|
5329
|
+
event_type: O`e.event_type`.as("event_type"),
|
|
5330
|
+
event_path: O`e.event_path`.as("event_path")
|
|
5331
|
+
}).from(O`${O.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
5331
5332
|
s.push(h);
|
|
5332
5333
|
}
|
|
5333
5334
|
return s;
|
|
@@ -5336,18 +5337,18 @@ var kt = class {
|
|
|
5336
5337
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5337
5338
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5338
5339
|
let e = t === 1 ? "starting_entities" : `after_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `after_step_${t}`, d = [];
|
|
5339
|
-
r.where && d.push(r.where), d.push(
|
|
5340
|
-
let f = d.length === 1 ? d[0] :
|
|
5341
|
-
binding_key:
|
|
5342
|
-
step_time:
|
|
5343
|
-
event_type:
|
|
5340
|
+
r.where && d.push(r.where), d.push(O`${i} = ${O.identifier(e)}.binding_key`, O`${a} > ${O.identifier(e)}.${O.identifier(l)}`);
|
|
5341
|
+
let f = d.length === 1 ? d[0] : F(...d), p = c ? O`${O.identifier(e)}.event_path || ${"→"} || ${o}` : O`${o}`, m = n.db.select({
|
|
5342
|
+
binding_key: O`${i}`.as("binding_key"),
|
|
5343
|
+
step_time: O`${a}`.as("step_time"),
|
|
5344
|
+
event_type: O`${o}`.as("event_type"),
|
|
5344
5345
|
event_path: p.as("event_path")
|
|
5345
|
-
}).from(r.from).where(f).orderBy(
|
|
5346
|
-
binding_key:
|
|
5347
|
-
step_time:
|
|
5348
|
-
event_type:
|
|
5349
|
-
event_path:
|
|
5350
|
-
}).from(
|
|
5346
|
+
}).from(r.from).where(f).orderBy(O`${a} ASC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5347
|
+
binding_key: O`e.binding_key`.as("binding_key"),
|
|
5348
|
+
step_time: O`e.step_time`.as("step_time"),
|
|
5349
|
+
event_type: O`e.event_type`.as("event_type"),
|
|
5350
|
+
event_path: O`e.event_path`.as("event_path")
|
|
5351
|
+
}).from(O`${O.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
5351
5352
|
s.push(h);
|
|
5352
5353
|
}
|
|
5353
5354
|
return s;
|
|
@@ -5356,19 +5357,19 @@ var kt = class {
|
|
|
5356
5357
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5357
5358
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
5358
5359
|
let e = t === 1 ? "starting_entities" : `before_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `before_step_${t}`, d = [];
|
|
5359
|
-
r.where && d.push(r.where), d.push(
|
|
5360
|
-
let f = d.length === 1 ? d[0] :
|
|
5361
|
-
binding_key:
|
|
5362
|
-
step_time:
|
|
5363
|
-
event_type:
|
|
5360
|
+
r.where && d.push(r.where), d.push(O`${a} < ${O.identifier(e)}.${O.identifier(l)}`);
|
|
5361
|
+
let f = d.length === 1 ? d[0] : F(...d), p = c ? O`${o} || ${"→"} || ${O.identifier(e)}.event_path` : O`${o}`, m = n.db.select({
|
|
5362
|
+
binding_key: O`${i}`.as("binding_key"),
|
|
5363
|
+
step_time: O`${a}`.as("step_time"),
|
|
5364
|
+
event_type: O`${o}`.as("event_type"),
|
|
5364
5365
|
event_path: p.as("event_path"),
|
|
5365
|
-
rn:
|
|
5366
|
-
}).from(r.from).innerJoin(
|
|
5367
|
-
binding_key:
|
|
5368
|
-
step_time:
|
|
5369
|
-
event_type:
|
|
5370
|
-
event_path:
|
|
5371
|
-
}).from(m.as("ranked")).where(
|
|
5366
|
+
rn: O`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as("rn")
|
|
5367
|
+
}).from(r.from).innerJoin(O`${O.identifier(e)}`, O`${i} = ${O.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5368
|
+
binding_key: O`binding_key`.as("binding_key"),
|
|
5369
|
+
step_time: O`step_time`.as("step_time"),
|
|
5370
|
+
event_type: O`event_type`.as("event_type"),
|
|
5371
|
+
event_path: O`event_path`.as("event_path")
|
|
5372
|
+
}).from(m.as("ranked")).where(O`rn = 1`);
|
|
5372
5373
|
s.push(n.db.$with(u).as(h));
|
|
5373
5374
|
}
|
|
5374
5375
|
return s;
|
|
@@ -5377,19 +5378,19 @@ var kt = class {
|
|
|
5377
5378
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5378
5379
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5379
5380
|
let e = t === 1 ? "starting_entities" : `after_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `after_step_${t}`, d = [];
|
|
5380
|
-
r.where && d.push(r.where), d.push(
|
|
5381
|
-
let f = d.length === 1 ? d[0] :
|
|
5382
|
-
binding_key:
|
|
5383
|
-
step_time:
|
|
5384
|
-
event_type:
|
|
5381
|
+
r.where && d.push(r.where), d.push(O`${a} > ${O.identifier(e)}.${O.identifier(l)}`);
|
|
5382
|
+
let f = d.length === 1 ? d[0] : F(...d), p = c ? O`${O.identifier(e)}.event_path || ${"→"} || ${o}` : O`${o}`, m = n.db.select({
|
|
5383
|
+
binding_key: O`${i}`.as("binding_key"),
|
|
5384
|
+
step_time: O`${a}`.as("step_time"),
|
|
5385
|
+
event_type: O`${o}`.as("event_type"),
|
|
5385
5386
|
event_path: p.as("event_path"),
|
|
5386
|
-
rn:
|
|
5387
|
-
}).from(r.from).innerJoin(
|
|
5388
|
-
binding_key:
|
|
5389
|
-
step_time:
|
|
5390
|
-
event_type:
|
|
5391
|
-
event_path:
|
|
5392
|
-
}).from(m.as("ranked")).where(
|
|
5387
|
+
rn: O`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as("rn")
|
|
5388
|
+
}).from(r.from).innerJoin(O`${O.identifier(e)}`, O`${i} = ${O.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5389
|
+
binding_key: O`binding_key`.as("binding_key"),
|
|
5390
|
+
step_time: O`step_time`.as("step_time"),
|
|
5391
|
+
event_type: O`event_type`.as("event_type"),
|
|
5392
|
+
event_path: O`event_path`.as("event_path")
|
|
5393
|
+
}).from(m.as("ranked")).where(O`rn = 1`);
|
|
5393
5394
|
s.push(n.db.$with(u).as(h));
|
|
5394
5395
|
}
|
|
5395
5396
|
return s;
|
|
@@ -5398,27 +5399,27 @@ var kt = class {
|
|
|
5398
5399
|
let n = [], r = e.outputMode === "sunburst";
|
|
5399
5400
|
for (let t = e.stepsBefore; t >= 1; t--) {
|
|
5400
5401
|
let e = -t, i = `before_step_${t}`;
|
|
5401
|
-
r ? n.push(
|
|
5402
|
+
r ? n.push(O`
|
|
5402
5403
|
SELECT
|
|
5403
|
-
${
|
|
5404
|
+
${O.raw(`'before_${t}_'`)} || event_path AS node_id,
|
|
5404
5405
|
event_type AS name,
|
|
5405
|
-
${
|
|
5406
|
+
${O.raw(String(e))} AS layer,
|
|
5406
5407
|
COUNT(*) AS value
|
|
5407
|
-
FROM ${
|
|
5408
|
+
FROM ${O.identifier(i)}
|
|
5408
5409
|
GROUP BY event_path, event_type
|
|
5409
|
-
`) : n.push(
|
|
5410
|
+
`) : n.push(O`
|
|
5410
5411
|
SELECT
|
|
5411
|
-
${
|
|
5412
|
+
${O.raw(`'before_${t}_'`)} || event_type AS node_id,
|
|
5412
5413
|
event_type AS name,
|
|
5413
|
-
${
|
|
5414
|
+
${O.raw(String(e))} AS layer,
|
|
5414
5415
|
COUNT(*) AS value
|
|
5415
|
-
FROM ${
|
|
5416
|
+
FROM ${O.identifier(i)}
|
|
5416
5417
|
GROUP BY event_type
|
|
5417
5418
|
`);
|
|
5418
5419
|
}
|
|
5419
|
-
n.push(
|
|
5420
|
+
n.push(O`
|
|
5420
5421
|
SELECT
|
|
5421
|
-
${
|
|
5422
|
+
${O.raw("'start_'")} || event_type AS node_id,
|
|
5422
5423
|
event_type AS name,
|
|
5423
5424
|
0 AS layer,
|
|
5424
5425
|
COUNT(*) AS value
|
|
@@ -5427,82 +5428,82 @@ var kt = class {
|
|
|
5427
5428
|
`);
|
|
5428
5429
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5429
5430
|
let e = t, i = `after_step_${t}`;
|
|
5430
|
-
r ? n.push(
|
|
5431
|
+
r ? n.push(O`
|
|
5431
5432
|
SELECT
|
|
5432
|
-
${
|
|
5433
|
+
${O.raw(`'after_${t}_'`)} || event_path AS node_id,
|
|
5433
5434
|
event_type AS name,
|
|
5434
|
-
${
|
|
5435
|
+
${O.raw(String(e))} AS layer,
|
|
5435
5436
|
COUNT(*) AS value
|
|
5436
|
-
FROM ${
|
|
5437
|
+
FROM ${O.identifier(i)}
|
|
5437
5438
|
GROUP BY event_path, event_type
|
|
5438
|
-
`) : n.push(
|
|
5439
|
+
`) : n.push(O`
|
|
5439
5440
|
SELECT
|
|
5440
|
-
${
|
|
5441
|
+
${O.raw(`'after_${t}_'`)} || event_type AS node_id,
|
|
5441
5442
|
event_type AS name,
|
|
5442
|
-
${
|
|
5443
|
+
${O.raw(String(e))} AS layer,
|
|
5443
5444
|
COUNT(*) AS value
|
|
5444
|
-
FROM ${
|
|
5445
|
+
FROM ${O.identifier(i)}
|
|
5445
5446
|
GROUP BY event_type
|
|
5446
5447
|
`);
|
|
5447
5448
|
}
|
|
5448
|
-
let i =
|
|
5449
|
-
node_id:
|
|
5450
|
-
name:
|
|
5451
|
-
layer:
|
|
5452
|
-
value:
|
|
5453
|
-
}).from(
|
|
5449
|
+
let i = O.join(n, O` UNION ALL `), a = t.db.select({
|
|
5450
|
+
node_id: O`node_id`.as("node_id"),
|
|
5451
|
+
name: O`name`.as("name"),
|
|
5452
|
+
layer: O`layer`.as("layer"),
|
|
5453
|
+
value: O`value`.as("value")
|
|
5454
|
+
}).from(O`(${i}) AS nodes_union`);
|
|
5454
5455
|
return t.db.$with("nodes_agg").as(a);
|
|
5455
5456
|
}
|
|
5456
5457
|
buildLinksAggregationCTE(e, t) {
|
|
5457
5458
|
let n = [], r = e.outputMode === "sunburst";
|
|
5458
5459
|
for (let t = e.stepsBefore; t >= 2; t--) {
|
|
5459
5460
|
let e = `before_step_${t}`, i = `before_step_${t - 1}`;
|
|
5460
|
-
r ? n.push(
|
|
5461
|
+
r ? n.push(O`
|
|
5461
5462
|
SELECT
|
|
5462
|
-
${
|
|
5463
|
-
${
|
|
5463
|
+
${O.raw(`'before_${t}_'`)} || f.event_path AS source_id,
|
|
5464
|
+
${O.raw(`'before_${t - 1}_'`)} || t.event_path AS target_id,
|
|
5464
5465
|
COUNT(*) AS value
|
|
5465
|
-
FROM ${
|
|
5466
|
-
INNER JOIN ${
|
|
5466
|
+
FROM ${O.identifier(e)} f
|
|
5467
|
+
INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5467
5468
|
GROUP BY f.event_path, t.event_path
|
|
5468
|
-
`) : n.push(
|
|
5469
|
+
`) : n.push(O`
|
|
5469
5470
|
SELECT
|
|
5470
|
-
${
|
|
5471
|
-
${
|
|
5471
|
+
${O.raw(`'before_${t}_'`)} || f.event_type AS source_id,
|
|
5472
|
+
${O.raw(`'before_${t - 1}_'`)} || t.event_type AS target_id,
|
|
5472
5473
|
COUNT(*) AS value
|
|
5473
|
-
FROM ${
|
|
5474
|
-
INNER JOIN ${
|
|
5474
|
+
FROM ${O.identifier(e)} f
|
|
5475
|
+
INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5475
5476
|
GROUP BY f.event_type, t.event_type
|
|
5476
5477
|
`);
|
|
5477
5478
|
}
|
|
5478
|
-
e.stepsBefore >= 1 && (r ? n.push(
|
|
5479
|
+
e.stepsBefore >= 1 && (r ? n.push(O`
|
|
5479
5480
|
SELECT
|
|
5480
|
-
${
|
|
5481
|
-
${
|
|
5481
|
+
${O.raw("'before_1_'")} || b.event_path AS source_id,
|
|
5482
|
+
${O.raw("'start_'")} || s.event_type AS target_id,
|
|
5482
5483
|
COUNT(*) AS value
|
|
5483
5484
|
FROM before_step_1 b
|
|
5484
5485
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5485
5486
|
GROUP BY b.event_path, s.event_type
|
|
5486
|
-
`) : n.push(
|
|
5487
|
+
`) : n.push(O`
|
|
5487
5488
|
SELECT
|
|
5488
|
-
${
|
|
5489
|
-
${
|
|
5489
|
+
${O.raw("'before_1_'")} || b.event_type AS source_id,
|
|
5490
|
+
${O.raw("'start_'")} || s.event_type AS target_id,
|
|
5490
5491
|
COUNT(*) AS value
|
|
5491
5492
|
FROM before_step_1 b
|
|
5492
5493
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5493
5494
|
GROUP BY b.event_type, s.event_type
|
|
5494
|
-
`)), e.stepsAfter >= 1 && (r ? n.push(
|
|
5495
|
+
`)), e.stepsAfter >= 1 && (r ? n.push(O`
|
|
5495
5496
|
SELECT
|
|
5496
|
-
${
|
|
5497
|
-
${
|
|
5497
|
+
${O.raw("'start_'")} || s.event_type AS source_id,
|
|
5498
|
+
${O.raw("'after_1_'")} || a.event_path AS target_id,
|
|
5498
5499
|
COUNT(*) AS value
|
|
5499
5500
|
FROM starting_entities s
|
|
5500
5501
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
5501
5502
|
GROUP BY s.event_type, a.event_path
|
|
5502
|
-
`) : n.push(
|
|
5503
|
+
`) : n.push(O`
|
|
5503
5504
|
SELECT
|
|
5504
|
-
${
|
|
5505
|
-
${
|
|
5505
|
+
${O.raw("'start_'")} || s.event_type AS source_id,
|
|
5506
|
+
${O.raw("'after_1_'")} || a.event_type AS target_id,
|
|
5506
5507
|
COUNT(*) AS value
|
|
5507
5508
|
FROM starting_entities s
|
|
5508
5509
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
@@ -5510,41 +5511,41 @@ var kt = class {
|
|
|
5510
5511
|
`));
|
|
5511
5512
|
for (let t = 1; t < e.stepsAfter; t++) {
|
|
5512
5513
|
let e = `after_step_${t}`, i = `after_step_${t + 1}`;
|
|
5513
|
-
r ? n.push(
|
|
5514
|
+
r ? n.push(O`
|
|
5514
5515
|
SELECT
|
|
5515
|
-
${
|
|
5516
|
-
${
|
|
5516
|
+
${O.raw(`'after_${t}_'`)} || f.event_path AS source_id,
|
|
5517
|
+
${O.raw(`'after_${t + 1}_'`)} || t.event_path AS target_id,
|
|
5517
5518
|
COUNT(*) AS value
|
|
5518
|
-
FROM ${
|
|
5519
|
-
INNER JOIN ${
|
|
5519
|
+
FROM ${O.identifier(e)} f
|
|
5520
|
+
INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5520
5521
|
GROUP BY f.event_path, t.event_path
|
|
5521
|
-
`) : n.push(
|
|
5522
|
+
`) : n.push(O`
|
|
5522
5523
|
SELECT
|
|
5523
|
-
${
|
|
5524
|
-
${
|
|
5524
|
+
${O.raw(`'after_${t}_'`)} || f.event_type AS source_id,
|
|
5525
|
+
${O.raw(`'after_${t + 1}_'`)} || t.event_type AS target_id,
|
|
5525
5526
|
COUNT(*) AS value
|
|
5526
|
-
FROM ${
|
|
5527
|
-
INNER JOIN ${
|
|
5527
|
+
FROM ${O.identifier(e)} f
|
|
5528
|
+
INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5528
5529
|
GROUP BY f.event_type, t.event_type
|
|
5529
5530
|
`);
|
|
5530
5531
|
}
|
|
5531
5532
|
if (n.length === 0) {
|
|
5532
5533
|
let e = t.db.select({
|
|
5533
|
-
source_id:
|
|
5534
|
-
target_id:
|
|
5535
|
-
value:
|
|
5536
|
-
}).from(
|
|
5534
|
+
source_id: O`NULL`.as("source_id"),
|
|
5535
|
+
target_id: O`NULL`.as("target_id"),
|
|
5536
|
+
value: O`0`.as("value")
|
|
5537
|
+
}).from(O`(SELECT 1) AS empty`).where(O`1 = 0`);
|
|
5537
5538
|
return t.db.$with("links_agg").as(e);
|
|
5538
5539
|
}
|
|
5539
|
-
let i =
|
|
5540
|
-
source_id:
|
|
5541
|
-
target_id:
|
|
5542
|
-
value:
|
|
5543
|
-
}).from(
|
|
5540
|
+
let i = O.join(n, O` UNION ALL `), a = t.db.select({
|
|
5541
|
+
source_id: O`source_id`.as("source_id"),
|
|
5542
|
+
target_id: O`target_id`.as("target_id"),
|
|
5543
|
+
value: O`value`.as("value")
|
|
5544
|
+
}).from(O`(${i}) AS links_union`);
|
|
5544
5545
|
return t.db.$with("links_agg").as(a);
|
|
5545
5546
|
}
|
|
5546
5547
|
buildFinalResultCTE(e) {
|
|
5547
|
-
let t =
|
|
5548
|
+
let t = O`
|
|
5548
5549
|
SELECT
|
|
5549
5550
|
'node' AS record_type,
|
|
5550
5551
|
node_id AS id,
|
|
@@ -5566,40 +5567,40 @@ var kt = class {
|
|
|
5566
5567
|
FROM links_agg
|
|
5567
5568
|
WHERE source_id IS NOT NULL
|
|
5568
5569
|
`, n = e.db.select({
|
|
5569
|
-
record_type:
|
|
5570
|
-
id:
|
|
5571
|
-
name:
|
|
5572
|
-
layer:
|
|
5573
|
-
value:
|
|
5574
|
-
source_id:
|
|
5575
|
-
target_id:
|
|
5576
|
-
}).from(
|
|
5570
|
+
record_type: O`record_type`.as("record_type"),
|
|
5571
|
+
id: O`id`.as("id"),
|
|
5572
|
+
name: O`name`.as("name"),
|
|
5573
|
+
layer: O`layer`.as("layer"),
|
|
5574
|
+
value: O`value`.as("value"),
|
|
5575
|
+
source_id: O`source_id`.as("source_id"),
|
|
5576
|
+
target_id: O`target_id`.as("target_id")
|
|
5577
|
+
}).from(O`(${t}) AS final_union`);
|
|
5577
5578
|
return e.db.$with("final_result").as(n);
|
|
5578
5579
|
}
|
|
5579
5580
|
};
|
|
5580
5581
|
//#endregion
|
|
5581
5582
|
//#region src/server/types/retention.ts
|
|
5582
|
-
function
|
|
5583
|
+
function Nt(e) {
|
|
5583
5584
|
return Array.isArray(e);
|
|
5584
5585
|
}
|
|
5585
|
-
function
|
|
5586
|
+
function Pt(e) {
|
|
5586
5587
|
return typeof e == "object" && !!e && "cube" in e;
|
|
5587
5588
|
}
|
|
5588
|
-
function
|
|
5589
|
-
if (
|
|
5589
|
+
function Ft(e) {
|
|
5590
|
+
if (Pt(e)) return e.cube;
|
|
5590
5591
|
let t = e.indexOf(".");
|
|
5591
5592
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5592
5593
|
return e.substring(0, t);
|
|
5593
5594
|
}
|
|
5594
|
-
function
|
|
5595
|
-
if (
|
|
5595
|
+
function It(e) {
|
|
5596
|
+
if (Pt(e)) return e.dimension;
|
|
5596
5597
|
let t = e.indexOf(".");
|
|
5597
5598
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5598
5599
|
return e.substring(t + 1);
|
|
5599
5600
|
}
|
|
5600
5601
|
//#endregion
|
|
5601
5602
|
//#region src/server/builders/retention-query-builder.ts
|
|
5602
|
-
var
|
|
5603
|
+
var Lt = class {
|
|
5603
5604
|
filterBuilder;
|
|
5604
5605
|
dateTimeBuilder;
|
|
5605
5606
|
constructor(e) {
|
|
@@ -5611,12 +5612,12 @@ var It = class {
|
|
|
5611
5612
|
validateConfig(e, t) {
|
|
5612
5613
|
let n = [];
|
|
5613
5614
|
try {
|
|
5614
|
-
let r =
|
|
5615
|
+
let r = Ft(e.timeDimension), i = It(e.timeDimension), a = t.get(r);
|
|
5615
5616
|
a ? a.dimensions?.[i] || n.push(`Time dimension not found: ${i} in cube ${r}`) : n.push(`Cube not found: ${r}`);
|
|
5616
5617
|
} catch {
|
|
5617
5618
|
n.push(`Invalid time dimension format: ${e.timeDimension}`);
|
|
5618
5619
|
}
|
|
5619
|
-
if (
|
|
5620
|
+
if (Nt(e.bindingKey)) for (let r of e.bindingKey) {
|
|
5620
5621
|
let e = t.get(r.cube);
|
|
5621
5622
|
if (!e) n.push(`Binding key mapping cube not found: ${r.cube}`);
|
|
5622
5623
|
else {
|
|
@@ -5668,20 +5669,20 @@ var It = class {
|
|
|
5668
5669
|
}
|
|
5669
5670
|
buildRetentionQuery(e, t, n) {
|
|
5670
5671
|
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 = {
|
|
5671
|
-
period:
|
|
5672
|
-
cohort_size:
|
|
5673
|
-
retained_users:
|
|
5674
|
-
retention_rate:
|
|
5672
|
+
period: O`rc.period_number`.as("period"),
|
|
5673
|
+
cohort_size: O`cs.cohort_size`.as("cohort_size"),
|
|
5674
|
+
retained_users: O`rc.retained_users`.as("retained_users"),
|
|
5675
|
+
retention_rate: O`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as("retention_rate")
|
|
5675
5676
|
};
|
|
5676
|
-
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] =
|
|
5677
|
-
let d = n.db.with(a, o, s, c).select(u).from(
|
|
5677
|
+
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] = O.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5678
|
+
let d = n.db.with(a, o, s, c).select(u).from(O`retention_counts rc`);
|
|
5678
5679
|
if (l) {
|
|
5679
|
-
let e = r.breakdowns.map((e, t) =>
|
|
5680
|
-
d = d.innerJoin(
|
|
5681
|
-
} else d = d.innerJoin(
|
|
5680
|
+
let e = r.breakdowns.map((e, t) => O`COALESCE(CAST(rc.breakdown_${O.raw(String(t))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${O.raw(String(t))} AS TEXT), '')`), t = e.length === 1 ? e[0] : O.join(e, O` AND `);
|
|
5681
|
+
d = d.innerJoin(O`cohort_sizes cs`, t);
|
|
5682
|
+
} else d = d.innerJoin(O`cohort_sizes cs`, O`1 = 1`);
|
|
5682
5683
|
let f = [];
|
|
5683
|
-
for (let e = 0; e < r.breakdowns.length; e++) f.push(
|
|
5684
|
-
return f.push(
|
|
5684
|
+
for (let e = 0; e < r.breakdowns.length; e++) f.push(O.raw(`rc.breakdown_${e}`));
|
|
5685
|
+
return f.push(O`rc.period_number`), d = d.orderBy(...f), d;
|
|
5685
5686
|
}
|
|
5686
5687
|
transformResult(e, t) {
|
|
5687
5688
|
let n = t.breakdownDimensions || [], r = Math.min(n.length, 100), i = r > 0;
|
|
@@ -5704,7 +5705,7 @@ var It = class {
|
|
|
5704
5705
|
});
|
|
5705
5706
|
}
|
|
5706
5707
|
resolveConfig(e, t, n) {
|
|
5707
|
-
let r =
|
|
5708
|
+
let r = Ft(e.timeDimension), i = It(e.timeDimension), a = t.get(r);
|
|
5708
5709
|
if (!a) throw Error(`Cube not found: ${r}`);
|
|
5709
5710
|
let o = a.dimensions?.[i];
|
|
5710
5711
|
if (!o) throw Error(`Time dimension not found: ${i}`);
|
|
@@ -5729,7 +5730,7 @@ var It = class {
|
|
|
5729
5730
|
};
|
|
5730
5731
|
}
|
|
5731
5732
|
resolveBindingKey(e, t, n, r) {
|
|
5732
|
-
if (
|
|
5733
|
+
if (Nt(e)) {
|
|
5733
5734
|
let i = e.find((e) => e.cube === t.name);
|
|
5734
5735
|
if (!i) throw Error(`No binding key mapping found for cube: ${t.name}`);
|
|
5735
5736
|
let a = this.extractDimensionName(i.dimension), o = n.get(i.cube);
|
|
@@ -5760,7 +5761,7 @@ var It = class {
|
|
|
5760
5761
|
let i = this.buildSingleFilterCondition(e, t, n, r);
|
|
5761
5762
|
i && a.push(i);
|
|
5762
5763
|
}
|
|
5763
|
-
return a.length === 0 ? null : a.length === 1 ? a[0] : o ?
|
|
5764
|
+
return a.length === 0 ? null : a.length === 1 ? a[0] : o ? F(...a) : O`(${O.join(a, O` OR `)})`;
|
|
5764
5765
|
}
|
|
5765
5766
|
let i = e, [a, o] = i.member.split("."), s = n.get(a);
|
|
5766
5767
|
if (!s) return null;
|
|
@@ -5776,16 +5777,16 @@ var It = class {
|
|
|
5776
5777
|
i.push(n);
|
|
5777
5778
|
}
|
|
5778
5779
|
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = {
|
|
5779
|
-
binding_key:
|
|
5780
|
-
cohort_entry:
|
|
5780
|
+
binding_key: O`${t.bindingKeyExpr}`.as("binding_key"),
|
|
5781
|
+
cohort_entry: O`MIN(${a})`.as("cohort_entry")
|
|
5781
5782
|
};
|
|
5782
5783
|
for (let e = 0; e < t.breakdowns.length; e++) {
|
|
5783
5784
|
let { expr: n } = t.breakdowns[e];
|
|
5784
|
-
o[`breakdown_${e}`] =
|
|
5785
|
+
o[`breakdown_${e}`] = O`MIN(${n})`.as(`breakdown_${e}`);
|
|
5785
5786
|
}
|
|
5786
5787
|
let s = n.db.select(o).from(r.from);
|
|
5787
5788
|
if (i.length > 0) {
|
|
5788
|
-
let e = i.length === 1 ? i[0] :
|
|
5789
|
+
let e = i.length === 1 ? i[0] : F(...i);
|
|
5789
5790
|
s = s.where(e);
|
|
5790
5791
|
}
|
|
5791
5792
|
let c = [t.bindingKeyExpr];
|
|
@@ -5797,36 +5798,36 @@ var It = class {
|
|
|
5797
5798
|
return n.db.$with("cohort_base").as(s);
|
|
5798
5799
|
}
|
|
5799
5800
|
buildDateRangeCondition(e, t) {
|
|
5800
|
-
return
|
|
5801
|
+
return O`${e} >= ${t.start}::date AND ${e} < (${t.end}::date + interval '1 day')`;
|
|
5801
5802
|
}
|
|
5802
5803
|
buildDateRangeHavingCondition(e, t) {
|
|
5803
|
-
return
|
|
5804
|
+
return O`MIN(${e}) >= ${t.start}::date AND MIN(${e}) < (${t.end}::date + interval '1 day')`;
|
|
5804
5805
|
}
|
|
5805
5806
|
buildActivityPeriodsCTE(e, t, n) {
|
|
5806
5807
|
let r = t.cube.sql(n), i = [];
|
|
5807
|
-
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(
|
|
5808
|
-
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(
|
|
5809
|
-
binding_key:
|
|
5808
|
+
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(O`${t.timeExpr} >= cohort_base.cohort_entry`);
|
|
5809
|
+
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(O`cohort_base.cohort_entry`, a, e.granularity), s = {
|
|
5810
|
+
binding_key: O`cohort_base.binding_key`.as("binding_key"),
|
|
5810
5811
|
period_number: o.as("period_number")
|
|
5811
5812
|
};
|
|
5812
|
-
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] =
|
|
5813
|
-
let c = n.db.select(s).from(r.from).innerJoin(
|
|
5813
|
+
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] = O.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5814
|
+
let c = n.db.select(s).from(r.from).innerJoin(O`cohort_base`, O`${t.bindingKeyExpr} = cohort_base.binding_key`);
|
|
5814
5815
|
if (i.length > 0) {
|
|
5815
|
-
let e = i.length === 1 ? i[0] :
|
|
5816
|
+
let e = i.length === 1 ? i[0] : F(...i);
|
|
5816
5817
|
c = c.where(e);
|
|
5817
5818
|
}
|
|
5818
|
-
let l = [
|
|
5819
|
-
for (let e = 0; e < t.breakdowns.length; e++) l.push(
|
|
5819
|
+
let l = [O`cohort_base.binding_key`, o];
|
|
5820
|
+
for (let e = 0; e < t.breakdowns.length; e++) l.push(O.raw(`cohort_base.breakdown_${e}`));
|
|
5820
5821
|
return c = c.groupBy(...l), n.db.$with("activity_periods").as(c);
|
|
5821
5822
|
}
|
|
5822
5823
|
buildCohortSizesCTE(e, t, n) {
|
|
5823
5824
|
if (n > 0) {
|
|
5824
|
-
let e = { cohort_size:
|
|
5825
|
-
for (let t = 0; t < n; t++) e[`breakdown_${t}`] =
|
|
5826
|
-
let i = t.db.select(e).from(
|
|
5825
|
+
let e = { cohort_size: O`COUNT(*)`.as("cohort_size") }, r = [];
|
|
5826
|
+
for (let t = 0; t < n; t++) e[`breakdown_${t}`] = O.raw(`breakdown_${t}`).as(`breakdown_${t}`), r.push(O.raw(`breakdown_${t}`));
|
|
5827
|
+
let i = t.db.select(e).from(O`cohort_base`).groupBy(...r);
|
|
5827
5828
|
return t.db.$with("cohort_sizes").as(i);
|
|
5828
5829
|
}
|
|
5829
|
-
let r = t.db.select({ cohort_size:
|
|
5830
|
+
let r = t.db.select({ cohort_size: O`COUNT(*)`.as("cohort_size") }).from(O`cohort_base`);
|
|
5830
5831
|
return t.db.$with("cohort_sizes").as(r);
|
|
5831
5832
|
}
|
|
5832
5833
|
buildRetentionCountsCTE(e, t, n) {
|
|
@@ -5834,32 +5835,32 @@ var It = class {
|
|
|
5834
5835
|
if (e.retentionType === "rolling") r = this.buildRollingRetentionCountsQuery(e, t, n);
|
|
5835
5836
|
else {
|
|
5836
5837
|
let i = {
|
|
5837
|
-
period_number:
|
|
5838
|
-
retained_users:
|
|
5839
|
-
}, a = [
|
|
5840
|
-
for (let e = 0; e < n; e++) i[`breakdown_${e}`] =
|
|
5838
|
+
period_number: O`period_number`.as("period_number"),
|
|
5839
|
+
retained_users: O`COUNT(DISTINCT binding_key)`.as("retained_users")
|
|
5840
|
+
}, a = [O`period_number`];
|
|
5841
|
+
for (let e = 0; e < n; e++) i[`breakdown_${e}`] = O.raw(`breakdown_${e}`).as(`breakdown_${e}`), a.push(O.raw(`breakdown_${e}`));
|
|
5841
5842
|
let o = Math.min(e.periods, 52);
|
|
5842
|
-
r = t.db.select(i).from(
|
|
5843
|
+
r = t.db.select(i).from(O`activity_periods`).where(O`period_number >= 0 AND period_number <= ${o}`).groupBy(...a);
|
|
5843
5844
|
}
|
|
5844
5845
|
return t.db.$with("retention_counts").as(r);
|
|
5845
5846
|
}
|
|
5846
5847
|
buildRollingRetentionCountsQuery(e, t, n) {
|
|
5847
5848
|
let r = [];
|
|
5848
5849
|
for (let e = 0; e < n; e++) r.push(`breakdown_${e}`);
|
|
5849
|
-
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a =
|
|
5850
|
+
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a = O`(
|
|
5850
5851
|
SELECT
|
|
5851
5852
|
binding_key,
|
|
5852
|
-
${
|
|
5853
|
+
${O.raw(r.map((e) => `${e}`).join(", ") + (r.length > 0 ? "," : ""))}
|
|
5853
5854
|
MAX(period_number) as max_period
|
|
5854
5855
|
FROM activity_periods
|
|
5855
5856
|
WHERE period_number >= 0 AND period_number <= ${e.periods}
|
|
5856
|
-
GROUP BY binding_key${
|
|
5857
|
+
GROUP BY binding_key${O.raw(i)}
|
|
5857
5858
|
)`, o = this.databaseAdapter.buildPeriodSeriesSubquery(e.periods), s = {
|
|
5858
|
-
period_number:
|
|
5859
|
-
retained_users:
|
|
5860
|
-
}, c = [
|
|
5861
|
-
for (let e = 0; e < n; e++) s[`breakdown_${e}`] =
|
|
5862
|
-
return t.db.select(s).from(
|
|
5859
|
+
period_number: O`p.period_number`.as("period_number"),
|
|
5860
|
+
retained_users: O`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as("retained_users")
|
|
5861
|
+
}, c = [O`p.period_number`];
|
|
5862
|
+
for (let e = 0; e < n; e++) s[`breakdown_${e}`] = O.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`), c.push(O.raw(`ump.breakdown_${e}`));
|
|
5863
|
+
return t.db.select(s).from(O`${a} ump`).innerJoin(o, O`TRUE`).groupBy(...c);
|
|
5863
5864
|
}
|
|
5864
5865
|
buildPeriodNumberExpression(e, t, n) {
|
|
5865
5866
|
return this.databaseAdapter.buildDateDiffPeriods(e, t, n);
|
|
@@ -5868,7 +5869,7 @@ var It = class {
|
|
|
5868
5869
|
let t = e.split(".");
|
|
5869
5870
|
return t.length > 1 ? t[1] : t[0];
|
|
5870
5871
|
}
|
|
5871
|
-
},
|
|
5872
|
+
}, Rt = class {
|
|
5872
5873
|
constructor(e) {
|
|
5873
5874
|
this.queryPlanner = e;
|
|
5874
5875
|
}
|
|
@@ -6303,7 +6304,7 @@ var It = class {
|
|
|
6303
6304
|
timeDimensions: []
|
|
6304
6305
|
};
|
|
6305
6306
|
}
|
|
6306
|
-
},
|
|
6307
|
+
}, zt = class {
|
|
6307
6308
|
name = "identity";
|
|
6308
6309
|
optimise(e) {
|
|
6309
6310
|
return e;
|
|
@@ -6311,7 +6312,7 @@ var It = class {
|
|
|
6311
6312
|
};
|
|
6312
6313
|
//#endregion
|
|
6313
6314
|
//#region src/server/physical-plan/processors/cte-processor.ts
|
|
6314
|
-
function
|
|
6315
|
+
function Bt(e, t, n, r) {
|
|
6315
6316
|
let i = /* @__PURE__ */ new Map();
|
|
6316
6317
|
if (e.preAggregationCTEs && e.preAggregationCTEs.length > 0) {
|
|
6317
6318
|
for (let t of e.preAggregationCTEs) if (t.propagatingFilters && t.propagatingFilters.length > 0) for (let e of t.propagatingFilters) {
|
|
@@ -6321,7 +6322,7 @@ function zt(e, t, n, r) {
|
|
|
6321
6322
|
i.set(t, s);
|
|
6322
6323
|
}
|
|
6323
6324
|
let a = i.get(t);
|
|
6324
|
-
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] :
|
|
6325
|
+
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] : F(...a));
|
|
6325
6326
|
}
|
|
6326
6327
|
}
|
|
6327
6328
|
let a = [], o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map();
|
|
@@ -6341,7 +6342,7 @@ function zt(e, t, n, r) {
|
|
|
6341
6342
|
}
|
|
6342
6343
|
//#endregion
|
|
6343
6344
|
//#region src/server/physical-plan/processors/window-processor.ts
|
|
6344
|
-
function
|
|
6345
|
+
function Vt(e, t, n, r, i, a) {
|
|
6345
6346
|
if (n.measures) for (let o of n.measures) {
|
|
6346
6347
|
let [s, c] = o.split("."), l = i.get(s);
|
|
6347
6348
|
if (!l?.measures?.[c]) continue;
|
|
@@ -6352,16 +6353,16 @@ function Bt(e, t, n, r, i, a) {
|
|
|
6352
6353
|
let [f, p] = d.split("."), m = i.get(f);
|
|
6353
6354
|
if (!m?.measures?.[p]) continue;
|
|
6354
6355
|
let h = m.measures[p], g = t.preAggregationCTEs?.find((e) => e.cube?.name === f && e.measures?.includes(d)), _;
|
|
6355
|
-
_ = g ?
|
|
6356
|
-
let v =
|
|
6357
|
-
v && (e[o] =
|
|
6356
|
+
_ = g ? O`sum(${O`${O.identifier(g.cteAlias)}.${O.identifier(p)}`})` : a.queryBuilder.buildMeasureExpression(h, r, m), e[d] || (e[d] = O`${_}`.as(d));
|
|
6357
|
+
let v = Ht(u, _, n, r, l, t, a);
|
|
6358
|
+
v && (e[o] = O`${v}`.as(o));
|
|
6358
6359
|
}
|
|
6359
6360
|
}
|
|
6360
|
-
function
|
|
6361
|
+
function Ht(e, t, n, r, i, a, o) {
|
|
6361
6362
|
let s = e.windowConfig || {}, c = (e, t) => {
|
|
6362
6363
|
if (!a.preAggregationCTEs) return null;
|
|
6363
6364
|
let n = a.preAggregationCTEs.find((t) => t.cube?.name === e);
|
|
6364
|
-
return n && n.cteAlias ?
|
|
6365
|
+
return n && n.cteAlias ? O`${O.identifier(n.cteAlias)}.${O.identifier(t)}` : null;
|
|
6365
6366
|
}, l;
|
|
6366
6367
|
if (s.orderBy && s.orderBy.length > 0) l = s.orderBy.map((e) => {
|
|
6367
6368
|
let a = e.field.includes(".") ? e.field.split(".")[1] : e.field;
|
|
@@ -6419,15 +6420,15 @@ function Vt(e, t, n, r, i, a, o) {
|
|
|
6419
6420
|
});
|
|
6420
6421
|
if (!d) return null;
|
|
6421
6422
|
switch (s.operation || Q.getDefaultWindowOperation(e.type)) {
|
|
6422
|
-
case "difference": return
|
|
6423
|
-
case "ratio": return
|
|
6424
|
-
case "percentChange": return
|
|
6423
|
+
case "difference": return O`${t} - ${d}`;
|
|
6424
|
+
case "ratio": return O`${t} / NULLIF(${d}, 0)`;
|
|
6425
|
+
case "percentChange": return O`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;
|
|
6425
6426
|
default: return d;
|
|
6426
6427
|
}
|
|
6427
6428
|
}
|
|
6428
6429
|
//#endregion
|
|
6429
6430
|
//#region src/server/physical-plan/processors/selection-processor.ts
|
|
6430
|
-
function
|
|
6431
|
+
function Ut(e, t, n, r, i) {
|
|
6431
6432
|
let a = { ...i.queryBuilder.buildSelections(e.joinCubes.length > 0 ? r : e.primaryCube, t, n) };
|
|
6432
6433
|
if (e.preAggregationCTEs) for (let o of e.preAggregationCTEs) {
|
|
6433
6434
|
let e = o.cube.name;
|
|
@@ -6435,32 +6436,32 @@ function Ht(e, t, n, r, i) {
|
|
|
6435
6436
|
if (!a[s]) continue;
|
|
6436
6437
|
let [, c] = s.split("."), l = r.get(e);
|
|
6437
6438
|
if (!l?.measures?.[c]) continue;
|
|
6438
|
-
let u = l.measures[c], d =
|
|
6439
|
+
let u = l.measures[c], d = O`${O.identifier(o.cteAlias)}.${O.identifier(c)}`, f;
|
|
6439
6440
|
if (u.type === "calculated" && u.calculatedSql) f = i.queryBuilder.buildCTECalculatedMeasure(u, l, o, r, n);
|
|
6440
6441
|
else {
|
|
6441
|
-
let e = o.cteReason === "fanOutPrevention", n =
|
|
6442
|
+
let e = o.cteReason === "fanOutPrevention", n = Wt(o, t, r), a = e || n;
|
|
6442
6443
|
switch (u.type) {
|
|
6443
6444
|
case "count":
|
|
6444
6445
|
case "countDistinct":
|
|
6445
6446
|
case "sum":
|
|
6446
|
-
f = a ?
|
|
6447
|
+
f = a ? B(d) : z(d);
|
|
6447
6448
|
break;
|
|
6448
6449
|
case "avg":
|
|
6449
|
-
f = a ?
|
|
6450
|
+
f = a ? B(d) : i.databaseAdapter.buildAvg(d);
|
|
6450
6451
|
break;
|
|
6451
6452
|
case "min":
|
|
6452
|
-
f =
|
|
6453
|
+
f = pe(d);
|
|
6453
6454
|
break;
|
|
6454
6455
|
case "max":
|
|
6455
|
-
f =
|
|
6456
|
+
f = B(d);
|
|
6456
6457
|
break;
|
|
6457
6458
|
case "number":
|
|
6458
|
-
f =
|
|
6459
|
+
f = B(d);
|
|
6459
6460
|
break;
|
|
6460
|
-
default: f = a ?
|
|
6461
|
+
default: f = a ? B(d) : z(d);
|
|
6461
6462
|
}
|
|
6462
6463
|
}
|
|
6463
|
-
a[s] =
|
|
6464
|
+
a[s] = O`${f}`.as(s);
|
|
6464
6465
|
}
|
|
6465
6466
|
for (let t in a) {
|
|
6466
6467
|
let [n, i] = t.split(".");
|
|
@@ -6472,15 +6473,15 @@ function Ht(e, t, n, r, i) {
|
|
|
6472
6473
|
let e = s.dimensions[i].sql;
|
|
6473
6474
|
u = o.joinKeys.find((t) => t.targetColumnObj === e);
|
|
6474
6475
|
}
|
|
6475
|
-
(u || l && s?.dimensions?.[i]) && (a[t] =
|
|
6476
|
+
(u || l && s?.dimensions?.[i]) && (a[t] = O`${O.identifier(o.cteAlias)}.${O.identifier(i)}`.as(t));
|
|
6476
6477
|
}
|
|
6477
6478
|
}
|
|
6478
|
-
return
|
|
6479
|
-
}
|
|
6480
|
-
function Ut(e, t, n) {
|
|
6481
|
-
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 && Wt(e.sourceColumnObj, t, n));
|
|
6479
|
+
return Vt(a, e, t, n, r, i), a;
|
|
6482
6480
|
}
|
|
6483
6481
|
function Wt(e, t, n) {
|
|
6482
|
+
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 && Gt(e.sourceColumnObj, t, n));
|
|
6483
|
+
}
|
|
6484
|
+
function Gt(e, t, n) {
|
|
6484
6485
|
if (t.dimensions) for (let r of t.dimensions) {
|
|
6485
6486
|
let [t, i] = r.split(".");
|
|
6486
6487
|
if (n.get(t)?.dimensions?.[i]?.sql === e) return !0;
|
|
@@ -6494,7 +6495,7 @@ function Wt(e, t, n) {
|
|
|
6494
6495
|
}
|
|
6495
6496
|
//#endregion
|
|
6496
6497
|
//#region src/server/physical-plan/processors/joins-processor.ts
|
|
6497
|
-
function
|
|
6498
|
+
function Kt(e, t, n, r, i, a) {
|
|
6498
6499
|
let o = [], s = t.db.select(r).from(n.from);
|
|
6499
6500
|
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") {
|
|
6500
6501
|
case "left":
|
|
@@ -6525,10 +6526,10 @@ function Gt(e, t, n, r, i, a) {
|
|
|
6525
6526
|
if (t && t.joinKeys.length > 0) {
|
|
6526
6527
|
let e = [];
|
|
6527
6528
|
for (let n of t.joinKeys) {
|
|
6528
|
-
let t =
|
|
6529
|
-
r && e.push(
|
|
6529
|
+
let t = O`${O.identifier(c)}.${O.identifier(n.sourceColumn)}`, r = n.targetColumnObj;
|
|
6530
|
+
r && e.push(N(r, t));
|
|
6530
6531
|
}
|
|
6531
|
-
e.length > 0 && (a =
|
|
6532
|
+
e.length > 0 && (a = F(...e));
|
|
6532
6533
|
}
|
|
6533
6534
|
}
|
|
6534
6535
|
let l = [];
|
|
@@ -6555,19 +6556,19 @@ function Gt(e, t, n, r, i, a) {
|
|
|
6555
6556
|
} catch {}
|
|
6556
6557
|
}
|
|
6557
6558
|
let d, f, p;
|
|
6558
|
-
if (u) d =
|
|
6559
|
+
if (u) d = O`${O.identifier(u)}`, f = a.cteBuilder.buildCTEJoinCondition(n, u, e), p = void 0;
|
|
6559
6560
|
else {
|
|
6560
6561
|
let e = i.downstreamCubeMap.get(n.cube.name), r = n.cube.sql(t);
|
|
6561
6562
|
if (d = r.from, p = r.where, e && !n.junctionTable) {
|
|
6562
6563
|
let t = [];
|
|
6563
6564
|
for (let n of e.joinKeys) {
|
|
6564
|
-
let r =
|
|
6565
|
-
t.push(
|
|
6565
|
+
let r = O`${O.identifier(e.cteAlias)}.${O.identifier(n.sourceColumn)}`, i = n.targetColumnObj || O.identifier(n.targetColumn);
|
|
6566
|
+
t.push(N(r, i));
|
|
6566
6567
|
}
|
|
6567
|
-
f = t.length === 1 ? t[0] :
|
|
6568
|
+
f = t.length === 1 ? t[0] : F(...t);
|
|
6568
6569
|
} else f = n.joinCondition;
|
|
6569
6570
|
}
|
|
6570
|
-
let m = n.joinType || "left", h = m !== "inner" && p ?
|
|
6571
|
+
let m = n.joinType || "left", h = m !== "inner" && p ? F(f, p) : f;
|
|
6571
6572
|
try {
|
|
6572
6573
|
switch (m) {
|
|
6573
6574
|
case "left":
|
|
@@ -6594,7 +6595,7 @@ function Gt(e, t, n, r, i, a) {
|
|
|
6594
6595
|
}
|
|
6595
6596
|
//#endregion
|
|
6596
6597
|
//#region src/server/physical-plan/processors/predicates-processor.ts
|
|
6597
|
-
function
|
|
6598
|
+
function qt(e, t, n, r, i, a, o, s) {
|
|
6598
6599
|
let c = [...o.allWhereConditions];
|
|
6599
6600
|
if (i.where && c.push(i.where), e.joinCubes && e.joinCubes.length > 0) for (let t of e.joinCubes) {
|
|
6600
6601
|
let e = t.cube.name;
|
|
@@ -6606,14 +6607,14 @@ function Kt(e, t, n, r, i, a, o, s) {
|
|
|
6606
6607
|
l.length > 0 && c.push(...l);
|
|
6607
6608
|
let u = o.drizzleQuery;
|
|
6608
6609
|
if (c.length > 0) {
|
|
6609
|
-
let e = c.length === 1 ? c[0] :
|
|
6610
|
+
let e = c.length === 1 ? c[0] : F(...c);
|
|
6610
6611
|
u = u.where(e);
|
|
6611
6612
|
}
|
|
6612
6613
|
let d = s.queryBuilder.buildGroupByFields(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6613
6614
|
if (d.length > 0 && (u = u.groupBy(...d)), !t.ungrouped) {
|
|
6614
6615
|
let i = s.queryBuilder.buildHavingConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6615
6616
|
if (i.length > 0) {
|
|
6616
|
-
let e = i.length === 1 ? i[0] :
|
|
6617
|
+
let e = i.length === 1 ? i[0] : F(...i);
|
|
6617
6618
|
u = u.having(e);
|
|
6618
6619
|
}
|
|
6619
6620
|
}
|
|
@@ -6622,14 +6623,14 @@ function Kt(e, t, n, r, i, a, o, s) {
|
|
|
6622
6623
|
}
|
|
6623
6624
|
//#endregion
|
|
6624
6625
|
//#region src/server/physical-plan/processors/shared.ts
|
|
6625
|
-
function
|
|
6626
|
+
function Jt(e) {
|
|
6626
6627
|
let t = /* @__PURE__ */ new Map();
|
|
6627
6628
|
if (t.set(e.primaryCube.name, e.primaryCube), e.joinCubes) for (let n of e.joinCubes) t.set(n.cube.name, n.cube);
|
|
6628
6629
|
return t;
|
|
6629
6630
|
}
|
|
6630
6631
|
//#endregion
|
|
6631
6632
|
//#region src/server/physical-plan/drizzle-plan-builder.ts
|
|
6632
|
-
var
|
|
6633
|
+
var Yt = class {
|
|
6633
6634
|
constructor(e, t, n) {
|
|
6634
6635
|
this.queryBuilder = e, this.cteBuilder = t, this.databaseAdapter = n;
|
|
6635
6636
|
}
|
|
@@ -6769,13 +6770,13 @@ var Jt = class {
|
|
|
6769
6770
|
if (i) return i;
|
|
6770
6771
|
let a = this.tryBuildKeysDeduplicationQuery(e, t, n, r);
|
|
6771
6772
|
if (a) return a;
|
|
6772
|
-
let o =
|
|
6773
|
-
return
|
|
6773
|
+
let o = Bt(e, t, n, r), s = e.primaryCube.sql(n), c = e.joinCubes.length > 0 ? Jt(e) : new Map([[e.primaryCube.name, e.primaryCube]]);
|
|
6774
|
+
return qt(e, t, n, c, s, o, Kt(e, n, s, Ut(e, t, n, c, r), o, r), r);
|
|
6774
6775
|
}
|
|
6775
6776
|
tryBuildKeysDeduplicationQuery(e, t, n, r) {
|
|
6776
6777
|
let i = e.keysDeduplication;
|
|
6777
6778
|
if (!i?.multipliedCubeName || !t.measures?.length) return null;
|
|
6778
|
-
let a = e.joinCubes.length > 0 ?
|
|
6779
|
+
let a = e.joinCubes.length > 0 ? Jt(e) : new Map([[e.primaryCube.name, e.primaryCube]]), o = a.get(i.multipliedCubeName);
|
|
6779
6780
|
if (!o || !this.canExecuteKeysDeduplication(t, o, i.multipliedCubeName)) return null;
|
|
6780
6781
|
let s = i.primaryKeyDimensions.length > 0 ? i.primaryKeyDimensions : this.getPrimaryKeyDimensions(o);
|
|
6781
6782
|
if (s.length === 0) return null;
|
|
@@ -6784,20 +6785,20 @@ var Jt = class {
|
|
|
6784
6785
|
let [t, r] = e.split("."), i = a.get(t), o = i?.dimensions?.[r];
|
|
6785
6786
|
if (!i || !o) return null;
|
|
6786
6787
|
let s = W(o.sql, n);
|
|
6787
|
-
u[e] =
|
|
6788
|
+
u[e] = O`${s}`.as(e), d.push(s);
|
|
6788
6789
|
}
|
|
6789
6790
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
6790
6791
|
let [t, i] = e.dimension.split("."), o = a.get(t), s = o?.dimensions?.[i];
|
|
6791
6792
|
if (!o || !s) return null;
|
|
6792
6793
|
let c = r.queryBuilder.buildTimeDimensionExpression(s.sql, e.granularity, n);
|
|
6793
|
-
u[e.dimension] =
|
|
6794
|
+
u[e.dimension] = O`${c}`.as(e.dimension), d.push(c);
|
|
6794
6795
|
}
|
|
6795
6796
|
let f = [];
|
|
6796
6797
|
for (let e of s) {
|
|
6797
6798
|
let t = o.dimensions?.[e];
|
|
6798
6799
|
if (!t) return null;
|
|
6799
6800
|
let r = W(t.sql, n), i = `__pk__${e}`;
|
|
6800
|
-
u[i] =
|
|
6801
|
+
u[i] = O`${r}`.as(i), d.push(r), f.push(i);
|
|
6801
6802
|
}
|
|
6802
6803
|
let p = i.regularMeasures ?? [], m = new Set(p), h = t.measures.filter((e) => !m.has(e));
|
|
6803
6804
|
if (p.length > 0) {
|
|
@@ -6806,7 +6807,7 @@ var Jt = class {
|
|
|
6806
6807
|
let n = e.get(t);
|
|
6807
6808
|
if (!n) return null;
|
|
6808
6809
|
let r = `__reg__${t.replace(".", "__")}`;
|
|
6809
|
-
u[r] =
|
|
6810
|
+
u[r] = O`${n()}`.as(r);
|
|
6810
6811
|
}
|
|
6811
6812
|
}
|
|
6812
6813
|
let g = e.primaryCube.sql(n), _ = [];
|
|
@@ -6821,29 +6822,29 @@ var Jt = class {
|
|
|
6821
6822
|
let e = t.cube.sql(n);
|
|
6822
6823
|
v = this.applyJoinByType(v, t.joinType ?? "left", e.from, t.joinCondition), e.where && _.push(e.where);
|
|
6823
6824
|
}
|
|
6824
|
-
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] :
|
|
6825
|
+
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] : F(..._))), d.length > 0 && (v = v.groupBy(...d));
|
|
6825
6826
|
let y = n.db.$with(c).as(v), b = o.sql(n), x = {}, S = [];
|
|
6826
6827
|
for (let e of s) {
|
|
6827
6828
|
let t = o.dimensions?.[e];
|
|
6828
6829
|
if (!t) return null;
|
|
6829
6830
|
let r = W(t.sql, n);
|
|
6830
|
-
x[e] =
|
|
6831
|
+
x[e] = O`${r}`.as(e), S.push(r);
|
|
6831
6832
|
}
|
|
6832
6833
|
let C = /* @__PURE__ */ new Set();
|
|
6833
6834
|
for (let e of h) {
|
|
6834
6835
|
let [, t] = e.split(".");
|
|
6835
6836
|
o.measures?.[t]?.type === "avg" && C.add(t);
|
|
6836
6837
|
}
|
|
6837
|
-
let
|
|
6838
|
+
let w = h.filter((e) => {
|
|
6838
6839
|
let [, t] = e.split(".");
|
|
6839
6840
|
return !C.has(t);
|
|
6840
6841
|
});
|
|
6841
|
-
if (
|
|
6842
|
-
let e = r.queryBuilder.buildResolvedMeasures(
|
|
6843
|
-
for (let t of
|
|
6842
|
+
if (w.length > 0) {
|
|
6843
|
+
let e = r.queryBuilder.buildResolvedMeasures(w, new Map([[o.name, o]]), n);
|
|
6844
|
+
for (let t of w) {
|
|
6844
6845
|
let [, n] = t.split("."), r = e.get(t);
|
|
6845
6846
|
if (!r || typeof r != "function") return null;
|
|
6846
|
-
x[n] =
|
|
6847
|
+
x[n] = O`${r()}`.as(n);
|
|
6847
6848
|
}
|
|
6848
6849
|
}
|
|
6849
6850
|
for (let e of h) {
|
|
@@ -6852,27 +6853,27 @@ var Jt = class {
|
|
|
6852
6853
|
let r = o.measures?.[t];
|
|
6853
6854
|
if (!r?.sql) return null;
|
|
6854
6855
|
let i = W(r.sql, n), a = `__avg_sum__${t}`, s = `__avg_count__${t}`;
|
|
6855
|
-
x[a] =
|
|
6856
|
+
x[a] = O`sum(${i})`.as(a), x[s] = O`count(${i})`.as(s);
|
|
6856
6857
|
}
|
|
6857
|
-
let
|
|
6858
|
-
b.where &&
|
|
6859
|
-
let
|
|
6860
|
-
for (let e of t.dimensions ?? [])
|
|
6861
|
-
for (let e of t.timeDimensions ?? [])
|
|
6858
|
+
let T = n.db.select(x).from(b.from), E = [];
|
|
6859
|
+
b.where && E.push(b.where), E.push(...r.queryBuilder.buildWhereConditions(o, t, n)), E.length > 0 && (T = T.where(E.length === 1 ? E[0] : F(...E))), S.length > 0 && (T = T.groupBy(...S));
|
|
6860
|
+
let D = n.db.$with(l).as(T), k = {};
|
|
6861
|
+
for (let e of t.dimensions ?? []) k[e] = O`${O.identifier(c)}.${O.identifier(e)}`.as(e);
|
|
6862
|
+
for (let e of t.timeDimensions ?? []) k[e.dimension] = O`${O.identifier(c)}.${O.identifier(e.dimension)}`.as(e.dimension);
|
|
6862
6863
|
for (let e of h) {
|
|
6863
6864
|
let [, t] = e.split("."), n = o.measures?.[t];
|
|
6864
|
-
|
|
6865
|
+
k[e] = this.buildKeysOuterAggregation(n?.type ?? "sum", l, t, e);
|
|
6865
6866
|
}
|
|
6866
6867
|
for (let e of p) {
|
|
6867
6868
|
let [t, n] = e.split("."), r = a.get(t)?.measures?.[n], i = `__reg__${e.replace(".", "__")}`;
|
|
6868
|
-
|
|
6869
|
+
k[e] = this.buildKeysOuterAggregation(r?.type ?? "sum", c, i, e);
|
|
6869
6870
|
}
|
|
6870
|
-
let
|
|
6871
|
-
|
|
6872
|
-
let
|
|
6873
|
-
|
|
6874
|
-
let
|
|
6875
|
-
return
|
|
6871
|
+
let A = n.db.with(y, D).select(k).from(O`${O.identifier(c)}`), j = f.map((e, t) => N(O`${O.identifier(c)}.${O.identifier(e)}`, O`${O.identifier(l)}.${O.identifier(s[t])}`)), M = j.length === 1 ? j[0] : F(...j);
|
|
6872
|
+
A = A.leftJoin(O`${O.identifier(l)}`, M);
|
|
6873
|
+
let P = [...(t.dimensions ?? []).map((e) => O`${O.identifier(c)}.${O.identifier(e)}`), ...(t.timeDimensions ?? []).map((e) => O`${O.identifier(c)}.${O.identifier(e.dimension)}`)];
|
|
6874
|
+
P.length > 0 && (A = A.groupBy(...P));
|
|
6875
|
+
let I = r.queryBuilder.buildOrderBy(t, Object.keys(k));
|
|
6876
|
+
return I.length > 0 && (A = A.orderBy(...I)), A = r.queryBuilder.applyLimitAndOffset(A, t), A;
|
|
6876
6877
|
}
|
|
6877
6878
|
tryBuildMultiFactMergeQuery(e, t, n, r) {
|
|
6878
6879
|
let i = e.multiFactMerge;
|
|
@@ -6883,37 +6884,37 @@ var Jt = class {
|
|
|
6883
6884
|
});
|
|
6884
6885
|
if (s) return this.buildMultiFactUnionKeysFallbackQuery(t, n, r, i, l, o);
|
|
6885
6886
|
let u = i.groups[0].alias, d = i.groups.map((e) => e.alias), f = {};
|
|
6886
|
-
if (o.length > 0) for (let e of o) f[e] =
|
|
6887
|
-
for (let e of i.groups) for (let t of e.measures) f[t] =
|
|
6888
|
-
let p = n.db.with(...l).select(f).from(
|
|
6889
|
-
for (let e of o) m.set(e,
|
|
6887
|
+
if (o.length > 0) for (let e of o) f[e] = O`${this.coalesceQualifiedColumn(d, e)}`.as(e);
|
|
6888
|
+
for (let e of i.groups) for (let t of e.measures) f[t] = O`coalesce(${O`${O.identifier(e.alias)}.${O.identifier(t)}`}, 0)`.as(t);
|
|
6889
|
+
let p = n.db.with(...l).select(f).from(O`${O.identifier(u)}`), m = /* @__PURE__ */ new Map();
|
|
6890
|
+
for (let e of o) m.set(e, O`${O.identifier(u)}.${O.identifier(e)}`);
|
|
6890
6891
|
for (let e = 1; e < i.groups.length; e++) {
|
|
6891
6892
|
let t = i.groups[e].alias, n;
|
|
6892
|
-
if (o.length === 0) n =
|
|
6893
|
+
if (o.length === 0) n = O`1 = 1`;
|
|
6893
6894
|
else {
|
|
6894
|
-
let e = o.map((e) =>
|
|
6895
|
-
n = e.length === 1 ? e[0] :
|
|
6895
|
+
let e = o.map((e) => N(m.get(e), O`${O.identifier(t)}.${O.identifier(e)}`));
|
|
6896
|
+
n = e.length === 1 ? e[0] : F(...e);
|
|
6896
6897
|
}
|
|
6897
|
-
if (p = this.applyJoinByType(p, c,
|
|
6898
|
+
if (p = this.applyJoinByType(p, c, O`${O.identifier(t)}`, n), o.length > 0 && c === "full") for (let e of o) m.set(e, O`coalesce(${m.get(e)}, ${O`${O.identifier(t)}.${O.identifier(e)}`})`);
|
|
6898
6899
|
}
|
|
6899
6900
|
let h = r.queryBuilder.buildOrderBy(t, Object.keys(f));
|
|
6900
6901
|
return h.length > 0 && (p = p.orderBy(...h)), r.queryBuilder.applyLimitAndOffset(p, t);
|
|
6901
6902
|
}
|
|
6902
6903
|
buildMultiFactUnionKeysFallbackQuery(e, t, n, r, i, a) {
|
|
6903
|
-
let o = "mf_all_keys", s = r.groups.map((e) =>
|
|
6904
|
-
for (let e of a) u[e] =
|
|
6905
|
-
for (let e of r.groups) for (let t of e.measures) u[t] =
|
|
6906
|
-
let d = t.db.with(...i, l).select(u).from(
|
|
6904
|
+
let o = "mf_all_keys", s = r.groups.map((e) => O`select ${this.buildSharedKeySelection(e.alias, a)} from ${O.identifier(e.alias)}`), c = O`${O.join(s, O` union `)}`, l = t.db.$with(o).as(c), u = {};
|
|
6905
|
+
for (let e of a) u[e] = O`${O.identifier(o)}.${O.identifier(e)}`.as(e);
|
|
6906
|
+
for (let e of r.groups) for (let t of e.measures) u[t] = O`coalesce(${O`${O.identifier(e.alias)}.${O.identifier(t)}`}, 0)`.as(t);
|
|
6907
|
+
let d = t.db.with(...i, l).select(u).from(O`${O.identifier(o)}`);
|
|
6907
6908
|
for (let e of r.groups) {
|
|
6908
|
-
let t = a.map((t) =>
|
|
6909
|
-
d = d.leftJoin(
|
|
6909
|
+
let t = a.map((t) => N(O`${O.identifier(o)}.${O.identifier(t)}`, O`${O.identifier(e.alias)}.${O.identifier(t)}`)), n = t.length === 1 ? t[0] : F(...t);
|
|
6910
|
+
d = d.leftJoin(O`${O.identifier(e.alias)}`, n);
|
|
6910
6911
|
}
|
|
6911
6912
|
let f = n.queryBuilder.buildOrderBy(e, Object.keys(u));
|
|
6912
6913
|
return f.length > 0 && (d = d.orderBy(...f)), n.queryBuilder.applyLimitAndOffset(d, e);
|
|
6913
6914
|
}
|
|
6914
6915
|
buildSharedKeySelection(e, t) {
|
|
6915
|
-
let n = t.map((t) =>
|
|
6916
|
-
return
|
|
6916
|
+
let n = t.map((t) => O`${O.identifier(e)}.${O.identifier(t)} as ${O.identifier(t)}`);
|
|
6917
|
+
return O.join(n, O`, `);
|
|
6917
6918
|
}
|
|
6918
6919
|
selectRuntimeMergeStrategy(e, t) {
|
|
6919
6920
|
return !t || e === "innerJoin" ? "inner" : e === "leftJoin" ? "left" : this.supportsFullOuterJoin() ? "full" : "left";
|
|
@@ -6923,9 +6924,9 @@ var Jt = class {
|
|
|
6923
6924
|
return e === "postgres" || e === "duckdb";
|
|
6924
6925
|
}
|
|
6925
6926
|
coalesceQualifiedColumn(e, t) {
|
|
6926
|
-
if (e.length === 1) return
|
|
6927
|
-
let n = e.map((e) =>
|
|
6928
|
-
for (let e = 1; e < n.length; e++) r =
|
|
6927
|
+
if (e.length === 1) return O`${O.identifier(e[0])}.${O.identifier(t)}`;
|
|
6928
|
+
let n = e.map((e) => O`${O.identifier(e)}.${O.identifier(t)}`), r = n[0];
|
|
6929
|
+
for (let e = 1; e < n.length; e++) r = O`coalesce(${r}, ${n[e]})`;
|
|
6929
6930
|
return r;
|
|
6930
6931
|
}
|
|
6931
6932
|
canExecuteKeysDeduplication(e, t, n) {
|
|
@@ -6971,10 +6972,10 @@ var Jt = class {
|
|
|
6971
6972
|
}
|
|
6972
6973
|
buildKeysOuterAggregation(e, t, n, r) {
|
|
6973
6974
|
switch (e) {
|
|
6974
|
-
case "min": return
|
|
6975
|
-
case "max": return
|
|
6976
|
-
case "avg": return
|
|
6977
|
-
default: return
|
|
6975
|
+
case "min": return O`min(${O`${O.identifier(t)}.${O.identifier(n)}`})`.as(r);
|
|
6976
|
+
case "max": return O`max(${O`${O.identifier(t)}.${O.identifier(n)}`})`.as(r);
|
|
6977
|
+
case "avg": return O`sum(${O`${O.identifier(t)}.${O.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${O`${O.identifier(t)}.${O.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);
|
|
6978
|
+
default: return O`coalesce(sum(${O`${O.identifier(t)}.${O.identifier(n)}`}), 0)`.as(r);
|
|
6978
6979
|
}
|
|
6979
6980
|
}
|
|
6980
6981
|
applyJoinByType(e, t, n, r) {
|
|
@@ -6994,7 +6995,7 @@ function $(e, t) {
|
|
|
6994
6995
|
console.log(`\n[DC_DEBUG] ${e}`), console.log(n), r.length > 0 && console.log("params:", r), console.log();
|
|
6995
6996
|
} catch {}
|
|
6996
6997
|
}
|
|
6997
|
-
var
|
|
6998
|
+
var Xt = class {
|
|
6998
6999
|
queryBuilder;
|
|
6999
7000
|
drizzlePlanBuilder;
|
|
7000
7001
|
databaseAdapter;
|
|
@@ -7008,9 +7009,9 @@ var Yt = class {
|
|
|
7008
7009
|
rlsSetup;
|
|
7009
7010
|
constructor(e, t, n) {
|
|
7010
7011
|
if (this.dbExecutor = e, this.databaseAdapter = e.databaseAdapter, !this.databaseAdapter) throw Error("DatabaseExecutor must have a databaseAdapter property");
|
|
7011
|
-
this.queryBuilder = new
|
|
7012
|
-
let r = new
|
|
7013
|
-
this.drizzlePlanBuilder = new
|
|
7012
|
+
this.queryBuilder = new vt(this.databaseAdapter);
|
|
7013
|
+
let r = new bt(), i = new xt(this.queryBuilder);
|
|
7014
|
+
this.drizzlePlanBuilder = new Yt(this.queryBuilder, i, this.databaseAdapter), this.comparisonQueryBuilder = new At(this.databaseAdapter), this.funnelQueryBuilder = new jt(this.databaseAdapter), this.flowQueryBuilder = new Mt(this.databaseAdapter), this.retentionQueryBuilder = new Lt(this.databaseAdapter), this.logicalPlanBuilder = new Rt(r), this.planOptimiser = new zt(), this.cacheConfig = t, this.rlsSetup = n;
|
|
7014
7015
|
}
|
|
7015
7016
|
async withRLSContext(e, t) {
|
|
7016
7017
|
if (!this.rlsSetup) return t();
|
|
@@ -7028,7 +7029,7 @@ var Yt = class {
|
|
|
7028
7029
|
let i = this.resolveQueryMode(t);
|
|
7029
7030
|
this.validateQueryForMode(i, e, t);
|
|
7030
7031
|
let a;
|
|
7031
|
-
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) if (a =
|
|
7032
|
+
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) if (a = ot(t, n, this.cacheConfig), r?.skipCache) this.cacheConfig.onCacheEvent?.({
|
|
7032
7033
|
type: "miss",
|
|
7033
7034
|
key: a,
|
|
7034
7035
|
durationMs: 0
|
|
@@ -7214,7 +7215,7 @@ var Yt = class {
|
|
|
7214
7215
|
$("query", s);
|
|
7215
7216
|
let c = this.queryBuilder.collectNumericFields(e, t), l = await this.dbExecutor.execute(s, c);
|
|
7216
7217
|
return {
|
|
7217
|
-
data:
|
|
7218
|
+
data: kt(Array.isArray(l) ? l.map((e) => {
|
|
7218
7219
|
let n = { ...e };
|
|
7219
7220
|
if (t.timeDimensions) {
|
|
7220
7221
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -7341,7 +7342,7 @@ var Yt = class {
|
|
|
7341
7342
|
}
|
|
7342
7343
|
validateQueryForMode(e, t, n) {
|
|
7343
7344
|
let r = () => {
|
|
7344
|
-
let e =
|
|
7345
|
+
let e = $t(t, n);
|
|
7345
7346
|
if (!e.isValid) throw Error(`Query validation failed: ${e.errors.join(", ")}`);
|
|
7346
7347
|
};
|
|
7347
7348
|
({
|
|
@@ -7359,7 +7360,7 @@ var Yt = class {
|
|
|
7359
7360
|
let e = this.retentionQueryBuilder.validateConfig(n.retention, t);
|
|
7360
7361
|
if (!e.isValid) throw Error(`Retention validation failed: ${e.errors.join(", ")}`);
|
|
7361
7362
|
}
|
|
7362
|
-
})[
|
|
7363
|
+
})[nt(e)]();
|
|
7363
7364
|
}
|
|
7364
7365
|
async executeQueryByModeWithCache(e, t, n, r, i) {
|
|
7365
7366
|
return {
|
|
@@ -7368,7 +7369,7 @@ var Yt = class {
|
|
|
7368
7369
|
funnel: () => this.executeFunnelQueryWithCache(t, n, r, i),
|
|
7369
7370
|
flow: () => this.executeFlowQueryWithCache(t, n, r, i),
|
|
7370
7371
|
retention: () => this.executeRetentionQueryWithCache(t, n, r, i)
|
|
7371
|
-
}[
|
|
7372
|
+
}[nt(e)]();
|
|
7372
7373
|
}
|
|
7373
7374
|
async executeRegularQueryWithCache(e, t, n, r) {
|
|
7374
7375
|
let i = new K(), a = this.createQueryContext(n, i, t);
|
|
@@ -7378,7 +7379,7 @@ var Yt = class {
|
|
|
7378
7379
|
let c = this.drizzlePlanBuilder.build(s, t, a);
|
|
7379
7380
|
$("query", c);
|
|
7380
7381
|
let l = this.queryBuilder.collectNumericFields(e, t), u = await this.dbExecutor.execute(c, l), d = {
|
|
7381
|
-
data:
|
|
7382
|
+
data: kt(Array.isArray(u) ? u.map((e) => {
|
|
7382
7383
|
let n = { ...e };
|
|
7383
7384
|
if (t.timeDimensions) {
|
|
7384
7385
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -7416,7 +7417,7 @@ var Yt = class {
|
|
|
7416
7417
|
funnel: () => this.dryRunFunnel(t, n, r),
|
|
7417
7418
|
flow: () => this.dryRunFlow(t, n, r),
|
|
7418
7419
|
retention: () => this.dryRunRetention(t, n, r)
|
|
7419
|
-
}[
|
|
7420
|
+
}[nt(e)]();
|
|
7420
7421
|
}
|
|
7421
7422
|
async generateComparisonSQL(e, t, n) {
|
|
7422
7423
|
let r = this.buildComparisonExecutionPlan(t).periodQueries[0];
|
|
@@ -7468,7 +7469,7 @@ var Yt = class {
|
|
|
7468
7469
|
}
|
|
7469
7470
|
preloadFilterCache(e, t, n, r) {
|
|
7470
7471
|
if (e.filters && e.filters.length > 0) {
|
|
7471
|
-
let i =
|
|
7472
|
+
let i = at(e.filters);
|
|
7472
7473
|
for (let e of i) {
|
|
7473
7474
|
let i = G(e);
|
|
7474
7475
|
if (t.has(i)) continue;
|
|
@@ -7486,7 +7487,7 @@ var Yt = class {
|
|
|
7486
7487
|
}
|
|
7487
7488
|
if (e.timeDimensions) {
|
|
7488
7489
|
for (let i of e.timeDimensions) if (i.dateRange) {
|
|
7489
|
-
let e =
|
|
7490
|
+
let e = it(i.dimension, i.dateRange);
|
|
7490
7491
|
if (t.has(e)) continue;
|
|
7491
7492
|
let [a, o] = i.dimension.split("."), s = n.get(a);
|
|
7492
7493
|
if (!s) continue;
|
|
@@ -7497,7 +7498,7 @@ var Yt = class {
|
|
|
7497
7498
|
}
|
|
7498
7499
|
}
|
|
7499
7500
|
}
|
|
7500
|
-
},
|
|
7501
|
+
}, Zt = class t {
|
|
7501
7502
|
cubes = /* @__PURE__ */ new Map();
|
|
7502
7503
|
metadataCache;
|
|
7503
7504
|
cacheConfig;
|
|
@@ -7522,10 +7523,10 @@ var Yt = class {
|
|
|
7522
7523
|
}
|
|
7523
7524
|
createDbExecutor() {
|
|
7524
7525
|
if (!this.db) throw Error("Database executor not configured");
|
|
7525
|
-
return
|
|
7526
|
+
return Qe(this.db, this.schema, this.engineType);
|
|
7526
7527
|
}
|
|
7527
7528
|
createQueryExecutor(e = !1) {
|
|
7528
|
-
return new
|
|
7529
|
+
return new Xt(this.createDbExecutor(), e ? this.cacheConfig : void 0, this.rlsSetup);
|
|
7529
7530
|
}
|
|
7530
7531
|
formatSqlResult(t) {
|
|
7531
7532
|
let n = this.getEngineType() ?? "postgres";
|
|
@@ -7549,7 +7550,7 @@ var Yt = class {
|
|
|
7549
7550
|
t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);
|
|
7550
7551
|
continue;
|
|
7551
7552
|
}
|
|
7552
|
-
let i =
|
|
7553
|
+
let i = ht(r.calculatedSql);
|
|
7553
7554
|
if (!i.isValid) {
|
|
7554
7555
|
t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(", ")}`);
|
|
7555
7556
|
continue;
|
|
@@ -7719,18 +7720,18 @@ var Yt = class {
|
|
|
7719
7720
|
return Array.from(this.cubes.keys());
|
|
7720
7721
|
}
|
|
7721
7722
|
validateQuery(e) {
|
|
7722
|
-
return
|
|
7723
|
+
return $t(this.cubes, e);
|
|
7723
7724
|
}
|
|
7724
7725
|
analyzeQuery(e, t) {
|
|
7725
7726
|
return this.createQueryExecutor(!0).analyzeQuery(this.cubes, e, t);
|
|
7726
7727
|
}
|
|
7727
7728
|
};
|
|
7728
|
-
function
|
|
7729
|
+
function Qt(e) {
|
|
7729
7730
|
let t = [];
|
|
7730
7731
|
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;
|
|
7731
7732
|
}
|
|
7732
|
-
function
|
|
7733
|
-
let n = [], r =
|
|
7733
|
+
function $t(e, t) {
|
|
7734
|
+
let n = [], r = Qt(t);
|
|
7734
7735
|
if (r.length > 1) return n.push(`Query contains multiple query modes: ${r.join(", ")}`), {
|
|
7735
7736
|
isValid: !1,
|
|
7736
7737
|
errors: n
|
|
@@ -7751,7 +7752,7 @@ function Qt(e, t) {
|
|
|
7751
7752
|
}
|
|
7752
7753
|
},
|
|
7753
7754
|
retention: () => {
|
|
7754
|
-
let r = t.retention, i =
|
|
7755
|
+
let r = t.retention, i = tn(r.timeDimension);
|
|
7755
7756
|
i && !e.has(i) && n.push(`Retention cube not found: ${i}`);
|
|
7756
7757
|
let a = r.bindingKey;
|
|
7757
7758
|
if (typeof a == "string") {
|
|
@@ -7817,7 +7818,7 @@ function Qt(e, t) {
|
|
|
7817
7818
|
}
|
|
7818
7819
|
o.dimensions[i] || n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`);
|
|
7819
7820
|
}
|
|
7820
|
-
if (t.filters) for (let r of t.filters)
|
|
7821
|
+
if (t.filters) for (let r of t.filters) en(r, e, n, a);
|
|
7821
7822
|
if (a.size === 0 && n.push("Query must reference at least one cube through measures, dimensions, or filters"), t.ungrouped) {
|
|
7822
7823
|
t.dimensions && t.dimensions.length > 0 || t.timeDimensions && t.timeDimensions.length > 0 || n.push("Ungrouped queries require at least one dimension or time dimension"), t.funnel && n.push("Ungrouped queries are incompatible with funnel analysis"), t.flow && n.push("Ungrouped queries are incompatible with flow analysis"), t.retention && n.push("Ungrouped queries are incompatible with retention analysis"), t.timeDimensions?.some((e) => e.compareDateRange && e.compareDateRange.length > 0) && n.push("Ungrouped queries are incompatible with compareDateRange"), t.timeDimensions?.some((e) => e.fillMissingDates === !0) && n.push("Ungrouped queries are incompatible with fillMissingDates");
|
|
7823
7824
|
let r = new Set([
|
|
@@ -7872,10 +7873,10 @@ function Qt(e, t) {
|
|
|
7872
7873
|
errors: n
|
|
7873
7874
|
};
|
|
7874
7875
|
}
|
|
7875
|
-
function
|
|
7876
|
+
function en(e, t, n, r) {
|
|
7876
7877
|
if ("and" in e || "or" in e) {
|
|
7877
7878
|
let i = e.and || e.or || [];
|
|
7878
|
-
for (let e of i)
|
|
7879
|
+
for (let e of i) en(e, t, n, r);
|
|
7879
7880
|
return;
|
|
7880
7881
|
}
|
|
7881
7882
|
if (!("member" in e)) {
|
|
@@ -7898,7 +7899,7 @@ function $t(e, t, n, r) {
|
|
|
7898
7899
|
n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`);
|
|
7899
7900
|
}
|
|
7900
7901
|
}
|
|
7901
|
-
function
|
|
7902
|
+
function tn(e) {
|
|
7902
7903
|
if (typeof e == "string") {
|
|
7903
7904
|
let [t] = e.split(".");
|
|
7904
7905
|
return t || null;
|
|
@@ -7906,4 +7907,4 @@ function en(e) {
|
|
|
7906
7907
|
return e.cube;
|
|
7907
7908
|
}
|
|
7908
7909
|
//#endregion
|
|
7909
|
-
export {
|
|
7910
|
+
export { Zt as t };
|