@gscdump/cloudflare 0.36.2 → 0.36.3
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/server-tail/index.mjs +16 -12
- package/package.json +5 -5
|
@@ -3,9 +3,13 @@ import { ARCHETYPE_EXECUTION_CLASS } from "@gscdump/contracts/archetypes";
|
|
|
3
3
|
import { err, ok, unwrapResult } from "gscdump/result";
|
|
4
4
|
import { SEARCH_TYPE_INT } from "@gscdump/engine/iceberg";
|
|
5
5
|
const TABLE_PLACEHOLDER = "{{TABLE}}";
|
|
6
|
+
const FACT_ALIAS = "fact";
|
|
7
|
+
function factTableRef() {
|
|
8
|
+
return `${TABLE_PLACEHOLDER} AS ${FACT_ALIAS}`;
|
|
9
|
+
}
|
|
6
10
|
function dimColumn(dim) {
|
|
7
11
|
if (dim === "page") return "url";
|
|
8
|
-
if (dim === "queryCanonical") return
|
|
12
|
+
if (dim === "queryCanonical") return `COALESCE((SELECT qd.query_canonical FROM query_dim qd WHERE qd.query = ${FACT_ALIAS}.query LIMIT 1), ${FACT_ALIAS}.query)`;
|
|
9
13
|
return dim;
|
|
10
14
|
}
|
|
11
15
|
function dimSelect(dim) {
|
|
@@ -158,7 +162,7 @@ function buildSiteDailyTimeseries(q, pruned, mode) {
|
|
|
158
162
|
return {
|
|
159
163
|
table: "dates",
|
|
160
164
|
params: w.params,
|
|
161
|
-
sql: `SELECT date, ${metrics} FROM ${
|
|
165
|
+
sql: `SELECT date, ${metrics} FROM ${factTableRef()} WHERE ${w.clause} GROUP BY date ORDER BY date ASC`
|
|
162
166
|
};
|
|
163
167
|
}
|
|
164
168
|
function buildEntityDailyTimeseries(q, pruned, mode) {
|
|
@@ -169,7 +173,7 @@ function buildEntityDailyTimeseries(q, pruned, mode) {
|
|
|
169
173
|
return {
|
|
170
174
|
table,
|
|
171
175
|
params: [...w.params, q.entity.value],
|
|
172
|
-
sql: `SELECT date, ${metrics} FROM ${
|
|
176
|
+
sql: `SELECT date, ${metrics} FROM ${factTableRef()} WHERE ${w.clause} AND ${col} = ? GROUP BY date ORDER BY date ASC`
|
|
173
177
|
};
|
|
174
178
|
}
|
|
175
179
|
function buildEntityDailySparkline(q, pruned, mode) {
|
|
@@ -181,7 +185,7 @@ function buildEntityDailySparkline(q, pruned, mode) {
|
|
|
181
185
|
return {
|
|
182
186
|
table,
|
|
183
187
|
params: w.params,
|
|
184
|
-
sql: `SELECT date, ${dimSelect(q.dimension)}, ${metricExpr(q.metric)} FROM ${
|
|
188
|
+
sql: `SELECT date, ${dimSelect(q.dimension)}, ${metricExpr(q.metric)} FROM ${factTableRef()} WHERE ${w.clause} AND ${col} IN (${inList}) GROUP BY date, ${col} ORDER BY date ASC`
|
|
185
189
|
};
|
|
186
190
|
}
|
|
187
191
|
function buildTopNBreakdown(q, pruned, mode) {
|
|
@@ -207,7 +211,7 @@ function buildTopNBreakdown(q, pruned, mode) {
|
|
|
207
211
|
const deviceSelects = (clause, ml) => DEVICE_SUFFIXES.map((suffix) => {
|
|
208
212
|
const source = deviceSource(suffix);
|
|
209
213
|
const metrics = ml.map((m) => metricExprForSource(m, source)).join(", ");
|
|
210
|
-
return `SELECT '${suffix.toUpperCase()}' AS device, ${metrics} FROM ${
|
|
214
|
+
return `SELECT '${suffix.toUpperCase()}' AS device, ${metrics} FROM ${factTableRef()} WHERE ${clause}`;
|
|
211
215
|
}).join(" UNION ALL ");
|
|
212
216
|
const inner = `SELECT COALESCE(c.device, p.device) AS device, ${metricList.map((m) => coalesceMetric(m, "c", m)).join(", ")}, ${STD_METRICS.map((m) => coalesceMetric(m, "p", prevAlias(m))).join(", ")} FROM cur c FULL OUTER JOIN prev p ON c.device = p.device`;
|
|
213
217
|
const sql = `WITH cur AS (${deviceSelects(w.clause, metricList)}), prev AS (${deviceSelects(wPrev.clause, STD_METRICS)}) SELECT * FROM (${inner}) t ORDER BY ${order} ${limit}${offset}`;
|
|
@@ -220,7 +224,7 @@ function buildTopNBreakdown(q, pruned, mode) {
|
|
|
220
224
|
const sql = `${DEVICE_SUFFIXES.map((suffix) => {
|
|
221
225
|
const source = deviceSource(suffix);
|
|
222
226
|
const metrics = metricList.map((m) => metricExprForSource(m, source)).join(", ");
|
|
223
|
-
return `SELECT '${suffix.toUpperCase()}' AS device, ${metrics} FROM ${
|
|
227
|
+
return `SELECT '${suffix.toUpperCase()}' AS device, ${metrics} FROM ${factTableRef()} WHERE ${w.clause}`;
|
|
224
228
|
}).join(" UNION ALL ")} ORDER BY ${order} ${limit}${offset}`;
|
|
225
229
|
return {
|
|
226
230
|
table,
|
|
@@ -244,7 +248,7 @@ function buildTopNBreakdown(q, pruned, mode) {
|
|
|
244
248
|
const moverWhere = q.movers ? `WHERE ${moverClause(q.movers).where} ` : "";
|
|
245
249
|
const outerOrder = q.movers ? moverOrderByAlias(q.movers) : order;
|
|
246
250
|
const inner = `SELECT COALESCE(c.k, p.k) AS ${q.dimension}, ${curCols}, ${prevCols}${variantOut}${totalCol} FROM cur c FULL OUTER JOIN prev p ON c.k = p.k ${moverWhere}`;
|
|
247
|
-
const sql = `WITH cur AS (SELECT ${col} AS k, ${curMetrics}${variantSel} FROM ${
|
|
251
|
+
const sql = `WITH cur AS (SELECT ${col} AS k, ${curMetrics}${variantSel} FROM ${factTableRef()} WHERE ${w.clause}${facet.sql} GROUP BY ${col}), prev AS (SELECT ${col} AS k, ${prevMetrics} FROM ${factTableRef()} WHERE ${wPrev.clause}${facet.sql} GROUP BY ${col}) SELECT * FROM (${inner}) t ORDER BY ${outerOrder} ${limit}${offset}`;
|
|
248
252
|
return {
|
|
249
253
|
table,
|
|
250
254
|
params: [
|
|
@@ -257,7 +261,7 @@ function buildTopNBreakdown(q, pruned, mode) {
|
|
|
257
261
|
};
|
|
258
262
|
}
|
|
259
263
|
const metrics = metricList.map(metricExpr).join(", ");
|
|
260
|
-
const sql = `SELECT ${dimSelect(q.dimension)}, ${metrics}${variantSel}${totalCol} FROM ${
|
|
264
|
+
const sql = `SELECT ${dimSelect(q.dimension)}, ${metrics}${variantSel}${totalCol} FROM ${factTableRef()} WHERE ${w.clause}${facet.sql} GROUP BY ${col} ORDER BY ${order} ${limit}${offset}`;
|
|
261
265
|
return {
|
|
262
266
|
table,
|
|
263
267
|
params: [...w.params, ...facet.params],
|
|
@@ -279,7 +283,7 @@ function buildSingleRowLookup(q, pruned, mode) {
|
|
|
279
283
|
return {
|
|
280
284
|
table,
|
|
281
285
|
params,
|
|
282
|
-
sql: `SELECT ${dims.length > 0 ? `${dims.map(dimSelect).join(", ")}, ${metrics}` : metrics} FROM ${
|
|
286
|
+
sql: `SELECT ${dims.length > 0 ? `${dims.map(dimSelect).join(", ")}, ${metrics}` : metrics} FROM ${factTableRef()} WHERE ${clause}${groupBy}`
|
|
283
287
|
};
|
|
284
288
|
}
|
|
285
289
|
function buildMultiSeriesStackedDaily(q, pruned, mode) {
|
|
@@ -288,7 +292,7 @@ function buildMultiSeriesStackedDaily(q, pruned, mode) {
|
|
|
288
292
|
if (q.seriesDimension === "device") {
|
|
289
293
|
const selects = DEVICE_SUFFIXES.map((suffix) => {
|
|
290
294
|
const source = deviceSource(suffix);
|
|
291
|
-
return `SELECT date, '${suffix.toUpperCase()}' AS device, ${metricExprForSource(q.metric, source)} FROM ${
|
|
295
|
+
return `SELECT date, '${suffix.toUpperCase()}' AS device, ${metricExprForSource(q.metric, source)} FROM ${factTableRef()} WHERE ${w.clause} GROUP BY date`;
|
|
292
296
|
});
|
|
293
297
|
return {
|
|
294
298
|
table,
|
|
@@ -300,7 +304,7 @@ function buildMultiSeriesStackedDaily(q, pruned, mode) {
|
|
|
300
304
|
return {
|
|
301
305
|
table,
|
|
302
306
|
params: w.params,
|
|
303
|
-
sql: `SELECT date, ${dimSelect(q.seriesDimension)}, ${metricExpr(q.metric)} FROM ${
|
|
307
|
+
sql: `SELECT date, ${dimSelect(q.seriesDimension)}, ${metricExpr(q.metric)} FROM ${factTableRef()} WHERE ${w.clause} GROUP BY date, ${col} ORDER BY date ASC`
|
|
304
308
|
};
|
|
305
309
|
}
|
|
306
310
|
function buildTwoDimensionDetail(q, pruned, mode) {
|
|
@@ -318,7 +322,7 @@ function buildTwoDimensionDetail(q, pruned, mode) {
|
|
|
318
322
|
const facet = facetPredicate(q);
|
|
319
323
|
clause += facet.sql;
|
|
320
324
|
params.push(...facet.params);
|
|
321
|
-
let sql = `SELECT url, query, ${(q.orderBy && !q.metrics.includes(q.orderBy.metric) ? [...q.metrics, q.orderBy.metric] : q.metrics).map(metricExpr).join(", ")} FROM ${
|
|
325
|
+
let sql = `SELECT url, query, ${(q.orderBy && !q.metrics.includes(q.orderBy.metric) ? [...q.metrics, q.orderBy.metric] : q.metrics).map(metricExpr).join(", ")} FROM ${factTableRef()} WHERE ${clause} GROUP BY url, query`;
|
|
322
326
|
if (q.orderBy) sql += ` ORDER BY ${metricAlias(q.orderBy.metric)} ${q.orderBy.dir.toUpperCase()}`;
|
|
323
327
|
if (q.limit && q.limit > 0) sql += ` LIMIT ${Math.floor(q.limit)}`;
|
|
324
328
|
return {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gscdump/cloudflare",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.36.
|
|
4
|
+
"version": "0.36.3",
|
|
5
5
|
"description": "Cloudflare-Workers-flavored helpers for the gscdump analytics stack: AnalyticsEnv binding contract, R2 SigV4 presigner, size-hint HMAC, DuckDB Workers shims, engine factory.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Harlan Wilton",
|
|
@@ -46,10 +46,10 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@uwdata/flechette": "^2.5.0",
|
|
48
48
|
"aws4fetch": "^1.0.20",
|
|
49
|
-
"@gscdump/
|
|
50
|
-
"@gscdump/engine
|
|
51
|
-
"@gscdump/
|
|
52
|
-
"gscdump": "0.36.
|
|
49
|
+
"@gscdump/contracts": "0.36.3",
|
|
50
|
+
"@gscdump/engine": "0.36.3",
|
|
51
|
+
"@gscdump/engine-sqlite": "0.36.3",
|
|
52
|
+
"gscdump": "0.36.3"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@cloudflare/vitest-pool-workers": "^0.18.0",
|