@gscdump/cloudflare 0.36.2 → 0.36.4

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.
@@ -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 "COALESCE((SELECT qd.query_canonical FROM query_dim qd WHERE qd.query = query LIMIT 1), query)";
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause} GROUP BY date ORDER BY date ASC`
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause} AND ${col} = ? GROUP BY date ORDER BY date ASC`
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause} AND ${col} IN (${inList}) GROUP BY date, ${col} ORDER BY date ASC`
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 ${TABLE_PLACEHOLDER} WHERE ${clause}`;
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause}`;
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause}${facet.sql} GROUP BY ${col}), prev AS (SELECT ${col} AS k, ${prevMetrics} FROM ${TABLE_PLACEHOLDER} WHERE ${wPrev.clause}${facet.sql} GROUP BY ${col}) SELECT * FROM (${inner}) t ORDER BY ${outerOrder} ${limit}${offset}`;
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause}${facet.sql} GROUP BY ${col} ORDER BY ${order} ${limit}${offset}`;
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 ${TABLE_PLACEHOLDER} WHERE ${clause}${groupBy}`
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause} GROUP BY date`;
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 ${TABLE_PLACEHOLDER} WHERE ${w.clause} GROUP BY date, ${col} ORDER BY date ASC`
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 ${TABLE_PLACEHOLDER} WHERE ${clause} GROUP BY url, query`;
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.2",
4
+ "version": "0.36.4",
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/engine": "0.36.2",
50
- "@gscdump/engine-sqlite": "0.36.2",
51
- "@gscdump/contracts": "0.36.2",
52
- "gscdump": "0.36.2"
49
+ "@gscdump/contracts": "0.36.4",
50
+ "@gscdump/engine": "0.36.4",
51
+ "@gscdump/engine-sqlite": "0.36.4",
52
+ "gscdump": "0.36.4"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@cloudflare/vitest-pool-workers": "^0.18.0",