@pythia-software/query-table-duckdb 0.0.0-stage → 0.7.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sql.ts","../src/backend.ts","../src/wasm.ts","../src/schema.ts"],"sourcesContent":["import {\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 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 const clauses = \"any\" in term ? term.any : [term];\n if (!clauses.length || (count += clauses.length) > 100)\n throw Error(\"Invalid filter predicate budget.\");\n return `(${clauses\n .map((clause) => {\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 .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 === \"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 validateMetric,\n isSelectable,\n isFilterable,\n boxSummary,\n histogramEdges,\n histogramCounts,\n compareMetricValues,\n metricDateFloor,\n metricDateTime,\n metricDateNext,\n metricDateRange,\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 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 computedSourceFilters: definitions.size > 0,\n regex: true,\n regexSourceFilters: true,\n regexAggregateExpressions: false,\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 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 const keys = grouping.keys.map((name) => builder.field(name, false)),\n names = 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 ${id(source.name)} 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 for (const clause of clauses) {\n abort(signal);\n try {\n output.push(\n await this.metric(\n relation,\n schema,\n query,\n clause,\n now,\n tables,\n signal,\n ),\n );\n } catch (error) {\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 return output;\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 let dateMapping: string | undefined;\n if (clause.dateGrouping) {\n const config = clause.dateGrouping,\n source = builder.field(config.field, false);\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 dateMapping = this.temp(tables);\n await this.sql(\n `CREATE TEMP TABLE ${id(dateMapping)} (value TIMESTAMPTZ, bucket 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 args.push(\n value,\n new Date(\n metricDateFloor(\n metricDateTime(value, config.timeZone),\n config.interval,\n config.timeZone,\n ),\n ).toISOString(),\n );\n return `(CAST($${args.length - 1} AS TIMESTAMPTZ), CAST($${args.length} AS TIMESTAMPTZ))`;\n });\n if (values.length)\n await this.sql(\n `INSERT INTO ${id(dateMapping)} VALUES ${values.join(\", \")}`,\n args,\n signal,\n );\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 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(\"DuckDB exact sample budget exceeded.\");\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 buckets: AggregationResultEntry[\"buckets\"] = rows.map((row) => {\n const samples = (row.samples as number[]) ?? [];\n return {\n keys: clause.groupBy.map((name, index) => {\n const value = row[`g${index}`] ?? null;\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 });\n if (clause.dateGrouping?.includeEmpty) {\n const config = clause.dateGrouping,\n observed = buckets\n .filter((bucket) => bucket.keys[0] !== null)\n .map((bucket) => metricDateTime(bucket.keys[0]!));\n const range = 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 if (range)\n for (\n let time = range[0];\n time <= range[1];\n time = metricDateNext(time, config.interval, config.timeZone)\n ) {\n for (const tuple of series.values()) {\n const values = [new Date(time).toISOString(), ...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 }\n const sort = clause.sort ?? [\n { key: \"value\" as const, dir: \"desc\" as const },\n ];\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 };\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 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"]}
package/package.json CHANGED
@@ -1,6 +1,46 @@
1
1
  {
2
2
  "name": "@pythia-software/query-table-duckdb",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.7.0",
4
+ "description": "Schema-bound DuckDB execution for Query Table, in Node.js or the browser.",
5
+ "license": "MIT",
6
+ "author": "Pythia Software",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Pythia-Software/query-table.git",
10
+ "directory": "packages/duckdb"
11
+ },
12
+ "homepage": "https://github.com/Pythia-Software/query-table#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/Pythia-Software/query-table/issues"
15
+ },
16
+ "type": "module",
17
+ "sideEffects": false,
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "engines": {
36
+ "node": ">=22"
37
+ },
38
+ "scripts": {
39
+ "build": "tsup src/index.ts --format esm --dts --sourcemap --clean --target es2020",
40
+ "typecheck": "tsc --noEmit",
41
+ "prepack": "npm run build"
42
+ },
43
+ "dependencies": {
44
+ "@pythia-software/query-table-core": "0.7.0"
45
+ }
46
+ }