arrowbase 0.1.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/CHANGELOG.md +27 -0
- package/COMPATIBILITY.md +398 -0
- package/LICENSE +21 -0
- package/MIGRATING.md +238 -0
- package/README.md +897 -0
- package/RELEASE_NOTES.md +68 -0
- package/dist/arrow.d.ts +93 -0
- package/dist/arrow.js +5366 -0
- package/dist/arrow.js.map +1 -0
- package/dist/broadcast.d.ts +173 -0
- package/dist/broadcast.js +319 -0
- package/dist/broadcast.js.map +1 -0
- package/dist/collection-DGlKgOGi.d.ts +1932 -0
- package/dist/idb.d.ts +146 -0
- package/dist/idb.js +6193 -0
- package/dist/idb.js.map +1 -0
- package/dist/index.d.ts +1802 -0
- package/dist/index.js +13924 -0
- package/dist/index.js.map +1 -0
- package/dist/query-CzV9E57Y.d.ts +279 -0
- package/dist/react.d.ts +51 -0
- package/dist/react.js +1633 -0
- package/dist/react.js.map +1 -0
- package/dist/tanstack.d.ts +51 -0
- package/dist/tanstack.js +191 -0
- package/dist/tanstack.js.map +1 -0
- package/dist/types-CSoU6uED.d.ts +50 -0
- package/package.json +139 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/query/trackRow.ts","../src/query/filter.ts","../src/schema/types.ts","../src/query/kernel.ts","../src/query/fnCompile.ts","../src/query/query.ts","../src/react.ts"],"names":["arr","out"],"mappings":"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","file":"react.js","sourcesContent":["/** Error types thrown by ArrowBase and TanStack-compatible surfaces. */\nexport class ArrowBaseError extends Error {\n constructor(message: string, public readonly code: string) {\n super(message);\n this.name = 'ArrowBaseError';\n }\n}\n\nexport class TanStackDBError extends ArrowBaseError {\n constructor(message: string, code = 'E_TANSTACK_DB') {\n super(message, code);\n this.name = 'TanStackDBError';\n }\n}\n\nexport class NonRetriableError extends TanStackDBError {\n constructor(message: string) {\n super(message);\n this.name = 'NonRetriableError';\n }\n}\n\ninterface SchemaIssue {\n message: string;\n path: unknown;\n}\n\nexport class SchemaValidationError extends TanStackDBError {\n readonly type: 'insert' | 'update';\n readonly issues: Array<SchemaIssue>;\n\n constructor(type: 'insert' | 'update', issues: Array<SchemaIssue>, message?: string) {\n const defaultMessage = `${type === 'insert' ? 'Insert' : 'Update'} validation failed: ${issues\n .map((issue) => `\\n- ${issue.message} - path: ${issue.path}`)\n .join('')}`;\n super(message || defaultMessage);\n this.name = 'SchemaValidationError';\n this.type = type;\n this.issues = issues;\n }\n}\n\nexport class DuplicateDbInstanceError extends TanStackDBError {\n constructor() {\n super(`Multiple instances of @tanstack/db detected!\n\nThis causes transaction context to be lost because each instance maintains its own transaction stack.\n\nCommon causes:\n1. Different versions of @tanstack/db installed\n2. Incompatible peer dependency versions in packages\n3. Module resolution issues in bundler configuration\n\nTo fix:\n1. Check installed versions: npm list @tanstack/db (or pnpm/yarn list)\n2. Force a single version using package manager overrides:\n - npm: \"overrides\" in package.json\n - pnpm: \"pnpm.overrides\" in package.json\n - yarn: \"resolutions\" in package.json\n3. Clear node_modules and lockfile, then reinstall\n\nTo temporarily disable this check (not recommended):\nSet environment variable: TANSTACK_DB_DISABLE_DUP_CHECK=1\n\nSee: https://tanstack.com/db/latest/docs/troubleshooting#duplicate-instances`);\n this.name = 'DuplicateDbInstanceError';\n }\n}\n\nexport class SchemaError extends ArrowBaseError {\n constructor(message: string) {\n super(message, 'E_SCHEMA');\n this.name = 'SchemaError';\n }\n}\n\nexport class AllocatorError extends ArrowBaseError {\n constructor(message: string) {\n super(message, 'E_ALLOC');\n this.name = 'AllocatorError';\n }\n}\n\nexport class OutOfSpaceError extends AllocatorError {\n constructor(message = 'segment out of space') {\n super(message);\n this.name = 'OutOfSpaceError';\n }\n}\n\nexport class NotFoundError extends ArrowBaseError {\n constructor(message: string) {\n super(message, 'E_NOT_FOUND');\n this.name = 'NotFoundError';\n }\n}\n\nexport class UndoError extends ArrowBaseError {\n constructor(message: string) {\n super(message, 'E_UNDO');\n this.name = 'UndoError';\n }\n}\n\nexport class ValidationError extends ArrowBaseError {\n constructor(message: string) {\n super(message, 'E_VALIDATION');\n this.name = 'ValidationError';\n }\n}\n\nexport class PersistenceError extends ArrowBaseError {\n constructor(message: string) {\n super(message, 'E_PERSIST');\n this.name = 'PersistenceError';\n }\n}\n\nexport class CollectionConfigurationError extends TanStackDBError {\n constructor(message: string) {\n super(message, 'E_COLLECTION_CONFIG');\n this.name = 'CollectionConfigurationError';\n }\n}\nexport class CollectionRequiresConfigError extends CollectionConfigurationError { constructor() { super('Collection requires a config'); } }\nexport class CollectionRequiresSyncConfigError extends CollectionConfigurationError { constructor() { super('Collection requires a sync config'); } }\nexport class InvalidSchemaError extends CollectionConfigurationError { constructor() { super('Schema must implement the standard-schema interface'); } }\nexport class SchemaMustBeSynchronousError extends CollectionConfigurationError { constructor() { super('Schema validation must be synchronous'); } }\n\nexport class CollectionStateError extends TanStackDBError {\n constructor(message: string) {\n super(message, 'E_COLLECTION_STATE');\n this.name = 'CollectionStateError';\n }\n}\nexport class CollectionInErrorStateError extends CollectionStateError {\n constructor(operation: string, collectionId: string) {\n super(`Cannot perform ${operation} on collection \"${collectionId}\" - collection is in error state. Try calling cleanup() and restarting the collection.`);\n }\n}\nexport class InvalidCollectionStatusTransitionError extends CollectionStateError {\n constructor(from: string, to: string, collectionId: string) {\n super(`Invalid collection status transition from \"${from}\" to \"${to}\" for collection \"${collectionId}\"`);\n }\n}\nexport class CollectionIsInErrorStateError extends CollectionStateError { constructor() { super('Collection is in error state'); } }\nexport class NegativeActiveSubscribersError extends CollectionStateError { constructor() { super('Active subscribers count is negative - this should never happen'); } }\n\nexport class CollectionOperationError extends TanStackDBError {\n constructor(message: string) {\n super(message, 'E_COLLECTION_OPERATION');\n this.name = 'CollectionOperationError';\n }\n}\nexport class UndefinedKeyError extends CollectionOperationError { constructor(item: unknown) { super(`An object was created without a defined key: ${JSON.stringify(item)}`); } }\nexport class InvalidKeyError extends CollectionOperationError {\n constructor(key: unknown, item: unknown) {\n const keyType = key === null ? 'null' : typeof key;\n super(`getKey returned an invalid key type. Expected string or number, but got ${keyType}: ${JSON.stringify(key)}. Item: ${JSON.stringify(item)}`);\n }\n}\nexport class DuplicateKeyError extends CollectionOperationError { constructor(key: string | number) { super(`Cannot insert document with ID \"${key}\" because it already exists in the collection`); } }\nexport class DuplicateKeySyncError extends CollectionOperationError {\n constructor(key: string | number, collectionId: string, options?: { hasCustomGetKey?: boolean; hasDistinct?: boolean; hasJoins?: boolean }) {\n const baseMessage = `Cannot insert document with key \"${key}\" from sync because it already exists in the collection \"${collectionId}\"`;\n if (options?.hasCustomGetKey && options.hasDistinct) {\n super(`${baseMessage}. This collection uses a custom getKey with .distinct(). The .distinct() operator deduplicates by the ENTIRE selected object (standard SQL behavior), but your custom getKey extracts only a subset of fields. This causes multiple distinct rows (with different values in non-key fields) to receive the same key. To fix this, either: (1) ensure your SELECT only includes fields that uniquely identify each row, (2) use .groupBy() with min()/max() aggregates to select one value per group, or (3) remove the custom getKey to use the default key behavior.`);\n } else if (options?.hasCustomGetKey && options.hasJoins) {\n super(`${baseMessage}. This collection uses a custom getKey with joined queries. Joined queries can produce multiple rows with the same key when relationships are not 1:1. Consider: (1) using a composite key in your getKey function (e.g., \\`\\${item.key1}-\\${item.key2}\\`), (2) ensuring your join produces unique rows per key, or (3) removing the custom getKey to use the default composite key behavior.`);\n } else {\n super(baseMessage);\n }\n }\n}\nexport class MissingUpdateArgumentError extends CollectionOperationError { constructor() { super('The first argument to update is missing'); } }\nexport class NoKeysPassedToUpdateError extends CollectionOperationError { constructor() { super('No keys were passed to update'); } }\nexport class UpdateKeyNotFoundError extends CollectionOperationError { constructor(key: string | number) { super(`The key \"${key}\" was passed to update but an object for this key was not found in the collection`); } }\nexport class KeyUpdateNotAllowedError extends CollectionOperationError { constructor(originalKey: string | number, newKey: string | number) { super(`Updating the key of an item is not allowed. Original key: \"${originalKey}\", Attempted new key: \"${newKey}\". Please delete the old item and create a new one if a key change is necessary.`); } }\nexport class NoKeysPassedToDeleteError extends CollectionOperationError { constructor() { super('No keys were passed to delete'); } }\nexport class DeleteKeyNotFoundError extends CollectionOperationError { constructor(key: string | number) { super(`Collection.delete was called with key '${key}' but there is no item in the collection with this key`); } }\n\nexport class MissingHandlerError extends TanStackDBError { constructor(message: string) { super(message, 'E_MISSING_HANDLER'); this.name = 'MissingHandlerError'; } }\nexport class MissingInsertHandlerError extends MissingHandlerError { constructor() { super(\"Collection.insert called directly (not within an explicit transaction) but no 'onInsert' handler is configured.\"); } }\nexport class MissingUpdateHandlerError extends MissingHandlerError { constructor() { super(\"Collection.update called directly (not within an explicit transaction) but no 'onUpdate' handler is configured.\"); } }\nexport class MissingDeleteHandlerError extends MissingHandlerError { constructor() { super(\"Collection.delete called directly (not within an explicit transaction) but no 'onDelete' handler is configured.\"); } }\n\nexport class TransactionError extends TanStackDBError { constructor(message: string) { super(message, 'E_TRANSACTION'); this.name = 'TransactionError'; } }\nexport class MissingMutationFunctionError extends TransactionError { constructor() { super('mutationFn is required when creating a transaction'); } }\nexport class OnMutateMustBeSynchronousError extends TransactionError { constructor() { super('onMutate must be synchronous and cannot return a promise. Remove async/await or returned promises from onMutate.'); } }\nexport class TransactionNotPendingMutateError extends TransactionError { constructor() { super('You can no longer call .mutate() as the transaction is no longer pending'); } }\nexport class TransactionAlreadyCompletedRollbackError extends TransactionError { constructor() { super('You can no longer call .rollback() as the transaction is already completed'); } }\nexport class TransactionNotPendingCommitError extends TransactionError { constructor() { super('You can no longer call .commit() as the transaction is no longer pending'); } }\nexport class NoPendingSyncTransactionWriteError extends TransactionError { constructor() { super('No pending sync transaction to write to'); } }\nexport class SyncTransactionAlreadyCommittedWriteError extends TransactionError { constructor() { super(\"The pending sync transaction is already committed, you can't still write to it.\"); } }\nexport class NoPendingSyncTransactionCommitError extends TransactionError { constructor() { super('No pending sync transaction to commit'); } }\nexport class SyncTransactionAlreadyCommittedError extends TransactionError { constructor() { super(\"The pending sync transaction is already committed, you can't commit it again.\"); } }\n\nexport class QueryBuilderError extends TanStackDBError { constructor(message: string) { super(message, 'E_QUERY_BUILDER'); this.name = 'QueryBuilderError'; } }\nexport class OnlyOneSourceAllowedError extends QueryBuilderError { constructor(context: string) { super(`Only one source is allowed in the ${context}`); } }\nexport class SubQueryMustHaveFromClauseError extends QueryBuilderError { constructor(context: string) { super(`A sub query passed to a ${context} must have a from clause itself`); } }\nexport class InvalidSourceError extends QueryBuilderError { constructor(alias: string) { super(`Invalid source for live query: The value provided for alias \"${alias}\" is not a Collection or subquery. Live queries only accept Collection instances or subqueries. Please ensure you're passing a valid Collection or QueryBuilder, not a plain array or other data type.`); } }\nexport class InvalidSourceTypeError extends QueryBuilderError { constructor(context: string, type: string) { super(`Invalid source for ${context}: Expected an object with a single key-value pair like { alias: collection }. For example: .from({ todos: todosCollection }). Got: ${type}`); } }\nexport class JoinConditionMustBeEqualityError extends QueryBuilderError { constructor() { super('Join condition must be an equality expression'); } }\nexport class QueryMustHaveFromClauseError extends QueryBuilderError { constructor() { super('Query must have a from clause'); } }\nexport class InvalidWhereExpressionError extends QueryBuilderError {\n constructor(valueType: string) {\n super(`Invalid where() expression: Expected a query expression, but received a ${valueType}. This usually happens when using JavaScript's comparison operators (===, !==, <, >, etc.) directly. Instead, use the query builder functions:\\n\\n ❌ .where(({ user }) => user.id === 'abc')\\n ✅ .where(({ user }) => eq(user.id, 'abc'))\\n\\nAvailable comparison functions: eq, gt, gte, lt, lte, and, or, not, like, ilike, isNull, isUndefined`);\n }\n}\n\nexport class QueryCompilationError extends TanStackDBError { constructor(message: string) { super(message, 'E_QUERY_COMPILATION'); this.name = 'QueryCompilationError'; } }\nexport class UnsafeAliasPathError extends QueryCompilationError {\n constructor(segment: string) {\n super(\n `Unsafe alias path segment \"${segment}\" is not allowed in .select(). ` +\n `Aliases must not contain \"__proto__\", \"prototype\", or \"constructor\".`,\n );\n this.name = 'UnsafeAliasPathError';\n }\n}\nexport class DistinctRequiresSelectError extends QueryCompilationError { constructor() { super('DISTINCT requires a SELECT clause.'); } }\nexport class FnSelectWithGroupByError extends QueryCompilationError { constructor() { super('fn.select() cannot be used with groupBy(). groupBy requires the compiler to statically analyze aggregate functions (count, sum, max, etc.) in the SELECT clause, which is not possible with fn.select() since it is an opaque function. Use .select() instead of .fn.select() when combining with groupBy().'); } }\nexport class UnsupportedRootScalarSelectError extends QueryCompilationError { constructor() { super('Top-level scalar select() is not supported by createLiveQueryCollection() or queryOnce(). Return an object from .select(), or use the scalar query inside toArray(...) or concat(toArray(...)).'); } }\nexport class HavingRequiresGroupByError extends QueryCompilationError { constructor() { super('HAVING clause requires GROUP BY clause'); } }\nexport class LimitOffsetRequireOrderByError extends QueryCompilationError { constructor() { super('LIMIT and OFFSET require an ORDER BY clause to ensure deterministic results'); } }\nexport class CollectionInputNotFoundError extends QueryCompilationError { constructor(alias: string, collectionId?: string, availableKeys?: Array<string>) { const details = collectionId ? `alias \"${alias}\" (collection \"${collectionId}\")` : `collection \"${alias}\"`; const availableKeysMsg = availableKeys?.length ? `. Available keys: ${availableKeys.join(', ')}` : ''; super(`Input for ${details} not found in inputs map${availableKeysMsg}`); } }\nexport class DuplicateAliasInSubqueryError extends QueryCompilationError { constructor(alias: string, parentAliases: Array<string>) { super(`Subquery uses alias \"${alias}\" which is already used in the parent query. Each alias must be unique across parent and subquery contexts. Parent query aliases: ${parentAliases.join(', ')}. Please rename \"${alias}\" in either the parent query or subquery to avoid conflicts.`); } }\nexport class UnsupportedFromTypeError extends QueryCompilationError { constructor(type: string) { super(`Unsupported FROM type: ${type}`); } }\nexport class UnknownExpressionTypeError extends QueryCompilationError { constructor(type: string) { super(`Unknown expression type: ${type}`); } }\nexport class EmptyReferencePathError extends QueryCompilationError { constructor() { super('Reference path cannot be empty'); } }\nexport class UnknownFunctionError extends QueryCompilationError { constructor(functionName: string) { super(`Unknown function: ${functionName}`); } }\nexport class JoinCollectionNotFoundError extends QueryCompilationError { constructor(collectionId: string) { super(`Collection \"${collectionId}\" not found during compilation of join`); } }\n\nexport class JoinError extends TanStackDBError { constructor(message: string) { super(message, 'E_JOIN'); this.name = 'JoinError'; } }\nexport class UnsupportedJoinTypeError extends JoinError { constructor(joinType: string) { super(`Unsupported join type: ${joinType}`); } }\nexport class InvalidJoinConditionSameSourceError extends JoinError { constructor(sourceAlias: string) { super(`Invalid join condition: both expressions refer to the same source \"${sourceAlias}\"`); } }\nexport class InvalidJoinConditionSourceMismatchError extends JoinError { constructor() { super('Invalid join condition: expressions must reference source aliases'); } }\nexport class InvalidJoinConditionLeftSourceError extends JoinError { constructor(sourceAlias: string) { super(`Invalid join condition: left expression refers to an unavailable source \"${sourceAlias}\"`); } }\nexport class InvalidJoinConditionRightSourceError extends JoinError { constructor(sourceAlias: string) { super(`Invalid join condition: right expression does not refer to the joined source \"${sourceAlias}\"`); } }\nexport class InvalidJoinCondition extends JoinError { constructor() { super('Invalid join condition'); } }\nexport class UnsupportedJoinSourceTypeError extends JoinError { constructor(type: string) { super(`Unsupported join source type: ${type}`); } }\n\nexport class GroupByError extends TanStackDBError { constructor(message: string) { super(message, 'E_GROUP_BY'); this.name = 'GroupByError'; } }\nexport class NonAggregateExpressionNotInGroupByError extends GroupByError { constructor(alias: string) { super(`Non-aggregate expression '${alias}' in SELECT must also appear in GROUP BY clause`); } }\nexport class UnsupportedAggregateFunctionError extends GroupByError { constructor(functionName: string) { super(`Unsupported aggregate function: ${functionName}`); } }\nexport class AggregateFunctionNotInSelectError extends GroupByError { constructor(functionName: string) { super(`Aggregate function in HAVING clause must also be in SELECT clause: ${functionName}`); } }\nexport class UnknownHavingExpressionTypeError extends GroupByError { constructor(type: string) { super(`Unknown expression type in HAVING clause: ${type}`); } }\n\nexport class StorageError extends TanStackDBError { constructor(message: string) { super(message, 'E_STORAGE'); this.name = 'StorageError'; } }\nexport class SerializationError extends StorageError { constructor(operation: string, originalError: unknown) { super(`Cannot ${operation} item because it cannot be JSON serialized: ${originalError}`); } }\nexport class LocalStorageCollectionError extends StorageError { constructor(message: string) { super(message); this.name = 'LocalStorageCollectionError'; } }\nexport class StorageKeyRequiredError extends LocalStorageCollectionError { constructor() { super('[LocalStorageCollection] storageKey must be provided.'); } }\nexport class InvalidStorageDataFormatError extends LocalStorageCollectionError { constructor(storageKey: string, key: string) { super(`[LocalStorageCollection] Invalid data format in storage key \"${storageKey}\" for key \"${key}\".`); } }\nexport class InvalidStorageObjectFormatError extends LocalStorageCollectionError { constructor(storageKey: string) { super(`[LocalStorageCollection] Invalid data format in storage key \"${storageKey}\". Expected object format.`); } }\n\nexport class SyncCleanupError extends TanStackDBError { constructor(collectionId: string, error: unknown) { const message = error instanceof Error ? error.message : String(error); super(`Collection \"${collectionId}\" sync cleanup function threw an error: ${message}`); this.name = 'SyncCleanupError'; } }\nexport class QueryOptimizerError extends TanStackDBError { constructor(message: string) { super(message, 'E_QUERY_OPTIMIZER'); this.name = 'QueryOptimizerError'; } }\nexport class CannotCombineEmptyExpressionListError extends QueryOptimizerError { constructor() { super('Cannot combine empty expression list'); } }\nexport class WhereClauseConversionError extends QueryOptimizerError { constructor(collectionId: string, alias: string) { super(`Failed to convert WHERE clause to collection filter for collection '${collectionId}' alias '${alias}'. This indicates a bug in the query optimization logic.`); } }\nexport class SubscriptionNotFoundError extends QueryCompilationError { constructor(resolvedAlias: string, originalAlias: string, collectionId: string, availableAliases: Array<string>) { super(`Internal error: subscription for alias '${resolvedAlias}' (remapped from '${originalAlias}', collection '${collectionId}') is missing in join pipeline. Available aliases: ${availableAliases.join(', ')}. This indicates a bug in alias tracking.`); } }\nexport class AggregateNotSupportedError extends QueryCompilationError { constructor() { super('Aggregate expressions are not supported in this context. Use GROUP BY clause for aggregates.'); } }\nexport class MissingAliasInputsError extends QueryCompilationError { constructor(missingAliases: Array<string>) { super(`Internal error: compiler returned aliases without inputs: ${missingAliases.join(', ')}. This indicates a bug in query compilation. Please report this issue.`); } }\nexport class SetWindowRequiresOrderByError extends QueryCompilationError { constructor() { super('setWindow() can only be called on collections with an ORDER BY clause. Add .orderBy() to your query to enable window movement.'); } }\n","/**\n * Dependency-tracking row proxy for filter predicates.\n *\n * The query engine calls `trackRow(realRow, deps)` to wrap a concrete row\n * JS object before passing it to the user's predicate. Every property read\n * adds the key to `deps` so the query can record which columns it observes.\n *\n * Known limitations:\n * - Only string-keyed reads are recorded. Symbol reads (Symbol.iterator,\n * Symbol.toPrimitive, etc.) are forwarded to the underlying row and\n * ignored for dep tracking.\n * - If the predicate reads nested objects (lists, structs), only the\n * top-level column name is recorded. That matches the granularity of\n * our column-level invalidation anyway.\n * - Returning the underlying scalar value directly means JS operators\n * (`===`, `>`, arithmetic) behave as the user expects.\n */\n\nexport type DepSet = Set<string>;\n\nexport function trackRow<T extends object>(row: T, deps: DepSet): T {\n return new Proxy(row, {\n get(target, prop, receiver) {\n if (typeof prop === 'string') deps.add(prop);\n return Reflect.get(target, prop, receiver);\n },\n // The tracking proxy is intentionally transparent for other traps so\n // predicates that destructure or use `in` still work as expected.\n has(target, prop) {\n if (typeof prop === 'string') deps.add(prop);\n return Reflect.has(target, prop);\n },\n }) as T;\n}\n","/**\n * Column-op filter DSL. A vectorizable alternative to `.where(fn)`.\n *\n * The surface is deliberately tiny — eq/neq/gt/gte/lt/lte for scalars,\n * and/or/not for composition, plus a column-ref helper. Predicates built\n * here are compiled to a `RowTest` closure that reads directly from the\n * column typed-arrays, skipping proxy allocation and per-row row-object\n * materialization. Anything outside this surface still works via\n * `.where(fn)` at normal (proxy) speed.\n *\n * Example:\n * import { query, f, eq, and, gt } from 'arrowbase';\n * query(c).filter(and(eq(f('tag'), 'asphalt'), gt(f('speed'), 40)));\n */\n\nexport type Scalar = number | bigint | boolean | string | null;\n\n/** A reference to a column by name. */\nexport interface ColumnRef {\n readonly kind: 'col';\n readonly name: string;\n}\n\nexport interface LiteralNode {\n readonly kind: 'lit';\n readonly value: Scalar;\n}\n\nexport type Operand = ColumnRef | LiteralNode;\n\nexport type CmpOp = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte';\n\nexport interface CompareNode {\n readonly kind: 'cmp';\n readonly op: CmpOp;\n readonly left: Operand;\n readonly right: Operand;\n}\n\nexport interface AndNode {\n readonly kind: 'and';\n readonly args: readonly FilterExpr[];\n}\nexport interface OrNode {\n readonly kind: 'or';\n readonly args: readonly FilterExpr[];\n}\nexport interface NotNode {\n readonly kind: 'not';\n readonly arg: FilterExpr;\n}\nexport interface IsNullNode {\n readonly kind: 'isNull';\n readonly col: ColumnRef;\n readonly negated: boolean;\n}\nexport interface InNode {\n readonly kind: 'in';\n readonly col: ColumnRef;\n readonly values: readonly Scalar[];\n}\n\n/**\n * String predicate. Covers the common text-matching cases with a\n * vectorizable shape so the kernel can pre-compute (e.g., the matching\n * set of dict codes) instead of walking characters per row.\n *\n * `op`:\n * - `contains` / `startsWith` / `endsWith`: plain substring match.\n * - `like`: SQL LIKE, with `%` = any sequence, `_` = any single char,\n * and `\\` as an escape for literal `%` / `_`.\n * - `matches`: raw RegExp pattern (string + optional flags) run with\n * `RegExp.prototype.test`. Use sparingly; engines inline the other\n * ops much more aggressively.\n *\n * `caseInsensitive` performs ASCII-fold case folding (fast). For\n * locale-aware folding (German ß, Turkish dotted-I, etc.) use\n * `matches` with an explicit RegExp containing the `i` flag, which the\n * engine delegates to the platform.\n */\nexport type StringOp =\n | 'contains'\n | 'startsWith'\n | 'endsWith'\n | 'like'\n | 'matches';\n\nexport interface StringOpNode {\n readonly kind: 'str';\n readonly op: StringOp;\n readonly col: ColumnRef;\n /** Pattern or substring. For `matches`, the regex source. */\n readonly value: string;\n /** Flags (for `matches` only). Ignored for other ops. */\n readonly flags?: string;\n /** ASCII-fold case-insensitive compare. Ignored by `matches`. */\n readonly caseInsensitive?: boolean;\n /** If true, the match result is inverted (NOT contains/like/...). */\n readonly negated?: boolean;\n}\n\nexport type FilterExpr =\n | CompareNode\n | AndNode\n | OrNode\n | NotNode\n | IsNullNode\n | InNode\n | StringOpNode\n | ColumnRef; // boolean column ref projected as `col === true`\n\n/** Build a column ref. `f('speed')` reads shorter at the call site. */\nexport function f(name: string): ColumnRef {\n return { kind: 'col', name };\n}\n\nfunction lit(value: Scalar): LiteralNode {\n return { kind: 'lit', value };\n}\n\nfunction toOperand(x: Operand | Scalar): Operand {\n if (x !== null && typeof x === 'object' && (x as ColumnRef).kind === 'col') {\n return x as ColumnRef;\n }\n return lit(x as Scalar);\n}\n\nexport function eq(a: Operand | Scalar, b: Operand | Scalar): CompareNode {\n return { kind: 'cmp', op: 'eq', left: toOperand(a), right: toOperand(b) };\n}\nexport function neq(a: Operand | Scalar, b: Operand | Scalar): CompareNode {\n return { kind: 'cmp', op: 'neq', left: toOperand(a), right: toOperand(b) };\n}\nexport function gt(a: Operand | Scalar, b: Operand | Scalar): CompareNode {\n return { kind: 'cmp', op: 'gt', left: toOperand(a), right: toOperand(b) };\n}\nexport function gte(a: Operand | Scalar, b: Operand | Scalar): CompareNode {\n return { kind: 'cmp', op: 'gte', left: toOperand(a), right: toOperand(b) };\n}\nexport function lt(a: Operand | Scalar, b: Operand | Scalar): CompareNode {\n return { kind: 'cmp', op: 'lt', left: toOperand(a), right: toOperand(b) };\n}\nexport function lte(a: Operand | Scalar, b: Operand | Scalar): CompareNode {\n return { kind: 'cmp', op: 'lte', left: toOperand(a), right: toOperand(b) };\n}\nexport function and(...args: FilterExpr[]): AndNode {\n return { kind: 'and', args };\n}\nexport function or(...args: FilterExpr[]): OrNode {\n return { kind: 'or', args };\n}\nexport function not(arg: FilterExpr): NotNode {\n return { kind: 'not', arg };\n}\nexport function isNull(col: ColumnRef): IsNullNode {\n return { kind: 'isNull', col, negated: false };\n}\nexport function isNotNull(col: ColumnRef): IsNullNode {\n return { kind: 'isNull', col, negated: true };\n}\nexport function inArray(col: ColumnRef, values: readonly Scalar[]): InNode {\n return { kind: 'in', col, values };\n}\n\n// ---- string predicates ------------------------------------------------\n\nexport interface StringOpOptions {\n /** ASCII-fold case-insensitive. Ignored by `matches`. */\n caseInsensitive?: boolean;\n /** Invert match. */\n negated?: boolean;\n}\n\nfunction strNode(\n op: StringOp,\n col: ColumnRef,\n value: string,\n opts?: StringOpOptions,\n): StringOpNode {\n const node: StringOpNode = { kind: 'str', op, col, value };\n if (opts?.caseInsensitive) (node as { caseInsensitive?: boolean }).caseInsensitive = true;\n if (opts?.negated) (node as { negated?: boolean }).negated = true;\n return node;\n}\n\nexport function contains(col: ColumnRef, value: string, opts?: StringOpOptions): StringOpNode {\n return strNode('contains', col, value, opts);\n}\nexport function startsWith(col: ColumnRef, value: string, opts?: StringOpOptions): StringOpNode {\n return strNode('startsWith', col, value, opts);\n}\nexport function endsWith(col: ColumnRef, value: string, opts?: StringOpOptions): StringOpNode {\n return strNode('endsWith', col, value, opts);\n}\nexport function like(col: ColumnRef, pattern: string, opts?: StringOpOptions): StringOpNode {\n return strNode('like', col, pattern, opts);\n}\nexport function matches(\n col: ColumnRef,\n pattern: string | RegExp,\n opts?: StringOpOptions,\n): StringOpNode {\n const source = pattern instanceof RegExp ? pattern.source : pattern;\n const flags = pattern instanceof RegExp ? pattern.flags : undefined;\n const node: StringOpNode = { kind: 'str', op: 'matches', col, value: source };\n if (flags !== undefined) (node as { flags?: string }).flags = flags;\n if (opts?.negated) (node as { negated?: boolean }).negated = true;\n return node;\n}\n\n/** Walk an expression and collect all column refs. */\nexport function collectColumns(expr: FilterExpr, out: Set<string>): void {\n switch (expr.kind) {\n case 'col':\n out.add(expr.name);\n return;\n case 'cmp':\n if (expr.left.kind === 'col') out.add(expr.left.name);\n if (expr.right.kind === 'col') out.add(expr.right.name);\n return;\n case 'and':\n case 'or':\n for (const a of expr.args) collectColumns(a, out);\n return;\n case 'not':\n collectColumns(expr.arg, out);\n return;\n case 'isNull':\n out.add(expr.col.name);\n return;\n case 'in':\n out.add(expr.col.name);\n return;\n case 'str':\n out.add(expr.col.name);\n return;\n }\n}\n","/**\n * Column type codes.\n *\n * Fixed-width (Phase 1):\n * Bool, Int/UInt 8..64, Float 32/64\n *\n * Variable-width (Phase 3):\n * Utf8 — raw UTF-8 strings, offsets + values heap\n * DictUtf8 — dictionary-encoded UTF-8; per-row stores a u32 dictionary\n * code, with a sidecar string table (JS-side in v1).\n *\n * Values are stable integers — they are written to the column table in SAB\n * and must not change without a schema-fingerprint bump.\n */\nexport const ColumnTypeCode = {\n Bool: 1,\n Int8: 2,\n Int16: 3,\n Int32: 4,\n Int64: 5,\n UInt8: 6,\n UInt16: 7,\n UInt32: 8,\n UInt64: 9,\n Float32: 10,\n Float64: 11,\n Utf8: 12,\n DictUtf8: 13,\n Binary: 14,\n List: 15,\n Struct: 16,\n Point: 17,\n LineString: 18,\n Polygon: 19,\n} as const;\n\nexport type ColumnTypeCode =\n (typeof ColumnTypeCode)[keyof typeof ColumnTypeCode];\n\nexport type ColumnTypeName =\n | 'bool'\n | 'int8'\n | 'int16'\n | 'int32'\n | 'int64'\n | 'uint8'\n | 'uint16'\n | 'uint32'\n | 'uint64'\n | 'float32'\n | 'float64'\n | 'utf8'\n | 'dict_utf8'\n | 'binary'\n | 'list'\n | 'struct'\n | 'point'\n | 'linestring'\n | 'polygon';\n\nexport const TYPE_NAME_TO_CODE: Record<ColumnTypeName, ColumnTypeCode> = {\n bool: ColumnTypeCode.Bool,\n int8: ColumnTypeCode.Int8,\n int16: ColumnTypeCode.Int16,\n int32: ColumnTypeCode.Int32,\n int64: ColumnTypeCode.Int64,\n uint8: ColumnTypeCode.UInt8,\n uint16: ColumnTypeCode.UInt16,\n uint32: ColumnTypeCode.UInt32,\n uint64: ColumnTypeCode.UInt64,\n float32: ColumnTypeCode.Float32,\n float64: ColumnTypeCode.Float64,\n utf8: ColumnTypeCode.Utf8,\n dict_utf8: ColumnTypeCode.DictUtf8,\n binary: ColumnTypeCode.Binary,\n list: ColumnTypeCode.List,\n struct: ColumnTypeCode.Struct,\n point: ColumnTypeCode.Point,\n linestring: ColumnTypeCode.LineString,\n polygon: ColumnTypeCode.Polygon,\n};\n\n/** True for variable-width columns that need a values heap. */\nexport function isVariableWidth(code: ColumnTypeCode): boolean {\n return code === ColumnTypeCode.Utf8 || code === ColumnTypeCode.Binary;\n}\n\n/** True for dictionary-encoded columns that need a JS-side dict table. */\nexport function isDictionary(code: ColumnTypeCode): boolean {\n return code === ColumnTypeCode.DictUtf8;\n}\n\n/** True for list columns (offsets + child buffer). */\nexport function isListType(code: ColumnTypeCode): boolean {\n return code === ColumnTypeCode.List;\n}\n\n/** True for struct columns (child columns + parent validity). */\nexport function isStructType(code: ColumnTypeCode): boolean {\n return code === ColumnTypeCode.Struct;\n}\n\n/** True for geo columns with custom physical storage. */\nexport function isGeoType(code: ColumnTypeCode): boolean {\n return (\n code === ColumnTypeCode.Point ||\n code === ColumnTypeCode.LineString ||\n code === ColumnTypeCode.Polygon\n );\n}\n\n/** True for primitive types allowed as list items in v1 (no nested/geo columns). */\nexport function isLeafType(code: ColumnTypeCode): boolean {\n return !isListType(code) && !isStructType(code) && !isGeoType(code);\n}\n\n/**\n * Byte width of a single element for fixed-width columns. For variable-width\n * columns (Utf8), returns the offsets array element width (i32 = 4).\n * Dict columns store a u32 code per row (= 4).\n */\nexport function byteWidthOf(code: ColumnTypeCode): number {\n switch (code) {\n case ColumnTypeCode.Bool:\n case ColumnTypeCode.Int8:\n case ColumnTypeCode.UInt8:\n return 1;\n case ColumnTypeCode.Int16:\n case ColumnTypeCode.UInt16:\n return 2;\n case ColumnTypeCode.Int32:\n case ColumnTypeCode.UInt32:\n case ColumnTypeCode.Float32:\n case ColumnTypeCode.Utf8: // offsets array element\n case ColumnTypeCode.Binary: // offsets array element\n case ColumnTypeCode.DictUtf8:\n case ColumnTypeCode.List: // offsets array element (range pairs into child)\n case ColumnTypeCode.LineString: // offsets array element (range pairs into coordinate child)\n case ColumnTypeCode.Polygon: // offsets array element (range pairs into ring child)\n return 4;\n case ColumnTypeCode.Int64:\n case ColumnTypeCode.UInt64:\n case ColumnTypeCode.Float64:\n return 8;\n case ColumnTypeCode.Point:\n // Two Float64 coordinates: [lng, lat].\n return 16;\n case ColumnTypeCode.Struct:\n // Struct itself allocates no primary buffer — it is a grouping\n // over its child columns. We still keep a validity bitmap if the\n // struct column is nullable. 0 signals \"skip primary allocation\".\n return 0;\n }\n}\n\n/** JS value type for each column type. */\nexport type PointValue = readonly [lng: number, lat: number];\nexport type LineStringValue = readonly PointValue[];\nexport type PolygonValue = readonly LineStringValue[];\n\nexport type ValueOf<T extends ColumnTypeName> = T extends 'bool'\n ? boolean\n : T extends 'int64' | 'uint64'\n ? bigint\n : T extends 'utf8' | 'dict_utf8'\n ? string\n : T extends 'binary'\n ? Uint8Array\n : T extends 'list'\n ? readonly unknown[]\n : T extends 'struct'\n ? Record<string, unknown>\n : T extends 'point'\n ? PointValue\n : T extends 'linestring'\n ? LineStringValue\n : T extends 'polygon'\n ? PolygonValue\n : number;\n","/**\n * Vectorized filter + sort + project kernel.\n *\n * Given a collection view, a compiled column-op filter, and an orderBy\n * spec, this module produces a `Uint32Array` of matching row ordinals,\n * stable-sorted on the orderBy key, sliced by limit/offset, and finally\n * materialized into projected row objects. The kernel avoids:\n * - per-row proxy wrapping\n * - per-row row-object allocation during the filter pass\n * - per-row row-object allocation during sort (indirect sort on\n * typed-array key buffer)\n *\n * Only rows that survive the limit window are materialized into a\n * `RowValue`.\n *\n * Correctness parity with the legacy path is verified by running the\n * existing query-test suite through `QueryExecutor` with the fast path\n * enabled (any query expressed via `.filter(...)` exercises it).\n */\n\nimport type { Collection, RowValue, ScanColumn } from '../collection/collection.js';\nimport { ColumnTypeCode } from '../schema/types.js';\nimport type { FilterExpr, ColumnRef, Operand, Scalar, StringOpNode } from './filter.js';\nimport type { OrderSpec } from './query.js';\n\n// Validity getter duplicated from collection/rowIndex-era code; inlined\n// to avoid importing getValidity (which is module-private to collection).\n// Matches the bit order used by the writer path.\nfunction isValid(validity: Uint8Array | null, row: number): boolean {\n if (!validity) return true;\n const byte = validity[row >>> 3] ?? 0;\n return (byte & (1 << (row & 7))) !== 0;\n}\n\n// ----------------------------------------------------------------------\n// RowTest compilation: FilterExpr → (row: number) => boolean\n// ----------------------------------------------------------------------\n\nexport type RowTest = (row: number) => boolean;\n\nexport class FilterCompileError extends Error {}\n\nexport interface CompiledFilter {\n readonly test: RowTest;\n /** Columns referenced. Drives invalidation + required-col set. */\n readonly columns: ReadonlySet<string>;\n}\n\nexport function compileFilter(\n expr: FilterExpr | null,\n scanByName: ReadonlyMap<string, ScanColumn>,\n): CompiledFilter {\n if (!expr) {\n return { test: () => true, columns: new Set() };\n }\n const cols = new Set<string>();\n const test = compileExpr(expr, scanByName, cols);\n return { test, columns: cols };\n}\n\nfunction compileExpr(\n expr: FilterExpr,\n scanByName: ReadonlyMap<string, ScanColumn>,\n cols: Set<string>,\n): RowTest {\n switch (expr.kind) {\n case 'col': {\n // Boolean-column truthiness: col === true.\n const sc = requireCol(expr, scanByName, cols);\n if (sc.typeCode !== ColumnTypeCode.Bool) {\n throw new FilterCompileError(\n `column ref \"${expr.name}\" in boolean position must be a bool column`,\n );\n }\n const values = sc.values as Uint8Array;\n const validity = sc.validity;\n return (row) => {\n if (!isValid(validity, row)) return false;\n return (values[row] ?? 0) !== 0;\n };\n }\n case 'and': {\n const children = expr.args.map((a) => compileExpr(a, scanByName, cols));\n if (children.length === 0) return () => true;\n return (row) => {\n for (let i = 0; i < children.length; i++) {\n if (!children[i]!(row)) return false;\n }\n return true;\n };\n }\n case 'or': {\n const children = expr.args.map((a) => compileExpr(a, scanByName, cols));\n if (children.length === 0) return () => false;\n return (row) => {\n for (let i = 0; i < children.length; i++) {\n if (children[i]!(row)) return true;\n }\n return false;\n };\n }\n case 'not': {\n const inner = compileExpr(expr.arg, scanByName, cols);\n return (row) => !inner(row);\n }\n case 'isNull': {\n const sc = requireCol(expr.col, scanByName, cols);\n const validity = sc.validity;\n if (!validity) {\n // Non-nullable column: isNull always false, isNotNull always true.\n return expr.negated ? () => true : () => false;\n }\n if (expr.negated) return (row) => isValid(validity, row);\n return (row) => !isValid(validity, row);\n }\n case 'in': {\n const tests = expr.values.map((value) =>\n compileCmp(\n 'eq',\n expr.col,\n { kind: 'lit', value },\n scanByName,\n cols,\n ),\n );\n return (row) => {\n for (const test of tests) if (test(row)) return true;\n return false;\n };\n }\n case 'cmp':\n return compileCmp(expr.op, expr.left, expr.right, scanByName, cols);\n case 'str':\n return compileString(expr, scanByName, cols);\n }\n}\n\nfunction requireCol(\n ref: ColumnRef,\n scanByName: ReadonlyMap<string, ScanColumn>,\n cols: Set<string>,\n): ScanColumn {\n const sc = scanByName.get(ref.name);\n if (!sc) throw new FilterCompileError(`unknown column \"${ref.name}\"`);\n cols.add(ref.name);\n return sc;\n}\n\nfunction compileCmp(\n op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte',\n left: Operand,\n right: Operand,\n scanByName: ReadonlyMap<string, ScanColumn>,\n cols: Set<string>,\n): RowTest {\n // Exactly one side must be a column and one a literal — column↔column\n // compares are rare in practice and not vectorized in v1.\n let ref: ColumnRef;\n let literal: Scalar;\n let flipped: boolean;\n if (left.kind === 'col' && right.kind === 'lit') {\n ref = left;\n literal = right.value;\n flipped = false;\n } else if (left.kind === 'lit' && right.kind === 'col') {\n ref = right;\n literal = left.value;\n flipped = true;\n } else {\n throw new FilterCompileError(\n 'column-column and literal-literal comparisons are not supported in filter DSL',\n );\n }\n // Normalize direction so the column is always on the left conceptually:\n // flip gt↔lt, gte↔lte when the literal was on the left.\n const effective = flipped ? flipCmp(op) : op;\n return buildCmp(effective, requireCol(ref, scanByName, cols), literal);\n}\n\nfunction flipCmp(op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte'): typeof op {\n switch (op) {\n case 'eq':\n case 'neq':\n return op;\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 buildCmp(\n op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte',\n sc: ScanColumn,\n literal: Scalar,\n): RowTest {\n const code = sc.typeCode;\n const validity = sc.validity;\n\n // Numeric fast paths (non-bigint).\n if (isNumericTypeCode(code)) {\n const values = sc.values as { readonly [i: number]: number; length: number };\n if (literal === null) {\n // null comparison: only `eq` and `neq` are defined; both return false\n // against a non-null value. Matching semantics: x === null in JS ⇒\n // true only when the cell is null. So we collapse to isNull.\n if (op === 'eq') {\n if (!validity) return () => false;\n return (row) => !isValid(validity, row);\n }\n if (op === 'neq') {\n if (!validity) return () => true;\n return (row) => isValid(validity, row);\n }\n return () => false;\n }\n if (typeof literal !== 'number') {\n throw new FilterCompileError(\n `column \"${sc.name}\" expects numeric literal, got ${typeof literal}`,\n );\n }\n const lit = literal;\n const cmp = numericCmp(op);\n if (!validity) return (row) => cmp(values[row] ?? 0, lit);\n return (row) => isValid(validity, row) && cmp(values[row] ?? 0, lit);\n }\n\n if (code === ColumnTypeCode.Bool) {\n const values = sc.values as Uint8Array;\n if (literal === null) {\n if (op === 'eq') {\n if (!validity) return () => false;\n return (row) => !isValid(validity, row);\n }\n if (op === 'neq') return validity ? (row) => isValid(validity, row) : () => true;\n return () => false;\n }\n if (typeof literal !== 'boolean') {\n throw new FilterCompileError(\n `column \"${sc.name}\" expects boolean literal, got ${typeof literal}`,\n );\n }\n const litByte = literal ? 1 : 0;\n if (op === 'eq') {\n if (!validity) return (row) => (values[row] ?? 0) === litByte;\n return (row) => isValid(validity, row) && (values[row] ?? 0) === litByte;\n }\n if (op === 'neq') {\n if (!validity) return (row) => (values[row] ?? 0) !== litByte;\n return (row) => isValid(validity, row) && (values[row] ?? 0) !== litByte;\n }\n throw new FilterCompileError(\n `bool columns only support eq/neq (got ${op})`,\n );\n }\n\n if (code === ColumnTypeCode.Int64 || code === ColumnTypeCode.UInt64) {\n const values = sc.values as BigInt64Array | BigUint64Array;\n if (literal === null) {\n if (op === 'eq') return validity ? (row) => !isValid(validity, row) : () => false;\n if (op === 'neq') return validity ? (row) => isValid(validity, row) : () => true;\n return () => false;\n }\n if (typeof literal !== 'bigint') {\n if (typeof literal === 'number' && Number.isInteger(literal)) {\n literal = BigInt(literal);\n } else {\n throw new FilterCompileError(\n `column \"${sc.name}\" expects bigint literal, got ${typeof literal}`,\n );\n }\n }\n const lit = literal as bigint;\n const cmp = bigintCmp(op);\n if (!validity) return (row) => cmp(values[row] as bigint, lit);\n return (row) => isValid(validity, row) && cmp(values[row] as bigint, lit);\n }\n\n if (code === ColumnTypeCode.DictUtf8) {\n // Dict lookup: interned code. eq/neq are O(1) via reverse lookup.\n const dict = sc.dictionary!;\n const codes = sc.values as Uint32Array;\n if (literal === null) {\n if (op === 'eq') return validity ? (row) => !isValid(validity, row) : () => false;\n if (op === 'neq') return validity ? (row) => isValid(validity, row) : () => true;\n return () => false;\n }\n if (typeof literal !== 'string') {\n throw new FilterCompileError(\n `column \"${sc.name}\" expects string literal, got ${typeof literal}`,\n );\n }\n const matchCode = dict.lookup(literal);\n if (op === 'eq') {\n if (matchCode === undefined) {\n // Literal absent from dict ⇒ no row matches.\n return () => false;\n }\n if (!validity) return (row) => codes[row] === matchCode;\n return (row) => isValid(validity, row) && codes[row] === matchCode;\n }\n if (op === 'neq') {\n if (matchCode === undefined) {\n if (!validity) return () => true;\n return (row) => isValid(validity, row);\n }\n if (!validity) return (row) => codes[row] !== matchCode;\n return (row) => isValid(validity, row) && codes[row] !== matchCode;\n }\n throw new FilterCompileError(\n `dict_utf8 columns only support eq/neq (got ${op})`,\n );\n }\n\n if (code === ColumnTypeCode.Utf8) {\n const ranges = sc.values as Int32Array;\n const heap = sc.heap!;\n if (literal === null) {\n if (op === 'eq') return validity ? (row) => !isValid(validity, row) : () => false;\n if (op === 'neq') return validity ? (row) => isValid(validity, row) : () => true;\n return () => false;\n }\n if (typeof literal !== 'string') {\n throw new FilterCompileError(\n `column \"${sc.name}\" expects string literal, got ${typeof literal}`,\n );\n }\n const lit = literal;\n const readString = (row: number): string => {\n const start = ranges[row * 2] ?? 0;\n const end = ranges[row * 2 + 1] ?? 0;\n return heap.read(start, end);\n };\n if (op === 'eq') {\n if (!validity) return (row) => readString(row) === lit;\n return (row) => isValid(validity, row) && readString(row) === lit;\n }\n if (op === 'neq') {\n if (!validity) return (row) => readString(row) !== lit;\n return (row) => isValid(validity, row) && readString(row) !== lit;\n }\n throw new FilterCompileError(\n `utf8 columns only support eq/neq (got ${op})`,\n );\n }\n\n throw new FilterCompileError(\n `filter DSL does not support column type code ${code}`,\n );\n}\n\n// ----------------------------------------------------------------------\n// String predicates (contains / startsWith / endsWith / like / matches)\n// ----------------------------------------------------------------------\n\nfunction compileString(\n expr: StringOpNode,\n scanByName: ReadonlyMap<string, ScanColumn>,\n cols: Set<string>,\n): RowTest {\n const sc = requireCol(expr.col, scanByName, cols);\n const code = sc.typeCode;\n if (code !== ColumnTypeCode.Utf8 && code !== ColumnTypeCode.DictUtf8) {\n throw new FilterCompileError(\n `string predicates require a utf8 or dict_utf8 column; \"${sc.name}\" is not a string column`,\n );\n }\n const validity = sc.validity;\n const negated = expr.negated === true;\n const stringPredicate = buildStringPredicate(expr);\n\n // Dict path: pre-resolve matching codes once.\n if (code === ColumnTypeCode.DictUtf8) {\n const dict = sc.dictionary!;\n const codes = sc.values as Uint32Array;\n const matchSet = new Set<number>();\n for (const [codeVal, str] of dict.entries()) {\n if (stringPredicate(str)) matchSet.add(codeVal);\n }\n if (matchSet.size === 0) {\n const constResult = negated; // if no codes match, result is the negation bit\n if (!validity) return () => constResult;\n return (row) => (isValid(validity, row) ? constResult : false);\n }\n if (!validity) {\n if (!negated) return (row) => matchSet.has(codes[row]!);\n return (row) => !matchSet.has(codes[row]!);\n }\n if (!negated) {\n return (row) => isValid(validity, row) && matchSet.has(codes[row]!);\n }\n return (row) => isValid(validity, row) && !matchSet.has(codes[row]!);\n }\n\n // Utf8 path: decode [start,end) range, then test.\n const ranges = sc.values as Int32Array;\n const heap = sc.heap!;\n const readString = (row: number): string => {\n const start = ranges[row * 2] ?? 0;\n const end = ranges[row * 2 + 1] ?? 0;\n return heap.read(start, end);\n };\n if (!validity) {\n if (!negated) return (row) => stringPredicate(readString(row));\n return (row) => !stringPredicate(readString(row));\n }\n if (!negated) {\n return (row) => isValid(validity, row) && stringPredicate(readString(row));\n }\n return (row) => isValid(validity, row) && !stringPredicate(readString(row));\n}\n\nfunction buildStringPredicate(expr: StringOpNode): (s: string) => boolean {\n switch (expr.op) {\n case 'contains': return compileSubstring(expr.value, expr.caseInsensitive ?? false, 'contains');\n case 'startsWith': return compileSubstring(expr.value, expr.caseInsensitive ?? false, 'startsWith');\n case 'endsWith': return compileSubstring(expr.value, expr.caseInsensitive ?? false, 'endsWith');\n case 'like': return compileLike(expr.value, expr.caseInsensitive ?? false);\n case 'matches': return compileRegex(expr.value, expr.flags);\n }\n}\n\nfunction compileSubstring(\n needle: string,\n caseInsensitive: boolean,\n mode: 'contains' | 'startsWith' | 'endsWith',\n): (s: string) => boolean {\n if (caseInsensitive) {\n const needleL = asciiToLower(needle);\n switch (mode) {\n case 'contains': return (s) => asciiToLower(s).includes(needleL);\n case 'startsWith': return (s) => asciiToLower(s).startsWith(needleL);\n case 'endsWith': return (s) => asciiToLower(s).endsWith(needleL);\n }\n }\n switch (mode) {\n case 'contains': return (s) => s.includes(needle);\n case 'startsWith': return (s) => s.startsWith(needle);\n case 'endsWith': return (s) => s.endsWith(needle);\n }\n}\n\n/** SQL LIKE → regex. `%` = any sequence, `_` = any single char, `\\` escapes. */\nfunction compileLike(\n pattern: string,\n caseInsensitive: boolean,\n): (s: string) => boolean {\n const simple = parseSimpleLike(pattern);\n if (simple !== undefined) {\n const { literal, leadingWildcard, trailingWildcard } = simple;\n if (leadingWildcard && trailingWildcard) {\n return compileSubstring(literal, caseInsensitive, 'contains');\n }\n if (leadingWildcard) return compileSubstring(literal, caseInsensitive, 'endsWith');\n if (trailingWildcard) return compileSubstring(literal, caseInsensitive, 'startsWith');\n if (caseInsensitive) {\n const expected = asciiToLower(literal);\n return (s) => asciiToLower(s) === expected;\n }\n return (s) => s === literal;\n }\n\n let src = '^';\n let i = 0;\n while (i < pattern.length) {\n const c = pattern[i]!;\n if (c === '\\\\' && i + 1 < pattern.length) {\n const next = pattern[i + 1]!;\n if (next === '%' || next === '_' || next === '\\\\') {\n src += escapeRegexChar(next);\n i += 2;\n continue;\n }\n }\n if (c === '%') {\n src += '.*';\n } else if (c === '_') {\n src += '.';\n } else {\n src += escapeRegexChar(c);\n }\n i++;\n }\n src += '$';\n const re = new RegExp(src, caseInsensitive ? 'is' : 's');\n return (s) => re.test(s);\n}\n\n/** Recognize LIKE shapes that need only equality/substring matching. */\nfunction parseSimpleLike(pattern: string): {\n readonly literal: string;\n readonly leadingWildcard: boolean;\n readonly trailingWildcard: boolean;\n} | undefined {\n let literal = '';\n let leadingWildcard = false;\n let pendingWildcard = false;\n let sawLiteral = false;\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === '\\\\' && i + 1 < pattern.length) {\n const next = pattern[i + 1]!;\n if (next === '%' || next === '_' || next === '\\\\') {\n if (pendingWildcard && sawLiteral) return undefined;\n pendingWildcard = false;\n literal += next;\n sawLiteral = true;\n i++;\n continue;\n }\n }\n if (char === '_') return undefined;\n if (char === '%') {\n if (sawLiteral) pendingWildcard = true;\n else leadingWildcard = true;\n continue;\n }\n if (pendingWildcard && sawLiteral) return undefined;\n pendingWildcard = false;\n literal += char;\n sawLiteral = true;\n }\n return { literal, leadingWildcard, trailingWildcard: pendingWildcard };\n}\n\nfunction compileRegex(\n source: string,\n flags: string | undefined,\n): (s: string) => boolean {\n let re: RegExp;\n try {\n re = new RegExp(source, flags);\n } catch (err) {\n throw new FilterCompileError(\n `invalid regex \"${source}\"${flags ? ` (flags \"${flags}\")` : ''}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n return (s) => re.test(s);\n}\n\n// Escape a single character for embedding in a RegExp.\nfunction escapeRegexChar(c: string): string {\n // Only these are regex-meta; all other chars are safe as-is.\n if ('^$.|?*+()[]{}\\\\/'.includes(c)) return '\\\\' + c;\n return c;\n}\n\n/**\n * ASCII-only lowercasing. Fast (no locale-table lookups). Non-ASCII\n * characters pass through unchanged — use `matches` with 'i' flag for\n * full-Unicode case folding.\n */\nfunction asciiToLower(s: string): string {\n let out = '';\n let changed = false;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c >= 65 && c <= 90) {\n if (!changed) {\n out = s.slice(0, i);\n changed = true;\n }\n out += String.fromCharCode(c + 32);\n } else if (changed) {\n out += s[i];\n }\n }\n return changed ? out : s;\n}\n\n\nfunction isNumericTypeCode(code: ColumnTypeCode): boolean {\n switch (code) {\n case ColumnTypeCode.Int8:\n case ColumnTypeCode.Int16:\n case ColumnTypeCode.Int32:\n case ColumnTypeCode.UInt8:\n case ColumnTypeCode.UInt16:\n case ColumnTypeCode.UInt32:\n case ColumnTypeCode.Float32:\n case ColumnTypeCode.Float64:\n return true;\n default:\n return false;\n }\n}\n\nfunction numericCmp(op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte'): (a: number, b: number) => boolean {\n switch (op) {\n case 'eq': return (a, b) => a === b;\n case 'neq': return (a, b) => a !== b;\n case 'gt': return (a, b) => a > b;\n case 'gte': return (a, b) => a >= b;\n case 'lt': return (a, b) => a < b;\n case 'lte': return (a, b) => a <= b;\n }\n}\n\nfunction bigintCmp(op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte'): (a: bigint, b: bigint) => boolean {\n switch (op) {\n case 'eq': return (a, b) => a === b;\n case 'neq': return (a, b) => a !== b;\n case 'gt': return (a, b) => a > b;\n case 'gte': return (a, b) => a >= b;\n case 'lt': return (a, b) => a < b;\n case 'lte': return (a, b) => a <= b;\n }\n}\n\n// ----------------------------------------------------------------------\n// Scan + sort\n// ----------------------------------------------------------------------\n\n/**\n * Collect row ordinals matching `test` from the live-ordinal iterator\n * into a `Uint32Array`. Grows a JS array (fast, V8-optimised) and copies\n * once at the end — avoids the cost of predicting a capacity.\n */\nexport function scanOrdinals(\n liveOrdinals: Iterable<number>,\n test: RowTest,\n): Uint32Array {\n const buf: number[] = [];\n for (const r of liveOrdinals) {\n if (test(r)) buf.push(r);\n }\n const out = new Uint32Array(buf.length);\n for (let i = 0; i < buf.length; i++) out[i] = buf[i]!;\n return out;\n}\n\n/**\n * Sort an ordinal buffer in-place by the given orderBy spec. When every\n * sort key is on a numeric typed-array column, we build a `Float64Array`\n * shadow-key buffer and sort indices into it (cheaper than reading the\n * typed array through bracket-index twice per compare). For mixed types\n * we fall back to a generic comparator that reads cells on demand.\n */\nexport function sortOrdinals(\n ordinals: Uint32Array,\n order: readonly OrderSpec[],\n scanByName: ReadonlyMap<string, ScanColumn>,\n readCell: (row: number, col: string) => unknown,\n): Uint32Array {\n if (order.length === 0) return ordinals;\n\n // Fast path: single numeric key.\n if (order.length === 1) {\n const spec = order[0]!;\n const sc = scanByName.get(spec.column);\n if (sc && isNumericTypeCode(sc.typeCode) && !sc.nullable) {\n const values = sc.values as { readonly [i: number]: number };\n const n = ordinals.length;\n const keys = new Float64Array(n);\n for (let i = 0; i < n; i++) keys[i] = values[ordinals[i]!] ?? 0;\n const idx = new Uint32Array(n);\n for (let i = 0; i < n; i++) idx[i] = i;\n const asc = spec.dir === 'asc';\n // Array.prototype.sort on a plain number[] is faster than on a\n // typed-array because typed-array sort is numeric-lex only for\n // Uint32Array with no comparator. We use plain Array here.\n const arr = Array.from(idx);\n arr.sort((a, b) => {\n const av = keys[a]!;\n const bv = keys[b]!;\n if (av === bv) return a - b; // stable\n return asc ? (av < bv ? -1 : 1) : (av < bv ? 1 : -1);\n });\n const out = new Uint32Array(n);\n for (let i = 0; i < n; i++) out[i] = ordinals[arr[i]!]!;\n return out;\n }\n }\n\n // Generic fallback: comparator reads cells from the collection.\n const arr = Array.from(ordinals);\n arr.sort((ra, rb) => {\n for (const spec of order) {\n const av = readCell(ra, spec.column);\n const bv = readCell(rb, spec.column);\n const c = compareScalars(av, bv);\n if (c !== 0) return spec.dir === 'asc' ? c : -c;\n }\n return ra - rb; // stable by ordinal\n });\n const out = new Uint32Array(arr.length);\n for (let i = 0; i < arr.length; i++) out[i] = arr[i]!;\n return out;\n}\n\nfunction compareScalars(a: unknown, b: unknown): number {\n if (a === b) return 0;\n if (a === null || a === undefined) return -1;\n if (b === null || b === undefined) return 1;\n if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : a > b ? 1 : 0;\n if (typeof a === 'number' && typeof b === 'number') return a < b ? -1 : a > b ? 1 : 0;\n if (typeof a === 'boolean' && typeof b === 'boolean') return (a ? 1 : 0) - (b ? 1 : 0);\n const sa = String(a);\n const sb = String(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n}\n\n// ----------------------------------------------------------------------\n// Materialization\n// ----------------------------------------------------------------------\n\n/**\n * Materialize projected row objects for the `[offset, offset+limit)`\n * slice of the ordinal buffer. `columns` defines the projection — if\n * null, every column is emitted (full row).\n */\nexport function materialize(\n collection: Collection,\n ordinals: Uint32Array,\n offset: number,\n limit: number | null,\n selection: readonly string[] | null,\n): RowValue[] {\n const end = limit === null ? ordinals.length : Math.min(ordinals.length, offset + limit);\n const n = Math.max(0, end - offset);\n const out: RowValue[] = new Array(n);\n const cols = selection ?? (collection.columnNames() as readonly string[]);\n for (let i = 0; i < n; i++) {\n const row = ordinals[offset + i]!;\n const obj: RowValue = {};\n for (let c = 0; c < cols.length; c++) {\n const name = cols[c]!;\n obj[name] = collection._internalReadCell(name, row);\n }\n out[i] = obj;\n }\n return out;\n}\n","/**\n * Fn-predicate → column-op DSL compiler.\n *\n * Best-effort: given a predicate function `(row) => <expr>`, attempts to\n * parse its source via `Function.prototype.toString()` and lower it to\n * a `FilterExpr` tree so `.where(fn)` gets the same vectorized kernel\n * fast path as `.filter(expr)` without caller-side rewrites.\n *\n * The parser is a tiny hand-rolled tokenizer + recursive-descent pass\n * scoped to a narrow grammar. Anything outside that grammar (closures\n * over captured variables, method calls, computed property access,\n * ternary, spread, destructuring parameters, etc.) yields `null`; the\n * engine falls back to the original fn via its row-scan path.\n *\n * Supported shapes (v1):\n *\n * (row) => row.col === 5\n * row => row.x > 10 && row.y !== 'a'\n * (r) => r['col'] === 'x' // bracket access OK for strings\n * r => r.active === true || r.score >= 50\n * r => r.tag == null // → isNull\n * r => !(r.x < 0) // ! before group\n * r => { return r.active === true; } // block body with single return\n *\n * Not supported → returns null:\n *\n * r => r.a === r.b // column-vs-column (kernel limit)\n * r => [1,2].includes(r.tag) // method call\n * r => r.meta.label === 'x' // nested field access\n * r => r.x + 1 > 10 // arithmetic inside predicate\n * r => someOuter === r.x // captured outer variable\n */\nimport {\n type FilterExpr,\n type Operand,\n type ColumnRef,\n type LiteralNode,\n type Scalar,\n type CmpOp,\n} from './filter.js';\n\nexport function tryCompileFnToFilterExpr(\n fn: (row: Record<string, unknown>) => boolean,\n options: { knownColumns?: ReadonlySet<string>; namespaceAlias?: string } = {},\n): FilterExpr | null {\n try {\n const source = fn.toString();\n const tokens = tokenize(source);\n const parser = new FnParser(\n tokens,\n source,\n options.knownColumns ?? null,\n options.namespaceAlias ?? null,\n );\n return parser.parseTopLevel();\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tokenizer\n// ---------------------------------------------------------------------------\n\ntype TokKind =\n | 'ident'\n | 'num'\n | 'str'\n | 'punct'\n | 'op'\n | 'keyword' // true | false | null | undefined | return\n | 'arrow'\n | 'eof';\n\ninterface Tok {\n readonly kind: TokKind;\n readonly text: string;\n readonly start: number;\n}\n\n/** Multi-char operators we recognize, longest-first for greedy match. */\nconst MULTI_OPS = [\n '===',\n '!==',\n '==',\n '!=',\n '>=',\n '<=',\n '&&',\n '||',\n '=>',\n];\nconst SINGLE_OPS = new Set<string>(['!', '>', '<', '-']);\nconst PUNCT = new Set<string>(['(', ')', '{', '}', '[', ']', ',', ';', '.']);\nconst KEYWORDS = new Set<string>(['true', 'false', 'null', 'undefined', 'return']);\n\nfunction tokenize(src: string): Tok[] {\n const tokens: Tok[] = [];\n let i = 0;\n const n = src.length;\n\n while (i < n) {\n const ch = src[i]!;\n\n // Whitespace.\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n i++;\n continue;\n }\n\n // Line comment.\n if (ch === '/' && src[i + 1] === '/') {\n while (i < n && src[i] !== '\\n') i++;\n continue;\n }\n // Block comment.\n if (ch === '/' && src[i + 1] === '*') {\n i += 2;\n while (i < n && !(src[i] === '*' && src[i + 1] === '/')) i++;\n i += 2;\n continue;\n }\n\n // String literal: '...' | \"...\" | `...` (template-no-interp only).\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n const quote = ch;\n const start = i;\n i++;\n let value = '';\n while (i < n && src[i] !== quote) {\n if (src[i] === '\\\\' && i + 1 < n) {\n // Handle the common escapes; anything else gets a best-effort pass-through.\n const esc = src[i + 1]!;\n if (esc === 'n') value += '\\n';\n else if (esc === 't') value += '\\t';\n else if (esc === 'r') value += '\\r';\n else if (esc === '\\\\') value += '\\\\';\n else if (esc === \"'\") value += \"'\";\n else if (esc === '\"') value += '\"';\n else if (esc === '`') value += '`';\n else if (esc === '0') value += '\\0';\n else value += esc;\n i += 2;\n continue;\n }\n // Template-literal with `${...}` — not supported; abort.\n if (quote === '`' && src[i] === '$' && src[i + 1] === '{') {\n throw new Error('template interpolation unsupported');\n }\n value += src[i];\n i++;\n }\n if (src[i] !== quote) throw new Error('unterminated string');\n i++;\n tokens.push({ kind: 'str', text: value, start });\n continue;\n }\n\n // Numeric literal (integer or decimal; no exp, no bigint suffix for simplicity).\n if ((ch >= '0' && ch <= '9') || (ch === '.' && isDigit(src[i + 1]))) {\n const start = i;\n while (i < n && (isDigit(src[i]!) || src[i] === '.' || src[i] === 'e' || src[i] === 'E' || src[i] === '+' || src[i] === '-')) {\n // Only include +/- as part of exponent; if we're not in an exponent, stop.\n const c = src[i]!;\n if ((c === '+' || c === '-') && !(src[i - 1] === 'e' || src[i - 1] === 'E')) break;\n i++;\n }\n tokens.push({ kind: 'num', text: src.slice(start, i), start });\n continue;\n }\n\n // Identifier / keyword.\n if (isIdentStart(ch)) {\n const start = i;\n while (i < n && isIdentCont(src[i]!)) i++;\n const text = src.slice(start, i);\n if (KEYWORDS.has(text)) {\n tokens.push({ kind: 'keyword', text, start });\n } else {\n tokens.push({ kind: 'ident', text, start });\n }\n continue;\n }\n\n // Multi-char ops.\n let matched = false;\n for (const op of MULTI_OPS) {\n if (src.startsWith(op, i)) {\n tokens.push({ kind: op === '=>' ? 'arrow' : 'op', text: op, start: i });\n i += op.length;\n matched = true;\n break;\n }\n }\n if (matched) continue;\n\n if (SINGLE_OPS.has(ch)) {\n tokens.push({ kind: 'op', text: ch, start: i });\n i++;\n continue;\n }\n if (PUNCT.has(ch)) {\n tokens.push({ kind: 'punct', text: ch, start: i });\n i++;\n continue;\n }\n\n throw new Error(`unexpected char '${ch}' at ${i}`);\n }\n\n tokens.push({ kind: 'eof', text: '', start: n });\n return tokens;\n}\n\nfunction isDigit(c: string | undefined): boolean {\n return c !== undefined && c >= '0' && c <= '9';\n}\nfunction isIdentStart(c: string): boolean {\n return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c === '_' || c === '$';\n}\nfunction isIdentCont(c: string): boolean {\n return isIdentStart(c) || (c >= '0' && c <= '9');\n}\n\n// ---------------------------------------------------------------------------\n// Parser\n// ---------------------------------------------------------------------------\n\nclass FnParser {\n private pos = 0;\n private paramName = '';\n\n constructor(\n private readonly tokens: Tok[],\n _source: string,\n private readonly knownColumns: ReadonlySet<string> | null,\n private readonly namespaceAlias: string | null,\n ) {}\n\n private peek(off = 0): Tok {\n return this.tokens[this.pos + off] ?? this.tokens[this.tokens.length - 1]!;\n }\n private advance(): Tok {\n const t = this.tokens[this.pos]!;\n this.pos++;\n return t;\n }\n private consumeText(text: string): boolean {\n const t = this.peek();\n if (t.text === text) {\n this.pos++;\n return true;\n }\n return false;\n }\n private expectText(text: string): void {\n if (!this.consumeText(text)) {\n throw new Error(`expected '${text}' at token ${this.pos}`);\n }\n }\n\n /**\n * Parse the whole arrow function; accept two shapes:\n * `function (row) { return <expr>; }` — legacy fn form\n * `(row) => <expr-or-block>` — arrow form\n *\n * Returns null (via caller) on any unsupported shape.\n */\n parseTopLevel(): FilterExpr | null {\n try {\n // Skip an optional leading 'function' keyword and its name/params.\n if (this.peek().text === 'function') {\n this.advance(); // function\n // Optional name\n if (this.peek().kind === 'ident') this.advance();\n this.expectText('(');\n if (this.peek().kind !== 'ident') return null;\n this.paramName = this.advance().text;\n this.expectText(')');\n this.expectText('{');\n this.expectText('return');\n const expr = this.parseExpr();\n this.consumeText(';');\n this.expectText('}');\n return expr;\n }\n\n // Arrow: `row => expr`, `(row) => expr`, `(row) => { return expr; }`.\n if (this.consumeText('(')) {\n if (this.peek().kind !== 'ident') return null;\n this.paramName = this.advance().text;\n this.expectText(')');\n } else {\n if (this.peek().kind !== 'ident') return null;\n this.paramName = this.advance().text;\n }\n\n if (this.peek().kind !== 'arrow') return null;\n this.advance(); // =>\n\n if (this.consumeText('{')) {\n this.expectText('return');\n const expr = this.parseExpr();\n this.consumeText(';');\n this.expectText('}');\n return expr;\n }\n\n return this.parseExpr();\n } catch {\n return null;\n }\n }\n\n // OrExpr\n private parseExpr(): FilterExpr {\n let left = this.parseAnd();\n while (this.peek().text === '||') {\n this.advance();\n const right = this.parseAnd();\n left = { kind: 'or', args: flatten('or', [left, right]) };\n }\n return left;\n }\n\n private parseAnd(): FilterExpr {\n let left = this.parseNot();\n while (this.peek().text === '&&') {\n this.advance();\n const right = this.parseNot();\n left = { kind: 'and', args: flatten('and', [left, right]) };\n }\n return left;\n }\n\n private parseNot(): FilterExpr {\n if (this.peek().text === '!') {\n this.advance();\n const arg = this.parseNot();\n // Simplify `!(isNull)` → `isNotNull` and vice versa for tidy output.\n if (arg.kind === 'isNull') {\n return { kind: 'isNull', col: arg.col, negated: !arg.negated };\n }\n return { kind: 'not', arg };\n }\n return this.parseEquality();\n }\n\n private parseEquality(): FilterExpr {\n const left = this.parseRelational();\n const t = this.peek();\n if (t.text === '===' || t.text === '!==' || t.text === '==' || t.text === '!=') {\n this.advance();\n const right = this.parseRelational();\n return this.buildCompare(t.text, left, right);\n }\n // Bare column ref used as bool predicate: allowed (the DSL kernel\n // already supports `kind:'col'` standalone → `col === true`).\n return left;\n }\n\n private parseRelational(): FilterExpr {\n const left = this.parseUnary();\n const t = this.peek();\n if (t.text === '>' || t.text === '>=' || t.text === '<' || t.text === '<=') {\n this.advance();\n const right = this.parseUnary();\n return this.buildCompare(t.text, left, right);\n }\n return left;\n }\n\n private parseUnary(): FilterExpr {\n if (this.peek().text === '-') {\n this.advance();\n const next = this.peek();\n if (next.kind !== 'num') throw new Error('unary minus requires numeric literal');\n this.advance();\n return {\n kind: 'lit',\n value: -parseFloat(next.text),\n } as unknown as FilterExpr;\n }\n return this.parseAtom();\n }\n\n private parseAtom(): FilterExpr {\n const t = this.peek();\n\n if (t.kind === 'keyword') {\n if (t.text === 'true' || t.text === 'false') {\n this.advance();\n return { kind: 'lit', value: t.text === 'true' } as unknown as FilterExpr;\n }\n if (t.text === 'null' || t.text === 'undefined') {\n this.advance();\n return { kind: 'lit', value: null } as unknown as FilterExpr;\n }\n }\n\n if (t.kind === 'num') {\n this.advance();\n return { kind: 'lit', value: parseFloat(t.text) } as unknown as FilterExpr;\n }\n\n if (t.kind === 'str') {\n this.advance();\n return { kind: 'lit', value: t.text } as unknown as FilterExpr;\n }\n\n if (t.kind === 'punct' && t.text === '(') {\n this.advance();\n const inner = this.parseExpr();\n this.expectText(')');\n return inner;\n }\n\n // Identifier: must be the param name, followed by .field or [string].\n if (t.kind === 'ident') {\n if (t.text !== this.paramName) {\n // Outer-scope capture or other unsupported identifier.\n throw new Error(`unsupported identifier '${t.text}'`);\n }\n this.advance();\n const ref = this.parseColumnRef();\n // String-method tail: r.col.includes('x') / startsWith / endsWith.\n if (ref.kind === 'col' && this.peek().text === '.') {\n const strOp = this.parseStringMethodTail(ref);\n if (strOp) return strOp;\n // `.` after a column ref that isn't a known string method\n // means genuine nested field access — unsupported.\n throw new Error('nested field access unsupported');\n }\n return ref;\n }\n\n throw new Error(`unexpected token '${t.text}'`);\n }\n\n\n /**\n * After `ref = row.col`, peek a trailing `.method(...)` call. We only\n * recognize a narrow whitelist of String.prototype methods that map\n * cleanly to FilterExpr nodes. Returns null if the tail doesn't look\n * like any supported method call — the caller will then treat the\n * dangling `.` as unsupported nested access.\n */\n private parseStringMethodTail(col: ColumnRef): FilterExpr | null {\n // Save position so we can bail without consuming tokens.\n const saved = this.pos;\n if (this.peek().text !== '.') return null;\n this.advance();\n const method = this.peek();\n if (method.kind !== 'ident') {\n this.pos = saved;\n return null;\n }\n const name = method.text;\n // We only auto-compile fn-shapes that Function.toString() commonly\n // emits for the common text-search idioms.\n const MAPPING: Record<string, 'contains' | 'startsWith' | 'endsWith' | null> = {\n includes: 'contains',\n startsWith: 'startsWith',\n endsWith: 'endsWith',\n };\n const mapped = MAPPING[name];\n if (!mapped) {\n this.pos = saved;\n return null;\n }\n this.advance(); // consume method name\n if (this.peek().text !== '(') {\n this.pos = saved;\n return null;\n }\n this.advance();\n const arg = this.peek();\n if (arg.kind !== 'str') {\n // Only string-literal needles are supported; variables are captures.\n this.pos = saved;\n return null;\n }\n this.advance();\n // Optional second argument on startsWith/endsWith is an index; we\n // reject it because it would map to a substring match with offset,\n // which is unusual and not worth the code weight.\n if (this.peek().text === ',') {\n this.pos = saved;\n return null;\n }\n if (this.peek().text !== ')') {\n this.pos = saved;\n return null;\n }\n this.advance();\n return {\n kind: 'str',\n op: mapped,\n col,\n value: arg.text,\n };\n }\n private parseColumnRef(): FilterExpr {\n const t = this.peek();\n let colName: string;\n if (t.kind === 'punct' && t.text === '.') {\n this.advance();\n const id = this.advance();\n if (id.kind !== 'ident') throw new Error('expected identifier after .');\n colName = id.text;\n } else if (t.kind === 'punct' && t.text === '[') {\n this.advance();\n const lit = this.advance();\n if (lit.kind !== 'str') throw new Error('computed access must be string literal');\n colName = lit.text;\n this.expectText(']');\n } else {\n // Bare param (e.g., the fn `row => row` — nonsense as a predicate).\n throw new Error('bare param unsupported');\n }\n\n // TanStack builder functional callbacks receive a namespace object, e.g.\n // `ns => ns.users.active === true`. For a known single-source alias,\n // consume that namespace segment and lower the leaf column exactly like a\n // native `(row) => row.active === true` predicate.\n if (this.namespaceAlias !== null) {\n if (colName !== this.namespaceAlias) throw new Error(`unknown namespace '${colName}'`);\n this.expectText('.');\n const field = this.advance();\n if (field.kind !== 'ident') throw new Error('expected column after namespace alias');\n colName = field.text;\n }\n\n // Reject `row.x.y` / `row.x[0]` right here — a non-leaf chain is not a\n // supported column reference. The caller (`parseAtom`) handles the\n // special case of a trailing string method call (`row.x.includes(...)`);\n // everything else is a genuine nested access we cannot translate.\n const next = this.peek();\n if (next.text === '[') {\n throw new Error('nested index access unsupported');\n }\n if (next.text === '.') {\n // Delegate. Caller will try to recognize a string-method tail; if\n // that fails it will throw (via parseStringMethodTail returning\n // null + the caller re-throwing).\n }\n\n // Reject references to columns not present in the schema — those\n // would blow up the kernel compile, and we want the auto-compile\n // path to stay silent on unfamiliar shapes.\n if (this.knownColumns && !this.knownColumns.has(colName)) {\n throw new Error(`unknown column '${colName}'`);\n }\n\n return { kind: 'col', name: colName };\n }\n\n // Build a cmp node; rewrite `col ==/!== null` into isNull / isNotNull.\n private buildCompare(op: string, left: FilterExpr, right: FilterExpr): FilterExpr {\n const normOp = op === '==' ? '===' : op === '!=' ? '!==' : op;\n\n // Null-equality: column on one side, null literal on the other.\n const nullEq = detectNullEquality(left, right);\n if (nullEq) {\n return {\n kind: 'isNull',\n col: nullEq.col,\n negated: normOp === '!==' || normOp === '!=',\n };\n }\n\n const cmpOp = OP_TO_CMP[normOp];\n if (!cmpOp) throw new Error(`bad op '${op}'`);\n\n // We need col-vs-literal (or literal-vs-col, rewritten). col-vs-col\n // isn't supported by the kernel.\n const leftOp = asOperand(left);\n const rightOp = asOperand(right);\n if (!leftOp || !rightOp) throw new Error('operand not a column or literal');\n if (leftOp.kind === 'col' && rightOp.kind === 'col') {\n throw new Error('col vs col unsupported');\n }\n if (leftOp.kind === 'lit' && rightOp.kind === 'lit') {\n throw new Error('lit vs lit unsupported');\n }\n\n // Canonical form: column on the left. Flip cmp if literal is on the left.\n if (leftOp.kind === 'lit') {\n return {\n kind: 'cmp',\n op: flipOp(cmpOp),\n left: rightOp,\n right: leftOp,\n };\n }\n return { kind: 'cmp', op: cmpOp, left: leftOp, right: rightOp };\n }\n}\n\nconst OP_TO_CMP: Record<string, CmpOp | undefined> = {\n '===': 'eq',\n '!==': 'neq',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nfunction flipOp(op: CmpOp): CmpOp {\n switch (op) {\n case 'gt': return 'lt';\n case 'gte': return 'lte';\n case 'lt': return 'gt';\n case 'lte': return 'gte';\n default: return op;\n }\n}\n\nfunction asOperand(node: FilterExpr): Operand | null {\n if (node.kind === 'col') return node;\n // We synthesized lit nodes above — they share the FilterExpr union only\n // cosmetically (for parser internals). Detect them structurally.\n const raw = node as unknown as LiteralNode;\n if (raw.kind === 'lit') return raw;\n return null;\n}\n\nfunction detectNullEquality(\n left: FilterExpr,\n right: FilterExpr,\n): { col: ColumnRef } | null {\n const isNullLit = (n: FilterExpr): boolean => {\n const raw = n as unknown as LiteralNode;\n return raw.kind === 'lit' && raw.value === null;\n };\n if (left.kind === 'col' && isNullLit(right)) return { col: left };\n if (right.kind === 'col' && isNullLit(left)) return { col: right };\n return null;\n}\n\nfunction flatten(kind: 'and' | 'or', args: readonly FilterExpr[]): FilterExpr[] {\n const out: FilterExpr[] = [];\n for (const a of args) {\n if (a.kind === kind) out.push(...(a as { args: readonly FilterExpr[] }).args);\n else out.push(a);\n }\n return out;\n}\n\n// Re-export Scalar for callers who want to type-guard the synthetic lit shape.\nexport type { Scalar };\n","import type { Collection, RowValue } from '../collection/collection.js';\nimport type { ChangeEvent } from '../collection/events.js';\nimport { ValidationError } from '../errors.js';\nimport { trackRow, type DepSet } from './trackRow.js';\nimport type { FilterExpr } from './filter.js';\nimport { collectColumns } from './filter.js';\nimport {\n compileFilter,\n materialize,\n scanOrdinals,\n sortOrdinals,\n FilterCompileError,\n type CompiledFilter,\n} from './kernel.js';\nimport { tryCompileFnToFilterExpr } from './fnCompile.js';\n\nexport type Predicate = (row: RowValue) => boolean;\n\nexport type SortDir = 'asc' | 'desc';\n\n// ---------------------------------------------------------------------\n// Join-module indirection.\n//\n// query.ts and join.ts would otherwise import each other statically\n// (Query.join → JoinQuery; JoinQuery references Query). We break the\n// cycle with a one-time factory slot populated from join.ts's\n// side-effect-free top-level code.\n// ---------------------------------------------------------------------\n\nexport interface JoinSpecLike {\n readonly on: { readonly left: string; readonly right: string };\n readonly as: string;\n readonly type?: 'inner';\n}\n// We keep the return type loose here — callers who want the full\n// JoinQuery API should import `JoinQuery` from `arrowbase/query/join`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JoinQueryLike = any;\ntype JoinFactory = (left: Query, right: Collection, spec: JoinSpecLike) => JoinQueryLike;\nlet joinFactory: JoinFactory | null = null;\nexport function registerJoinFactory(factory: JoinFactory): void {\n joinFactory = factory;\n}\n\nexport interface OrderSpec {\n readonly column: string;\n readonly dir: SortDir;\n}\n\n/**\n * Immutable query spec. Each builder method returns a new Query. Deps are\n * either `'all'` (everything) or a concrete set of column names. When a\n * predicate is present and no explicit `.deps(...)` override was applied,\n * deps are inferred on first evaluation via the tracking proxy and grow\n * monotonically over time.\n */\nexport class Query<TRow extends RowValue = RowValue> {\n readonly collection: Collection;\n readonly predicate: Predicate | null;\n /** Column-op filter DSL expression (vectorizable). */\n readonly filterExpr: FilterExpr | null;\n readonly selection: readonly string[] | null;\n readonly order: readonly OrderSpec[];\n readonly limitN: number | null;\n readonly offsetN: number;\n /** Explicit deps override. If null, deps are inferred. */\n readonly explicitDeps: ReadonlySet<string> | null;\n\n constructor(\n collection: Collection,\n predicate: Predicate | null = null,\n selection: readonly string[] | null = null,\n order: readonly OrderSpec[] = [],\n limitN: number | null = null,\n offsetN = 0,\n explicitDeps: ReadonlySet<string> | null = null,\n filterExpr: FilterExpr | null = null,\n ) {\n this.collection = collection;\n this.predicate = predicate;\n this.filterExpr = filterExpr;\n this.selection = selection;\n this.order = order;\n this.limitN = limitN;\n this.offsetN = offsetN;\n this.explicitDeps = explicitDeps;\n }\n\n where(predicate: Predicate): Query<TRow> {\n // Chaining where() composes with AND.\n const next: Predicate = this.predicate\n ? (row) => this.predicate!(row) && predicate(row)\n : predicate;\n\n // Attempt to lower `predicate` into a FilterExpr so the vectorized\n // kernel handles it. On success, drop the fn path for this branch\n // (no double-apply). On failure, keep the fn as before.\n const lowered = tryCompileFnToFilterExpr(\n predicate as (row: Record<string, unknown>) => boolean,\n { knownColumns: new Set(this.collection.schema.columnsByName.keys()) },\n );\n const composedExpr: FilterExpr | null =\n lowered === null\n ? this.filterExpr\n : this.filterExpr\n ? { kind: 'and', args: [this.filterExpr, lowered] }\n : lowered;\n const keepFn = lowered === null;\n\n return new Query(\n this.collection,\n keepFn ? next : this.predicate,\n this.selection,\n this.order,\n this.limitN,\n this.offsetN,\n this.explicitDeps,\n composedExpr,\n );\n }\n\n /**\n * Add a vectorizable column-op filter. Composes with prior `filter()`\n * calls via AND. Anything that fits the `FilterExpr` DSL takes the\n * vectorized fast path in `QueryExecutor`; combine with `.where(fn)`\n * when you need an escape hatch for logic outside the DSL — the fast\n * path still runs first for the DSL portion.\n */\n filter(expr: FilterExpr): Query<TRow> {\n const next: FilterExpr = this.filterExpr\n ? { kind: 'and', args: [this.filterExpr, expr] }\n : expr;\n return new Query(\n this.collection,\n this.predicate,\n this.selection,\n this.order,\n this.limitN,\n this.offsetN,\n this.explicitDeps,\n next,\n );\n }\n\n select(columns: readonly string[]): Query<TRow> {\n for (const c of columns) this.requireKnownColumn(c);\n return new Query(\n this.collection,\n this.predicate,\n [...columns],\n this.order,\n this.limitN,\n this.offsetN,\n this.explicitDeps,\n this.filterExpr,\n );\n }\n\n orderBy(column: string, dir: SortDir = 'asc'): Query<TRow> {\n this.requireKnownColumn(column);\n return new Query(\n this.collection,\n this.predicate,\n this.selection,\n [...this.order, { column, dir }],\n this.limitN,\n this.offsetN,\n this.explicitDeps,\n this.filterExpr,\n );\n }\n\n limit(n: number): Query<TRow> {\n if (!Number.isInteger(n) || n < 0) {\n throw new ValidationError(`limit must be a non-negative integer, got ${n}`);\n }\n return new Query(\n this.collection,\n this.predicate,\n this.selection,\n this.order,\n n,\n this.offsetN,\n this.explicitDeps,\n this.filterExpr,\n );\n }\n\n offset(n: number): Query<TRow> {\n if (!Number.isInteger(n) || n < 0) {\n throw new ValidationError(`offset must be a non-negative integer, got ${n}`);\n }\n return new Query(\n this.collection,\n this.predicate,\n this.selection,\n this.order,\n this.limitN,\n n,\n this.explicitDeps,\n this.filterExpr,\n );\n }\n\n /**\n * Equijoin against another collection. Returns a `JoinQuery` that\n * exposes the post-join builder surface (where / select / orderBy /\n * limit / offset).\n *\n * ```ts\n * query(orders)\n * .filter(f('amount').gt(100))\n * .join(users, { on: { left: 'userId', right: '__id' }, as: 'user' })\n * .orderBy('user.name')\n * .select(['id', 'amount', 'user.name']);\n * ```\n *\n * Implementation: to avoid a static cycle between query.ts and\n * join.ts, join.ts registers its factory via `registerJoinFactory`\n * at module-load time. Importing `arrowbase` (or\n * `arrowbase/query/join`) before calling `.join()` is sufficient.\n */\n join(right: Collection, spec: JoinSpecLike): JoinQueryLike {\n if (!joinFactory) {\n throw new Error(\n `Query.join: join module not loaded. ` +\n `Import it (via \\`import 'arrowbase'\\` or \\`import { join } from 'arrowbase'\\`) before use.`,\n );\n }\n return joinFactory(this as unknown as Query, right, spec);\n }\n\n /**\n * Explicit dep override. Use this when:\n * - your predicate reads columns conditionally and you want stable deps\n * - you want to force reactivity on a superset of columns\n */\n deps(columns: readonly string[]): Query<TRow> {\n for (const c of columns) this.requireKnownColumn(c);\n return new Query(\n this.collection,\n this.predicate,\n this.selection,\n this.order,\n this.limitN,\n this.offsetN,\n new Set(columns),\n this.filterExpr,\n );\n }\n\n /** Columns that must be materialized for this query (deps + filter + selection + order). */\n requiredColumns(inferredDeps: ReadonlySet<string>): ReadonlySet<string> {\n const out = new Set<string>();\n const src = this.explicitDeps ?? inferredDeps;\n for (const c of src) out.add(c);\n if (this.filterExpr) collectColumns(this.filterExpr, out);\n if (this.selection) for (const c of this.selection) out.add(c);\n for (const o of this.order) out.add(o.column);\n return out;\n }\n\n // -----------------------------------------------------------------\n\n private requireKnownColumn(name: string): void {\n if (!this.collection.schema.columnsByName.has(name)) {\n throw new ValidationError(\n `unknown column \"${name}\" on collection \"${this.collection.schema.name}\"`,\n );\n }\n }\n}\n\n/**\n * Snapshot = result of evaluating a Query at a specific global version.\n * Rows are plain JS objects shaped by `selection` (or full rows if null).\n */\nexport interface QuerySnapshot<TRow extends RowValue = RowValue> {\n readonly rows: readonly TRow[];\n /** Collection.globalVersion at the moment of the snapshot. */\n readonly version: number;\n}\n\n/**\n * Executor = caches the last snapshot + dep set for a Query so we can skip\n * recomputation when only untouched columns changed.\n *\n * Executors are created by `run(query)` and held by callers (including the\n * subscribe wrapper below). A single Query instance may have multiple\n * executors in flight; each owns its own cache.\n */\nexport class QueryExecutor<TRow extends RowValue = RowValue> {\n private deps: DepSet = new Set();\n private cachedSnapshot: QuerySnapshot<TRow> | null = null;\n /** Per-column version seen at the time `cachedSnapshot` was produced. */\n private cachedVersions: Map<string, number> = new Map();\n /**\n * When the predicate trips (throws) during the tracking dry-run, we\n * fall back to `deps = all`. We still try inference again after the\n * predicate changes, but a single Query instance keeps this bit sticky.\n */\n private depsAreAll = false;\n /**\n * Inserts, deletes, and rollbacks invalidate any cached snapshot because\n * they may change the live row set even when no observed value column\n * moves (soft-delete notwithstanding). We flip this flag from a passive\n * change listener and clear it on recompute.\n */\n private staleFromInsertOrDelete = false;\n private readonly unsubscribePassive: () => void;\n\n constructor(readonly query: Query<TRow>) {\n if (query.explicitDeps) {\n for (const c of query.explicitDeps) this.deps.add(c);\n }\n // Seed deps with any filterExpr columns up front so `inferredDeps`\n // reflects what we actually watch even before the first recompute.\n // Essential when the fn-predicate was auto-lowered to a FilterExpr\n // and the fn-trace dep path never runs.\n if (query.filterExpr) {\n collectColumns(query.filterExpr, this.deps);\n }\n this.unsubscribePassive = query.collection.subscribe((event) => {\n if (event.op !== 'update') this.staleFromInsertOrDelete = true;\n });\n }\n\n /** Release the passive change listener. */\n dispose(): void {\n this.unsubscribePassive();\n }\n\n /** True if the cached snapshot is still valid given current column versions. */\n private cacheIsFresh(): boolean {\n if (!this.cachedSnapshot) return false;\n if (this.staleFromInsertOrDelete) return false;\n const c = this.query.collection;\n for (const name of this.observedColumns()) {\n if (!c.schema.columnsByName.has(name)) continue;\n const prev = this.cachedVersions.get(name);\n if (prev === undefined) return false;\n if (c.columnVersion(name) !== prev) return false;\n }\n return true;\n }\n\n /**\n * Columns this query observes for invalidation purposes. Includes:\n * - inferred or explicit deps (from predicate / .deps())\n * - selection columns (stale projection otherwise)\n * - order-by columns (stale sort otherwise)\n */\n private observedColumns(): Iterable<string> {\n if (this.depsAreAll) return this.query.collection.columnNames();\n const union = new Set<string>();\n const base = this.query.explicitDeps ?? this.deps;\n for (const c of base) union.add(c);\n if (this.query.filterExpr) collectColumns(this.query.filterExpr, union);\n if (this.query.selection) for (const c of this.query.selection) union.add(c);\n for (const o of this.query.order) union.add(o.column);\n return union;\n }\n\n /** Lazily compile the filterExpr. Cached for executor lifetime. */\n private compiledFilter: CompiledFilter | null = null;\n private compiledFilterExpr: FilterExpr | null = null;\n private compiledFilterError: Error | null = null;\n private getCompiledFilter(): CompiledFilter | null {\n const expr = this.query.filterExpr;\n if (!expr) return null;\n if (this.compiledFilterExpr === expr && this.compiledFilter) {\n return this.compiledFilter;\n }\n if (this.compiledFilterError) throw this.compiledFilterError;\n const c = this.query.collection;\n const scanByName = new Map<string, (typeof scanCols)[number]>();\n const scanCols = c._internalScanColumns();\n for (const sc of scanCols) scanByName.set(sc.name, sc);\n try {\n this.compiledFilter = compileFilter(expr, scanByName);\n this.compiledFilterExpr = expr;\n return this.compiledFilter;\n } catch (err) {\n if (err instanceof FilterCompileError) {\n this.compiledFilterError = err;\n }\n throw err;\n }\n }\n\n /** Recompute the snapshot, updating cache. */\n private recompute(): QuerySnapshot<TRow> {\n const q = this.query;\n const c = q.collection;\n const pred = q.predicate;\n const filterExpr = q.filterExpr;\n\n // Vectorized fast path kicks in when there is any filter expression\n // AND/OR no fn predicate. With both, we run the kernel first to cut\n // the row set cheaply, then evaluate fn pred on the shrunk set.\n let ordinals: Uint32Array;\n let needsFnPredicate = pred !== null;\n if (filterExpr) {\n const compiled = this.getCompiledFilter()!;\n ordinals = scanOrdinals(c._internalLiveOrdinals(), compiled.test);\n } else if (!pred) {\n // No filter at all: gather every live ordinal into a Uint32Array.\n ordinals = scanOrdinals(c._internalLiveOrdinals(), () => true);\n } else {\n // fn-only path: fall back to legacy row-materialization scan.\n ordinals = this.legacyScan();\n needsFnPredicate = false;\n }\n\n // If a fn predicate remains, evaluate it against the matched set.\n if (needsFnPredicate) {\n ordinals = this.applyFnPredicate(ordinals);\n }\n\n // Sort via kernel (falls through when order is empty).\n const scanByName = new Map<string, ReturnType<Collection['_internalScanColumns']>[number]>();\n for (const sc of c._internalScanColumns()) scanByName.set(sc.name, sc);\n const sorted = sortOrdinals(\n ordinals,\n q.order,\n scanByName,\n (row, col) => c._internalReadCell(col, row),\n );\n\n // Slice + project — we only materialize rows that survive the\n // limit window, avoiding the allocation cost of touching filtered\n // rows we never emit.\n const out = materialize(c, sorted, q.offsetN, q.limitN, q.selection) as TRow[];\n\n // Cache bookkeeping.\n this.cachedVersions.clear();\n for (const name of this.observedColumns()) {\n if (!c.schema.columnsByName.has(name)) continue;\n this.cachedVersions.set(name, c.columnVersion(name));\n }\n this.staleFromInsertOrDelete = false;\n const snap: QuerySnapshot<TRow> = {\n rows: out,\n version: c.globalVersion,\n };\n this.cachedSnapshot = snap;\n return snap;\n }\n\n /** Legacy scan: materialize + run fn predicate with dep tracking. Returns ordinals of survivors. */\n private legacyScan(): Uint32Array {\n const q = this.query;\n const c = q.collection;\n const pred = q.predicate!;\n const matched: number[] = [];\n let idx = 0;\n for (const row of c.rows()) {\n const rowOrdinal = this.getOrdinalFor(idx++, row);\n try {\n const tracked =\n q.explicitDeps || this.depsAreAll\n ? row\n : trackRow(row, this.deps);\n if (pred(tracked)) matched.push(rowOrdinal);\n } catch (err) {\n this.depsAreAll = true;\n try {\n if (pred(row)) matched.push(rowOrdinal);\n } catch {\n throw err;\n }\n }\n }\n return toU32(matched);\n }\n\n /**\n * Map the sequential index returned by `rows()` to the live row\n * ordinal. `rows()` yields in the same order as `_internalLiveOrdinals()`,\n * so we lazily keep a parallel ordinal buffer.\n */\n private cachedOrdinalBuffer: Uint32Array | null = null;\n private cachedOrdinalVersion = -1;\n private getOrdinalFor(idx: number, _row: RowValue): number {\n const c = this.query.collection;\n if (this.cachedOrdinalVersion !== c.globalVersion || !this.cachedOrdinalBuffer) {\n const arr: number[] = [];\n for (const r of c._internalLiveOrdinals()) arr.push(r);\n this.cachedOrdinalBuffer = toU32(arr);\n this.cachedOrdinalVersion = c.globalVersion;\n }\n return this.cachedOrdinalBuffer[idx] ?? -1;\n }\n\n /** Apply the fn predicate to a candidate ordinal set (post-kernel filter). */\n private applyFnPredicate(candidates: Uint32Array): Uint32Array {\n const q = this.query;\n const c = q.collection;\n const pred = q.predicate!;\n const kept: number[] = [];\n for (let i = 0; i < candidates.length; i++) {\n const ord = candidates[i]!;\n const row = this.materializeFullRow(ord);\n try {\n const tracked =\n q.explicitDeps || this.depsAreAll\n ? row\n : trackRow(row, this.deps);\n if (pred(tracked)) kept.push(ord);\n } catch (err) {\n this.depsAreAll = true;\n try {\n if (pred(row)) kept.push(ord);\n } catch {\n throw err;\n }\n }\n }\n return toU32(kept);\n }\n\n private materializeFullRow(ord: number): RowValue {\n const c = this.query.collection;\n const out: RowValue = {};\n for (const name of c.columnNames()) out[name] = c._internalReadCell(name, ord);\n return out;\n }\n\n /** Return a snapshot, reusing the cached one if all observed columns are unchanged. */\n snapshot(): QuerySnapshot<TRow> {\n if (this.cacheIsFresh()) return this.cachedSnapshot!;\n return this.recompute();\n }\n\n /**\n * Subscribe to reactive updates. `listener` fires once with the initial\n * snapshot and then again after every mutation that touches an observed\n * column. Returns an unsubscribe function.\n */\n subscribe(listener: (snap: QuerySnapshot<TRow>) => void): () => void {\n listener(this.snapshot());\n const unsub = this.query.collection.subscribe((event: ChangeEvent) => {\n if (!this.shouldReact(event)) return;\n listener(this.snapshot());\n });\n return unsub;\n }\n\n /** Visible for tests: introspect current inferred deps. */\n get inferredDeps(): ReadonlySet<string> {\n return this.deps;\n }\n\n get isDepsAll(): boolean {\n return this.depsAreAll;\n }\n\n private shouldReact(event: ChangeEvent): boolean {\n if (event.columns === 'all' || this.depsAreAll) return true;\n if (!this.cachedSnapshot) return true;\n if (\n event.op === 'insert' ||\n event.op === 'delete' ||\n event.op === 'rollback' ||\n event.op === 'compact'\n ) {\n return true;\n }\n const observed = new Set<string>(this.observedColumns());\n for (const c of event.columns) {\n if (observed.has(c)) return true;\n }\n return false;\n }\n}\n\n/** Shorthand entry point: `query(collection).where(...).select(...)`. */\nexport function query<TRow extends RowValue = RowValue>(\n collection: Collection,\n): Query<TRow> {\n return new Query<TRow>(collection);\n}\n\n/** Build an executor for a Query. */\nexport function run<TRow extends RowValue = RowValue>(\n q: Query<TRow>,\n): QueryExecutor<TRow> {\n return new QueryExecutor<TRow>(q);\n}\n\n// ----------------------------------------------------------------------\n\nfunction toU32(arr: readonly number[]): Uint32Array {\n const out = new Uint32Array(arr.length);\n for (let i = 0; i < arr.length; i++) out[i] = arr[i]!;\n return out;\n}\n","/**\n * React bindings for ArrowBase.\n *\n * Import subpath: `arrowbase/react`. React is an optional peerDependency —\n * add `react` (^18 or ^19) to your app's dependencies to use these hooks.\n *\n * Hooks use `useSyncExternalStore` so they are concurrent-mode safe, SSR\n * safe (provide a `getServerSnapshot` via `ssrRows` when needed), and\n * correctly batch with React's own scheduler.\n */\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from 'react';\n\nimport type { Collection, RowValue } from './collection/collection.js';\nimport {\n Query,\n QueryExecutor,\n run,\n type QuerySnapshot,\n} from './query/query.js';\n\n// ---------------------------------------------------------------------------\n// useLiveQuery\n// ---------------------------------------------------------------------------\n\n/**\n * Subscribe a React component to a Query. Returns the latest snapshot\n * (`{ rows, version }`); the component re-renders when the query's\n * observed columns change.\n *\n * The executor is created on first mount and cached for the lifetime of\n * the owning component (not the Query instance). When the query\n * identity changes between renders, a fresh executor is created and\n * the previous one is disposed.\n *\n * ```tsx\n * const q = useMemo(() => query(users).filter(fEq(f('active'), true)), [users]);\n * const { rows } = useLiveQuery(q);\n * return <ul>{rows.map(r => <li key={r.__id}>{r.name}</li>)}</ul>;\n * ```\n *\n * The snapshot `rows` reference is stable across renders when the\n * executor determined nothing changed (internal caching), so users can\n * pass it directly into `React.memo`'d children without extra memo.\n */\nexport function useLiveQuery<TRow extends RowValue>(\n query: Query<TRow>,\n options: UseLiveQueryOptions<TRow> = {},\n): QuerySnapshot<TRow> {\n const executor = useExecutorForQuery(query);\n return useExecutorSnapshot(executor, options);\n}\n\nexport interface UseLiveQueryOptions<TRow extends RowValue> {\n /** Value returned during SSR. Defaults to an empty-rows snapshot. */\n readonly ssrSnapshot?: QuerySnapshot<TRow>;\n}\n\n// ---------------------------------------------------------------------------\n// useLiveQueryResult — builder closure variant\n// ---------------------------------------------------------------------------\n\n/**\n * Builder-closure variant. Accepts a function that composes a Query\n * (typically a `.filter().orderBy()...` chain) and a dependency array\n * for when to rebuild. This avoids making callers memoize the Query\n * object themselves.\n *\n * ```tsx\n * const { rows } = useLiveQueryResult(\n * users,\n * (q) => q.filter(fEq(f('team'), team)).orderBy('name'),\n * [team],\n * );\n * ```\n */\nexport function useLiveQueryResult<TRow extends RowValue>(\n collection: Collection,\n build: (q: Query<TRow>) => Query<TRow>,\n deps: readonly unknown[] = [],\n options: UseLiveQueryOptions<TRow> = {},\n): QuerySnapshot<TRow> {\n // useMemo with an explicit deps array; the builder itself may close\n // over variables but React cannot introspect them, so the caller\n // passes `deps` like any other hook.\n const query = useMemo(\n () => build(new Query<TRow>(collection)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [collection, ...deps],\n );\n const executor = useExecutorForQuery(query);\n return useExecutorSnapshot(executor, options);\n}\n\n// ---------------------------------------------------------------------------\n// useCollectionVersion — thin subscription to globalVersion\n// ---------------------------------------------------------------------------\n\n/**\n * Subscribe to a collection's `globalVersion`. Returns a monotonically\n * increasing number that bumps on every mutation. Useful as a cache-bust\n * key or a dependency to other hooks.\n */\nexport function useCollectionVersion(collection: Collection): number {\n const subscribe = useCallback(\n (onChange: () => void) => collection.subscribe(() => onChange()),\n [collection],\n );\n const getSnapshot = useCallback(() => collection.globalVersion, [collection]);\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n// ---------------------------------------------------------------------------\n// internal: executor lifecycle + snapshot wiring\n// ---------------------------------------------------------------------------\n\n/**\n * Hold a single QueryExecutor per Query identity. When the Query\n * identity changes, dispose the old executor before creating a new one.\n */\nfunction useExecutorForQuery<TRow extends RowValue>(\n query: Query<TRow>,\n): QueryExecutor<TRow> {\n // Keep a per-component ref to the { query, executor } pair so we can\n // lazily create and dispose as identity changes.\n const ref = useRef<{\n query: Query<TRow>;\n executor: QueryExecutor<TRow>;\n } | null>(null);\n\n if (ref.current === null || ref.current.query !== query) {\n if (ref.current) ref.current.executor.dispose();\n ref.current = { query, executor: run(query) };\n }\n\n return ref.current.executor;\n}\n\n/**\n * Connect a QueryExecutor to React's concurrent-mode store protocol.\n *\n * The subscribe callback that `useSyncExternalStore` gives us is just\n * `onStoreChange: () => void` — executor.subscribe wants a\n * `(snap) => void` listener and replays the current snapshot\n * synchronously on subscribe. We wrap it: ignore the initial replay\n * (which would defeat useSyncExternalStore's own initial-snapshot\n * contract) and forward subsequent fires as no-arg notifications.\n */\nfunction useExecutorSnapshot<TRow extends RowValue>(\n executor: QueryExecutor<TRow>,\n options: UseLiveQueryOptions<TRow>,\n): QuerySnapshot<TRow> {\n const subscribe = useCallback(\n (onChange: () => void) => {\n let seenInitial = false;\n return executor.subscribe(() => {\n if (!seenInitial) {\n seenInitial = true;\n return;\n }\n onChange();\n });\n },\n [executor],\n );\n\n const getSnapshot = useCallback(() => executor.snapshot(), [executor]);\n\n const getServerSnapshot = useCallback(\n () => options.ssrSnapshot ?? EMPTY_SNAPSHOT_TYPED<TRow>(),\n [options.ssrSnapshot],\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n\nconst EMPTY_SNAPSHOT: QuerySnapshot<RowValue> = Object.freeze({\n rows: Object.freeze([]) as readonly RowValue[],\n version: 0,\n});\n\nfunction EMPTY_SNAPSHOT_TYPED<TRow extends RowValue>(): QuerySnapshot<TRow> {\n // The frozen shape is compatible; cast is safe because the rows array\n // is empty and never mutated.\n return EMPTY_SNAPSHOT as QuerySnapshot<TRow>;\n}\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CollectionConfig } from '@tanstack/db';
|
|
2
|
+
import { C as Collection, R as RowValue } from './collection-DGlKgOGi.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* TanStack DB adapter for ArrowBase.
|
|
6
|
+
*
|
|
7
|
+
* Exposes an ArrowBase `Collection` as a standard `@tanstack/db`
|
|
8
|
+
* `createCollection({ sync, onInsert, onUpdate, onDelete, getKey })` config
|
|
9
|
+
* so the two stores can be joined via TanStack DB's live query engine.
|
|
10
|
+
*
|
|
11
|
+
* Design notes:
|
|
12
|
+
* - `@tanstack/db` is an optional peer dependency. This module only
|
|
13
|
+
* imports its *types* (erased at build time) and its value exports
|
|
14
|
+
* are resolved by the consumer. Import this module via the
|
|
15
|
+
* `arrowbase/tanstack` subpath only when you intend to use TanStack
|
|
16
|
+
* DB; the main `arrowbase` entry stays TanStack-free.
|
|
17
|
+
* - Rows handed to TanStack DB are plain JS objects (a snapshot from
|
|
18
|
+
* ArrowBase). The zero-copy proxy idea from PRD v2.0 was dropped in
|
|
19
|
+
* v2.1 because TanStack caches values internally.
|
|
20
|
+
* - Row-update mode is 'full' — every sync write carries a full row
|
|
21
|
+
* snapshot. `partial` would require TanStack DB to merge deltas
|
|
22
|
+
* against its cached value, but we always have the full current
|
|
23
|
+
* value from ArrowBase, so 'full' is simpler and correct.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** Options for the adapter. */
|
|
27
|
+
interface ToTanstackOptions {
|
|
28
|
+
/**
|
|
29
|
+
* TanStack DB collection id. Defaults to `arrowbase:<schema.name>`.
|
|
30
|
+
*/
|
|
31
|
+
id?: string;
|
|
32
|
+
/**
|
|
33
|
+
* When true, include soft-deleted rows in sync. Default false (the
|
|
34
|
+
* adapter filters them out, matching `Collection.rows()` semantics).
|
|
35
|
+
*/
|
|
36
|
+
includeSoftDeleted?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Convert an ArrowBase collection into a TanStack DB `CollectionConfig`.
|
|
40
|
+
*
|
|
41
|
+
* Usage:
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { createCollection } from '@tanstack/db';
|
|
44
|
+
* import { toTanstackCollection } from 'arrowbase/tanstack';
|
|
45
|
+
*
|
|
46
|
+
* const features = createCollection(toTanstackCollection(abFeatures));
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare function toTanstackCollection(abColl: Collection, options?: ToTanstackOptions): CollectionConfig<RowValue, number>;
|
|
50
|
+
|
|
51
|
+
export { type ToTanstackOptions, toTanstackCollection };
|