@pythia-software/query-table-duckdb 0.9.9 → 1.0.1

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/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # Query Table DuckDB backend
2
2
 
3
- `@pythia-software/query-table-duckdb` executes Query Table's row, metric, and
4
- version 3 grouped-query contracts with DuckDB SQL. The same TypeScript planner
3
+ `@pythia-software/query-table-duckdb` executes Query Table's version 3 query
4
+ contract (rows, metrics, grouping and distinct values) with DuckDB SQL; its
5
+ transport is exactly `{ queryCapabilities, fetchQueryV3 }`. The same TypeScript planner
5
6
  runs against native DuckDB or DuckDB-Wasm. There is no React, HTTP server, Go,
6
7
  database driver, or browser dependency in this package.
7
8
 
@@ -64,7 +65,7 @@ The explicitly negotiated profile is `qt-duckdb-v1`.
64
65
  | Contract | Support |
65
66
  | --- | --- |
66
67
  | Rows | projection, all filter operators, AND/OR/NOT, nulls, text sets, multi-sort, null placement, pagination |
67
- | Metadata/items | scalar/array autocomplete with `hasNull`, complete item lookup |
68
+ | Metadata/items | v3 `distinct` scalar/array autocomplete with `hasNull` over the source WHERE; item lookup and field statistics are ordinary v3 row/metric requests |
68
69
  | Regex | bounded RE2 source filtering and regex sort extraction; unsupported RE2 patterns fail |
69
70
  | Scalar metrics | COUNT, COUNT_DISTINCT, SUM, AVG, MIN, MAX, exact MEDIAN; composed formulas; paired scatter measures |
70
71
  | Distributions | exact boxes and shared-edge histograms; bounded numeric samples |
package/dist/index.d.ts CHANGED
@@ -84,6 +84,8 @@ declare class DuckDBBackend {
84
84
  private calendarMapping;
85
85
  private metric;
86
86
  transport(): Transport<DuckDBRow>;
87
+ /** Distinct values over the source population, without staging it. */
88
+ private distinct;
87
89
  }
88
90
  declare function createDuckDBTransport(options: DuckDBOptions): Transport<DuckDBRow>;
89
91
 
package/dist/index.js CHANGED
@@ -7,7 +7,8 @@ import {
7
7
  isFilterable,
8
8
  isSortable,
9
9
  isSelectable,
10
- opsForField
10
+ opsForField,
11
+ QueryError
11
12
  } from "@pythia-software/query-table-core";
12
13
  function quoteIdentifier(value) {
13
14
  if (!value || value.includes("\0")) throw Error("Invalid DuckDB identifier.");
@@ -39,7 +40,7 @@ var SQLBuilder = class {
39
40
  }
40
41
  statement(sql) {
41
42
  if (sql.length > 262144 || this.args.length > 1e4)
42
- throw Error("DuckDB statement budget exceeded.");
43
+ throw new QueryError("resource_limit", "DuckDB statement budget exceeded.");
43
44
  return { sql, args: [...this.args] };
44
45
  }
45
46
  definition(name) {
@@ -131,7 +132,7 @@ var SQLBuilder = class {
131
132
  node(node) {
132
133
  const sql = this.nodeSQL(node);
133
134
  if (sql.length > 131072)
134
- throw Error("DuckDB expression SQL budget exceeded.");
135
+ throw new QueryError("resource_limit", "DuckDB expression SQL budget exceeded.");
135
136
  return sql;
136
137
  }
137
138
  nodeSQL(node) {
@@ -279,7 +280,9 @@ import {
279
280
  metricDateNext,
280
281
  metricDateRange,
281
282
  groupKeyFields,
282
- isCalendarGroupKey
283
+ isCalendarGroupKey,
284
+ failedMetric,
285
+ QueryError as QueryError2
283
286
  } from "@pythia-software/query-table-core";
284
287
  var DUCKDB_PROFILE = "qt-duckdb-v1";
285
288
  function abort(signal) {
@@ -518,7 +521,7 @@ var DuckDBBackend = class {
518
521
  signal
519
522
  );
520
523
  if (n > this.capabilities.maxPopulation || bytes > this.maxStagingBytes)
521
- throw Error("DuckDB source population or staging byte budget exceeded.");
524
+ throw new QueryError2("resource_limit", "DuckDB source population or staging byte budget exceeded.");
522
525
  await this.run(
523
526
  builder.statement(
524
527
  `CREATE TEMP TABLE ${quoteIdentifier(name)} AS SELECT * FROM ${population}`
@@ -573,7 +576,7 @@ var DuckDBBackend = class {
573
576
  );
574
577
  }
575
578
  validateRequest(request) {
576
- if (request.version !== 3 || request.profile !== DUCKDB_PROFILE || request.diagnostics.length)
579
+ if (request.version !== 3 || request.profile !== DUCKDB_PROFILE)
577
580
  throw Error("Invalid DuckDB execution request or profile.");
578
581
  if (!Number.isSafeInteger(request.now) || Math.abs(request.now) > 864e13)
579
582
  throw Error("Invalid query clock.");
@@ -598,6 +601,7 @@ var DuckDBBackend = class {
598
601
  }
599
602
  async execute(request, signal) {
600
603
  this.validateRequest(request);
604
+ if (request.distinct) return this.distinct(request, signal);
601
605
  return this.transaction(async (tables) => {
602
606
  const source = await this.stage(
603
607
  request.source,
@@ -654,7 +658,7 @@ var DuckDBBackend = class {
654
658
  signal
655
659
  );
656
660
  if (n > this.capabilities.maxGroups)
657
- throw Error("DuckDB grouped row budget exceeded.");
661
+ throw new QueryError2("resource_limit", "DuckDB grouped row budget exceeded.");
658
662
  schema = model.resultSchema(grouping.keys, grouping.summaries);
659
663
  }
660
664
  const page = await this.page(
@@ -716,11 +720,7 @@ var DuckDBBackend = class {
716
720
  });
717
721
  tables.splice(created);
718
722
  abort(signal);
719
- output.push({
720
- id: clause.id,
721
- buckets: [],
722
- error: error instanceof Error ? error.message : String(error)
723
- });
723
+ output.push(failedMetric(clause.id, error, "invalid_metric"));
724
724
  }
725
725
  }
726
726
  await this.sql("BEGIN TRANSACTION", [], signal);
@@ -816,7 +816,7 @@ var DuckDBBackend = class {
816
816
  signal
817
817
  );
818
818
  if (rows.length > this.capabilities.maxGroups)
819
- throw Error("DuckDB metric group budget exceeded.");
819
+ throw new QueryError2("resource_limit", "DuckDB metric group budget exceeded.");
820
820
  if (distribution && rows.some(
821
821
  (row) => row.samples?.length && row.samples.length > this.maxSamples
822
822
  ))
@@ -887,7 +887,7 @@ var DuckDBBackend = class {
887
887
  const values = [slot, ...tuple];
888
888
  if (!existing.has(JSON.stringify(values))) {
889
889
  if (buckets.length >= this.capabilities.maxGroups)
890
- throw Error("DuckDB calendar group budget exceeded.");
890
+ throw new QueryError2("resource_limit", "DuckDB calendar group budget exceeded.");
891
891
  buckets.push({
892
892
  keys: values,
893
893
  count: 0,
@@ -935,130 +935,57 @@ var DuckDBBackend = class {
935
935
  transport() {
936
936
  return {
937
937
  queryCapabilities: this.capabilities,
938
- metricCapabilities: {
939
- version: 2,
940
- expressions: true,
941
- shownRows: true,
942
- distributions: true,
943
- computedFields: this.computed.size > 0,
944
- filters: true,
945
- minCount: true,
946
- minCountMeasures: true,
947
- profile: DUCKDB_PROFILE,
948
- maxGroups: this.capabilities.maxGroups
949
- },
950
- fetchQueryV3: (request, signal) => this.execute(request, signal),
951
- fetchRows: (query, signal) => this.transaction(async (tables) => {
952
- this.window(query);
953
- const source = await this.stage(query, Date.now(), tables, signal);
954
- return this.page(
955
- source.name,
956
- this.schema,
957
- { ...query, where: [] },
958
- Date.now(),
959
- signal
960
- );
961
- }, signal),
962
- fetchMetrics: (query, signal) => {
963
- if (query.diagnostics.length || query.profile && query.profile !== DUCKDB_PROFILE || query.metrics.length > 20)
964
- return Promise.reject(Error("Invalid DuckDB metric request."));
965
- return this.transaction(async (tables) => {
966
- const now = Date.now(), server = { ...query, select: [] };
967
- const source = await this.stage(server, now, tables, signal);
968
- return {
969
- metrics: await this.metrics(
970
- source.name,
971
- this.schema,
972
- server,
973
- query.metrics,
974
- now,
975
- tables,
976
- signal
977
- )
978
- };
979
- }, signal);
980
- },
981
- fetchAggregations: (query, signal) => this.transaction(async (tables) => {
982
- if (query.diagnostics?.length || query.aggregations.length > 20)
983
- throw Error("Invalid DuckDB aggregation request.");
984
- const server = {
985
- select: [],
986
- where: query.where,
987
- orderBy: [],
988
- limit: 100,
989
- offset: 0
990
- }, now = Date.now();
991
- const source = await this.stage(server, now, tables, signal);
992
- return {
993
- metrics: await this.metrics(
994
- source.name,
995
- this.schema,
996
- { ...server, where: [] },
997
- query.aggregations,
998
- now,
999
- tables,
1000
- signal
1001
- )
1002
- };
1003
- }, signal),
1004
- fetchDistinctValues: (query, signal) => this.serial(async () => {
1005
- const builder = this.builder(), field = builder.definition(query.field), limit = positive(query.limit, 50, 500);
1006
- if (!isFilterable2(field))
1007
- throw Error(`Field ${field.name} is not filterable.`);
1008
- if (query.search.length > 2e3)
1009
- throw Error("Distinct search exceeds its budget.");
1010
- const source = this.projectedSource(Date.now()), value = builder.field(query.field), array = field.type === "textarray";
1011
- builder.args.push(...source.args);
1012
- const param = builder.bind(query.search);
1013
- const rows = await this.run(
1014
- builder.statement(
1015
- `SELECT CAST(value AS VARCHAR) AS value, COUNT(*) AS n FROM (SELECT ${array ? `unnest(${value})` : value} AS value FROM (${source.sql}) r) v WHERE value IS NOT NULL AND contains(lower(CAST(value AS VARCHAR)), lower(${param})) GROUP BY value ORDER BY n DESC, value ASC LIMIT ${limit + 1}`
1016
- ),
1017
- signal
1018
- );
1019
- const [{ n }] = await this.sql(
1020
- `SELECT COUNT(*) AS n FROM (${source.sql}) r WHERE ${array ? `COALESCE(len(${value}),0) = 0` : `${value} IS NULL`}`,
1021
- source.args,
1022
- signal
1023
- );
1024
- return {
1025
- values: rows.slice(0, limit).map((row) => String(row.value)),
1026
- hasMore: rows.length > limit,
1027
- hasNull: n > 0
1028
- };
1029
- }, signal),
1030
- fetchRow: (identity, signal) => this.serial(async () => {
1031
- const source = this.projectedSource(Date.now());
1032
- const rows = await this.sql(
1033
- `SELECT * FROM (${source.sql}) r WHERE ${quoteIdentifier(this.schema.idField)} = $${source.args.length + 1} LIMIT 2`,
1034
- [...source.args, identity],
1035
- signal
1036
- );
1037
- if (rows.length > 1) throw Error("DuckDB identity must be unique.");
1038
- return rows[0] ? this.formatRow(rows[0], this.schema) : null;
1039
- }, signal),
1040
- fetchFieldStats: (fields, signal) => this.serial(async () => {
1041
- if (fields.length > 64)
1042
- throw Error("At most 64 field stats can be requested.");
1043
- const stats = {};
1044
- for (const name of fields) {
1045
- const builder = this.builder(), field = builder.definition(name), source = this.projectedSource(Date.now()), value = builder.field(name);
1046
- const rows = await this.sql(
1047
- field.type === "textarray" ? `SELECT COUNT(DISTINCT value) AS "distinct" FROM (SELECT unnest(${value}) AS value FROM (${source.sql}) r)` : `SELECT COUNT(DISTINCT ${value}) AS "distinct", MIN(${value}) AS min, MAX(${value}) AS max FROM (${source.sql}) r`,
1048
- source.args,
1049
- signal
1050
- );
1051
- const result = rows[0];
1052
- stats[name] = {
1053
- distinct: result.distinct,
1054
- ...typeof result.min === "number" || typeof result.min === "string" ? { min: result.min } : {},
1055
- ...typeof result.max === "number" || typeof result.max === "string" ? { max: result.max } : {}
1056
- };
1057
- }
1058
- return stats;
1059
- }, signal)
938
+ fetchQueryV3: (request, signal) => this.execute(request, signal)
1060
939
  };
1061
940
  }
941
+ /** Distinct values over the source population, without staging it. */
942
+ distinct(request, signal) {
943
+ const query = request.distinct;
944
+ if (request.rows || request.metrics.length || request.grouping)
945
+ return Promise.reject(
946
+ Error("A distinct request has no rows, metrics or grouping.")
947
+ );
948
+ if (!Number.isSafeInteger(query.limit) || query.limit < 1 || query.limit > 500 || typeof query.search !== "string" || query.search.length > 2e3)
949
+ return Promise.reject(Error("Distinct request exceeds its budget."));
950
+ return this.serial(async () => {
951
+ const builder = this.builder(this.schema, request.now), field = builder.definition(query.field);
952
+ if (!isFilterable2(field))
953
+ throw Error(`Field ${field.name} is not filterable.`);
954
+ const source = this.projectedSource(request.now), value = builder.field(query.field), array = field.type === "textarray";
955
+ builder.args.push(...source.args);
956
+ const population = `(${source.sql}) r WHERE ${builder.where(request.source.where)}`;
957
+ const param = builder.bind(query.search);
958
+ const rows = await this.run(
959
+ builder.statement(
960
+ `SELECT CAST(value AS VARCHAR) AS value, COUNT(*) AS n FROM (SELECT ${array ? `unnest(${value})` : value} AS value FROM ${population}) v WHERE value IS NOT NULL AND contains(lower(CAST(value AS VARCHAR)), lower(${param})) GROUP BY value ORDER BY n DESC, value ASC LIMIT ${query.limit + 1}`
961
+ ),
962
+ signal
963
+ );
964
+ const nulls = this.builder(this.schema, request.now);
965
+ nulls.args.push(...source.args);
966
+ const [{ n }] = await this.run(
967
+ nulls.statement(
968
+ `SELECT COUNT(*) AS n FROM (${source.sql}) r WHERE ${nulls.where(request.source.where)} AND ${array ? `COALESCE(len(${value}),0) = 0` : `${value} IS NULL`}`
969
+ ),
970
+ signal
971
+ );
972
+ return {
973
+ version: 3,
974
+ now: request.now,
975
+ sourceTotal: 0,
976
+ rows: [],
977
+ total: 0,
978
+ schema: { name: this.schema.name, idField: this.schema.idField, fields: [] },
979
+ metrics: [],
980
+ distinct: {
981
+ values: rows.slice(0, query.limit).map((row) => String(row.value)),
982
+ hasMore: rows.length > query.limit,
983
+ hasNull: n > 0
984
+ },
985
+ execution: { ...this.execution, planToken: request.planToken ?? "" }
986
+ };
987
+ }, signal);
988
+ }
1062
989
  };
1063
990
  function createDuckDBTransport(options) {
1064
991
  return new DuckDBBackend(options).transport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sql.ts","../src/backend.ts","../src/wasm.ts","../src/schema.ts"],"sourcesContent":["import {\n branchesOf,\n coerceValue,\n compileFormula,\n compileMetric,\n isFilterable,\n isSortable,\n isSelectable,\n opsForField,\n type FieldDef,\n type FieldSchema,\n type FormulaNode,\n type FormulaPlan,\n type WhereClause,\n type WhereTerm,\n type OrderByClause,\n type ServerQuery,\n} from \"@pythia-software/query-table-core\";\n\nexport interface DuckDBStatement {\n sql: string;\n args: unknown[];\n}\n/** Identifiers come only from the host catalogue, and are always quoted. */\nexport function quoteIdentifier(value: string): string {\n if (!value || value.includes(\"\\0\")) throw Error(\"Invalid DuckDB identifier.\");\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\nexport function quoteRelation(value: string): string {\n return value.split(\".\").map(quoteIdentifier).join(\".\");\n}\nconst aggregates = new Set([\n \"COUNT\",\n \"COUNT_DISTINCT\",\n \"SUM\",\n \"AVG\",\n \"MIN\",\n \"MAX\",\n \"MEDIAN\",\n]);\nconst safeNumber = (value: string) =>\n `(CASE WHEN ${value} IS NULL OR (isfinite(${value}) AND abs(${value}) <= 9007199254740991) THEN ${value} ELSE error('Query Table numeric precision exceeded') END)`;\n\nexport class SQLBuilder {\n readonly args: unknown[] = [];\n constructor(\n readonly schema: FieldSchema,\n readonly now = Date.now(),\n readonly bindings: Record<string, string> = {},\n ) {}\n bind(value: unknown): string {\n this.args.push(value);\n return `$${this.args.length}`;\n }\n statement(sql: string): DuckDBStatement {\n if (sql.length > 262144 || this.args.length > 10000)\n throw Error(\"DuckDB statement budget exceeded.\");\n return { sql, args: [...this.args] };\n }\n definition(name: string): FieldDef {\n const field = this.schema.fields.find((field) => field.name === name);\n if (!field || field.source.kind !== \"backend\")\n throw Error(`Unavailable DuckDB field: ${name}.`);\n return field;\n }\n field(name: string, normalize = true): string {\n const field = this.definition(name),\n value =\n (Object.prototype.hasOwnProperty.call(this.bindings, name)\n ? this.bindings[name]\n : undefined) ??\n quoteIdentifier(\n field.source.kind === \"backend\" ? (field.source.path ?? name) : name,\n );\n if (!normalize) return value;\n if (field.type === \"text\" || field.type === \"enum\")\n return `NULLIF(CAST(${value} AS VARCHAR), '')`;\n if (field.type === \"datetime\") return `CAST(${value} AS TIMESTAMPTZ)`;\n return value;\n }\n where(terms: WhereTerm[]): string {\n if (terms.length > 100)\n throw Error(\"At most 100 filter terms are allowed.\");\n let count = 0;\n return terms.length\n ? terms\n .map((term) => {\n // A term is an OR of branches, each an AND of literals (a single\n // literal, an OR group, or an OR of conjunctions).\n const branches = branchesOf(term);\n const size = branches.reduce((n, branch) => n + branch.length, 0);\n if (!branches.length || branches.some((branch) => !branch.length) || (count += size) > 100)\n throw Error(\"Invalid filter predicate budget.\");\n const compile = (clause: WhereClause): string => {\n const field = this.definition(clause.field),\n raw = this.field(field.name),\n op = clause.op;\n if (!isFilterable(field) || !opsForField(field).includes(op))\n throw Error(`Unsupported filter on ${field.name}: ${op}.`);\n const value =\n field.type === \"textarray\"\n ? `CASE WHEN len(${raw}) > 0 THEN ${raw} END`\n : raw;\n let sql: string;\n if (op === \"is_null\" || op === \"is_not_null\")\n sql = `${value} IS ${op === \"is_null\" ? \"\" : \"NOT \"}NULL`;\n else {\n const typed = coerceValue(field.type, clause.value, this.now);\n if (typeof typed === \"number\" && !Number.isFinite(typed))\n throw Error(\"Filter operands must be finite.\");\n const param = this.bind(\n field.type === \"datetime\"\n ? new Date(typed as number).toISOString()\n : typed,\n );\n const rhs =\n field.type === \"datetime\"\n ? `CAST(${param} AS TIMESTAMPTZ)`\n : param;\n if ([\"=\", \"!=\", \">\", \">=\", \"<\", \"<=\"].includes(op))\n sql = `${value} ${op} ${rhs}`;\n else if (\n [\"contains\", \"starts_with\", \"ends_with\"].includes(op)\n )\n sql = `${op}(lower(${value}), lower(${param}))`;\n else if (op === \"includes\")\n sql = field.filter?.arrayCaseSensitive\n ? `list_contains(${value}, ${param})`\n : `list_contains(list_transform(${value}, x -> lower(x)), lower(${param}))`;\n else if (op.startsWith(\"length_\"))\n sql = `length(${value}) ${op === \"length_gt\" ? \">\" : op === \"length_lt\" ? \"<\" : \"=\"} CAST(${param} AS DOUBLE)`;\n else if (\n op === \"matches_regex\" ||\n op === \"not_matches_regex\"\n ) {\n if (clause.value.length > 2000)\n throw Error(\"Regex exceeds 2,000 characters.\");\n sql = `${op === \"not_matches_regex\" ? \"NOT \" : \"\"}regexp_matches(${value}, ${param})`;\n } else throw Error(`Unsupported DuckDB operator: ${op}.`);\n }\n return clause.negated ? `NOT (${sql})` : sql;\n };\n return `(${branches\n .map((branch) => branch.length === 1 ? compile(branch[0]!) : `(${branch.map(compile).join(\" AND \")})`)\n .join(\" OR \")})`;\n })\n .join(\" AND \")\n : \"TRUE\";\n }\n order(terms: OrderByClause[], identity = true): string {\n if (terms.length > 20) throw Error(\"At most 20 sort fields are allowed.\");\n const output = terms.map((term) => {\n const field = this.definition(term.field);\n if (!isSortable(field) && field.name !== this.schema.idField)\n throw Error(`Field ${field.name} is not sortable.`);\n if (\n ![\"asc\", \"desc\"].includes(term.dir) ||\n (term.nulls && ![\"first\", \"last\"].includes(term.nulls))\n )\n throw Error(\"Invalid ordering.\");\n let value = this.field(field.name);\n if (term.extract) {\n if (field.type !== \"text\" || term.extract.regex.length > 2000)\n throw Error(\"Invalid regex extraction.\");\n const pattern = this.bind(term.extract.regex);\n // DuckDB/RE2 extraction uses the first capture, or the full match.\n const capture = /(^|[^\\\\])\\((?!\\?)/.test(term.extract.regex) ? 1 : 0;\n value = `CASE WHEN regexp_matches(${value}, ${pattern}) THEN regexp_extract(${value}, ${pattern}, ${capture}) END`;\n }\n return `${value} ${term.dir.toUpperCase()} NULLS ${(term.nulls ?? \"last\").toUpperCase()}`;\n });\n if (identity && !terms.some((term) => term.field === this.schema.idField))\n output.push(`${this.field(this.schema.idField)} ASC NULLS LAST`);\n return output.length ? `ORDER BY ${output.join(\", \")}` : \"\";\n }\n expression(\n source: string,\n aggregate = false,\n ): { sql: string; plan: FormulaPlan } {\n const plan = aggregate\n ? compileMetric(source, this.schema)\n : compileFormula(source, this.schema.fields);\n return { sql: this.node(plan.ast), plan };\n }\n node(node: FormulaNode): string {\n const sql = this.nodeSQL(node);\n if (sql.length > 131072)\n throw Error(\"DuckDB expression SQL budget exceeded.\");\n return sql;\n }\n private nodeSQL(node: FormulaNode): string {\n if (node.kind === \"literal\")\n return node.value === null ? \"NULL\" : this.bind(node.value);\n if (node.kind === \"field\") return this.field(node.name, false);\n const name = node.name,\n vs = node.args.map((arg) => this.node(arg)),\n a = vs[0]!,\n b = vs[1]!,\n c = vs[2]!;\n if (aggregates.has(name)) {\n if (name === \"COUNT\") return `CAST(COUNT(${a ?? \"*\"}) AS DOUBLE)`;\n if (name === \"COUNT_DISTINCT\")\n return `CAST(COUNT(DISTINCT ${a}) AS DOUBLE)`;\n const sql = `${name}(${a})`;\n return [\"SUM\", \"AVG\", \"MEDIAN\"].includes(name)\n ? safeNumber(\n `CAST(${name === \"SUM\" ? `COALESCE(${sql}, 0)` : sql} AS DOUBLE)`,\n )\n : sql;\n }\n if (name.startsWith(\"op:\")) {\n const op = name.slice(3);\n if (op === \"IN\") return `(${a} IN (${vs.slice(1).join(\", \")}))`;\n if (op === \"BETWEEN\") return `(${a} BETWEEN ${b} AND ${c})`;\n if ([\"/\", \"%\"].includes(op))\n return safeNumber(\n `(CASE WHEN ${b} = 0 THEN error('Division by zero') ELSE ${a} ${op} ${b} END)`,\n );\n return [\"+\", \"-\", \"*\"].includes(op)\n ? safeNumber(`(${a} ${op} ${b})`)\n : `(${a} ${op} ${b})`;\n }\n if (name.startsWith(\"unary:\")) return `(${name.slice(6)} ${a})`;\n if (name === \"IF\") return `CASE WHEN ${a} THEN ${b} ELSE ${c} END`;\n if (name === \"IFS\")\n return `CASE ${vs\n .slice(0, -1)\n .filter((_, i) => i % 2 === 0)\n .map((v, i) => `WHEN ${v} THEN ${vs[2 * i + 1]}`)\n .join(\" \")} ELSE ${vs[vs.length - 1]} END`;\n if (name === \"SWITCH\")\n return `CASE ${vs\n .slice(1, -1)\n .filter((_, i) => i % 2 === 0)\n .map(\n (v, i) => `WHEN ${a} IS NOT DISTINCT FROM ${v} THEN ${vs[2 * i + 2]}`,\n )\n .join(\" \")} ELSE ${vs[vs.length - 1]} END`;\n if (name === \"IS_NULL\") return `(${a} IS NULL)`;\n if (name === \"IS_EMPTY\") {\n const input = node.args[0]!;\n const array =\n (input.kind === \"field\" && input.valueType === \"textarray\") ||\n (input.kind === \"call\" &&\n [\"SPLIT\", \"ARRAY_UNIQUE\", \"ARRAY_SORT\"].includes(input.name));\n return `(${a} IS NULL OR len(${array ? a : `CAST(${a} AS VARCHAR)`}) = 0)`;\n }\n if (name === \"COALESCE\" || name === \"NULLIF\")\n return `${name}(${vs.join(\", \")})`;\n if (name === \"IFERROR\")\n throw Error(\"IFERROR is not available in the qt-duckdb-v1 SQL profile.\");\n if (name === \"ROUND\") {\n const scale = `power(10, ${b ?? \"0\"})`;\n return safeNumber(`(floor(${a} * ${scale} + 0.5) / ${scale})`);\n }\n if (name === \"CLAMP\")\n return `CASE WHEN ${a} IS NULL OR ${b} IS NULL OR ${c} IS NULL THEN NULL ELSE greatest(${b}, least(${c}, ${a})) END`;\n if (name === \"LEAST\" || name === \"GREATEST\" || name === \"CONCAT\")\n return `CASE WHEN ${vs.map((v) => `${v} IS NULL`).join(\" OR \")} THEN NULL ELSE ${name}(${vs.join(\", \")}) END`;\n if (name === \"CONCAT_WS\")\n return `CASE WHEN ${a} IS NULL THEN NULL ELSE concat_ws(${vs.join(\", \")}) END`;\n if ([\"CONTAINS\", \"STARTS_WITH\", \"ENDS_WITH\"].includes(name))\n return `${name.toLowerCase()}(CASE WHEN ${c ?? \"FALSE\"} THEN lower(${a}) ELSE ${a} END, CASE WHEN ${c ?? \"FALSE\"} THEN lower(${b}) ELSE ${b} END)`;\n if (name === \"TO_NUMBER\") return safeNumber(`CAST(${a} AS DOUBLE)`);\n if (name === \"TO_TEXT\") return `CAST(${a} AS VARCHAR)`;\n if (name === \"URL_ENCODE\") return `url_encode(${a})`;\n if (name === \"TO_BOOLEAN\") return `CAST(${a} AS BOOLEAN)`;\n if (name === \"TO_DATETIME\") return `CAST(${a} AS TIMESTAMPTZ)`;\n if (name === \"SPLIT\") return `string_split(${a}, ${b})`;\n if (name === \"JOIN\") return `array_to_string(${a}, ${b})`;\n if (name === \"ARRAY_LENGTH\") return `len(${a})`;\n if (name === \"ARRAY_CONTAINS\") return `list_contains(${a}, ${b})`;\n if (name === \"ARRAY_GET\")\n return `CASE WHEN ${b} < 0 THEN error('Array index must be nonnegative') ELSE list_extract(${a}, CAST(${b} + 1 AS BIGINT)) END`;\n if (name === \"ARRAY_SORT\") return `list_sort(${a})`;\n if (name === \"ARRAY_UNIQUE\")\n return `list_filter(${a}, (x, i) -> list_position(${a}, x) = i)`;\n if (name === \"WEEKDAY\")\n return `extract(isodow FROM CAST(${a} AS TIMESTAMPTZ))`;\n if ([\"YEAR\", \"MONTH\", \"DAY\", \"HOUR\"].includes(name))\n return `extract(${name.toLowerCase()} FROM CAST(${a} AS TIMESTAMPTZ))`;\n if (name === \"DATE_TRUNC\")\n return `date_trunc(${a}, CAST(${b} AS TIMESTAMPTZ))`;\n if (\n name === \"DATE_DIFF\" ||\n name === \"DATE_ADD\" ||\n name === \"FORMAT_DATE\" ||\n name.startsWith(\"REGEX_\")\n )\n throw Error(`${name} is not available in the qt-duckdb-v1 SQL profile.`);\n if (\n [\"LEFT\", \"RIGHT\", \"SUBSTRING\", \"LPAD\", \"RPAD\", \"SPLIT_PART\"].includes(\n name,\n )\n ) {\n const args = [...vs];\n const indices =\n name === \"SUBSTRING\" ? [1, 2] : name === \"SPLIT_PART\" ? [2] : [1];\n for (const index of indices)\n if (args[index] !== undefined)\n args[index] = `CAST(${args[index]} AS BIGINT)`;\n return `${name}(${args.join(\", \")})`;\n }\n if (\n [\n \"LENGTH\",\n \"LOWER\",\n \"UPPER\",\n \"TRIM\",\n \"LTRIM\",\n \"RTRIM\",\n \"REPLACE\",\n \"ABS\",\n \"FLOOR\",\n \"CEIL\",\n \"TRUNC\",\n \"POWER\",\n \"SQRT\",\n ].includes(name)\n )\n return `${name}(${vs.join(\", \")})`;\n throw Error(`Unsupported DuckDB function: ${name}.`);\n }\n}\n\nexport function compileDuckDBRows(\n query: ServerQuery,\n schema: FieldSchema,\n relation: string,\n now = Date.now(),\n): DuckDBStatement {\n const sql = new SQLBuilder(schema, now);\n if (\n !Number.isSafeInteger(query.limit) ||\n query.limit < 1 ||\n query.limit > 10000 ||\n !Number.isSafeInteger(query.offset) ||\n query.offset < 0\n )\n throw Error(\"Invalid result window.\");\n const select = [...new Set([schema.idField, ...query.select])].map((name) => {\n const field = sql.definition(name);\n if (!isSelectable(field) && name !== schema.idField)\n throw Error(`Field ${name} is not selectable.`);\n return `${sql.field(name, false)} AS ${quoteIdentifier(name)}`;\n });\n const where = sql.where(query.where),\n order = sql.order(query.orderBy);\n return sql.statement(\n `SELECT ${select.join(\", \")} FROM ${quoteRelation(relation)} WHERE ${where} ${order} LIMIT ${sql.bind(query.limit)} OFFSET ${sql.bind(query.offset)}`,\n );\n}\n","import {\n compileFormula,\n createGroupingModel,\n GROUP_ID_FIELD,\n metricExpression,\n metricMinCount,\n metricMinCountKeeps,\n metricMinCountMeasure,\n validateMetric,\n isSelectable,\n isFilterable,\n boxSummary,\n histogramEdges,\n histogramCounts,\n compareMetricValues,\n metricDateFloor,\n isMetricCycle,\n metricCycleSlot,\n metricCycleSlots,\n metricDateTime,\n metricDateNext,\n metricDateRange,\n groupKeyFields,\n isCalendarGroupKey,\n type AggregationClause,\n type AggregationResult,\n type AggregationResultEntry,\n type ComputedColumn,\n type ComputedExecution,\n type FieldSchema,\n type FormulaPlan,\n type MetricQuery,\n type QueryCapabilitiesV3,\n type QueryRequestV3,\n type QueryResultV3,\n type ServerQuery,\n type Transport,\n type MetricDateGrouping,\n type MetricSort,\n type MetricValue,\n type QueryState,\n} from \"@pythia-software/query-table-core\";\nimport {\n SQLBuilder,\n quoteIdentifier as id,\n quoteRelation,\n type DuckDBStatement,\n} from \"./sql\";\n\nexport const DUCKDB_PROFILE = \"qt-duckdb-v1\";\nexport type DuckDBRow = Record<string, unknown>;\n/** One exclusive connection, with bound parameters; no driver runtime dependency. */\nexport interface DuckDBConnection {\n query(sql: string, args: unknown[]): Promise<DuckDBRow[]>;\n interrupt?(): void | Promise<void>;\n}\nexport interface DuckDBOptions {\n connection: DuckDBConnection;\n schema: FieldSchema;\n relation: string;\n /** Trusted SQL expressions, keyed by the host's field names. Never request SQL. */\n bindings?: Record<string, string>;\n computedColumns?: readonly ComputedColumn[];\n snapshot?: string;\n maxRows?: number;\n maxGroups?: number;\n maxPopulation?: number;\n maxSamples?: number;\n maxStagingBytes?: number;\n}\nfunction abort(signal?: AbortSignal): void {\n if (signal?.aborted)\n throw new DOMException(\"DuckDB query cancelled.\", \"AbortError\");\n}\n/** Normalize both Arrow and Node values at the transport boundary. */\nexport function normalizeDuckDBValue(value: unknown): unknown {\n if (typeof value === \"bigint\") {\n const numeric = Number(value);\n if (!Number.isSafeInteger(numeric))\n throw Error(\"DuckDB integer exceeds JavaScript safe precision.\");\n return numeric;\n }\n if (value instanceof Date) return value.toISOString();\n if (\n typeof value === \"number\" &&\n (!Number.isFinite(value) || Math.abs(value) > Number.MAX_SAFE_INTEGER)\n )\n throw Error(\"DuckDB number exceeds finite safe precision.\");\n if (Array.isArray(value)) return value.map(normalizeDuckDBValue);\n if (value && typeof value === \"object\") {\n // Arrow vectors expose toArray(); StructRow exposes toJSON().\n if (\"toArray\" in value && typeof value.toArray === \"function\")\n return Array.from(value.toArray()).map(normalizeDuckDBValue);\n if (\"toJSON\" in value && typeof value.toJSON === \"function\")\n return normalizeDuckDBValue(value.toJSON());\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n normalizeDuckDBValue(item),\n ]),\n );\n }\n return value;\n}\nfunction positive(\n value: number | undefined,\n fallback: number,\n maximum: number,\n): number {\n const out = value ?? fallback;\n if (!Number.isSafeInteger(out) || out < 1 || out > maximum)\n throw Error(\"Invalid DuckDB resource budget.\");\n return out;\n}\n\nexport class DuckDBBackend {\n readonly schema: FieldSchema;\n readonly execution: ComputedExecution;\n readonly capabilities: QueryCapabilitiesV3;\n readonly maxSamples: number;\n readonly maxStagingBytes: number;\n private queue: Promise<unknown> = Promise.resolve();\n private sequence = 0;\n private readonly computed = new Map<string, FormulaPlan>();\n constructor(readonly options: DuckDBOptions) {\n const fields = options.schema.fields\n .filter((field) => field.source.kind === \"backend\")\n .map((field) => ({\n ...field,\n source: { ...field.source, kind: \"backend\" as const, path: field.name },\n }));\n if (\n !fields.some((field) => field.name === options.schema.idField) ||\n new Set(fields.map((field) => field.name)).size !== fields.length\n )\n throw Error(\n \"DuckDB needs a unique field catalogue and a bound identity.\",\n );\n quoteRelation(options.relation);\n this.schema = { ...options.schema, fields };\n const definitions = new Map(\n (options.computedColumns ?? []).map((column) => [\n `@computed/${column.id}`,\n column,\n ]),\n );\n const visiting = new Set<string>();\n const resolve = (name: string): FormulaPlan | undefined => {\n if (this.computed.has(name)) return this.computed.get(name);\n const definition = definitions.get(name);\n if (!definition) return undefined;\n if (visiting.has(name)) throw Error(\"Computed definition cycle.\");\n visiting.add(name);\n const plan = compileFormula(\n definition.expression.source,\n fields,\n resolve,\n );\n // Reject unsupported SQL at negotiation, before advertising capabilities.\n new SQLBuilder(this.schema).node(plan.ast);\n visiting.delete(name);\n this.computed.set(name, plan);\n return plan;\n };\n for (const name of definitions.keys()) {\n const plan = resolve(name)!;\n fields.push({\n name,\n label: definitions.get(name)!.label,\n type: plan.type === \"null\" ? \"text\" : plan.type,\n source: { kind: \"backend\", path: name },\n filter: { enabled: true },\n sort: { enabled: true },\n aggregate: { measure: true, groupable: plan.type !== \"textarray\" },\n });\n }\n this.execution = {\n profile: DUCKDB_PROFILE,\n planToken: `duckdb:${JSON.stringify([...definitions.values()].map((column) => [column.id, column.revision]))}`,\n resolvedRevisions: Object.fromEntries(\n [...definitions.values()].map((column) => [column.id, column.revision]),\n ),\n fields: Object.fromEntries(\n fields\n .filter((field) => definitions.has(field.name))\n .map((field) => [\n field.name,\n {\n type: field.type,\n select: true,\n filter: true,\n sort: true,\n measure: true,\n group: field.type !== \"textarray\",\n },\n ]),\n ),\n ...(options.snapshot !== undefined ? { snapshot: options.snapshot } : {}),\n };\n this.capabilities = {\n version: 3,\n profile: DUCKDB_PROFILE,\n groupedRows: true,\n calendarGrouping: true,\n calendarCycles: true,\n calendarGroupKeys: true,\n computedSourceFilters: definitions.size > 0,\n regex: true,\n regexSourceFilters: true,\n regexAggregateExpressions: false,\n metricFilters: true,\n metricMinCount: true,\n metricMinCountMeasures: true,\n maxRows: positive(options.maxRows, 10000, 10000),\n maxGroups: positive(options.maxGroups, 10000, 10000),\n maxPopulation: positive(options.maxPopulation, 250000, 10000000),\n };\n this.maxSamples = positive(options.maxSamples, 100000, 1000000);\n this.maxStagingBytes = positive(\n options.maxStagingBytes,\n 64 * 1024 * 1024,\n 1024 * 1024 * 1024,\n );\n }\n private serial<T>(work: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n const next = this.queue.then(() => {\n abort(signal);\n return work();\n });\n this.queue = next.catch(() => {});\n return next;\n }\n /** Wait before closing an owned driver connection. */\n async drain(): Promise<void> {\n await this.queue;\n }\n private async run(\n statement: DuckDBStatement,\n signal?: AbortSignal,\n ): Promise<DuckDBRow[]> {\n abort(signal);\n const cancel = () => {\n void this.options.connection.interrupt?.();\n };\n signal?.addEventListener(\"abort\", cancel, { once: true });\n try {\n const rows = await this.options.connection.query(\n statement.sql,\n statement.args,\n );\n abort(signal);\n return rows.map((row) => normalizeDuckDBValue(row) as DuckDBRow);\n } finally {\n signal?.removeEventListener(\"abort\", cancel);\n }\n }\n private sql(statement: string, args: unknown[] = [], signal?: AbortSignal) {\n return this.run({ sql: statement, args }, signal);\n }\n private window(query: ServerQuery): void {\n if (\n !Number.isSafeInteger(query.limit) ||\n query.limit < 1 ||\n query.limit > this.capabilities.maxRows ||\n !Number.isSafeInteger(query.offset) ||\n query.offset < 0\n )\n throw Error(\"Invalid DuckDB result window.\");\n }\n private builder(schema = this.schema, now = Date.now()) {\n return new SQLBuilder(schema, now);\n }\n private projectedSource(now: number): DuckDBStatement {\n const bindings = Object.fromEntries(\n this.schema.fields\n .filter((field) => !this.computed.has(field.name))\n .map((field) => [\n field.name,\n (this.options.bindings &&\n Object.prototype.hasOwnProperty.call(\n this.options.bindings,\n field.name,\n )\n ? this.options.bindings[field.name]\n : undefined) ??\n id(\n (() => {\n const original = this.options.schema.fields.find(\n (item) => item.name === field.name,\n );\n return original?.source.kind === \"backend\"\n ? (original.source.path ?? field.name)\n : field.name;\n })(),\n ),\n ]),\n );\n const builder = new SQLBuilder(this.schema, now, bindings);\n const projections = this.schema.fields.map((field) => {\n const plan = this.computed.get(field.name),\n raw = plan ? builder.node(plan.ast) : bindings[field.name]!;\n return `${raw} AS ${id(field.name)}`;\n });\n return builder.statement(\n `SELECT ${projections.join(\", \")} FROM ${quoteRelation(this.options.relation)} AS r`,\n );\n }\n private async transaction<T>(\n work: (tables: string[]) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n return this.serial(async () => {\n await this.sql(\"BEGIN TRANSACTION\", [], signal);\n const tables: string[] = [];\n try {\n const result = await work(tables);\n for (const table of tables.reverse())\n await this.sql(`DROP TABLE ${id(table)}`, [], signal);\n await this.sql(\"COMMIT\", [], signal);\n return result;\n } catch (error) {\n await this.sql(\"ROLLBACK\").catch(() => {});\n // Metrics commit staged relations before isolating each clause, so a\n // rollback alone may not remove them.\n for (const table of tables.reverse())\n await this.sql(`DROP TABLE IF EXISTS ${id(table)}`).catch(() => {});\n abort(signal);\n throw error;\n }\n }, signal);\n }\n private temp(tables: string[]): string {\n const name = `qt_duckdb_${++this.sequence}`;\n tables.push(name);\n return name;\n }\n private async stage(\n source: ServerQuery,\n now: number,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<{ name: string; count: number }> {\n const projection = this.projectedSource(now),\n builder = this.builder(this.schema, now);\n builder.args.push(...projection.args);\n const where = builder.where(source.where),\n name = this.temp(tables);\n const population = `(${projection.sql}) r WHERE ${where}`;\n const [{ n, bytes }] = (await this.run(\n builder.statement(\n `SELECT COUNT(*) AS n, COALESCE(SUM(octet_length(encode(CAST(to_json(r) AS VARCHAR)))),0) AS bytes FROM ${population}`,\n ),\n signal,\n )) as [{ n: number; bytes: number }];\n if (n > this.capabilities.maxPopulation || bytes > this.maxStagingBytes)\n throw Error(\"DuckDB source population or staging byte budget exceeded.\");\n await this.run(\n builder.statement(\n `CREATE TEMP TABLE ${id(name)} AS SELECT * FROM ${population}`,\n ),\n signal,\n );\n const [{ invalid }] = (await this.sql(\n `SELECT COUNT(*) - COUNT(DISTINCT ${id(this.schema.idField)}) AS invalid FROM ${id(name)}`,\n [],\n signal,\n )) as [{ invalid: number }];\n if (invalid !== 0)\n throw Error(\"DuckDB source identity must be unique and non-null.\");\n return { name, count: n };\n }\n private async page(\n relation: string,\n schema: FieldSchema,\n query: ServerQuery,\n now: number,\n signal?: AbortSignal,\n ) {\n this.window(query);\n const builder = this.builder(schema, now),\n where = builder.where(query.where);\n const [{ total }] = (await this.run(\n builder.statement(\n `SELECT COUNT(*) AS total FROM ${id(relation)} WHERE ${where}`,\n ),\n signal,\n )) as [{ total: number }];\n const order = builder.order(query.orderBy),\n names = [...new Set([schema.idField, ...query.select])];\n names.forEach((name) => {\n if (!isSelectable(builder.definition(name)) && name !== schema.idField)\n throw Error(`Field ${name} is not selectable.`);\n });\n const rows = await this.run(\n builder.statement(\n `SELECT ${names.map(id).join(\", \")} FROM ${id(relation)} WHERE ${where} ${order} LIMIT ${builder.bind(query.limit)} OFFSET ${builder.bind(query.offset)}`,\n ),\n signal,\n );\n return { rows: rows.map((row) => this.formatRow(row, schema)), total };\n }\n private formatRow(row: DuckDBRow, schema: FieldSchema): DuckDBRow {\n return Object.fromEntries(\n Object.entries(row).map(([name, value]) => {\n const field = schema.fields.find((field) => field.name === name);\n if (value != null && field?.type === \"datetime\") {\n // DuckDB's textual native TIMESTAMP has no suffix; our session profile\n // interprets that storage as UTC, independently of the JS host timezone.\n const text = String(value);\n const canonical =\n /^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/.test(text)\n ? `${text.replace(\" \", \"T\")}Z`\n : text;\n const date =\n typeof value === \"number\" ? new Date(value) : new Date(canonical);\n if (!Number.isFinite(date.getTime()))\n throw Error(`Invalid datetime returned for ${name}.`);\n value = date.toISOString();\n }\n return [name, value];\n }),\n );\n }\n private validateRequest(request: QueryRequestV3): void {\n if (\n request.version !== 3 ||\n request.profile !== DUCKDB_PROFILE ||\n request.diagnostics.length\n )\n throw Error(\"Invalid DuckDB execution request or profile.\");\n if (\n !Number.isSafeInteger(request.now) ||\n Math.abs(request.now) > 8640000000000000\n )\n throw Error(\"Invalid query clock.\");\n if (\n (request.planToken ?? \"\") !==\n (Object.keys(this.execution.fields).length\n ? this.execution.planToken\n : \"\") &&\n request.planToken !== this.execution.planToken\n )\n throw Error(\"DuckDB execution handshake changed.\");\n if ((request.snapshot ?? \"\") !== (this.options.snapshot ?? \"\"))\n throw Error(\"DuckDB snapshot changed.\");\n for (const [key, revision] of Object.entries(request.expectedRevisions))\n if (this.execution.resolvedRevisions[key] !== revision)\n throw Error(\"Computed definitions changed; refresh the handshake.\");\n if (request.metrics.length > 20)\n throw Error(\"At most 20 metrics are allowed.\");\n this.window(request.result);\n const model = createGroupingModel(this.schema);\n if (request.grouping) model.validate(request.grouping);\n const resultSchema = request.grouping\n ? model.resultSchema(request.grouping.keys, request.grouping.summaries)\n : this.schema;\n this.builder(this.schema, request.now).where(request.source.where);\n const result = this.builder(resultSchema, request.now);\n result.where(request.result.where);\n result.order(request.result.orderBy);\n request.result.select.forEach((name) => result.definition(name));\n }\n async execute(\n request: QueryRequestV3,\n signal?: AbortSignal,\n ): Promise<QueryResultV3> {\n this.validateRequest(request);\n return this.transaction(async (tables) => {\n const source = await this.stage(\n request.source,\n request.now,\n tables,\n signal,\n );\n let relation = source.name,\n schema = this.schema;\n if (request.grouping) {\n const grouping = request.grouping,\n model = createGroupingModel(schema),\n builder = this.builder(schema, request.now);\n // A calendar key reads the interval start mapped from its field.\n let from = id(source.name);\n const keys: string[] = [];\n for (const [index, key] of grouping.keys.entries()) {\n if (!isCalendarGroupKey(key)) {\n keys.push(builder.field(key, false));\n continue;\n }\n const mapping = await this.calendarMapping(\n id(source.name),\n builder,\n schema,\n key,\n tables,\n signal,\n );\n const value = id(`qt_calendar_value${index}`),\n bucket = id(`qt_calendar_key${index}`);\n from += ` LEFT JOIN (SELECT value AS ${value}, bucket AS ${bucket} FROM ${id(mapping)}) AS ${id(`qt_calendar_map${index}`)} ON ${value} = CAST(${builder.field(key.field, false)} AS TIMESTAMPTZ)`;\n keys.push(bucket);\n }\n const names = groupKeyFields(grouping.keys).map(id);\n const representative = builder\n .order(\n grouping.representative?.orderBy ?? [\n { field: schema.idField, dir: \"desc\" },\n ],\n false,\n )\n .replace(/^ORDER BY /, \"\");\n const tie = grouping.representative?.orderBy.some(\n (term) => term.field === schema.idField,\n )\n ? \"\"\n : `, ${builder.field(schema.idField)} DESC NULLS LAST`;\n const summaries = grouping.summaries.map(\n (summary) =>\n `${\n summary.op === \"row\"\n ? `first(${builder.field(summary.field!, false)} ORDER BY ${representative}${tie})`\n : builder.expression(model.summaryExpression(summary), true).sql\n } AS ${id(summary.id)}`,\n );\n relation = this.temp(tables);\n const identity = `CAST(to_json(struct_pack(${keys.map((key, i) => `k${i} := ${key}`).join(\", \")})) AS VARCHAR)`;\n await this.run(\n builder.statement(\n `CREATE TEMP TABLE ${id(relation)} AS SELECT ${identity} AS ${id(GROUP_ID_FIELD)}, ${keys.map((key, i) => `${key} AS ${names[i]}`).join(\", \")}${summaries.length ? `, ${summaries.join(\", \")}` : \"\"} FROM ${from} GROUP BY ${keys.join(\", \")}`,\n ),\n signal,\n );\n const [{ n }] = (await this.sql(\n `SELECT COUNT(*) AS n FROM ${id(relation)}`,\n [],\n signal,\n )) as [{ n: number }];\n if (n > this.capabilities.maxGroups)\n throw Error(\"DuckDB grouped row budget exceeded.\");\n schema = model.resultSchema(grouping.keys, grouping.summaries);\n }\n const page = await this.page(\n relation,\n schema,\n request.result,\n request.now,\n signal,\n );\n const metrics = await this.metrics(\n relation,\n schema,\n request.result,\n request.metrics,\n request.now,\n tables,\n signal,\n );\n return {\n version: 3,\n now: request.now,\n sourceTotal: source.count,\n rows: request.rows ? page.rows : [],\n total: page.total,\n schema: {\n name: schema.name,\n idField: schema.idField,\n fields: schema.fields.map((field) => ({\n name: field.name,\n type: field.type,\n })),\n },\n metrics,\n execution: { ...this.execution, planToken: request.planToken ?? \"\" },\n };\n }, signal);\n }\n private async metrics(\n relation: string,\n schema: FieldSchema,\n query: ServerQuery,\n clauses: AggregationClause[],\n now: number,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<AggregationResultEntry[]> {\n const output: AggregationResultEntry[] = [];\n // A failed DuckDB statement aborts its transaction, and DuckDB has no\n // savepoints. Clauses read only staged temporary relations, so commit\n // them and give each clause its own transaction.\n await this.sql(\"COMMIT\", [], signal);\n for (const clause of clauses) {\n abort(signal);\n const created = tables.length;\n await this.sql(\"BEGIN TRANSACTION\", [], signal);\n try {\n const entry = await this.metric(\n relation,\n schema,\n query,\n clause,\n now,\n tables,\n signal,\n );\n await this.sql(\"COMMIT\", [], signal);\n output.push(entry);\n } catch (error) {\n await this.sql(\"ROLLBACK\").catch(() => {});\n // The rollback discarded this clause's scratch relations.\n tables.splice(created);\n abort(signal);\n output.push({\n id: clause.id,\n buckets: [],\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n await this.sql(\"BEGIN TRANSACTION\", [], signal);\n return output;\n }\n /** A temporary (value, bucket) table mapping each distinct non-null value\n * of `config.field` in `population` to the start of its calendar interval,\n * or to its cyclic slot, computed with the core calendar. */\n private async calendarMapping(\n population: string,\n builder: SQLBuilder,\n schema: FieldSchema,\n config: Pick<MetricDateGrouping, \"field\" | \"interval\" | \"timeZone\">,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<string> {\n const source = builder.field(config.field, false),\n cycle = isMetricCycle(config.interval) ? config.interval : undefined;\n const dates = await this.run(\n builder.statement(\n `SELECT DISTINCT CAST(${source} AS VARCHAR) AS value FROM ${population} r WHERE ${source} IS NOT NULL`,\n ),\n signal,\n );\n const mapping = this.temp(tables);\n await this.sql(\n `CREATE TEMP TABLE ${id(mapping)} (value TIMESTAMPTZ, bucket ${cycle ? \"INTEGER\" : \"TIMESTAMPTZ\"})`,\n [],\n signal,\n );\n for (let i = 0; i < dates.length; i += 250) {\n const args: unknown[] = [];\n const values = dates.slice(i, i + 250).map((row) => {\n const value = /^\\d{4}-\\d{2}-\\d{2}$/.test(String(row.value))\n ? String(row.value)\n : (this.formatRow({ [config.field]: row.value }, schema)[\n config.field\n ] as string);\n const floor = metricDateFloor(\n metricDateTime(value, config.timeZone),\n config.interval,\n config.timeZone,\n );\n // A cyclic slot is the local hour or weekday of the record's interval.\n args.push(\n value,\n cycle\n ? metricCycleSlot(floor, cycle, config.timeZone)\n : new Date(floor).toISOString(),\n );\n return `(CAST($${args.length - 1} AS TIMESTAMPTZ), CAST($${args.length} AS ${cycle ? \"INTEGER\" : \"TIMESTAMPTZ\"}))`;\n });\n if (values.length)\n await this.sql(\n `INSERT INTO ${id(mapping)} VALUES ${values.join(\", \")}`,\n args,\n signal,\n );\n }\n return mapping;\n }\n private async metric(\n relation: string,\n schema: FieldSchema,\n query: ServerQuery,\n clause: AggregationClause,\n now: number,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<AggregationResultEntry> {\n // Wire metrics carry active distributions without presentation settings.\n if (clause.distribution && !clause.display)\n clause = { ...clause, display: { kind: clause.distribution.kind } };\n const issues = validateMetric(clause, schema);\n if (issues.length)\n throw Error(issues.map((issue) => issue.message).join(\" \"));\n const builder = this.builder(schema, now),\n where = builder.where(query.where);\n const window =\n clause.scope === \"shownRows\"\n ? `${builder.order(query.orderBy)} LIMIT ${builder.bind(query.limit)} OFFSET ${builder.bind(query.offset)}`\n : \"\";\n let population = `(SELECT * FROM ${id(relation)} WHERE ${where} ${window})`;\n // The metric's own predicate narrows the scoped rows (inside the page for\n // shown-row scope) and never changes the table rows.\n if (clause.where?.length)\n population = `(SELECT * FROM ${population} r WHERE ${builder.where(clause.where)})`;\n if (clause.dateGrouping) {\n const config = clause.dateGrouping;\n const dateMapping = await this.calendarMapping(\n population,\n builder,\n schema,\n config,\n tables,\n signal,\n );\n population = `(SELECT r.* EXCLUDE (${id(config.field)}), m.bucket AS ${id(config.field)} FROM ${population} r LEFT JOIN ${id(dateMapping)} m ON CAST(r.${id(config.field)} AS TIMESTAMPTZ) = m.value)`;\n }\n const keys = clause.groupBy.map((name) => builder.field(name, false)),\n groups = keys.length ? `GROUP BY ${keys.join(\", \")}` : \"\";\n const distribution =\n clause.distribution &&\n [\"box\", \"histogram\"].includes(clause.display?.kind ?? \"\")\n ? clause.distribution\n : undefined;\n const expression = distribution\n ? builder.expression(distribution.input).sql\n : builder.expression(metricExpression(clause), true).sql;\n const projections = keys.map(\n (key, index) => `${key} AS ${id(`g${index}`)}`,\n );\n projections.push(\n \"COUNT(*) AS count\",\n distribution\n ? `list(${expression}) FILTER (WHERE ${expression} IS NOT NULL) AS samples`\n : `${expression} AS value`,\n );\n if (!distribution && clause.display?.kind === \"scatter\")\n projections.push(\n `${builder.expression(clause.expressionY ?? \"COUNT()\", true).sql} AS y`,\n );\n // An object minCount measures each group with its own aggregate.\n const minMeasure = metricMinCountMeasure(clause);\n if (minMeasure)\n projections.push(\n `${builder.expression(metricExpression({ id: \"\", groupBy: [], ...minMeasure }), true).sql} AS min_measure`,\n );\n const rows = await this.run(\n builder.statement(\n `SELECT ${projections.join(\", \")} FROM ${population} r ${groups} LIMIT ${this.capabilities.maxGroups + 1}`,\n ),\n signal,\n );\n if (rows.length > this.capabilities.maxGroups)\n throw Error(\"DuckDB metric group budget exceeded.\");\n if (\n distribution &&\n rows.some(\n (row) =>\n (row.samples as unknown[] | null)?.length &&\n (row.samples as unknown[]).length > this.maxSamples,\n )\n )\n throw Error(\n `The ${distribution.kind} distribution exceeded the ${this.maxSamples.toLocaleString(\"en-US\")}-sample budget${clause.groupBy.length ? \" for one or more groups\" : \"\"}.`,\n );\n const edges =\n distribution?.kind === \"histogram\"\n ? histogramEdges(\n rows.flatMap((row) => (row.samples as number[]) ?? []),\n distribution.bins ?? 10,\n )\n : [];\n const measures = new Map<object, { value: unknown }>();\n const buckets: AggregationResultEntry[\"buckets\"] = rows.map((row) => {\n const samples = (row.samples as number[]) ?? [];\n const bucket: AggregationResultEntry[\"buckets\"][number] = {\n keys: clause.groupBy.map((name, index) => {\n const value = row[`g${index}`] ?? null;\n if (index === 0 && isMetricCycle(clause.dateGrouping?.interval))\n return value === null ? null : Number(value);\n return schema.fields.find((field) => field.name === name)?.type ===\n \"datetime\" && value !== null\n ? (this.formatRow({ [name]: value }, schema)[name] as string)\n : (value as MetricValue);\n }),\n count: row.count as number,\n value: distribution ? null : (row.value as MetricValue),\n ...(row.y !== undefined ? { y: row.y as MetricValue } : {}),\n ...(distribution\n ? {\n nullCount: (row.count as number) - samples.length,\n distribution:\n distribution.kind === \"box\"\n ? {\n kind: \"box\" as const,\n summary: boxSummary(samples, distribution.whiskers),\n }\n : {\n kind: \"histogram\" as const,\n n: samples.length,\n edges,\n counts: histogramCounts(samples, edges),\n },\n }\n : {}),\n };\n if (minMeasure) measures.set(bucket, { value: row.min_measure });\n return bucket;\n });\n if (clause.dateGrouping?.includeEmpty) {\n const config = clause.dateGrouping,\n cycle = isMetricCycle(config.interval) ? config.interval : undefined,\n observed = cycle\n ? []\n : buckets\n .filter((bucket) => bucket.keys[0] !== null)\n .map((bucket) => metricDateTime(bucket.keys[0]!));\n const range = cycle ? undefined : metricDateRange(\n config,\n {\n ...query,\n select: query.select.map((field) => ({ field })),\n } as QueryState,\n observed,\n now,\n (name) => name,\n );\n const series = new Map(\n buckets\n .filter((bucket) => bucket.keys[0] !== null)\n .map((bucket) => [\n JSON.stringify(bucket.keys.slice(1)),\n bucket.keys.slice(1),\n ]),\n );\n if (keys.length === 1 && !series.size) series.set(\"[]\", []);\n const existing = new Set(\n buckets.map((bucket) => JSON.stringify(bucket.keys)),\n );\n // Every slot of a cycle exists, whatever the date range.\n const slots: MetricValue[] = cycle ? metricCycleSlots(cycle) : [];\n if (range)\n for (\n let time = range[0];\n time <= range[1];\n time = metricDateNext(time, config.interval, config.timeZone)\n )\n slots.push(new Date(time).toISOString());\n for (const slot of slots)\n for (const tuple of series.values()) {\n const values = [slot, ...tuple];\n if (!existing.has(JSON.stringify(values))) {\n if (buckets.length >= this.capabilities.maxGroups)\n throw Error(\"DuckDB calendar group budget exceeded.\");\n buckets.push({\n keys: values,\n count: 0,\n value:\n (!clause.expression &&\n [\"count\", \"count_distinct\", \"sum\"].includes(clause.op)) ||\n /^(COUNT|COUNT_DISTINCT|SUM)\\([^)]*\\)$/.test(\n metricExpression(clause),\n )\n ? 0\n : null,\n });\n }\n }\n }\n // Calendar fill-ins (count 0) are never hidden; hidden groups leave the\n // ranking, the group limit and Other.\n let hiddenGroups: number | undefined;\n const min = metricMinCount(clause);\n if (min !== undefined) {\n const kept = buckets.filter((bucket) =>\n metricMinCountKeeps(min, bucket.count, measures.get(bucket)),\n );\n hiddenGroups = buckets.length - kept.length;\n buckets.splice(0, buckets.length, ...kept);\n }\n // Calendar metrics default to chronological order, like the other engines.\n const sort: MetricSort[] = clause.sort?.length\n ? clause.sort\n : clause.dateGrouping\n ? [{ key: \"group0\", dir: \"asc\", nulls: \"last\" }]\n : [{ key: \"value\", dir: \"desc\" }];\n buckets.sort((a, b) => {\n for (const term of sort) {\n const value = (bucket: typeof a): MetricValue =>\n term.key.startsWith(\"group\")\n ? (bucket.keys[Number(term.key.slice(5))] ?? null)\n : term.key === \"samples\"\n ? bucket.distribution?.kind === \"box\"\n ? (bucket.distribution.summary?.n ?? 0)\n : (bucket.distribution?.n ?? 0)\n : ((bucket as unknown as Record<string, MetricValue>)[term.key] ??\n null);\n const av = value(a),\n bv = value(b);\n if (av === null || bv === null) {\n if (av !== bv)\n return (av === null ? 1 : -1) * (term.nulls === \"first\" ? -1 : 1);\n } else {\n const result = compareMetricValues(av, bv);\n if (result) return result * (term.dir === \"asc\" ? 1 : -1);\n }\n }\n return JSON.stringify(a.keys).localeCompare(JSON.stringify(b.keys));\n });\n const limit = clause.groupLimit ?? 10000;\n return {\n id: clause.id,\n buckets: buckets.slice(0, limit),\n groupCount: buckets.length,\n coverage: buckets.length > limit ? \"partial\" : \"exact\",\n ...(clause.scope ? { scope: clause.scope } : {}),\n ...(hiddenGroups !== undefined ? { hiddenGroups } : {}),\n };\n }\n transport(): Transport<DuckDBRow> {\n return {\n queryCapabilities: this.capabilities,\n metricCapabilities: {\n version: 2,\n expressions: true,\n shownRows: true,\n distributions: true,\n computedFields: this.computed.size > 0,\n filters: true,\n minCount: true,\n minCountMeasures: true,\n profile: DUCKDB_PROFILE,\n maxGroups: this.capabilities.maxGroups,\n },\n fetchQueryV3: (request, signal) => this.execute(request, signal),\n fetchRows: (query, signal) =>\n this.transaction(async (tables) => {\n this.window(query);\n const source = await this.stage(query, Date.now(), tables, signal);\n return this.page(\n source.name,\n this.schema,\n { ...query, where: [] },\n Date.now(),\n signal,\n );\n }, signal),\n fetchMetrics: (query: MetricQuery, signal) => {\n if (\n query.diagnostics.length ||\n (query.profile && query.profile !== DUCKDB_PROFILE) ||\n query.metrics.length > 20\n )\n return Promise.reject(Error(\"Invalid DuckDB metric request.\"));\n return this.transaction(async (tables) => {\n const now = Date.now(),\n server = { ...query, select: [] };\n const source = await this.stage(server, now, tables, signal);\n return {\n metrics: await this.metrics(\n source.name,\n this.schema,\n server,\n query.metrics,\n now,\n tables,\n signal,\n ),\n };\n }, signal);\n },\n fetchAggregations: (query, signal) =>\n this.transaction(async (tables) => {\n if (query.diagnostics?.length || query.aggregations.length > 20)\n throw Error(\"Invalid DuckDB aggregation request.\");\n const server = {\n select: [],\n where: query.where,\n orderBy: [],\n limit: 100,\n offset: 0,\n },\n now = Date.now();\n const source = await this.stage(server, now, tables, signal);\n return {\n metrics: await this.metrics(\n source.name,\n this.schema,\n { ...server, where: [] },\n query.aggregations,\n now,\n tables,\n signal,\n ),\n };\n }, signal),\n fetchDistinctValues: (query, signal) =>\n this.serial(async () => {\n const builder = this.builder(),\n field = builder.definition(query.field),\n limit = positive(query.limit, 50, 500);\n if (!isFilterable(field))\n throw Error(`Field ${field.name} is not filterable.`);\n if (query.search.length > 2000)\n throw Error(\"Distinct search exceeds its budget.\");\n const source = this.projectedSource(Date.now()),\n value = builder.field(query.field),\n array = field.type === \"textarray\";\n builder.args.push(...source.args);\n const param = builder.bind(query.search);\n const rows = await this.run(\n builder.statement(\n `SELECT CAST(value AS VARCHAR) AS value, COUNT(*) AS n FROM (SELECT ${array ? `unnest(${value})` : value} AS value FROM (${source.sql}) r) v WHERE value IS NOT NULL AND contains(lower(CAST(value AS VARCHAR)), lower(${param})) GROUP BY value ORDER BY n DESC, value ASC LIMIT ${limit + 1}`,\n ),\n signal,\n );\n const [{ n }] = (await this.sql(\n `SELECT COUNT(*) AS n FROM (${source.sql}) r WHERE ${array ? `COALESCE(len(${value}),0) = 0` : `${value} IS NULL`}`,\n source.args,\n signal,\n )) as [{ n: number }];\n return {\n values: rows.slice(0, limit).map((row) => String(row.value)),\n hasMore: rows.length > limit,\n hasNull: n > 0,\n };\n }, signal),\n fetchRow: (identity, signal) =>\n this.serial(async () => {\n const source = this.projectedSource(Date.now());\n const rows = await this.sql(\n `SELECT * FROM (${source.sql}) r WHERE ${id(this.schema.idField)} = $${source.args.length + 1} LIMIT 2`,\n [...source.args, identity],\n signal,\n );\n if (rows.length > 1) throw Error(\"DuckDB identity must be unique.\");\n return rows[0] ? this.formatRow(rows[0], this.schema) : null;\n }, signal),\n fetchFieldStats: (fields, signal) =>\n this.serial(async () => {\n if (fields.length > 64)\n throw Error(\"At most 64 field stats can be requested.\");\n const stats: Record<\n string,\n import(\"@pythia-software/query-table-core\").FieldStats\n > = {};\n for (const name of fields) {\n const builder = this.builder(),\n field = builder.definition(name),\n source = this.projectedSource(Date.now()),\n value = builder.field(name);\n const rows = await this.sql(\n field.type === \"textarray\"\n ? `SELECT COUNT(DISTINCT value) AS \"distinct\" FROM (SELECT unnest(${value}) AS value FROM (${source.sql}) r)`\n : `SELECT COUNT(DISTINCT ${value}) AS \"distinct\", MIN(${value}) AS min, MAX(${value}) AS max FROM (${source.sql}) r`,\n source.args,\n signal,\n );\n const result = rows[0]!;\n stats[name] = {\n distinct: result.distinct as number,\n ...(typeof result.min === \"number\" ||\n typeof result.min === \"string\"\n ? { min: result.min }\n : {}),\n ...(typeof result.max === \"number\" ||\n typeof result.max === \"string\"\n ? { max: result.max }\n : {}),\n };\n }\n return stats;\n }, signal),\n };\n }\n}\n\nexport function createDuckDBTransport(\n options: DuckDBOptions,\n): Transport<DuckDBRow> {\n return new DuckDBBackend(options).transport();\n}\n","import type { DuckDBConnection, DuckDBRow } from \"./backend\";\n\n/** Structural adapter keeps duckdb-wasm optional and out of native bundles. */\nexport interface DuckDBWasmConnection {\n query(sql: string): Promise<{ toArray(): { toJSON(): unknown }[] }>;\n prepare(sql: string): Promise<{\n query(...args: any[]): Promise<{ toArray(): { toJSON(): unknown }[] }>;\n close(): Promise<void>;\n }>;\n}\nexport function fromDuckDBWasmConnection(\n connection: DuckDBWasmConnection,\n): DuckDBConnection {\n return {\n async query(sql, args) {\n if (!args.length)\n return (await connection.query(sql))\n .toArray()\n .map((row) => row.toJSON() as DuckDBRow);\n const statement = await connection.prepare(sql);\n try {\n return (await statement.query(...args))\n .toArray()\n .map((row) => row.toJSON() as DuckDBRow);\n } finally {\n await statement.close();\n }\n },\n };\n}\n","import {\n loadSchema,\n type FieldSchema,\n} from \"@pythia-software/query-table-core\";\n\n/** Read explicit DuckDB bindings; never reuse another engine's SQL. */\nexport function loadDuckDBSchema(document: unknown): {\n schema: FieldSchema;\n bindings: Record<string, string>;\n} {\n const schema = loadSchema(document);\n const raw = document as {\n fields: { name: string; bindings?: { duckdb?: { expr?: unknown } } }[];\n };\n const bindings: Record<string, string> = Object.create(null);\n for (const field of schema.fields) {\n if (field.source.kind !== \"backend\") continue;\n const binding = raw.fields.find((item) => item.name === field.name)\n ?.bindings?.duckdb;\n if (\n !binding ||\n typeof binding.expr !== \"string\" ||\n !binding.expr.trim() ||\n binding.expr.includes(\"\\0\")\n )\n throw Error(\n `Field ${field.name} requires an explicit bindings.duckdb.expr.`,\n );\n bindings[field.name] = binding.expr;\n }\n return { schema, bindings };\n}\n"],"mappings":"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","names":["field","compileFormula","isSelectable","isFilterable","compileFormula","isSelectable","field","isFilterable"]}
1
+ {"version":3,"sources":["../src/sql.ts","../src/backend.ts","../src/wasm.ts","../src/schema.ts"],"sourcesContent":["import {\n branchesOf,\n coerceValue,\n compileFormula,\n compileMetric,\n isFilterable,\n isSortable,\n isSelectable,\n opsForField,\n type FieldDef,\n type FieldSchema,\n type FormulaNode,\n type FormulaPlan,\n type WhereClause,\n type WhereTerm,\n type OrderByClause,\n type ServerQuery,\n QueryError,\n} from \"@pythia-software/query-table-core\";\n\nexport interface DuckDBStatement {\n sql: string;\n args: unknown[];\n}\n/** Identifiers come only from the host catalogue, and are always quoted. */\nexport function quoteIdentifier(value: string): string {\n if (!value || value.includes(\"\\0\")) throw Error(\"Invalid DuckDB identifier.\");\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\nexport function quoteRelation(value: string): string {\n return value.split(\".\").map(quoteIdentifier).join(\".\");\n}\nconst aggregates = new Set([\n \"COUNT\",\n \"COUNT_DISTINCT\",\n \"SUM\",\n \"AVG\",\n \"MIN\",\n \"MAX\",\n \"MEDIAN\",\n]);\nconst safeNumber = (value: string) =>\n `(CASE WHEN ${value} IS NULL OR (isfinite(${value}) AND abs(${value}) <= 9007199254740991) THEN ${value} ELSE error('Query Table numeric precision exceeded') END)`;\n\nexport class SQLBuilder {\n readonly args: unknown[] = [];\n constructor(\n readonly schema: FieldSchema,\n readonly now = Date.now(),\n readonly bindings: Record<string, string> = {},\n ) {}\n bind(value: unknown): string {\n this.args.push(value);\n return `$${this.args.length}`;\n }\n statement(sql: string): DuckDBStatement {\n if (sql.length > 262144 || this.args.length > 10000)\n throw new QueryError(\"resource_limit\", \"DuckDB statement budget exceeded.\");\n return { sql, args: [...this.args] };\n }\n definition(name: string): FieldDef {\n const field = this.schema.fields.find((field) => field.name === name);\n if (!field || field.source.kind !== \"backend\")\n throw Error(`Unavailable DuckDB field: ${name}.`);\n return field;\n }\n field(name: string, normalize = true): string {\n const field = this.definition(name),\n value =\n (Object.prototype.hasOwnProperty.call(this.bindings, name)\n ? this.bindings[name]\n : undefined) ??\n quoteIdentifier(\n field.source.kind === \"backend\" ? (field.source.path ?? name) : name,\n );\n if (!normalize) return value;\n if (field.type === \"text\" || field.type === \"enum\")\n return `NULLIF(CAST(${value} AS VARCHAR), '')`;\n if (field.type === \"datetime\") return `CAST(${value} AS TIMESTAMPTZ)`;\n return value;\n }\n where(terms: WhereTerm[]): string {\n if (terms.length > 100)\n throw Error(\"At most 100 filter terms are allowed.\");\n let count = 0;\n return terms.length\n ? terms\n .map((term) => {\n // A term is an OR of branches, each an AND of literals (a single\n // literal, an OR group, or an OR of conjunctions).\n const branches = branchesOf(term);\n const size = branches.reduce((n, branch) => n + branch.length, 0);\n if (!branches.length || branches.some((branch) => !branch.length) || (count += size) > 100)\n throw Error(\"Invalid filter predicate budget.\");\n const compile = (clause: WhereClause): string => {\n const field = this.definition(clause.field),\n raw = this.field(field.name),\n op = clause.op;\n if (!isFilterable(field) || !opsForField(field).includes(op))\n throw Error(`Unsupported filter on ${field.name}: ${op}.`);\n const value =\n field.type === \"textarray\"\n ? `CASE WHEN len(${raw}) > 0 THEN ${raw} END`\n : raw;\n let sql: string;\n if (op === \"is_null\" || op === \"is_not_null\")\n sql = `${value} IS ${op === \"is_null\" ? \"\" : \"NOT \"}NULL`;\n else {\n const typed = coerceValue(field.type, clause.value, this.now);\n if (typeof typed === \"number\" && !Number.isFinite(typed))\n throw Error(\"Filter operands must be finite.\");\n const param = this.bind(\n field.type === \"datetime\"\n ? new Date(typed as number).toISOString()\n : typed,\n );\n const rhs =\n field.type === \"datetime\"\n ? `CAST(${param} AS TIMESTAMPTZ)`\n : param;\n if ([\"=\", \"!=\", \">\", \">=\", \"<\", \"<=\"].includes(op))\n sql = `${value} ${op} ${rhs}`;\n else if (\n [\"contains\", \"starts_with\", \"ends_with\"].includes(op)\n )\n sql = `${op}(lower(${value}), lower(${param}))`;\n else if (op === \"includes\")\n sql = field.filter?.arrayCaseSensitive\n ? `list_contains(${value}, ${param})`\n : `list_contains(list_transform(${value}, x -> lower(x)), lower(${param}))`;\n else if (op.startsWith(\"length_\"))\n sql = `length(${value}) ${op === \"length_gt\" ? \">\" : op === \"length_lt\" ? \"<\" : \"=\"} CAST(${param} AS DOUBLE)`;\n else if (\n op === \"matches_regex\" ||\n op === \"not_matches_regex\"\n ) {\n if (clause.value.length > 2000)\n throw Error(\"Regex exceeds 2,000 characters.\");\n sql = `${op === \"not_matches_regex\" ? \"NOT \" : \"\"}regexp_matches(${value}, ${param})`;\n } else throw Error(`Unsupported DuckDB operator: ${op}.`);\n }\n return clause.negated ? `NOT (${sql})` : sql;\n };\n return `(${branches\n .map((branch) => branch.length === 1 ? compile(branch[0]!) : `(${branch.map(compile).join(\" AND \")})`)\n .join(\" OR \")})`;\n })\n .join(\" AND \")\n : \"TRUE\";\n }\n order(terms: OrderByClause[], identity = true): string {\n if (terms.length > 20) throw Error(\"At most 20 sort fields are allowed.\");\n const output = terms.map((term) => {\n const field = this.definition(term.field);\n if (!isSortable(field) && field.name !== this.schema.idField)\n throw Error(`Field ${field.name} is not sortable.`);\n if (\n ![\"asc\", \"desc\"].includes(term.dir) ||\n (term.nulls && ![\"first\", \"last\"].includes(term.nulls))\n )\n throw Error(\"Invalid ordering.\");\n let value = this.field(field.name);\n if (term.extract) {\n if (field.type !== \"text\" || term.extract.regex.length > 2000)\n throw Error(\"Invalid regex extraction.\");\n const pattern = this.bind(term.extract.regex);\n // DuckDB/RE2 extraction uses the first capture, or the full match.\n const capture = /(^|[^\\\\])\\((?!\\?)/.test(term.extract.regex) ? 1 : 0;\n value = `CASE WHEN regexp_matches(${value}, ${pattern}) THEN regexp_extract(${value}, ${pattern}, ${capture}) END`;\n }\n return `${value} ${term.dir.toUpperCase()} NULLS ${(term.nulls ?? \"last\").toUpperCase()}`;\n });\n if (identity && !terms.some((term) => term.field === this.schema.idField))\n output.push(`${this.field(this.schema.idField)} ASC NULLS LAST`);\n return output.length ? `ORDER BY ${output.join(\", \")}` : \"\";\n }\n expression(\n source: string,\n aggregate = false,\n ): { sql: string; plan: FormulaPlan } {\n const plan = aggregate\n ? compileMetric(source, this.schema)\n : compileFormula(source, this.schema.fields);\n return { sql: this.node(plan.ast), plan };\n }\n node(node: FormulaNode): string {\n const sql = this.nodeSQL(node);\n if (sql.length > 131072)\n throw new QueryError(\"resource_limit\", \"DuckDB expression SQL budget exceeded.\");\n return sql;\n }\n private nodeSQL(node: FormulaNode): string {\n if (node.kind === \"literal\")\n return node.value === null ? \"NULL\" : this.bind(node.value);\n if (node.kind === \"field\") return this.field(node.name, false);\n const name = node.name,\n vs = node.args.map((arg) => this.node(arg)),\n a = vs[0]!,\n b = vs[1]!,\n c = vs[2]!;\n if (aggregates.has(name)) {\n if (name === \"COUNT\") return `CAST(COUNT(${a ?? \"*\"}) AS DOUBLE)`;\n if (name === \"COUNT_DISTINCT\")\n return `CAST(COUNT(DISTINCT ${a}) AS DOUBLE)`;\n const sql = `${name}(${a})`;\n return [\"SUM\", \"AVG\", \"MEDIAN\"].includes(name)\n ? safeNumber(\n `CAST(${name === \"SUM\" ? `COALESCE(${sql}, 0)` : sql} AS DOUBLE)`,\n )\n : sql;\n }\n if (name.startsWith(\"op:\")) {\n const op = name.slice(3);\n if (op === \"IN\") return `(${a} IN (${vs.slice(1).join(\", \")}))`;\n if (op === \"BETWEEN\") return `(${a} BETWEEN ${b} AND ${c})`;\n if ([\"/\", \"%\"].includes(op))\n return safeNumber(\n `(CASE WHEN ${b} = 0 THEN error('Division by zero') ELSE ${a} ${op} ${b} END)`,\n );\n return [\"+\", \"-\", \"*\"].includes(op)\n ? safeNumber(`(${a} ${op} ${b})`)\n : `(${a} ${op} ${b})`;\n }\n if (name.startsWith(\"unary:\")) return `(${name.slice(6)} ${a})`;\n if (name === \"IF\") return `CASE WHEN ${a} THEN ${b} ELSE ${c} END`;\n if (name === \"IFS\")\n return `CASE ${vs\n .slice(0, -1)\n .filter((_, i) => i % 2 === 0)\n .map((v, i) => `WHEN ${v} THEN ${vs[2 * i + 1]}`)\n .join(\" \")} ELSE ${vs[vs.length - 1]} END`;\n if (name === \"SWITCH\")\n return `CASE ${vs\n .slice(1, -1)\n .filter((_, i) => i % 2 === 0)\n .map(\n (v, i) => `WHEN ${a} IS NOT DISTINCT FROM ${v} THEN ${vs[2 * i + 2]}`,\n )\n .join(\" \")} ELSE ${vs[vs.length - 1]} END`;\n if (name === \"IS_NULL\") return `(${a} IS NULL)`;\n if (name === \"IS_EMPTY\") {\n const input = node.args[0]!;\n const array =\n (input.kind === \"field\" && input.valueType === \"textarray\") ||\n (input.kind === \"call\" &&\n [\"SPLIT\", \"ARRAY_UNIQUE\", \"ARRAY_SORT\"].includes(input.name));\n return `(${a} IS NULL OR len(${array ? a : `CAST(${a} AS VARCHAR)`}) = 0)`;\n }\n if (name === \"COALESCE\" || name === \"NULLIF\")\n return `${name}(${vs.join(\", \")})`;\n if (name === \"IFERROR\")\n throw Error(\"IFERROR is not available in the qt-duckdb-v1 SQL profile.\");\n if (name === \"ROUND\") {\n const scale = `power(10, ${b ?? \"0\"})`;\n return safeNumber(`(floor(${a} * ${scale} + 0.5) / ${scale})`);\n }\n if (name === \"CLAMP\")\n return `CASE WHEN ${a} IS NULL OR ${b} IS NULL OR ${c} IS NULL THEN NULL ELSE greatest(${b}, least(${c}, ${a})) END`;\n if (name === \"LEAST\" || name === \"GREATEST\" || name === \"CONCAT\")\n return `CASE WHEN ${vs.map((v) => `${v} IS NULL`).join(\" OR \")} THEN NULL ELSE ${name}(${vs.join(\", \")}) END`;\n if (name === \"CONCAT_WS\")\n return `CASE WHEN ${a} IS NULL THEN NULL ELSE concat_ws(${vs.join(\", \")}) END`;\n if ([\"CONTAINS\", \"STARTS_WITH\", \"ENDS_WITH\"].includes(name))\n return `${name.toLowerCase()}(CASE WHEN ${c ?? \"FALSE\"} THEN lower(${a}) ELSE ${a} END, CASE WHEN ${c ?? \"FALSE\"} THEN lower(${b}) ELSE ${b} END)`;\n if (name === \"TO_NUMBER\") return safeNumber(`CAST(${a} AS DOUBLE)`);\n if (name === \"TO_TEXT\") return `CAST(${a} AS VARCHAR)`;\n if (name === \"URL_ENCODE\") return `url_encode(${a})`;\n if (name === \"TO_BOOLEAN\") return `CAST(${a} AS BOOLEAN)`;\n if (name === \"TO_DATETIME\") return `CAST(${a} AS TIMESTAMPTZ)`;\n if (name === \"SPLIT\") return `string_split(${a}, ${b})`;\n if (name === \"JOIN\") return `array_to_string(${a}, ${b})`;\n if (name === \"ARRAY_LENGTH\") return `len(${a})`;\n if (name === \"ARRAY_CONTAINS\") return `list_contains(${a}, ${b})`;\n if (name === \"ARRAY_GET\")\n return `CASE WHEN ${b} < 0 THEN error('Array index must be nonnegative') ELSE list_extract(${a}, CAST(${b} + 1 AS BIGINT)) END`;\n if (name === \"ARRAY_SORT\") return `list_sort(${a})`;\n if (name === \"ARRAY_UNIQUE\")\n return `list_filter(${a}, (x, i) -> list_position(${a}, x) = i)`;\n if (name === \"WEEKDAY\")\n return `extract(isodow FROM CAST(${a} AS TIMESTAMPTZ))`;\n if ([\"YEAR\", \"MONTH\", \"DAY\", \"HOUR\"].includes(name))\n return `extract(${name.toLowerCase()} FROM CAST(${a} AS TIMESTAMPTZ))`;\n if (name === \"DATE_TRUNC\")\n return `date_trunc(${a}, CAST(${b} AS TIMESTAMPTZ))`;\n if (\n name === \"DATE_DIFF\" ||\n name === \"DATE_ADD\" ||\n name === \"FORMAT_DATE\" ||\n name.startsWith(\"REGEX_\")\n )\n throw Error(`${name} is not available in the qt-duckdb-v1 SQL profile.`);\n if (\n [\"LEFT\", \"RIGHT\", \"SUBSTRING\", \"LPAD\", \"RPAD\", \"SPLIT_PART\"].includes(\n name,\n )\n ) {\n const args = [...vs];\n const indices =\n name === \"SUBSTRING\" ? [1, 2] : name === \"SPLIT_PART\" ? [2] : [1];\n for (const index of indices)\n if (args[index] !== undefined)\n args[index] = `CAST(${args[index]} AS BIGINT)`;\n return `${name}(${args.join(\", \")})`;\n }\n if (\n [\n \"LENGTH\",\n \"LOWER\",\n \"UPPER\",\n \"TRIM\",\n \"LTRIM\",\n \"RTRIM\",\n \"REPLACE\",\n \"ABS\",\n \"FLOOR\",\n \"CEIL\",\n \"TRUNC\",\n \"POWER\",\n \"SQRT\",\n ].includes(name)\n )\n return `${name}(${vs.join(\", \")})`;\n throw Error(`Unsupported DuckDB function: ${name}.`);\n }\n}\n\nexport function compileDuckDBRows(\n query: ServerQuery,\n schema: FieldSchema,\n relation: string,\n now = Date.now(),\n): DuckDBStatement {\n const sql = new SQLBuilder(schema, now);\n if (\n !Number.isSafeInteger(query.limit) ||\n query.limit < 1 ||\n query.limit > 10000 ||\n !Number.isSafeInteger(query.offset) ||\n query.offset < 0\n )\n throw Error(\"Invalid result window.\");\n const select = [...new Set([schema.idField, ...query.select])].map((name) => {\n const field = sql.definition(name);\n if (!isSelectable(field) && name !== schema.idField)\n throw Error(`Field ${name} is not selectable.`);\n return `${sql.field(name, false)} AS ${quoteIdentifier(name)}`;\n });\n const where = sql.where(query.where),\n order = sql.order(query.orderBy);\n return sql.statement(\n `SELECT ${select.join(\", \")} FROM ${quoteRelation(relation)} WHERE ${where} ${order} LIMIT ${sql.bind(query.limit)} OFFSET ${sql.bind(query.offset)}`,\n );\n}\n","import {\n compileFormula,\n createGroupingModel,\n GROUP_ID_FIELD,\n metricExpression,\n metricMinCount,\n metricMinCountKeeps,\n metricMinCountMeasure,\n validateMetric,\n isSelectable,\n isFilterable,\n boxSummary,\n histogramEdges,\n histogramCounts,\n compareMetricValues,\n metricDateFloor,\n isMetricCycle,\n metricCycleSlot,\n metricCycleSlots,\n metricDateTime,\n metricDateNext,\n metricDateRange,\n groupKeyFields,\n isCalendarGroupKey,\n type AggregationClause,\n type GroupingDefinition,\n type AggregationResult,\n type AggregationResultEntry,\n type ComputedColumn,\n type ComputedExecution,\n type FieldSchema,\n type FormulaPlan,\n type QueryCapabilitiesV3,\n type QueryRequestV3,\n type QueryResultV3,\n type ServerQuery,\n type Transport,\n type MetricDateGrouping,\n type MetricSort,\n type MetricValue,\n type QueryState,\n failedMetric,\n QueryError,\n} from \"@pythia-software/query-table-core\";\nimport {\n SQLBuilder,\n quoteIdentifier as id,\n quoteRelation,\n type DuckDBStatement,\n} from \"./sql\";\n\nexport const DUCKDB_PROFILE = \"qt-duckdb-v1\";\nexport type DuckDBRow = Record<string, unknown>;\n/** One exclusive connection, with bound parameters; no driver runtime dependency. */\nexport interface DuckDBConnection {\n query(sql: string, args: unknown[]): Promise<DuckDBRow[]>;\n interrupt?(): void | Promise<void>;\n}\nexport interface DuckDBOptions {\n connection: DuckDBConnection;\n schema: FieldSchema;\n relation: string;\n /** Trusted SQL expressions, keyed by the host's field names. Never request SQL. */\n bindings?: Record<string, string>;\n computedColumns?: readonly ComputedColumn[];\n snapshot?: string;\n maxRows?: number;\n maxGroups?: number;\n maxPopulation?: number;\n maxSamples?: number;\n maxStagingBytes?: number;\n}\nfunction abort(signal?: AbortSignal): void {\n if (signal?.aborted)\n throw new DOMException(\"DuckDB query cancelled.\", \"AbortError\");\n}\n/** Normalize both Arrow and Node values at the transport boundary. */\nexport function normalizeDuckDBValue(value: unknown): unknown {\n if (typeof value === \"bigint\") {\n const numeric = Number(value);\n if (!Number.isSafeInteger(numeric))\n throw Error(\"DuckDB integer exceeds JavaScript safe precision.\");\n return numeric;\n }\n if (value instanceof Date) return value.toISOString();\n if (\n typeof value === \"number\" &&\n (!Number.isFinite(value) || Math.abs(value) > Number.MAX_SAFE_INTEGER)\n )\n throw Error(\"DuckDB number exceeds finite safe precision.\");\n if (Array.isArray(value)) return value.map(normalizeDuckDBValue);\n if (value && typeof value === \"object\") {\n // Arrow vectors expose toArray(); StructRow exposes toJSON().\n if (\"toArray\" in value && typeof value.toArray === \"function\")\n return Array.from(value.toArray()).map(normalizeDuckDBValue);\n if (\"toJSON\" in value && typeof value.toJSON === \"function\")\n return normalizeDuckDBValue(value.toJSON());\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n normalizeDuckDBValue(item),\n ]),\n );\n }\n return value;\n}\nfunction positive(\n value: number | undefined,\n fallback: number,\n maximum: number,\n): number {\n const out = value ?? fallback;\n if (!Number.isSafeInteger(out) || out < 1 || out > maximum)\n throw Error(\"Invalid DuckDB resource budget.\");\n return out;\n}\n\nexport class DuckDBBackend {\n readonly schema: FieldSchema;\n readonly execution: ComputedExecution;\n readonly capabilities: QueryCapabilitiesV3;\n readonly maxSamples: number;\n readonly maxStagingBytes: number;\n private queue: Promise<unknown> = Promise.resolve();\n private sequence = 0;\n private readonly computed = new Map<string, FormulaPlan>();\n constructor(readonly options: DuckDBOptions) {\n const fields = options.schema.fields\n .filter((field) => field.source.kind === \"backend\")\n .map((field) => ({\n ...field,\n source: { ...field.source, kind: \"backend\" as const, path: field.name },\n }));\n if (\n !fields.some((field) => field.name === options.schema.idField) ||\n new Set(fields.map((field) => field.name)).size !== fields.length\n )\n throw Error(\n \"DuckDB needs a unique field catalogue and a bound identity.\",\n );\n quoteRelation(options.relation);\n this.schema = { ...options.schema, fields };\n const definitions = new Map(\n (options.computedColumns ?? []).map((column) => [\n `@computed/${column.id}`,\n column,\n ]),\n );\n const visiting = new Set<string>();\n const resolve = (name: string): FormulaPlan | undefined => {\n if (this.computed.has(name)) return this.computed.get(name);\n const definition = definitions.get(name);\n if (!definition) return undefined;\n if (visiting.has(name)) throw Error(\"Computed definition cycle.\");\n visiting.add(name);\n const plan = compileFormula(\n definition.expression.source,\n fields,\n resolve,\n );\n // Reject unsupported SQL at negotiation, before advertising capabilities.\n new SQLBuilder(this.schema).node(plan.ast);\n visiting.delete(name);\n this.computed.set(name, plan);\n return plan;\n };\n for (const name of definitions.keys()) {\n const plan = resolve(name)!;\n fields.push({\n name,\n label: definitions.get(name)!.label,\n type: plan.type === \"null\" ? \"text\" : plan.type,\n source: { kind: \"backend\", path: name },\n filter: { enabled: true },\n sort: { enabled: true },\n aggregate: { measure: true, groupable: plan.type !== \"textarray\" },\n });\n }\n this.execution = {\n profile: DUCKDB_PROFILE,\n planToken: `duckdb:${JSON.stringify([...definitions.values()].map((column) => [column.id, column.revision]))}`,\n resolvedRevisions: Object.fromEntries(\n [...definitions.values()].map((column) => [column.id, column.revision]),\n ),\n fields: Object.fromEntries(\n fields\n .filter((field) => definitions.has(field.name))\n .map((field) => [\n field.name,\n {\n type: field.type,\n select: true,\n filter: true,\n sort: true,\n measure: true,\n group: field.type !== \"textarray\",\n },\n ]),\n ),\n ...(options.snapshot !== undefined ? { snapshot: options.snapshot } : {}),\n };\n this.capabilities = {\n version: 3,\n profile: DUCKDB_PROFILE,\n groupedRows: true,\n calendarGrouping: true,\n calendarCycles: true,\n calendarGroupKeys: true,\n computedSourceFilters: definitions.size > 0,\n regex: true,\n regexSourceFilters: true,\n regexAggregateExpressions: false,\n metricFilters: true,\n metricMinCount: true,\n metricMinCountMeasures: true,\n maxRows: positive(options.maxRows, 10000, 10000),\n maxGroups: positive(options.maxGroups, 10000, 10000),\n maxPopulation: positive(options.maxPopulation, 250000, 10000000),\n };\n this.maxSamples = positive(options.maxSamples, 100000, 1000000);\n this.maxStagingBytes = positive(\n options.maxStagingBytes,\n 64 * 1024 * 1024,\n 1024 * 1024 * 1024,\n );\n }\n private serial<T>(work: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n const next = this.queue.then(() => {\n abort(signal);\n return work();\n });\n this.queue = next.catch(() => {});\n return next;\n }\n /** Wait before closing an owned driver connection. */\n async drain(): Promise<void> {\n await this.queue;\n }\n private async run(\n statement: DuckDBStatement,\n signal?: AbortSignal,\n ): Promise<DuckDBRow[]> {\n abort(signal);\n const cancel = () => {\n void this.options.connection.interrupt?.();\n };\n signal?.addEventListener(\"abort\", cancel, { once: true });\n try {\n const rows = await this.options.connection.query(\n statement.sql,\n statement.args,\n );\n abort(signal);\n return rows.map((row) => normalizeDuckDBValue(row) as DuckDBRow);\n } finally {\n signal?.removeEventListener(\"abort\", cancel);\n }\n }\n private sql(statement: string, args: unknown[] = [], signal?: AbortSignal) {\n return this.run({ sql: statement, args }, signal);\n }\n private window(query: ServerQuery): void {\n if (\n !Number.isSafeInteger(query.limit) ||\n query.limit < 1 ||\n query.limit > this.capabilities.maxRows ||\n !Number.isSafeInteger(query.offset) ||\n query.offset < 0\n )\n throw Error(\"Invalid DuckDB result window.\");\n }\n private builder(schema = this.schema, now = Date.now()) {\n return new SQLBuilder(schema, now);\n }\n private projectedSource(now: number): DuckDBStatement {\n const bindings = Object.fromEntries(\n this.schema.fields\n .filter((field) => !this.computed.has(field.name))\n .map((field) => [\n field.name,\n (this.options.bindings &&\n Object.prototype.hasOwnProperty.call(\n this.options.bindings,\n field.name,\n )\n ? this.options.bindings[field.name]\n : undefined) ??\n id(\n (() => {\n const original = this.options.schema.fields.find(\n (item) => item.name === field.name,\n );\n return original?.source.kind === \"backend\"\n ? (original.source.path ?? field.name)\n : field.name;\n })(),\n ),\n ]),\n );\n const builder = new SQLBuilder(this.schema, now, bindings);\n const projections = this.schema.fields.map((field) => {\n const plan = this.computed.get(field.name),\n raw = plan ? builder.node(plan.ast) : bindings[field.name]!;\n return `${raw} AS ${id(field.name)}`;\n });\n return builder.statement(\n `SELECT ${projections.join(\", \")} FROM ${quoteRelation(this.options.relation)} AS r`,\n );\n }\n private async transaction<T>(\n work: (tables: string[]) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n return this.serial(async () => {\n await this.sql(\"BEGIN TRANSACTION\", [], signal);\n const tables: string[] = [];\n try {\n const result = await work(tables);\n for (const table of tables.reverse())\n await this.sql(`DROP TABLE ${id(table)}`, [], signal);\n await this.sql(\"COMMIT\", [], signal);\n return result;\n } catch (error) {\n await this.sql(\"ROLLBACK\").catch(() => {});\n // Metrics commit staged relations before isolating each clause, so a\n // rollback alone may not remove them.\n for (const table of tables.reverse())\n await this.sql(`DROP TABLE IF EXISTS ${id(table)}`).catch(() => {});\n abort(signal);\n throw error;\n }\n }, signal);\n }\n private temp(tables: string[]): string {\n const name = `qt_duckdb_${++this.sequence}`;\n tables.push(name);\n return name;\n }\n private async stage(\n source: ServerQuery,\n now: number,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<{ name: string; count: number }> {\n const projection = this.projectedSource(now),\n builder = this.builder(this.schema, now);\n builder.args.push(...projection.args);\n const where = builder.where(source.where),\n name = this.temp(tables);\n const population = `(${projection.sql}) r WHERE ${where}`;\n const [{ n, bytes }] = (await this.run(\n builder.statement(\n `SELECT COUNT(*) AS n, COALESCE(SUM(octet_length(encode(CAST(to_json(r) AS VARCHAR)))),0) AS bytes FROM ${population}`,\n ),\n signal,\n )) as [{ n: number; bytes: number }];\n if (n > this.capabilities.maxPopulation || bytes > this.maxStagingBytes)\n throw new QueryError(\"resource_limit\", \"DuckDB source population or staging byte budget exceeded.\");\n await this.run(\n builder.statement(\n `CREATE TEMP TABLE ${id(name)} AS SELECT * FROM ${population}`,\n ),\n signal,\n );\n const [{ invalid }] = (await this.sql(\n `SELECT COUNT(*) - COUNT(DISTINCT ${id(this.schema.idField)}) AS invalid FROM ${id(name)}`,\n [],\n signal,\n )) as [{ invalid: number }];\n if (invalid !== 0)\n throw Error(\"DuckDB source identity must be unique and non-null.\");\n return { name, count: n };\n }\n private async page(\n relation: string,\n schema: FieldSchema,\n query: ServerQuery,\n now: number,\n signal?: AbortSignal,\n ) {\n this.window(query);\n const builder = this.builder(schema, now),\n where = builder.where(query.where);\n const [{ total }] = (await this.run(\n builder.statement(\n `SELECT COUNT(*) AS total FROM ${id(relation)} WHERE ${where}`,\n ),\n signal,\n )) as [{ total: number }];\n const order = builder.order(query.orderBy),\n names = [...new Set([schema.idField, ...query.select])];\n names.forEach((name) => {\n if (!isSelectable(builder.definition(name)) && name !== schema.idField)\n throw Error(`Field ${name} is not selectable.`);\n });\n const rows = await this.run(\n builder.statement(\n `SELECT ${names.map(id).join(\", \")} FROM ${id(relation)} WHERE ${where} ${order} LIMIT ${builder.bind(query.limit)} OFFSET ${builder.bind(query.offset)}`,\n ),\n signal,\n );\n return { rows: rows.map((row) => this.formatRow(row, schema)), total };\n }\n private formatRow(row: DuckDBRow, schema: FieldSchema): DuckDBRow {\n return Object.fromEntries(\n Object.entries(row).map(([name, value]) => {\n const field = schema.fields.find((field) => field.name === name);\n if (value != null && field?.type === \"datetime\") {\n // DuckDB's textual native TIMESTAMP has no suffix; our session profile\n // interprets that storage as UTC, independently of the JS host timezone.\n const text = String(value);\n const canonical =\n /^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/.test(text)\n ? `${text.replace(\" \", \"T\")}Z`\n : text;\n const date =\n typeof value === \"number\" ? new Date(value) : new Date(canonical);\n if (!Number.isFinite(date.getTime()))\n throw Error(`Invalid datetime returned for ${name}.`);\n value = date.toISOString();\n }\n return [name, value];\n }),\n );\n }\n private validateRequest(request: QueryRequestV3): void {\n if (\n request.version !== 3 ||\n request.profile !== DUCKDB_PROFILE\n )\n throw Error(\"Invalid DuckDB execution request or profile.\");\n if (\n !Number.isSafeInteger(request.now) ||\n Math.abs(request.now) > 8640000000000000\n )\n throw Error(\"Invalid query clock.\");\n if (\n (request.planToken ?? \"\") !==\n (Object.keys(this.execution.fields).length\n ? this.execution.planToken\n : \"\") &&\n request.planToken !== this.execution.planToken\n )\n throw Error(\"DuckDB execution handshake changed.\");\n if ((request.snapshot ?? \"\") !== (this.options.snapshot ?? \"\"))\n throw Error(\"DuckDB snapshot changed.\");\n for (const [key, revision] of Object.entries(request.expectedRevisions))\n if (this.execution.resolvedRevisions[key] !== revision)\n throw Error(\"Computed definitions changed; refresh the handshake.\");\n if (request.metrics.length > 20)\n throw Error(\"At most 20 metrics are allowed.\");\n this.window(request.result);\n const model = createGroupingModel(this.schema);\n if (request.grouping) model.validate(request.grouping as GroupingDefinition);\n const resultSchema = request.grouping\n ? model.resultSchema(request.grouping.keys, request.grouping.summaries as GroupingDefinition[\"summaries\"])\n : this.schema;\n this.builder(this.schema, request.now).where(request.source.where);\n const result = this.builder(resultSchema, request.now);\n result.where(request.result.where);\n result.order(request.result.orderBy);\n request.result.select.forEach((name) => result.definition(name));\n }\n async execute(\n request: QueryRequestV3,\n signal?: AbortSignal,\n ): Promise<QueryResultV3> {\n this.validateRequest(request);\n if (request.distinct) return this.distinct(request, signal);\n return this.transaction(async (tables) => {\n const source = await this.stage(\n request.source,\n request.now,\n tables,\n signal,\n );\n let relation = source.name,\n schema = this.schema;\n if (request.grouping) {\n const grouping = request.grouping as GroupingDefinition,\n model = createGroupingModel(schema),\n builder = this.builder(schema, request.now);\n // A calendar key reads the interval start mapped from its field.\n let from = id(source.name);\n const keys: string[] = [];\n for (const [index, key] of grouping.keys.entries()) {\n if (!isCalendarGroupKey(key)) {\n keys.push(builder.field(key, false));\n continue;\n }\n const mapping = await this.calendarMapping(\n id(source.name),\n builder,\n schema,\n key,\n tables,\n signal,\n );\n const value = id(`qt_calendar_value${index}`),\n bucket = id(`qt_calendar_key${index}`);\n from += ` LEFT JOIN (SELECT value AS ${value}, bucket AS ${bucket} FROM ${id(mapping)}) AS ${id(`qt_calendar_map${index}`)} ON ${value} = CAST(${builder.field(key.field, false)} AS TIMESTAMPTZ)`;\n keys.push(bucket);\n }\n const names = groupKeyFields(grouping.keys).map(id);\n const representative = builder\n .order(\n grouping.representative?.orderBy ?? [\n { field: schema.idField, dir: \"desc\" },\n ],\n false,\n )\n .replace(/^ORDER BY /, \"\");\n const tie = grouping.representative?.orderBy.some(\n (term) => term.field === schema.idField,\n )\n ? \"\"\n : `, ${builder.field(schema.idField)} DESC NULLS LAST`;\n const summaries = grouping.summaries.map(\n (summary) =>\n `${\n summary.op === \"row\"\n ? `first(${builder.field(summary.field!, false)} ORDER BY ${representative}${tie})`\n : builder.expression(model.summaryExpression(summary), true).sql\n } AS ${id(summary.id)}`,\n );\n relation = this.temp(tables);\n const identity = `CAST(to_json(struct_pack(${keys.map((key, i) => `k${i} := ${key}`).join(\", \")})) AS VARCHAR)`;\n await this.run(\n builder.statement(\n `CREATE TEMP TABLE ${id(relation)} AS SELECT ${identity} AS ${id(GROUP_ID_FIELD)}, ${keys.map((key, i) => `${key} AS ${names[i]}`).join(\", \")}${summaries.length ? `, ${summaries.join(\", \")}` : \"\"} FROM ${from} GROUP BY ${keys.join(\", \")}`,\n ),\n signal,\n );\n const [{ n }] = (await this.sql(\n `SELECT COUNT(*) AS n FROM ${id(relation)}`,\n [],\n signal,\n )) as [{ n: number }];\n if (n > this.capabilities.maxGroups)\n throw new QueryError(\"resource_limit\", \"DuckDB grouped row budget exceeded.\");\n schema = model.resultSchema(grouping.keys, grouping.summaries);\n }\n const page = await this.page(\n relation,\n schema,\n request.result,\n request.now,\n signal,\n );\n const metrics = await this.metrics(\n relation,\n schema,\n request.result,\n request.metrics,\n request.now,\n tables,\n signal,\n );\n return {\n version: 3,\n now: request.now,\n sourceTotal: source.count,\n rows: request.rows ? page.rows : [],\n total: page.total,\n schema: {\n name: schema.name,\n idField: schema.idField,\n fields: schema.fields.map((field) => ({\n name: field.name,\n type: field.type,\n })),\n },\n metrics,\n execution: { ...this.execution, planToken: request.planToken ?? \"\" },\n };\n }, signal);\n }\n private async metrics(\n relation: string,\n schema: FieldSchema,\n query: ServerQuery,\n clauses: AggregationClause[],\n now: number,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<AggregationResultEntry[]> {\n const output: AggregationResultEntry[] = [];\n // A failed DuckDB statement aborts its transaction, and DuckDB has no\n // savepoints. Clauses read only staged temporary relations, so commit\n // them and give each clause its own transaction.\n await this.sql(\"COMMIT\", [], signal);\n for (const clause of clauses) {\n abort(signal);\n const created = tables.length;\n await this.sql(\"BEGIN TRANSACTION\", [], signal);\n try {\n const entry = await this.metric(\n relation,\n schema,\n query,\n clause,\n now,\n tables,\n signal,\n );\n await this.sql(\"COMMIT\", [], signal);\n output.push(entry);\n } catch (error) {\n await this.sql(\"ROLLBACK\").catch(() => {});\n // The rollback discarded this clause's scratch relations.\n tables.splice(created);\n abort(signal);\n output.push(failedMetric(clause.id, error, \"invalid_metric\"));\n }\n }\n await this.sql(\"BEGIN TRANSACTION\", [], signal);\n return output;\n }\n /** A temporary (value, bucket) table mapping each distinct non-null value\n * of `config.field` in `population` to the start of its calendar interval,\n * or to its cyclic slot, computed with the core calendar. */\n private async calendarMapping(\n population: string,\n builder: SQLBuilder,\n schema: FieldSchema,\n config: Pick<MetricDateGrouping, \"field\" | \"interval\" | \"timeZone\">,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<string> {\n const source = builder.field(config.field, false),\n cycle = isMetricCycle(config.interval) ? config.interval : undefined;\n const dates = await this.run(\n builder.statement(\n `SELECT DISTINCT CAST(${source} AS VARCHAR) AS value FROM ${population} r WHERE ${source} IS NOT NULL`,\n ),\n signal,\n );\n const mapping = this.temp(tables);\n await this.sql(\n `CREATE TEMP TABLE ${id(mapping)} (value TIMESTAMPTZ, bucket ${cycle ? \"INTEGER\" : \"TIMESTAMPTZ\"})`,\n [],\n signal,\n );\n for (let i = 0; i < dates.length; i += 250) {\n const args: unknown[] = [];\n const values = dates.slice(i, i + 250).map((row) => {\n const value = /^\\d{4}-\\d{2}-\\d{2}$/.test(String(row.value))\n ? String(row.value)\n : (this.formatRow({ [config.field]: row.value }, schema)[\n config.field\n ] as string);\n const floor = metricDateFloor(\n metricDateTime(value, config.timeZone),\n config.interval,\n config.timeZone,\n );\n // A cyclic slot is the local hour or weekday of the record's interval.\n args.push(\n value,\n cycle\n ? metricCycleSlot(floor, cycle, config.timeZone)\n : new Date(floor).toISOString(),\n );\n return `(CAST($${args.length - 1} AS TIMESTAMPTZ), CAST($${args.length} AS ${cycle ? \"INTEGER\" : \"TIMESTAMPTZ\"}))`;\n });\n if (values.length)\n await this.sql(\n `INSERT INTO ${id(mapping)} VALUES ${values.join(\", \")}`,\n args,\n signal,\n );\n }\n return mapping;\n }\n private async metric(\n relation: string,\n schema: FieldSchema,\n query: ServerQuery,\n clause: AggregationClause,\n now: number,\n tables: string[],\n signal?: AbortSignal,\n ): Promise<AggregationResultEntry> {\n // Wire metrics carry active distributions without presentation settings.\n if (clause.distribution && !clause.display)\n clause = { ...clause, display: { kind: clause.distribution.kind } };\n const issues = validateMetric(clause, schema);\n if (issues.length)\n throw Error(issues.map((issue) => issue.message).join(\" \"));\n const builder = this.builder(schema, now),\n where = builder.where(query.where);\n const window =\n clause.scope === \"shownRows\"\n ? `${builder.order(query.orderBy)} LIMIT ${builder.bind(query.limit)} OFFSET ${builder.bind(query.offset)}`\n : \"\";\n let population = `(SELECT * FROM ${id(relation)} WHERE ${where} ${window})`;\n // The metric's own predicate narrows the scoped rows (inside the page for\n // shown-row scope) and never changes the table rows.\n if (clause.where?.length)\n population = `(SELECT * FROM ${population} r WHERE ${builder.where(clause.where)})`;\n if (clause.dateGrouping) {\n const config = clause.dateGrouping;\n const dateMapping = await this.calendarMapping(\n population,\n builder,\n schema,\n config,\n tables,\n signal,\n );\n population = `(SELECT r.* EXCLUDE (${id(config.field)}), m.bucket AS ${id(config.field)} FROM ${population} r LEFT JOIN ${id(dateMapping)} m ON CAST(r.${id(config.field)} AS TIMESTAMPTZ) = m.value)`;\n }\n const keys = clause.groupBy.map((name) => builder.field(name, false)),\n groups = keys.length ? `GROUP BY ${keys.join(\", \")}` : \"\";\n const distribution =\n clause.distribution &&\n [\"box\", \"histogram\"].includes(clause.display?.kind ?? \"\")\n ? clause.distribution\n : undefined;\n const expression = distribution\n ? builder.expression(distribution.input).sql\n : builder.expression(metricExpression(clause), true).sql;\n const projections = keys.map(\n (key, index) => `${key} AS ${id(`g${index}`)}`,\n );\n projections.push(\n \"COUNT(*) AS count\",\n distribution\n ? `list(${expression}) FILTER (WHERE ${expression} IS NOT NULL) AS samples`\n : `${expression} AS value`,\n );\n if (!distribution && clause.display?.kind === \"scatter\")\n projections.push(\n `${builder.expression(clause.expressionY ?? \"COUNT()\", true).sql} AS y`,\n );\n // An object minCount measures each group with its own aggregate.\n const minMeasure = metricMinCountMeasure(clause);\n if (minMeasure)\n projections.push(\n `${builder.expression(metricExpression({ id: \"\", groupBy: [], ...minMeasure }), true).sql} AS min_measure`,\n );\n const rows = await this.run(\n builder.statement(\n `SELECT ${projections.join(\", \")} FROM ${population} r ${groups} LIMIT ${this.capabilities.maxGroups + 1}`,\n ),\n signal,\n );\n if (rows.length > this.capabilities.maxGroups)\n throw new QueryError(\"resource_limit\", \"DuckDB metric group budget exceeded.\");\n if (\n distribution &&\n rows.some(\n (row) =>\n (row.samples as unknown[] | null)?.length &&\n (row.samples as unknown[]).length > this.maxSamples,\n )\n )\n throw Error(\n `The ${distribution.kind} distribution exceeded the ${this.maxSamples.toLocaleString(\"en-US\")}-sample budget${clause.groupBy.length ? \" for one or more groups\" : \"\"}.`,\n );\n const edges =\n distribution?.kind === \"histogram\"\n ? histogramEdges(\n rows.flatMap((row) => (row.samples as number[]) ?? []),\n distribution.bins ?? 10,\n )\n : [];\n const measures = new Map<object, { value: unknown }>();\n const buckets: AggregationResultEntry[\"buckets\"] = rows.map((row) => {\n const samples = (row.samples as number[]) ?? [];\n const bucket: AggregationResultEntry[\"buckets\"][number] = {\n keys: clause.groupBy.map((name, index) => {\n const value = row[`g${index}`] ?? null;\n if (index === 0 && isMetricCycle(clause.dateGrouping?.interval))\n return value === null ? null : Number(value);\n return schema.fields.find((field) => field.name === name)?.type ===\n \"datetime\" && value !== null\n ? (this.formatRow({ [name]: value }, schema)[name] as string)\n : (value as MetricValue);\n }),\n count: row.count as number,\n value: distribution ? null : (row.value as MetricValue),\n ...(row.y !== undefined ? { y: row.y as MetricValue } : {}),\n ...(distribution\n ? {\n nullCount: (row.count as number) - samples.length,\n distribution:\n distribution.kind === \"box\"\n ? {\n kind: \"box\" as const,\n summary: boxSummary(samples, distribution.whiskers),\n }\n : {\n kind: \"histogram\" as const,\n n: samples.length,\n edges,\n counts: histogramCounts(samples, edges),\n },\n }\n : {}),\n };\n if (minMeasure) measures.set(bucket, { value: row.min_measure });\n return bucket;\n });\n if (clause.dateGrouping?.includeEmpty) {\n const config = clause.dateGrouping,\n cycle = isMetricCycle(config.interval) ? config.interval : undefined,\n observed = cycle\n ? []\n : buckets\n .filter((bucket) => bucket.keys[0] !== null)\n .map((bucket) => metricDateTime(bucket.keys[0]!));\n const range = cycle ? undefined : metricDateRange(\n config,\n {\n ...query,\n select: query.select.map((field) => ({ field })),\n } as QueryState,\n observed,\n now,\n (name) => name,\n );\n const series = new Map(\n buckets\n .filter((bucket) => bucket.keys[0] !== null)\n .map((bucket) => [\n JSON.stringify(bucket.keys.slice(1)),\n bucket.keys.slice(1),\n ]),\n );\n if (keys.length === 1 && !series.size) series.set(\"[]\", []);\n const existing = new Set(\n buckets.map((bucket) => JSON.stringify(bucket.keys)),\n );\n // Every slot of a cycle exists, whatever the date range.\n const slots: MetricValue[] = cycle ? metricCycleSlots(cycle) : [];\n if (range)\n for (\n let time = range[0];\n time <= range[1];\n time = metricDateNext(time, config.interval, config.timeZone)\n )\n slots.push(new Date(time).toISOString());\n for (const slot of slots)\n for (const tuple of series.values()) {\n const values = [slot, ...tuple];\n if (!existing.has(JSON.stringify(values))) {\n if (buckets.length >= this.capabilities.maxGroups)\n throw new QueryError(\"resource_limit\", \"DuckDB calendar group budget exceeded.\");\n buckets.push({\n keys: values,\n count: 0,\n value:\n (!clause.expression &&\n [\"count\", \"count_distinct\", \"sum\"].includes(clause.op)) ||\n /^(COUNT|COUNT_DISTINCT|SUM)\\([^)]*\\)$/.test(\n metricExpression(clause),\n )\n ? 0\n : null,\n });\n }\n }\n }\n // Calendar fill-ins (count 0) are never hidden; hidden groups leave the\n // ranking, the group limit and Other.\n let hiddenGroups: number | undefined;\n const min = metricMinCount(clause);\n if (min !== undefined) {\n const kept = buckets.filter((bucket) =>\n metricMinCountKeeps(min, bucket.count, measures.get(bucket)),\n );\n hiddenGroups = buckets.length - kept.length;\n buckets.splice(0, buckets.length, ...kept);\n }\n // Calendar metrics default to chronological order, like the other engines.\n const sort: MetricSort[] = clause.sort?.length\n ? clause.sort\n : clause.dateGrouping\n ? [{ key: \"group0\", dir: \"asc\", nulls: \"last\" }]\n : [{ key: \"value\", dir: \"desc\" }];\n buckets.sort((a, b) => {\n for (const term of sort) {\n const value = (bucket: typeof a): MetricValue =>\n term.key.startsWith(\"group\")\n ? (bucket.keys[Number(term.key.slice(5))] ?? null)\n : term.key === \"samples\"\n ? bucket.distribution?.kind === \"box\"\n ? (bucket.distribution.summary?.n ?? 0)\n : (bucket.distribution?.n ?? 0)\n : ((bucket as unknown as Record<string, MetricValue>)[term.key] ??\n null);\n const av = value(a),\n bv = value(b);\n if (av === null || bv === null) {\n if (av !== bv)\n return (av === null ? 1 : -1) * (term.nulls === \"first\" ? -1 : 1);\n } else {\n const result = compareMetricValues(av, bv);\n if (result) return result * (term.dir === \"asc\" ? 1 : -1);\n }\n }\n return JSON.stringify(a.keys).localeCompare(JSON.stringify(b.keys));\n });\n const limit = clause.groupLimit ?? 10000;\n return {\n id: clause.id,\n buckets: buckets.slice(0, limit),\n groupCount: buckets.length,\n coverage: buckets.length > limit ? \"partial\" : \"exact\",\n ...(clause.scope ? { scope: clause.scope } : {}),\n ...(hiddenGroups !== undefined ? { hiddenGroups } : {}),\n };\n }\n transport(): Transport<DuckDBRow> {\n return {\n queryCapabilities: this.capabilities,\n fetchQueryV3: (request, signal) => this.execute(request, signal),\n };\n }\n /** Distinct values over the source population, without staging it. */\n private distinct(\n request: QueryRequestV3,\n signal?: AbortSignal,\n ): Promise<QueryResultV3> {\n const query = request.distinct!;\n if (request.rows || request.metrics.length || request.grouping)\n return Promise.reject(\n Error(\"A distinct request has no rows, metrics or grouping.\"),\n );\n if (\n !Number.isSafeInteger(query.limit) ||\n query.limit < 1 ||\n query.limit > 500 ||\n typeof query.search !== \"string\" ||\n query.search.length > 2000\n )\n return Promise.reject(Error(\"Distinct request exceeds its budget.\"));\n return this.serial(async () => {\n const builder = this.builder(this.schema, request.now),\n field = builder.definition(query.field);\n if (!isFilterable(field))\n throw Error(`Field ${field.name} is not filterable.`);\n const source = this.projectedSource(request.now),\n value = builder.field(query.field),\n array = field.type === \"textarray\";\n builder.args.push(...source.args);\n const population = `(${source.sql}) r WHERE ${builder.where(request.source.where)}`;\n const param = builder.bind(query.search);\n const rows = await this.run(\n builder.statement(\n `SELECT CAST(value AS VARCHAR) AS value, COUNT(*) AS n FROM (SELECT ${array ? `unnest(${value})` : value} AS value FROM ${population}) v WHERE value IS NOT NULL AND contains(lower(CAST(value AS VARCHAR)), lower(${param})) GROUP BY value ORDER BY n DESC, value ASC LIMIT ${query.limit + 1}`,\n ),\n signal,\n );\n const nulls = this.builder(this.schema, request.now);\n nulls.args.push(...source.args);\n const [{ n }] = (await this.run(\n nulls.statement(\n `SELECT COUNT(*) AS n FROM (${source.sql}) r WHERE ${nulls.where(request.source.where)} AND ${array ? `COALESCE(len(${value}),0) = 0` : `${value} IS NULL`}`,\n ),\n signal,\n )) as [{ n: number }];\n return {\n version: 3,\n now: request.now,\n sourceTotal: 0,\n rows: [],\n total: 0,\n schema: { name: this.schema.name, idField: this.schema.idField, fields: [] },\n metrics: [],\n distinct: {\n values: rows.slice(0, query.limit).map((row) => String(row.value)),\n hasMore: rows.length > query.limit,\n hasNull: n > 0,\n },\n execution: { ...this.execution, planToken: request.planToken ?? \"\" },\n };\n }, signal);\n }\n}\n\nexport function createDuckDBTransport(\n options: DuckDBOptions,\n): Transport<DuckDBRow> {\n return new DuckDBBackend(options).transport();\n}\n","import type { DuckDBConnection, DuckDBRow } from \"./backend\";\n\n/** Structural adapter keeps duckdb-wasm optional and out of native bundles. */\nexport interface DuckDBWasmConnection {\n query(sql: string): Promise<{ toArray(): { toJSON(): unknown }[] }>;\n prepare(sql: string): Promise<{\n query(...args: any[]): Promise<{ toArray(): { toJSON(): unknown }[] }>;\n close(): Promise<void>;\n }>;\n}\nexport function fromDuckDBWasmConnection(\n connection: DuckDBWasmConnection,\n): DuckDBConnection {\n return {\n async query(sql, args) {\n if (!args.length)\n return (await connection.query(sql))\n .toArray()\n .map((row) => row.toJSON() as DuckDBRow);\n const statement = await connection.prepare(sql);\n try {\n return (await statement.query(...args))\n .toArray()\n .map((row) => row.toJSON() as DuckDBRow);\n } finally {\n await statement.close();\n }\n },\n };\n}\n","import {\n loadSchema,\n type FieldSchema,\n} from \"@pythia-software/query-table-core\";\n\n/** Read explicit DuckDB bindings; never reuse another engine's SQL. */\nexport function loadDuckDBSchema(document: unknown): {\n schema: FieldSchema;\n bindings: Record<string, string>;\n} {\n const schema = loadSchema(document);\n const raw = document as {\n fields: { name: string; bindings?: { duckdb?: { expr?: unknown } } }[];\n };\n const bindings: Record<string, string> = Object.create(null);\n for (const field of schema.fields) {\n if (field.source.kind !== \"backend\") continue;\n const binding = raw.fields.find((item) => item.name === field.name)\n ?.bindings?.duckdb;\n if (\n !binding ||\n typeof binding.expr !== \"string\" ||\n !binding.expr.trim() ||\n binding.expr.includes(\"\\0\")\n )\n throw Error(\n `Field ${field.name} requires an explicit bindings.duckdb.expr.`,\n );\n bindings[field.name] = binding.expr;\n }\n return { schema, bindings };\n}\n"],"mappings":"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","names":["field","compileFormula","isSelectable","isFilterable","QueryError","compileFormula","QueryError","isSelectable","field","isFilterable"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pythia-software/query-table-duckdb",
3
- "version": "0.9.9",
3
+ "version": "1.0.1",
4
4
  "description": "Schema-bound DuckDB execution for Query Table, in Node.js or the browser.",
5
5
  "license": "MIT",
6
6
  "author": "Pythia Software",
@@ -41,6 +41,6 @@
41
41
  "prepack": "npm run build"
42
42
  },
43
43
  "dependencies": {
44
- "@pythia-software/query-table-core": "0.9.9"
44
+ "@pythia-software/query-table-core": "1.0.1"
45
45
  }
46
46
  }