drizzle-cube 0.4.52 → 0.4.53
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-CRgLzmSn.cjs +198 -0
- package/dist/adapters/{compiler-D_o2IzHn.js → compiler-S6KHiOY6.js} +917 -770
- 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 +31 -31
- package/dist/server/index.js +1280 -1133
- package/package.json +1 -1
- package/dist/adapters/compiler-Bbsijr3W.cjs +0 -198
|
@@ -121,7 +121,7 @@ var x = class {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
static [t] = "SQL";
|
|
124
|
-
decoder =
|
|
124
|
+
decoder = w;
|
|
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, A)) {
|
|
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, E)) {
|
|
193
|
+
if (n(t.value, O)) 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, O) ? {
|
|
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 ee(e) {
|
|
282
282
|
return typeof e == "object" && !!e && "mapToDriverValue" in e && typeof e.mapToDriverValue == "function";
|
|
283
283
|
}
|
|
284
|
-
var
|
|
284
|
+
var w = { mapFromDriverValue: (e) => e }, T = { mapToDriverValue: (e) => e };
|
|
285
285
|
({
|
|
286
|
-
...
|
|
287
|
-
...
|
|
286
|
+
...w,
|
|
287
|
+
...T
|
|
288
288
|
});
|
|
289
|
-
var
|
|
290
|
-
constructor(e, t =
|
|
289
|
+
var E = class {
|
|
290
|
+
constructor(e, t = T) {
|
|
291
291
|
this.value = e, this.encoder = t;
|
|
292
292
|
}
|
|
293
293
|
static [t] = "Param";
|
|
@@ -296,7 +296,7 @@ var D = class {
|
|
|
296
296
|
return new S([this]);
|
|
297
297
|
}
|
|
298
298
|
};
|
|
299
|
-
function
|
|
299
|
+
function D(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 O(e, ...t) {
|
|
|
326
326
|
}
|
|
327
327
|
e.identifier = a;
|
|
328
328
|
function o(e) {
|
|
329
|
-
return new
|
|
329
|
+
return new O(e);
|
|
330
330
|
}
|
|
331
331
|
e.placeholder = o;
|
|
332
332
|
function s(e, t) {
|
|
333
|
-
return new
|
|
333
|
+
return new E(e, t);
|
|
334
334
|
}
|
|
335
335
|
e.param = s;
|
|
336
|
-
})(
|
|
336
|
+
})(D ||= {}), ((e) => {
|
|
337
337
|
class n {
|
|
338
338
|
constructor(e, t) {
|
|
339
339
|
this.sql = e, this.fieldAlias = t;
|
|
@@ -349,7 +349,7 @@ function O(e, ...t) {
|
|
|
349
349
|
}
|
|
350
350
|
e.Aliased = n;
|
|
351
351
|
})(S ||= {});
|
|
352
|
-
var
|
|
352
|
+
var O = class {
|
|
353
353
|
constructor(e) {
|
|
354
354
|
this.name = e;
|
|
355
355
|
}
|
|
@@ -357,10 +357,10 @@ var k = class {
|
|
|
357
357
|
getSQL() {
|
|
358
358
|
return new S([this]);
|
|
359
359
|
}
|
|
360
|
-
},
|
|
360
|
+
}, k = Symbol.for("drizzle:IsDrizzleView"), A = class {
|
|
361
361
|
static [t] = "View";
|
|
362
362
|
[l];
|
|
363
|
-
[
|
|
363
|
+
[k] = !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 j(e, t) {
|
|
389
|
+
return ee(t) && !y(e) && !n(e, E) && !n(e, O) && !n(e, r) && !n(e, v) && !n(e, A) ? new E(e, t) : e;
|
|
390
390
|
}
|
|
391
|
-
var
|
|
392
|
-
function
|
|
391
|
+
var M = (e, t) => D`${e} = ${j(t, e)}`, N = (e, t) => D`${e} <> ${j(t, e)}`;
|
|
392
|
+
function P(...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
|
+
D.join(t, new x(" and ")),
|
|
397
397
|
new x(")")
|
|
398
398
|
]);
|
|
399
399
|
}
|
|
400
|
-
function
|
|
400
|
+
function F(...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
|
+
D.join(t, new x(" or ")),
|
|
405
405
|
new x(")")
|
|
406
406
|
]);
|
|
407
407
|
}
|
|
408
|
-
var
|
|
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
|
-
}
|
|
408
|
+
var te = (e, t) => D`${e} > ${j(t, e)}`, I = (e, t) => D`${e} >= ${j(t, e)}`, ne = (e, t) => D`${e} < ${j(t, e)}`, L = (e, t) => D`${e} <= ${j(t, e)}`;
|
|
412
409
|
function re(e, t) {
|
|
413
|
-
return Array.isArray(t) ? t.length === 0 ?
|
|
410
|
+
return Array.isArray(t) ? t.length === 0 ? D`false` : D`${e} in ${t.map((t) => j(t, e))}` : D`${e} in ${j(t, e)}`;
|
|
414
411
|
}
|
|
415
|
-
function ie(e) {
|
|
416
|
-
return
|
|
412
|
+
function ie(e, t) {
|
|
413
|
+
return Array.isArray(t) ? t.length === 0 ? D`true` : D`${e} not in ${t.map((t) => j(t, e))}` : D`${e} not in ${j(t, e)}`;
|
|
417
414
|
}
|
|
418
415
|
function ae(e) {
|
|
419
|
-
return
|
|
416
|
+
return D`${e} is null`;
|
|
420
417
|
}
|
|
421
|
-
function oe(e
|
|
418
|
+
function oe(e) {
|
|
419
|
+
return D`${e} is not null`;
|
|
420
|
+
}
|
|
421
|
+
function se(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 D`${e} @> ${D`${j(t, e)}`}`;
|
|
425
425
|
}
|
|
426
|
-
return
|
|
426
|
+
return D`${e} @> ${j(t, e)}`;
|
|
427
427
|
}
|
|
428
|
-
function
|
|
428
|
+
function ce(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 D`${e} <@ ${D`${j(t, e)}`}`;
|
|
432
432
|
}
|
|
433
|
-
return
|
|
433
|
+
return D`${e} <@ ${j(t, e)}`;
|
|
434
434
|
}
|
|
435
|
-
function
|
|
435
|
+
function le(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 D`${e} && ${D`${j(t, e)}`}`;
|
|
439
439
|
}
|
|
440
|
-
return
|
|
440
|
+
return D`${e} && ${j(t, e)}`;
|
|
441
441
|
}
|
|
442
442
|
//#endregion
|
|
443
443
|
//#region node_modules/drizzle-orm/sql/expressions/select.js
|
|
444
|
-
function le(e) {
|
|
445
|
-
return O`${e} asc`;
|
|
446
|
-
}
|
|
447
444
|
function ue(e) {
|
|
448
|
-
return
|
|
445
|
+
return D`${e} asc`;
|
|
449
446
|
}
|
|
450
|
-
//#endregion
|
|
451
|
-
//#region node_modules/drizzle-orm/sql/functions/aggregate.js
|
|
452
447
|
function de(e) {
|
|
453
|
-
return
|
|
448
|
+
return D`${e} desc`;
|
|
454
449
|
}
|
|
450
|
+
//#endregion
|
|
451
|
+
//#region node_modules/drizzle-orm/sql/functions/aggregate.js
|
|
455
452
|
function fe(e) {
|
|
456
|
-
return
|
|
453
|
+
return D`count(${e || D.raw("*")})`.mapWith(Number);
|
|
454
|
+
}
|
|
455
|
+
function pe(e) {
|
|
456
|
+
return D`count(distinct ${e})`.mapWith(Number);
|
|
457
|
+
}
|
|
458
|
+
function R(e) {
|
|
459
|
+
return D`sum(${e})`.mapWith(String);
|
|
457
460
|
}
|
|
458
461
|
function z(e) {
|
|
459
|
-
return
|
|
462
|
+
return D`max(${e})`.mapWith(n(e, r) ? e : String);
|
|
460
463
|
}
|
|
461
464
|
function B(e) {
|
|
462
|
-
return
|
|
463
|
-
}
|
|
464
|
-
function pe(e) {
|
|
465
|
-
return O`min(${e})`.mapWith(n(e, r) ? e : String);
|
|
465
|
+
return D`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 D`INTERVAL '${D.raw(r)}'`;
|
|
510
510
|
}
|
|
511
511
|
buildTimeDifferenceSeconds(e, t) {
|
|
512
|
-
return
|
|
512
|
+
return D`EXTRACT(EPOCH FROM (${e} - ${t}))`;
|
|
513
513
|
}
|
|
514
514
|
buildDateAddInterval(e, t) {
|
|
515
|
-
return
|
|
515
|
+
return D`(${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 ? D`COUNT(*) FILTER (WHERE ${n})` : D`${D.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 D`(${t}::date - ${e}::date)`;
|
|
524
|
+
case "week": return D`FLOOR((${t}::date - ${e}::date) / 7)`;
|
|
525
|
+
case "month": return D`(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 D`(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 D`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
535
|
+
case "quarter": return D`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
536
|
+
case "month": return D`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
537
|
+
case "week": return D`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
538
|
+
case "day": return D`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
539
|
+
case "hour": return D`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
540
|
+
case "minute": return D`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
541
|
+
case "second": return D`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 D`${e} ILIKE ${`%${n}%`}`;
|
|
548
|
+
case "notContains": return D`${e} NOT ILIKE ${`%${n}%`}`;
|
|
549
|
+
case "startsWith": return D`${e} ILIKE ${`${n}%`}`;
|
|
550
|
+
case "endsWith": return D`${e} ILIKE ${`%${n}`}`;
|
|
551
|
+
case "like": return D`${e} LIKE ${n}`;
|
|
552
|
+
case "notLike": return D`${e} NOT LIKE ${n}`;
|
|
553
|
+
case "ilike": return D`${e} ILIKE ${n}`;
|
|
554
|
+
case "regex": return D`${e} ~* ${n}`;
|
|
555
|
+
case "notRegex": return D`${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 D`${e}::timestamp`;
|
|
562
|
+
case "decimal": return D`${e}::decimal`;
|
|
563
|
+
case "integer": return D`${e}::integer`;
|
|
564
564
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
565
565
|
}
|
|
566
566
|
}
|
|
567
567
|
buildAvg(e) {
|
|
568
|
-
return
|
|
568
|
+
return D`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) => D`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => D`${e} ${t}`);
|
|
572
|
+
return t === void 0 ? D`CASE ${n} END` : D`CASE ${n} ELSE ${t} END`;
|
|
573
573
|
}
|
|
574
574
|
buildBooleanLiteral(e) {
|
|
575
|
-
return e ?
|
|
575
|
+
return e ? D`TRUE` : D`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 D`COALESCE(${D.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 D`COALESCE(${D.raw(n)}(${e}), 0)`;
|
|
609
609
|
}
|
|
610
610
|
buildPercentile(e, t) {
|
|
611
|
-
return
|
|
611
|
+
return D`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 ? D`PARTITION BY ${D.join(n, D`, `)}` : D``, o = r && r.length > 0 ? D`ORDER BY ${D.join(r.map((e) => e.direction === "desc" ? D`${e.field} DESC` : D`${e.field} ASC`), D`, `)}` : D``, s = D``;
|
|
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 = D`${D.raw(r)} BETWEEN ${D.raw(a)} AND ${D.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 = D`OVER (${c.length > 0 ? D.join(c, D` `) : D``})`;
|
|
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 D`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
624
|
+
case "lead": return D`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
625
|
+
case "rank": return D`RANK() ${l}`;
|
|
626
|
+
case "denseRank": return D`DENSE_RANK() ${l}`;
|
|
627
|
+
case "rowNumber": return D`ROW_NUMBER() ${l}`;
|
|
628
|
+
case "ntile": return D`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
629
|
+
case "firstValue": return D`FIRST_VALUE(${t}) ${l}`;
|
|
630
|
+
case "lastValue": return D`LAST_VALUE(${t}) ${l}`;
|
|
631
|
+
case "movingAvg": return D`AVG(${t}) ${l}`;
|
|
632
|
+
case "movingSum": return D`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`), D`${this.durationToSeconds(e)}`;
|
|
646
646
|
}
|
|
647
647
|
buildTimeDifferenceSeconds(e, t) {
|
|
648
|
-
return
|
|
648
|
+
return D`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 = D`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`), n.months && (r = D`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`), n.days && (r = D`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`), n.hours && (r = D`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`), n.minutes && (r = D`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`), n.seconds && (r = D`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 ? D`COUNT(CASE WHEN ${n} THEN 1 END)` : D`${D.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 D`TIMESTAMPDIFF(${D.raw(r)}, ${e}, ${t})`;
|
|
661
661
|
}
|
|
662
662
|
buildPeriodSeriesSubquery(e) {
|
|
663
|
-
return
|
|
663
|
+
return D`(
|
|
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 D`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;
|
|
685
|
+
case "week": return D`DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY)`;
|
|
686
686
|
default: {
|
|
687
687
|
let r = n[e];
|
|
688
|
-
return r ?
|
|
688
|
+
return r ? D`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 D`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
695
|
+
case "notContains": return D`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
696
|
+
case "startsWith": return D`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
697
|
+
case "endsWith": return D`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
698
|
+
case "like": return D`${e} LIKE ${n}`;
|
|
699
|
+
case "notLike": return D`${e} NOT LIKE ${n}`;
|
|
700
|
+
case "ilike": return D`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
701
|
+
case "regex": return D`${e} REGEXP ${n}`;
|
|
702
|
+
case "notRegex": return D`${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 D`CAST(${e} AS DATETIME)`;
|
|
709
|
+
case "decimal": return D`CAST(${e} AS DECIMAL(10,2))`;
|
|
710
|
+
case "integer": return D`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 D`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) => D`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => D`${e} ${t}`);
|
|
719
|
+
return t === void 0 ? D`CASE ${n} END` : D`CASE ${n} ELSE ${t} END`;
|
|
720
720
|
}
|
|
721
721
|
buildBooleanLiteral(e) {
|
|
722
|
-
return e ?
|
|
722
|
+
return e ? D`TRUE` : D`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 D`IFNULL(${D.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 D`IFNULL(${D.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 ? D`PARTITION BY ${D.join(n, D`, `)}` : D``, o = r && r.length > 0 ? D`ORDER BY ${D.join(r.map((e) => e.direction === "desc" ? D`${e.field} DESC` : D`${e.field} ASC`), D`, `)}` : D``, s = D``;
|
|
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 = D`${D.raw(r)} BETWEEN ${D.raw(a)} AND ${D.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 = D`OVER (${c.length > 0 ? D.join(c, D` `) : D``})`;
|
|
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 D`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
771
|
+
case "lead": return D`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
772
|
+
case "rank": return D`RANK() ${l}`;
|
|
773
|
+
case "denseRank": return D`DENSE_RANK() ${l}`;
|
|
774
|
+
case "rowNumber": return D`ROW_NUMBER() ${l}`;
|
|
775
|
+
case "ntile": return D`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
776
|
+
case "firstValue": return D`FIRST_VALUE(${t}) ${l}`;
|
|
777
|
+
case "lastValue": return D`LAST_VALUE(${t}) ${l}`;
|
|
778
|
+
case "movingAvg": return D`AVG(${t}) ${l}`;
|
|
779
|
+
case "movingSum": return D`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 D`${this.durationToSeconds(e)}`;
|
|
792
792
|
}
|
|
793
793
|
buildTimeDifferenceSeconds(e, t) {
|
|
794
|
-
return
|
|
794
|
+
return D`(${e} - ${t})`;
|
|
795
795
|
}
|
|
796
796
|
buildDateAddInterval(e, t) {
|
|
797
|
-
return
|
|
797
|
+
return D`(${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 ? D`COUNT(CASE WHEN ${n} THEN 1 END)` : D`${D.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 D`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;
|
|
806
|
+
case "week": return D`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;
|
|
807
|
+
case "month": return D`((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 D`(
|
|
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 D`datetime(${t}, 'unixepoch', 'start of year')`;
|
|
824
824
|
case "quarter": {
|
|
825
|
-
let e =
|
|
826
|
-
return
|
|
825
|
+
let e = D`datetime(${t}, 'unixepoch')`;
|
|
826
|
+
return D`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 D`datetime(${t}, 'unixepoch', 'start of month')`;
|
|
830
|
+
case "week": return D`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;
|
|
831
|
+
case "day": return D`datetime(${t}, 'unixepoch', 'start of day')`;
|
|
832
|
+
case "hour": return D`datetime(strftime('%Y-%m-%d %H:00:00', ${D`datetime(${t}, 'unixepoch')`}))`;
|
|
833
|
+
case "minute": return D`datetime(strftime('%Y-%m-%d %H:%M:00', ${D`datetime(${t}, 'unixepoch')`}))`;
|
|
834
|
+
case "second": return D`datetime(strftime('%Y-%m-%d %H:%M:%S', ${D`datetime(${t}, 'unixepoch')`}))`;
|
|
835
|
+
default: return D`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 D`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;
|
|
841
|
+
case "notContains": return D`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;
|
|
842
|
+
case "startsWith": return D`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;
|
|
843
|
+
case "endsWith": return D`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;
|
|
844
|
+
case "like": return D`${e} LIKE ${n}`;
|
|
845
|
+
case "notLike": return D`${e} NOT LIKE ${n}`;
|
|
846
|
+
case "ilike": return D`LOWER(${e}) LIKE ${n.toLowerCase()}`;
|
|
847
|
+
case "regex": return D`${e} GLOB ${n}`;
|
|
848
|
+
case "notRegex": return D`${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 D`datetime(${e} / 1000, 'unixepoch')`;
|
|
855
|
+
case "decimal": return D`CAST(${e} AS REAL)`;
|
|
856
|
+
case "integer": return D`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 D`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) ? D`WHEN ${e.when} THEN ${D.raw("(")}${e.then}${D.raw(")")}` : D`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => D`${e} ${t}`);
|
|
865
|
+
return t === void 0 ? D`CASE ${n} END` : t && typeof t == "object" && (t.queryChunks || t._ || t.sql) ? D`CASE ${n} ELSE ${D.raw("(")}${t}${D.raw(")")} END` : D`CASE ${n} ELSE ${t} END`;
|
|
866
866
|
}
|
|
867
867
|
buildBooleanLiteral(e) {
|
|
868
|
-
return e ?
|
|
868
|
+
return e ? D`1` : D`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 ? D`PARTITION BY ${D.join(n, D`, `)}` : D``, o = r && r.length > 0 ? D`ORDER BY ${D.join(r.map((e) => e.direction === "desc" ? D`${e.field} DESC` : D`${e.field} ASC`), D`, `)}` : D``, s = D``;
|
|
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 = D`${D.raw(r)} BETWEEN ${D.raw(a)} AND ${D.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 = D`OVER (${c.length > 0 ? D.join(c, D` `) : D``})`;
|
|
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 D`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
923
|
+
case "lead": return D`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
924
|
+
case "rank": return D`RANK() ${l}`;
|
|
925
|
+
case "denseRank": return D`DENSE_RANK() ${l}`;
|
|
926
|
+
case "rowNumber": return D`ROW_NUMBER() ${l}`;
|
|
927
|
+
case "ntile": return D`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
928
|
+
case "firstValue": return D`FIRST_VALUE(${t}) ${l}`;
|
|
929
|
+
case "lastValue": return D`LAST_VALUE(${t}) ${l}`;
|
|
930
|
+
case "movingAvg": return D`AVG(${t}) ${l}`;
|
|
931
|
+
case "movingSum": return D`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 D`INTERVAL '${D.raw(r)}'`;
|
|
951
951
|
}
|
|
952
952
|
buildTimeDifferenceSeconds(e, t) {
|
|
953
|
-
return
|
|
953
|
+
return D`(EPOCH(${e}) - EPOCH(${t}))`;
|
|
954
954
|
}
|
|
955
955
|
buildDateAddInterval(e, t) {
|
|
956
|
-
return
|
|
956
|
+
return D`(${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 ? D`COUNT(*) FILTER (WHERE ${n})` : D`${D.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
961
961
|
}
|
|
962
962
|
buildDateDiffPeriods(e, t, n) {
|
|
963
|
-
return
|
|
963
|
+
return D`DATE_DIFF('${D.raw(n)}', ${e}::timestamp, ${t}::timestamp)`;
|
|
964
964
|
}
|
|
965
965
|
buildPeriodSeriesSubquery(e) {
|
|
966
|
-
return
|
|
966
|
+
return D`(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 D`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
971
|
+
case "quarter": return D`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
972
|
+
case "month": return D`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
973
|
+
case "week": return D`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
974
|
+
case "day": return D`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
975
|
+
case "hour": return D`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
976
|
+
case "minute": return D`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
977
|
+
case "second": return D`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 D`${e} ILIKE ${`%${n}%`}`;
|
|
984
|
+
case "notContains": return D`${e} NOT ILIKE ${`%${n}%`}`;
|
|
985
|
+
case "startsWith": return D`${e} ILIKE ${`${n}%`}`;
|
|
986
|
+
case "endsWith": return D`${e} ILIKE ${`%${n}`}`;
|
|
987
|
+
case "like": return D`${e} LIKE ${n}`;
|
|
988
|
+
case "notLike": return D`${e} NOT LIKE ${n}`;
|
|
989
|
+
case "ilike": return D`${e} ILIKE ${n}`;
|
|
990
|
+
case "regex": return D`regexp_matches(${e}, ${n})`;
|
|
991
|
+
case "notRegex": return D`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 D`${e}::timestamp`;
|
|
998
|
+
case "decimal": return D`${e}::decimal`;
|
|
999
|
+
case "integer": return D`${e}::integer`;
|
|
1000
1000
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1001
1001
|
}
|
|
1002
1002
|
}
|
|
1003
1003
|
buildAvg(e) {
|
|
1004
|
-
return
|
|
1004
|
+
return D`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) => D`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => D`${e} ${t}`);
|
|
1008
|
+
return t === void 0 ? D`CASE ${n} END` : D`CASE ${n} ELSE ${t} END`;
|
|
1009
1009
|
}
|
|
1010
1010
|
buildBooleanLiteral(e) {
|
|
1011
|
-
return e ?
|
|
1011
|
+
return e ? D`TRUE` : D`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 D`COALESCE(${D.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 D`COALESCE(${D.raw(n)}(${e}), 0)`;
|
|
1045
1045
|
}
|
|
1046
1046
|
buildPercentile(e, t) {
|
|
1047
|
-
return
|
|
1047
|
+
return D`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 ? D`PARTITION BY ${D.join(n, D`, `)}` : D``, o = r && r.length > 0 ? D`ORDER BY ${D.join(r.map((e) => e.direction === "desc" ? D`${e.field} DESC` : D`${e.field} ASC`), D`, `)}` : D``, s = D``;
|
|
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 = D`${D.raw(r)} BETWEEN ${D.raw(a)} AND ${D.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 = D`OVER (${c.length > 0 ? D.join(c, D` `) : D``})`;
|
|
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 D`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
1060
|
+
case "lead": return D`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
1061
|
+
case "rank": return D`RANK() ${l}`;
|
|
1062
|
+
case "denseRank": return D`DENSE_RANK() ${l}`;
|
|
1063
|
+
case "rowNumber": return D`ROW_NUMBER() ${l}`;
|
|
1064
|
+
case "ntile": return D`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1065
|
+
case "firstValue": return D`FIRST_VALUE(${t}) ${l}`;
|
|
1066
|
+
case "lastValue": return D`LAST_VALUE(${t}) ${l}`;
|
|
1067
|
+
case "movingAvg": return D`AVG(${t}) ${l}`;
|
|
1068
|
+
case "movingSum": return D`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 D`INTERVAL 0 SECOND`;
|
|
1082
|
+
if (n.length === 1) return D`INTERVAL ${D.raw(n[0])}`;
|
|
1083
1083
|
let r = n.map((e) => `INTERVAL ${e}`);
|
|
1084
|
-
return
|
|
1084
|
+
return D`(${D.raw(r.join(" + "))})`;
|
|
1085
1085
|
}
|
|
1086
1086
|
buildTimeDifferenceSeconds(e, t) {
|
|
1087
|
-
return
|
|
1087
|
+
return D`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`;
|
|
1088
1088
|
}
|
|
1089
1089
|
buildDateAddInterval(e, t) {
|
|
1090
|
-
return
|
|
1090
|
+
return D`(${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 ? D`${D.raw(r)}(CASE WHEN ${n} THEN 1 END)` : D`${D.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
1095
1095
|
}
|
|
1096
1096
|
buildDateDiffPeriods(e, t, n) {
|
|
1097
|
-
return
|
|
1097
|
+
return D`DATE_DIFF('${D.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1098
1098
|
}
|
|
1099
1099
|
buildPeriodSeriesSubquery(e) {
|
|
1100
|
-
return
|
|
1100
|
+
return D`(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 D`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;
|
|
1105
|
+
case "quarter": return D`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;
|
|
1106
|
+
case "month": return D`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;
|
|
1107
|
+
case "week": return D`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;
|
|
1108
|
+
case "day": return D`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1109
|
+
case "hour": return D`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;
|
|
1110
|
+
case "minute": return D`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;
|
|
1111
|
+
case "second": return D`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 D`LOWER(${e}) LIKE LOWER(${`%${n}%`})`;
|
|
1118
|
+
case "notContains": return D`LOWER(${e}) NOT LIKE LOWER(${`%${n}%`})`;
|
|
1119
|
+
case "startsWith": return D`LOWER(${e}) LIKE LOWER(${`${n}%`})`;
|
|
1120
|
+
case "endsWith": return D`LOWER(${e}) LIKE LOWER(${`%${n}`})`;
|
|
1121
|
+
case "like": return D`${e} LIKE ${n}`;
|
|
1122
|
+
case "notLike": return D`${e} NOT LIKE ${n}`;
|
|
1123
|
+
case "ilike": return D`LOWER(${e}) LIKE LOWER(${n})`;
|
|
1124
|
+
case "regex": return D`${e} REGEXP ${n}`;
|
|
1125
|
+
case "notRegex": return D`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 D`${e}::TIMESTAMP`;
|
|
1132
|
+
case "decimal": return D`${e}::DECIMAL`;
|
|
1133
|
+
case "integer": return D`${e}::INTEGER`;
|
|
1134
1134
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1135
1135
|
}
|
|
1136
1136
|
}
|
|
1137
1137
|
buildAvg(e) {
|
|
1138
|
-
return
|
|
1138
|
+
return D`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) => D`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => D`${e} ${t}`);
|
|
1142
|
+
return t === void 0 ? D`CASE ${n} END` : D`CASE ${n} ELSE ${t} END`;
|
|
1143
1143
|
}
|
|
1144
1144
|
buildBooleanLiteral(e) {
|
|
1145
|
-
return e ?
|
|
1145
|
+
return e ? D`TRUE` : D`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 D`COALESCE(${D.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 D`COALESCE(${D.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 ? D`PARTITION BY ${D.join(n, D`, `)}` : D``, o = r && r.length > 0 ? D`ORDER BY ${D.join(r.map((e) => e.direction === "desc" ? D`${e.field} DESC` : D`${e.field} ASC`), D`, `)}` : D``, s = D``;
|
|
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 = D`${D.raw(r)} BETWEEN ${D.raw(a)} AND ${D.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 = D`OVER (${c.length > 0 ? D.join(c, D` `) : D``})`;
|
|
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 D`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
1194
|
+
case "lead": return D`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
1195
|
+
case "rank": return D`RANK() ${l}`;
|
|
1196
|
+
case "denseRank": return D`DENSE_RANK() ${l}`;
|
|
1197
|
+
case "rowNumber": return D`ROW_NUMBER() ${l}`;
|
|
1198
|
+
case "ntile": return D`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1199
|
+
case "firstValue": return D`FIRST_VALUE(${t}) ${l}`;
|
|
1200
|
+
case "lastValue": return D`LAST_VALUE(${t}) ${l}`;
|
|
1201
|
+
case "movingAvg": return D`AVG(${t}) ${l}`;
|
|
1202
|
+
case "movingSum": return D`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 D`${this.durationToSeconds(e)}`;
|
|
1215
1215
|
}
|
|
1216
1216
|
buildTimeDifferenceSeconds(e, t) {
|
|
1217
|
-
return
|
|
1217
|
+
return D`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 = D`DATEADD('YEAR', ${n.years}, ${r})`), n.months && (r = D`DATEADD('MONTH', ${n.months}, ${r})`), n.days && (r = D`DATEADD('DAY', ${n.days}, ${r})`), n.hours && (r = D`DATEADD('HOUR', ${n.hours}, ${r})`), n.minutes && (r = D`DATEADD('MINUTE', ${n.minutes}, ${r})`), n.seconds && (r = D`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 ? D`${D.raw(r)}(CASE WHEN ${n} THEN 1 END)` : D`${D.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 D`DATEDIFF('${D.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
1230
1230
|
}
|
|
1231
1231
|
buildPeriodSeriesSubquery(e) {
|
|
1232
|
-
return
|
|
1232
|
+
return D`(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 D`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;
|
|
1237
|
+
case "quarter": return D`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;
|
|
1238
|
+
case "month": return D`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;
|
|
1239
|
+
case "week": return D`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;
|
|
1240
|
+
case "day": return D`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
1241
|
+
case "hour": return D`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;
|
|
1242
|
+
case "minute": return D`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;
|
|
1243
|
+
case "second": return D`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 D`${e} ILIKE ${`%${n}%`}`;
|
|
1250
|
+
case "notContains": return D`${e} NOT ILIKE ${`%${n}%`}`;
|
|
1251
|
+
case "startsWith": return D`${e} ILIKE ${`${n}%`}`;
|
|
1252
|
+
case "endsWith": return D`${e} ILIKE ${`%${n}`}`;
|
|
1253
|
+
case "like": return D`${e} LIKE ${n}`;
|
|
1254
|
+
case "notLike": return D`${e} NOT LIKE ${n}`;
|
|
1255
|
+
case "ilike": return D`${e} ILIKE ${n}`;
|
|
1256
|
+
case "regex": return D`REGEXP_LIKE(${e}, ${n})`;
|
|
1257
|
+
case "notRegex": return D`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 D`${e}::TIMESTAMP`;
|
|
1264
|
+
case "decimal": return D`${e}::DECIMAL`;
|
|
1265
|
+
case "integer": return D`${e}::INTEGER`;
|
|
1266
1266
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
1267
1267
|
}
|
|
1268
1268
|
}
|
|
1269
1269
|
buildAvg(e) {
|
|
1270
|
-
return
|
|
1270
|
+
return D`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) => D`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => D`${e} ${t}`);
|
|
1274
|
+
return t === void 0 ? D`CASE ${n} END` : D`CASE ${n} ELSE ${t} END`;
|
|
1275
1275
|
}
|
|
1276
1276
|
buildBooleanLiteral(e) {
|
|
1277
|
-
return e ?
|
|
1277
|
+
return e ? D`TRUE` : D`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 D`COALESCE(${D.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 D`COALESCE(${D.raw(n)}(${e}), 0)`;
|
|
1311
1311
|
}
|
|
1312
1312
|
buildPercentile(e, t) {
|
|
1313
1313
|
let n = (t / 100).toString();
|
|
1314
|
-
return
|
|
1314
|
+
return D`PERCENTILE_CONT(${D.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 ? D`PARTITION BY ${D.join(n, D`, `)}` : D``, o = r && r.length > 0 ? D`ORDER BY ${D.join(r.map((e) => e.direction === "desc" ? D`${e.field} DESC` : D`${e.field} ASC`), D`, `)}` : D``, s = D``;
|
|
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 = D`${D.raw(r)} BETWEEN ${D.raw(a)} AND ${D.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 = D`OVER (${c.length > 0 ? D.join(c, D` `) : D``})`;
|
|
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 D`LAG(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
1327
|
+
case "lead": return D`LEAD(${t}, ${i?.offset ?? 1}${i?.defaultValue === void 0 ? D`` : D`, ${i.defaultValue}`}) ${l}`;
|
|
1328
|
+
case "rank": return D`RANK() ${l}`;
|
|
1329
|
+
case "denseRank": return D`DENSE_RANK() ${l}`;
|
|
1330
|
+
case "rowNumber": return D`ROW_NUMBER() ${l}`;
|
|
1331
|
+
case "ntile": return D`NTILE(${i?.nTile ?? 4}) ${l}`;
|
|
1332
|
+
case "firstValue": return D`FIRST_VALUE(${t}) ${l}`;
|
|
1333
|
+
case "lastValue": return D`LAST_VALUE(${t}) ${l}`;
|
|
1334
|
+
case "movingAvg": return D`AVG(${t}) ${l}`;
|
|
1335
|
+
case "movingSum": return D`SUM(${t}) ${l}`;
|
|
1336
1336
|
default: throw Error(`Unsupported window function: ${e}`);
|
|
1337
1337
|
}
|
|
1338
1338
|
}
|
|
@@ -1467,7 +1467,7 @@ var Te = class extends H {
|
|
|
1467
1467
|
async explainQuery(e, t, n) {
|
|
1468
1468
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1469
1469
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1470
|
-
let i = await this.db.execute(
|
|
1470
|
+
let i = await this.db.execute(D`${D.raw(r)} ${D.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1471
1471
|
let r = t[parseInt(n, 10) - 1];
|
|
1472
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, "''")}'`;
|
|
1473
1473
|
}))}`), a = [];
|
|
@@ -1484,7 +1484,7 @@ var Te = class extends H {
|
|
|
1484
1484
|
if (!e || e.length === 0) return [];
|
|
1485
1485
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
1486
1486
|
try {
|
|
1487
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = we(await this.db.execute(
|
|
1487
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = we(await this.db.execute(D`
|
|
1488
1488
|
SELECT
|
|
1489
1489
|
t.relname as table_name,
|
|
1490
1490
|
i.relname as index_name,
|
|
@@ -1498,7 +1498,7 @@ var Te = class extends H {
|
|
|
1498
1498
|
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
1499
1499
|
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
1500
1500
|
WHERE n.nspname = 'public'
|
|
1501
|
-
AND t.relname IN (${
|
|
1501
|
+
AND t.relname IN (${D.raw(t)})
|
|
1502
1502
|
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
1503
1503
|
ORDER BY t.relname, i.relname
|
|
1504
1504
|
`));
|
|
@@ -1602,7 +1602,7 @@ var ke = class extends H {
|
|
|
1602
1602
|
});
|
|
1603
1603
|
let a = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1604
1604
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1605
|
-
let o = await this.db.execute(
|
|
1605
|
+
let o = await this.db.execute(D.raw(`${a} ${r}`)), s = [];
|
|
1606
1606
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
1607
1607
|
id: e.id || 1,
|
|
1608
1608
|
select_type: e.select_type || "SIMPLE",
|
|
@@ -1626,7 +1626,7 @@ var ke = class extends H {
|
|
|
1626
1626
|
if (!e || e.length === 0) return [];
|
|
1627
1627
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1628
1628
|
try {
|
|
1629
|
-
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(D`
|
|
1630
1630
|
SELECT
|
|
1631
1631
|
TABLE_NAME as table_name,
|
|
1632
1632
|
INDEX_NAME as index_name,
|
|
@@ -1635,7 +1635,7 @@ var ke = class extends H {
|
|
|
1635
1635
|
CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
|
|
1636
1636
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
1637
1637
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
1638
|
-
AND LOWER(TABLE_NAME) IN (${
|
|
1638
|
+
AND LOWER(TABLE_NAME) IN (${D.raw(t)})
|
|
1639
1639
|
GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
|
|
1640
1640
|
ORDER BY TABLE_NAME, INDEX_NAME
|
|
1641
1641
|
`);
|
|
@@ -1755,7 +1755,7 @@ var Ne = class extends H {
|
|
|
1755
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, "''")}'`;
|
|
1756
1756
|
});
|
|
1757
1757
|
let a = `EXPLAIN QUERY PLAN ${r}`, o;
|
|
1758
|
-
if (this.db.all) o = this.db.all(
|
|
1758
|
+
if (this.db.all) o = this.db.all(D.raw(a));
|
|
1759
1759
|
else throw Error("SQLite database instance must have an all() method for EXPLAIN");
|
|
1760
1760
|
let s = [];
|
|
1761
1761
|
if (Array.isArray(o)) for (let e of o) e && typeof e == "object" && s.push({
|
|
@@ -1775,9 +1775,9 @@ var Ne = class extends H {
|
|
|
1775
1775
|
try {
|
|
1776
1776
|
let t = [];
|
|
1777
1777
|
for (let n of e) {
|
|
1778
|
-
let e = this.db.all(
|
|
1778
|
+
let e = this.db.all(D.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));
|
|
1779
1779
|
if (Array.isArray(e)) for (let r of e) {
|
|
1780
|
-
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(D.raw(`SELECT name FROM pragma_index_info('${e}') ORDER BY seqno`)), s = [];
|
|
1781
1781
|
if (Array.isArray(o)) for (let e of o) {
|
|
1782
1782
|
let t = e.name;
|
|
1783
1783
|
typeof t == "string" && s.push(t);
|
|
@@ -1962,7 +1962,7 @@ var Be = class extends H {
|
|
|
1962
1962
|
async explainQuery(e, t, n) {
|
|
1963
1963
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1964
1964
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1965
|
-
let i = await this.db.execute(
|
|
1965
|
+
let i = await this.db.execute(D`${D.raw(r)} ${D.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
1966
1966
|
let r = t[parseInt(n, 10) - 1];
|
|
1967
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, "''")}'`;
|
|
1968
1968
|
}))}`), a = [];
|
|
@@ -1981,7 +1981,7 @@ var Be = class extends H {
|
|
|
1981
1981
|
if (!e || e.length === 0) return [];
|
|
1982
1982
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1983
1983
|
try {
|
|
1984
|
-
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(D`
|
|
1985
1985
|
SELECT
|
|
1986
1986
|
table_name,
|
|
1987
1987
|
index_name,
|
|
@@ -1989,7 +1989,7 @@ var Be = class extends H {
|
|
|
1989
1989
|
is_unique,
|
|
1990
1990
|
is_primary
|
|
1991
1991
|
FROM duckdb_indexes()
|
|
1992
|
-
WHERE LOWER(table_name) IN (${
|
|
1992
|
+
WHERE LOWER(table_name) IN (${D.raw(t)})
|
|
1993
1993
|
GROUP BY table_name, index_name, is_unique, is_primary
|
|
1994
1994
|
ORDER BY table_name, index_name
|
|
1995
1995
|
`);
|
|
@@ -2148,7 +2148,7 @@ var Ge = class extends H {
|
|
|
2148
2148
|
async explainQuery(e, t, n) {
|
|
2149
2149
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
2150
2150
|
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
2151
|
-
let i = await this.db.execute(
|
|
2151
|
+
let i = await this.db.execute(D`${D.raw(r)} ${D.raw(e.replace(/\$(\d+)/g, (e, n) => {
|
|
2152
2152
|
let r = t[parseInt(n, 10) - 1];
|
|
2153
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, "''")}'`;
|
|
2154
2154
|
}))}`), a = [];
|
|
@@ -2309,7 +2309,7 @@ var Xe = class extends H {
|
|
|
2309
2309
|
}
|
|
2310
2310
|
async explainQuery(e, t, n) {
|
|
2311
2311
|
if (n?.analyze, !this.db.execute) throw Error("Snowflake database instance must have an execute method");
|
|
2312
|
-
let r = await this.db.execute(
|
|
2312
|
+
let r = await this.db.execute(D`${D.raw("EXPLAIN")} ${D.raw(e.replace(/\?/g, () => {
|
|
2313
2313
|
let e = t.shift();
|
|
2314
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, "''")}'`;
|
|
2315
2315
|
}))}`), i = [];
|
|
@@ -2372,7 +2372,7 @@ function et(e, t) {
|
|
|
2372
2372
|
}
|
|
2373
2373
|
}
|
|
2374
2374
|
function tt(e) {
|
|
2375
|
-
return e && typeof e == "object" ?
|
|
2375
|
+
return e && typeof e == "object" ? D`${D`${e}`}` : e;
|
|
2376
2376
|
}
|
|
2377
2377
|
function nt(e) {
|
|
2378
2378
|
if (e === "__proto__" || e === "constructor" || e === "prototype") throw Error(`Unsafe property key: ${e}`);
|
|
@@ -2385,12 +2385,12 @@ function rt(e, t) {
|
|
|
2385
2385
|
if (e.relationship !== "belongsToMany" || !e.through) throw Error("expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration");
|
|
2386
2386
|
let { table: n, sourceKey: r, targetKey: i, securitySql: a } = e.through, o = [];
|
|
2387
2387
|
for (let e of r) {
|
|
2388
|
-
let t = e.as ||
|
|
2388
|
+
let t = e.as || M;
|
|
2389
2389
|
o.push(t(e.source, e.target));
|
|
2390
2390
|
}
|
|
2391
2391
|
let s = [];
|
|
2392
2392
|
for (let e of i) {
|
|
2393
|
-
let t = e.as ||
|
|
2393
|
+
let t = e.as || M;
|
|
2394
2394
|
s.push(t(e.source, e.target));
|
|
2395
2395
|
}
|
|
2396
2396
|
let c;
|
|
@@ -2403,11 +2403,11 @@ function rt(e, t) {
|
|
|
2403
2403
|
junctionJoins: [{
|
|
2404
2404
|
joinType: l,
|
|
2405
2405
|
table: n,
|
|
2406
|
-
condition:
|
|
2406
|
+
condition: P(...o)
|
|
2407
2407
|
}, {
|
|
2408
2408
|
joinType: l,
|
|
2409
2409
|
table: n,
|
|
2410
|
-
condition:
|
|
2410
|
+
condition: P(...s)
|
|
2411
2411
|
}],
|
|
2412
2412
|
junctionSecurityConditions: c
|
|
2413
2413
|
};
|
|
@@ -2575,7 +2575,7 @@ var Y = class {
|
|
|
2575
2575
|
}
|
|
2576
2576
|
buildTimeDimensionExpression(e, t, n) {
|
|
2577
2577
|
let r = W(e, n);
|
|
2578
|
-
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof S ? r :
|
|
2578
|
+
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof S ? r : D`${r}`;
|
|
2579
2579
|
}
|
|
2580
2580
|
buildDateRangeCondition(e, t) {
|
|
2581
2581
|
if (!t) return null;
|
|
@@ -2586,13 +2586,13 @@ var Y = class {
|
|
|
2586
2586
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2587
2587
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2588
2588
|
}
|
|
2589
|
-
return
|
|
2589
|
+
return P(I(e, n), L(e, r));
|
|
2590
2590
|
}
|
|
2591
2591
|
if (typeof t == "string") {
|
|
2592
2592
|
let n = this.parseRelativeDateRange(t);
|
|
2593
2593
|
if (n) {
|
|
2594
2594
|
let t, r;
|
|
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()),
|
|
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()), P(I(e, t), L(e, r));
|
|
2596
2596
|
}
|
|
2597
2597
|
let r = this.normalizeDate(t);
|
|
2598
2598
|
if (!r) return null;
|
|
@@ -2601,7 +2601,7 @@ var Y = class {
|
|
|
2601
2601
|
let o = new Date(i);
|
|
2602
2602
|
o.setUTCHours(23, 59, 59, 999);
|
|
2603
2603
|
let s, c;
|
|
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()),
|
|
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()), P(I(e, s), L(e, c));
|
|
2605
2605
|
}
|
|
2606
2606
|
return null;
|
|
2607
2607
|
}
|
|
@@ -2751,18 +2751,18 @@ var Y = class {
|
|
|
2751
2751
|
if (a.length === 0 && !["set", "notSet"].includes(t)) return t === "equals" ? this.databaseAdapter.buildBooleanLiteral(!1) : null;
|
|
2752
2752
|
let o = a[0];
|
|
2753
2753
|
switch (t) {
|
|
2754
|
-
case "equals": return a.length > 1 ? r?.type === "time" ?
|
|
2755
|
-
case "notEquals": return a.length > 1 ?
|
|
2754
|
+
case "equals": return a.length > 1 ? r?.type === "time" ? re(e, a.map((e) => this.dateTimeBuilder.normalizeDate(e) || e)) : re(e, a) : a.length === 1 ? M(e, r?.type === "time" && this.dateTimeBuilder.normalizeDate(o) || o) : this.databaseAdapter.buildBooleanLiteral(!1);
|
|
2755
|
+
case "notEquals": return a.length > 1 ? ie(e, a) : a.length === 1 ? N(e, o) : null;
|
|
2756
2756
|
case "contains": return this.databaseAdapter.buildStringCondition(e, "contains", o);
|
|
2757
2757
|
case "notContains": return this.databaseAdapter.buildStringCondition(e, "notContains", o);
|
|
2758
2758
|
case "startsWith": return this.databaseAdapter.buildStringCondition(e, "startsWith", o);
|
|
2759
2759
|
case "endsWith": return this.databaseAdapter.buildStringCondition(e, "endsWith", o);
|
|
2760
|
-
case "gt": return
|
|
2761
|
-
case "gte": return
|
|
2762
|
-
case "lt": return
|
|
2763
|
-
case "lte": return
|
|
2764
|
-
case "set": return
|
|
2765
|
-
case "notSet": return
|
|
2760
|
+
case "gt": return te(e, o);
|
|
2761
|
+
case "gte": return I(e, o);
|
|
2762
|
+
case "lt": return ne(e, o);
|
|
2763
|
+
case "lte": return L(e, o);
|
|
2764
|
+
case "set": return oe(e);
|
|
2765
|
+
case "notSet": return ae(e);
|
|
2766
2766
|
case "inDateRange":
|
|
2767
2767
|
if (a.length >= 2) {
|
|
2768
2768
|
let t = this.dateTimeBuilder.normalizeDate(a[0]), r = this.dateTimeBuilder.normalizeDate(a[1]);
|
|
@@ -2772,43 +2772,43 @@ var Y = class {
|
|
|
2772
2772
|
let e = typeof r == "number" ? /* @__PURE__ */ new Date(r * (this.databaseAdapter.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(r), t = new Date(e);
|
|
2773
2773
|
t.setUTCHours(23, 59, 59, 999), r = this.databaseAdapter.isTimestampInteger() ? this.databaseAdapter.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
2774
2774
|
}
|
|
2775
|
-
return
|
|
2775
|
+
return P(I(e, t), L(e, r));
|
|
2776
2776
|
}
|
|
2777
2777
|
}
|
|
2778
2778
|
return null;
|
|
2779
2779
|
case "beforeDate": {
|
|
2780
2780
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2781
|
-
return t ?
|
|
2781
|
+
return t ? ne(e, t) : null;
|
|
2782
2782
|
}
|
|
2783
2783
|
case "afterDate": {
|
|
2784
2784
|
let t = this.dateTimeBuilder.normalizeDate(o);
|
|
2785
|
-
return t ?
|
|
2785
|
+
return t ? te(e, t) : null;
|
|
2786
2786
|
}
|
|
2787
|
-
case "between": return a.length >= 2 ?
|
|
2788
|
-
case "notBetween": return a.length >= 2 ?
|
|
2789
|
-
case "in": return a.length > 0 ?
|
|
2790
|
-
case "notIn": return a.length > 0 ?
|
|
2787
|
+
case "between": return a.length >= 2 ? P(I(e, a[0]), L(e, a[1])) : null;
|
|
2788
|
+
case "notBetween": return a.length >= 2 ? F(ne(e, a[0]), te(e, a[1])) : null;
|
|
2789
|
+
case "in": return a.length > 0 ? re(e, a) : null;
|
|
2790
|
+
case "notIn": return a.length > 0 ? ie(e, a) : null;
|
|
2791
2791
|
case "like": return this.databaseAdapter.buildStringCondition(e, "like", o);
|
|
2792
2792
|
case "notLike": return this.databaseAdapter.buildStringCondition(e, "notLike", o);
|
|
2793
2793
|
case "ilike": return this.databaseAdapter.buildStringCondition(e, "ilike", o);
|
|
2794
2794
|
case "regex": return this.databaseAdapter.buildStringCondition(e, "regex", o);
|
|
2795
2795
|
case "notRegex": return this.databaseAdapter.buildStringCondition(e, "notRegex", o);
|
|
2796
|
-
case "isEmpty": return
|
|
2797
|
-
case "isNotEmpty": return
|
|
2798
|
-
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2799
|
-
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2800
|
-
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ?
|
|
2796
|
+
case "isEmpty": return F(ae(e), M(e, ""));
|
|
2797
|
+
case "isNotEmpty": return P(oe(e), N(e, ""));
|
|
2798
|
+
case "arrayContains": return this.databaseAdapter.getEngineType() === "postgres" ? se(e, a) : null;
|
|
2799
|
+
case "arrayOverlaps": return this.databaseAdapter.getEngineType() === "postgres" ? le(e, a) : null;
|
|
2800
|
+
case "arrayContained": return this.databaseAdapter.getEngineType() === "postgres" ? ce(e, a) : null;
|
|
2801
2801
|
default: return null;
|
|
2802
2802
|
}
|
|
2803
2803
|
}
|
|
2804
2804
|
buildLogicalFilter(e, t, n) {
|
|
2805
2805
|
if ("and" in e && e.and) {
|
|
2806
2806
|
let r = e.and.map((e) => this.buildSingleFilter(e, t, n)).filter((e) => e !== null);
|
|
2807
|
-
return r.length > 0 ? r.length === 1 ? r[0] :
|
|
2807
|
+
return r.length > 0 ? r.length === 1 ? r[0] : P(...r) : null;
|
|
2808
2808
|
}
|
|
2809
2809
|
if ("or" in e && e.or) {
|
|
2810
2810
|
let r = e.or.map((e) => this.buildSingleFilter(e, t, n)).filter((e) => e !== null);
|
|
2811
|
-
return r.length > 0 ? r.length === 1 ? r[0] :
|
|
2811
|
+
return r.length > 0 ? r.length === 1 ? r[0] : F(...r) : null;
|
|
2812
2812
|
}
|
|
2813
2813
|
return null;
|
|
2814
2814
|
}
|
|
@@ -2956,7 +2956,7 @@ function pt(e, t) {
|
|
|
2956
2956
|
if (!r.get(c)) throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);
|
|
2957
2957
|
let l = `${c}.${s}`, u = i.get(l);
|
|
2958
2958
|
if (!u) throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);
|
|
2959
|
-
let d =
|
|
2959
|
+
let d = D`${u()}`;
|
|
2960
2960
|
o.set(t, d);
|
|
2961
2961
|
}
|
|
2962
2962
|
let s = [], c = [], l = 0;
|
|
@@ -2968,10 +2968,10 @@ function pt(e, t) {
|
|
|
2968
2968
|
i && c.push(i), l = r + n.length;
|
|
2969
2969
|
}
|
|
2970
2970
|
}
|
|
2971
|
-
if (s.push(e.substring(l)), c.length === 0) return
|
|
2971
|
+
if (s.push(e.substring(l)), c.length === 0) return D.raw(e);
|
|
2972
2972
|
let u = [];
|
|
2973
2973
|
for (let e = 0; e < s.length; e++) s[e] && u.push(new x(s[e])), e < c.length && u.push(c[e]);
|
|
2974
|
-
return
|
|
2974
|
+
return D.join(u, D.raw(""));
|
|
2975
2975
|
}
|
|
2976
2976
|
function mt(e) {
|
|
2977
2977
|
if (e.length > 1e3) return [];
|
|
@@ -3089,26 +3089,26 @@ var Q = class e {
|
|
|
3089
3089
|
if (o && o.measures[i]) {
|
|
3090
3090
|
let t = o.measures[i];
|
|
3091
3091
|
if (n.measures.includes(e)) {
|
|
3092
|
-
let r =
|
|
3092
|
+
let r = D`${D.identifier(n.cteAlias)}.${D.identifier(i)}`, o;
|
|
3093
3093
|
switch (t.type) {
|
|
3094
3094
|
case "count":
|
|
3095
3095
|
case "countDistinct":
|
|
3096
3096
|
case "sum":
|
|
3097
|
-
o =
|
|
3097
|
+
o = R(r);
|
|
3098
3098
|
break;
|
|
3099
3099
|
case "avg":
|
|
3100
3100
|
o = this.databaseAdapter.buildAvg(r);
|
|
3101
3101
|
break;
|
|
3102
3102
|
case "min":
|
|
3103
|
-
o =
|
|
3103
|
+
o = B(r);
|
|
3104
3104
|
break;
|
|
3105
3105
|
case "max":
|
|
3106
|
-
o =
|
|
3106
|
+
o = z(r);
|
|
3107
3107
|
break;
|
|
3108
3108
|
case "number":
|
|
3109
|
-
o =
|
|
3109
|
+
o = R(r);
|
|
3110
3110
|
break;
|
|
3111
|
-
default: o =
|
|
3111
|
+
default: o = R(r);
|
|
3112
3112
|
}
|
|
3113
3113
|
a.set(e, () => o);
|
|
3114
3114
|
}
|
|
@@ -3126,16 +3126,16 @@ var Q = class e {
|
|
|
3126
3126
|
if (i.joinCubes) for (let e of i.joinCubes) o.set(e.cube.name, e.cube);
|
|
3127
3127
|
return this.buildCTECalculatedMeasure(n, t, a, o, r);
|
|
3128
3128
|
} else {
|
|
3129
|
-
let e =
|
|
3129
|
+
let e = D`${D.identifier(a.cteAlias)}.${D.identifier(t)}`;
|
|
3130
3130
|
switch (n.type) {
|
|
3131
3131
|
case "count":
|
|
3132
3132
|
case "countDistinct":
|
|
3133
|
-
case "sum": return
|
|
3133
|
+
case "sum": return R(e);
|
|
3134
3134
|
case "avg": return this.databaseAdapter.buildAvg(e);
|
|
3135
|
-
case "min": return
|
|
3136
|
-
case "max": return
|
|
3137
|
-
case "number": return
|
|
3138
|
-
default: return
|
|
3135
|
+
case "min": return B(e);
|
|
3136
|
+
case "max": return z(e);
|
|
3137
|
+
case "number": return R(e);
|
|
3138
|
+
default: return R(e);
|
|
3139
3139
|
}
|
|
3140
3140
|
}
|
|
3141
3141
|
}
|
|
@@ -3150,10 +3150,10 @@ var Q = class e {
|
|
|
3150
3150
|
if (t.filters && t.filters.length > 0) {
|
|
3151
3151
|
let e = t.filters.map((e) => {
|
|
3152
3152
|
let t = e(n);
|
|
3153
|
-
return t ?
|
|
3153
|
+
return t ? D`(${t})` : void 0;
|
|
3154
3154
|
}).filter(Boolean);
|
|
3155
3155
|
if (e.length > 0) {
|
|
3156
|
-
let t = e.length === 1 ? e[0] :
|
|
3156
|
+
let t = e.length === 1 ? e[0] : P(...e);
|
|
3157
3157
|
i = this.databaseAdapter.buildCaseWhen([{
|
|
3158
3158
|
when: t,
|
|
3159
3159
|
then: i
|
|
@@ -3161,22 +3161,22 @@ var Q = class e {
|
|
|
3161
3161
|
}
|
|
3162
3162
|
}
|
|
3163
3163
|
switch (t.type) {
|
|
3164
|
-
case "count": return
|
|
3165
|
-
case "countDistinct": return
|
|
3166
|
-
case "sum": return
|
|
3164
|
+
case "count": return fe(i);
|
|
3165
|
+
case "countDistinct": return pe(i);
|
|
3166
|
+
case "sum": return R(i);
|
|
3167
3167
|
case "avg": return this.databaseAdapter.buildAvg(i);
|
|
3168
|
-
case "min": return
|
|
3169
|
-
case "max": return
|
|
3168
|
+
case "min": return B(i);
|
|
3169
|
+
case "max": return z(i);
|
|
3170
3170
|
case "number": return i;
|
|
3171
3171
|
case "stddev":
|
|
3172
3172
|
case "stddevSamp": {
|
|
3173
3173
|
let e = t.type === "stddevSamp" || t.statisticalConfig?.useSample, n = this.databaseAdapter.buildStddev(i, e);
|
|
3174
|
-
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`), D`MAX(NULL)`) : n;
|
|
3175
3175
|
}
|
|
3176
3176
|
case "variance":
|
|
3177
3177
|
case "varianceSamp": {
|
|
3178
3178
|
let e = t.type === "varianceSamp" || t.statisticalConfig?.useSample, n = this.databaseAdapter.buildVariance(i, e);
|
|
3179
|
-
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`), D`MAX(NULL)`) : n;
|
|
3180
3180
|
}
|
|
3181
3181
|
case "percentile":
|
|
3182
3182
|
case "median":
|
|
@@ -3196,7 +3196,7 @@ var Q = class e {
|
|
|
3196
3196
|
default: e = t.statisticalConfig?.percentile ?? 50;
|
|
3197
3197
|
}
|
|
3198
3198
|
let n = this.databaseAdapter.buildPercentile(i, e);
|
|
3199
|
-
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`), D`MAX(NULL)`) : n;
|
|
3200
3200
|
}
|
|
3201
3201
|
case "lag":
|
|
3202
3202
|
case "lead":
|
|
@@ -3242,9 +3242,9 @@ var Q = class e {
|
|
|
3242
3242
|
nTile: e.nTile,
|
|
3243
3243
|
frame: e.frame
|
|
3244
3244
|
});
|
|
3245
|
-
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`), D`NULL`) : s;
|
|
3246
3246
|
}
|
|
3247
|
-
default: return
|
|
3247
|
+
default: return fe(i);
|
|
3248
3248
|
}
|
|
3249
3249
|
}
|
|
3250
3250
|
static WINDOW_FUNCTION_TYPES = [
|
|
@@ -3387,7 +3387,7 @@ var Q = class e {
|
|
|
3387
3387
|
let t = e.joinKeys.find((e) => e.targetColumn === o);
|
|
3388
3388
|
if (t && t.sourceColumnObj) i.push(t.sourceColumnObj);
|
|
3389
3389
|
else {
|
|
3390
|
-
let t =
|
|
3390
|
+
let t = D`${D.identifier(e.cteAlias)}.${D.identifier(o)}`;
|
|
3391
3391
|
i.push(t);
|
|
3392
3392
|
}
|
|
3393
3393
|
} else {
|
|
@@ -3406,7 +3406,7 @@ var Q = class e {
|
|
|
3406
3406
|
let r = this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj, e.granularity, n);
|
|
3407
3407
|
i.push(r);
|
|
3408
3408
|
} else {
|
|
3409
|
-
let e =
|
|
3409
|
+
let e = D`${D.identifier(a.cteAlias)}.${D.identifier(o)}`;
|
|
3410
3410
|
i.push(e);
|
|
3411
3411
|
}
|
|
3412
3412
|
} else {
|
|
@@ -3434,24 +3434,24 @@ var Q = class e {
|
|
|
3434
3434
|
let [t, a] = e.split("."), o = i.get(t);
|
|
3435
3435
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3436
3436
|
let t = o.dimensions[a];
|
|
3437
|
-
r[e] =
|
|
3437
|
+
r[e] = D`${W(t.sql, n)}`.as(e);
|
|
3438
3438
|
}
|
|
3439
3439
|
}
|
|
3440
3440
|
if (t.measures) {
|
|
3441
3441
|
let e = this.buildResolvedMeasures(t.measures, i, n);
|
|
3442
3442
|
for (let n of t.measures) {
|
|
3443
3443
|
let t = e.get(n);
|
|
3444
|
-
t && typeof t == "function" && (r[n] =
|
|
3444
|
+
t && typeof t == "function" && (r[n] = D`${t()}`.as(n));
|
|
3445
3445
|
}
|
|
3446
3446
|
}
|
|
3447
3447
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
3448
3448
|
let [t, a] = e.dimension.split("."), o = i.get(t);
|
|
3449
3449
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
3450
3450
|
let t = o.dimensions[a], i = this.buildTimeDimensionExpression(t.sql, e.granularity, n);
|
|
3451
|
-
r[e.dimension] =
|
|
3451
|
+
r[e.dimension] = D`${i}`.as(e.dimension);
|
|
3452
3452
|
}
|
|
3453
3453
|
}
|
|
3454
|
-
return Object.keys(r).length === 0 && (r.count =
|
|
3454
|
+
return Object.keys(r).length === 0 && (r.count = fe()), r;
|
|
3455
3455
|
}
|
|
3456
3456
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
3457
3457
|
return this.measureBuilder.buildCalculatedMeasure(e, t, n, r, i);
|
|
@@ -3513,11 +3513,11 @@ var Q = class e {
|
|
|
3513
3513
|
let a = e;
|
|
3514
3514
|
if (a.and) {
|
|
3515
3515
|
let e = a.and.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3516
|
-
return e.length > 0 ?
|
|
3516
|
+
return e.length > 0 ? P(...e) : null;
|
|
3517
3517
|
}
|
|
3518
3518
|
if (a.or) {
|
|
3519
3519
|
let e = a.or.map((e) => this.processFilter(e, t, n, r, i)).filter((e) => e !== null);
|
|
3520
|
-
return e.length > 0 ?
|
|
3520
|
+
return e.length > 0 ? F(...e) : null;
|
|
3521
3521
|
}
|
|
3522
3522
|
}
|
|
3523
3523
|
let a = e, [o, s] = a.member.split("."), c = t.get(o);
|
|
@@ -3557,12 +3557,12 @@ var Q = class e {
|
|
|
3557
3557
|
];
|
|
3558
3558
|
if (e.order && Object.keys(e.order).length > 0) for (let [t, i] of Object.entries(e.order)) {
|
|
3559
3559
|
if (!r.includes(t)) throw Error(`Cannot order by '${t}': field is not selected in the query`);
|
|
3560
|
-
let e = i === "desc" ?
|
|
3560
|
+
let e = i === "desc" ? de(D.identifier(t)) : ue(D.identifier(t));
|
|
3561
3561
|
n.push(e);
|
|
3562
3562
|
}
|
|
3563
3563
|
if (e.timeDimensions && e.timeDimensions.length > 0) {
|
|
3564
3564
|
let t = new Set(Object.keys(e.order || {})), r = [...e.timeDimensions].sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
3565
|
-
for (let e of r) t.has(e.dimension) || n.push(
|
|
3565
|
+
for (let e of r) t.has(e.dimension) || n.push(ue(D.identifier(e.dimension)));
|
|
3566
3566
|
}
|
|
3567
3567
|
return n;
|
|
3568
3568
|
}
|
|
@@ -3804,10 +3804,10 @@ var Q = class e {
|
|
|
3804
3804
|
buildJoinCondition(e, t, n) {
|
|
3805
3805
|
let r = [];
|
|
3806
3806
|
for (let i of e.on) {
|
|
3807
|
-
let e = t ?
|
|
3807
|
+
let e = t ? D`${D.identifier(t)}.${D.identifier(i.source.name)}` : tt(i.source), a = n ? D`${D.identifier(n)}.${D.identifier(i.target.name)}` : tt(i.target), o = i.as || M;
|
|
3808
3808
|
r.push(o(e, a));
|
|
3809
3809
|
}
|
|
3810
|
-
return
|
|
3810
|
+
return P(...r);
|
|
3811
3811
|
}
|
|
3812
3812
|
getReachableCubes(e) {
|
|
3813
3813
|
let t = new Set([e]), n = [e];
|
|
@@ -4425,19 +4425,19 @@ var Q = class e {
|
|
|
4425
4425
|
}
|
|
4426
4426
|
} else for (let t of e.joinKeys) if (t.targetColumnObj) {
|
|
4427
4427
|
c[t.targetColumn] = t.targetColumnObj;
|
|
4428
|
-
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] = D`${t.targetColumnObj}`.as(e));
|
|
4429
4429
|
}
|
|
4430
4430
|
if (e.downstreamJoinKeys) for (let t of e.downstreamJoinKeys) for (let e of t.joinKeys) e.sourceColumnObj && (c[e.sourceColumn] = e.sourceColumnObj);
|
|
4431
4431
|
let l = a.name, u = new Map([[l, a]]), d = this.queryBuilder.buildResolvedMeasures(e.measures, u, n);
|
|
4432
4432
|
for (let t of e.measures) {
|
|
4433
4433
|
let [, e] = t.split("."), n = d.get(t);
|
|
4434
|
-
n && (c[e] =
|
|
4434
|
+
n && (c[e] = D`${n()}`.as(e));
|
|
4435
4435
|
}
|
|
4436
4436
|
if (t.dimensions) for (let e of t.dimensions) {
|
|
4437
4437
|
let [t, r] = e.split(".");
|
|
4438
4438
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4439
4439
|
let e = a.dimensions[r];
|
|
4440
|
-
c[r] =
|
|
4440
|
+
c[r] = D`${this.queryBuilder.buildMeasureExpression({
|
|
4441
4441
|
sql: e.sql,
|
|
4442
4442
|
type: "number"
|
|
4443
4443
|
}, n)}`.as(r);
|
|
@@ -4447,7 +4447,7 @@ var Q = class e {
|
|
|
4447
4447
|
let [t, r] = e.dimension.split(".");
|
|
4448
4448
|
if (t === l && a.dimensions && a.dimensions[r]) {
|
|
4449
4449
|
let t = a.dimensions[r];
|
|
4450
|
-
c[r] =
|
|
4450
|
+
c[r] = D`${this.queryBuilder.buildTimeDimensionExpression(t.sql, e.granularity, n)}`.as(r);
|
|
4451
4451
|
}
|
|
4452
4452
|
}
|
|
4453
4453
|
if (Object.keys(c).length === 0) return null;
|
|
@@ -4455,8 +4455,8 @@ var Q = class e {
|
|
|
4455
4455
|
if (s && e.intermediateJoins) {
|
|
4456
4456
|
let t = [...e.intermediateJoins].reverse();
|
|
4457
4457
|
for (let e of t) {
|
|
4458
|
-
let t = e.cube.sql(n), r = [
|
|
4459
|
-
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from,
|
|
4458
|
+
let t = e.cube.sql(n), r = [M(e.cteJoinColumn, e.joinDef.on[0]?.target)];
|
|
4459
|
+
e.securityFilter && r.push(e.securityFilter), f = f.leftJoin(t.from, P(...r));
|
|
4460
4460
|
}
|
|
4461
4461
|
}
|
|
4462
4462
|
let p = r ? {
|
|
@@ -4494,7 +4494,7 @@ var Q = class e {
|
|
|
4494
4494
|
}
|
|
4495
4495
|
let g = [];
|
|
4496
4496
|
if (o.where && g.push(o.where), g.push(...m, ...h), g.length > 0) {
|
|
4497
|
-
let e = g.length === 1 ? g[0] :
|
|
4497
|
+
let e = g.length === 1 ? g[0] : P(...g);
|
|
4498
4498
|
f = f.where(e);
|
|
4499
4499
|
}
|
|
4500
4500
|
let _ = [], v = /* @__PURE__ */ new Set(), y = (e) => {
|
|
@@ -4527,20 +4527,20 @@ var Q = class e {
|
|
|
4527
4527
|
if (!r) throw Error(`CTE info not found for cube ${e.cube.name}`);
|
|
4528
4528
|
let i = [];
|
|
4529
4529
|
if (r.intermediateJoins && r.intermediateJoins.length > 0) {
|
|
4530
|
-
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o =
|
|
4531
|
-
i.push(
|
|
4530
|
+
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o = D`${D.identifier(t)}.${D.identifier(e.primaryJoinColumn.name)}`;
|
|
4531
|
+
i.push(M(a, o));
|
|
4532
4532
|
} else for (let e of r.joinKeys) {
|
|
4533
|
-
let a = this.resolveCTEJoinSourceColumn(e, r, n), o =
|
|
4534
|
-
i.push(
|
|
4533
|
+
let a = this.resolveCTEJoinSourceColumn(e, r, n), o = D`${D.identifier(t)}.${D.identifier(e.targetColumn)}`;
|
|
4534
|
+
i.push(M(a, o));
|
|
4535
4535
|
}
|
|
4536
|
-
return i.length === 1 ? i[0] :
|
|
4536
|
+
return i.length === 1 ? i[0] : P(...i);
|
|
4537
4537
|
}
|
|
4538
4538
|
resolveCTEJoinSourceColumn(e, t, n) {
|
|
4539
4539
|
if (!e) throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);
|
|
4540
|
-
let r = e.sourceColumnObj ||
|
|
4540
|
+
let r = e.sourceColumnObj || D.identifier(e.sourceColumn);
|
|
4541
4541
|
if (!e.sourceColumnObj || !n.preAggregationCTEs) return r;
|
|
4542
4542
|
for (let r of n.preAggregationCTEs) if (r.cube.name !== t.cube.name) {
|
|
4543
|
-
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 D`${D.identifier(r.cteAlias)}.${D.identifier(t)}`;
|
|
4544
4544
|
}
|
|
4545
4545
|
return r;
|
|
4546
4546
|
}
|
|
@@ -4552,24 +4552,139 @@ var Q = class e {
|
|
|
4552
4552
|
i.push(...o);
|
|
4553
4553
|
}
|
|
4554
4554
|
if (i.length === 0) return null;
|
|
4555
|
-
let a = i.length === 1 ? i[0] :
|
|
4555
|
+
let a = i.length === 1 ? i[0] : P(...i), o = e.joinConditions;
|
|
4556
4556
|
if (o.length === 1) {
|
|
4557
4557
|
let { source: e, target: n } = o[0];
|
|
4558
|
-
return
|
|
4558
|
+
return D`${n} IN ${t.db.select({ pk: e }).from(r.from).where(a)}`;
|
|
4559
4559
|
} else {
|
|
4560
|
-
let e =
|
|
4561
|
-
return
|
|
4560
|
+
let e = P(...o.map((e) => M(e.source, e.target)), a);
|
|
4561
|
+
return D`EXISTS ${t.db.select({ one: D`1` }).from(r.from).where(e)}`;
|
|
4562
4562
|
}
|
|
4563
4563
|
}
|
|
4564
4564
|
};
|
|
4565
4565
|
//#endregion
|
|
4566
|
+
//#region src/shared/date-utils.ts
|
|
4567
|
+
function St(e) {
|
|
4568
|
+
let t = /* @__PURE__ */ new Date(), n = e.toLowerCase().trim(), r = t.getUTCFullYear(), i = t.getUTCMonth(), a = t.getUTCDate(), o = t.getUTCDay();
|
|
4569
|
+
if (n === "today") {
|
|
4570
|
+
let e = new Date(t);
|
|
4571
|
+
e.setUTCHours(0, 0, 0, 0);
|
|
4572
|
+
let n = new Date(t);
|
|
4573
|
+
return n.setUTCHours(23, 59, 59, 999), {
|
|
4574
|
+
start: e,
|
|
4575
|
+
end: n
|
|
4576
|
+
};
|
|
4577
|
+
}
|
|
4578
|
+
if (n === "yesterday") {
|
|
4579
|
+
let e = new Date(t);
|
|
4580
|
+
e.setUTCDate(a - 1), e.setUTCHours(0, 0, 0, 0);
|
|
4581
|
+
let n = new Date(t);
|
|
4582
|
+
return n.setUTCDate(a - 1), n.setUTCHours(23, 59, 59, 999), {
|
|
4583
|
+
start: e,
|
|
4584
|
+
end: n
|
|
4585
|
+
};
|
|
4586
|
+
}
|
|
4587
|
+
if (n === "this week") {
|
|
4588
|
+
let e = o === 0 ? -6 : 1 - o, n = new Date(t);
|
|
4589
|
+
n.setUTCDate(a + e), n.setUTCHours(0, 0, 0, 0);
|
|
4590
|
+
let r = new Date(n);
|
|
4591
|
+
return r.setUTCDate(n.getUTCDate() + 6), r.setUTCHours(23, 59, 59, 999), {
|
|
4592
|
+
start: n,
|
|
4593
|
+
end: r
|
|
4594
|
+
};
|
|
4595
|
+
}
|
|
4596
|
+
if (n === "this month") return {
|
|
4597
|
+
start: new Date(Date.UTC(r, i, 1, 0, 0, 0, 0)),
|
|
4598
|
+
end: new Date(Date.UTC(r, i + 1, 0, 23, 59, 59, 999))
|
|
4599
|
+
};
|
|
4600
|
+
if (n === "this quarter") {
|
|
4601
|
+
let e = Math.floor(i / 3);
|
|
4602
|
+
return {
|
|
4603
|
+
start: new Date(Date.UTC(r, e * 3, 1, 0, 0, 0, 0)),
|
|
4604
|
+
end: new Date(Date.UTC(r, e * 3 + 3, 0, 23, 59, 59, 999))
|
|
4605
|
+
};
|
|
4606
|
+
}
|
|
4607
|
+
if (n === "this year") return {
|
|
4608
|
+
start: new Date(Date.UTC(r, 0, 1, 0, 0, 0, 0)),
|
|
4609
|
+
end: new Date(Date.UTC(r, 11, 31, 23, 59, 59, 999))
|
|
4610
|
+
};
|
|
4611
|
+
let s = n.match(/^last\s+(\d+)\s+days?$/);
|
|
4612
|
+
if (s) {
|
|
4613
|
+
let e = parseInt(s[1], 10), n = new Date(t);
|
|
4614
|
+
n.setUTCDate(a - e + 1), n.setUTCHours(0, 0, 0, 0);
|
|
4615
|
+
let r = new Date(t);
|
|
4616
|
+
return r.setUTCHours(23, 59, 59, 999), {
|
|
4617
|
+
start: n,
|
|
4618
|
+
end: r
|
|
4619
|
+
};
|
|
4620
|
+
}
|
|
4621
|
+
let c = n.match(/^last\s+(\d+)\s+weeks?$/);
|
|
4622
|
+
if (c) {
|
|
4623
|
+
let e = parseInt(c[1], 10) * 7, n = new Date(t);
|
|
4624
|
+
n.setUTCDate(a - e + 1), n.setUTCHours(0, 0, 0, 0);
|
|
4625
|
+
let r = new Date(t);
|
|
4626
|
+
return r.setUTCHours(23, 59, 59, 999), {
|
|
4627
|
+
start: n,
|
|
4628
|
+
end: r
|
|
4629
|
+
};
|
|
4630
|
+
}
|
|
4631
|
+
if (n === "last week") {
|
|
4632
|
+
let e = o === 0 ? -13 : -6 - o, n = new Date(t);
|
|
4633
|
+
n.setUTCDate(a + e), n.setUTCHours(0, 0, 0, 0);
|
|
4634
|
+
let r = new Date(n);
|
|
4635
|
+
return r.setUTCDate(n.getUTCDate() + 6), r.setUTCHours(23, 59, 59, 999), {
|
|
4636
|
+
start: n,
|
|
4637
|
+
end: r
|
|
4638
|
+
};
|
|
4639
|
+
}
|
|
4640
|
+
if (n === "last month") return {
|
|
4641
|
+
start: new Date(Date.UTC(r, i - 1, 1, 0, 0, 0, 0)),
|
|
4642
|
+
end: new Date(Date.UTC(r, i, 0, 23, 59, 59, 999))
|
|
4643
|
+
};
|
|
4644
|
+
if (n === "last quarter") {
|
|
4645
|
+
let e = Math.floor(i / 3), t = e === 0 ? 3 : e - 1, n = e === 0 ? r - 1 : r;
|
|
4646
|
+
return {
|
|
4647
|
+
start: new Date(Date.UTC(n, t * 3, 1, 0, 0, 0, 0)),
|
|
4648
|
+
end: new Date(Date.UTC(n, t * 3 + 3, 0, 23, 59, 59, 999))
|
|
4649
|
+
};
|
|
4650
|
+
}
|
|
4651
|
+
if (n === "last year") return {
|
|
4652
|
+
start: new Date(Date.UTC(r - 1, 0, 1, 0, 0, 0, 0)),
|
|
4653
|
+
end: new Date(Date.UTC(r - 1, 11, 31, 23, 59, 59, 999))
|
|
4654
|
+
};
|
|
4655
|
+
if (n === "last 12 months") {
|
|
4656
|
+
let e = new Date(Date.UTC(r, i - 11, 1, 0, 0, 0, 0)), n = new Date(t);
|
|
4657
|
+
return n.setUTCHours(23, 59, 59, 999), {
|
|
4658
|
+
start: e,
|
|
4659
|
+
end: n
|
|
4660
|
+
};
|
|
4661
|
+
}
|
|
4662
|
+
let l = n.match(/^last\s+(\d+)\s+months?$/);
|
|
4663
|
+
if (l) {
|
|
4664
|
+
let e = parseInt(l[1], 10), n = new Date(Date.UTC(r, i - e + 1, 1, 0, 0, 0, 0)), a = new Date(t);
|
|
4665
|
+
return a.setUTCHours(23, 59, 59, 999), {
|
|
4666
|
+
start: n,
|
|
4667
|
+
end: a
|
|
4668
|
+
};
|
|
4669
|
+
}
|
|
4670
|
+
let u = n.match(/^last\s+(\d+)\s+years?$/);
|
|
4671
|
+
if (u) {
|
|
4672
|
+
let e = parseInt(u[1], 10), n = new Date(Date.UTC(r - e, 0, 1, 0, 0, 0, 0)), i = new Date(t);
|
|
4673
|
+
return i.setUTCHours(23, 59, 59, 999), {
|
|
4674
|
+
start: n,
|
|
4675
|
+
end: i
|
|
4676
|
+
};
|
|
4677
|
+
}
|
|
4678
|
+
return null;
|
|
4679
|
+
}
|
|
4680
|
+
//#endregion
|
|
4566
4681
|
//#region src/server/gap-filler.ts
|
|
4567
|
-
function
|
|
4568
|
-
let r = [], i =
|
|
4569
|
-
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i =
|
|
4682
|
+
function Ct(e, t, n) {
|
|
4683
|
+
let r = [], i = wt(new Date(e), n), a = wt(new Date(t), n);
|
|
4684
|
+
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i = Tt(i, n);
|
|
4570
4685
|
return r;
|
|
4571
4686
|
}
|
|
4572
|
-
function
|
|
4687
|
+
function wt(e, t) {
|
|
4573
4688
|
let n = new Date(e);
|
|
4574
4689
|
switch (t) {
|
|
4575
4690
|
case "second":
|
|
@@ -4603,7 +4718,7 @@ function Ct(e, t) {
|
|
|
4603
4718
|
}
|
|
4604
4719
|
return n;
|
|
4605
4720
|
}
|
|
4606
|
-
function
|
|
4721
|
+
function Tt(e, t) {
|
|
4607
4722
|
let n = new Date(e);
|
|
4608
4723
|
switch (t) {
|
|
4609
4724
|
case "second":
|
|
@@ -4633,7 +4748,7 @@ function wt(e, t) {
|
|
|
4633
4748
|
}
|
|
4634
4749
|
return n;
|
|
4635
4750
|
}
|
|
4636
|
-
function
|
|
4751
|
+
function Et(e) {
|
|
4637
4752
|
if (e instanceof Date) return e.toISOString();
|
|
4638
4753
|
if (typeof e == "string") {
|
|
4639
4754
|
let t = new Date(e);
|
|
@@ -4641,15 +4756,15 @@ function Tt(e) {
|
|
|
4641
4756
|
}
|
|
4642
4757
|
return String(e);
|
|
4643
4758
|
}
|
|
4644
|
-
function
|
|
4759
|
+
function Dt(e, t) {
|
|
4645
4760
|
return t.length === 0 ? "__all__" : t.map((t) => String(e[t] ?? "")).join("|||");
|
|
4646
4761
|
}
|
|
4647
|
-
function
|
|
4648
|
-
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c =
|
|
4762
|
+
function Ot(e, t) {
|
|
4763
|
+
let { timeDimensionKey: n, granularity: r, dateRange: i, fillValue: a, measures: o, dimensions: s } = t, c = Ct(i[0], i[1], r);
|
|
4649
4764
|
if (c.length === 0) return e;
|
|
4650
4765
|
let l = /* @__PURE__ */ new Map();
|
|
4651
4766
|
for (let t of e) {
|
|
4652
|
-
let e =
|
|
4767
|
+
let e = Dt(t, s), r = Et(t[n]);
|
|
4653
4768
|
l.has(e) || l.set(e, /* @__PURE__ */ new Map()), l.get(e).set(r, t);
|
|
4654
4769
|
}
|
|
4655
4770
|
l.size === 0 && s.length === 0 && l.set("__all__", /* @__PURE__ */ new Map());
|
|
@@ -4669,42 +4784,74 @@ function Dt(e, t) {
|
|
|
4669
4784
|
}
|
|
4670
4785
|
return u;
|
|
4671
4786
|
}
|
|
4672
|
-
function
|
|
4787
|
+
function kt(e) {
|
|
4673
4788
|
if (!e) return null;
|
|
4674
4789
|
if (Array.isArray(e)) {
|
|
4675
4790
|
if (e.length < 2) return null;
|
|
4676
4791
|
let t = new Date(e[0]), n = new Date(e[1]);
|
|
4677
4792
|
return isNaN(t.getTime()) || isNaN(n.getTime()) ? null : [t, n];
|
|
4678
4793
|
}
|
|
4679
|
-
let t =
|
|
4680
|
-
|
|
4794
|
+
let t = St(e);
|
|
4795
|
+
if (t) return [t.start, t.end];
|
|
4796
|
+
let n = new Date(e);
|
|
4797
|
+
return isNaN(n.getTime()) ? null : [n, n];
|
|
4681
4798
|
}
|
|
4682
|
-
function
|
|
4799
|
+
function At(e, t, n) {
|
|
4683
4800
|
if (!t.timeDimensions || t.timeDimensions.length === 0) return e;
|
|
4684
4801
|
let r = t.timeDimensions.filter((e) => {
|
|
4685
|
-
let
|
|
4686
|
-
return
|
|
4802
|
+
let n = e.fillMissingDates !== !1, r = !!e.granularity, i = e.dateRange || jt(e.dimension, t.filters);
|
|
4803
|
+
return n && r && i;
|
|
4687
4804
|
});
|
|
4688
4805
|
if (r.length === 0) return e;
|
|
4689
4806
|
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;
|
|
4690
4807
|
for (let e of r) {
|
|
4691
|
-
let
|
|
4692
|
-
if (!
|
|
4693
|
-
let
|
|
4808
|
+
let r = kt(e.dateRange) || Mt(e.dimension, t.filters);
|
|
4809
|
+
if (!r) continue;
|
|
4810
|
+
let a = {
|
|
4694
4811
|
timeDimensionKey: e.dimension,
|
|
4695
4812
|
granularity: e.granularity,
|
|
4696
|
-
dateRange:
|
|
4813
|
+
dateRange: r,
|
|
4697
4814
|
fillValue: i,
|
|
4698
4815
|
measures: n,
|
|
4699
4816
|
dimensions: o
|
|
4700
4817
|
};
|
|
4701
|
-
s =
|
|
4818
|
+
s = Ot(s, a);
|
|
4702
4819
|
}
|
|
4703
4820
|
return s;
|
|
4704
4821
|
}
|
|
4822
|
+
function jt(e, t) {
|
|
4823
|
+
if (!t) return null;
|
|
4824
|
+
for (let n of t) {
|
|
4825
|
+
if ("member" in n && "operator" in n && n.member === e && n.operator === "inDateRange") return n;
|
|
4826
|
+
if ("and" in n && n.and) {
|
|
4827
|
+
let t = jt(e, n.and);
|
|
4828
|
+
if (t) return t;
|
|
4829
|
+
}
|
|
4830
|
+
if ("or" in n && n.or) {
|
|
4831
|
+
let t = jt(e, n.or);
|
|
4832
|
+
if (t) return t;
|
|
4833
|
+
}
|
|
4834
|
+
}
|
|
4835
|
+
return null;
|
|
4836
|
+
}
|
|
4837
|
+
function Mt(e, t) {
|
|
4838
|
+
let n = jt(e, t);
|
|
4839
|
+
if (!n) return null;
|
|
4840
|
+
if (n.dateRange) {
|
|
4841
|
+
let e = kt(n.dateRange);
|
|
4842
|
+
if (e) return e;
|
|
4843
|
+
}
|
|
4844
|
+
let r = n.values;
|
|
4845
|
+
if (!r || r.length === 0) return null;
|
|
4846
|
+
if (r.length === 1 && typeof r[0] == "string") {
|
|
4847
|
+
let e = St(r[0]);
|
|
4848
|
+
return e ? [e.start, e.end] : kt(r);
|
|
4849
|
+
}
|
|
4850
|
+
return r.length >= 2 ? kt(r) : null;
|
|
4851
|
+
}
|
|
4705
4852
|
//#endregion
|
|
4706
4853
|
//#region src/server/builders/comparison-query-builder.ts
|
|
4707
|
-
var
|
|
4854
|
+
var Nt = class {
|
|
4708
4855
|
dateTimeBuilder;
|
|
4709
4856
|
constructor(e) {
|
|
4710
4857
|
this.dateTimeBuilder = new Y(e);
|
|
@@ -4835,7 +4982,7 @@ var At = class {
|
|
|
4835
4982
|
return typeof i == "string" && typeof a == "string" ? new Date(i).getTime() - new Date(a).getTime() : 0;
|
|
4836
4983
|
});
|
|
4837
4984
|
}
|
|
4838
|
-
},
|
|
4985
|
+
}, Pt = class {
|
|
4839
4986
|
filterBuilder;
|
|
4840
4987
|
dateTimeBuilder;
|
|
4841
4988
|
constructor(e) {
|
|
@@ -5028,7 +5175,7 @@ var At = class {
|
|
|
5028
5175
|
a && i.push(a);
|
|
5029
5176
|
}
|
|
5030
5177
|
}
|
|
5031
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : o ?
|
|
5178
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : o ? P(...i) : D`(${D.join(i, D` OR `)})`;
|
|
5032
5179
|
}
|
|
5033
5180
|
let o = e, [s, c] = o.member.split("."), l = o.dateRange !== void 0;
|
|
5034
5181
|
if (o.operator !== "set" && o.operator !== "notSet" && !l && (!o.values || o.values.length === 0 || o.values[0] === void 0 || o.values[0] === "")) return null;
|
|
@@ -5050,11 +5197,11 @@ var At = class {
|
|
|
5050
5197
|
let n = `step_${e.index}`, r = e.cube.sql(t), i = [];
|
|
5051
5198
|
r.where && i.push(r.where), i.push(...e.filterConditions);
|
|
5052
5199
|
let a = t.db.select({
|
|
5053
|
-
binding_key:
|
|
5054
|
-
step_time:
|
|
5200
|
+
binding_key: D`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5201
|
+
step_time: D`MIN(${e.timeExpr})`.as("step_time")
|
|
5055
5202
|
}).from(r.from);
|
|
5056
5203
|
if (a = this.addCrossJoinsToQuery(a, e, t, i), i.length > 0) {
|
|
5057
|
-
let e = i.length === 1 ? i[0] :
|
|
5204
|
+
let e = i.length === 1 ? i[0] : P(...i);
|
|
5058
5205
|
a = a.where(e);
|
|
5059
5206
|
}
|
|
5060
5207
|
return a = a.groupBy(e.bindingKeyExpr), t.db.$with(n).as(a);
|
|
@@ -5062,18 +5209,18 @@ var At = class {
|
|
|
5062
5209
|
buildSubsequentStepCTE(e, t, n) {
|
|
5063
5210
|
let r = `step_${e.index}`, i = `step_${e.index - 1}`, a = e.cube.sql(t), o = [];
|
|
5064
5211
|
a.where && o.push(a.where), o.push(...e.filterConditions);
|
|
5065
|
-
let s =
|
|
5212
|
+
let s = D`${D.identifier(i)}.step_time`, c = D`${e.timeExpr} > ${s}`;
|
|
5066
5213
|
if (e.timeToConvert) {
|
|
5067
5214
|
let t = this.databaseAdapter.buildDateAddInterval(s, e.timeToConvert);
|
|
5068
|
-
c =
|
|
5215
|
+
c = D`${c} AND ${e.timeExpr} <= ${t}`;
|
|
5069
5216
|
}
|
|
5070
5217
|
o.push(c);
|
|
5071
5218
|
let l = t.db.select({
|
|
5072
|
-
binding_key:
|
|
5073
|
-
step_time:
|
|
5074
|
-
}).from(a.from).innerJoin(n,
|
|
5219
|
+
binding_key: D`${e.bindingKeyExpr}`.as("binding_key"),
|
|
5220
|
+
step_time: D`MIN(${e.timeExpr})`.as("step_time")
|
|
5221
|
+
}).from(a.from).innerJoin(n, D`${e.bindingKeyExpr} = ${D.identifier(i)}.binding_key`);
|
|
5075
5222
|
if (l = this.addCrossJoinsToQuery(l, e, t, o), o.length > 0) {
|
|
5076
|
-
let e = o.length === 1 ? o[0] :
|
|
5223
|
+
let e = o.length === 1 ? o[0] : P(...o);
|
|
5077
5224
|
l = l.where(e);
|
|
5078
5225
|
}
|
|
5079
5226
|
return l = l.groupBy(e.bindingKeyExpr), t.db.$with(r).as(l);
|
|
@@ -5082,41 +5229,41 @@ var At = class {
|
|
|
5082
5229
|
if (t.joinedCubes.length === 0) return e;
|
|
5083
5230
|
for (let i of t.joinedCubes) for (let t of i.joinPath) {
|
|
5084
5231
|
let a = t.joinDef, o = [];
|
|
5085
|
-
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(
|
|
5086
|
-
let s = o.length === 1 ? o[0] :
|
|
5232
|
+
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(M(e.source, e.target));
|
|
5233
|
+
let s = o.length === 1 ? o[0] : P(...o), c = i.cube.sql(n);
|
|
5087
5234
|
e = e.leftJoin(c.from, s), c.where && r.push(c.where);
|
|
5088
5235
|
}
|
|
5089
5236
|
return e;
|
|
5090
5237
|
}
|
|
5091
5238
|
buildFunnelResultsCTE(e, t, n, r) {
|
|
5092
5239
|
let i = {
|
|
5093
|
-
binding_key:
|
|
5094
|
-
step_0_time:
|
|
5240
|
+
binding_key: D`s0.binding_key`,
|
|
5241
|
+
step_0_time: D`s0.step_time`
|
|
5095
5242
|
};
|
|
5096
|
-
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] =
|
|
5097
|
-
let a =
|
|
5098
|
-
for (let e = 1; e < t.length; e++) a =
|
|
5099
|
-
LEFT JOIN ${
|
|
5100
|
-
let o = Object.entries(i).map(([e, t]) =>
|
|
5243
|
+
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] = D`s${D.raw(String(e))}.step_time`;
|
|
5244
|
+
let a = D`${D.identifier("step_0")} s0`;
|
|
5245
|
+
for (let e = 1; e < t.length; e++) a = D`${a}
|
|
5246
|
+
LEFT JOIN ${D.identifier(`step_${e}`)} s${D.raw(String(e))} ON s0.binding_key = s${D.raw(String(e))}.binding_key`;
|
|
5247
|
+
let o = Object.entries(i).map(([e, t]) => D`${t} AS ${D.identifier(e)}`), s = D`SELECT ${D.join(o, D`, `)} FROM ${a}`;
|
|
5101
5248
|
return r.db.$with("funnel_joined").as(s);
|
|
5102
5249
|
}
|
|
5103
5250
|
buildAggregationCTE(e, t, n, r, i) {
|
|
5104
5251
|
let a = {};
|
|
5105
|
-
a.step_0_count =
|
|
5106
|
-
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] =
|
|
5252
|
+
a.step_0_count = D`COUNT(*)`.as("step_0_count");
|
|
5253
|
+
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] = D`COUNT(${D.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);
|
|
5107
5254
|
if (r.includeTimeMetrics) for (let e = 1; e < n.length; e++) {
|
|
5108
|
-
let t =
|
|
5255
|
+
let t = D.identifier(`step_${e}_time`), n = D.identifier(`step_${e - 1}_time`), r = this.databaseAdapter.buildTimeDifferenceSeconds(D`${t}`, D`${n}`), i = D`${t} IS NOT NULL`;
|
|
5109
5256
|
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) {
|
|
5110
5257
|
let n = this.databaseAdapter.buildPercentile(r, 50);
|
|
5111
|
-
n && (a[`step_${e}_median_seconds`] =
|
|
5258
|
+
n && (a[`step_${e}_median_seconds`] = D`(SELECT ${n} FROM ${D.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));
|
|
5112
5259
|
let i = this.databaseAdapter.buildPercentile(r, 90);
|
|
5113
|
-
i && (a[`step_${e}_p90_seconds`] =
|
|
5260
|
+
i && (a[`step_${e}_p90_seconds`] = D`(SELECT ${i} FROM ${D.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`));
|
|
5114
5261
|
}
|
|
5115
5262
|
}
|
|
5116
5263
|
let o = i.db.select(a).from(e);
|
|
5117
5264
|
return i.db.$with("funnel_metrics").as(o);
|
|
5118
5265
|
}
|
|
5119
|
-
},
|
|
5266
|
+
}, Ft = class {
|
|
5120
5267
|
filterBuilder;
|
|
5121
5268
|
dateTimeBuilder;
|
|
5122
5269
|
databaseAdapter;
|
|
@@ -5283,7 +5430,7 @@ var At = class {
|
|
|
5283
5430
|
let r = this.buildFilterCondition(e, t, n);
|
|
5284
5431
|
r && i.push(r);
|
|
5285
5432
|
}
|
|
5286
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ?
|
|
5433
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : "and" in e ? P(...i) : D`(${D.join(i, D` OR `)})`;
|
|
5287
5434
|
}
|
|
5288
5435
|
if ("type" in e && "filters" in e) {
|
|
5289
5436
|
let r = e, i = [];
|
|
@@ -5291,7 +5438,7 @@ var At = class {
|
|
|
5291
5438
|
let r = this.buildFilterCondition(e, t, n);
|
|
5292
5439
|
r && i.push(r);
|
|
5293
5440
|
}
|
|
5294
|
-
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ?
|
|
5441
|
+
return i.length === 0 ? null : i.length === 1 ? i[0] : r.type === "and" ? P(...i) : D`(${D.join(i, D` OR `)})`;
|
|
5295
5442
|
}
|
|
5296
5443
|
let r = e, [, i] = r.member.split("."), a = t.dimensions?.[i];
|
|
5297
5444
|
if (!a) return null;
|
|
@@ -5302,13 +5449,13 @@ var At = class {
|
|
|
5302
5449
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o, startingStepFilters: s } = t, c = [];
|
|
5303
5450
|
r.where && c.push(r.where), c.push(...s);
|
|
5304
5451
|
let l = n.db.select({
|
|
5305
|
-
binding_key:
|
|
5306
|
-
start_time:
|
|
5307
|
-
event_type:
|
|
5308
|
-
event_path:
|
|
5452
|
+
binding_key: D`${i}`.as("binding_key"),
|
|
5453
|
+
start_time: D`MIN(${a})`.as("start_time"),
|
|
5454
|
+
event_type: D`${o}`.as("event_type"),
|
|
5455
|
+
event_path: D`${o}`.as("event_path")
|
|
5309
5456
|
}).from(r.from);
|
|
5310
5457
|
if (c.length > 0) {
|
|
5311
|
-
let e = c.length === 1 ? c[0] :
|
|
5458
|
+
let e = c.length === 1 ? c[0] : P(...c);
|
|
5312
5459
|
l = l.where(e);
|
|
5313
5460
|
}
|
|
5314
5461
|
return l = l.groupBy(i, o), e.entityLimit && (l = l.limit(e.entityLimit)), n.db.$with("starting_entities").as(l);
|
|
@@ -5317,18 +5464,18 @@ var At = class {
|
|
|
5317
5464
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5318
5465
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
5319
5466
|
let e = t === 1 ? "starting_entities" : `before_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `before_step_${t}`, d = [];
|
|
5320
|
-
r.where && d.push(r.where), d.push(
|
|
5321
|
-
let f = d.length === 1 ? d[0] :
|
|
5322
|
-
binding_key:
|
|
5323
|
-
step_time:
|
|
5324
|
-
event_type:
|
|
5467
|
+
r.where && d.push(r.where), d.push(D`${i} = ${D.identifier(e)}.binding_key`, D`${a} < ${D.identifier(e)}.${D.identifier(l)}`);
|
|
5468
|
+
let f = d.length === 1 ? d[0] : P(...d), p = c ? D`${o} || ${"→"} || ${D.identifier(e)}.event_path` : D`${o}`, m = n.db.select({
|
|
5469
|
+
binding_key: D`${i}`.as("binding_key"),
|
|
5470
|
+
step_time: D`${a}`.as("step_time"),
|
|
5471
|
+
event_type: D`${o}`.as("event_type"),
|
|
5325
5472
|
event_path: p.as("event_path")
|
|
5326
|
-
}).from(r.from).where(f).orderBy(
|
|
5327
|
-
binding_key:
|
|
5328
|
-
step_time:
|
|
5329
|
-
event_type:
|
|
5330
|
-
event_path:
|
|
5331
|
-
}).from(
|
|
5473
|
+
}).from(r.from).where(f).orderBy(D`${a} DESC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5474
|
+
binding_key: D`e.binding_key`.as("binding_key"),
|
|
5475
|
+
step_time: D`e.step_time`.as("step_time"),
|
|
5476
|
+
event_type: D`e.event_type`.as("event_type"),
|
|
5477
|
+
event_path: D`e.event_path`.as("event_path")
|
|
5478
|
+
}).from(D`${D.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
5332
5479
|
s.push(h);
|
|
5333
5480
|
}
|
|
5334
5481
|
return s;
|
|
@@ -5337,18 +5484,18 @@ var At = class {
|
|
|
5337
5484
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5338
5485
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5339
5486
|
let e = t === 1 ? "starting_entities" : `after_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `after_step_${t}`, d = [];
|
|
5340
|
-
r.where && d.push(r.where), d.push(
|
|
5341
|
-
let f = d.length === 1 ? d[0] :
|
|
5342
|
-
binding_key:
|
|
5343
|
-
step_time:
|
|
5344
|
-
event_type:
|
|
5487
|
+
r.where && d.push(r.where), d.push(D`${i} = ${D.identifier(e)}.binding_key`, D`${a} > ${D.identifier(e)}.${D.identifier(l)}`);
|
|
5488
|
+
let f = d.length === 1 ? d[0] : P(...d), p = c ? D`${D.identifier(e)}.event_path || ${"→"} || ${o}` : D`${o}`, m = n.db.select({
|
|
5489
|
+
binding_key: D`${i}`.as("binding_key"),
|
|
5490
|
+
step_time: D`${a}`.as("step_time"),
|
|
5491
|
+
event_type: D`${o}`.as("event_type"),
|
|
5345
5492
|
event_path: p.as("event_path")
|
|
5346
|
-
}).from(r.from).where(f).orderBy(
|
|
5347
|
-
binding_key:
|
|
5348
|
-
step_time:
|
|
5349
|
-
event_type:
|
|
5350
|
-
event_path:
|
|
5351
|
-
}).from(
|
|
5493
|
+
}).from(r.from).where(f).orderBy(D`${a} ASC`).limit(1), h = n.db.$with(u).as(n.db.select({
|
|
5494
|
+
binding_key: D`e.binding_key`.as("binding_key"),
|
|
5495
|
+
step_time: D`e.step_time`.as("step_time"),
|
|
5496
|
+
event_type: D`e.event_type`.as("event_type"),
|
|
5497
|
+
event_path: D`e.event_path`.as("event_path")
|
|
5498
|
+
}).from(D`${D.identifier(e)}`).crossJoinLateral(m.as("e")));
|
|
5352
5499
|
s.push(h);
|
|
5353
5500
|
}
|
|
5354
5501
|
return s;
|
|
@@ -5357,19 +5504,19 @@ var At = class {
|
|
|
5357
5504
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5358
5505
|
for (let t = 1; t <= e.stepsBefore; t++) {
|
|
5359
5506
|
let e = t === 1 ? "starting_entities" : `before_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `before_step_${t}`, d = [];
|
|
5360
|
-
r.where && d.push(r.where), d.push(
|
|
5361
|
-
let f = d.length === 1 ? d[0] :
|
|
5362
|
-
binding_key:
|
|
5363
|
-
step_time:
|
|
5364
|
-
event_type:
|
|
5507
|
+
r.where && d.push(r.where), d.push(D`${a} < ${D.identifier(e)}.${D.identifier(l)}`);
|
|
5508
|
+
let f = d.length === 1 ? d[0] : P(...d), p = c ? D`${o} || ${"→"} || ${D.identifier(e)}.event_path` : D`${o}`, m = n.db.select({
|
|
5509
|
+
binding_key: D`${i}`.as("binding_key"),
|
|
5510
|
+
step_time: D`${a}`.as("step_time"),
|
|
5511
|
+
event_type: D`${o}`.as("event_type"),
|
|
5365
5512
|
event_path: p.as("event_path"),
|
|
5366
|
-
rn:
|
|
5367
|
-
}).from(r.from).innerJoin(
|
|
5368
|
-
binding_key:
|
|
5369
|
-
step_time:
|
|
5370
|
-
event_type:
|
|
5371
|
-
event_path:
|
|
5372
|
-
}).from(m.as("ranked")).where(
|
|
5513
|
+
rn: D`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as("rn")
|
|
5514
|
+
}).from(r.from).innerJoin(D`${D.identifier(e)}`, D`${i} = ${D.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5515
|
+
binding_key: D`binding_key`.as("binding_key"),
|
|
5516
|
+
step_time: D`step_time`.as("step_time"),
|
|
5517
|
+
event_type: D`event_type`.as("event_type"),
|
|
5518
|
+
event_path: D`event_path`.as("event_path")
|
|
5519
|
+
}).from(m.as("ranked")).where(D`rn = 1`);
|
|
5373
5520
|
s.push(n.db.$with(u).as(h));
|
|
5374
5521
|
}
|
|
5375
5522
|
return s;
|
|
@@ -5378,19 +5525,19 @@ var At = class {
|
|
|
5378
5525
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o } = t, s = [], c = e.outputMode === "sunburst";
|
|
5379
5526
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5380
5527
|
let e = t === 1 ? "starting_entities" : `after_step_${t - 1}`, l = t === 1 ? "start_time" : "step_time", u = `after_step_${t}`, d = [];
|
|
5381
|
-
r.where && d.push(r.where), d.push(
|
|
5382
|
-
let f = d.length === 1 ? d[0] :
|
|
5383
|
-
binding_key:
|
|
5384
|
-
step_time:
|
|
5385
|
-
event_type:
|
|
5528
|
+
r.where && d.push(r.where), d.push(D`${a} > ${D.identifier(e)}.${D.identifier(l)}`);
|
|
5529
|
+
let f = d.length === 1 ? d[0] : P(...d), p = c ? D`${D.identifier(e)}.event_path || ${"→"} || ${o}` : D`${o}`, m = n.db.select({
|
|
5530
|
+
binding_key: D`${i}`.as("binding_key"),
|
|
5531
|
+
step_time: D`${a}`.as("step_time"),
|
|
5532
|
+
event_type: D`${o}`.as("event_type"),
|
|
5386
5533
|
event_path: p.as("event_path"),
|
|
5387
|
-
rn:
|
|
5388
|
-
}).from(r.from).innerJoin(
|
|
5389
|
-
binding_key:
|
|
5390
|
-
step_time:
|
|
5391
|
-
event_type:
|
|
5392
|
-
event_path:
|
|
5393
|
-
}).from(m.as("ranked")).where(
|
|
5534
|
+
rn: D`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as("rn")
|
|
5535
|
+
}).from(r.from).innerJoin(D`${D.identifier(e)}`, D`${i} = ${D.identifier(e)}.binding_key`).where(f), h = n.db.select({
|
|
5536
|
+
binding_key: D`binding_key`.as("binding_key"),
|
|
5537
|
+
step_time: D`step_time`.as("step_time"),
|
|
5538
|
+
event_type: D`event_type`.as("event_type"),
|
|
5539
|
+
event_path: D`event_path`.as("event_path")
|
|
5540
|
+
}).from(m.as("ranked")).where(D`rn = 1`);
|
|
5394
5541
|
s.push(n.db.$with(u).as(h));
|
|
5395
5542
|
}
|
|
5396
5543
|
return s;
|
|
@@ -5399,27 +5546,27 @@ var At = class {
|
|
|
5399
5546
|
let n = [], r = e.outputMode === "sunburst";
|
|
5400
5547
|
for (let t = e.stepsBefore; t >= 1; t--) {
|
|
5401
5548
|
let e = -t, i = `before_step_${t}`;
|
|
5402
|
-
r ? n.push(
|
|
5549
|
+
r ? n.push(D`
|
|
5403
5550
|
SELECT
|
|
5404
|
-
${
|
|
5551
|
+
${D.raw(`'before_${t}_'`)} || event_path AS node_id,
|
|
5405
5552
|
event_type AS name,
|
|
5406
|
-
${
|
|
5553
|
+
${D.raw(String(e))} AS layer,
|
|
5407
5554
|
COUNT(*) AS value
|
|
5408
|
-
FROM ${
|
|
5555
|
+
FROM ${D.identifier(i)}
|
|
5409
5556
|
GROUP BY event_path, event_type
|
|
5410
|
-
`) : n.push(
|
|
5557
|
+
`) : n.push(D`
|
|
5411
5558
|
SELECT
|
|
5412
|
-
${
|
|
5559
|
+
${D.raw(`'before_${t}_'`)} || event_type AS node_id,
|
|
5413
5560
|
event_type AS name,
|
|
5414
|
-
${
|
|
5561
|
+
${D.raw(String(e))} AS layer,
|
|
5415
5562
|
COUNT(*) AS value
|
|
5416
|
-
FROM ${
|
|
5563
|
+
FROM ${D.identifier(i)}
|
|
5417
5564
|
GROUP BY event_type
|
|
5418
5565
|
`);
|
|
5419
5566
|
}
|
|
5420
|
-
n.push(
|
|
5567
|
+
n.push(D`
|
|
5421
5568
|
SELECT
|
|
5422
|
-
${
|
|
5569
|
+
${D.raw("'start_'")} || event_type AS node_id,
|
|
5423
5570
|
event_type AS name,
|
|
5424
5571
|
0 AS layer,
|
|
5425
5572
|
COUNT(*) AS value
|
|
@@ -5428,82 +5575,82 @@ var At = class {
|
|
|
5428
5575
|
`);
|
|
5429
5576
|
for (let t = 1; t <= e.stepsAfter; t++) {
|
|
5430
5577
|
let e = t, i = `after_step_${t}`;
|
|
5431
|
-
r ? n.push(
|
|
5578
|
+
r ? n.push(D`
|
|
5432
5579
|
SELECT
|
|
5433
|
-
${
|
|
5580
|
+
${D.raw(`'after_${t}_'`)} || event_path AS node_id,
|
|
5434
5581
|
event_type AS name,
|
|
5435
|
-
${
|
|
5582
|
+
${D.raw(String(e))} AS layer,
|
|
5436
5583
|
COUNT(*) AS value
|
|
5437
|
-
FROM ${
|
|
5584
|
+
FROM ${D.identifier(i)}
|
|
5438
5585
|
GROUP BY event_path, event_type
|
|
5439
|
-
`) : n.push(
|
|
5586
|
+
`) : n.push(D`
|
|
5440
5587
|
SELECT
|
|
5441
|
-
${
|
|
5588
|
+
${D.raw(`'after_${t}_'`)} || event_type AS node_id,
|
|
5442
5589
|
event_type AS name,
|
|
5443
|
-
${
|
|
5590
|
+
${D.raw(String(e))} AS layer,
|
|
5444
5591
|
COUNT(*) AS value
|
|
5445
|
-
FROM ${
|
|
5592
|
+
FROM ${D.identifier(i)}
|
|
5446
5593
|
GROUP BY event_type
|
|
5447
5594
|
`);
|
|
5448
5595
|
}
|
|
5449
|
-
let i =
|
|
5450
|
-
node_id:
|
|
5451
|
-
name:
|
|
5452
|
-
layer:
|
|
5453
|
-
value:
|
|
5454
|
-
}).from(
|
|
5596
|
+
let i = D.join(n, D` UNION ALL `), a = t.db.select({
|
|
5597
|
+
node_id: D`node_id`.as("node_id"),
|
|
5598
|
+
name: D`name`.as("name"),
|
|
5599
|
+
layer: D`layer`.as("layer"),
|
|
5600
|
+
value: D`value`.as("value")
|
|
5601
|
+
}).from(D`(${i}) AS nodes_union`);
|
|
5455
5602
|
return t.db.$with("nodes_agg").as(a);
|
|
5456
5603
|
}
|
|
5457
5604
|
buildLinksAggregationCTE(e, t) {
|
|
5458
5605
|
let n = [], r = e.outputMode === "sunburst";
|
|
5459
5606
|
for (let t = e.stepsBefore; t >= 2; t--) {
|
|
5460
5607
|
let e = `before_step_${t}`, i = `before_step_${t - 1}`;
|
|
5461
|
-
r ? n.push(
|
|
5608
|
+
r ? n.push(D`
|
|
5462
5609
|
SELECT
|
|
5463
|
-
${
|
|
5464
|
-
${
|
|
5610
|
+
${D.raw(`'before_${t}_'`)} || f.event_path AS source_id,
|
|
5611
|
+
${D.raw(`'before_${t - 1}_'`)} || t.event_path AS target_id,
|
|
5465
5612
|
COUNT(*) AS value
|
|
5466
|
-
FROM ${
|
|
5467
|
-
INNER JOIN ${
|
|
5613
|
+
FROM ${D.identifier(e)} f
|
|
5614
|
+
INNER JOIN ${D.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5468
5615
|
GROUP BY f.event_path, t.event_path
|
|
5469
|
-
`) : n.push(
|
|
5616
|
+
`) : n.push(D`
|
|
5470
5617
|
SELECT
|
|
5471
|
-
${
|
|
5472
|
-
${
|
|
5618
|
+
${D.raw(`'before_${t}_'`)} || f.event_type AS source_id,
|
|
5619
|
+
${D.raw(`'before_${t - 1}_'`)} || t.event_type AS target_id,
|
|
5473
5620
|
COUNT(*) AS value
|
|
5474
|
-
FROM ${
|
|
5475
|
-
INNER JOIN ${
|
|
5621
|
+
FROM ${D.identifier(e)} f
|
|
5622
|
+
INNER JOIN ${D.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5476
5623
|
GROUP BY f.event_type, t.event_type
|
|
5477
5624
|
`);
|
|
5478
5625
|
}
|
|
5479
|
-
e.stepsBefore >= 1 && (r ? n.push(
|
|
5626
|
+
e.stepsBefore >= 1 && (r ? n.push(D`
|
|
5480
5627
|
SELECT
|
|
5481
|
-
${
|
|
5482
|
-
${
|
|
5628
|
+
${D.raw("'before_1_'")} || b.event_path AS source_id,
|
|
5629
|
+
${D.raw("'start_'")} || s.event_type AS target_id,
|
|
5483
5630
|
COUNT(*) AS value
|
|
5484
5631
|
FROM before_step_1 b
|
|
5485
5632
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5486
5633
|
GROUP BY b.event_path, s.event_type
|
|
5487
|
-
`) : n.push(
|
|
5634
|
+
`) : n.push(D`
|
|
5488
5635
|
SELECT
|
|
5489
|
-
${
|
|
5490
|
-
${
|
|
5636
|
+
${D.raw("'before_1_'")} || b.event_type AS source_id,
|
|
5637
|
+
${D.raw("'start_'")} || s.event_type AS target_id,
|
|
5491
5638
|
COUNT(*) AS value
|
|
5492
5639
|
FROM before_step_1 b
|
|
5493
5640
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5494
5641
|
GROUP BY b.event_type, s.event_type
|
|
5495
|
-
`)), e.stepsAfter >= 1 && (r ? n.push(
|
|
5642
|
+
`)), e.stepsAfter >= 1 && (r ? n.push(D`
|
|
5496
5643
|
SELECT
|
|
5497
|
-
${
|
|
5498
|
-
${
|
|
5644
|
+
${D.raw("'start_'")} || s.event_type AS source_id,
|
|
5645
|
+
${D.raw("'after_1_'")} || a.event_path AS target_id,
|
|
5499
5646
|
COUNT(*) AS value
|
|
5500
5647
|
FROM starting_entities s
|
|
5501
5648
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
5502
5649
|
GROUP BY s.event_type, a.event_path
|
|
5503
|
-
`) : n.push(
|
|
5650
|
+
`) : n.push(D`
|
|
5504
5651
|
SELECT
|
|
5505
|
-
${
|
|
5506
|
-
${
|
|
5652
|
+
${D.raw("'start_'")} || s.event_type AS source_id,
|
|
5653
|
+
${D.raw("'after_1_'")} || a.event_type AS target_id,
|
|
5507
5654
|
COUNT(*) AS value
|
|
5508
5655
|
FROM starting_entities s
|
|
5509
5656
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
@@ -5511,41 +5658,41 @@ var At = class {
|
|
|
5511
5658
|
`));
|
|
5512
5659
|
for (let t = 1; t < e.stepsAfter; t++) {
|
|
5513
5660
|
let e = `after_step_${t}`, i = `after_step_${t + 1}`;
|
|
5514
|
-
r ? n.push(
|
|
5661
|
+
r ? n.push(D`
|
|
5515
5662
|
SELECT
|
|
5516
|
-
${
|
|
5517
|
-
${
|
|
5663
|
+
${D.raw(`'after_${t}_'`)} || f.event_path AS source_id,
|
|
5664
|
+
${D.raw(`'after_${t + 1}_'`)} || t.event_path AS target_id,
|
|
5518
5665
|
COUNT(*) AS value
|
|
5519
|
-
FROM ${
|
|
5520
|
-
INNER JOIN ${
|
|
5666
|
+
FROM ${D.identifier(e)} f
|
|
5667
|
+
INNER JOIN ${D.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5521
5668
|
GROUP BY f.event_path, t.event_path
|
|
5522
|
-
`) : n.push(
|
|
5669
|
+
`) : n.push(D`
|
|
5523
5670
|
SELECT
|
|
5524
|
-
${
|
|
5525
|
-
${
|
|
5671
|
+
${D.raw(`'after_${t}_'`)} || f.event_type AS source_id,
|
|
5672
|
+
${D.raw(`'after_${t + 1}_'`)} || t.event_type AS target_id,
|
|
5526
5673
|
COUNT(*) AS value
|
|
5527
|
-
FROM ${
|
|
5528
|
-
INNER JOIN ${
|
|
5674
|
+
FROM ${D.identifier(e)} f
|
|
5675
|
+
INNER JOIN ${D.identifier(i)} t ON f.binding_key = t.binding_key
|
|
5529
5676
|
GROUP BY f.event_type, t.event_type
|
|
5530
5677
|
`);
|
|
5531
5678
|
}
|
|
5532
5679
|
if (n.length === 0) {
|
|
5533
5680
|
let e = t.db.select({
|
|
5534
|
-
source_id:
|
|
5535
|
-
target_id:
|
|
5536
|
-
value:
|
|
5537
|
-
}).from(
|
|
5681
|
+
source_id: D`NULL`.as("source_id"),
|
|
5682
|
+
target_id: D`NULL`.as("target_id"),
|
|
5683
|
+
value: D`0`.as("value")
|
|
5684
|
+
}).from(D`(SELECT 1) AS empty`).where(D`1 = 0`);
|
|
5538
5685
|
return t.db.$with("links_agg").as(e);
|
|
5539
5686
|
}
|
|
5540
|
-
let i =
|
|
5541
|
-
source_id:
|
|
5542
|
-
target_id:
|
|
5543
|
-
value:
|
|
5544
|
-
}).from(
|
|
5687
|
+
let i = D.join(n, D` UNION ALL `), a = t.db.select({
|
|
5688
|
+
source_id: D`source_id`.as("source_id"),
|
|
5689
|
+
target_id: D`target_id`.as("target_id"),
|
|
5690
|
+
value: D`value`.as("value")
|
|
5691
|
+
}).from(D`(${i}) AS links_union`);
|
|
5545
5692
|
return t.db.$with("links_agg").as(a);
|
|
5546
5693
|
}
|
|
5547
5694
|
buildFinalResultCTE(e) {
|
|
5548
|
-
let t =
|
|
5695
|
+
let t = D`
|
|
5549
5696
|
SELECT
|
|
5550
5697
|
'node' AS record_type,
|
|
5551
5698
|
node_id AS id,
|
|
@@ -5567,40 +5714,40 @@ var At = class {
|
|
|
5567
5714
|
FROM links_agg
|
|
5568
5715
|
WHERE source_id IS NOT NULL
|
|
5569
5716
|
`, n = e.db.select({
|
|
5570
|
-
record_type:
|
|
5571
|
-
id:
|
|
5572
|
-
name:
|
|
5573
|
-
layer:
|
|
5574
|
-
value:
|
|
5575
|
-
source_id:
|
|
5576
|
-
target_id:
|
|
5577
|
-
}).from(
|
|
5717
|
+
record_type: D`record_type`.as("record_type"),
|
|
5718
|
+
id: D`id`.as("id"),
|
|
5719
|
+
name: D`name`.as("name"),
|
|
5720
|
+
layer: D`layer`.as("layer"),
|
|
5721
|
+
value: D`value`.as("value"),
|
|
5722
|
+
source_id: D`source_id`.as("source_id"),
|
|
5723
|
+
target_id: D`target_id`.as("target_id")
|
|
5724
|
+
}).from(D`(${t}) AS final_union`);
|
|
5578
5725
|
return e.db.$with("final_result").as(n);
|
|
5579
5726
|
}
|
|
5580
5727
|
};
|
|
5581
5728
|
//#endregion
|
|
5582
5729
|
//#region src/server/types/retention.ts
|
|
5583
|
-
function
|
|
5730
|
+
function It(e) {
|
|
5584
5731
|
return Array.isArray(e);
|
|
5585
5732
|
}
|
|
5586
|
-
function
|
|
5733
|
+
function Lt(e) {
|
|
5587
5734
|
return typeof e == "object" && !!e && "cube" in e;
|
|
5588
5735
|
}
|
|
5589
|
-
function
|
|
5590
|
-
if (
|
|
5736
|
+
function Rt(e) {
|
|
5737
|
+
if (Lt(e)) return e.cube;
|
|
5591
5738
|
let t = e.indexOf(".");
|
|
5592
5739
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5593
5740
|
return e.substring(0, t);
|
|
5594
5741
|
}
|
|
5595
|
-
function
|
|
5596
|
-
if (
|
|
5742
|
+
function zt(e) {
|
|
5743
|
+
if (Lt(e)) return e.dimension;
|
|
5597
5744
|
let t = e.indexOf(".");
|
|
5598
5745
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5599
5746
|
return e.substring(t + 1);
|
|
5600
5747
|
}
|
|
5601
5748
|
//#endregion
|
|
5602
5749
|
//#region src/server/builders/retention-query-builder.ts
|
|
5603
|
-
var
|
|
5750
|
+
var Bt = class {
|
|
5604
5751
|
filterBuilder;
|
|
5605
5752
|
dateTimeBuilder;
|
|
5606
5753
|
constructor(e) {
|
|
@@ -5612,12 +5759,12 @@ var Lt = class {
|
|
|
5612
5759
|
validateConfig(e, t) {
|
|
5613
5760
|
let n = [];
|
|
5614
5761
|
try {
|
|
5615
|
-
let r =
|
|
5762
|
+
let r = Rt(e.timeDimension), i = zt(e.timeDimension), a = t.get(r);
|
|
5616
5763
|
a ? a.dimensions?.[i] || n.push(`Time dimension not found: ${i} in cube ${r}`) : n.push(`Cube not found: ${r}`);
|
|
5617
5764
|
} catch {
|
|
5618
5765
|
n.push(`Invalid time dimension format: ${e.timeDimension}`);
|
|
5619
5766
|
}
|
|
5620
|
-
if (
|
|
5767
|
+
if (It(e.bindingKey)) for (let r of e.bindingKey) {
|
|
5621
5768
|
let e = t.get(r.cube);
|
|
5622
5769
|
if (!e) n.push(`Binding key mapping cube not found: ${r.cube}`);
|
|
5623
5770
|
else {
|
|
@@ -5669,20 +5816,20 @@ var Lt = class {
|
|
|
5669
5816
|
}
|
|
5670
5817
|
buildRetentionQuery(e, t, n) {
|
|
5671
5818
|
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 = {
|
|
5672
|
-
period:
|
|
5673
|
-
cohort_size:
|
|
5674
|
-
retained_users:
|
|
5675
|
-
retention_rate:
|
|
5819
|
+
period: D`rc.period_number`.as("period"),
|
|
5820
|
+
cohort_size: D`cs.cohort_size`.as("cohort_size"),
|
|
5821
|
+
retained_users: D`rc.retained_users`.as("retained_users"),
|
|
5822
|
+
retention_rate: D`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as("retention_rate")
|
|
5676
5823
|
};
|
|
5677
|
-
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] =
|
|
5678
|
-
let d = n.db.with(a, o, s, c).select(u).from(
|
|
5824
|
+
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] = D.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5825
|
+
let d = n.db.with(a, o, s, c).select(u).from(D`retention_counts rc`);
|
|
5679
5826
|
if (l) {
|
|
5680
|
-
let e = r.breakdowns.map((e, t) =>
|
|
5681
|
-
d = d.innerJoin(
|
|
5682
|
-
} else d = d.innerJoin(
|
|
5827
|
+
let e = r.breakdowns.map((e, t) => D`COALESCE(CAST(rc.breakdown_${D.raw(String(t))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${D.raw(String(t))} AS TEXT), '')`), t = e.length === 1 ? e[0] : D.join(e, D` AND `);
|
|
5828
|
+
d = d.innerJoin(D`cohort_sizes cs`, t);
|
|
5829
|
+
} else d = d.innerJoin(D`cohort_sizes cs`, D`1 = 1`);
|
|
5683
5830
|
let f = [];
|
|
5684
|
-
for (let e = 0; e < r.breakdowns.length; e++) f.push(
|
|
5685
|
-
return f.push(
|
|
5831
|
+
for (let e = 0; e < r.breakdowns.length; e++) f.push(D.raw(`rc.breakdown_${e}`));
|
|
5832
|
+
return f.push(D`rc.period_number`), d = d.orderBy(...f), d;
|
|
5686
5833
|
}
|
|
5687
5834
|
transformResult(e, t) {
|
|
5688
5835
|
let n = t.breakdownDimensions || [], r = Math.min(n.length, 100), i = r > 0;
|
|
@@ -5705,7 +5852,7 @@ var Lt = class {
|
|
|
5705
5852
|
});
|
|
5706
5853
|
}
|
|
5707
5854
|
resolveConfig(e, t, n) {
|
|
5708
|
-
let r =
|
|
5855
|
+
let r = Rt(e.timeDimension), i = zt(e.timeDimension), a = t.get(r);
|
|
5709
5856
|
if (!a) throw Error(`Cube not found: ${r}`);
|
|
5710
5857
|
let o = a.dimensions?.[i];
|
|
5711
5858
|
if (!o) throw Error(`Time dimension not found: ${i}`);
|
|
@@ -5730,7 +5877,7 @@ var Lt = class {
|
|
|
5730
5877
|
};
|
|
5731
5878
|
}
|
|
5732
5879
|
resolveBindingKey(e, t, n, r) {
|
|
5733
|
-
if (
|
|
5880
|
+
if (It(e)) {
|
|
5734
5881
|
let i = e.find((e) => e.cube === t.name);
|
|
5735
5882
|
if (!i) throw Error(`No binding key mapping found for cube: ${t.name}`);
|
|
5736
5883
|
let a = this.extractDimensionName(i.dimension), o = n.get(i.cube);
|
|
@@ -5761,7 +5908,7 @@ var Lt = class {
|
|
|
5761
5908
|
let i = this.buildSingleFilterCondition(e, t, n, r);
|
|
5762
5909
|
i && a.push(i);
|
|
5763
5910
|
}
|
|
5764
|
-
return a.length === 0 ? null : a.length === 1 ? a[0] : o ?
|
|
5911
|
+
return a.length === 0 ? null : a.length === 1 ? a[0] : o ? P(...a) : D`(${D.join(a, D` OR `)})`;
|
|
5765
5912
|
}
|
|
5766
5913
|
let i = e, [a, o] = i.member.split("."), s = n.get(a);
|
|
5767
5914
|
if (!s) return null;
|
|
@@ -5777,16 +5924,16 @@ var Lt = class {
|
|
|
5777
5924
|
i.push(n);
|
|
5778
5925
|
}
|
|
5779
5926
|
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = {
|
|
5780
|
-
binding_key:
|
|
5781
|
-
cohort_entry:
|
|
5927
|
+
binding_key: D`${t.bindingKeyExpr}`.as("binding_key"),
|
|
5928
|
+
cohort_entry: D`MIN(${a})`.as("cohort_entry")
|
|
5782
5929
|
};
|
|
5783
5930
|
for (let e = 0; e < t.breakdowns.length; e++) {
|
|
5784
5931
|
let { expr: n } = t.breakdowns[e];
|
|
5785
|
-
o[`breakdown_${e}`] =
|
|
5932
|
+
o[`breakdown_${e}`] = D`MIN(${n})`.as(`breakdown_${e}`);
|
|
5786
5933
|
}
|
|
5787
5934
|
let s = n.db.select(o).from(r.from);
|
|
5788
5935
|
if (i.length > 0) {
|
|
5789
|
-
let e = i.length === 1 ? i[0] :
|
|
5936
|
+
let e = i.length === 1 ? i[0] : P(...i);
|
|
5790
5937
|
s = s.where(e);
|
|
5791
5938
|
}
|
|
5792
5939
|
let c = [t.bindingKeyExpr];
|
|
@@ -5798,36 +5945,36 @@ var Lt = class {
|
|
|
5798
5945
|
return n.db.$with("cohort_base").as(s);
|
|
5799
5946
|
}
|
|
5800
5947
|
buildDateRangeCondition(e, t) {
|
|
5801
|
-
return
|
|
5948
|
+
return D`${e} >= ${t.start}::date AND ${e} < (${t.end}::date + interval '1 day')`;
|
|
5802
5949
|
}
|
|
5803
5950
|
buildDateRangeHavingCondition(e, t) {
|
|
5804
|
-
return
|
|
5951
|
+
return D`MIN(${e}) >= ${t.start}::date AND MIN(${e}) < (${t.end}::date + interval '1 day')`;
|
|
5805
5952
|
}
|
|
5806
5953
|
buildActivityPeriodsCTE(e, t, n) {
|
|
5807
5954
|
let r = t.cube.sql(n), i = [];
|
|
5808
|
-
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(
|
|
5809
|
-
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(
|
|
5810
|
-
binding_key:
|
|
5955
|
+
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(D`${t.timeExpr} >= cohort_base.cohort_entry`);
|
|
5956
|
+
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(D`cohort_base.cohort_entry`, a, e.granularity), s = {
|
|
5957
|
+
binding_key: D`cohort_base.binding_key`.as("binding_key"),
|
|
5811
5958
|
period_number: o.as("period_number")
|
|
5812
5959
|
};
|
|
5813
|
-
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] =
|
|
5814
|
-
let c = n.db.select(s).from(r.from).innerJoin(
|
|
5960
|
+
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] = D.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5961
|
+
let c = n.db.select(s).from(r.from).innerJoin(D`cohort_base`, D`${t.bindingKeyExpr} = cohort_base.binding_key`);
|
|
5815
5962
|
if (i.length > 0) {
|
|
5816
|
-
let e = i.length === 1 ? i[0] :
|
|
5963
|
+
let e = i.length === 1 ? i[0] : P(...i);
|
|
5817
5964
|
c = c.where(e);
|
|
5818
5965
|
}
|
|
5819
|
-
let l = [
|
|
5820
|
-
for (let e = 0; e < t.breakdowns.length; e++) l.push(
|
|
5966
|
+
let l = [D`cohort_base.binding_key`, o];
|
|
5967
|
+
for (let e = 0; e < t.breakdowns.length; e++) l.push(D.raw(`cohort_base.breakdown_${e}`));
|
|
5821
5968
|
return c = c.groupBy(...l), n.db.$with("activity_periods").as(c);
|
|
5822
5969
|
}
|
|
5823
5970
|
buildCohortSizesCTE(e, t, n) {
|
|
5824
5971
|
if (n > 0) {
|
|
5825
|
-
let e = { cohort_size:
|
|
5826
|
-
for (let t = 0; t < n; t++) e[`breakdown_${t}`] =
|
|
5827
|
-
let i = t.db.select(e).from(
|
|
5972
|
+
let e = { cohort_size: D`COUNT(*)`.as("cohort_size") }, r = [];
|
|
5973
|
+
for (let t = 0; t < n; t++) e[`breakdown_${t}`] = D.raw(`breakdown_${t}`).as(`breakdown_${t}`), r.push(D.raw(`breakdown_${t}`));
|
|
5974
|
+
let i = t.db.select(e).from(D`cohort_base`).groupBy(...r);
|
|
5828
5975
|
return t.db.$with("cohort_sizes").as(i);
|
|
5829
5976
|
}
|
|
5830
|
-
let r = t.db.select({ cohort_size:
|
|
5977
|
+
let r = t.db.select({ cohort_size: D`COUNT(*)`.as("cohort_size") }).from(D`cohort_base`);
|
|
5831
5978
|
return t.db.$with("cohort_sizes").as(r);
|
|
5832
5979
|
}
|
|
5833
5980
|
buildRetentionCountsCTE(e, t, n) {
|
|
@@ -5835,32 +5982,32 @@ var Lt = class {
|
|
|
5835
5982
|
if (e.retentionType === "rolling") r = this.buildRollingRetentionCountsQuery(e, t, n);
|
|
5836
5983
|
else {
|
|
5837
5984
|
let i = {
|
|
5838
|
-
period_number:
|
|
5839
|
-
retained_users:
|
|
5840
|
-
}, a = [
|
|
5841
|
-
for (let e = 0; e < n; e++) i[`breakdown_${e}`] =
|
|
5985
|
+
period_number: D`period_number`.as("period_number"),
|
|
5986
|
+
retained_users: D`COUNT(DISTINCT binding_key)`.as("retained_users")
|
|
5987
|
+
}, a = [D`period_number`];
|
|
5988
|
+
for (let e = 0; e < n; e++) i[`breakdown_${e}`] = D.raw(`breakdown_${e}`).as(`breakdown_${e}`), a.push(D.raw(`breakdown_${e}`));
|
|
5842
5989
|
let o = Math.min(e.periods, 52);
|
|
5843
|
-
r = t.db.select(i).from(
|
|
5990
|
+
r = t.db.select(i).from(D`activity_periods`).where(D`period_number >= 0 AND period_number <= ${o}`).groupBy(...a);
|
|
5844
5991
|
}
|
|
5845
5992
|
return t.db.$with("retention_counts").as(r);
|
|
5846
5993
|
}
|
|
5847
5994
|
buildRollingRetentionCountsQuery(e, t, n) {
|
|
5848
5995
|
let r = [];
|
|
5849
5996
|
for (let e = 0; e < n; e++) r.push(`breakdown_${e}`);
|
|
5850
|
-
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a =
|
|
5997
|
+
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a = D`(
|
|
5851
5998
|
SELECT
|
|
5852
5999
|
binding_key,
|
|
5853
|
-
${
|
|
6000
|
+
${D.raw(r.map((e) => `${e}`).join(", ") + (r.length > 0 ? "," : ""))}
|
|
5854
6001
|
MAX(period_number) as max_period
|
|
5855
6002
|
FROM activity_periods
|
|
5856
6003
|
WHERE period_number >= 0 AND period_number <= ${e.periods}
|
|
5857
|
-
GROUP BY binding_key${
|
|
6004
|
+
GROUP BY binding_key${D.raw(i)}
|
|
5858
6005
|
)`, o = this.databaseAdapter.buildPeriodSeriesSubquery(e.periods), s = {
|
|
5859
|
-
period_number:
|
|
5860
|
-
retained_users:
|
|
5861
|
-
}, c = [
|
|
5862
|
-
for (let e = 0; e < n; e++) s[`breakdown_${e}`] =
|
|
5863
|
-
return t.db.select(s).from(
|
|
6006
|
+
period_number: D`p.period_number`.as("period_number"),
|
|
6007
|
+
retained_users: D`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as("retained_users")
|
|
6008
|
+
}, c = [D`p.period_number`];
|
|
6009
|
+
for (let e = 0; e < n; e++) s[`breakdown_${e}`] = D.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`), c.push(D.raw(`ump.breakdown_${e}`));
|
|
6010
|
+
return t.db.select(s).from(D`${a} ump`).innerJoin(o, D`TRUE`).groupBy(...c);
|
|
5864
6011
|
}
|
|
5865
6012
|
buildPeriodNumberExpression(e, t, n) {
|
|
5866
6013
|
return this.databaseAdapter.buildDateDiffPeriods(e, t, n);
|
|
@@ -5869,7 +6016,7 @@ var Lt = class {
|
|
|
5869
6016
|
let t = e.split(".");
|
|
5870
6017
|
return t.length > 1 ? t[1] : t[0];
|
|
5871
6018
|
}
|
|
5872
|
-
},
|
|
6019
|
+
}, Vt = class {
|
|
5873
6020
|
constructor(e) {
|
|
5874
6021
|
this.queryPlanner = e;
|
|
5875
6022
|
}
|
|
@@ -6304,7 +6451,7 @@ var Lt = class {
|
|
|
6304
6451
|
timeDimensions: []
|
|
6305
6452
|
};
|
|
6306
6453
|
}
|
|
6307
|
-
},
|
|
6454
|
+
}, Ht = class {
|
|
6308
6455
|
name = "identity";
|
|
6309
6456
|
optimise(e) {
|
|
6310
6457
|
return e;
|
|
@@ -6312,7 +6459,7 @@ var Lt = class {
|
|
|
6312
6459
|
};
|
|
6313
6460
|
//#endregion
|
|
6314
6461
|
//#region src/server/physical-plan/processors/cte-processor.ts
|
|
6315
|
-
function
|
|
6462
|
+
function Ut(e, t, n, r) {
|
|
6316
6463
|
let i = /* @__PURE__ */ new Map();
|
|
6317
6464
|
if (e.preAggregationCTEs && e.preAggregationCTEs.length > 0) {
|
|
6318
6465
|
for (let t of e.preAggregationCTEs) if (t.propagatingFilters && t.propagatingFilters.length > 0) for (let e of t.propagatingFilters) {
|
|
@@ -6322,7 +6469,7 @@ function Bt(e, t, n, r) {
|
|
|
6322
6469
|
i.set(t, s);
|
|
6323
6470
|
}
|
|
6324
6471
|
let a = i.get(t);
|
|
6325
|
-
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] :
|
|
6472
|
+
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] : P(...a));
|
|
6326
6473
|
}
|
|
6327
6474
|
}
|
|
6328
6475
|
let a = [], o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map();
|
|
@@ -6342,7 +6489,7 @@ function Bt(e, t, n, r) {
|
|
|
6342
6489
|
}
|
|
6343
6490
|
//#endregion
|
|
6344
6491
|
//#region src/server/physical-plan/processors/window-processor.ts
|
|
6345
|
-
function
|
|
6492
|
+
function Wt(e, t, n, r, i, a) {
|
|
6346
6493
|
if (n.measures) for (let o of n.measures) {
|
|
6347
6494
|
let [s, c] = o.split("."), l = i.get(s);
|
|
6348
6495
|
if (!l?.measures?.[c]) continue;
|
|
@@ -6353,16 +6500,16 @@ function Vt(e, t, n, r, i, a) {
|
|
|
6353
6500
|
let [f, p] = d.split("."), m = i.get(f);
|
|
6354
6501
|
if (!m?.measures?.[p]) continue;
|
|
6355
6502
|
let h = m.measures[p], g = t.preAggregationCTEs?.find((e) => e.cube?.name === f && e.measures?.includes(d)), _;
|
|
6356
|
-
_ = g ?
|
|
6357
|
-
let v =
|
|
6358
|
-
v && (e[o] =
|
|
6503
|
+
_ = g ? D`sum(${D`${D.identifier(g.cteAlias)}.${D.identifier(p)}`})` : a.queryBuilder.buildMeasureExpression(h, r, m), e[d] || (e[d] = D`${_}`.as(d));
|
|
6504
|
+
let v = Gt(u, _, n, r, l, t, a);
|
|
6505
|
+
v && (e[o] = D`${v}`.as(o));
|
|
6359
6506
|
}
|
|
6360
6507
|
}
|
|
6361
|
-
function
|
|
6508
|
+
function Gt(e, t, n, r, i, a, o) {
|
|
6362
6509
|
let s = e.windowConfig || {}, c = (e, t) => {
|
|
6363
6510
|
if (!a.preAggregationCTEs) return null;
|
|
6364
6511
|
let n = a.preAggregationCTEs.find((t) => t.cube?.name === e);
|
|
6365
|
-
return n && n.cteAlias ?
|
|
6512
|
+
return n && n.cteAlias ? D`${D.identifier(n.cteAlias)}.${D.identifier(t)}` : null;
|
|
6366
6513
|
}, l;
|
|
6367
6514
|
if (s.orderBy && s.orderBy.length > 0) l = s.orderBy.map((e) => {
|
|
6368
6515
|
let a = e.field.includes(".") ? e.field.split(".")[1] : e.field;
|
|
@@ -6420,15 +6567,15 @@ function Ht(e, t, n, r, i, a, o) {
|
|
|
6420
6567
|
});
|
|
6421
6568
|
if (!d) return null;
|
|
6422
6569
|
switch (s.operation || Q.getDefaultWindowOperation(e.type)) {
|
|
6423
|
-
case "difference": return
|
|
6424
|
-
case "ratio": return
|
|
6425
|
-
case "percentChange": return
|
|
6570
|
+
case "difference": return D`${t} - ${d}`;
|
|
6571
|
+
case "ratio": return D`${t} / NULLIF(${d}, 0)`;
|
|
6572
|
+
case "percentChange": return D`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;
|
|
6426
6573
|
default: return d;
|
|
6427
6574
|
}
|
|
6428
6575
|
}
|
|
6429
6576
|
//#endregion
|
|
6430
6577
|
//#region src/server/physical-plan/processors/selection-processor.ts
|
|
6431
|
-
function
|
|
6578
|
+
function Kt(e, t, n, r, i) {
|
|
6432
6579
|
let a = { ...i.queryBuilder.buildSelections(e.joinCubes.length > 0 ? r : e.primaryCube, t, n) };
|
|
6433
6580
|
if (e.preAggregationCTEs) for (let o of e.preAggregationCTEs) {
|
|
6434
6581
|
let e = o.cube.name;
|
|
@@ -6436,32 +6583,32 @@ function Ut(e, t, n, r, i) {
|
|
|
6436
6583
|
if (!a[s]) continue;
|
|
6437
6584
|
let [, c] = s.split("."), l = r.get(e);
|
|
6438
6585
|
if (!l?.measures?.[c]) continue;
|
|
6439
|
-
let u = l.measures[c], d =
|
|
6586
|
+
let u = l.measures[c], d = D`${D.identifier(o.cteAlias)}.${D.identifier(c)}`, f;
|
|
6440
6587
|
if (u.type === "calculated" && u.calculatedSql) f = i.queryBuilder.buildCTECalculatedMeasure(u, l, o, r, n);
|
|
6441
6588
|
else {
|
|
6442
|
-
let e = o.cteReason === "fanOutPrevention", n =
|
|
6589
|
+
let e = o.cteReason === "fanOutPrevention", n = qt(o, t, r), a = e || n;
|
|
6443
6590
|
switch (u.type) {
|
|
6444
6591
|
case "count":
|
|
6445
6592
|
case "countDistinct":
|
|
6446
6593
|
case "sum":
|
|
6447
|
-
f = a ?
|
|
6594
|
+
f = a ? z(d) : R(d);
|
|
6448
6595
|
break;
|
|
6449
6596
|
case "avg":
|
|
6450
|
-
f = a ?
|
|
6597
|
+
f = a ? z(d) : i.databaseAdapter.buildAvg(d);
|
|
6451
6598
|
break;
|
|
6452
6599
|
case "min":
|
|
6453
|
-
f =
|
|
6600
|
+
f = B(d);
|
|
6454
6601
|
break;
|
|
6455
6602
|
case "max":
|
|
6456
|
-
f =
|
|
6603
|
+
f = z(d);
|
|
6457
6604
|
break;
|
|
6458
6605
|
case "number":
|
|
6459
|
-
f =
|
|
6606
|
+
f = z(d);
|
|
6460
6607
|
break;
|
|
6461
|
-
default: f = a ?
|
|
6608
|
+
default: f = a ? z(d) : R(d);
|
|
6462
6609
|
}
|
|
6463
6610
|
}
|
|
6464
|
-
a[s] =
|
|
6611
|
+
a[s] = D`${f}`.as(s);
|
|
6465
6612
|
}
|
|
6466
6613
|
for (let t in a) {
|
|
6467
6614
|
let [n, i] = t.split(".");
|
|
@@ -6473,15 +6620,15 @@ function Ut(e, t, n, r, i) {
|
|
|
6473
6620
|
let e = s.dimensions[i].sql;
|
|
6474
6621
|
u = o.joinKeys.find((t) => t.targetColumnObj === e);
|
|
6475
6622
|
}
|
|
6476
|
-
(u || l && s?.dimensions?.[i]) && (a[t] =
|
|
6623
|
+
(u || l && s?.dimensions?.[i]) && (a[t] = D`${D.identifier(o.cteAlias)}.${D.identifier(i)}`.as(t));
|
|
6477
6624
|
}
|
|
6478
6625
|
}
|
|
6479
|
-
return
|
|
6626
|
+
return Wt(a, e, t, n, r, i), a;
|
|
6480
6627
|
}
|
|
6481
|
-
function
|
|
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 &&
|
|
6628
|
+
function qt(e, t, n) {
|
|
6629
|
+
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 && Jt(e.sourceColumnObj, t, n));
|
|
6483
6630
|
}
|
|
6484
|
-
function
|
|
6631
|
+
function Jt(e, t, n) {
|
|
6485
6632
|
if (t.dimensions) for (let r of t.dimensions) {
|
|
6486
6633
|
let [t, i] = r.split(".");
|
|
6487
6634
|
if (n.get(t)?.dimensions?.[i]?.sql === e) return !0;
|
|
@@ -6495,7 +6642,7 @@ function Gt(e, t, n) {
|
|
|
6495
6642
|
}
|
|
6496
6643
|
//#endregion
|
|
6497
6644
|
//#region src/server/physical-plan/processors/joins-processor.ts
|
|
6498
|
-
function
|
|
6645
|
+
function Yt(e, t, n, r, i, a) {
|
|
6499
6646
|
let o = [], s = t.db.select(r).from(n.from);
|
|
6500
6647
|
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") {
|
|
6501
6648
|
case "left":
|
|
@@ -6526,10 +6673,10 @@ function Kt(e, t, n, r, i, a) {
|
|
|
6526
6673
|
if (t && t.joinKeys.length > 0) {
|
|
6527
6674
|
let e = [];
|
|
6528
6675
|
for (let n of t.joinKeys) {
|
|
6529
|
-
let t =
|
|
6530
|
-
r && e.push(
|
|
6676
|
+
let t = D`${D.identifier(c)}.${D.identifier(n.sourceColumn)}`, r = n.targetColumnObj;
|
|
6677
|
+
r && e.push(M(r, t));
|
|
6531
6678
|
}
|
|
6532
|
-
e.length > 0 && (a =
|
|
6679
|
+
e.length > 0 && (a = P(...e));
|
|
6533
6680
|
}
|
|
6534
6681
|
}
|
|
6535
6682
|
let l = [];
|
|
@@ -6556,19 +6703,19 @@ function Kt(e, t, n, r, i, a) {
|
|
|
6556
6703
|
} catch {}
|
|
6557
6704
|
}
|
|
6558
6705
|
let d, f, p;
|
|
6559
|
-
if (u) d =
|
|
6706
|
+
if (u) d = D`${D.identifier(u)}`, f = a.cteBuilder.buildCTEJoinCondition(n, u, e), p = void 0;
|
|
6560
6707
|
else {
|
|
6561
6708
|
let e = i.downstreamCubeMap.get(n.cube.name), r = n.cube.sql(t);
|
|
6562
6709
|
if (d = r.from, p = r.where, e && !n.junctionTable) {
|
|
6563
6710
|
let t = [];
|
|
6564
6711
|
for (let n of e.joinKeys) {
|
|
6565
|
-
let r =
|
|
6566
|
-
t.push(
|
|
6712
|
+
let r = D`${D.identifier(e.cteAlias)}.${D.identifier(n.sourceColumn)}`, i = n.targetColumnObj || D.identifier(n.targetColumn);
|
|
6713
|
+
t.push(M(r, i));
|
|
6567
6714
|
}
|
|
6568
|
-
f = t.length === 1 ? t[0] :
|
|
6715
|
+
f = t.length === 1 ? t[0] : P(...t);
|
|
6569
6716
|
} else f = n.joinCondition;
|
|
6570
6717
|
}
|
|
6571
|
-
let m = n.joinType || "left", h = m !== "inner" && p ?
|
|
6718
|
+
let m = n.joinType || "left", h = m !== "inner" && p ? P(f, p) : f;
|
|
6572
6719
|
try {
|
|
6573
6720
|
switch (m) {
|
|
6574
6721
|
case "left":
|
|
@@ -6595,7 +6742,7 @@ function Kt(e, t, n, r, i, a) {
|
|
|
6595
6742
|
}
|
|
6596
6743
|
//#endregion
|
|
6597
6744
|
//#region src/server/physical-plan/processors/predicates-processor.ts
|
|
6598
|
-
function
|
|
6745
|
+
function Xt(e, t, n, r, i, a, o, s) {
|
|
6599
6746
|
let c = [...o.allWhereConditions];
|
|
6600
6747
|
if (i.where && c.push(i.where), e.joinCubes && e.joinCubes.length > 0) for (let t of e.joinCubes) {
|
|
6601
6748
|
let e = t.cube.name;
|
|
@@ -6607,14 +6754,14 @@ function qt(e, t, n, r, i, a, o, s) {
|
|
|
6607
6754
|
l.length > 0 && c.push(...l);
|
|
6608
6755
|
let u = o.drizzleQuery;
|
|
6609
6756
|
if (c.length > 0) {
|
|
6610
|
-
let e = c.length === 1 ? c[0] :
|
|
6757
|
+
let e = c.length === 1 ? c[0] : P(...c);
|
|
6611
6758
|
u = u.where(e);
|
|
6612
6759
|
}
|
|
6613
6760
|
let d = s.queryBuilder.buildGroupByFields(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6614
6761
|
if (d.length > 0 && (u = u.groupBy(...d)), !t.ungrouped) {
|
|
6615
6762
|
let i = s.queryBuilder.buildHavingConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
|
|
6616
6763
|
if (i.length > 0) {
|
|
6617
|
-
let e = i.length === 1 ? i[0] :
|
|
6764
|
+
let e = i.length === 1 ? i[0] : P(...i);
|
|
6618
6765
|
u = u.having(e);
|
|
6619
6766
|
}
|
|
6620
6767
|
}
|
|
@@ -6623,14 +6770,14 @@ function qt(e, t, n, r, i, a, o, s) {
|
|
|
6623
6770
|
}
|
|
6624
6771
|
//#endregion
|
|
6625
6772
|
//#region src/server/physical-plan/processors/shared.ts
|
|
6626
|
-
function
|
|
6773
|
+
function Zt(e) {
|
|
6627
6774
|
let t = /* @__PURE__ */ new Map();
|
|
6628
6775
|
if (t.set(e.primaryCube.name, e.primaryCube), e.joinCubes) for (let n of e.joinCubes) t.set(n.cube.name, n.cube);
|
|
6629
6776
|
return t;
|
|
6630
6777
|
}
|
|
6631
6778
|
//#endregion
|
|
6632
6779
|
//#region src/server/physical-plan/drizzle-plan-builder.ts
|
|
6633
|
-
var
|
|
6780
|
+
var Qt = class {
|
|
6634
6781
|
constructor(e, t, n) {
|
|
6635
6782
|
this.queryBuilder = e, this.cteBuilder = t, this.databaseAdapter = n;
|
|
6636
6783
|
}
|
|
@@ -6770,13 +6917,13 @@ var Yt = class {
|
|
|
6770
6917
|
if (i) return i;
|
|
6771
6918
|
let a = this.tryBuildKeysDeduplicationQuery(e, t, n, r);
|
|
6772
6919
|
if (a) return a;
|
|
6773
|
-
let o =
|
|
6774
|
-
return
|
|
6920
|
+
let o = Ut(e, t, n, r), s = e.primaryCube.sql(n), c = e.joinCubes.length > 0 ? Zt(e) : new Map([[e.primaryCube.name, e.primaryCube]]);
|
|
6921
|
+
return Xt(e, t, n, c, s, o, Yt(e, n, s, Kt(e, t, n, c, r), o, r), r);
|
|
6775
6922
|
}
|
|
6776
6923
|
tryBuildKeysDeduplicationQuery(e, t, n, r) {
|
|
6777
6924
|
let i = e.keysDeduplication;
|
|
6778
6925
|
if (!i?.multipliedCubeName || !t.measures?.length) return null;
|
|
6779
|
-
let a = e.joinCubes.length > 0 ?
|
|
6926
|
+
let a = e.joinCubes.length > 0 ? Zt(e) : new Map([[e.primaryCube.name, e.primaryCube]]), o = a.get(i.multipliedCubeName);
|
|
6780
6927
|
if (!o || !this.canExecuteKeysDeduplication(t, o, i.multipliedCubeName)) return null;
|
|
6781
6928
|
let s = i.primaryKeyDimensions.length > 0 ? i.primaryKeyDimensions : this.getPrimaryKeyDimensions(o);
|
|
6782
6929
|
if (s.length === 0) return null;
|
|
@@ -6785,20 +6932,20 @@ var Yt = class {
|
|
|
6785
6932
|
let [t, r] = e.split("."), i = a.get(t), o = i?.dimensions?.[r];
|
|
6786
6933
|
if (!i || !o) return null;
|
|
6787
6934
|
let s = W(o.sql, n);
|
|
6788
|
-
u[e] =
|
|
6935
|
+
u[e] = D`${s}`.as(e), d.push(s);
|
|
6789
6936
|
}
|
|
6790
6937
|
if (t.timeDimensions) for (let e of t.timeDimensions) {
|
|
6791
6938
|
let [t, i] = e.dimension.split("."), o = a.get(t), s = o?.dimensions?.[i];
|
|
6792
6939
|
if (!o || !s) return null;
|
|
6793
6940
|
let c = r.queryBuilder.buildTimeDimensionExpression(s.sql, e.granularity, n);
|
|
6794
|
-
u[e.dimension] =
|
|
6941
|
+
u[e.dimension] = D`${c}`.as(e.dimension), d.push(c);
|
|
6795
6942
|
}
|
|
6796
6943
|
let f = [];
|
|
6797
6944
|
for (let e of s) {
|
|
6798
6945
|
let t = o.dimensions?.[e];
|
|
6799
6946
|
if (!t) return null;
|
|
6800
6947
|
let r = W(t.sql, n), i = `__pk__${e}`;
|
|
6801
|
-
u[i] =
|
|
6948
|
+
u[i] = D`${r}`.as(i), d.push(r), f.push(i);
|
|
6802
6949
|
}
|
|
6803
6950
|
let p = i.regularMeasures ?? [], m = new Set(p), h = t.measures.filter((e) => !m.has(e));
|
|
6804
6951
|
if (p.length > 0) {
|
|
@@ -6807,7 +6954,7 @@ var Yt = class {
|
|
|
6807
6954
|
let n = e.get(t);
|
|
6808
6955
|
if (!n) return null;
|
|
6809
6956
|
let r = `__reg__${t.replace(".", "__")}`;
|
|
6810
|
-
u[r] =
|
|
6957
|
+
u[r] = D`${n()}`.as(r);
|
|
6811
6958
|
}
|
|
6812
6959
|
}
|
|
6813
6960
|
let g = e.primaryCube.sql(n), _ = [];
|
|
@@ -6822,29 +6969,29 @@ var Yt = class {
|
|
|
6822
6969
|
let e = t.cube.sql(n);
|
|
6823
6970
|
v = this.applyJoinByType(v, t.joinType ?? "left", e.from, t.joinCondition), e.where && _.push(e.where);
|
|
6824
6971
|
}
|
|
6825
|
-
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] :
|
|
6972
|
+
_.push(...r.queryBuilder.buildWhereConditions(a, t, n)), _.length > 0 && (v = v.where(_.length === 1 ? _[0] : P(..._))), d.length > 0 && (v = v.groupBy(...d));
|
|
6826
6973
|
let y = n.db.$with(c).as(v), b = o.sql(n), x = {}, S = [];
|
|
6827
6974
|
for (let e of s) {
|
|
6828
6975
|
let t = o.dimensions?.[e];
|
|
6829
6976
|
if (!t) return null;
|
|
6830
6977
|
let r = W(t.sql, n);
|
|
6831
|
-
x[e] =
|
|
6978
|
+
x[e] = D`${r}`.as(e), S.push(r);
|
|
6832
6979
|
}
|
|
6833
6980
|
let C = /* @__PURE__ */ new Set();
|
|
6834
6981
|
for (let e of h) {
|
|
6835
6982
|
let [, t] = e.split(".");
|
|
6836
6983
|
o.measures?.[t]?.type === "avg" && C.add(t);
|
|
6837
6984
|
}
|
|
6838
|
-
let
|
|
6985
|
+
let ee = h.filter((e) => {
|
|
6839
6986
|
let [, t] = e.split(".");
|
|
6840
6987
|
return !C.has(t);
|
|
6841
6988
|
});
|
|
6842
|
-
if (
|
|
6843
|
-
let e = r.queryBuilder.buildResolvedMeasures(
|
|
6844
|
-
for (let t of
|
|
6989
|
+
if (ee.length > 0) {
|
|
6990
|
+
let e = r.queryBuilder.buildResolvedMeasures(ee, new Map([[o.name, o]]), n);
|
|
6991
|
+
for (let t of ee) {
|
|
6845
6992
|
let [, n] = t.split("."), r = e.get(t);
|
|
6846
6993
|
if (!r || typeof r != "function") return null;
|
|
6847
|
-
x[n] =
|
|
6994
|
+
x[n] = D`${r()}`.as(n);
|
|
6848
6995
|
}
|
|
6849
6996
|
}
|
|
6850
6997
|
for (let e of h) {
|
|
@@ -6853,27 +7000,27 @@ var Yt = class {
|
|
|
6853
7000
|
let r = o.measures?.[t];
|
|
6854
7001
|
if (!r?.sql) return null;
|
|
6855
7002
|
let i = W(r.sql, n), a = `__avg_sum__${t}`, s = `__avg_count__${t}`;
|
|
6856
|
-
x[a] =
|
|
7003
|
+
x[a] = D`sum(${i})`.as(a), x[s] = D`count(${i})`.as(s);
|
|
6857
7004
|
}
|
|
6858
|
-
let
|
|
6859
|
-
b.where &&
|
|
6860
|
-
let
|
|
6861
|
-
for (let e of t.dimensions ?? [])
|
|
6862
|
-
for (let e of t.timeDimensions ?? [])
|
|
7005
|
+
let w = n.db.select(x).from(b.from), T = [];
|
|
7006
|
+
b.where && T.push(b.where), T.push(...r.queryBuilder.buildWhereConditions(o, t, n)), T.length > 0 && (w = w.where(T.length === 1 ? T[0] : P(...T))), S.length > 0 && (w = w.groupBy(...S));
|
|
7007
|
+
let E = n.db.$with(l).as(w), O = {};
|
|
7008
|
+
for (let e of t.dimensions ?? []) O[e] = D`${D.identifier(c)}.${D.identifier(e)}`.as(e);
|
|
7009
|
+
for (let e of t.timeDimensions ?? []) O[e.dimension] = D`${D.identifier(c)}.${D.identifier(e.dimension)}`.as(e.dimension);
|
|
6863
7010
|
for (let e of h) {
|
|
6864
7011
|
let [, t] = e.split("."), n = o.measures?.[t];
|
|
6865
|
-
|
|
7012
|
+
O[e] = this.buildKeysOuterAggregation(n?.type ?? "sum", l, t, e);
|
|
6866
7013
|
}
|
|
6867
7014
|
for (let e of p) {
|
|
6868
7015
|
let [t, n] = e.split("."), r = a.get(t)?.measures?.[n], i = `__reg__${e.replace(".", "__")}`;
|
|
6869
|
-
|
|
7016
|
+
O[e] = this.buildKeysOuterAggregation(r?.type ?? "sum", c, i, e);
|
|
6870
7017
|
}
|
|
6871
|
-
let
|
|
6872
|
-
|
|
6873
|
-
let
|
|
6874
|
-
|
|
6875
|
-
let
|
|
6876
|
-
return
|
|
7018
|
+
let k = n.db.with(y, E).select(O).from(D`${D.identifier(c)}`), A = f.map((e, t) => M(D`${D.identifier(c)}.${D.identifier(e)}`, D`${D.identifier(l)}.${D.identifier(s[t])}`)), j = A.length === 1 ? A[0] : P(...A);
|
|
7019
|
+
k = k.leftJoin(D`${D.identifier(l)}`, j);
|
|
7020
|
+
let N = [...(t.dimensions ?? []).map((e) => D`${D.identifier(c)}.${D.identifier(e)}`), ...(t.timeDimensions ?? []).map((e) => D`${D.identifier(c)}.${D.identifier(e.dimension)}`)];
|
|
7021
|
+
N.length > 0 && (k = k.groupBy(...N));
|
|
7022
|
+
let F = r.queryBuilder.buildOrderBy(t, Object.keys(O));
|
|
7023
|
+
return F.length > 0 && (k = k.orderBy(...F)), k = r.queryBuilder.applyLimitAndOffset(k, t), k;
|
|
6877
7024
|
}
|
|
6878
7025
|
tryBuildMultiFactMergeQuery(e, t, n, r) {
|
|
6879
7026
|
let i = e.multiFactMerge;
|
|
@@ -6884,37 +7031,37 @@ var Yt = class {
|
|
|
6884
7031
|
});
|
|
6885
7032
|
if (s) return this.buildMultiFactUnionKeysFallbackQuery(t, n, r, i, l, o);
|
|
6886
7033
|
let u = i.groups[0].alias, d = i.groups.map((e) => e.alias), f = {};
|
|
6887
|
-
if (o.length > 0) for (let e of o) f[e] =
|
|
6888
|
-
for (let e of i.groups) for (let t of e.measures) f[t] =
|
|
6889
|
-
let p = n.db.with(...l).select(f).from(
|
|
6890
|
-
for (let e of o) m.set(e,
|
|
7034
|
+
if (o.length > 0) for (let e of o) f[e] = D`${this.coalesceQualifiedColumn(d, e)}`.as(e);
|
|
7035
|
+
for (let e of i.groups) for (let t of e.measures) f[t] = D`coalesce(${D`${D.identifier(e.alias)}.${D.identifier(t)}`}, 0)`.as(t);
|
|
7036
|
+
let p = n.db.with(...l).select(f).from(D`${D.identifier(u)}`), m = /* @__PURE__ */ new Map();
|
|
7037
|
+
for (let e of o) m.set(e, D`${D.identifier(u)}.${D.identifier(e)}`);
|
|
6891
7038
|
for (let e = 1; e < i.groups.length; e++) {
|
|
6892
7039
|
let t = i.groups[e].alias, n;
|
|
6893
|
-
if (o.length === 0) n =
|
|
7040
|
+
if (o.length === 0) n = D`1 = 1`;
|
|
6894
7041
|
else {
|
|
6895
|
-
let e = o.map((e) =>
|
|
6896
|
-
n = e.length === 1 ? e[0] :
|
|
7042
|
+
let e = o.map((e) => M(m.get(e), D`${D.identifier(t)}.${D.identifier(e)}`));
|
|
7043
|
+
n = e.length === 1 ? e[0] : P(...e);
|
|
6897
7044
|
}
|
|
6898
|
-
if (p = this.applyJoinByType(p, c,
|
|
7045
|
+
if (p = this.applyJoinByType(p, c, D`${D.identifier(t)}`, n), o.length > 0 && c === "full") for (let e of o) m.set(e, D`coalesce(${m.get(e)}, ${D`${D.identifier(t)}.${D.identifier(e)}`})`);
|
|
6899
7046
|
}
|
|
6900
7047
|
let h = r.queryBuilder.buildOrderBy(t, Object.keys(f));
|
|
6901
7048
|
return h.length > 0 && (p = p.orderBy(...h)), r.queryBuilder.applyLimitAndOffset(p, t);
|
|
6902
7049
|
}
|
|
6903
7050
|
buildMultiFactUnionKeysFallbackQuery(e, t, n, r, i, a) {
|
|
6904
|
-
let o = "mf_all_keys", s = r.groups.map((e) =>
|
|
6905
|
-
for (let e of a) u[e] =
|
|
6906
|
-
for (let e of r.groups) for (let t of e.measures) u[t] =
|
|
6907
|
-
let d = t.db.with(...i, l).select(u).from(
|
|
7051
|
+
let o = "mf_all_keys", s = r.groups.map((e) => D`select ${this.buildSharedKeySelection(e.alias, a)} from ${D.identifier(e.alias)}`), c = D`${D.join(s, D` union `)}`, l = t.db.$with(o).as(c), u = {};
|
|
7052
|
+
for (let e of a) u[e] = D`${D.identifier(o)}.${D.identifier(e)}`.as(e);
|
|
7053
|
+
for (let e of r.groups) for (let t of e.measures) u[t] = D`coalesce(${D`${D.identifier(e.alias)}.${D.identifier(t)}`}, 0)`.as(t);
|
|
7054
|
+
let d = t.db.with(...i, l).select(u).from(D`${D.identifier(o)}`);
|
|
6908
7055
|
for (let e of r.groups) {
|
|
6909
|
-
let t = a.map((t) =>
|
|
6910
|
-
d = d.leftJoin(
|
|
7056
|
+
let t = a.map((t) => M(D`${D.identifier(o)}.${D.identifier(t)}`, D`${D.identifier(e.alias)}.${D.identifier(t)}`)), n = t.length === 1 ? t[0] : P(...t);
|
|
7057
|
+
d = d.leftJoin(D`${D.identifier(e.alias)}`, n);
|
|
6911
7058
|
}
|
|
6912
7059
|
let f = n.queryBuilder.buildOrderBy(e, Object.keys(u));
|
|
6913
7060
|
return f.length > 0 && (d = d.orderBy(...f)), n.queryBuilder.applyLimitAndOffset(d, e);
|
|
6914
7061
|
}
|
|
6915
7062
|
buildSharedKeySelection(e, t) {
|
|
6916
|
-
let n = t.map((t) =>
|
|
6917
|
-
return
|
|
7063
|
+
let n = t.map((t) => D`${D.identifier(e)}.${D.identifier(t)} as ${D.identifier(t)}`);
|
|
7064
|
+
return D.join(n, D`, `);
|
|
6918
7065
|
}
|
|
6919
7066
|
selectRuntimeMergeStrategy(e, t) {
|
|
6920
7067
|
return !t || e === "innerJoin" ? "inner" : e === "leftJoin" ? "left" : this.supportsFullOuterJoin() ? "full" : "left";
|
|
@@ -6924,9 +7071,9 @@ var Yt = class {
|
|
|
6924
7071
|
return e === "postgres" || e === "duckdb";
|
|
6925
7072
|
}
|
|
6926
7073
|
coalesceQualifiedColumn(e, t) {
|
|
6927
|
-
if (e.length === 1) return
|
|
6928
|
-
let n = e.map((e) =>
|
|
6929
|
-
for (let e = 1; e < n.length; e++) r =
|
|
7074
|
+
if (e.length === 1) return D`${D.identifier(e[0])}.${D.identifier(t)}`;
|
|
7075
|
+
let n = e.map((e) => D`${D.identifier(e)}.${D.identifier(t)}`), r = n[0];
|
|
7076
|
+
for (let e = 1; e < n.length; e++) r = D`coalesce(${r}, ${n[e]})`;
|
|
6930
7077
|
return r;
|
|
6931
7078
|
}
|
|
6932
7079
|
canExecuteKeysDeduplication(e, t, n) {
|
|
@@ -6972,10 +7119,10 @@ var Yt = class {
|
|
|
6972
7119
|
}
|
|
6973
7120
|
buildKeysOuterAggregation(e, t, n, r) {
|
|
6974
7121
|
switch (e) {
|
|
6975
|
-
case "min": return
|
|
6976
|
-
case "max": return
|
|
6977
|
-
case "avg": return
|
|
6978
|
-
default: return
|
|
7122
|
+
case "min": return D`min(${D`${D.identifier(t)}.${D.identifier(n)}`})`.as(r);
|
|
7123
|
+
case "max": return D`max(${D`${D.identifier(t)}.${D.identifier(n)}`})`.as(r);
|
|
7124
|
+
case "avg": return D`sum(${D`${D.identifier(t)}.${D.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${D`${D.identifier(t)}.${D.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);
|
|
7125
|
+
default: return D`coalesce(sum(${D`${D.identifier(t)}.${D.identifier(n)}`}), 0)`.as(r);
|
|
6979
7126
|
}
|
|
6980
7127
|
}
|
|
6981
7128
|
applyJoinByType(e, t, n, r) {
|
|
@@ -6995,7 +7142,7 @@ function $(e, t) {
|
|
|
6995
7142
|
console.log(`\n[DC_DEBUG] ${e}`), console.log(n), r.length > 0 && console.log("params:", r), console.log();
|
|
6996
7143
|
} catch {}
|
|
6997
7144
|
}
|
|
6998
|
-
var
|
|
7145
|
+
var $t = class {
|
|
6999
7146
|
queryBuilder;
|
|
7000
7147
|
drizzlePlanBuilder;
|
|
7001
7148
|
databaseAdapter;
|
|
@@ -7011,7 +7158,7 @@ var Xt = class {
|
|
|
7011
7158
|
if (this.dbExecutor = e, this.databaseAdapter = e.databaseAdapter, !this.databaseAdapter) throw Error("DatabaseExecutor must have a databaseAdapter property");
|
|
7012
7159
|
this.queryBuilder = new vt(this.databaseAdapter);
|
|
7013
7160
|
let r = new bt(), i = new xt(this.queryBuilder);
|
|
7014
|
-
this.drizzlePlanBuilder = new
|
|
7161
|
+
this.drizzlePlanBuilder = new Qt(this.queryBuilder, i, this.databaseAdapter), this.comparisonQueryBuilder = new Nt(this.databaseAdapter), this.funnelQueryBuilder = new Pt(this.databaseAdapter), this.flowQueryBuilder = new Ft(this.databaseAdapter), this.retentionQueryBuilder = new Bt(this.databaseAdapter), this.logicalPlanBuilder = new Vt(r), this.planOptimiser = new Ht(), this.cacheConfig = t, this.rlsSetup = n;
|
|
7015
7162
|
}
|
|
7016
7163
|
async withRLSContext(e, t) {
|
|
7017
7164
|
if (!this.rlsSetup) return t();
|
|
@@ -7215,7 +7362,7 @@ var Xt = class {
|
|
|
7215
7362
|
$("query", s);
|
|
7216
7363
|
let c = this.queryBuilder.collectNumericFields(e, t), l = await this.dbExecutor.execute(s, c);
|
|
7217
7364
|
return {
|
|
7218
|
-
data:
|
|
7365
|
+
data: At(Array.isArray(l) ? l.map((e) => {
|
|
7219
7366
|
let n = { ...e };
|
|
7220
7367
|
if (t.timeDimensions) {
|
|
7221
7368
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -7342,7 +7489,7 @@ var Xt = class {
|
|
|
7342
7489
|
}
|
|
7343
7490
|
validateQueryForMode(e, t, n) {
|
|
7344
7491
|
let r = () => {
|
|
7345
|
-
let e =
|
|
7492
|
+
let e = nn(t, n);
|
|
7346
7493
|
if (!e.isValid) throw Error(`Query validation failed: ${e.errors.join(", ")}`);
|
|
7347
7494
|
};
|
|
7348
7495
|
({
|
|
@@ -7379,7 +7526,7 @@ var Xt = class {
|
|
|
7379
7526
|
let c = this.drizzlePlanBuilder.build(s, t, a);
|
|
7380
7527
|
$("query", c);
|
|
7381
7528
|
let l = this.queryBuilder.collectNumericFields(e, t), u = await this.dbExecutor.execute(c, l), d = {
|
|
7382
|
-
data:
|
|
7529
|
+
data: At(Array.isArray(u) ? u.map((e) => {
|
|
7383
7530
|
let n = { ...e };
|
|
7384
7531
|
if (t.timeDimensions) {
|
|
7385
7532
|
for (let e of t.timeDimensions) if (e.dimension in n) {
|
|
@@ -7498,7 +7645,7 @@ var Xt = class {
|
|
|
7498
7645
|
}
|
|
7499
7646
|
}
|
|
7500
7647
|
}
|
|
7501
|
-
},
|
|
7648
|
+
}, en = class t {
|
|
7502
7649
|
cubes = /* @__PURE__ */ new Map();
|
|
7503
7650
|
metadataCache;
|
|
7504
7651
|
cacheConfig;
|
|
@@ -7526,7 +7673,7 @@ var Xt = class {
|
|
|
7526
7673
|
return Qe(this.db, this.schema, this.engineType);
|
|
7527
7674
|
}
|
|
7528
7675
|
createQueryExecutor(e = !1) {
|
|
7529
|
-
return new
|
|
7676
|
+
return new $t(this.createDbExecutor(), e ? this.cacheConfig : void 0, this.rlsSetup);
|
|
7530
7677
|
}
|
|
7531
7678
|
formatSqlResult(t) {
|
|
7532
7679
|
let n = this.getEngineType() ?? "postgres";
|
|
@@ -7720,18 +7867,18 @@ var Xt = class {
|
|
|
7720
7867
|
return Array.from(this.cubes.keys());
|
|
7721
7868
|
}
|
|
7722
7869
|
validateQuery(e) {
|
|
7723
|
-
return
|
|
7870
|
+
return nn(this.cubes, e);
|
|
7724
7871
|
}
|
|
7725
7872
|
analyzeQuery(e, t) {
|
|
7726
7873
|
return this.createQueryExecutor(!0).analyzeQuery(this.cubes, e, t);
|
|
7727
7874
|
}
|
|
7728
7875
|
};
|
|
7729
|
-
function
|
|
7876
|
+
function tn(e) {
|
|
7730
7877
|
let t = [];
|
|
7731
7878
|
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;
|
|
7732
7879
|
}
|
|
7733
|
-
function
|
|
7734
|
-
let n = [], r =
|
|
7880
|
+
function nn(e, t) {
|
|
7881
|
+
let n = [], r = tn(t);
|
|
7735
7882
|
if (r.length > 1) return n.push(`Query contains multiple query modes: ${r.join(", ")}`), {
|
|
7736
7883
|
isValid: !1,
|
|
7737
7884
|
errors: n
|
|
@@ -7752,7 +7899,7 @@ function $t(e, t) {
|
|
|
7752
7899
|
}
|
|
7753
7900
|
},
|
|
7754
7901
|
retention: () => {
|
|
7755
|
-
let r = t.retention, i =
|
|
7902
|
+
let r = t.retention, i = an(r.timeDimension);
|
|
7756
7903
|
i && !e.has(i) && n.push(`Retention cube not found: ${i}`);
|
|
7757
7904
|
let a = r.bindingKey;
|
|
7758
7905
|
if (typeof a == "string") {
|
|
@@ -7818,7 +7965,7 @@ function $t(e, t) {
|
|
|
7818
7965
|
}
|
|
7819
7966
|
o.dimensions[i] || n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`);
|
|
7820
7967
|
}
|
|
7821
|
-
if (t.filters) for (let r of t.filters)
|
|
7968
|
+
if (t.filters) for (let r of t.filters) rn(r, e, n, a);
|
|
7822
7969
|
if (a.size === 0 && n.push("Query must reference at least one cube through measures, dimensions, or filters"), t.ungrouped) {
|
|
7823
7970
|
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");
|
|
7824
7971
|
let r = new Set([
|
|
@@ -7873,10 +8020,10 @@ function $t(e, t) {
|
|
|
7873
8020
|
errors: n
|
|
7874
8021
|
};
|
|
7875
8022
|
}
|
|
7876
|
-
function
|
|
8023
|
+
function rn(e, t, n, r) {
|
|
7877
8024
|
if ("and" in e || "or" in e) {
|
|
7878
8025
|
let i = e.and || e.or || [];
|
|
7879
|
-
for (let e of i)
|
|
8026
|
+
for (let e of i) rn(e, t, n, r);
|
|
7880
8027
|
return;
|
|
7881
8028
|
}
|
|
7882
8029
|
if (!("member" in e)) {
|
|
@@ -7899,7 +8046,7 @@ function en(e, t, n, r) {
|
|
|
7899
8046
|
n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`);
|
|
7900
8047
|
}
|
|
7901
8048
|
}
|
|
7902
|
-
function
|
|
8049
|
+
function an(e) {
|
|
7903
8050
|
if (typeof e == "string") {
|
|
7904
8051
|
let [t] = e.split(".");
|
|
7905
8052
|
return t || null;
|
|
@@ -7907,4 +8054,4 @@ function tn(e) {
|
|
|
7907
8054
|
return e.cube;
|
|
7908
8055
|
}
|
|
7909
8056
|
//#endregion
|
|
7910
|
-
export {
|
|
8057
|
+
export { en as t };
|