sqlql 0.1.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,"file":"index.cjs","names":["nodeSqlParser"],"sources":["../../core/src/planning.ts","../../core/src/index.ts","../../sql/src/index.ts"],"sourcesContent":["export type ScalarValue = string | number | boolean | null;\n\nexport type ComparisonOperator = \"=\" | \"!=\" | \">\" | \">=\" | \"<\" | \"<=\";\n\nexport interface ColumnRef {\n table: string;\n column: string;\n}\n\nexport interface LiteralValue {\n kind: \"literal\";\n value: ScalarValue;\n}\n\nexport interface ColumnValue {\n kind: \"column\";\n ref: ColumnRef;\n}\n\nexport type Expression = ColumnValue | LiteralValue;\n\nexport interface ComparisonPredicate {\n kind: \"comparison\";\n operator: ComparisonOperator;\n left: Expression;\n right: Expression;\n}\n\nexport interface InPredicate {\n kind: \"in\";\n left: Expression;\n values: ScalarValue[];\n}\n\nexport interface NullPredicate {\n kind: \"null_check\";\n expression: Expression;\n negated: boolean;\n}\n\nexport interface AndPredicate {\n kind: \"and\";\n predicates: Predicate[];\n}\n\nexport interface OrPredicate {\n kind: \"or\";\n predicates: Predicate[];\n}\n\nexport interface NotPredicate {\n kind: \"not\";\n predicate: Predicate;\n}\n\nexport type Predicate =\n | ComparisonPredicate\n | InPredicate\n | NullPredicate\n | AndPredicate\n | OrPredicate\n | NotPredicate;\n\nexport interface SelectItem {\n expression: Expression;\n alias?: string;\n}\n\nexport interface OrderByTerm {\n expression: Expression;\n direction: \"asc\" | \"desc\";\n}\n\nexport interface JoinSpec {\n type: \"inner\" | \"left\";\n sourceTable: string;\n sourceAlias?: string;\n on: Predicate;\n}\n\nexport interface AggregateExpression {\n function: \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n argument?: Expression;\n distinct?: boolean;\n}\n\nexport interface AggregateItem {\n alias: string;\n expression: AggregateExpression;\n}\n\nexport interface CteBinding {\n name: string;\n query: QueryIR;\n recursive?: boolean;\n}\n\nexport interface FromSource {\n table: string;\n alias?: string;\n}\n\nexport interface QueryIR {\n ctes?: CteBinding[];\n from: FromSource;\n joins?: JoinSpec[];\n select: SelectItem[];\n where?: Predicate;\n groupBy?: Expression[];\n aggregates?: AggregateItem[];\n orderBy?: OrderByTerm[];\n limit?: number;\n offset?: number;\n}\n\nexport interface MutationIR {\n type: \"insert\" | \"update\" | \"delete\";\n table: string;\n}\n\nexport interface QueryCapabilities {\n filterOperators: ComparisonOperator[];\n filterableColumns: string[];\n sortableColumns: string[];\n maxLimit: number;\n requiresLimit: boolean;\n supportsOr: boolean;\n supportsNot: boolean;\n supportsAggregates: boolean;\n supportsCtes: boolean;\n supportsRecursiveCtes: boolean;\n}\n\nexport interface ScanRequest {\n table: string;\n alias?: string;\n projection: ColumnRef[];\n predicate?: Predicate;\n orderBy?: OrderByTerm[];\n limit?: number;\n offset?: number;\n}\n\nexport interface AggregateRequest {\n table: string;\n alias?: string;\n predicate?: Predicate;\n groupBy: Expression[];\n aggregates: AggregateItem[];\n orderBy?: OrderByTerm[];\n limit?: number;\n}\n\nexport type Row = Record<string, unknown>;\n\nexport interface RowSet {\n rows: Row[];\n}\n\nexport interface ResolverContext {\n requestId: string;\n actorId?: string;\n}\n\nexport interface TableResolver<TContext extends ResolverContext = ResolverContext> {\n table: string;\n capabilities: QueryCapabilities;\n scan: (request: ScanRequest, context: TContext) => Promise<RowSet>;\n aggregate?: (request: AggregateRequest, context: TContext) => Promise<RowSet>;\n}\n\nexport interface ResolverRegistry<TContext extends ResolverContext = ResolverContext> {\n getResolver: (table: string) => TableResolver<TContext> | undefined;\n}\n\nexport interface PlanStepBase {\n id: string;\n dependsOn: string[];\n}\n\nexport interface ScanStep extends PlanStepBase {\n kind: \"scan\";\n table: string;\n resolver: string;\n request: ScanRequest;\n pushdown: {\n predicate: boolean;\n projection: boolean;\n orderBy: boolean;\n limit: boolean;\n };\n}\n\nexport interface FilterStep extends PlanStepBase {\n kind: \"filter\";\n predicate: Predicate;\n}\n\nexport interface JoinStep extends PlanStepBase {\n kind: \"join\";\n join: JoinSpec;\n}\n\nexport interface AggregateStep extends PlanStepBase {\n kind: \"aggregate\";\n request: AggregateRequest;\n}\n\nexport interface ProjectStep extends PlanStepBase {\n kind: \"project\";\n select: SelectItem[];\n}\n\nexport interface CteStep extends PlanStepBase {\n kind: \"cte\";\n binding: CteBinding;\n strategy: \"inline\" | \"materialize\";\n}\n\nexport type PlanStep = ScanStep | FilterStep | JoinStep | AggregateStep | ProjectStep | CteStep;\n\nexport interface QueryPlan {\n rootStepId: string;\n steps: PlanStep[];\n}\n\nexport interface ExplainDecision {\n stepId: string;\n decision: string;\n}\n\nexport interface ExplainResult {\n query: QueryIR;\n plan: QueryPlan;\n decisions: ExplainDecision[];\n}\n\nexport function defineTableResolver<TContext extends ResolverContext = ResolverContext>(\n resolver: TableResolver<TContext>,\n): TableResolver<TContext> {\n return resolver;\n}\n","export type SqlScalarType = \"text\" | \"integer\" | \"boolean\" | \"timestamp\";\n\nexport type TableColumns = Record<string, SqlScalarType>;\n\nexport interface SchemaQueryDefaults {\n filterable: \"all\" | string[];\n sortable: \"all\" | string[];\n maxRows: number | null;\n}\n\nexport interface TableQueryOverrides {\n filterable?: \"all\" | string[];\n sortable?: \"all\" | string[];\n maxRows?: number | null;\n}\n\nexport interface TableDefinition {\n columns: TableColumns;\n query?: TableQueryOverrides;\n}\n\nexport interface SchemaDefinition {\n defaults?: {\n query?: Partial<SchemaQueryDefaults>;\n };\n tables: Record<string, TableDefinition>;\n}\n\nexport const DEFAULT_QUERY_BEHAVIOR: SchemaQueryDefaults = {\n filterable: \"all\",\n sortable: \"all\",\n maxRows: null,\n};\n\nexport function defineSchema<TSchema extends SchemaDefinition>(schema: TSchema): TSchema {\n return schema;\n}\n\nexport function getTable(schema: SchemaDefinition, tableName: string): TableDefinition {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Unknown table: ${tableName}`);\n }\n\n return table;\n}\n\nexport function resolveTableQueryBehavior(\n schema: SchemaDefinition,\n tableName: string,\n): SchemaQueryDefaults {\n const table = getTable(schema, tableName);\n const defaults = schema.defaults?.query;\n\n return {\n filterable:\n table.query?.filterable ?? defaults?.filterable ?? DEFAULT_QUERY_BEHAVIOR.filterable,\n sortable: table.query?.sortable ?? defaults?.sortable ?? DEFAULT_QUERY_BEHAVIOR.sortable,\n maxRows: table.query?.maxRows ?? defaults?.maxRows ?? DEFAULT_QUERY_BEHAVIOR.maxRows,\n };\n}\n\nexport type ScanFilterOperator = \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"in\";\n\nexport interface FilterClauseBase {\n column: string;\n op: ScanFilterOperator;\n}\n\nexport interface ScalarFilterClause extends FilterClauseBase {\n op: \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\";\n value: unknown;\n}\n\nexport interface SetFilterClause extends FilterClauseBase {\n op: \"in\";\n values: unknown[];\n}\n\nexport type ScanFilterClause = ScalarFilterClause | SetFilterClause;\n\nexport interface ScanOrderBy {\n column: string;\n direction: \"asc\" | \"desc\";\n}\n\nexport interface TableScanRequest {\n table: string;\n alias?: string;\n select: string[];\n where?: ScanFilterClause[];\n orderBy?: ScanOrderBy[];\n limit?: number;\n offset?: number;\n}\n\nexport interface TableLookupRequest {\n table: string;\n alias?: string;\n key: string;\n values: unknown[];\n select: string[];\n where?: ScanFilterClause[];\n}\n\nexport type AggregateFunction = \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n\nexport interface TableAggregateMetric {\n fn: AggregateFunction;\n column?: string;\n as: string;\n distinct?: boolean;\n}\n\nexport interface TableAggregateRequest {\n table: string;\n alias?: string;\n where?: ScanFilterClause[];\n groupBy?: string[];\n metrics: TableAggregateMetric[];\n limit?: number;\n}\n\nexport type QueryRow = Record<string, unknown>;\n\nexport interface TableMethods<TContext = unknown> {\n scan: (request: TableScanRequest, context: TContext) => Promise<QueryRow[]>;\n lookup?: (request: TableLookupRequest, context: TContext) => Promise<QueryRow[]>;\n aggregate?: (request: TableAggregateRequest, context: TContext) => Promise<QueryRow[]>;\n}\n\nexport type TableMethodsMap<TContext = unknown> = Record<string, TableMethods<TContext>>;\n\nexport function defineTableMethods<TContext, TMethods extends TableMethodsMap<TContext>>(\n methods: TMethods,\n): TMethods {\n return methods;\n}\n\nexport interface SqlDdlOptions {\n ifNotExists?: boolean;\n}\n\nexport function toSqlDDL(schema: SchemaDefinition, options: SqlDdlOptions = {}): string {\n const createPrefix = options.ifNotExists ? \"CREATE TABLE IF NOT EXISTS\" : \"CREATE TABLE\";\n const statements: string[] = [];\n\n for (const [tableName, table] of Object.entries(schema.tables)) {\n const columnEntries = Object.entries(table.columns);\n if (columnEntries.length === 0) {\n throw new Error(`Cannot generate DDL for table ${tableName} with no columns.`);\n }\n\n const columnsSql = columnEntries\n .map(\n ([columnName, columnType]) => ` ${escapeIdentifier(columnName)} ${toSqlType(columnType)}`,\n )\n .join(\",\\n\");\n\n statements.push(`${createPrefix} ${escapeIdentifier(tableName)} (\\n${columnsSql}\\n);`);\n }\n\n return statements.join(\"\\n\\n\");\n}\n\nfunction toSqlType(type: SqlScalarType): string {\n switch (type) {\n case \"text\":\n return \"TEXT\";\n case \"integer\":\n return \"INTEGER\";\n case \"boolean\":\n return \"BOOLEAN\";\n case \"timestamp\":\n return \"TIMESTAMP\";\n }\n}\n\nfunction escapeIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n\nexport * as planning from \"./planning\";\n","import {\n getTable,\n resolveTableQueryBehavior,\n type QueryRow,\n type ScanFilterClause,\n type ScanOrderBy,\n type SchemaDefinition,\n type TableMethods,\n type TableMethodsMap,\n type TableScanRequest,\n} from \"@sqlql/core\";\nimport nodeSqlParser from \"node-sql-parser\";\n\nexport interface SqlQuery {\n text: string;\n}\n\nexport interface PlannedQuery {\n source: string;\n selectAll: boolean;\n}\n\nexport interface QueryInput<TContext> {\n schema: SchemaDefinition;\n methods: TableMethodsMap<TContext>;\n context: TContext;\n sql: string;\n}\n\ninterface TableBinding {\n table: string;\n alias: string;\n index: number;\n}\n\ninterface JoinCondition {\n leftAlias: string;\n leftColumn: string;\n rightAlias: string;\n rightColumn: string;\n}\n\ninterface ParsedJoin {\n alias: string;\n join: \"inner\";\n condition: JoinCondition;\n}\n\ninterface SelectColumn {\n alias: string;\n column: string;\n output: string;\n}\n\ninterface OrderColumn {\n alias: string;\n column: string;\n direction: \"asc\" | \"desc\";\n}\n\ninterface LiteralFilter {\n alias: string;\n clause: ScanFilterClause;\n}\n\ninterface ParsedSelectQuery {\n bindings: TableBinding[];\n joins: ParsedJoin[];\n joinEdges: JoinCondition[];\n filters: LiteralFilter[];\n selectAll: boolean;\n selectColumns: SelectColumn[];\n orderBy: OrderColumn[];\n limit?: number;\n}\n\nconst { Parser } = nodeSqlParser as { Parser: new () => { astify: (sql: string) => unknown } };\nconst parser = new Parser();\n\nexport function parseSql(query: SqlQuery, schema: SchemaDefinition): PlannedQuery {\n const parsed = parseSelectAst(query.text, schema);\n const source = parsed.bindings[0];\n if (!source) {\n throw new Error(\"SELECT queries must include a FROM clause.\");\n }\n\n return {\n source: source.table,\n selectAll: parsed.selectAll,\n };\n}\n\nexport async function query<TContext>(input: QueryInput<TContext>): Promise<QueryRow[]> {\n const parsed = parseSelectAst(input.sql, input.schema);\n const rootBinding = parsed.bindings[0];\n if (!rootBinding) {\n throw new Error(\"SELECT queries must include a FROM clause.\");\n }\n\n for (const binding of parsed.bindings) {\n getTable(input.schema, binding.table);\n if (!input.methods[binding.table]) {\n throw new Error(`No table methods registered for table: ${binding.table}`);\n }\n }\n\n const projectionByAlias = buildProjection(parsed, input.schema);\n const filtersByAlias = groupFiltersByAlias(parsed.filters);\n const executionOrder = buildExecutionOrder(parsed.bindings, parsed.joinEdges, filtersByAlias);\n const rowsByAlias = new Map<string, QueryRow[]>();\n\n for (const alias of executionOrder) {\n const binding = parsed.bindings.find((candidate) => candidate.alias === alias);\n if (!binding) {\n throw new Error(`Unknown alias in execution order: ${alias}`);\n }\n\n const dependencyFilters = buildDependencyFilters(alias, parsed.joinEdges, rowsByAlias);\n const localFilters = filtersByAlias.get(alias) ?? [];\n\n if (dependencyFilters.some((filter) => filter.op === \"in\" && filter.values.length === 0)) {\n rowsByAlias.set(alias, []);\n continue;\n }\n\n const tableBehavior = resolveTableQueryBehavior(input.schema, binding.table);\n const defaultMaxRows = tableBehavior.maxRows;\n const requestWhere: ScanFilterClause[] = [...localFilters, ...dependencyFilters];\n\n const canPushFinalSort =\n parsed.bindings.length === 1 && parsed.orderBy.every((term) => term.alias === alias);\n const requestOrderBy: ScanOrderBy[] | undefined = canPushFinalSort\n ? parsed.orderBy.map((term) => ({\n column: term.column,\n direction: term.direction,\n }))\n : undefined;\n\n const canPushFinalLimit = parsed.bindings.length === 1;\n let requestLimit = canPushFinalLimit ? parsed.limit : undefined;\n if (requestLimit == null && defaultMaxRows != null) {\n requestLimit = defaultMaxRows;\n }\n if (requestLimit != null && defaultMaxRows != null && requestLimit > defaultMaxRows) {\n throw new Error(\n `Requested limit ${requestLimit} exceeds maxRows ${defaultMaxRows} for table ${binding.table}`,\n );\n }\n\n const method = input.methods[binding.table];\n if (!method) {\n throw new Error(`No table methods registered for table: ${binding.table}`);\n }\n\n const projection = projectionByAlias.get(alias);\n if (!projection) {\n throw new Error(`Unable to resolve projection columns for alias: ${alias}`);\n }\n\n const request: TableScanRequest = {\n table: binding.table,\n alias,\n select: [...projection],\n };\n if (requestWhere.length > 0) {\n request.where = requestWhere;\n }\n if (requestOrderBy && requestOrderBy.length > 0) {\n request.orderBy = requestOrderBy;\n }\n if (requestLimit != null) {\n request.limit = requestLimit;\n }\n\n const rows = await runScan(method, request, input.context);\n rowsByAlias.set(alias, rows);\n }\n\n let joinedRows = initializeJoinedRows(rowsByAlias, rootBinding.alias);\n for (const join of parsed.joins) {\n joinedRows = applyInnerJoin(joinedRows, join, rowsByAlias);\n }\n\n if (parsed.orderBy.length > 0) {\n joinedRows = applyFinalSort(joinedRows, parsed.orderBy);\n }\n\n if (parsed.limit != null && parsed.bindings.length > 1) {\n joinedRows = joinedRows.slice(0, parsed.limit);\n }\n\n return projectResultRows(joinedRows, parsed);\n}\n\nasync function runScan<TContext>(\n method: TableMethods<TContext>,\n request: TableScanRequest,\n context: TContext,\n): Promise<QueryRow[]> {\n const dependencyFilters = request.where?.filter((clause) => clause.op === \"in\") ?? [];\n\n if (\n dependencyFilters.length === 1 &&\n method.lookup &&\n dependencyFilters[0] &&\n dependencyFilters[0].values.length > 0 &&\n request.orderBy == null &&\n request.limit == null\n ) {\n const lookup = dependencyFilters[0];\n if (!lookup) {\n return method.scan(request, context);\n }\n\n const nonDependencyFilters = request.where?.filter((clause) => clause !== lookup);\n const lookupRequest = {\n table: request.table,\n key: lookup.column,\n values: lookup.values,\n select: request.select,\n } as const;\n const fullLookupRequest: Parameters<NonNullable<typeof method.lookup>>[0] = {\n ...lookupRequest,\n };\n if (request.alias) {\n fullLookupRequest.alias = request.alias;\n }\n if (nonDependencyFilters && nonDependencyFilters.length > 0) {\n fullLookupRequest.where = nonDependencyFilters;\n }\n return method.lookup(fullLookupRequest, context);\n }\n\n return method.scan(request, context);\n}\n\nfunction parseSelectAst(sql: string, _schema: SchemaDefinition): ParsedSelectQuery {\n const astRaw = parser.astify(sql);\n if (Array.isArray(astRaw)) {\n throw new Error(\"Only a single SQL statement is supported.\");\n }\n\n const ast = astRaw as {\n type?: unknown;\n from?: unknown;\n where?: unknown;\n columns?: unknown;\n orderby?: unknown;\n limit?: unknown;\n };\n\n if (ast.type !== \"select\") {\n throw new Error(\"Only SELECT statements are currently supported.\");\n }\n\n const rawFrom: unknown[] = Array.isArray(ast.from) ? ast.from : ast.from ? [ast.from] : [];\n if (rawFrom.length === 0) {\n throw new Error(\"SELECT queries must include a FROM clause.\");\n }\n\n const bindings = rawFrom.map((entry: unknown, index: number) => {\n if (!entry || typeof entry !== \"object\" || !(\"table\" in entry)) {\n throw new Error(\"Unsupported FROM clause entry.\");\n }\n\n const table = (entry as { table?: unknown }).table;\n const alias = (entry as { as?: unknown }).as;\n if (typeof table !== \"string\" || table.length === 0) {\n throw new Error(\"Unable to resolve table name from query.\");\n }\n\n return {\n table,\n alias: typeof alias === \"string\" && alias.length > 0 ? alias : table,\n index,\n };\n });\n\n const aliasToTable = new Map(\n bindings.map((binding: TableBinding) => [binding.alias, binding.table]),\n );\n\n const joins: ParsedJoin[] = [];\n const joinEdges: JoinCondition[] = [];\n\n for (let i = 1; i < rawFrom.length; i += 1) {\n const entry = rawFrom[i] as { join?: unknown; on?: unknown; as?: unknown; table?: unknown };\n const joinType = typeof entry.join === \"string\" ? entry.join.toUpperCase() : \"\";\n if (joinType !== \"INNER JOIN\" && joinType !== \"JOIN\") {\n throw new Error(`Unsupported join type: ${String(entry.join ?? \"unknown\")}`);\n }\n\n const parsedJoin = parseJoinCondition(entry.on);\n if (!aliasToTable.has(parsedJoin.leftAlias) || !aliasToTable.has(parsedJoin.rightAlias)) {\n throw new Error(\"JOIN condition references an unknown table alias.\");\n }\n\n const joinedAlias =\n typeof entry.as === \"string\" && entry.as.length > 0 ? entry.as : String(entry.table);\n joins.push({\n alias: joinedAlias,\n join: \"inner\",\n condition: parsedJoin,\n });\n joinEdges.push(parsedJoin);\n }\n\n const whereParts = flattenAndConditions(ast.where);\n const filters: LiteralFilter[] = [];\n\n for (const part of whereParts) {\n if (!part || typeof part !== \"object\") {\n throw new Error(\"Unsupported WHERE clause.\");\n }\n\n const binary = part as { type?: unknown; operator?: unknown; left?: unknown; right?: unknown };\n if (binary.type !== \"binary_expr\") {\n throw new Error(\"Only binary predicates are supported in WHERE clauses.\");\n }\n\n const operator = normalizeBinaryOperator(binary.operator);\n if (operator === \"in\") {\n const colRef = toColumnRef(binary.left);\n if (!colRef) {\n throw new Error(\"IN predicates must use a column on the left-hand side.\");\n }\n\n const values = parseExpressionList(binary.right);\n filters.push({\n alias: colRef.alias,\n clause: {\n op: \"in\",\n column: colRef.column,\n values,\n },\n });\n continue;\n }\n\n const leftCol = toColumnRef(binary.left);\n const rightCol = toColumnRef(binary.right);\n\n if (operator === \"eq\" && leftCol && rightCol) {\n joinEdges.push({\n leftAlias: leftCol.alias,\n leftColumn: leftCol.column,\n rightAlias: rightCol.alias,\n rightColumn: rightCol.column,\n });\n continue;\n }\n\n const leftLiteral = parseLiteral(binary.left);\n const rightLiteral = parseLiteral(binary.right);\n\n if (leftCol && rightLiteral !== undefined) {\n filters.push({\n alias: leftCol.alias,\n clause: {\n op: operator,\n column: leftCol.column,\n value: rightLiteral,\n },\n });\n continue;\n }\n\n if (rightCol && leftLiteral !== undefined) {\n filters.push({\n alias: rightCol.alias,\n clause: {\n op: invertOperator(operator),\n column: rightCol.column,\n value: leftLiteral,\n },\n });\n continue;\n }\n\n throw new Error(\n \"WHERE predicates must compare columns to literals (or column equality joins).\",\n );\n }\n\n const selectColumnsRaw: unknown = ast.columns;\n const selectAll =\n selectColumnsRaw === \"*\" ||\n (Array.isArray(selectColumnsRaw) &&\n selectColumnsRaw.length === 1 &&\n isStarColumn(selectColumnsRaw[0] as { expr?: unknown }));\n\n const selectColumns: SelectColumn[] = [];\n if (!selectAll) {\n if (!Array.isArray(selectColumnsRaw)) {\n throw new Error(\"Unsupported SELECT clause.\");\n }\n\n for (const item of selectColumnsRaw) {\n if (!item || typeof item !== \"object\") {\n throw new Error(\"Unsupported SELECT item.\");\n }\n\n const expr = (item as { expr?: unknown }).expr;\n const colRef = toColumnRef(expr);\n if (!colRef) {\n throw new Error(\"Only direct column references are currently supported in SELECT.\");\n }\n\n const as = (item as { as?: unknown }).as;\n selectColumns.push({\n alias: colRef.alias,\n column: colRef.column,\n output:\n typeof as === \"string\" && as.length > 0\n ? as\n : selectColumns.some((existing) => existing.column === colRef.column)\n ? `${colRef.alias}.${colRef.column}`\n : colRef.column,\n });\n }\n }\n\n const orderBy: OrderColumn[] = [];\n if (Array.isArray(ast.orderby)) {\n for (const item of ast.orderby) {\n const colRef = toColumnRef((item as { expr?: unknown }).expr);\n if (!colRef) {\n throw new Error(\"Only column references are currently supported in ORDER BY.\");\n }\n\n const rawType = (item as { type?: unknown }).type;\n orderBy.push({\n alias: colRef.alias,\n column: colRef.column,\n direction: rawType === \"DESC\" ? \"desc\" : \"asc\",\n });\n }\n }\n\n let limit: number | undefined;\n const rawLimit = ast.limit as { value?: Array<{ value?: unknown }> } | null;\n if (rawLimit && Array.isArray(rawLimit.value) && rawLimit.value.length > 0) {\n const first = rawLimit.value[0]?.value;\n if (typeof first === \"number\") {\n limit = first;\n } else if (typeof first === \"string\") {\n const parsed = Number(first);\n if (Number.isFinite(parsed)) {\n limit = parsed;\n }\n }\n if (limit == null) {\n throw new Error(\"Unable to parse LIMIT value.\");\n }\n }\n\n if (selectAll && bindings.length > 1) {\n // Ambiguous wildcard expansion is easy to misuse across joins.\n throw new Error(\"SELECT * is only supported for single-table queries.\");\n }\n\n const parsedQuery: ParsedSelectQuery = {\n bindings,\n joins,\n joinEdges: uniqueJoinEdges(joinEdges),\n filters,\n selectAll,\n selectColumns,\n orderBy,\n };\n if (limit != null) {\n parsedQuery.limit = limit;\n }\n\n return parsedQuery;\n}\n\nfunction buildProjection(\n parsed: ParsedSelectQuery,\n schema: SchemaDefinition,\n): Map<string, Set<string>> {\n const projections = new Map<string, Set<string>>();\n for (const binding of parsed.bindings) {\n projections.set(binding.alias, new Set());\n }\n\n if (parsed.selectAll) {\n const base = parsed.bindings[0];\n if (!base) {\n throw new Error(\"SELECT queries must include a FROM clause.\");\n }\n\n const allColumns = Object.keys(getTable(schema, base.table).columns);\n for (const column of allColumns) {\n projections.get(base.alias)?.add(column);\n }\n } else {\n for (const item of parsed.selectColumns) {\n projections.get(item.alias)?.add(item.column);\n }\n }\n\n for (const join of parsed.joinEdges) {\n projections.get(join.leftAlias)?.add(join.leftColumn);\n projections.get(join.rightAlias)?.add(join.rightColumn);\n }\n\n for (const filter of parsed.filters) {\n projections.get(filter.alias)?.add(filter.clause.column);\n }\n\n for (const term of parsed.orderBy) {\n projections.get(term.alias)?.add(term.column);\n }\n\n for (const [alias, cols] of projections) {\n if (cols.size === 0) {\n const binding = parsed.bindings.find((candidate) => candidate.alias === alias);\n if (binding) {\n const firstColumn = Object.keys(getTable(schema, binding.table).columns)[0];\n if (!firstColumn) {\n throw new Error(`Table ${binding.table} has no columns.`);\n }\n cols.add(firstColumn);\n }\n }\n }\n\n return projections;\n}\n\nfunction groupFiltersByAlias(filters: LiteralFilter[]): Map<string, ScanFilterClause[]> {\n const grouped = new Map<string, ScanFilterClause[]>();\n for (const filter of filters) {\n const existing = grouped.get(filter.alias) ?? [];\n existing.push(filter.clause);\n grouped.set(filter.alias, existing);\n }\n return grouped;\n}\n\nfunction buildExecutionOrder(\n bindings: TableBinding[],\n joinEdges: JoinCondition[],\n filtersByAlias: Map<string, ScanFilterClause[]>,\n): string[] {\n const score = new Map<string, number>();\n for (const binding of bindings) {\n score.set(binding.alias, filtersByAlias.get(binding.alias)?.length ?? 0);\n }\n\n const unvisited = new Set(bindings.map((binding) => binding.alias));\n const visited = new Set<string>();\n const order: string[] = [];\n\n while (unvisited.size > 0) {\n const candidates = [...unvisited].filter((alias) => {\n if (visited.size === 0) {\n return true;\n }\n return joinEdges.some(\n (edge) =>\n (edge.leftAlias === alias && visited.has(edge.rightAlias)) ||\n (edge.rightAlias === alias && visited.has(edge.leftAlias)),\n );\n });\n\n const pool = candidates.length > 0 ? candidates : [...unvisited];\n pool.sort((a, b) => {\n const aScore = score.get(a) ?? 0;\n const bScore = score.get(b) ?? 0;\n if (aScore !== bScore) {\n return bScore - aScore;\n }\n\n const aIndex = bindings.find((binding) => binding.alias === a)?.index ?? 0;\n const bIndex = bindings.find((binding) => binding.alias === b)?.index ?? 0;\n return bIndex - aIndex;\n });\n\n const next = pool[0];\n if (!next) {\n break;\n }\n\n order.push(next);\n visited.add(next);\n unvisited.delete(next);\n }\n\n return order;\n}\n\nfunction buildDependencyFilters(\n alias: string,\n joinEdges: JoinCondition[],\n rowsByAlias: Map<string, QueryRow[]>,\n): ScanFilterClause[] {\n const clauses: ScanFilterClause[] = [];\n for (const edge of joinEdges) {\n if (edge.leftAlias === alias && rowsByAlias.has(edge.rightAlias)) {\n clauses.push({\n op: \"in\",\n column: edge.leftColumn,\n values: uniqueValues(rowsByAlias.get(edge.rightAlias) ?? [], edge.rightColumn),\n });\n continue;\n }\n\n if (edge.rightAlias === alias && rowsByAlias.has(edge.leftAlias)) {\n clauses.push({\n op: \"in\",\n column: edge.rightColumn,\n values: uniqueValues(rowsByAlias.get(edge.leftAlias) ?? [], edge.leftColumn),\n });\n }\n }\n\n return dedupeInClauses(clauses);\n}\n\nfunction initializeJoinedRows(\n rowsByAlias: Map<string, QueryRow[]>,\n baseAlias: string,\n): Array<Record<string, QueryRow>> {\n const baseRows = rowsByAlias.get(baseAlias) ?? [];\n return baseRows.map((row) => ({\n [baseAlias]: row,\n }));\n}\n\nfunction applyInnerJoin(\n existing: Array<Record<string, QueryRow>>,\n join: ParsedJoin,\n rowsByAlias: Map<string, QueryRow[]>,\n): Array<Record<string, QueryRow>> {\n const rightRows = rowsByAlias.get(join.alias) ?? [];\n const isJoinAliasLeft = join.condition.leftAlias === join.alias;\n const joinAliasColumn = isJoinAliasLeft ? join.condition.leftColumn : join.condition.rightColumn;\n const existingAlias = isJoinAliasLeft ? join.condition.rightAlias : join.condition.leftAlias;\n const existingColumn = isJoinAliasLeft ? join.condition.rightColumn : join.condition.leftColumn;\n\n const index = new Map<unknown, QueryRow[]>();\n for (const row of rightRows) {\n const key = row[joinAliasColumn];\n const bucket = index.get(key) ?? [];\n bucket.push(row);\n index.set(key, bucket);\n }\n\n const joined: Array<Record<string, QueryRow>> = [];\n for (const bundle of existing) {\n const leftRow = bundle[existingAlias];\n if (!leftRow) {\n continue;\n }\n\n const key = leftRow[existingColumn];\n const matches = index.get(key) ?? [];\n for (const match of matches) {\n joined.push({\n ...bundle,\n [join.alias]: match,\n });\n }\n }\n\n return joined;\n}\n\nfunction applyFinalSort(\n rows: Array<Record<string, QueryRow>>,\n orderBy: OrderColumn[],\n): Array<Record<string, QueryRow>> {\n const sorted = [...rows];\n sorted.sort((left, right) => {\n for (const term of orderBy) {\n const leftValue = left[term.alias]?.[term.column] as\n | string\n | number\n | boolean\n | null\n | undefined;\n const rightValue = right[term.alias]?.[term.column] as\n | string\n | number\n | boolean\n | null\n | undefined;\n if (leftValue === rightValue) {\n continue;\n }\n\n const leftNorm = leftValue ?? null;\n const rightNorm = rightValue ?? null;\n\n const comparison = compareNullableValues(leftNorm, rightNorm);\n return term.direction === \"asc\" ? comparison : -comparison;\n }\n\n return 0;\n });\n\n return sorted;\n}\n\nfunction projectResultRows(\n rows: Array<Record<string, QueryRow>>,\n parsed: ParsedSelectQuery,\n): QueryRow[] {\n if (parsed.selectAll) {\n const baseAlias = parsed.bindings[0]?.alias;\n if (!baseAlias) {\n return [];\n }\n\n return rows.map((row) => {\n const baseRow = row[baseAlias];\n return baseRow ? { ...baseRow } : {};\n });\n }\n\n return rows.map((bundle) => {\n const out: QueryRow = {};\n for (const item of parsed.selectColumns) {\n out[item.output] = bundle[item.alias]?.[item.column] ?? null;\n }\n return out;\n });\n}\n\nfunction parseJoinCondition(raw: unknown): JoinCondition {\n const expr = raw as {\n type?: unknown;\n operator?: unknown;\n left?: unknown;\n right?: unknown;\n };\n\n if (expr?.type !== \"binary_expr\" || expr.operator !== \"=\") {\n throw new Error(\"Only equality join conditions are currently supported.\");\n }\n\n const left = toColumnRef(expr.left);\n const right = toColumnRef(expr.right);\n if (!left || !right) {\n throw new Error(\"JOIN conditions must compare two columns.\");\n }\n\n return {\n leftAlias: left.alias,\n leftColumn: left.column,\n rightAlias: right.alias,\n rightColumn: right.column,\n };\n}\n\nfunction flattenAndConditions(where: unknown): unknown[] {\n if (!where) {\n return [];\n }\n\n const expr = where as {\n type?: unknown;\n operator?: unknown;\n left?: unknown;\n right?: unknown;\n };\n\n if (expr.type === \"binary_expr\" && expr.operator === \"AND\") {\n return [...flattenAndConditions(expr.left), ...flattenAndConditions(expr.right)];\n }\n\n if (expr.type === \"binary_expr\" && expr.operator === \"OR\") {\n throw new Error(\"OR predicates are not yet supported.\");\n }\n\n return [where];\n}\n\nfunction normalizeBinaryOperator(raw: unknown): Exclude<ScanFilterClause[\"op\"], never> {\n switch (raw) {\n case \"=\":\n return \"eq\";\n case \"!=\":\n case \"<>\":\n return \"neq\";\n case \">\":\n return \"gt\";\n case \">=\":\n return \"gte\";\n case \"<\":\n return \"lt\";\n case \"<=\":\n return \"lte\";\n case \"IN\":\n return \"in\";\n default:\n throw new Error(`Unsupported operator: ${String(raw)}`);\n }\n}\n\nfunction invertOperator(\n op: Exclude<ScanFilterClause[\"op\"], \"in\">,\n): Exclude<ScanFilterClause[\"op\"], \"in\"> {\n switch (op) {\n case \"eq\":\n return \"eq\";\n case \"neq\":\n return \"neq\";\n case \"gt\":\n return \"lt\";\n case \"gte\":\n return \"lte\";\n case \"lt\":\n return \"gt\";\n case \"lte\":\n return \"gte\";\n }\n}\n\nfunction toColumnRef(raw: unknown): { alias: string; column: string } | undefined {\n const expr = raw as { type?: unknown; table?: unknown; column?: unknown };\n if (expr?.type !== \"column_ref\") {\n return undefined;\n }\n\n if (typeof expr.column !== \"string\" || expr.column.length === 0) {\n return undefined;\n }\n\n if (typeof expr.table !== \"string\" || expr.table.length === 0) {\n throw new Error(`Ambiguous unqualified column reference: ${expr.column}`);\n }\n\n return {\n alias: expr.table,\n column: expr.column,\n };\n}\n\nfunction isStarColumn(raw: { expr?: unknown }): boolean {\n const expr = raw.expr as { type?: unknown; column?: unknown } | undefined;\n return expr?.type === \"column_ref\" && expr.column === \"*\";\n}\n\nfunction parseLiteral(raw: unknown): unknown | undefined {\n const expr = raw as { type?: unknown; value?: unknown };\n\n switch (expr?.type) {\n case \"single_quote_string\":\n case \"double_quote_string\":\n case \"string\":\n return String(expr.value ?? \"\");\n case \"number\": {\n const value = expr.value;\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n case \"bool\":\n return Boolean(expr.value);\n case \"null\":\n return null;\n default:\n return undefined;\n }\n}\n\nfunction parseExpressionList(raw: unknown): unknown[] {\n const expr = raw as { type?: unknown; value?: unknown };\n if (expr?.type !== \"expr_list\" || !Array.isArray(expr.value)) {\n throw new Error(\"IN predicates must use literal lists.\");\n }\n\n const values = expr.value.map((entry) => parseLiteral(entry));\n if (values.some((value) => value === undefined)) {\n throw new Error(\"IN predicates must contain only literal values.\");\n }\n\n return values;\n}\n\nfunction uniqueJoinEdges(edges: JoinCondition[]): JoinCondition[] {\n const seen = new Set<string>();\n const out: JoinCondition[] = [];\n\n for (const edge of edges) {\n const key = `${edge.leftAlias}.${edge.leftColumn}=${edge.rightAlias}.${edge.rightColumn}`;\n const reverseKey = `${edge.rightAlias}.${edge.rightColumn}=${edge.leftAlias}.${edge.leftColumn}`;\n if (seen.has(key) || seen.has(reverseKey)) {\n continue;\n }\n seen.add(key);\n out.push(edge);\n }\n\n return out;\n}\n\nfunction uniqueValues(rows: QueryRow[], column: string): unknown[] {\n const seen = new Set<unknown>();\n const out: unknown[] = [];\n for (const row of rows) {\n const value = row[column] ?? null;\n if (seen.has(value)) {\n continue;\n }\n\n seen.add(value);\n out.push(value);\n }\n return out;\n}\n\nfunction compareNullableValues(left: unknown, right: unknown): number {\n if (left === right) {\n return 0;\n }\n if (left == null) {\n return -1;\n }\n if (right == null) {\n return 1;\n }\n\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left < right ? -1 : 1;\n }\n\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) < Number(right) ? -1 : 1;\n }\n\n const leftString = String(left);\n const rightString = String(right);\n return leftString < rightString ? -1 : 1;\n}\n\nfunction dedupeInClauses(clauses: ScanFilterClause[]): ScanFilterClause[] {\n const out: ScanFilterClause[] = [];\n const seen = new Set<string>();\n\n for (const clause of clauses) {\n if (clause.op !== \"in\") {\n out.push(clause);\n continue;\n }\n\n const key = `${clause.column}:${JSON.stringify(clause.values)}`;\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n out.push(clause);\n }\n\n return out;\n}\n"],"mappings":"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"}
@@ -0,0 +1,304 @@
1
+ declare namespace planning_d_exports {
2
+ export { AggregateExpression, AggregateItem, AggregateRequest, AggregateStep, AndPredicate, ColumnRef, ColumnValue, ComparisonOperator, ComparisonPredicate, CteBinding, CteStep, ExplainDecision, ExplainResult, Expression, FilterStep, FromSource, InPredicate, JoinSpec, JoinStep, LiteralValue, MutationIR, NotPredicate, NullPredicate, OrPredicate, OrderByTerm, PlanStep, PlanStepBase, Predicate, ProjectStep, QueryCapabilities, QueryIR, QueryPlan, ResolverContext, ResolverRegistry, Row, RowSet, ScalarValue, ScanRequest, ScanStep, SelectItem, TableResolver, defineTableResolver };
3
+ }
4
+ type ScalarValue = string | number | boolean | null;
5
+ type ComparisonOperator = "=" | "!=" | ">" | ">=" | "<" | "<=";
6
+ interface ColumnRef {
7
+ table: string;
8
+ column: string;
9
+ }
10
+ interface LiteralValue {
11
+ kind: "literal";
12
+ value: ScalarValue;
13
+ }
14
+ interface ColumnValue {
15
+ kind: "column";
16
+ ref: ColumnRef;
17
+ }
18
+ type Expression = ColumnValue | LiteralValue;
19
+ interface ComparisonPredicate {
20
+ kind: "comparison";
21
+ operator: ComparisonOperator;
22
+ left: Expression;
23
+ right: Expression;
24
+ }
25
+ interface InPredicate {
26
+ kind: "in";
27
+ left: Expression;
28
+ values: ScalarValue[];
29
+ }
30
+ interface NullPredicate {
31
+ kind: "null_check";
32
+ expression: Expression;
33
+ negated: boolean;
34
+ }
35
+ interface AndPredicate {
36
+ kind: "and";
37
+ predicates: Predicate[];
38
+ }
39
+ interface OrPredicate {
40
+ kind: "or";
41
+ predicates: Predicate[];
42
+ }
43
+ interface NotPredicate {
44
+ kind: "not";
45
+ predicate: Predicate;
46
+ }
47
+ type Predicate = ComparisonPredicate | InPredicate | NullPredicate | AndPredicate | OrPredicate | NotPredicate;
48
+ interface SelectItem {
49
+ expression: Expression;
50
+ alias?: string;
51
+ }
52
+ interface OrderByTerm {
53
+ expression: Expression;
54
+ direction: "asc" | "desc";
55
+ }
56
+ interface JoinSpec {
57
+ type: "inner" | "left";
58
+ sourceTable: string;
59
+ sourceAlias?: string;
60
+ on: Predicate;
61
+ }
62
+ interface AggregateExpression {
63
+ function: "count" | "sum" | "avg" | "min" | "max";
64
+ argument?: Expression;
65
+ distinct?: boolean;
66
+ }
67
+ interface AggregateItem {
68
+ alias: string;
69
+ expression: AggregateExpression;
70
+ }
71
+ interface CteBinding {
72
+ name: string;
73
+ query: QueryIR;
74
+ recursive?: boolean;
75
+ }
76
+ interface FromSource {
77
+ table: string;
78
+ alias?: string;
79
+ }
80
+ interface QueryIR {
81
+ ctes?: CteBinding[];
82
+ from: FromSource;
83
+ joins?: JoinSpec[];
84
+ select: SelectItem[];
85
+ where?: Predicate;
86
+ groupBy?: Expression[];
87
+ aggregates?: AggregateItem[];
88
+ orderBy?: OrderByTerm[];
89
+ limit?: number;
90
+ offset?: number;
91
+ }
92
+ interface MutationIR {
93
+ type: "insert" | "update" | "delete";
94
+ table: string;
95
+ }
96
+ interface QueryCapabilities {
97
+ filterOperators: ComparisonOperator[];
98
+ filterableColumns: string[];
99
+ sortableColumns: string[];
100
+ maxLimit: number;
101
+ requiresLimit: boolean;
102
+ supportsOr: boolean;
103
+ supportsNot: boolean;
104
+ supportsAggregates: boolean;
105
+ supportsCtes: boolean;
106
+ supportsRecursiveCtes: boolean;
107
+ }
108
+ interface ScanRequest {
109
+ table: string;
110
+ alias?: string;
111
+ projection: ColumnRef[];
112
+ predicate?: Predicate;
113
+ orderBy?: OrderByTerm[];
114
+ limit?: number;
115
+ offset?: number;
116
+ }
117
+ interface AggregateRequest {
118
+ table: string;
119
+ alias?: string;
120
+ predicate?: Predicate;
121
+ groupBy: Expression[];
122
+ aggregates: AggregateItem[];
123
+ orderBy?: OrderByTerm[];
124
+ limit?: number;
125
+ }
126
+ type Row = Record<string, unknown>;
127
+ interface RowSet {
128
+ rows: Row[];
129
+ }
130
+ interface ResolverContext {
131
+ requestId: string;
132
+ actorId?: string;
133
+ }
134
+ interface TableResolver<TContext extends ResolverContext = ResolverContext> {
135
+ table: string;
136
+ capabilities: QueryCapabilities;
137
+ scan: (request: ScanRequest, context: TContext) => Promise<RowSet>;
138
+ aggregate?: (request: AggregateRequest, context: TContext) => Promise<RowSet>;
139
+ }
140
+ interface ResolverRegistry<TContext extends ResolverContext = ResolverContext> {
141
+ getResolver: (table: string) => TableResolver<TContext> | undefined;
142
+ }
143
+ interface PlanStepBase {
144
+ id: string;
145
+ dependsOn: string[];
146
+ }
147
+ interface ScanStep extends PlanStepBase {
148
+ kind: "scan";
149
+ table: string;
150
+ resolver: string;
151
+ request: ScanRequest;
152
+ pushdown: {
153
+ predicate: boolean;
154
+ projection: boolean;
155
+ orderBy: boolean;
156
+ limit: boolean;
157
+ };
158
+ }
159
+ interface FilterStep extends PlanStepBase {
160
+ kind: "filter";
161
+ predicate: Predicate;
162
+ }
163
+ interface JoinStep extends PlanStepBase {
164
+ kind: "join";
165
+ join: JoinSpec;
166
+ }
167
+ interface AggregateStep extends PlanStepBase {
168
+ kind: "aggregate";
169
+ request: AggregateRequest;
170
+ }
171
+ interface ProjectStep extends PlanStepBase {
172
+ kind: "project";
173
+ select: SelectItem[];
174
+ }
175
+ interface CteStep extends PlanStepBase {
176
+ kind: "cte";
177
+ binding: CteBinding;
178
+ strategy: "inline" | "materialize";
179
+ }
180
+ type PlanStep = ScanStep | FilterStep | JoinStep | AggregateStep | ProjectStep | CteStep;
181
+ interface QueryPlan {
182
+ rootStepId: string;
183
+ steps: PlanStep[];
184
+ }
185
+ interface ExplainDecision {
186
+ stepId: string;
187
+ decision: string;
188
+ }
189
+ interface ExplainResult {
190
+ query: QueryIR;
191
+ plan: QueryPlan;
192
+ decisions: ExplainDecision[];
193
+ }
194
+ declare function defineTableResolver<TContext extends ResolverContext = ResolverContext>(resolver: TableResolver<TContext>): TableResolver<TContext>;
195
+ //#endregion
196
+ //#region ../core/src/index.d.ts
197
+ type SqlScalarType = "text" | "integer" | "boolean" | "timestamp";
198
+ type TableColumns = Record<string, SqlScalarType>;
199
+ interface SchemaQueryDefaults {
200
+ filterable: "all" | string[];
201
+ sortable: "all" | string[];
202
+ maxRows: number | null;
203
+ }
204
+ interface TableQueryOverrides {
205
+ filterable?: "all" | string[];
206
+ sortable?: "all" | string[];
207
+ maxRows?: number | null;
208
+ }
209
+ interface TableDefinition {
210
+ columns: TableColumns;
211
+ query?: TableQueryOverrides;
212
+ }
213
+ interface SchemaDefinition {
214
+ defaults?: {
215
+ query?: Partial<SchemaQueryDefaults>;
216
+ };
217
+ tables: Record<string, TableDefinition>;
218
+ }
219
+ declare const DEFAULT_QUERY_BEHAVIOR: SchemaQueryDefaults;
220
+ declare function defineSchema<TSchema extends SchemaDefinition>(schema: TSchema): TSchema;
221
+ declare function getTable(schema: SchemaDefinition, tableName: string): TableDefinition;
222
+ declare function resolveTableQueryBehavior(schema: SchemaDefinition, tableName: string): SchemaQueryDefaults;
223
+ type ScanFilterOperator = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in";
224
+ interface FilterClauseBase {
225
+ column: string;
226
+ op: ScanFilterOperator;
227
+ }
228
+ interface ScalarFilterClause extends FilterClauseBase {
229
+ op: "eq" | "neq" | "gt" | "gte" | "lt" | "lte";
230
+ value: unknown;
231
+ }
232
+ interface SetFilterClause extends FilterClauseBase {
233
+ op: "in";
234
+ values: unknown[];
235
+ }
236
+ type ScanFilterClause = ScalarFilterClause | SetFilterClause;
237
+ interface ScanOrderBy {
238
+ column: string;
239
+ direction: "asc" | "desc";
240
+ }
241
+ interface TableScanRequest {
242
+ table: string;
243
+ alias?: string;
244
+ select: string[];
245
+ where?: ScanFilterClause[];
246
+ orderBy?: ScanOrderBy[];
247
+ limit?: number;
248
+ offset?: number;
249
+ }
250
+ interface TableLookupRequest {
251
+ table: string;
252
+ alias?: string;
253
+ key: string;
254
+ values: unknown[];
255
+ select: string[];
256
+ where?: ScanFilterClause[];
257
+ }
258
+ type AggregateFunction = "count" | "sum" | "avg" | "min" | "max";
259
+ interface TableAggregateMetric {
260
+ fn: AggregateFunction;
261
+ column?: string;
262
+ as: string;
263
+ distinct?: boolean;
264
+ }
265
+ interface TableAggregateRequest {
266
+ table: string;
267
+ alias?: string;
268
+ where?: ScanFilterClause[];
269
+ groupBy?: string[];
270
+ metrics: TableAggregateMetric[];
271
+ limit?: number;
272
+ }
273
+ type QueryRow = Record<string, unknown>;
274
+ interface TableMethods<TContext = unknown> {
275
+ scan: (request: TableScanRequest, context: TContext) => Promise<QueryRow[]>;
276
+ lookup?: (request: TableLookupRequest, context: TContext) => Promise<QueryRow[]>;
277
+ aggregate?: (request: TableAggregateRequest, context: TContext) => Promise<QueryRow[]>;
278
+ }
279
+ type TableMethodsMap<TContext = unknown> = Record<string, TableMethods<TContext>>;
280
+ declare function defineTableMethods<TContext, TMethods extends TableMethodsMap<TContext>>(methods: TMethods): TMethods;
281
+ interface SqlDdlOptions {
282
+ ifNotExists?: boolean;
283
+ }
284
+ declare function toSqlDDL(schema: SchemaDefinition, options?: SqlDdlOptions): string;
285
+ //#endregion
286
+ //#region ../sql/src/index.d.ts
287
+ interface SqlQuery {
288
+ text: string;
289
+ }
290
+ interface PlannedQuery {
291
+ source: string;
292
+ selectAll: boolean;
293
+ }
294
+ interface QueryInput<TContext> {
295
+ schema: SchemaDefinition;
296
+ methods: TableMethodsMap<TContext>;
297
+ context: TContext;
298
+ sql: string;
299
+ }
300
+ declare function parseSql(query: SqlQuery, schema: SchemaDefinition): PlannedQuery;
301
+ declare function query<TContext>(input: QueryInput<TContext>): Promise<QueryRow[]>;
302
+ //#endregion
303
+ export { AggregateFunction, DEFAULT_QUERY_BEHAVIOR, FilterClauseBase, PlannedQuery, QueryInput, QueryRow, ScalarFilterClause, ScanFilterClause, ScanFilterOperator, ScanOrderBy, SchemaDefinition, SchemaQueryDefaults, SetFilterClause, SqlDdlOptions, SqlQuery, SqlScalarType, TableAggregateMetric, TableAggregateRequest, TableColumns, TableDefinition, TableLookupRequest, TableMethods, TableMethodsMap, TableQueryOverrides, TableScanRequest, defineSchema, defineTableMethods, getTable, parseSql, planning_d_exports as planning, query, resolveTableQueryBehavior, toSqlDDL };
304
+ //# sourceMappingURL=index.d.cts.map