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/schema/types.ts","../src/sab/atomics.ts","../src/sab/segment.ts","../src/query/ir.ts","../src/query/ref-proxy.ts","../src/geo/point-column.ts","../src/geo/bbox.ts","../src/geo/distance.ts","../src/geo/polygon-column.ts","../src/geo/point-in-polygon.ts","../src/query/compiler.ts","../src/indexes/comparison.ts","../src/indexes/base-index.ts","../src/indexes/basic-index.ts","../src/indexes/index-registry.ts","../src/indexes/auto-index.ts","../src/collection/rowIndex.ts","../src/collection/undoRing.ts","../src/collection/events.ts","../src/collection/typedEmitter.ts","../src/transactions.ts","../src/collection/varlen.ts","../src/collection/listChild.ts","../src/collection/metadata.ts","../src/geo/linestring-column.ts","../src/geo/rtree.ts","../src/collection/collection.ts","../src/schema/schema.ts","../src/arrow.ts"],"names":["total"],"mappings":"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","file":"arrow.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 * 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 * Helpers for atomic / packed 64-bit access and seqlock-style reads.\n *\n * Phase 1 is single-writer within a process; these helpers exist so we can\n * evolve toward multi-writer and cross-worker use without refactoring the\n * collection layer.\n */\n\n/** Align a byte offset up to the given power-of-two boundary. */\nexport function alignUp(value: number, alignment: number): number {\n if ((alignment & (alignment - 1)) !== 0) {\n throw new Error(`alignment must be a power of two, got ${alignment}`);\n }\n return (value + alignment - 1) & ~(alignment - 1);\n}\n\n/** Arrow buffer alignment — 64 bytes per Arrow columnar format spec. */\nexport const ARROW_ALIGN = 64;\n\n/** Read a u64 from an Int32Array-backed view without BigInt64Array. */\nexport function readU64LE(i32: Int32Array, wordIndex: number): bigint {\n const lo = BigInt(i32[wordIndex]! >>> 0);\n const hi = BigInt(i32[wordIndex + 1]! >>> 0);\n return (hi << 32n) | lo;\n}\n\n/** Write a u64 into an Int32Array-backed view. */\nexport function writeU64LE(\n i32: Int32Array,\n wordIndex: number,\n value: bigint,\n): void {\n const lo = Number(value & 0xffffffffn) | 0;\n const hi = Number((value >> 32n) & 0xffffffffn) | 0;\n i32[wordIndex] = lo;\n i32[wordIndex + 1] = hi;\n}\n\n/** Atomically increment a u32 word, returning the new value. */\nexport function atomicIncU32(i32: Int32Array, wordIndex: number): number {\n // Treat as unsigned; Atomics.add returns the previous value.\n return (Atomics.add(i32, wordIndex, 1) + 1) >>> 0;\n}\n\n/** Atomically load a u32 word. */\nexport function atomicLoadU32(i32: Int32Array, wordIndex: number): number {\n return Atomics.load(i32, wordIndex) >>> 0;\n}\n\n/** Atomically store a u32 word. */\nexport function atomicStoreU32(\n i32: Int32Array,\n wordIndex: number,\n value: number,\n): void {\n Atomics.store(i32, wordIndex, value | 0);\n}\n","import { OutOfSpaceError } from '../errors.js';\nimport { ARROW_ALIGN, alignUp } from './atomics.js';\n\n/**\n * A Segment wraps a single SharedArrayBuffer (or ArrayBuffer fallback) and\n * manages bump allocation inside it. Allocations are 64-byte aligned to\n * satisfy Arrow buffer alignment.\n *\n * Phase 1 uses only a bump allocator; freelist / compaction lands later.\n */\nexport class Segment {\n readonly buffer: SharedArrayBuffer | ArrayBuffer;\n readonly byteLength: number;\n private cursor: number;\n\n constructor(\n buffer: SharedArrayBuffer | ArrayBuffer,\n /** Initial cursor position. Useful when rehydrating from a handoff. */\n initialCursor = 0,\n ) {\n this.buffer = buffer;\n this.byteLength = buffer.byteLength;\n if (initialCursor < 0 || initialCursor > this.byteLength) {\n throw new RangeError(\n `initialCursor ${initialCursor} out of range [0, ${this.byteLength}]`,\n );\n }\n this.cursor = initialCursor;\n }\n\n /** Remaining byte capacity from the current cursor. */\n get remaining(): number {\n return this.byteLength - this.cursor;\n }\n\n /** Current bump cursor (byte offset of next allocation). */\n get used(): number {\n return this.cursor;\n }\n\n /**\n * Allocate `byteLength` bytes aligned to `alignment` (default Arrow 64B).\n * Returns the starting byte offset inside `buffer`.\n * Throws `OutOfSpaceError` if the segment cannot fit the request.\n */\n allocate(byteLength: number, alignment: number = ARROW_ALIGN): number {\n if (byteLength < 0 || !Number.isInteger(byteLength)) {\n throw new RangeError(`byteLength must be a non-negative integer`);\n }\n const aligned = alignUp(this.cursor, alignment);\n const end = aligned + byteLength;\n if (end > this.byteLength) {\n throw new OutOfSpaceError(\n `segment allocate(${byteLength}) failed: used=${this.cursor}, cap=${this.byteLength}`,\n );\n }\n this.cursor = end;\n return aligned;\n }\n\n /** Return the underlying buffer as a typed view slice (copies the handle only). */\n u8View(offset = 0, byteLength = this.byteLength - offset): Uint8Array {\n return new Uint8Array(this.buffer, offset, byteLength);\n }\n\n i32View(offset = 0, length?: number): Int32Array {\n const l = length ?? (this.byteLength - offset) >>> 2;\n return new Int32Array(this.buffer, offset, l);\n }\n}\n\n/** Create a Segment backed by SAB if available, else a plain ArrayBuffer. */\nexport function createSegment(byteLength: number): Segment {\n const buf = canUseSab()\n ? new SharedArrayBuffer(byteLength)\n : new ArrayBuffer(byteLength);\n return new Segment(buf);\n}\n\nfunction canUseSab(): boolean {\n // `SharedArrayBuffer` may be undefined in test or hardened environments.\n return typeof SharedArrayBuffer !== 'undefined';\n}\n","/**\n * Query IR — `@tanstack/db` parity.\n *\n * This module mirrors `@tanstack/db/dist/esm/query/ir.d.ts` field-for-\n * field. Expression classes carry `type` brands matching upstream\n * ('collectionRef', 'queryRef', 'ref', 'val', 'func', 'agg',\n * 'includesSubquery') so that code that walks the IR by `type` tag\n * works identically on either runtime.\n *\n * We deliberately do NOT import from `@tanstack/db` here — Layer C\n * has zero runtime dep on upstream (types only). Field names are\n * kept identical for structural interop; semantic behavior for\n * Layer-C-unsupported features (IncludesSubquery, residual WHERE) is\n * defined but not yet compiled.\n */\n\nimport type { Collection } from '../collection/collection.js';\nimport type { StringCollationConfig } from '../tanstack-types.js';\n\n// ---------------------------------------------------------------------\n// Top-level IR\n// ---------------------------------------------------------------------\n\n/** A row keyed by source alias. Mirrors `@tanstack/db`'s `NamespacedRow`. */\nexport type NamespacedRow = Record<string, Record<string, unknown>>;\n\n/**\n * Root IR shape for a query. Every builder emits a `QueryIR` via\n * `_getQuery()`; every compiler consumes one. Matches\n * `@tanstack/db`'s `QueryIR` field-for-field.\n */\nexport interface QueryIR {\n from: From;\n select?: Select;\n join?: Join;\n where?: Array<Where>;\n groupBy?: GroupBy;\n having?: Array<Having>;\n orderBy?: OrderBy;\n limit?: Limit;\n offset?: Offset;\n distinct?: true;\n singleResult?: true;\n /**\n * Functional SELECT — JS closure invoked per row. Bypasses the\n * vectorized compile path; used by `builder.fn.select(cb)`.\n */\n fnSelect?: (row: NamespacedRow) => unknown;\n /**\n * Functional WHERE — JS closure invoked per row. ANDed with any\n * structural `where` entries. Populated by `builder.fn.where(cb)`.\n */\n fnWhere?: Array<(row: NamespacedRow) => unknown>;\n /**\n * Functional HAVING — evaluated against grouped rows. Populated by\n * `builder.fn.having(cb)`.\n */\n fnHaving?: Array<(row: NamespacedRow) => unknown>;\n}\n\n/**\n * Materialization strategy for `IncludesSubquery`. Layer F owns\n * the runtime; Layer C accepts the tag structurally.\n */\nexport type IncludesMaterialization = 'collection' | 'array' | 'concat' | 'single';\n\n/**\n * Synthetic field name used by `IncludesSubquery` scalar paths.\n * Matches upstream literal ('__includes_scalar__').\n */\nexport const INCLUDES_SCALAR_FIELD = '__includes_scalar__';\n\nexport type From = CollectionRef | QueryRef;\n\nexport type Select = {\n [alias: string]: BasicExpression | Aggregate | Select | IncludesSubquery;\n};\n\nexport type Join = Array<JoinClause>;\n\nexport interface JoinClause {\n from: CollectionRef | QueryRef;\n type: 'left' | 'right' | 'inner' | 'outer' | 'full' | 'cross';\n left: BasicExpression;\n right: BasicExpression;\n}\n\n/**\n * A WHERE clause entry. Either a bare expression or a\n * `{ expression, residual? }` object. The `residual` flag marks\n * a predicate that the optimizer couldn't push into an index scan\n * — present for interop; Layer C treats residual and non-residual\n * identically (Layer D's index optimizer will start emitting them).\n */\nexport type Where =\n | BasicExpression<boolean>\n | {\n expression: BasicExpression<boolean>;\n residual?: boolean;\n };\n\nexport type GroupBy = Array<BasicExpression>;\nexport type Having = Where;\n\nexport type OrderBy = Array<OrderByClause>;\nexport interface OrderByClause {\n expression: BasicExpression;\n compareOptions: CompareOptions;\n}\n\nexport type OrderByDirection = 'asc' | 'desc';\n\n/**\n * Full compare options for an orderBy expression. Extends the\n * shared string-collation config with direction + null-sort mode.\n * Matches `@tanstack/db`'s `CompareOptions`.\n */\nexport type CompareOptions = StringCollationConfig & {\n direction: OrderByDirection;\n nulls: 'first' | 'last';\n};\n\nexport type Limit = number;\nexport type Offset = number;\n\n// ---------------------------------------------------------------------\n// Expression classes\n// ---------------------------------------------------------------------\n\n/**\n * Common base for every IR expression node. Carries a `type` brand\n * checked by `isExpressionLike` and the compiler's walk.\n */\nabstract class BaseExpression<T = unknown> {\n abstract type: string;\n /** @internal — phantom type carrier for TS inference. */\n readonly __returnType!: T;\n}\n\n/** Reference to a base Collection at a given alias. */\nexport class CollectionRef extends BaseExpression {\n readonly type = 'collectionRef' as const;\n constructor(\n public collection: Collection,\n public alias: string,\n ) {\n super();\n }\n}\n\n/** Reference to a subquery (nested `QueryIR`) at a given alias. */\nexport class QueryRef extends BaseExpression {\n readonly type = 'queryRef' as const;\n constructor(\n public query: QueryIR,\n public alias: string,\n ) {\n super();\n }\n}\n\n/** Column / property reference. `path = ['alias', 'col', 'nested']`. */\nexport class PropRef<T = unknown> extends BaseExpression<T> {\n readonly type = 'ref' as const;\n constructor(public path: Array<string>) {\n super();\n }\n}\n\n/** Literal value wrapped as an expression. */\nexport class Value<T = unknown> extends BaseExpression<T> {\n readonly type = 'val' as const;\n constructor(public value: T) {\n super();\n }\n}\n\n/**\n * Scalar function call. `name` is one of the upstream operator\n * literals ('eq' / 'gt' / 'upper' / etc.); `args` are expressions.\n */\nexport class Func<T = unknown> extends BaseExpression<T> {\n readonly type = 'func' as const;\n constructor(\n public name: string,\n public args: Array<BasicExpression>,\n ) {\n super();\n }\n}\n\nexport type BasicExpression<T = unknown> = PropRef<T> | Value<T> | Func<T>;\n\n/**\n * Aggregate function call. Separated from `Func` because aggregates\n * can appear in `select` / `having` but not in `where`. Name is\n * 'count' / 'sum' / 'avg' / 'min' / 'max'.\n */\nexport class Aggregate<T = unknown> extends BaseExpression<T> {\n readonly type = 'agg' as const;\n constructor(\n public name: string,\n public args: Array<BasicExpression>,\n ) {\n super();\n }\n}\n\n/**\n * Correlated subquery projected into a parent select clause.\n * Full runtime lands in Layer F (IVM); the class shape is shipped\n * now so IR walkers can skip it cleanly.\n */\nexport class IncludesSubquery extends BaseExpression {\n readonly type = 'includesSubquery' as const;\n constructor(\n /** Child query, with the correlation predicate stripped. */\n public query: QueryIR,\n /** Parent-side correlation ref (e.g. `project.id`). */\n public correlationField: PropRef,\n /** Child-side correlation ref (e.g. `issue.projectId`). */\n public childCorrelationField: PropRef,\n /** Result field name on the parent row (e.g. `\"issues\"`). */\n public fieldName: string,\n /** Parent-scope WHERE clauses to apply post-join. */\n public parentFilters?: Array<Where>,\n /** Parent-scope refs consumed by `parentFilters`. */\n public parentProjection?: Array<PropRef>,\n /** Shape of the projected result. Default 'collection'. */\n public materialization: IncludesMaterialization = 'collection',\n /** Field name when materialization is 'concat' scalar. */\n public scalarField?: string,\n ) {\n super();\n }\n}\n\n// ---------------------------------------------------------------------\n// Runtime helpers (mirrors @tanstack/db)\n// ---------------------------------------------------------------------\n\n/**\n * Detects whether `value` is an IR expression object. Used by ref-\n * proxy conversion and compiler walks. Matches upstream semantics.\n */\nexport function isExpressionLike(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const t = (value as { type?: unknown }).type;\n return (\n t === 'ref' ||\n t === 'val' ||\n t === 'func' ||\n t === 'agg' ||\n t === 'collectionRef' ||\n t === 'queryRef' ||\n t === 'includesSubquery'\n );\n}\n\nfunction isWrappedWhere(where: Where): where is { expression: BasicExpression<boolean>; residual?: boolean } {\n return where !== null && typeof where === 'object' && Object.prototype.hasOwnProperty.call(where, 'expression');\n}\n\n/** Extract the boolean expression from a `Where` entry. */\nexport function getWhereExpression(where: Where): BasicExpression<boolean> {\n if (isWrappedWhere(where)) {\n return where.expression;\n }\n return where as BasicExpression<boolean>;\n}\n\n/**\n * Extract the expression from a `Having` entry. HAVING clauses may\n * contain aggregates, unlike plain WHERE.\n */\nexport function getHavingExpression(\n having: Having,\n): BasicExpression | Aggregate {\n if (isWrappedWhere(having)) {\n return having.expression;\n }\n return having as BasicExpression | Aggregate;\n}\n\n/** Is this `Where` entry marked residual (post-index-scan)? */\nexport function isResidualWhere(where: Where): boolean {\n return (\n where !== null &&\n typeof where === 'object' &&\n 'expression' in where &&\n where.residual === true\n );\n}\n\n/** Wrap a bare boolean expression as a residual `Where`. */\nexport function createResidualWhere(\n expression: BasicExpression<boolean>,\n): Where {\n return { expression, residual: true };\n}\n\n/**\n * Walk a `PropRef`'s first alias segment back through any\n * enclosing `QueryRef`s to reach the underlying `Collection` and\n * the remaining column-path. Returns `undefined` if the ref can't\n * be resolved to a collection (e.g. it points at a computed\n * SELECT field; Layer F's optimizer is the only caller today).\n */\nexport function followRef(\n query: QueryIR,\n ref: PropRef<unknown>,\n collection: Collection,\n):\n | {\n collection: Collection;\n path: Array<string>;\n }\n | undefined {\n if (ref.path.length === 0) return undefined;\n const [alias, ...rest] = ref.path;\n if (alias === undefined) return undefined;\n\n const from = query.from;\n if (from.type === 'collectionRef' && from.alias === alias) {\n return { collection: from.collection, path: rest };\n }\n if (from.type === 'queryRef' && from.alias === alias) {\n // Subquery path: recurse into the nested query using the same\n // starting collection. This is best-effort in Layer C; Layer F\n // hardens it against nested subqueries and computed SELECTs.\n const inner: PropRef<unknown> = new PropRef(rest);\n return followRef(from.query, inner, collection);\n }\n // Joins: scan clauses for a matching alias.\n if (query.join) {\n for (const j of query.join) {\n if (j.from.type === 'collectionRef' && j.from.alias === alias) {\n return { collection: j.from.collection, path: rest };\n }\n if (j.from.type === 'queryRef' && j.from.alias === alias) {\n const inner: PropRef<unknown> = new PropRef(rest);\n return followRef(j.from.query, inner, collection);\n }\n }\n }\n return undefined;\n}\n","/**\n * Ref proxies — `@tanstack/db` parity (Layer C.2).\n *\n * A ref proxy is a JS Proxy that records every property access as a\n * path segment, materialized into a `PropRef` by `toExpression`.\n * Every builder callback (`where`, `select`, `orderBy`, etc.) is\n * passed either:\n * - a root proxy (multiple aliases): `({ users, posts }) => eq(users.id, posts.userId)`\n * - a single-row proxy: `(row) => row.name`\n * - a with-selected proxy: `({ posts, $selected }) => $selected.count`\n *\n * Runtime matches `@tanstack/db/query/builder/ref-proxy.js` gesture-\n * for-gesture; type layer is looser (we use `any` in a few places\n * where upstream's inference is too deep for our scope). The\n * conformance test in C.11 catches meaningful regressions.\n */\n\nimport {\n Func,\n isExpressionLike,\n PropRef,\n Value,\n type BasicExpression,\n} from './ir.js';\n\n// ---------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------\n\n/**\n * Brand carried by every ref-proxy leaf. Matches upstream's\n * `RefProxy<T>` shape; `__path` is the access trail.\n */\nexport interface RefProxy<T = unknown> {\n /** @internal */\n readonly __refProxy: true;\n /** @internal */\n readonly __path: Array<string>;\n /** @internal — phantom type for TS inference. */\n readonly __type: T;\n}\n\n/**\n * A leaf in a ref proxy tree — wraps a scalar `T` and carries\n * `__path` + `__refProxy`. Used by the deep-mapped\n * `SingleRowRefProxy` to type column access.\n */\nexport type RefLeaf<T = unknown> = RefProxy<T> & {\n // Phantom — prevents RefLeaf from collapsing with RefProxy in\n // conditional types that distinguish them.\n readonly __refLeaf: true;\n};\n\n/**\n * Virtual row properties exposed on every single-row proxy for\n * parity with `@tanstack/db`. Runtime compilation of these is\n * Layer H; Layer C accepts them structurally so callers can write\n * code referencing `row.$key` etc. without tripping the IR.\n */\nexport type VirtualPropsRefProxy<TKey extends string | number = string | number> = {\n readonly $synced: RefLeaf<boolean>;\n readonly $origin: RefLeaf<'sync' | 'optimistic'>;\n readonly $key: RefLeaf<TKey>;\n readonly $collectionId: RefLeaf<string>;\n};\n\n/**\n * Deep-mapped: each scalar column becomes a `RefLeaf<T>`; each\n * object column recurses. Matches `@tanstack/db`'s\n * `SingleRowRefProxy` shape. Used for single-row callbacks\n * (`fn.select`, `fn.where`, `fn.having`) and inside index\n * expression evaluators.\n */\nexport type SingleRowRefProxy<\n T,\n TKey extends string | number = string | number,\n> = T extends Record<string, unknown>\n ? {\n readonly [K in keyof T]: T[K] extends Record<string, unknown>\n ? SingleRowRefProxy<T[K], TKey> & RefProxy<T[K]>\n : RefLeaf<T[K]>;\n } & RefProxy<T> &\n VirtualPropsRefProxy<TKey>\n : RefProxy<T> & VirtualPropsRefProxy<TKey>;\n\n/** TanStack-style public ref alias. */\nexport type Ref<T = unknown> = T extends Record<string, unknown>\n ? SingleRowRefProxy<T>\n : RefLeaf<T>;\n\n// ---------------------------------------------------------------------\n// Runtime\n// ---------------------------------------------------------------------\n\n/**\n * Create a single-row ref proxy. Every property access records a\n * path segment and returns a nested proxy (memoized per-path).\n *\n * Matches `@tanstack/db`'s `createSingleRowRefProxy<T>()` runtime\n * byte-for-byte (modulo style).\n */\nexport function createSingleRowRefProxy<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): SingleRowRefProxy<T> {\n const cache = new Map<string, unknown>();\n function createProxy(path: Array<string>): unknown {\n const pathKey = path.join('.');\n if (cache.has(pathKey)) {\n return cache.get(pathKey);\n }\n const proxy = new Proxy(\n {},\n {\n get(target, prop, receiver) {\n if (prop === '__refProxy') return true;\n if (prop === '__path') return path;\n if (prop === '__type') return undefined;\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n return createProxy([...path, String(prop)]);\n },\n has(target, prop) {\n if (prop === '__refProxy' || prop === '__path' || prop === '__type') {\n return true;\n }\n return Reflect.has(target, prop);\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n if (prop === '__refProxy' || prop === '__path' || prop === '__type') {\n return { enumerable: false, configurable: true };\n }\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n },\n );\n cache.set(pathKey, proxy);\n return proxy;\n }\n return createProxy([]) as SingleRowRefProxy<T>;\n}\n\n/**\n * Root-level ref proxy shape: each declared alias is exposed as a\n * `SingleRowRefProxy<T[alias]>`. The root itself is branded as a\n * `RefProxy`.\n */\nexport type RootRefProxy<T extends Record<string, Record<string, unknown>>> =\n RefProxy<T> & {\n readonly [K in keyof T]: SingleRowRefProxy<T[K]>;\n };\n\n/**\n * Create a root ref proxy scoped to a set of table aliases. The\n * root proxy exposes each alias as a nested single-row proxy;\n * path segments accumulate alias + column + (nested...) and are\n * materialized by `toExpression`.\n *\n * Matches `@tanstack/db`'s `createRefProxy<T>(aliases)` runtime.\n */\nexport function createRefProxy<\n T extends Record<string, Record<string, unknown>> = Record<\n string,\n Record<string, unknown>\n >,\n>(aliases: Array<string>): RootRefProxy<T> {\n const cache = new Map<string, unknown>();\n let accessId = 0;\n\n function createProxy(path: Array<string>): unknown {\n const pathKey = path.join('.');\n if (cache.has(pathKey)) {\n return cache.get(pathKey);\n }\n const proxy = new Proxy(\n {} as Record<string | symbol, unknown>,\n {\n get(target, prop, receiver) {\n if (prop === '__refProxy') return true;\n if (prop === '__path') return path;\n if (prop === '__type') return undefined;\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n return createProxy([...path, String(prop)]);\n },\n has(target, prop) {\n if (prop === '__refProxy' || prop === '__path' || prop === '__type') {\n return true;\n }\n return Reflect.has(target, prop);\n },\n ownKeys(target) {\n // TanStack defines a fresh sentinel key on each ownKeys\n // read to prevent spread-based deduplication; replicate\n // the same behavior so `{...refs.users}` produces a\n // fresh object each time.\n const id = ++accessId;\n const sentinelKey = `__SPREAD_SENTINEL__${path.join('.')}__${id}`;\n if (!Object.prototype.hasOwnProperty.call(target, sentinelKey)) {\n Object.defineProperty(target, sentinelKey, {\n enumerable: true,\n configurable: true,\n value: true,\n });\n }\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n if (prop === '__refProxy' || prop === '__path' || prop === '__type') {\n return { enumerable: false, configurable: true };\n }\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n },\n );\n cache.set(pathKey, proxy);\n return proxy;\n }\n\n const rootProxy = new Proxy(\n {} as Record<string | symbol, unknown>,\n {\n get(target, prop, receiver) {\n if (prop === '__refProxy') return true;\n if (prop === '__path') return [];\n if (prop === '__type') return undefined;\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n const propStr = String(prop);\n if (aliases.includes(propStr)) {\n return createProxy([propStr]);\n }\n return undefined;\n },\n has(target, prop) {\n if (prop === '__refProxy' || prop === '__path' || prop === '__type') {\n return true;\n }\n if (typeof prop === 'string' && aliases.includes(prop)) return true;\n return Reflect.has(target, prop);\n },\n ownKeys() {\n return [...aliases, '__refProxy', '__path', '__type'];\n },\n getOwnPropertyDescriptor(_target, prop) {\n if (prop === '__refProxy' || prop === '__path' || prop === '__type') {\n return { enumerable: false, configurable: true };\n }\n if (typeof prop === 'string' && aliases.includes(prop)) {\n return { enumerable: true, configurable: true };\n }\n return undefined;\n },\n },\n );\n return rootProxy as RootRefProxy<T>;\n}\n\n/**\n * Create a root ref proxy augmented with a `$selected` namespace.\n * Used inside `having` callbacks where the preceding `select` has\n * introduced named columns that HAVING can reference by alias.\n *\n * Paths rooted at `$selected` are emitted as\n * `['$selected', ...rest]`; the compiler then resolves them\n * against the resolved SELECT shape.\n */\nexport function createRefProxyWithSelected<\n T extends Record<string, Record<string, unknown>> = Record<\n string,\n Record<string, unknown>\n >,\n>(\n aliases: Array<string>,\n): RootRefProxy<T> & { $selected: SingleRowRefProxy<Record<string, unknown>> } {\n const baseProxy = createRefProxy<T>(aliases);\n const cache = new Map<string, unknown>();\n\n function createSelectedProxy(path: Array<string>): unknown {\n const pathKey = path.join('.');\n if (cache.has(pathKey)) {\n return cache.get(pathKey);\n }\n const proxy = new Proxy(\n {},\n {\n get(target, prop, receiver) {\n if (prop === '__refProxy') return true;\n if (prop === '__path') return ['$selected', ...path];\n if (prop === '__type') return undefined;\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n return createSelectedProxy([...path, String(prop)]);\n },\n has(target, prop) {\n if (\n prop === '__refProxy' ||\n prop === '__path' ||\n prop === '__type'\n ) {\n return true;\n }\n return Reflect.has(target, prop);\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n if (\n prop === '__refProxy' ||\n prop === '__path' ||\n prop === '__type'\n ) {\n return { enumerable: false, configurable: true };\n }\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n },\n );\n cache.set(pathKey, proxy);\n return proxy;\n }\n const wrappedSelectedProxy = createSelectedProxy([]);\n\n return new Proxy(baseProxy as unknown as Record<string | symbol, unknown>, {\n get(target, prop, receiver) {\n if (prop === '$selected') return wrappedSelectedProxy;\n return Reflect.get(target, prop, receiver);\n },\n has(target, prop) {\n if (prop === '$selected') return true;\n return Reflect.has(target, prop);\n },\n ownKeys(target) {\n return [...Reflect.ownKeys(target), '$selected'];\n },\n getOwnPropertyDescriptor(target, prop) {\n if (prop === '$selected') {\n return {\n enumerable: true,\n configurable: true,\n value: wrappedSelectedProxy,\n };\n }\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n }) as RootRefProxy<T> & {\n $selected: SingleRowRefProxy<Record<string, unknown>>;\n };\n}\n\n/**\n * Type guard: is `value` a ref proxy?\n */\nexport function isRefProxy(value: unknown): value is RefProxy {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as { __refProxy?: unknown }).__refProxy === true\n );\n}\n\n/**\n * Convert a value to a `BasicExpression`:\n *\n * - A ref proxy becomes a `PropRef` of its recorded path.\n * - An existing IR expression (ref/val/func/agg) is returned as-is.\n * - `ToArrayWrapper` / `ConcatToArrayWrapper` (Layer F) throws —\n * matches upstream's guard; we don't have those wrappers yet so\n * the guard is a no-op-in-practice today.\n * - Any other value is wrapped as a `Value` literal.\n */\nexport function toExpression<T = unknown>(value: T): BasicExpression {\n if (isRefProxy(value)) {\n return new PropRef(value.__path);\n }\n if (\n value !== null &&\n typeof value === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((value as any).__brand === 'ToArrayWrapper' ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (value as any).__brand === 'ConcatToArrayWrapper' ||\n (value as any).__brand === 'MaterializeWrapper')\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const brand = (value as any).__brand as string;\n const name = brand === 'ToArrayWrapper'\n ? 'toArray()'\n : brand === 'MaterializeWrapper'\n ? 'materialize()'\n : 'concat(toArray())';\n throw new Error(\n `${name} cannot be used inside expressions (e.g., coalesce(), eq(), not()). ` +\n `Use ${name} directly as a select field value instead.`,\n );\n }\n if (isExpressionLike(value)) {\n return value as unknown as BasicExpression;\n }\n return new Value(value);\n}\n\n/**\n * Wrap a literal as a `Value` expression. Matches\n * `@tanstack/db`'s `val(v)`. Useful for distinguishing a literal\n * from a ref-proxy in contexts where both appear — e.g.\n * `eq(users.id, val(1))` vs `eq(users.id, 1)` (the second is\n * identical in practice because `toExpression` wraps literals,\n * but `val()` makes intent explicit in generated code).\n */\nexport function val<T>(value: T): BasicExpression<T> {\n return new Value(value) as BasicExpression<T>;\n}\n\n// Re-export Func so callers that construct Func nodes directly\n// don't need a second import.\nexport { Func };\n","import { ValidationError } from '../errors.js';\n\nexport type Point = readonly [lng: number, lat: number];\n\nfunction describePoint(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(String).join(', ')}]`;\n return String(value);\n}\n\nexport function assertValidPoint(value: unknown, label = 'point'): asserts value is Point {\n if (!Array.isArray(value) || value.length !== 2) {\n throw new ValidationError(`${label} must be [lng, lat], got ${describePoint(value)}`);\n }\n const [lng, lat] = value;\n if (typeof lng !== 'number' || typeof lat !== 'number') {\n throw new ValidationError(`${label} coordinates must be numbers`);\n }\n if (!Number.isFinite(lng) || !Number.isFinite(lat)) {\n throw new ValidationError(`${label} coordinates must be finite`);\n }\n if (lng < -180 || lng > 180) {\n throw new ValidationError(`${label} longitude must be between -180 and 180, got ${lng}`);\n }\n if (lat < -90 || lat > 90) {\n throw new ValidationError(`${label} latitude must be between -90 and 90, got ${lat}`);\n }\n}\n\nexport class PointColumn {\n readonly coords: Float64Array;\n readonly bboxCache: Float64Array;\n\n constructor(\n capacity: number,\n coords: Float64Array = new Float64Array(capacity * 2),\n bboxCache: Float64Array = new Float64Array(capacity * 4),\n ) {\n if (!Number.isInteger(capacity) || capacity < 0) {\n throw new RangeError('capacity must be a non-negative integer');\n }\n if (coords.length < capacity * 2) {\n throw new RangeError('coords buffer is too small for point capacity');\n }\n if (bboxCache.length < capacity * 4) {\n throw new RangeError('bboxCache buffer is too small for point capacity');\n }\n this.coords = coords;\n this.bboxCache = bboxCache;\n for (let row = 0; row < capacity; row++) this.setNull(row);\n }\n\n set(row: number, value: Point): void {\n assertValidPoint(value);\n const coordOffset = row * 2;\n this.coords[coordOffset] = value[0];\n this.coords[coordOffset + 1] = value[1];\n this.updateBbox(row);\n }\n\n get(row: number): Point {\n const coordOffset = row * 2;\n return [this.coords[coordOffset] ?? Number.NaN, this.coords[coordOffset + 1] ?? Number.NaN];\n }\n\n setNull(row: number): void {\n const coordOffset = row * 2;\n this.coords[coordOffset] = Number.NaN;\n this.coords[coordOffset + 1] = Number.NaN;\n const bboxOffset = row * 4;\n this.bboxCache[bboxOffset] = Number.NaN;\n this.bboxCache[bboxOffset + 1] = Number.NaN;\n this.bboxCache[bboxOffset + 2] = Number.NaN;\n this.bboxCache[bboxOffset + 3] = Number.NaN;\n }\n\n updateBbox(row: number): void {\n const coordOffset = row * 2;\n const lng = this.coords[coordOffset] ?? Number.NaN;\n const lat = this.coords[coordOffset + 1] ?? Number.NaN;\n const bboxOffset = row * 4;\n this.bboxCache[bboxOffset] = lng;\n this.bboxCache[bboxOffset + 1] = lat;\n this.bboxCache[bboxOffset + 2] = lng;\n this.bboxCache[bboxOffset + 3] = lat;\n }\n\n copy(fromRow: number, toRow: number): void {\n const fromCoord = fromRow * 2;\n const toCoord = toRow * 2;\n this.coords[toCoord] = this.coords[fromCoord] ?? Number.NaN;\n this.coords[toCoord + 1] = this.coords[fromCoord + 1] ?? Number.NaN;\n const fromBbox = fromRow * 4;\n const toBbox = toRow * 4;\n this.bboxCache[toBbox] = this.bboxCache[fromBbox] ?? Number.NaN;\n this.bboxCache[toBbox + 1] = this.bboxCache[fromBbox + 1] ?? Number.NaN;\n this.bboxCache[toBbox + 2] = this.bboxCache[fromBbox + 2] ?? Number.NaN;\n this.bboxCache[toBbox + 3] = this.bboxCache[fromBbox + 3] ?? Number.NaN;\n }\n}\n","import { ValidationError } from '../errors.js';\nimport { assertValidPoint, type Point } from './point-column.js';\n\nexport type { Point } from './point-column.js';\nexport type BBox = readonly [minX: number, minY: number, maxX: number, maxY: number];\n\nexport const EARTH_RADIUS_METERS = 6_371_008.8;\n\nfunction describeBbox(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(String).join(', ')}]`;\n return String(value);\n}\n\nexport function assertValidBbox(value: unknown, label = 'bbox'): asserts value is BBox {\n if (!Array.isArray(value) || value.length !== 4) {\n throw new ValidationError(`${label} must be [minX, minY, maxX, maxY], got ${describeBbox(value)}`);\n }\n const [minX, minY, maxX, maxY] = value;\n for (const [name, coord] of [\n ['minX', minX],\n ['minY', minY],\n ['maxX', maxX],\n ['maxY', maxY],\n ] as const) {\n if (typeof coord !== 'number' || !Number.isFinite(coord)) {\n throw new ValidationError(`${label}.${name} must be finite`);\n }\n }\n if (minX < -180 || minX > 180 || maxX < -180 || maxX > 180) {\n throw new ValidationError(`${label} longitude bounds must be between -180 and 180`);\n }\n if (minY < -90 || minY > 90 || maxY < -90 || maxY > 90) {\n throw new ValidationError(`${label} latitude bounds must be between -90 and 90`);\n }\n if (minX > maxX) {\n throw new ValidationError(`${label} crosses the antimeridian; wrapped bboxes are not supported in v1`);\n }\n if (minY > maxY) {\n throw new ValidationError(`${label}.minY must be <= maxY`);\n }\n}\n\nexport function pointBbox(point: Point): BBox {\n assertValidPoint(point);\n const [lng, lat] = point;\n return [lng, lat, lng, lat];\n}\n\nexport function bboxIntersectsRaw(a: BBox, b: BBox): boolean {\n assertValidBbox(a, 'a');\n assertValidBbox(b, 'b');\n return a[0] <= b[2] && a[2] >= b[0] && a[1] <= b[3] && a[3] >= b[1];\n}\n\nexport function bboxWithinRaw(inner: BBox, outer: BBox): boolean {\n assertValidBbox(inner, 'inner');\n assertValidBbox(outer, 'outer');\n return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];\n}\n\nexport function expandPointBboxByMeters(point: Point, meters: number): BBox {\n assertValidPoint(point);\n if (typeof meters !== 'number' || !Number.isFinite(meters)) {\n throw new ValidationError('radius meters must be finite');\n }\n if (meters < 0) {\n throw new ValidationError('radius meters must be >= 0');\n }\n\n const [lng, lat] = point;\n const deltaLat = radiansToDegrees(meters / EARTH_RADIUS_METERS);\n const cosLat = Math.cos(degreesToRadians(lat));\n const deltaLng = Math.abs(cosLat) < 1e-12\n ? 180\n : radiansToDegrees(meters / (EARTH_RADIUS_METERS * Math.abs(cosLat)));\n\n return [\n clamp(lng - deltaLng, -180, 180),\n clamp(lat - deltaLat, -90, 90),\n clamp(lng + deltaLng, -180, 180),\n clamp(lat + deltaLat, -90, 90),\n ];\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function degreesToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function radiansToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n","import { assertValidPoint, type Point } from './point-column.js';\nimport { EARTH_RADIUS_METERS, degreesToRadians } from './bbox.js';\n\nexport function haversineDistanceMeters(a: Point, b: Point): number {\n assertValidPoint(a, 'a');\n assertValidPoint(b, 'b');\n\n const [lng1, lat1] = a;\n const [lng2, lat2] = b;\n return haversineDistanceMetersXY(lng1, lat1, lng2, lat2);\n}\n\n/** Allocation-free Haversine kernel for columnar coordinate buffers. */\nexport function haversineDistanceMetersXY(\n lng1: number,\n lat1: number,\n lng2: number,\n lat2: number,\n): number {\n if (lng1 === lng2 && lat1 === lat2) return 0;\n\n const phi1 = degreesToRadians(lat1);\n const phi2 = degreesToRadians(lat2);\n const dPhi = degreesToRadians(lat2 - lat1);\n const dLambda = degreesToRadians(lng2 - lng1);\n\n const sinDPhi = Math.sin(dPhi / 2);\n const sinDLambda = Math.sin(dLambda / 2);\n const h =\n sinDPhi * sinDPhi +\n Math.cos(phi1) * Math.cos(phi2) * sinDLambda * sinDLambda;\n return 2 * EARTH_RADIUS_METERS * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h));\n}\n","import { ValidationError } from '../errors.js';\nimport { assertValidPoint, type Point } from './point-column.js';\n\nexport type LinearRing = readonly Point[];\nexport type Polygon = readonly LinearRing[];\n\nexport interface PolygonColumnOptions {\n readonly ranges?: Int32Array;\n readonly ringRanges?: Int32Array;\n readonly initialRingCapacity?: number;\n readonly initialVertexCapacity?: number;\n readonly bboxCache?: Float64Array;\n readonly autoCloseRings?: boolean;\n}\n\nfunction describePolygon(value: unknown): string {\n if (Array.isArray(value)) return JSON.stringify(value);\n return String(value);\n}\n\nfunction samePoint(a: Point, b: Point): boolean {\n return a[0] === b[0] && a[1] === b[1];\n}\n\nfunction clonePoint(point: Point): Point {\n return [point[0], point[1]];\n}\n\nfunction normalizeRing(\n value: unknown,\n label: string,\n autoCloseRings: boolean,\n): Point[] {\n if (!Array.isArray(value)) {\n throw new ValidationError(`${label} must be an array of points, got ${describePolygon(value)}`);\n }\n\n const ring: Point[] = [];\n for (let i = 0; i < value.length; i++) {\n assertValidPoint(value[i], `${label}[${i}]`);\n ring.push(clonePoint(value[i]));\n }\n\n if (ring.length === 0) {\n throw new ValidationError(`${label} must contain at least four points`);\n }\n\n const first = ring[0]!;\n const last = ring[ring.length - 1]!;\n if (!samePoint(first, last)) {\n if (!autoCloseRings) {\n throw new ValidationError(`${label} must be closed (first point must equal last point)`);\n }\n ring.push(clonePoint(first));\n }\n\n if (ring.length < 4) {\n throw new ValidationError(`${label} must contain at least four points`);\n }\n\n return ring;\n}\n\nexport function normalizePolygon(\n value: unknown,\n options: { readonly autoCloseRings?: boolean } = {},\n label = 'polygon',\n): Polygon {\n if (!Array.isArray(value)) {\n throw new ValidationError(`${label} must be an array of rings, got ${describePolygon(value)}`);\n }\n if (value.length === 0) {\n throw new ValidationError(`${label} must contain at least one ring`);\n }\n\n const autoCloseRings = options.autoCloseRings === true;\n return value.map((ring, i) => normalizeRing(ring, `${label}[${i}]`, autoCloseRings));\n}\n\nexport function assertValidPolygon(\n value: unknown,\n options: { readonly autoCloseRings?: boolean } = {},\n label = 'polygon',\n): asserts value is Polygon {\n normalizePolygon(value, options, label);\n}\n\nexport class PolygonColumn {\n readonly ranges: Int32Array;\n ringRanges: Int32Array;\n coords: Float64Array;\n readonly bboxCache: Float64Array;\n cursor = 0;\n ringCursor = 0;\n private ringCapacity: number;\n private vertexCapacity: number;\n private readonly autoCloseRings: boolean;\n\n constructor(capacity: number, options: PolygonColumnOptions = {}) {\n if (!Number.isInteger(capacity) || capacity < 0) {\n throw new RangeError('capacity must be a non-negative integer');\n }\n\n const ranges = options.ranges ?? new Int32Array(capacity * 2);\n if (ranges.length < capacity * 2) {\n throw new RangeError('ranges buffer is too small for polygon capacity');\n }\n\n const initialRingCapacity = options.initialRingCapacity ?? Math.max(16, capacity * 2);\n if (!Number.isInteger(initialRingCapacity) || initialRingCapacity < 0) {\n throw new RangeError('initialRingCapacity must be a non-negative integer');\n }\n const ringRanges = options.ringRanges ?? new Int32Array(Math.max(1, initialRingCapacity) * 2);\n if (ringRanges.length < Math.max(1, initialRingCapacity) * 2) {\n throw new RangeError('ringRanges buffer is too small for polygon ring capacity');\n }\n\n const initialVertexCapacity = options.initialVertexCapacity ?? Math.max(16, capacity * 8);\n if (!Number.isInteger(initialVertexCapacity) || initialVertexCapacity < 0) {\n throw new RangeError('initialVertexCapacity must be a non-negative integer');\n }\n\n const bboxCache = options.bboxCache ?? new Float64Array(capacity * 4);\n if (bboxCache.length < capacity * 4) {\n throw new RangeError('bboxCache buffer is too small for polygon capacity');\n }\n\n this.ranges = ranges;\n this.ringCapacity = Math.max(1, initialRingCapacity);\n this.ringRanges = ringRanges;\n this.vertexCapacity = Math.max(1, initialVertexCapacity);\n this.coords = new Float64Array(this.vertexCapacity * 2);\n this.bboxCache = bboxCache;\n this.autoCloseRings = options.autoCloseRings === true;\n for (let row = 0; row < capacity; row++) this.setNull(row);\n }\n\n set(row: number, value: Polygon): void {\n const polygon = normalizePolygon(value, { autoCloseRings: this.autoCloseRings });\n const ringCount = polygon.length;\n const vertexCount = polygon.reduce((sum, ring) => sum + ring.length, 0);\n this.ensureRingCapacity(ringCount);\n this.ensureVertexCapacity(vertexCount);\n\n const ringStart = this.ringCursor;\n let vertex = this.cursor;\n for (let i = 0; i < polygon.length; i++) {\n const ring = polygon[i]!;\n const vertexStart = vertex;\n for (const point of ring) {\n const offset = vertex * 2;\n this.coords[offset] = point[0];\n this.coords[offset + 1] = point[1];\n vertex++;\n }\n const ringOffset = (ringStart + i) * 2;\n this.ringRanges[ringOffset] = vertexStart;\n this.ringRanges[ringOffset + 1] = vertex;\n }\n\n this.ringCursor += ringCount;\n this.cursor = vertex;\n this.ranges[row * 2] = ringStart;\n this.ranges[row * 2 + 1] = this.ringCursor;\n this.updateBbox(row, polygon);\n }\n\n get(row: number): Polygon {\n const ringStart = this.ranges[row * 2] ?? 0;\n const ringEnd = this.ranges[row * 2 + 1] ?? 0;\n const out: Point[][] = [];\n for (let ring = ringStart; ring < ringEnd; ring++) {\n const vertexStart = this.ringRanges[ring * 2] ?? 0;\n const vertexEnd = this.ringRanges[ring * 2 + 1] ?? 0;\n const outRing: Point[] = [];\n for (let vertex = vertexStart; vertex < vertexEnd; vertex++) {\n const offset = vertex * 2;\n outRing.push([\n this.coords[offset] ?? Number.NaN,\n this.coords[offset + 1] ?? Number.NaN,\n ]);\n }\n out.push(outRing);\n }\n return out;\n }\n\n setNull(row: number): void {\n this.ranges[row * 2] = 0;\n this.ranges[row * 2 + 1] = 0;\n const bboxOffset = row * 4;\n this.bboxCache[bboxOffset] = Number.NaN;\n this.bboxCache[bboxOffset + 1] = Number.NaN;\n this.bboxCache[bboxOffset + 2] = Number.NaN;\n this.bboxCache[bboxOffset + 3] = Number.NaN;\n }\n\n copy(fromRow: number, toRow: number): void {\n const bboxOffset = fromRow * 4;\n if (!Number.isFinite(this.bboxCache[bboxOffset])) {\n this.setNull(toRow);\n return;\n }\n this.set(toRow, this.get(fromRow));\n }\n\n private ensureRingCapacity(extraRings: number): void {\n const needed = this.ringCursor + extraRings;\n if (needed <= this.ringCapacity) return;\n let nextCapacity = this.ringCapacity;\n while (nextCapacity < needed) nextCapacity *= 2;\n const next = new Int32Array(nextCapacity * 2);\n next.set(this.ringRanges.subarray(0, this.ringCursor * 2));\n this.ringRanges = next;\n this.ringCapacity = nextCapacity;\n }\n\n private ensureVertexCapacity(extraVertices: number): void {\n const needed = this.cursor + extraVertices;\n if (needed <= this.vertexCapacity) return;\n let nextCapacity = this.vertexCapacity;\n while (nextCapacity < needed) nextCapacity *= 2;\n const next = new Float64Array(nextCapacity * 2);\n next.set(this.coords.subarray(0, this.cursor * 2));\n this.coords = next;\n this.vertexCapacity = nextCapacity;\n }\n\n private updateBbox(row: number, value: Polygon): void {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const ring of value) {\n for (const [lng, lat] of ring) {\n minX = Math.min(minX, lng);\n minY = Math.min(minY, lat);\n maxX = Math.max(maxX, lng);\n maxY = Math.max(maxY, lat);\n }\n }\n const bboxOffset = row * 4;\n this.bboxCache[bboxOffset] = minX;\n this.bboxCache[bboxOffset + 1] = minY;\n this.bboxCache[bboxOffset + 2] = maxX;\n this.bboxCache[bboxOffset + 3] = maxY;\n }\n}\n","import { assertValidPoint, type Point } from './point-column.js';\nimport { normalizePolygon, type Polygon } from './polygon-column.js';\n\nconst EPSILON = 1e-12;\n\n/**\n * Exact planar point-in-polygon for EPSG:4326 lon/lat coordinates.\n *\n * v1 treats exterior-boundary points as inside. Interior rings are holes:\n * points inside or on a hole boundary are outside the polygon.\n */\nexport function pointInPolygon(point: Point, polygon: Polygon): boolean {\n assertValidPoint(point, 'point');\n const rings = normalizePolygon(polygon, {}, 'polygon');\n const exterior = rings[0];\n if (exterior === undefined || !pointInRing(point, exterior)) return false;\n\n for (let i = 1; i < rings.length; i++) {\n if (pointInRing(point, rings[i]!)) return false;\n }\n\n return true;\n}\n\nfunction pointInRing(point: Point, ring: readonly Point[]): boolean {\n if (ring.length < 4) return false;\n\n for (let i = 0; i < ring.length - 1; i++) {\n if (pointOnSegment(point, ring[i]!, ring[i + 1]!)) return true;\n }\n\n const [px, py] = point;\n let inside = false;\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const [xi, yi] = ring[i]!;\n const [xj, yj] = ring[j]!;\n const crossesRay = (yi > py) !== (yj > py)\n && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi;\n if (crossesRay) inside = !inside;\n }\n return inside;\n}\n\nfunction pointOnSegment(point: Point, start: Point, end: Point): boolean {\n const [px, py] = point;\n const [x1, y1] = start;\n const [x2, y2] = end;\n const cross = (px - x1) * (y2 - y1) - (py - y1) * (x2 - x1);\n if (Math.abs(cross) > EPSILON) return false;\n\n return px >= Math.min(x1, x2) - EPSILON\n && px <= Math.max(x1, x2) + EPSILON\n && py >= Math.min(y1, y2) - EPSILON\n && py <= Math.max(y1, y2) + EPSILON;\n}\n","/**\n * QueryIR compiler — Layer C.5.\n *\n * Executes the TanStack-compatible QueryIR produced by builder.ts\n * against ArrowBase collections. This is intentionally a coarse\n * batch compiler: `runCollection()` materializes a result array, and\n * `runLive()` re-runs the whole query on any upstream collection\n * change. Layer F replaces that coarse invalidation with IVM.\n */\n\nimport type { Collection, RowValue } from '../collection/collection.js';\nimport { ValidationError } from '../errors.js';\nimport {\n assertValidBbox,\n bboxIntersectsRaw,\n bboxWithinRaw,\n pointBbox,\n type BBox,\n} from '../geo/bbox.js';\nimport { haversineDistanceMeters } from '../geo/distance.js';\nimport { assertValidPoint, type Point } from '../geo/point-column.js';\nimport { pointInPolygon } from '../geo/point-in-polygon.js';\nimport { normalizePolygon, type Polygon } from '../geo/polygon-column.js';\nimport { optimizeExpressionWithIndexes } from '../indexes/index-optimization.js';\nimport type { ColumnRef as FilterColumnRef, FilterExpr, Operand as FilterOperand, Scalar } from './filter.js';\nimport { compileFilter, materialize, scanOrdinals, sortOrdinals } from './kernel.js';\nimport type { OrderSpec } from './query.js';\nimport {\n Aggregate,\n CollectionRef,\n Func,\n INCLUDES_SCALAR_FIELD,\n IncludesSubquery,\n PropRef,\n QueryRef,\n Value,\n getHavingExpression,\n getWhereExpression,\n isExpressionLike,\n type BasicExpression,\n type CompareOptions,\n type From,\n type Having,\n type IncludesMaterialization,\n type JoinClause,\n type NamespacedRow,\n type QueryIR,\n type Select,\n type Where,\n} from './ir.js';\n\nexport type ResultRow = unknown;\nexport type CompiledExpression = (row: Record<string, unknown>) => unknown;\n\nexport interface IncludesCompilationResult {\n pipeline: Array<ResultRow>;\n fieldName: string;\n correlationField: PropRef;\n childCorrelationField: PropRef;\n hasOrderBy: boolean;\n childCompilationResult: CompilationResult;\n parentProjection?: Array<PropRef>;\n materialization: IncludesMaterialization;\n scalarField?: string;\n}\n\nexport interface CompilationResult {\n collectionId: string;\n pipeline: Array<ResultRow>;\n sourceWhereClauses: Map<string, BasicExpression<boolean>>;\n aliasToCollectionId: Record<string, string>;\n aliasRemapping: Record<string, string>;\n includes?: Array<IncludesCompilationResult>;\n}\n\ntype RowRecord = Record<string, unknown>;\n\ntype WorkRow = {\n key: string | number;\n ns: Record<string, unknown>;\n};\n\ntype IncludeCandidateCache = WeakMap<object, Map<unknown, Uint32Array>>;\ntype FastPathExecutor = (candidateOrdinals?: Uint32Array) => Array<ResultRow> | undefined;\nlet activeIncludeCandidateCache: IncludeCandidateCache | undefined;\nlet activeIncludeExecutorCache: WeakMap<object, FastPathExecutor | null> | undefined;\nlet runCollectionDepth = 0;\n\ntype FastProjection =\n | { kind: 'full' }\n | { kind: 'scalar'; expression: BasicExpression; alias: string }\n | { kind: 'object'; fields: Array<{ path: Array<string>; expression: BasicExpression }>; alias: string };\n\ntype GeoCandidatePlan =\n | {\n predicate: 'bboxIntersects' | 'bboxWithin';\n column: string;\n bbox: BBox;\n }\n | {\n predicate: 'dwithin';\n column: string;\n bbox: BBox;\n point: Point;\n meters: number;\n };\n\ntype FastWherePlan = {\n filterExpr: FilterExpr | null;\n indexExpression: BasicExpression | null;\n geoCandidate: GeoCandidatePlan | null;\n residualExpressions: Array<BasicExpression>;\n alwaysFalse: boolean;\n};\n\ntype FastPathPlan = {\n collection: Collection;\n alias: string;\n filterExpr: FilterExpr | null;\n order: Array<OrderSpec>;\n projection: FastProjection;\n indexExpression: BasicExpression | null;\n geoCandidate: GeoCandidatePlan | null;\n residualExpressions: Array<BasicExpression>;\n alwaysFalse: boolean;\n offset: number;\n limit: number | null;\n};\n\n/** Execute a QueryIR once and return dense result rows. */\nexport function runCollection(ir: QueryIR): Array<ResultRow> {\n const root = runCollectionDepth === 0;\n if (root) {\n activeIncludeCandidateCache = new WeakMap();\n activeIncludeExecutorCache = new WeakMap();\n }\n runCollectionDepth++;\n try {\n const fast = runSingleCollectionFastPath(ir);\n if (fast !== undefined) return fast;\n return executeQuery(ir).map((row) => finalizeSelected(row.ns));\n } finally {\n runCollectionDepth--;\n if (root) {\n activeIncludeCandidateCache = undefined;\n activeIncludeExecutorCache = undefined;\n }\n }\n}\n\n/**\n * Compile QueryIR into a stable Layer-C result envelope. The pipeline is\n * the current batch-compiler output; metadata mirrors TanStack's compiler\n * shape so optimizer/conformance code has the same public handles.\n */\nexport function compileQuery(rawQuery: QueryIR, ..._unused: Array<unknown>): CompilationResult {\n const aliasToCollectionId: Record<string, string> = {};\n const aliasRemapping: Record<string, string> = {};\n collectAliasMetadata(rawQuery.from, aliasToCollectionId, aliasRemapping);\n for (const join of rawQuery.join ?? []) {\n collectAliasMetadata(join.from, aliasToCollectionId, aliasRemapping);\n }\n\n const result: CompilationResult = {\n collectionId: collectionIdFor(rawQuery.from) ?? '',\n pipeline: runCollection(rawQuery),\n sourceWhereClauses: collectSourceWhereClauses(rawQuery),\n aliasToCollectionId,\n aliasRemapping,\n };\n const includes = compileIncludes(rawQuery.select as unknown);\n if (includes.length > 0) result.includes = includes;\n return result;\n}\n\n/**\n * Coarse live runner: emit initial result, then re-run after any\n * upstream source mutation. Returns unsubscribe.\n */\nexport function runLive(\n ir: QueryIR,\n callback: (rows: Array<ResultRow>) => void,\n): () => void {\n callback(runCollection(ir));\n const collections = collectCollections(ir);\n const unsubs = collections.map((collection) =>\n collection.subscribe(() => {\n callback(runCollection(ir));\n }),\n );\n return () => {\n for (const unsub of unsubs) unsub();\n };\n}\n\n/** Compile a scalar expression evaluator over a namespaced row. */\nexport function compileExpression(expr: BasicExpression): CompiledExpression {\n return (row) => evaluateExpression(expr, row);\n}\n\n/** Compile a scalar expression over a plain single row. */\nexport function compileSingleRowExpression(expr: BasicExpression): CompiledExpression {\n return (row) => evaluateSingleRowExpression(expr, row);\n}\n\n/** TanStack truthiness helper: only literal `true` passes filters. */\nexport function toBooleanPredicate(value: unknown): boolean {\n return value === true;\n}\n\nfunction executeQuery(query: QueryIR): Array<WorkRow> {\n validateQueryStructure(query);\n\n let rows = rowsFromFrom(query.from);\n\n for (const join of query.join ?? []) {\n rows = applyJoin(rows, join);\n }\n\n rows = applyWhere(rows, query.where);\n\n for (const fnWhere of query.fnWhere ?? []) {\n rows = rows.filter((row) => toBooleanPredicate(fnWhere(row.ns as NamespacedRow)));\n }\n\n const rawSelect = query.select as unknown;\n const needsGrouping =\n (query.groupBy?.length ?? 0) > 0 ||\n containsAggregateInSelect(rawSelect) ||\n containsAggregateInHaving(query.having);\n\n if (needsGrouping) {\n rows = applyGroupBy(rows, query);\n } else {\n rows = applySelect(rows, query);\n }\n\n if (query.distinct) {\n rows = distinctRows(rows);\n }\n\n if (query.orderBy && query.orderBy.length > 0) {\n rows = orderRows(rows, query.orderBy);\n }\n\n const offset = query.offset ?? 0;\n const effectiveLimit = query.singleResult ? 1 : query.limit;\n if (offset !== 0 || effectiveLimit !== undefined) {\n const end = effectiveLimit === undefined ? rows.length : offset + effectiveLimit;\n rows = rows.slice(offset, end);\n }\n\n return rows;\n}\n\nfunction validateQueryStructure(query: QueryIR): void {\n if (query.distinct && !query.fnSelect && query.select === undefined) {\n throw new ValidationError('distinct requires select or fn.select');\n }\n\n if (query.fnSelect && (query.groupBy?.length ?? 0) > 0) {\n throw new ValidationError('fn.select cannot be combined with groupBy');\n }\n\n if ((query.having?.length ?? 0) > 0 && (query.groupBy?.length ?? 0) === 0) {\n if (!containsAggregateInSelect(query.select as unknown)) {\n throw new ValidationError('having requires groupBy unless selecting aggregate expressions');\n }\n }\n\n if ((query.limit !== undefined || query.offset !== undefined) && (query.orderBy?.length ?? 0) === 0) {\n throw new ValidationError('limit and offset require orderBy');\n }\n}\n\n// ---------------------------------------------------------------------\n// Single-collection vectorized fast path\n// ---------------------------------------------------------------------\n\nfunction runSingleCollectionFastPath(\n query: QueryIR,\n candidateOrdinals?: Uint32Array,\n): Array<ResultRow> | undefined {\n return createFastPathExecutor(query)?.(candidateOrdinals);\n}\n\n/** Compile invariant scan/projection state once; correlated includes reuse it. */\nfunction createFastPathExecutor(query: QueryIR): FastPathExecutor | undefined {\n const plan = createFastPathPlan(query);\n if (!plan) return undefined;\n if (plan.alwaysFalse) return () => [];\n\n const scanByName = new Map<string, ReturnType<Collection['_internalScanColumns']>[number]>();\n for (const column of plan.collection._internalScanColumns()) scanByName.set(column.name, column);\n let compiled: ReturnType<typeof compileFilter>;\n try {\n compiled = compileFilter(plan.filterExpr, scanByName);\n } catch {\n return undefined;\n }\n\n return (candidateOrdinals?: Uint32Array): Array<ResultRow> | undefined => {\n let ordinals: Uint32Array;\n try {\n let liveOrdinals: Iterable<number>;\n if (candidateOrdinals !== undefined) {\n liveOrdinals = candidateOrdinals;\n } else if (plan.geoCandidate !== null) {\n const candidates = plan.collection._internalSearchSpatialIndex(\n plan.geoCandidate.column,\n plan.geoCandidate.bbox,\n );\n if (candidates === undefined) return undefined;\n liveOrdinals = candidates;\n } else {\n liveOrdinals = plan.collection._internalLiveOrdinals();\n if (plan.indexExpression !== null) {\n const optimized = optimizeExpressionWithIndexes(plan.indexExpression, plan.collection);\n if (optimized.canOptimize) {\n liveOrdinals = plan.collection._internalLiveOrdinalsForKeys(optimized.matchingKeys);\n }\n }\n }\n ordinals = scanOrdinals(liveOrdinals, (row) =>\n compiled.test(row) && fastResidualMatches(plan, row),\n );\n } catch {\n return undefined;\n }\n\n ordinals = sortOrdinals(\n ordinals,\n plan.order,\n scanByName,\n (row, col) => plan.collection._internalReadCell(col, row),\n );\n\n return materializeFastProjection(plan.collection, ordinals, plan.offset, plan.limit, plan.projection);\n };\n}\n\nfunction createFastPathPlan(query: QueryIR): FastPathPlan | undefined {\n if (query.from.type !== 'collectionRef') return undefined;\n if ((query.join?.length ?? 0) > 0) return undefined;\n if (query.fnSelect || (query.fnWhere?.length ?? 0) > 0 || (query.fnHaving?.length ?? 0) > 0) return undefined;\n if ((query.groupBy?.length ?? 0) > 0 || (query.having?.length ?? 0) > 0) return undefined;\n if (query.distinct) return undefined;\n if (containsAggregateInSelect(query.select as unknown)) return undefined;\n\n validateQueryStructure(query);\n\n const collection = query.from.collection;\n const alias = query.from.alias;\n const wherePlan = fastWherePlanForWhere(query.where, alias, collection);\n if (wherePlan === undefined) return undefined;\n const projection = fastProjectionForSelect(query.select as unknown, alias, collection);\n if (!projection) return undefined;\n const selectedColumns = projectionToColumnMap(projection);\n const order = fastOrderForOrderBy(query.orderBy, alias, selectedColumns, collection);\n if (!order) return undefined;\n\n const offset = query.offset ?? 0;\n const effectiveLimit = query.singleResult ? 1 : query.limit;\n return {\n collection,\n alias,\n filterExpr: wherePlan.filterExpr,\n order,\n projection,\n indexExpression: wherePlan.indexExpression,\n geoCandidate: wherePlan.geoCandidate,\n residualExpressions: wherePlan.residualExpressions,\n alwaysFalse: wherePlan.alwaysFalse,\n offset,\n limit: effectiveLimit ?? null,\n };\n}\n\nfunction fastResidualMatches(plan: FastPathPlan, row: number): boolean {\n if (plan.geoCandidate !== null && !fastGeoCandidateMatches(plan.collection, plan.geoCandidate, row)) {\n return false;\n }\n if (plan.residualExpressions.length === 0) return true;\n const ns: Record<string, unknown> = { [plan.alias]: fastRowObject(plan.collection, row) };\n for (const expr of plan.residualExpressions) {\n if (!toBooleanPredicate(evaluateExpression(expr, ns))) return false;\n }\n return true;\n}\n\nfunction fastGeoCandidateMatches(\n collection: Collection,\n candidate: GeoCandidatePlan,\n row: number,\n): boolean {\n switch (candidate.predicate) {\n case 'bboxIntersects':\n return collection._internalGeometryBboxMatches(candidate.column, row, candidate.bbox, 'intersects');\n case 'bboxWithin':\n return collection._internalGeometryBboxMatches(candidate.column, row, candidate.bbox, 'within');\n case 'dwithin':\n return collection._internalPointDWithin(candidate.column, row, candidate.point, candidate.meters);\n }\n}\n\nfunction fastRowObject(collection: Collection, row: number): RowRecord {\n const obj: RowRecord = {};\n for (const column of collection.columnNames()) {\n obj[column] = collection._internalReadCell(column, row);\n }\n return obj;\n}\n\nfunction fastWherePlanForWhere(\n where: QueryIR['where'],\n alias: string,\n collection: Collection,\n): FastWherePlan | undefined {\n const clauses = where ?? [];\n if (clauses.length === 0) {\n return {\n filterExpr: null,\n indexExpression: null,\n geoCandidate: null,\n residualExpressions: [],\n alwaysFalse: false,\n };\n }\n\n const filters: Array<FilterExpr> = [];\n const indexExpressions: Array<BasicExpression> = [];\n const residualExpressions: Array<BasicExpression> = [];\n let geoCandidate: GeoCandidatePlan | null = null;\n let alwaysFalse = false;\n\n for (const clause of clauses) {\n const expr = getWhereExpression(clause);\n if (isUndefinedOfSchemaColumn(expr, alias, collection)) {\n alwaysFalse = true;\n continue;\n }\n const geo = geoCandidateForExpression(expr, alias);\n if (geo) {\n if (geoCandidate === null) {\n geoCandidate = geo;\n if (expr instanceof Func && (expr.name === 'within' || expr.name === 'contains')) {\n // The R-tree supplies polygon-bbox candidates; retain exact topology\n // as a residual predicate.\n residualExpressions.push(expr);\n }\n } else {\n residualExpressions.push(expr);\n }\n continue;\n }\n\n const filter = filterExprForExpression(expr, alias);\n if (!filter) return undefined;\n filters.push(filter);\n\n const stripped = stripAliasForIndexExpression(expr, alias);\n if (stripped) indexExpressions.push(stripped);\n }\n\n return {\n filterExpr: filters.length === 0 ? null : filters.length === 1 ? filters[0]! : { kind: 'and', args: filters },\n indexExpression: indexExpressions.length === 0 ? null : indexExpressions.length === 1 ? indexExpressions[0]! : new Func('and', indexExpressions) as BasicExpression<boolean>,\n geoCandidate,\n residualExpressions,\n alwaysFalse,\n };\n}\n\nfunction isUndefinedOfSchemaColumn(\n expression: BasicExpression,\n alias: string,\n collection: Collection,\n): boolean {\n if (!(expression instanceof Func) || expression.name !== 'isUndefined') return false;\n const ref = expression.args[0];\n return ref instanceof PropRef &&\n ref.path.length === 2 &&\n ref.path[0] === alias &&\n collection.columnNames().includes(ref.path[1]!);\n}\n\nfunction geoCandidateForExpression(expr: BasicExpression, alias: string): GeoCandidatePlan | undefined {\n if (!(expr instanceof Func)) return undefined;\n if (expr.name === 'within' || expr.name === 'contains') {\n const columnArg = expr.name === 'within' ? expr.args[0] : expr.args[1];\n const polygonArg = expr.name === 'within' ? expr.args[1] : expr.args[0];\n const column = columnForAliasRef(columnArg!, alias);\n const bbox = literalPolygonBboxForGeo(polygonArg);\n return column && bbox ? { predicate: 'bboxIntersects', column, bbox } : undefined;\n }\n if (expr.name !== 'bboxIntersects' && expr.name !== 'bboxWithin' && expr.name !== 'dwithin') {\n return undefined;\n }\n const column = columnForAliasRef(expr.args[0]!, alias);\n if (!column) return undefined;\n\n if (expr.name === 'bboxIntersects' || expr.name === 'bboxWithin') {\n const bbox = literalBboxForGeo(expr.args[1]);\n return bbox ? { predicate: expr.name, column, bbox } : undefined;\n }\n\n const point = literalPointForGeo(expr.args[1]);\n if (!point) return undefined;\n const meters = literalRadiusMetersForGeo(expr.args[2]);\n if (meters === undefined) return undefined;\n return { predicate: 'dwithin', column, bbox: pointRadiusBbox(point, meters), point, meters };\n}\n\nfunction literalPolygonBboxForGeo(expr: BasicExpression | undefined): BBox | undefined {\n if (!(expr instanceof Value)) return undefined;\n const polygon = polygonOrNull(expr.value);\n if (!polygon) return undefined;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const ring of polygon) {\n for (const point of ring) {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n }\n }\n return [minX, minY, maxX, maxY];\n}\n\nfunction literalBboxForGeo(expr: BasicExpression | undefined): BBox | undefined {\n if (!(expr instanceof Value)) return undefined;\n assertValidBbox(expr.value, 'bbox');\n return expr.value;\n}\n\nfunction literalPointForGeo(expr: BasicExpression | undefined): Point | undefined {\n if (!(expr instanceof Value)) return undefined;\n assertValidPoint(expr.value, 'point');\n return expr.value;\n}\n\nfunction literalRadiusMetersForGeo(expr: BasicExpression | undefined): number | undefined {\n if (!(expr instanceof Value)) return undefined;\n return evalGeoRadiusMeters(expr.value);\n}\n\nfunction pointRadiusBbox(point: Point, meters: number): BBox {\n const earthRadiusMeters = 6_371_008.8;\n const angularDegrees = (meters / earthRadiusMeters) * (180 / Math.PI);\n const cosLat = Math.cos((point[1] * Math.PI) / 180);\n const lngDelta = Math.abs(cosLat) < 1e-12 ? 180 : angularDegrees / Math.abs(cosLat);\n const latDelta = angularDegrees;\n return [\n clamp(point[0] - lngDelta, -180, 180),\n clamp(point[1] - latDelta, -90, 90),\n clamp(point[0] + lngDelta, -180, 180),\n clamp(point[1] + latDelta, -90, 90),\n ];\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction fastFilterForWhere(where: QueryIR['where'], alias: string): FilterExpr | null | undefined {\n const clauses = where ?? [];\n if (clauses.length === 0) return null;\n const filters: Array<FilterExpr> = [];\n for (const clause of clauses) {\n const filter = filterExprForExpression(getWhereExpression(clause), alias);\n if (!filter) return undefined;\n filters.push(filter);\n }\n return filters.length === 1 ? filters[0]! : { kind: 'and', args: filters };\n}\n\nfunction filterExprForExpression(expr: BasicExpression, alias: string): FilterExpr | undefined {\n if (expr instanceof PropRef) {\n const ref = filterColumnForRef(expr, alias);\n return ref ? ref : undefined;\n }\n if (!(expr instanceof Func)) return undefined;\n\n switch (expr.name) {\n case 'and': {\n const args = expr.args.map((arg) => filterExprForExpression(arg, alias));\n if (args.some((arg) => arg === undefined)) return undefined;\n return { kind: 'and', args: args as Array<FilterExpr> };\n }\n case 'or': {\n const args = expr.args.map((arg) => filterExprForExpression(arg, alias));\n if (args.some((arg) => arg === undefined)) return undefined;\n return { kind: 'or', args: args as Array<FilterExpr> };\n }\n case 'not': {\n const arg = expr.args[0] ? filterExprForExpression(expr.args[0], alias) : undefined;\n return arg ? { kind: 'not', arg } : undefined;\n }\n case 'isNull': {\n const ref = expr.args[0] instanceof PropRef ? filterColumnForRef(expr.args[0], alias) : undefined;\n return ref ? { kind: 'isNull', col: ref, negated: false } : undefined;\n }\n case 'in': {\n const ref = expr.args[0] instanceof PropRef ? filterColumnForRef(expr.args[0], alias) : undefined;\n const array = expr.args[1] instanceof Value ? expr.args[1].value : undefined;\n if (!ref || !Array.isArray(array) || !array.every(isFilterScalar)) return undefined;\n return { kind: 'in', col: ref, values: array };\n }\n case 'like':\n case 'ilike': {\n const ref = expr.args[0] instanceof PropRef ? filterColumnForRef(expr.args[0], alias) : undefined;\n const pattern = literalScalarForFilter(expr.args[1]);\n if (!ref || typeof pattern !== 'string') return undefined;\n return { kind: 'str', op: 'like', col: ref, value: pattern, ...(expr.name === 'ilike' ? { caseInsensitive: true } : {}) };\n }\n case 'eq':\n case 'gt':\n case 'gte':\n case 'lt':\n case 'lte': {\n const left = filterOperandForExpression(expr.args[0], alias);\n const right = filterOperandForExpression(expr.args[1], alias);\n if (!left || !right) return undefined;\n return { kind: 'cmp', op: expr.name, left, right };\n }\n default:\n return undefined;\n }\n}\n\nfunction fastIndexExpressionForWhere(where: QueryIR['where'], alias: string): BasicExpression | null {\n const clauses = where ?? [];\n if (clauses.length === 0) return null;\n const expressions: Array<BasicExpression> = [];\n for (const clause of clauses) {\n const stripped = stripAliasForIndexExpression(getWhereExpression(clause), alias);\n if (!stripped) return null;\n expressions.push(stripped);\n }\n return expressions.length === 1 ? expressions[0]! : new Func('and', expressions) as BasicExpression<boolean>;\n}\n\nfunction stripAliasForIndexExpression(expr: BasicExpression, alias: string): BasicExpression | undefined {\n if (expr instanceof PropRef) {\n if (expr.path.length !== 2 || expr.path[0] !== alias) return undefined;\n return new PropRef([expr.path[1]!]);\n }\n if (expr instanceof Value) return expr;\n if (expr instanceof Func) {\n const args = expr.args.map((arg) => stripAliasForIndexExpression(arg, alias));\n if (args.some((arg) => arg === undefined)) return undefined;\n return new Func(expr.name, args as Array<BasicExpression>) as BasicExpression;\n }\n return undefined;\n}\n\nfunction fastProjectionForSelect(\n select: unknown,\n alias: string,\n collection: Collection,\n): FastProjection | undefined {\n if (select === undefined) return { kind: 'full' };\n if (isBasicExpression(select)) {\n return fastProjectionExpressionSupported(select, alias, collection)\n ? { kind: 'scalar', expression: select, alias }\n : undefined;\n }\n if (!isPlainObject(select) || isExpressionLike(select)) return undefined;\n\n const fields: Array<{ path: Array<string>; expression: BasicExpression }> = [];\n if (!collectFastProjectionFields(select as Select, alias, collection, [], fields)) return undefined;\n return { kind: 'object', fields, alias };\n}\n\nfunction collectFastProjectionFields(\n select: Select,\n alias: string,\n collection: Collection,\n prefix: Array<string>,\n fields: Array<{ path: Array<string>; expression: BasicExpression }>,\n): boolean {\n for (const [key, value] of Object.entries(select)) {\n if (key.startsWith('__SPREAD_SENTINEL__')) return false;\n const path = [...prefix, key];\n if (isBasicExpression(value)) {\n if (!fastProjectionExpressionSupported(value, alias, collection)) return false;\n fields.push({ path, expression: value });\n continue;\n }\n if (isPlainObject(value) && !isExpressionLike(value)) {\n if (!collectFastProjectionFields(value as Select, alias, collection, path, fields)) return false;\n continue;\n }\n return false;\n }\n return true;\n}\n\nfunction fastProjectionExpressionSupported(\n expression: BasicExpression,\n alias: string,\n collection: Collection,\n): boolean {\n if (expression.type === 'val') return true;\n if (expression.type === 'ref') {\n const column = columnForAliasRef(expression, alias);\n return column !== undefined && collection.columnNames().includes(column);\n }\n return expression.args.every((arg) => fastProjectionExpressionSupported(arg, alias, collection));\n}\n\nfunction projectionToColumnMap(projection: FastProjection): Map<string, string> {\n const map = new Map<string, string>();\n if (projection.kind === 'object') {\n for (const field of projection.fields) {\n const column = field.expression instanceof PropRef\n ? columnForAliasRef(field.expression, projection.alias)\n : undefined;\n if (field.path.length === 1 && column) map.set(field.path[0]!, column);\n }\n }\n if (projection.kind === 'scalar' && projection.expression instanceof PropRef) {\n const column = columnForAliasRef(projection.expression, projection.alias);\n if (column) map.set(INCLUDES_SCALAR_FIELD, column);\n }\n return map;\n}\n\nfunction fastOrderForOrderBy(\n orderBy: QueryIR['orderBy'],\n alias: string,\n selectedColumns: Map<string, string>,\n collection: Collection,\n): Array<OrderSpec> | undefined {\n const order: Array<OrderSpec> = [];\n for (const clause of orderBy ?? []) {\n const column = columnForAliasRef(clause.expression, alias) ?? columnForSelectedRef(clause.expression, selectedColumns);\n if (!column) return undefined;\n const compiledColumn = collection.schema.columnsByName.get(column);\n if (!compiledColumn || compiledColumn.nullable) return undefined;\n if (clause.compareOptions.stringSort === 'locale') {\n return undefined;\n }\n order.push({ column, dir: clause.compareOptions.direction });\n }\n return order;\n}\n\nfunction materializeFastProjection(\n collection: Collection,\n ordinals: Uint32Array,\n offset: number,\n limit: number | null,\n projection: FastProjection,\n): Array<ResultRow> {\n if (projection.kind === 'full') return materialize(collection, ordinals, offset, limit, null) as Array<ResultRow>;\n\n const end = limit === null ? ordinals.length : Math.min(ordinals.length, offset + limit);\n const n = Math.max(0, end - offset);\n const out: Array<ResultRow> = new Array(n);\n for (let i = 0; i < n; i++) {\n const row = ordinals[offset + i]!;\n if (projection.kind === 'scalar') {\n out[i] = evaluateFastProjectionExpression(projection.expression, collection, projection.alias, row);\n continue;\n }\n const obj: RowRecord = {};\n for (const field of projection.fields) {\n setAtPath(\n obj,\n field.path,\n evaluateFastProjectionExpression(field.expression, collection, projection.alias, row),\n );\n }\n out[i] = obj;\n }\n return out;\n}\n\nfunction evaluateFastProjectionExpression(\n expression: BasicExpression,\n collection: Collection,\n alias: string,\n row: number,\n): unknown {\n switch (expression.type) {\n case 'val':\n return expression.value;\n case 'ref': {\n const column = columnForAliasRef(expression, alias);\n return column === undefined ? undefined : collection._internalReadCell(column, row);\n }\n case 'func':\n return evaluateFuncWith(\n expression,\n (arg) => evaluateFastProjectionExpression(arg, collection, alias, row),\n );\n }\n}\n\nfunction filterOperandForExpression(expr: BasicExpression | undefined, alias: string): FilterOperand | undefined {\n if (expr instanceof PropRef) return filterColumnForRef(expr, alias);\n const literal = literalScalarForFilter(expr);\n return literal !== undefined ? { kind: 'lit', value: literal } : undefined;\n}\n\nfunction literalScalarForFilter(expr: BasicExpression | undefined): Scalar | undefined {\n if (!(expr instanceof Value)) return undefined;\n return isFilterScalar(expr.value) ? expr.value : undefined;\n}\n\nfunction filterColumnForRef(ref: PropRef, alias: string): FilterColumnRef | undefined {\n const column = columnForAliasRef(ref, alias);\n return column ? { kind: 'col', name: column } : undefined;\n}\n\nfunction columnForAliasRef(expr: BasicExpression, alias: string): string | undefined {\n if (!(expr instanceof PropRef)) return undefined;\n if (expr.path.length !== 2 || expr.path[0] !== alias) return undefined;\n return expr.path[1];\n}\n\nfunction columnForSelectedRef(expr: BasicExpression, selectedColumns: Map<string, string>): string | undefined {\n if (!(expr instanceof PropRef)) return undefined;\n if (expr.path.length !== 2 || expr.path[0] !== '$selected') return undefined;\n return selectedColumns.get(expr.path[1]!);\n}\n\nfunction isFilterScalar(value: unknown): value is Scalar {\n return value === null || typeof value === 'number' || typeof value === 'bigint' || typeof value === 'boolean' || typeof value === 'string';\n}\n\n// ---------------------------------------------------------------------\n// Sources + joins\n// ---------------------------------------------------------------------\n\nfunction rowsFromFrom(from: From): Array<WorkRow> {\n if (from.type === 'collectionRef') {\n const out: Array<WorkRow> = [];\n for (const [key, row] of from.collection.entries()) {\n // Collection iteration already returns an isolated snapshot. Re-cloning\n // it doubled allocation for functional callbacks and materialized plans\n // without adding mutation isolation.\n out.push({ key, ns: { [from.alias]: row } });\n }\n return out;\n }\n\n if (from.type === 'queryRef') {\n return runCollection(from.query).map((row, index) => ({\n key: `${from.alias}:${index}`,\n ns: { [from.alias]: rowToRecord(row) },\n }));\n }\n\n throw new ValidationError(`unsupported from type: ${(from as { type?: unknown }).type}`);\n}\n\nfunction applyJoin(leftRows: Array<WorkRow>, join: JoinClause): Array<WorkRow> {\n const rightRows = rowsFromFrom(join.from);\n const joinType = join.type === 'outer' ? 'full' : join.type;\n const rightAlias = join.from.alias;\n\n if (joinType === 'cross') {\n const crossed: Array<WorkRow> = [];\n for (const left of leftRows) {\n for (const right of rightRows) {\n crossed.push({\n key: `${String(left.key)}|${String(right.key)}`,\n ns: { ...left.ns, ...right.ns },\n });\n }\n }\n return crossed;\n }\n\n const oriented = orientHashJoinExpressions(join, rightAlias);\n if (oriented) {\n return applyHashJoin(leftRows, rightRows, joinType, rightAlias, oriented[0], oriented[1]);\n }\n\n const out: Array<WorkRow> = [];\n const matchedRight = new Set<number>();\n const emitLeft = joinType === 'left' || joinType === 'full';\n const emitRight = joinType === 'right' || joinType === 'full';\n\n for (const left of leftRows) {\n let matched = false;\n for (let i = 0; i < rightRows.length; i++) {\n const right = rightRows[i]!;\n const ns = { ...left.ns, ...right.ns };\n if (joinMatches(ns, join)) {\n matched = true;\n matchedRight.add(i);\n out.push({ key: `${String(left.key)}|${String(right.key)}`, ns });\n }\n }\n if (!matched && emitLeft) {\n out.push({\n key: `${String(left.key)}|null:${rightAlias}`,\n ns: { ...left.ns, [rightAlias]: null },\n });\n }\n }\n\n if (emitRight) {\n for (let i = 0; i < rightRows.length; i++) {\n if (matchedRight.has(i)) continue;\n const right = rightRows[i]!;\n out.push({ key: `null|${String(right.key)}`, ns: { ...right.ns } });\n }\n }\n\n return out;\n}\n\n/**\n * Hash the newly joined side and probe it from the accumulated left rows.\n * Builder joins are equality-only, so the nested-loop fallback is needed only\n * for unusual expressions where an operand mixes aliases from both sides.\n */\nfunction applyHashJoin(\n leftRows: Array<WorkRow>,\n rightRows: Array<WorkRow>,\n joinType: Exclude<JoinClause['type'], 'outer' | 'cross'>,\n rightAlias: string,\n leftExpression: BasicExpression,\n rightExpression: BasicExpression,\n): Array<WorkRow> {\n type HashEntry = { index: number; row: WorkRow; value: unknown };\n const buckets = new Map<unknown, Array<HashEntry>>();\n for (let index = 0; index < rightRows.length; index++) {\n const row = rightRows[index]!;\n const value = evaluateExpression(rightExpression, row.ns);\n if (isUnknown(value)) continue;\n const key = hashJoinKey(value);\n const bucket = buckets.get(key);\n const entry = { index, row, value };\n if (bucket) bucket.push(entry);\n else buckets.set(key, [entry]);\n }\n\n const emitLeft = joinType === 'left' || joinType === 'full';\n const emitRight = joinType === 'right' || joinType === 'full';\n const matchedRight = emitRight ? new Set<number>() : undefined;\n const out: Array<WorkRow> = [];\n\n for (const left of leftRows) {\n const leftValue = evaluateExpression(leftExpression, left.ns);\n let matched = false;\n if (!isUnknown(leftValue)) {\n for (const entry of buckets.get(hashJoinKey(leftValue)) ?? []) {\n // Hash keys intentionally coarsen object values to identity and dates\n // to timestamps. Retain the canonical equality check for exactness.\n if (!valuesEqual(leftValue, entry.value)) continue;\n matched = true;\n matchedRight?.add(entry.index);\n out.push({\n key: `${String(left.key)}|${String(entry.row.key)}`,\n ns: { ...left.ns, ...entry.row.ns },\n });\n }\n }\n if (!matched && emitLeft) {\n out.push({\n key: `${String(left.key)}|null:${rightAlias}`,\n ns: { ...left.ns, [rightAlias]: null },\n });\n }\n }\n\n if (emitRight) {\n for (let index = 0; index < rightRows.length; index++) {\n if (matchedRight!.has(index)) continue;\n const right = rightRows[index]!;\n out.push({ key: `null|${String(right.key)}`, ns: { ...right.ns } });\n }\n }\n return out;\n}\n\nfunction orientHashJoinExpressions(\n join: JoinClause,\n rightAlias: string,\n): [left: BasicExpression, right: BasicExpression] | undefined {\n const leftUsesRight = expressionReferencesAlias(join.left, rightAlias);\n const rightUsesRight = expressionReferencesAlias(join.right, rightAlias);\n if (leftUsesRight === rightUsesRight) return undefined;\n return leftUsesRight ? [join.right, join.left] : [join.left, join.right];\n}\n\nfunction expressionReferencesAlias(expression: BasicExpression, alias: string): boolean {\n if (expression.type === 'ref') return expression.path[0] === alias;\n if (expression.type === 'func') {\n return expression.args.some((arg) => expressionReferencesAlias(arg, alias));\n }\n return false;\n}\n\nfunction hashJoinKey(value: unknown): unknown {\n if (value instanceof Date) return `date:${value.getTime()}`;\n switch (typeof value) {\n case 'string':\n return `string:${value}`;\n case 'number':\n if (Object.is(value, -0)) return 'number:-0';\n if (Number.isNaN(value)) return 'number:NaN';\n return `number:${value}`;\n case 'bigint':\n return `bigint:${value}`;\n case 'boolean':\n return value ? 'boolean:true' : 'boolean:false';\n default:\n // Map preserves identity for symbols, objects and functions, matching\n // Object.is used by valuesEqual for non-Date values.\n return value;\n }\n}\n\nfunction joinMatches(ns: Record<string, unknown>, join: JoinClause): boolean {\n const left = evaluateExpression(join.left, ns);\n const right = evaluateExpression(join.right, ns);\n if (isUnknown(left) || isUnknown(right)) return false;\n return valuesEqual(left, right);\n}\n\n// ---------------------------------------------------------------------\n// WHERE / SELECT / GROUP BY\n// ---------------------------------------------------------------------\n\nfunction applyWhere(rows: Array<WorkRow>, whereClauses?: Array<Where>): Array<WorkRow> {\n let current = rows;\n for (const where of whereClauses ?? []) {\n const expr = getWhereExpression(where);\n current = current.filter((row) => toBooleanPredicate(evaluateExpression(expr, row.ns)));\n }\n return current;\n}\n\nfunction applySelect(rows: Array<WorkRow>, query: QueryIR): Array<WorkRow> {\n const mainAlias = query.from.alias;\n const rawSelect = query.select as unknown;\n\n return rows.map((row) => {\n let selected: unknown;\n if (query.fnSelect) {\n selected = query.fnSelect(row.ns as NamespacedRow);\n } else if (rawSelect !== undefined) {\n selected = evaluateSelect(rawSelect, row.ns, query);\n } else if ((query.join?.length ?? 0) === 0) {\n selected = row.ns[mainAlias];\n } else {\n selected = stripInternalFields(row.ns);\n }\n\n return {\n key: row.key,\n ns: {\n ...row.ns,\n $selected: selected,\n },\n };\n });\n}\n\nfunction applyGroupBy(rows: Array<WorkRow>, query: QueryIR): Array<WorkRow> {\n const groupBy = query.groupBy ?? [];\n const groups = new Map<string, { values: Array<unknown>; rows: Array<WorkRow> }>();\n\n for (const row of rows) {\n const values = groupBy.map((expr) => evaluateExpression(expr, row.ns));\n const key = stableKey(values.length === 0 ? ['__singleGroup'] : values);\n let group = groups.get(key);\n if (!group) {\n group = { values, rows: [] };\n groups.set(key, group);\n }\n group.rows.push(row);\n }\n\n if (rows.length === 0 && groupBy.length === 0 && containsAggregateInSelect(query.select as unknown)) {\n groups.set(stableKey(['__singleGroup']), { values: [], rows: [] });\n }\n\n const out: Array<WorkRow> = [];\n let synthetic = 0;\n for (const [key, group] of groups) {\n const firstNs = group.rows[0]?.ns ?? {};\n const selected = query.fnSelect\n ? query.fnSelect(firstNs as NamespacedRow)\n : query.select !== undefined\n ? evaluateGroupSelect(query.select as unknown, group.rows, firstNs, query)\n : Object.fromEntries(group.values.map((value, i) => [`__key_${i}`, value]));\n\n const ns: Record<string, unknown> = {\n ...firstNs,\n $selected: selected,\n };\n\n if (!passesHaving(ns, group.rows, query.having)) continue;\n let fnPass = true;\n for (const fnHaving of query.fnHaving ?? []) {\n if (!toBooleanPredicate(fnHaving(ns as NamespacedRow))) {\n fnPass = false;\n break;\n }\n }\n if (!fnPass) continue;\n\n out.push({ key: key === stableKey(['__singleGroup']) ? `single_group_${synthetic++}` : key, ns });\n }\n\n return out;\n}\n\nfunction passesHaving(\n ns: Record<string, unknown>,\n groupRows: Array<WorkRow>,\n having?: Array<Having>,\n): boolean {\n for (const clause of having ?? []) {\n const expr = getHavingExpression(clause);\n if (!toBooleanPredicate(evaluateGroupExpression(expr, groupRows, ns))) {\n return false;\n }\n }\n return true;\n}\n\nfunction evaluateSelect(raw: unknown, ns: Record<string, unknown>, query: QueryIR): unknown {\n if (raw instanceof IncludesSubquery || isIncludes(raw)) {\n return evaluateIncludes(raw, ns);\n }\n if (isBasicExpression(raw)) {\n return evaluateExpression(raw, ns);\n }\n if (raw instanceof Aggregate || isAggregate(raw)) {\n throw new ValidationError(`aggregate ${raw.name} requires groupBy or aggregate select context`);\n }\n if (isPlainObject(raw)) {\n const out: RowRecord = {};\n addSelectObject(out, [], raw as Select, ns, query);\n return out;\n }\n return raw;\n}\n\nfunction addSelectObject(\n out: RowRecord,\n prefix: Array<string>,\n select: Select,\n ns: Record<string, unknown>,\n query: QueryIR,\n): void {\n for (const [key, value] of Object.entries(select)) {\n if (key.startsWith('__SPREAD_SENTINEL__')) {\n const spreadValue = isBasicExpression(value)\n ? evaluateExpression(value, ns)\n : isPlainObject(value)\n ? value\n : undefined;\n mergeAtPath(out, prefix, spreadValue);\n continue;\n }\n\n const path = [...prefix, key];\n if (value instanceof IncludesSubquery || isIncludes(value)) {\n setAtPath(out, path, evaluateIncludes(value, ns));\n continue;\n }\n if (isBasicExpression(value)) {\n setAtPath(out, path, evaluateExpression(value, ns));\n continue;\n }\n if (value instanceof Aggregate || isAggregate(value)) {\n setAtPath(out, path, null);\n continue;\n }\n if (isPlainObject(value)) {\n addSelectObject(out, path, value as Select, ns, query);\n continue;\n }\n setAtPath(out, path, value);\n }\n}\n\nfunction evaluateGroupSelect(\n raw: unknown,\n rows: Array<WorkRow>,\n firstNs: Record<string, unknown>,\n query: QueryIR,\n): unknown {\n if (isBasicExpression(raw) || raw instanceof Aggregate || isAggregate(raw)) {\n return evaluateGroupExpression(raw, rows, firstNs);\n }\n if (raw instanceof IncludesSubquery || isIncludes(raw)) {\n return evaluateIncludes(raw, firstNs);\n }\n if (isPlainObject(raw)) {\n const out: RowRecord = {};\n addGroupSelectObject(out, [], raw as Select, rows, firstNs, query);\n return out;\n }\n return raw;\n}\n\nfunction addGroupSelectObject(\n out: RowRecord,\n prefix: Array<string>,\n select: Select,\n rows: Array<WorkRow>,\n firstNs: Record<string, unknown>,\n query: QueryIR,\n): void {\n for (const [key, value] of Object.entries(select)) {\n if (key.startsWith('__SPREAD_SENTINEL__')) {\n const spreadValue = isBasicExpression(value)\n ? evaluateExpression(value, firstNs)\n : isPlainObject(value)\n ? value\n : undefined;\n mergeAtPath(out, prefix, spreadValue);\n continue;\n }\n const path = [...prefix, key];\n if (value instanceof IncludesSubquery || isIncludes(value)) {\n setAtPath(out, path, evaluateIncludes(value, firstNs));\n } else if (isBasicExpression(value) || value instanceof Aggregate || isAggregate(value)) {\n setAtPath(out, path, evaluateGroupExpression(value, rows, firstNs));\n } else if (isPlainObject(value)) {\n addGroupSelectObject(out, path, value as Select, rows, firstNs, query);\n } else {\n setAtPath(out, path, value);\n }\n }\n}\n\nfunction evaluateIncludes(subquery: IncludesSubquery, parentNs: Record<string, unknown>): unknown {\n const parentValue = evaluateExpression(subquery.correlationField, parentNs);\n\n if (subquery.parentFilters) {\n for (const filter of subquery.parentFilters) {\n if (!toBooleanPredicate(evaluateExpression(getWhereExpression(filter), parentNs))) {\n return subquery.materialization === 'concat'\n ? ''\n : subquery.materialization === 'single'\n ? undefined\n : [];\n }\n }\n }\n\n const correlation = new Func('eq', [\n subquery.childCorrelationField,\n new Value(parentValue),\n ]) as BasicExpression<boolean>;\n const childQuery: QueryIR = {\n ...subquery.query,\n where: [...(subquery.query.where ?? []), correlation],\n };\n const candidates = includeCandidateOrdinals(subquery, parentValue);\n const rows = candidates === undefined\n ? runCollection(childQuery)\n // The builder removes the correlation predicate from subquery.query.\n // Candidate ordinals already enforce it, so compiling the base child query\n // avoids rebuilding an equivalent equality expression for every parent.\n : (includeFastPathExecutor(subquery)?.(candidates) ?? runCollection(childQuery));\n\n if (subquery.materialization === 'concat') {\n const scalarField = subquery.scalarField ?? INCLUDES_SCALAR_FIELD;\n return rows\n .map((row) => {\n if (row !== null && typeof row === 'object') {\n return String((row as RowRecord)[scalarField] ?? '');\n }\n return String(row ?? '');\n })\n .join('');\n }\n\n if (subquery.materialization === 'single') return rows[0];\n\n return rows;\n}\n\nfunction includeFastPathExecutor(subquery: IncludesSubquery): FastPathExecutor | undefined {\n if (!activeIncludeExecutorCache) return createFastPathExecutor(subquery.query);\n const cached = activeIncludeExecutorCache.get(subquery as object);\n if (cached !== undefined) return cached ?? undefined;\n const executor = createFastPathExecutor(subquery.query) ?? null;\n activeIncludeExecutorCache.set(subquery as object, executor);\n return executor ?? undefined;\n}\n\nfunction includeCandidateOrdinals(\n subquery: IncludesSubquery,\n parentValue: unknown,\n): Uint32Array | undefined {\n if (isUnknown(parentValue) || !activeIncludeCandidateCache) return new Uint32Array(0);\n const from = subquery.query.from;\n const field = subquery.childCorrelationField;\n if (from.type !== 'collectionRef' ||\n !(field instanceof PropRef) ||\n field.path.length !== 2 ||\n field.path[0] !== from.alias) {\n return undefined;\n }\n\n let buckets = activeIncludeCandidateCache.get(subquery as object);\n if (!buckets) {\n const mutable = new Map<unknown, number[]>();\n const column = field.path[1]!;\n for (const ordinal of from.collection._internalLiveOrdinals()) {\n const value = from.collection._internalReadCell(column, ordinal);\n if (isUnknown(value)) continue;\n const key = hashJoinKey(value);\n const bucket = mutable.get(key);\n if (bucket) bucket.push(ordinal);\n else mutable.set(key, [ordinal]);\n }\n buckets = new Map();\n for (const [key, ordinals] of mutable) buckets.set(key, Uint32Array.from(ordinals));\n activeIncludeCandidateCache.set(subquery as object, buckets);\n }\n return buckets.get(hashJoinKey(parentValue)) ?? new Uint32Array(0);\n}\n\n// ---------------------------------------------------------------------\n// Expression evaluation\n// ---------------------------------------------------------------------\n\nfunction evaluateExpression(expr: BasicExpression, ns: Record<string, unknown>): unknown {\n switch (expr.type) {\n case 'val':\n return expr.value;\n case 'ref':\n return readPath(ns, expr.path);\n case 'func':\n return evaluateFunc(expr, ns, false);\n }\n}\n\nfunction evaluateSingleRowExpression(expr: BasicExpression, row: Record<string, unknown>): unknown {\n switch (expr.type) {\n case 'val':\n return expr.value;\n case 'ref':\n return readPath(row, expr.path);\n case 'func':\n return evaluateFunc(expr, row, true);\n }\n}\n\nfunction evaluateFunc(func: Func, row: Record<string, unknown>, singleRow: boolean): unknown {\n const evalArg = (expr: BasicExpression) =>\n singleRow ? evaluateSingleRowExpression(expr, row) : evaluateExpression(expr, row);\n\n return evaluateFuncWith(func, evalArg);\n}\n\nfunction evaluateFuncWith(\n func: Func,\n evalArg: (expression: BasicExpression) => unknown,\n): unknown {\n switch (func.name) {\n case 'eq': {\n const a = evalArg(func.args[0]!);\n const b = evalArg(func.args[1]!);\n return isUnknown(a) || isUnknown(b) ? null : valuesEqual(a, b);\n }\n case 'gt':\n return compareMaybe(evalArg(func.args[0]!), evalArg(func.args[1]!), (c) => c > 0);\n case 'gte':\n return compareMaybe(evalArg(func.args[0]!), evalArg(func.args[1]!), (c) => c >= 0);\n case 'lt':\n return compareMaybe(evalArg(func.args[0]!), evalArg(func.args[1]!), (c) => c < 0);\n case 'lte':\n return compareMaybe(evalArg(func.args[0]!), evalArg(func.args[1]!), (c) => c <= 0);\n case 'and': {\n let unknown = false;\n for (const arg of func.args) {\n const value = evalArg(arg);\n if (value === false) return false;\n if (isUnknown(value)) unknown = true;\n }\n return unknown ? null : true;\n }\n case 'or': {\n let unknown = false;\n for (const arg of func.args) {\n const value = evalArg(arg);\n if (value === true) return true;\n if (isUnknown(value)) unknown = true;\n }\n return unknown ? null : false;\n }\n case 'not': {\n const value = evalArg(func.args[0]!);\n return isUnknown(value) ? null : !value;\n }\n case 'in': {\n const value = evalArg(func.args[0]!);\n const arr = evalArg(func.args[1]!);\n if (isUnknown(value)) return null;\n if (!Array.isArray(arr)) return false;\n return arr.some((item) => valuesEqual(item, value));\n }\n case 'like':\n return evaluateLike(evalArg(func.args[0]!), evalArg(func.args[1]!), false);\n case 'ilike':\n return evaluateLike(evalArg(func.args[0]!), evalArg(func.args[1]!), true);\n case 'upper': {\n const value = evalArg(func.args[0]!);\n return typeof value === 'string' ? value.toUpperCase() : value;\n }\n case 'lower': {\n const value = evalArg(func.args[0]!);\n return typeof value === 'string' ? value.toLowerCase() : value;\n }\n case 'length': {\n const value = evalArg(func.args[0]!);\n return typeof value === 'string' || Array.isArray(value) ? value.length : 0;\n }\n case 'concat':\n return func.args.map((arg) => String(evalArg(arg) ?? '')).join('');\n case 'add':\n return ((evalArg(func.args[0]!) ?? 0) as any) + ((evalArg(func.args[1]!) ?? 0) as any);\n case 'subtract':\n return ((evalArg(func.args[0]!) ?? 0) as any) - ((evalArg(func.args[1]!) ?? 0) as any);\n case 'multiply':\n return ((evalArg(func.args[0]!) ?? 0) as any) * ((evalArg(func.args[1]!) ?? 0) as any);\n case 'divide': {\n const divisor = (evalArg(func.args[1]!) ?? 0) as any;\n return divisor !== 0\n ? ((evalArg(func.args[0]!) ?? 0) as any) / divisor\n : null;\n }\n case 'coalesce': {\n for (const arg of func.args) {\n const value = evalArg(arg);\n if (!isUnknown(value)) return value;\n }\n return null;\n }\n case 'caseWhen': {\n const pairCount = Math.floor(func.args.length / 2);\n for (let index = 0; index < pairCount; index++) {\n if (isCaseWhenConditionTrue(evalArg(func.args[index * 2]!))) {\n return evalArg(func.args[index * 2 + 1]!);\n }\n }\n return func.args.length % 2 === 1\n ? evalArg(func.args[func.args.length - 1]!)\n : null;\n }\n case 'isUndefined':\n return evalArg(func.args[0]!) === undefined;\n case 'isNull':\n return evalArg(func.args[0]!) === null;\n case 'bboxIntersects': {\n const geometry = evalArg(func.args[0]!);\n const bbox = evalGeoBboxArg(evalArg(func.args[1]!), 'bbox');\n const geometryBbox = pointBboxOrNull(geometry);\n return geometryBbox === null ? false : bboxIntersectsRaw(geometryBbox, bbox);\n }\n case 'bboxWithin': {\n const geometry = evalArg(func.args[0]!);\n const bbox = evalGeoBboxArg(evalArg(func.args[1]!), 'bbox');\n const geometryBbox = pointBboxOrNull(geometry);\n return geometryBbox === null ? false : bboxWithinRaw(geometryBbox, bbox);\n }\n case 'dwithin': {\n const geometry = evalArg(func.args[0]!);\n const point = evalGeoPointArg(evalArg(func.args[1]!), 'point');\n const meters = evalGeoRadiusMeters(evalArg(func.args[2]!));\n const rowPoint = pointOrNull(geometry);\n return rowPoint === null ? false : haversineDistanceMeters(rowPoint, point) <= meters;\n }\n case 'within': {\n const point = pointOrNull(evalArg(func.args[0]!));\n const polygon = polygonOrNull(evalArg(func.args[1]!));\n return point === null || polygon === null ? false : pointInPolygon(point, polygon);\n }\n case 'contains': {\n const polygon = polygonOrNull(evalArg(func.args[0]!));\n const point = pointOrNull(evalArg(func.args[1]!));\n return point === null || polygon === null ? false : pointInPolygon(point, polygon);\n }\n default:\n throw new ValidationError(`unknown query function: ${func.name}`);\n }\n}\n\nfunction evalGeoBboxArg(value: unknown, label: string): BBox {\n assertValidBbox(value, label);\n return value;\n}\n\nfunction evalGeoPointArg(value: unknown, label: string): Point {\n assertValidPoint(value, label);\n return value;\n}\n\nfunction evalGeoRadiusMeters(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ValidationError('radius meters must be finite');\n }\n if (value < 0) {\n throw new ValidationError('radius meters must be >= 0');\n }\n return value;\n}\n\nfunction pointBboxOrNull(value: unknown): BBox | null {\n const point = pointOrNull(value);\n return point === null ? null : pointBbox(point);\n}\n\nfunction pointOrNull(value: unknown): Point | null {\n if (isUnknown(value)) return null;\n assertValidPoint(value, 'geometry');\n return value;\n}\n\nfunction polygonOrNull(value: unknown): Polygon | null {\n if (isUnknown(value)) return null;\n return normalizePolygon(value, {}, 'polygon');\n}\n\nfunction evaluateGroupExpression(\n expr: BasicExpression | Aggregate,\n rows: Array<WorkRow>,\n firstNs: Record<string, unknown>,\n): unknown {\n if (expr instanceof Aggregate || isAggregate(expr)) {\n return computeAggregate(expr, rows);\n }\n if (expr.type === 'func') {\n const evaluatedArgs = expr.args.map((arg) =>\n arg instanceof Aggregate || isAggregate(arg)\n ? new Value(evaluateGroupExpression(arg, rows, firstNs))\n : isBasicExpression(arg) && containsAggregate(arg)\n ? new Value(evaluateGroupExpression(arg, rows, firstNs))\n : new Value(evaluateExpression(arg, firstNs)),\n );\n return evaluateExpression(new Func(expr.name, evaluatedArgs), firstNs);\n }\n return evaluateExpression(expr, firstNs);\n}\n\nfunction computeAggregate(agg: Aggregate, rows: Array<WorkRow>): unknown {\n const values = rows.map((row) => evaluateExpression(agg.args[0]!, row.ns));\n switch (agg.name) {\n case 'count':\n return values.length;\n case 'sum':\n return sumValues(values);\n case 'avg':\n return values.length === 0\n ? 0\n : sumValues(values) / values.length;\n case 'min':\n return minMax(values, 'min');\n case 'max':\n return minMax(values, 'max');\n default:\n throw new ValidationError(`unsupported aggregate: ${agg.name}`);\n }\n}\n\nfunction containsAggregate(expr: unknown): boolean {\n if (expr instanceof Aggregate || isAggregate(expr)) return true;\n if (expr instanceof Func || isFunc(expr)) return expr.args.some((arg) => containsAggregate(arg));\n return false;\n}\n\nfunction containsAggregateInSelect(select: unknown): boolean {\n if (select === undefined) return false;\n if (containsAggregate(select)) return true;\n if (!isPlainObject(select) || isExpressionLike(select)) return false;\n return Object.values(select).some((value) => containsAggregateInSelect(value));\n}\n\nfunction containsAggregateInHaving(having?: Array<Having>): boolean {\n return (having ?? []).some((clause) => containsAggregate(getHavingExpression(clause)));\n}\n\n// ---------------------------------------------------------------------\n// Ordering / distinct / finalization\n// ---------------------------------------------------------------------\n\nfunction distinctRows(rows: Array<WorkRow>): Array<WorkRow> {\n const seen = new Set<string>();\n const out: Array<WorkRow> = [];\n for (const row of rows) {\n const key = stableKey(finalizeSelected(row.ns));\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(row);\n }\n return out;\n}\n\nfunction orderRows(rows: Array<WorkRow>, orderBy: NonNullable<QueryIR['orderBy']>): Array<WorkRow> {\n const sorted = rows.slice();\n sorted.sort((a, b) => {\n for (const clause of orderBy) {\n const av = evaluateExpression(clause.expression, a.ns);\n const bv = evaluateExpression(clause.expression, b.ns);\n const cmp = compareForOrder(av, bv, clause.compareOptions);\n if (cmp !== 0) return cmp;\n }\n return 0;\n });\n return sorted;\n}\n\nfunction compareForOrder(a: unknown, b: unknown, options: CompareOptions): number {\n const aNull = isUnknown(a) || (typeof a === 'number' && Number.isNaN(a));\n const bNull = isUnknown(b) || (typeof b === 'number' && Number.isNaN(b));\n if (aNull || bNull) {\n if (aNull && bNull) return 0;\n const nullFirst = options.nulls === 'first';\n const base = aNull ? (nullFirst ? -1 : 1) : (nullFirst ? 1 : -1);\n return options.direction === 'desc' ? -base : base;\n }\n\n let cmp: number;\n if (typeof a === 'string' && typeof b === 'string') {\n if (options.stringSort === 'locale') {\n cmp = a.localeCompare(b, options.locale, options.localeOptions as Intl.CollatorOptions | undefined);\n } else {\n cmp = a < b ? -1 : a > b ? 1 : 0;\n }\n } else {\n cmp = comparePrimitive(a, b);\n }\n return options.direction === 'desc' ? -cmp : cmp;\n}\n\nfunction finalizeSelected(ns: Record<string, unknown>): unknown {\n return cloneOutput(ns.$selected);\n}\n\n// ---------------------------------------------------------------------\n// Compiler metadata + collection discovery\n// ---------------------------------------------------------------------\n\nfunction collectAliasMetadata(\n from: From,\n aliasToCollectionId: Record<string, string>,\n aliasRemapping: Record<string, string>,\n): void {\n if (from.type === 'collectionRef') {\n aliasToCollectionId[from.alias] = from.collection.id;\n return;\n }\n\n const innerAlias = aliasFor(from.query.from);\n const innerCollectionId = collectionIdFor(from.query.from);\n if (innerAlias) aliasRemapping[from.alias] = innerAlias;\n if (innerCollectionId) aliasToCollectionId[from.alias] = innerCollectionId;\n collectAliasMetadata(from.query.from, aliasToCollectionId, aliasRemapping);\n for (const join of from.query.join ?? []) {\n collectAliasMetadata(join.from, aliasToCollectionId, aliasRemapping);\n }\n}\n\nfunction collectionIdFor(from: From): string | undefined {\n if (from.type === 'collectionRef') return from.collection.id;\n return collectionIdFor(from.query.from);\n}\n\nfunction aliasFor(from: From): string | undefined {\n if (from.type === 'collectionRef') return from.alias;\n return aliasFor(from.query.from);\n}\n\nfunction collectSourceWhereClauses(query: QueryIR): Map<string, BasicExpression<boolean>> {\n const clauses = new Map<string, BasicExpression<boolean>>();\n for (const where of query.where ?? []) {\n const expression = getWhereExpression(where);\n const aliases = referencedAliases(expression);\n if (aliases.size !== 1) continue;\n const [alias] = aliases;\n if (!alias) continue;\n const existing = clauses.get(alias);\n clauses.set(alias, existing ? new Func('and', [existing, expression]) as BasicExpression<boolean> : expression);\n }\n return clauses;\n}\n\nfunction referencedAliases(expression: BasicExpression | Aggregate | IncludesSubquery): Set<string> {\n const aliases = new Set<string>();\n visitExpression(expression, aliases);\n return aliases;\n}\n\nfunction visitExpression(value: unknown, aliases: Set<string>): void {\n if (value instanceof PropRef) {\n const [alias] = value.path;\n if (alias) aliases.add(alias);\n return;\n }\n if (value instanceof Func || value instanceof Aggregate) {\n for (const arg of value.args) visitExpression(arg, aliases);\n return;\n }\n if (value instanceof IncludesSubquery || isIncludes(value)) {\n return;\n }\n if (!isPlainObject(value) || isExpressionLike(value)) return;\n for (const child of Object.values(value)) visitExpression(child, aliases);\n}\n\nfunction compileIncludes(value: unknown): Array<IncludesCompilationResult> {\n const out: Array<IncludesCompilationResult> = [];\n collectCompiledIncludes(value, out);\n return out;\n}\n\nfunction collectCompiledIncludes(value: unknown, out: Array<IncludesCompilationResult>): void {\n if (value instanceof IncludesSubquery || isIncludes(value)) {\n out.push({\n pipeline: runCollection(value.query),\n fieldName: value.fieldName,\n correlationField: value.correlationField,\n childCorrelationField: value.childCorrelationField,\n hasOrderBy: (value.query.orderBy?.length ?? 0) > 0,\n childCompilationResult: compileQuery(value.query),\n ...(value.parentProjection !== undefined ? { parentProjection: value.parentProjection } : {}),\n materialization: value.materialization,\n ...(value.scalarField !== undefined ? { scalarField: value.scalarField } : {}),\n });\n return;\n }\n if (!isPlainObject(value) || isExpressionLike(value)) return;\n for (const child of Object.values(value)) collectCompiledIncludes(child, out);\n}\n\nfunction collectCollections(query: QueryIR, out = new Set<Collection>()): Array<Collection> {\n collectFrom(query.from, out);\n for (const join of query.join ?? []) collectFrom(join.from, out);\n collectIncludes(query.select as unknown, out);\n return [...out];\n}\n\nfunction collectFrom(from: From, out: Set<Collection>): void {\n if (from.type === 'collectionRef') {\n out.add(from.collection);\n } else if (from.type === 'queryRef') {\n collectCollections(from.query, out);\n }\n}\n\nfunction collectIncludes(value: unknown, out: Set<Collection>): void {\n if (value instanceof IncludesSubquery || isIncludes(value)) {\n collectCollections(value.query, out);\n return;\n }\n if (!isPlainObject(value) || isExpressionLike(value)) return;\n for (const child of Object.values(value)) collectIncludes(child, out);\n}\n\n// ---------------------------------------------------------------------\n// Low-level utilities\n// ---------------------------------------------------------------------\n\nfunction isUnknown(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\nfunction isCaseWhenConditionTrue(value: unknown): boolean {\n if (value == null || value === false) return false;\n if (value === true) return true;\n if (typeof value === 'number') return value !== 0 && !Number.isNaN(value);\n if (typeof value === 'bigint') return value !== 0n;\n return Boolean(value);\n}\n\nfunction valuesEqual(a: unknown, b: unknown): boolean {\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n return Object.is(a, b);\n}\n\nfunction compareMaybe(a: unknown, b: unknown, predicate: (cmp: number) => boolean): boolean | null {\n if (isUnknown(a) || isUnknown(b)) return null;\n return predicate(comparePrimitive(a, b));\n}\n\nfunction comparePrimitive(a: unknown, b: unknown): number {\n if (a === b) return 0;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : a > b ? 1 : 0;\n if (typeof a === 'bigint' || typeof b === 'bigint') return Number(a) - Number(b);\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n if (typeof a === 'string' && typeof b === 'string') return a < b ? -1 : a > b ? 1 : 0;\n const as = String(a);\n const bs = String(b);\n return as < bs ? -1 : as > bs ? 1 : 0;\n}\n\nfunction evaluateLike(value: unknown, pattern: unknown, caseInsensitive: boolean): boolean | null {\n if (isUnknown(value) || isUnknown(pattern)) return null;\n if (typeof value !== 'string' || typeof pattern !== 'string') return false;\n const source = caseInsensitive ? value.toLowerCase() : value;\n const pat = caseInsensitive ? pattern.toLowerCase() : pattern;\n const re = new RegExp(`^${pat.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/%/g, '.*').replace(/_/g, '.')}$`);\n return re.test(source);\n}\n\nfunction readPath(source: Record<string, unknown>, path: Array<string>): unknown {\n let value: unknown = source;\n for (const segment of path) {\n if (value === null || value === undefined) return value;\n if (typeof value !== 'object') return undefined;\n value = (value as RowRecord)[segment];\n }\n return value;\n}\n\nfunction setAtPath(target: RowRecord, path: Array<string>, value: unknown): void {\n let cursor = target;\n for (let i = 0; i < path.length - 1; i++) {\n const segment = path[i]!;\n const next = cursor[segment];\n if (next === null || typeof next !== 'object' || Array.isArray(next)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as RowRecord;\n }\n cursor[path[path.length - 1]!] = value;\n}\n\nfunction mergeAtPath(target: RowRecord, path: Array<string>, value: unknown): void {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return;\n let cursor = target;\n for (const segment of path) {\n const next = cursor[segment];\n if (next === null || typeof next !== 'object' || Array.isArray(next)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as RowRecord;\n }\n for (const [k, v] of Object.entries(value)) cursor[k] = cloneOutput(v);\n}\n\nfunction rowToRecord(row: unknown): RowRecord {\n if (row !== null && typeof row === 'object' && !Array.isArray(row)) {\n return cloneRecord(row as RowRecord);\n }\n return { value: row };\n}\n\nfunction cloneRecord(row: Record<string, unknown>): RowRecord {\n return { ...row };\n}\n\nfunction stripInternalFields(row: Record<string, unknown>): RowRecord {\n const out: RowRecord = {};\n for (const [key, value] of Object.entries(row)) {\n if (key.startsWith('__')) continue;\n out[key] = cloneOutput(value);\n }\n return out;\n}\n\nfunction cloneOutput(value: unknown): unknown {\n if (Array.isArray(value)) return value.map((item) => cloneOutput(item));\n if (value !== null && typeof value === 'object') {\n if (value instanceof Date) return new Date(value.getTime());\n const out: RowRecord = {};\n for (const [key, child] of Object.entries(value)) {\n if (typeof key === 'symbol') continue;\n out[key] = cloneOutput(child);\n }\n return out;\n }\n return value;\n}\n\nfunction stableKey(value: unknown): string {\n return JSON.stringify(value, (_key, child) => {\n if (typeof child === 'bigint') return `${child.toString()}n`;\n if (child instanceof Date) return child.toISOString();\n if (child !== null && typeof child === 'object' && !Array.isArray(child)) {\n const sorted: RowRecord = {};\n for (const key of Object.keys(child).sort()) sorted[key] = (child as RowRecord)[key];\n return sorted;\n }\n return child;\n });\n}\n\nfunction numberValue(value: unknown): number {\n if (typeof value === 'number') return value;\n if (typeof value === 'bigint') return Number(value);\n if (isUnknown(value)) return 0;\n const n = Number(value);\n return Number.isFinite(n) ? n : 0;\n}\n\nfunction sumValues(values: Array<unknown>): number {\n let sum = 0;\n for (const value of values) sum += numberValue(value);\n return sum;\n}\n\nfunction minMax(values: Array<unknown>, mode: 'min' | 'max'): unknown {\n const filtered = values.filter((value) => !isUnknown(value));\n if (filtered.length === 0) return null;\n let best = filtered[0]!;\n for (let i = 1; i < filtered.length; i++) {\n const value = filtered[i]!;\n const cmp = comparePrimitive(value, best);\n if ((mode === 'min' && cmp < 0) || (mode === 'max' && cmp > 0)) best = value;\n }\n return best;\n}\n\nfunction isPlainObject(value: unknown): value is RowRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isBasicExpression(value: unknown): value is BasicExpression {\n return (\n value instanceof PropRef ||\n value instanceof Value ||\n value instanceof Func ||\n (isExpressionLike(value) &&\n ((value as { type: unknown }).type === 'ref' ||\n (value as { type: unknown }).type === 'val' ||\n (value as { type: unknown }).type === 'func'))\n );\n}\n\nfunction isFunc(value: unknown): value is Func {\n return value instanceof Func || (isExpressionLike(value) && (value as { type: unknown }).type === 'func');\n}\n\nfunction isAggregate(value: unknown): value is Aggregate {\n return value instanceof Aggregate || (isExpressionLike(value) && (value as { type: unknown }).type === 'agg');\n}\n\nfunction isIncludes(value: unknown): value is IncludesSubquery {\n return value instanceof IncludesSubquery || (isExpressionLike(value) && (value as { type: unknown }).type === 'includesSubquery');\n}\n","import type { CompareOptions } from '../query/ir.js';\n\nexport const DEFAULT_INDEX_COMPARE_OPTIONS: CompareOptions = {\n direction: 'asc',\n nulls: 'first',\n stringSort: 'locale',\n};\n\nconst objectIds = new WeakMap<object, number>();\nlet nextObjectId = 1;\nconst UINT8ARRAY_NORMALIZE_THRESHOLD = 128;\nconst UNDEFINED_SENTINEL = '__TS_DB_BTREE_UNDEFINED_VALUE__';\n\nexport function makeComparator(options: CompareOptions): (a: unknown, b: unknown) => number {\n return (a, b) =>\n options.direction === 'desc'\n ? ascComparator(b, a, {\n ...options,\n nulls: options.nulls === 'first' ? 'last' : 'first',\n })\n : ascComparator(a, b, options);\n}\n\nexport const defaultComparator = makeComparator(DEFAULT_INDEX_COMPARE_OPTIONS);\n\nexport function normalizeValue(value: unknown): unknown {\n if (value instanceof Date) return value.getTime();\n if (isTemporalLike(value)) return `__temporal__${value[Symbol.toStringTag]}__${value.toString()}`;\n if (isUint8Array(value) && value.byteLength <= UINT8ARRAY_NORMALIZE_THRESHOLD) {\n return `__u8__${Array.from(value).join(',')}`;\n }\n return value;\n}\n\nexport function normalizeForBTree(value: unknown): unknown {\n return value === undefined ? UNDEFINED_SENTINEL : normalizeValue(value);\n}\n\nexport function denormalizeUndefined(value: unknown): unknown {\n return value === UNDEFINED_SENTINEL ? undefined : value;\n}\n\nexport function findInsertPositionInArray(\n sortedArray: Array<unknown>,\n value: unknown,\n compareFn: (a: unknown, b: unknown) => number,\n): number {\n let left = 0;\n let right = sortedArray.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n const comparison = compareFn(sortedArray[mid], value);\n if (comparison < 0) left = mid + 1;\n else right = mid;\n }\n return left;\n}\n\nexport function deleteInSortedArray(\n sortedArray: Array<unknown>,\n value: unknown,\n compareFn: (a: unknown, b: unknown) => number,\n): boolean {\n const idx = findInsertPositionInArray(sortedArray, value, compareFn);\n if (idx < sortedArray.length && compareFn(sortedArray[idx], value) === 0) {\n sortedArray.splice(idx, 1);\n return true;\n }\n return false;\n}\n\nexport function deepEquals(a: unknown, b: unknown): boolean {\n return deepEqualsInternal(a, b, new Map<object, object>());\n}\n\nfunction ascComparator(a: unknown, b: unknown, options: CompareOptions): number {\n if (a == null && b == null) return 0;\n if (a == null) return options.nulls === 'first' ? -1 : 1;\n if (b == null) return options.nulls === 'first' ? 1 : -1;\n\n if (typeof a === 'string' && typeof b === 'string') {\n if (options.stringSort === 'locale') {\n return a.localeCompare(\n b,\n options.locale,\n options.localeOptions as Intl.CollatorOptions | undefined,\n );\n }\n return a < b ? -1 : a > b ? 1 : 0;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const result = ascComparator(a[i], b[i], options);\n if (result !== 0) return result;\n }\n return a.length - b.length;\n }\n\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (isTemporalLike(a) && isTemporalLike(b)) {\n const as = a.toString();\n const bs = b.toString();\n return as < bs ? -1 : as > bs ? 1 : 0;\n }\n\n const aIsObject = typeof a === 'object' && a !== null;\n const bIsObject = typeof b === 'object' && b !== null;\n if (aIsObject || bIsObject) {\n if (aIsObject && bIsObject) return getObjectId(a) - getObjectId(b);\n return aIsObject ? 1 : -1;\n }\n\n if ((a as never) < (b as never)) return -1;\n if ((a as never) > (b as never)) return 1;\n return 0;\n}\n\nfunction getObjectId(obj: object): number {\n const existing = objectIds.get(obj);\n if (existing !== undefined) return existing;\n const id = nextObjectId++;\n objectIds.set(obj, id);\n return id;\n}\n\nfunction isTemporalLike(value: unknown): value is { [Symbol.toStringTag]: string; toString(): string } {\n if (value === null || typeof value !== 'object') return false;\n const tag = (value as { [Symbol.toStringTag]?: unknown })[Symbol.toStringTag];\n return typeof tag === 'string' && tag.startsWith('Temporal.');\n}\n\nfunction isUint8Array(value: unknown): value is Uint8Array {\n return (\n (typeof Buffer !== 'undefined' && value instanceof Buffer) || value instanceof Uint8Array\n );\n}\n\nfunction deepEqualsInternal(a: unknown, b: unknown, visited: Map<object, object>): boolean {\n if (a === b) return true;\n if (a === null || b === null || a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n if (a instanceof Date || b instanceof Date) {\n return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n }\n if (a instanceof RegExp || b instanceof RegExp) {\n return a instanceof RegExp && b instanceof RegExp && a.source === b.source && a.flags === b.flags;\n }\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const left = a as object;\n const right = b as object;\n if (visited.get(left) === right) return true;\n visited.set(left, right);\n\n if (a instanceof Map || b instanceof Map) {\n if (!(a instanceof Map) || !(b instanceof Map) || a.size !== b.size) return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !deepEqualsInternal(value, b.get(key), visited)) return false;\n }\n return true;\n }\n\n if (a instanceof Set || b instanceof Set) {\n if (!(a instanceof Set) || !(b instanceof Set) || a.size !== b.size) return false;\n for (const value of a) if (!b.has(value)) return false;\n return true;\n }\n\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((value, index) => deepEqualsInternal(value, b[index], visited));\n }\n\n const keysA = Object.keys(a as Record<string, unknown>);\n const keysB = Object.keys(b as Record<string, unknown>);\n if (keysA.length !== keysB.length) return false;\n return keysA.every((key) =>\n Object.prototype.hasOwnProperty.call(b, key) &&\n deepEqualsInternal(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n visited,\n ),\n );\n}\n","import { comparisonFunctions } from '../query/expressions.js';\nimport type { BasicExpression, CompareOptions, OrderByDirection } from '../query/ir.js';\nimport { compileSingleRowExpression } from '../query/compiler.js';\nimport { DEFAULT_INDEX_COMPARE_OPTIONS, deepEquals } from './comparison.js';\nimport type { RangeQueryOptions } from './range.js';\n\n/** Operations that index implementations can support. */\nexport const IndexOperation = comparisonFunctions;\nexport type IndexOperation = (typeof comparisonFunctions)[number];\n\n/** Statistics about index usage and performance. */\nexport interface IndexStats {\n readonly entryCount: number;\n readonly lookupCount: number;\n readonly averageLookupTime: number;\n readonly lastUpdated: Date;\n}\n\nexport interface IndexInterface<TKey extends string | number = string | number> {\n add(key: TKey, item: unknown): void;\n remove(key: TKey, item: unknown): void;\n update(key: TKey, oldItem: unknown, newItem: unknown): void;\n build(entries: Iterable<[TKey, unknown]>): void;\n clear(): void;\n lookup(operation: IndexOperation, value: unknown): Set<TKey>;\n equalityLookup(value: unknown): Set<TKey>;\n inArrayLookup(values: Array<unknown>): Set<TKey>;\n rangeQuery(options?: RangeQueryOptions): Set<TKey>;\n rangeQueryReversed(options?: RangeQueryOptions): Set<TKey>;\n take(n: number, from?: unknown, filterFn?: (key: TKey) => boolean): Array<TKey>;\n takeFromStart(n: number, filterFn?: (key: TKey) => boolean): Array<TKey>;\n takeReversed(n: number, from?: unknown, filterFn?: (key: TKey) => boolean): Array<TKey>;\n takeReversedFromEnd(n: number, filterFn?: (key: TKey) => boolean): Array<TKey>;\n get keyCount(): number;\n get orderedEntriesArray(): Array<[unknown, Set<TKey>]>;\n get orderedEntriesArrayReversed(): Array<[unknown, Set<TKey>]>;\n get indexedKeysSet(): Set<TKey>;\n get valueMapData(): Map<unknown, Set<TKey>>;\n supports(operation: IndexOperation): boolean;\n matchesField(fieldPath: Array<string>): boolean;\n matchesCompareOptions(compareOptions: CompareOptions): boolean;\n matchesDirection(direction: OrderByDirection): boolean;\n getStats(): IndexStats;\n}\n\n/** Base abstract class that all index types extend. */\nexport abstract class BaseIndex<TKey extends string | number = string | number>\n implements IndexInterface<TKey>\n{\n readonly id: number;\n readonly name?: string;\n readonly expression: BasicExpression;\n abstract readonly supportedOperations: Set<IndexOperation>;\n protected lookupCount = 0;\n protected totalLookupTime = 0;\n protected lastUpdated = new Date();\n protected compareOptions: CompareOptions = DEFAULT_INDEX_COMPARE_OPTIONS;\n\n constructor(id: number, expression: BasicExpression, name?: string, options?: unknown) {\n this.id = id;\n this.expression = expression;\n if (name !== undefined) this.name = name;\n this.initialize(options);\n }\n\n abstract add(key: TKey, item: unknown): void;\n abstract remove(key: TKey, item: unknown): void;\n abstract update(key: TKey, oldItem: unknown, newItem: unknown): void;\n abstract build(entries: Iterable<[TKey, unknown]>): void;\n abstract clear(): void;\n abstract lookup(operation: IndexOperation, value: unknown): Set<TKey>;\n abstract equalityLookup(value: unknown): Set<TKey>;\n abstract inArrayLookup(values: Array<unknown>): Set<TKey>;\n abstract rangeQuery(options?: RangeQueryOptions): Set<TKey>;\n abstract rangeQueryReversed(options?: RangeQueryOptions): Set<TKey>;\n abstract take(n: number, from?: unknown, filterFn?: (key: TKey) => boolean): Array<TKey>;\n abstract takeFromStart(n: number, filterFn?: (key: TKey) => boolean): Array<TKey>;\n abstract takeReversed(n: number, from?: unknown, filterFn?: (key: TKey) => boolean): Array<TKey>;\n abstract takeReversedFromEnd(n: number, filterFn?: (key: TKey) => boolean): Array<TKey>;\n abstract get keyCount(): number;\n abstract get orderedEntriesArray(): Array<[unknown, Set<TKey>]>;\n abstract get orderedEntriesArrayReversed(): Array<[unknown, Set<TKey>]>;\n abstract get indexedKeysSet(): Set<TKey>;\n abstract get valueMapData(): Map<unknown, Set<TKey>>;\n protected abstract initialize(options?: unknown): void;\n\n supports(operation: IndexOperation): boolean {\n return this.supportedOperations.has(operation);\n }\n\n matchesField(fieldPath: Array<string>): boolean {\n return (\n this.expression.type === 'ref' &&\n this.expression.path.length === fieldPath.length &&\n this.expression.path.every((part, index) => part === fieldPath[index])\n );\n }\n\n /** Checks compare options; direction ignored because ReverseIndex can flip traversal. */\n matchesCompareOptions(compareOptions: CompareOptions): boolean {\n const { direction: _leftDirection, ...left } = this.compareOptions;\n const { direction: _rightDirection, ...right } = compareOptions;\n return deepEquals(left, right);\n }\n\n matchesDirection(direction: OrderByDirection): boolean {\n return this.compareOptions.direction === direction;\n }\n\n getStats(): IndexStats {\n return {\n entryCount: this.keyCount,\n lookupCount: this.lookupCount,\n averageLookupTime: this.lookupCount > 0 ? this.totalLookupTime / this.lookupCount : 0,\n lastUpdated: this.lastUpdated,\n };\n }\n\n protected evaluateIndexExpression(item: unknown): unknown {\n const evaluator = compileSingleRowExpression(this.expression);\n return evaluator(item as Record<string, unknown>);\n }\n\n protected trackLookup(startTime: number): void {\n this.lookupCount++;\n this.totalLookupTime += performance.now() - startTime;\n }\n\n protected updateTimestamp(): void {\n this.lastUpdated = new Date();\n }\n}\n\n/** Type for index constructors. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type IndexConstructor<TKey extends string | number = string | number> = new (\n id: number,\n expression: BasicExpression,\n name?: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options?: any,\n) => BaseIndex<TKey>;\n","import { BaseIndex, type IndexOperation } from './base-index.js';\nimport type { CompareOptions, BasicExpression } from '../query/ir.js';\nimport {\n defaultComparator,\n deleteInSortedArray,\n findInsertPositionInArray,\n normalizeValue,\n} from './comparison.js';\nimport type { RangeQueryOptions } from './range.js';\n\n/** Options for BasicIndex. */\nexport interface BasicIndexOptions {\n compareFn?: (a: unknown, b: unknown) => number;\n compareOptions?: CompareOptions;\n}\n\n/**\n * Basic index using Map + sorted array.\n *\n * Map gives O(1) equality lookup; sorted values give simple range/take support.\n */\nexport class BasicIndex<TKey extends string | number = string | number> extends BaseIndex<TKey> {\n override readonly supportedOperations = new Set<IndexOperation>([\n 'eq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n ]);\n\n private valueMap = new Map<unknown, Set<TKey>>();\n private sortedValues: Array<unknown> = [];\n private indexedKeys = new Set<TKey>();\n private compareFn: (a: unknown, b: unknown) => number = defaultComparator;\n\n constructor(id: number, expression: BasicExpression, name?: string, options?: BasicIndexOptions) {\n super(id, expression, name, options);\n this.compareFn = options?.compareFn ?? defaultComparator;\n if (options?.compareOptions) this.compareOptions = options.compareOptions;\n }\n\n protected override initialize(_options?: BasicIndexOptions): void {\n // Subclass fields initialize after super(); constructor applies options.\n }\n\n override add(key: TKey, item: unknown): void {\n let indexedValue: unknown;\n try {\n indexedValue = this.evaluateIndexExpression(item);\n } catch (error) {\n throw new Error(`Failed to evaluate index expression for key ${String(key)}: ${String(error)}`, {\n cause: error,\n });\n }\n\n const normalizedValue = normalizeValue(indexedValue);\n const existing = this.valueMap.get(normalizedValue);\n if (existing) {\n existing.add(key);\n } else {\n this.valueMap.set(normalizedValue, new Set([key]));\n const insertIdx = findInsertPositionInArray(this.sortedValues, normalizedValue, this.compareFn);\n this.sortedValues.splice(insertIdx, 0, normalizedValue);\n }\n this.indexedKeys.add(key);\n this.updateTimestamp();\n }\n\n override remove(key: TKey, item: unknown): void {\n let indexedValue: unknown;\n try {\n indexedValue = this.evaluateIndexExpression(item);\n } catch (error) {\n console.warn(`Failed to evaluate index expression for key ${String(key)} during removal:`, error);\n this.indexedKeys.delete(key);\n this.updateTimestamp();\n return;\n }\n\n const normalizedValue = normalizeValue(indexedValue);\n const keySet = this.valueMap.get(normalizedValue);\n if (keySet) {\n keySet.delete(key);\n if (keySet.size === 0) {\n this.valueMap.delete(normalizedValue);\n deleteInSortedArray(this.sortedValues, normalizedValue, this.compareFn);\n }\n }\n this.indexedKeys.delete(key);\n this.updateTimestamp();\n }\n\n override update(key: TKey, oldItem: unknown, newItem: unknown): void {\n this.remove(key, oldItem);\n this.add(key, newItem);\n }\n\n override build(entries: Iterable<[TKey, unknown]>): void {\n this.clear();\n const normalizedEntries: Array<{ key: TKey; value: unknown }> = [];\n for (const [key, item] of entries) {\n let indexedValue: unknown;\n try {\n indexedValue = this.evaluateIndexExpression(item);\n } catch (error) {\n throw new Error(`Failed to evaluate index expression for key ${String(key)}: ${String(error)}`, {\n cause: error,\n });\n }\n normalizedEntries.push({ key, value: normalizeValue(indexedValue) });\n this.indexedKeys.add(key);\n }\n\n for (const { key, value } of normalizedEntries) {\n const keySet = this.valueMap.get(value);\n if (keySet) keySet.add(key);\n else this.valueMap.set(value, new Set([key]));\n }\n this.sortedValues = [];\n for (const value of this.valueMap.keys()) {\n const insertIdx = findInsertPositionInArray(this.sortedValues, value, this.compareFn);\n this.sortedValues.splice(insertIdx, 0, value);\n }\n this.updateTimestamp();\n }\n\n override clear(): void {\n this.valueMap.clear();\n this.sortedValues = [];\n this.indexedKeys.clear();\n this.updateTimestamp();\n }\n\n override lookup(operation: IndexOperation, value: unknown): Set<TKey> {\n const startTime = performance.now();\n let result: Set<TKey>;\n switch (operation) {\n case 'eq':\n result = this.equalityLookup(value);\n break;\n case 'gt':\n result = this.rangeQuery({ from: value, fromInclusive: false });\n break;\n case 'gte':\n result = this.rangeQuery({ from: value, fromInclusive: true });\n break;\n case 'lt':\n result = this.rangeQuery({ to: value, toInclusive: false });\n break;\n case 'lte':\n result = this.rangeQuery({ to: value, toInclusive: true });\n break;\n case 'in':\n result = this.inArrayLookup(Array.isArray(value) ? value : []);\n break;\n default:\n throw new Error(`Operation ${operation} not supported by BasicIndex`);\n }\n this.trackLookup(startTime);\n return result;\n }\n\n override get keyCount(): number {\n return this.indexedKeys.size;\n }\n\n override equalityLookup(value: unknown): Set<TKey> {\n return this.valueMap.get(normalizeValue(value)) ?? new Set<TKey>();\n }\n\n override rangeQuery(options: RangeQueryOptions = {}): Set<TKey> {\n const { from, to, fromInclusive = true, toInclusive = true } = options;\n const result = new Set<TKey>();\n if (this.sortedValues.length === 0) return result;\n\n const normalizedFrom = normalizeValue(from);\n const normalizedTo = normalizeValue(to);\n\n let startIdx = 0;\n if (normalizedFrom !== undefined) {\n startIdx = findInsertPositionInArray(this.sortedValues, normalizedFrom, this.compareFn);\n if (\n !fromInclusive &&\n startIdx < this.sortedValues.length &&\n this.compareFn(this.sortedValues[startIdx], normalizedFrom) === 0\n ) {\n startIdx++;\n }\n }\n\n let endIdx = this.sortedValues.length;\n if (normalizedTo !== undefined) {\n endIdx = findInsertPositionInArray(this.sortedValues, normalizedTo, this.compareFn);\n if (\n toInclusive &&\n endIdx < this.sortedValues.length &&\n this.compareFn(this.sortedValues[endIdx], normalizedTo) === 0\n ) {\n endIdx++;\n }\n }\n\n for (let i = startIdx; i < endIdx; i++) {\n const value = this.sortedValues[i];\n const keys = this.valueMap.get(value);\n if (keys) for (const key of keys) result.add(key);\n }\n return result;\n }\n\n override rangeQueryReversed(options: RangeQueryOptions = {}): Set<TKey> {\n const { from, to, fromInclusive = true, toInclusive = true } = options;\n const swappedFrom = to ?? this.sortedValues[this.sortedValues.length - 1];\n const swappedTo = from ?? this.sortedValues[0];\n return this.rangeQuery({\n from: swappedFrom,\n to: swappedTo,\n fromInclusive: toInclusive,\n toInclusive: fromInclusive,\n });\n }\n\n override take(n: number, from?: unknown, filterFn?: (key: TKey) => boolean): Array<TKey> {\n const result: Array<TKey> = [];\n let startIdx = 0;\n if (from !== undefined) {\n const normalizedFrom = normalizeValue(from);\n startIdx = findInsertPositionInArray(this.sortedValues, normalizedFrom, this.compareFn);\n while (\n startIdx < this.sortedValues.length &&\n this.compareFn(this.sortedValues[startIdx], normalizedFrom) <= 0\n ) {\n startIdx++;\n }\n }\n for (let i = startIdx; i < this.sortedValues.length && result.length < n; i++) {\n this.takeKeysForValue(this.sortedValues[i], result, n, filterFn);\n }\n return result;\n }\n\n override takeReversed(n: number, from?: unknown, filterFn?: (key: TKey) => boolean): Array<TKey> {\n const result: Array<TKey> = [];\n let startIdx = this.sortedValues.length - 1;\n if (from !== undefined) {\n const normalizedFrom = normalizeValue(from);\n startIdx = findInsertPositionInArray(this.sortedValues, normalizedFrom, this.compareFn) - 1;\n while (startIdx >= 0 && this.compareFn(this.sortedValues[startIdx], normalizedFrom) >= 0) {\n startIdx--;\n }\n }\n for (let i = startIdx; i >= 0 && result.length < n; i--) {\n this.takeKeysForValue(this.sortedValues[i], result, n, filterFn);\n }\n return result;\n }\n\n override takeFromStart(n: number, filterFn?: (key: TKey) => boolean): Array<TKey> {\n const result: Array<TKey> = [];\n for (let i = 0; i < this.sortedValues.length && result.length < n; i++) {\n this.takeKeysForValue(this.sortedValues[i], result, n, filterFn);\n }\n return result;\n }\n\n override takeReversedFromEnd(n: number, filterFn?: (key: TKey) => boolean): Array<TKey> {\n const result: Array<TKey> = [];\n for (let i = this.sortedValues.length - 1; i >= 0 && result.length < n; i--) {\n this.takeKeysForValue(this.sortedValues[i], result, n, filterFn);\n }\n return result;\n }\n\n override inArrayLookup(values: Array<unknown>): Set<TKey> {\n const result = new Set<TKey>();\n for (const value of values) {\n const keys = this.valueMap.get(normalizeValue(value));\n if (keys) for (const key of keys) result.add(key);\n }\n return result;\n }\n\n override get indexedKeysSet(): Set<TKey> {\n return this.indexedKeys;\n }\n\n override get orderedEntriesArray(): Array<[unknown, Set<TKey>]> {\n return this.sortedValues.map((value) => [value, this.valueMap.get(value) ?? new Set<TKey>()]);\n }\n\n override get orderedEntriesArrayReversed(): Array<[unknown, Set<TKey>]> {\n const result: Array<[unknown, Set<TKey>]> = [];\n for (let i = this.sortedValues.length - 1; i >= 0; i--) {\n const value = this.sortedValues[i];\n result.push([value, this.valueMap.get(value) ?? new Set<TKey>()]);\n }\n return result;\n }\n\n override get valueMapData(): Map<unknown, Set<TKey>> {\n return this.valueMap;\n }\n\n private takeKeysForValue(\n value: unknown,\n result: Array<TKey>,\n limit: number,\n filterFn?: (key: TKey) => boolean,\n ): void {\n const keys = this.valueMap.get(value);\n if (!keys) return;\n for (const key of keys) {\n if (result.length >= limit) return;\n if (!filterFn || filterFn(key)) result.push(key);\n }\n }\n}\n\nexport type { RangeQueryOptions } from './range.js';\n","/**\n * Index Dev Mode — TanStack DB parity (Layer D.3).\n *\n * Tracks slow query patterns and emits index suggestions in non-production\n * builds. Public root exports intentionally mirror @tanstack/db@0.6.16.\n */\n\nexport interface IndexDevModeConfig {\n /** Enable dev mode index suggestions. */\n enabled: boolean;\n /** Suggest indexes when collection has more than this many items. */\n collectionSizeThreshold: number;\n /** Suggest indexes when queries take longer than this many milliseconds. */\n slowQueryThresholdMs: number;\n /** Custom handler for index suggestions. */\n onSuggestion: ((suggestion: IndexSuggestion) => void) | null;\n}\n\nexport interface IndexSuggestion {\n type: 'collection-size' | 'slow-query' | 'frequent-field';\n collectionId: string;\n fieldPath: Array<string>;\n message: string;\n collectionSize?: number;\n queryTimeMs?: number;\n queryCount?: number;\n}\n\nexport interface QueryPattern {\n fieldPath: Array<string>;\n queryCount: number;\n totalTimeMs: number;\n avgTimeMs: number;\n}\n\nlet devModeConfig: IndexDevModeConfig = {\n enabled: true,\n collectionSizeThreshold: 1_000,\n slowQueryThresholdMs: 10,\n onSuggestion: null,\n};\n\nconst queryPatterns = new Map<string, QueryPattern>();\n\n/** Configure dev mode for index suggestions. */\nexport function configureIndexDevMode(config: Partial<IndexDevModeConfig>): void {\n devModeConfig = { ...devModeConfig, ...config };\n}\n\n/** Get current dev mode configuration. */\nexport function getIndexDevModeConfig(): IndexDevModeConfig {\n return devModeConfig;\n}\n\n/** Check if dev mode is enabled. */\nexport function isDevModeEnabled(): boolean {\n return devModeConfig.enabled && process.env.NODE_ENV !== 'production';\n}\n\n/** Emit an index suggestion (dev mode only). */\nexport function emitIndexSuggestion(suggestion: IndexSuggestion): void {\n if (!isDevModeEnabled()) return;\n\n if (devModeConfig.onSuggestion) {\n try {\n devModeConfig.onSuggestion(suggestion);\n } catch {\n // Match upstream: dev-only suggestion handlers must never break app code.\n }\n return;\n }\n\n console.warn(\n `[TanStack DB] Index suggestion for \"${suggestion.collectionId}\":\\n` +\n ` ${suggestion.message}\\n` +\n ` Field: ${suggestion.fieldPath.join('.')}\\n` +\n ` Add index: collection.createIndex((row) => row.${suggestion.fieldPath.join('.')})`,\n );\n}\n\n/** Track a query for dev mode analysis. */\nexport function trackQuery(\n collectionId: string,\n fieldPath: Array<string>,\n executionTimeMs: number,\n): void {\n if (!isDevModeEnabled()) return;\n\n const key = `${collectionId}:${fieldPath.join('.')}`;\n const existing = queryPatterns.get(key);\n if (existing) {\n existing.queryCount++;\n existing.totalTimeMs += executionTimeMs;\n existing.avgTimeMs = existing.totalTimeMs / existing.queryCount;\n } else {\n queryPatterns.set(key, {\n fieldPath: [...fieldPath],\n queryCount: 1,\n totalTimeMs: executionTimeMs,\n avgTimeMs: executionTimeMs,\n });\n }\n\n const pattern = queryPatterns.get(key)!;\n if (pattern.avgTimeMs > devModeConfig.slowQueryThresholdMs) {\n emitIndexSuggestion({\n type: 'slow-query',\n collectionId,\n fieldPath: [...fieldPath],\n message: `Queries on \"${fieldPath.join('.')}\" are slow (avg ${pattern.avgTimeMs.toFixed(1)}ms). Consider adding an index.`,\n queryTimeMs: pattern.avgTimeMs,\n queryCount: pattern.queryCount,\n });\n }\n}\n\n/** Check collection size and suggest index if needed (dev mode). */\nexport function checkCollectionSizeForIndex(\n collectionId: string,\n collectionSize: number,\n fieldPath: Array<string>,\n): void {\n if (!isDevModeEnabled()) return;\n if (collectionSize > devModeConfig.collectionSizeThreshold) {\n emitIndexSuggestion({\n type: 'collection-size',\n collectionId,\n fieldPath: [...fieldPath],\n message: `Collection has ${collectionSize} items. Queries on \"${fieldPath.join('.')}\" may benefit from an index.`,\n collectionSize,\n });\n }\n}\n\n/** Clear query pattern tracking (useful for tests). */\nexport function clearQueryPatterns(): void {\n queryPatterns.clear();\n}\n\n/** Get query patterns (useful for debugging/testing). */\nexport function getQueryPatterns(): Map<string, QueryPattern> {\n return new Map(\n [...queryPatterns.entries()].map(([key, value]) => [\n key,\n {\n fieldPath: [...value.fieldPath],\n queryCount: value.queryCount,\n totalTimeMs: value.totalTimeMs,\n avgTimeMs: value.avgTimeMs,\n },\n ]),\n );\n}\n","import type { Collection, IndexExpressionCallback } from '../collection/collection.js';\nimport { DEFAULT_INDEX_COMPARE_OPTIONS } from './comparison.js';\nimport type { CompareOptions, BasicExpression } from '../query/ir.js';\nimport { checkCollectionSizeForIndex, isDevModeEnabled } from './index-registry.js';\n\nexport interface AutoIndexConfig {\n autoIndex?: 'off' | 'eager';\n}\n\nconst autoIndexOperations = new Set(['eq', 'gt', 'gte', 'lt', 'lte', 'in']);\n\nexport function ensureIndexForField(\n _fieldName: string,\n fieldPath: Array<string>,\n collection: Collection,\n compareOptions?: CompareOptions,\n compareFn?: (a: unknown, b: unknown) => number,\n): void {\n if (isVirtualFieldPath(fieldPath)) return;\n if (collection.config.autoIndex !== 'eager') return;\n\n const compareOpts = compareOptions ?? collectionDefaultCompareOptions(collection);\n const existingIndex = [...collection.indexes.values()].find(\n (index) => index.matchesField(fieldPath) && index.matchesCompareOptions(compareOpts),\n );\n if (existingIndex) return;\n\n if (isDevModeEnabled()) {\n checkCollectionSizeForIndex(collection.id || 'unknown', collection.size, fieldPath);\n }\n\n try {\n const callback: IndexExpressionCallback = (row) =>\n fieldPath.reduce<unknown>(\n (current, part) => (current as Record<string, unknown>)[part],\n row,\n );\n collection.createIndex(callback, {\n name: `auto:${fieldPath.join('.')}`,\n options: compareFn\n ? { compareFn, compareOptions: compareOpts }\n : { compareOptions: compareOpts },\n });\n } catch (error) {\n // Dev convenience only: auto-index failures must not break subscriptions.\n console.warn(\n `${collection.id ? `[${collection.id}] ` : ''}Failed to create auto-index for field path \"${fieldPath.join('.')}\":`,\n error,\n );\n }\n}\n\n/** Analyze a where expression and create indexes for simple field comparisons. */\nexport function ensureIndexForExpression(\n expression: BasicExpression,\n collection: Collection,\n): void {\n if (collection.config.autoIndex !== 'eager') return;\n for (const { fieldName, fieldPath } of extractIndexableExpressions(expression)) {\n ensureIndexForField(fieldName, fieldPath, collection);\n }\n}\n\nexport function extractIndexableExpressions(\n expression: BasicExpression,\n): Array<{ fieldName: string; fieldPath: Array<string> }> {\n const results: Array<{ fieldName: string; fieldPath: Array<string> }> = [];\n\n const visit = (expr: BasicExpression): void => {\n if (expr.type !== 'func') return;\n if (expr.name === 'and') {\n for (const arg of expr.args) visit(arg);\n return;\n }\n if (!autoIndexOperations.has(expr.name)) return;\n\n const firstArg = expr.args[0];\n if (!firstArg || firstArg.type !== 'ref') return;\n const fieldPath = [...firstArg.path];\n if (fieldPath.length === 0 || isVirtualFieldPath(fieldPath)) return;\n\n results.push({ fieldName: fieldPath.join('_'), fieldPath });\n };\n\n visit(expression);\n return results;\n}\n\nfunction collectionDefaultCompareOptions(collection: Collection): CompareOptions {\n return {\n ...DEFAULT_INDEX_COMPARE_OPTIONS,\n ...collection.compareOptions,\n };\n}\n\nfunction isVirtualFieldPath(fieldPath: Array<string>): boolean {\n return fieldPath.length === 0 || fieldPath[0]!.startsWith('$');\n}\n","import { NotFoundError } from '../errors.js';\n\n/**\n * Maps a uint32 primary key to its dense row index. Phase 1 uses a JS Map;\n * a SAB-resident open-addressed hash map is planned for cross-worker\n * visibility in a later phase.\n *\n * `TOMBSTONE` (0xffffffff) is reserved as a sentinel for \"no row\".\n */\nexport const TOMBSTONE_ROW = 0xffffffff;\n\nexport class RowIndex {\n private map = new Map<number, number>();\n\n get size(): number {\n return this.map.size;\n }\n\n /** Return the row index for `id`, or undefined if absent. */\n lookup(id: number): number | undefined {\n return this.map.get(id >>> 0);\n }\n\n /** Same as lookup but throws if absent. */\n require(id: number): number {\n const r = this.map.get(id >>> 0);\n if (r === undefined) throw new NotFoundError(`id ${id} not found`);\n return r;\n }\n\n /** Insert `id → row`. Returns false if `id` already existed. */\n insert(id: number, row: number): boolean {\n const key = id >>> 0;\n if (this.map.has(key)) return false;\n this.map.set(key, row);\n return true;\n }\n\n /** Remove mapping for `id`. Returns the previous row index, or undefined. */\n remove(id: number): number | undefined {\n const key = id >>> 0;\n const prev = this.map.get(key);\n if (prev === undefined) return undefined;\n this.map.delete(key);\n return prev;\n }\n\n /** Iterate `[id, row]` pairs. */\n entries(): IterableIterator<[number, number]> {\n return this.map.entries();\n }\n\n /** Remove every mapping. */\n clear(): void {\n this.map.clear();\n }\n}\n","import { UndoError } from '../errors.js';\n\nexport type UndoOp = 'insert' | 'update' | 'delete';\n\n/**\n * A single reversible mutation. Stored in the undo ring so rollback can\n * replay it in reverse.\n *\n * For v1 we keep the payload as plain JS objects (column name → prior JS\n * value). Memory cost is O(touched columns) per mutation. A later phase may\n * pack the payload into a per-row binary diff.\n */\nexport interface UndoRecord {\n /** Monotonic id assigned by the ring; also the generation for rollback markers. */\n readonly seq: number;\n readonly op: UndoOp;\n readonly rowId: number;\n /** Row slot that was used. */\n readonly row: number;\n /** Previous values, keyed by column name. Empty for `insert`. */\n readonly prev: Readonly<Record<string, unknown>>;\n /** Full row snapshot for `delete` so re-insert can restore it. */\n readonly snapshot?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Fixed-capacity circular buffer of UndoRecords.\n *\n * When the ring wraps, the oldest entries are silently overwritten. Rollback\n * to a `mark()` that has been overwritten throws `UndoError` so callers know\n * the rollback is no longer possible.\n */\nexport class UndoRing {\n private records: (UndoRecord | undefined)[];\n private head = 0; // next write slot\n private count = 0; // number of valid entries (≤ capacity)\n private seqCounter = 0;\n\n constructor(public readonly capacity: number) {\n if (capacity <= 0 || !Number.isInteger(capacity)) {\n throw new RangeError('capacity must be a positive integer');\n }\n this.records = new Array<UndoRecord | undefined>(capacity);\n }\n\n get size(): number {\n return this.count;\n }\n\n /** Next seq that will be assigned. */\n get nextSeq(): number {\n return this.seqCounter;\n }\n\n /** Push a new record; returns its seq. */\n push(\n op: UndoOp,\n rowId: number,\n row: number,\n prev: Record<string, unknown>,\n snapshot?: Record<string, unknown>,\n ): number {\n const seq = this.seqCounter++;\n const rec: UndoRecord = snapshot\n ? { seq, op, rowId, row, prev, snapshot }\n : { seq, op, rowId, row, prev };\n this.records[this.head] = rec;\n this.head = (this.head + 1) % this.capacity;\n if (this.count < this.capacity) this.count++;\n return seq;\n }\n\n /** Oldest valid seq currently in the ring, or -1 if empty. */\n oldestSeq(): number {\n if (this.count === 0) return -1;\n const idx = (this.head - this.count + this.capacity) % this.capacity;\n return this.records[idx]!.seq;\n }\n\n /** Return a stable mark for the next seq to be written. */\n mark(): number {\n return this.seqCounter;\n }\n\n /**\n * Drain records pushed at or after `mark`, newest-first. Used by `rollback`.\n * Throws if `mark` has been overwritten by ring wrap.\n */\n drainSince(mark: number): UndoRecord[] {\n if (mark < 0) throw new RangeError('mark must be non-negative');\n if (mark > this.seqCounter) {\n throw new UndoError(`mark ${mark} is in the future (nextSeq=${this.seqCounter})`);\n }\n if (mark < this.oldestSeqOrZero()) {\n throw new UndoError(\n `mark ${mark} has been overwritten; oldest=${this.oldestSeq()}`,\n );\n }\n const out: UndoRecord[] = [];\n // Walk from newest to oldest.\n let idx = (this.head - 1 + this.capacity) % this.capacity;\n for (let i = 0; i < this.count; i++) {\n const r = this.records[idx]!;\n if (r.seq < mark) break;\n out.push(r);\n idx = (idx - 1 + this.capacity) % this.capacity;\n }\n // Remove drained records so a second rollback doesn't re-apply them.\n this.count -= out.length;\n this.head = (this.head - out.length + this.capacity) % this.capacity;\n // We leave seqCounter untouched so marks remain monotonic.\n return out;\n }\n\n private oldestSeqOrZero(): number {\n const s = this.oldestSeq();\n return s === -1 ? this.seqCounter : s;\n }\n\n /** Clear the ring without resetting seqCounter. */\n clear(): void {\n this.records.fill(undefined);\n this.head = 0;\n this.count = 0;\n }\n}\n","/**\n * Change event emitted by Collection after each mutation, consumed by the\n * reactive query engine.\n *\n * `columns` is an explicit set of column names that were written. Deletions\n * (soft) touch `__deleted` only; rollbacks may emit `columns: 'all'` when a\n * rollback re-inserts a snapshot.\n */\nexport type ChangeOp = 'insert' | 'update' | 'delete' | 'rollback' | 'compact';\n\nexport interface ChangeEvent {\n readonly op: ChangeOp;\n readonly rowId: number;\n /** Columns written by this mutation, or 'all' when unknown / broad. */\n readonly columns: ReadonlySet<string> | 'all';\n /** Monotonic collection global version after the mutation. */\n readonly globalVersion: number;\n /**\n * Current row snapshot after the mutation.\n *\n * For `insert` and `update` ops: the full row as it exists post-mutation.\n * For `delete` op (soft or hard): the final row state — for soft-deletes\n * this is the row with `__deleted: true`; for hard-deletes it's the\n * last snapshot before removal (taken from the undo log).\n * For `rollback` and `compact`: may be undefined if the snapshot would\n * be expensive to reconstruct and no consumer needs it.\n *\n * Exists so `subscribeChanges` adapters (TanStack DB `ChangeMessage`\n * shape) can emit the `value` field without re-reading the collection,\n * which is critical for delete events where the row is gone.\n */\n readonly value?: Readonly<Record<string, unknown>>;\n /**\n * For `update` ops only: the subset of columns as they were before the\n * mutation. Keys match the entries in `columns`. Absent for other ops.\n */\n readonly previousValue?: Readonly<Record<string, unknown>>;\n /**\n * Optional decomposed high-level changes for broad events like rollback.\n * Kept structurally typed here to avoid coupling the low-level emitter to\n * TanStack-facing public types.\n */\n readonly changes?: ReadonlyArray<{\n key: number;\n value: Readonly<Record<string, unknown>>;\n previousValue?: Readonly<Record<string, unknown>>;\n type: 'insert' | 'update' | 'delete';\n }>;\n}\n\nexport type ChangeListener = (event: ChangeEvent) => void;\n\n/**\n * Simple synchronous emitter. Listeners are invoked in insertion order. An\n * error thrown by a listener is caught and logged so subsequent listeners\n * still run — this keeps mutation correctness independent of query bugs.\n */\nexport class ChangeEmitter {\n private listeners: Set<ChangeListener> = new Set();\n\n subscribe(listener: ChangeListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n emit(event: ChangeEvent): void {\n for (const l of this.listeners) {\n try {\n l(event);\n } catch (err) {\n // Intentional: query/subscription errors must not roll back mutation.\n // eslint-disable-next-line no-console\n console.error('[arrowbase] change listener threw:', err);\n }\n }\n }\n\n get size(): number {\n return this.listeners.size;\n }\n}\n","/**\n * Generic, type-safe event emitter. API mirrors `@tanstack/db`'s\n * `EventEmitter<TEvents>` exactly:\n *\n * - `on(event, cb)` → returns an unsubscribe fn.\n * - `once(event, cb)` → auto-unsubscribes after first emission.\n * - `off(event, cb)` → removes a listener.\n * - `waitFor(event, timeout?)` → Promise resolving with payload.\n *\n * Listener exceptions are caught so one bad handler can't block the\n * rest; the error surfaces via `console.error` and the emitter keeps\n * going. Matches TanStack DB's crash-containment behavior.\n */\n\nexport class TypedEventEmitter<TEvents extends Record<string, unknown>> {\n private readonly handlers = new Map<\n keyof TEvents,\n Set<(payload: TEvents[keyof TEvents]) => void>\n >();\n\n /**\n * Subscribe to an event. Returns an unsubscribe function. Calling\n * `on` with the same callback twice registers it twice (matching\n * Node's EventEmitter and TanStack DB's).\n */\n on<K extends keyof TEvents>(\n event: K,\n callback: (payload: TEvents[K]) => void,\n ): () => void {\n let set = this.handlers.get(event);\n if (!set) {\n set = new Set();\n this.handlers.set(event, set);\n }\n const wrapped = callback as (payload: TEvents[keyof TEvents]) => void;\n set.add(wrapped);\n return () => {\n const s = this.handlers.get(event);\n if (!s) return;\n s.delete(wrapped);\n if (s.size === 0) this.handlers.delete(event);\n };\n }\n\n /**\n * Subscribe to an event and auto-unsubscribe after the first\n * emission. Returns an unsubscribe function that's also safe to\n * call before the event fires.\n */\n once<K extends keyof TEvents>(\n event: K,\n callback: (payload: TEvents[K]) => void,\n ): () => void {\n const off = this.on(event, (payload) => {\n off();\n callback(payload);\n });\n return off;\n }\n\n /**\n * Remove a specific listener. If multiple copies of the same\n * callback are registered, only one is removed per call (matches\n * Node's EventEmitter).\n */\n off<K extends keyof TEvents>(\n event: K,\n callback: (payload: TEvents[K]) => void,\n ): void {\n const set = this.handlers.get(event);\n if (!set) return;\n set.delete(callback as (payload: TEvents[keyof TEvents]) => void);\n if (set.size === 0) this.handlers.delete(event);\n }\n\n /**\n * Await the next emission of `event`. Rejects with a timeout error\n * if `timeout` ms pass first.\n */\n waitFor<K extends keyof TEvents>(\n event: K,\n timeout?: number,\n ): Promise<TEvents[K]> {\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const off = this.on(event, (payload) => {\n if (timer !== null) clearTimeout(timer);\n off();\n resolve(payload);\n });\n if (typeof timeout === 'number' && timeout >= 0) {\n timer = setTimeout(() => {\n off();\n reject(\n new Error(\n `waitFor('${String(event)}') timed out after ${timeout}ms`,\n ),\n );\n }, timeout);\n }\n });\n }\n\n /** Emit an event. Listener errors are caught and logged. */\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const set = this.handlers.get(event);\n if (!set || set.size === 0) return;\n // Snapshot the iteration target so listeners that unsubscribe\n // (or register) during dispatch don't perturb this emission.\n for (const cb of [...set]) {\n try {\n cb(payload as TEvents[keyof TEvents]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[arrowbase] event listener threw:', err);\n }\n }\n }\n\n /** Total number of listeners across all events. */\n listenerCount(event?: keyof TEvents): number {\n if (event === undefined) {\n let n = 0;\n for (const set of this.handlers.values()) n += set.size;\n return n;\n }\n return this.handlers.get(event)?.size ?? 0;\n }\n\n /** Remove every listener. Used by `cleanup()`. */\n clearAll(): void {\n this.handlers.clear();\n }\n}\n","import type {\n Deferred,\n MutationFn,\n PendingMutation,\n TransactionConfig,\n TransactionState,\n TransactionWithMutations,\n} from './tanstack-types.js';\n\nlet sequenceNumber = 0;\nlet generatedId = 0;\nconst pendingTransactions: Transaction<any>[] = [];\nlet transactionStack: Transaction<any>[] = [];\n\ntype MutateCallbackResult = void | PromiseLike<void>;\n\ntype AsyncTransactionContext<T> = {\n getStore(): T | undefined;\n run<R>(store: T, callback: () => R): R;\n};\n\ntype NodeAsyncHooksModule<T> = {\n AsyncLocalStorage?: new () => AsyncTransactionContext<T>;\n};\n\nfunction createAsyncTransactionContext<T>(): AsyncTransactionContext<T> | null {\n try {\n const getBuiltinModule = (globalThis as {\n process?: { getBuiltinModule?: (id: string) => unknown };\n }).process?.getBuiltinModule;\n const asyncHooks = getBuiltinModule?.('node:async_hooks') as\n | NodeAsyncHooksModule<T>\n | undefined;\n if (!asyncHooks?.AsyncLocalStorage) return null;\n return new asyncHooks.AsyncLocalStorage();\n } catch {\n return null;\n }\n}\n\nconst transactionContext = createAsyncTransactionContext<Transaction<any>>();\n\nfunction createDeferred<T>(): Deferred<T> {\n let settled = false;\n let resolveValue!: (value: T | PromiseLike<T>) => void;\n let rejectValue!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((resolve, reject) => {\n resolveValue = (value) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n rejectValue = (reason) => {\n if (settled) return;\n settled = true;\n reject(reason);\n };\n });\n\n return {\n promise,\n resolve: resolveValue,\n reject: rejectValue,\n get settled() {\n return settled;\n },\n };\n}\n\nfunction randomTransactionId(): string {\n return globalThis.crypto?.randomUUID?.() ?? `tx-${Date.now()}-${generatedId++}`;\n}\n\nfunction mergeSyncMetadata(\n existing: PendingMutation<any>,\n incoming: PendingMutation<any>,\n): Record<string, unknown> {\n return {\n ...(existing.syncMetadata ?? {}),\n ...(incoming.syncMetadata ?? {}),\n };\n}\n\nfunction mergePendingMutations<T extends object>(\n existing: PendingMutation<T>,\n incoming: PendingMutation<T>,\n): PendingMutation<T> | null {\n switch (`${existing.type}-${incoming.type}`) {\n case 'insert-update':\n return {\n ...existing,\n type: 'insert',\n original: {},\n modified: incoming.modified,\n changes: { ...existing.changes, ...incoming.changes },\n key: existing.key,\n globalKey: existing.globalKey,\n metadata: incoming.metadata ?? existing.metadata,\n syncMetadata: mergeSyncMetadata(existing, incoming),\n mutationId: incoming.mutationId,\n updatedAt: incoming.updatedAt,\n } as PendingMutation<T>;\n case 'insert-delete':\n return null;\n case 'update-delete':\n return incoming;\n case 'update-update':\n return {\n ...incoming,\n original: existing.original,\n changes: { ...existing.changes, ...incoming.changes },\n metadata: incoming.metadata ?? existing.metadata,\n syncMetadata: mergeSyncMetadata(existing, incoming),\n } as PendingMutation<T>;\n case 'delete-delete':\n case 'insert-insert':\n return incoming;\n default:\n throw new Error(`Unhandled mutation combination: ${existing.type}-${incoming.type}`);\n }\n}\n\nfunction removeFromPendingList(tx: Transaction<any>): void {\n const index = pendingTransactions.findIndex((pending) => pending.id === tx.id);\n if (index !== -1) pendingTransactions.splice(index, 1);\n}\n\nfunction registerTransaction(tx: Transaction<any>): void {\n transactionStack.push(tx);\n}\n\nfunction unregisterTransaction(tx: Transaction<any>): void {\n for (let index = transactionStack.length - 1; index >= 0; index -= 1) {\n if (transactionStack[index]?.id === tx.id) {\n transactionStack.splice(index, 1);\n return;\n }\n }\n}\n\nfunction runWithActiveTransaction<R>(tx: Transaction<any>, callback: () => R): R {\n registerTransaction(tx);\n const run = (): R => {\n try {\n return callback();\n } finally {\n unregisterTransaction(tx);\n }\n };\n if (transactionContext) return transactionContext.run(tx, run);\n return run();\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<void> {\n return (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction scheduleAutoCommit(tx: Transaction<any>): void {\n if (!tx.autoCommit) return;\n void tx.commit().catch(() => {\n // Commit errors are delivered through `isPersisted.promise`, matching TanStack DB.\n });\n}\n\nfunction rejectMutateCallback(tx: Transaction<any>, error: unknown): void {\n const originalError = toError(error);\n tx.error = { message: originalError.message, error: originalError };\n if (tx.state === 'pending' || tx.state === 'persisting') {\n tx.rollback();\n } else {\n tx.isPersisted.reject(originalError);\n }\n}\n\nexport function createTransaction<T extends object = Record<string, unknown>>(\n config: TransactionConfig<T>,\n): Transaction<T> {\n const tx = new Transaction<T>(config);\n pendingTransactions.push(tx);\n return tx;\n}\n\nexport function getActiveTransaction(): Transaction | undefined {\n return transactionContext?.getStore() ?? transactionStack.at(-1);\n}\n\nexport class Transaction<T extends object = Record<string, unknown>> {\n readonly id: string;\n readonly mutationFn: MutationFn<T>;\n readonly mutations: Array<PendingMutation<T>> = [];\n readonly isPersisted: Deferred<Transaction<T>> = createDeferred<Transaction<T>>();\n readonly autoCommit: boolean;\n readonly createdAt: Date;\n readonly sequenceNumber: number;\n readonly metadata: Record<string, unknown>;\n private readonly rollbackHandlers: Array<() => void> = [];\n state: TransactionState = 'pending';\n error?: { message: string; error: Error };\n\n constructor(config: TransactionConfig<T>) {\n if (typeof config?.mutationFn !== 'function') {\n throw new Error('createTransaction requires a mutationFn');\n }\n\n this.id = config.id ?? randomTransactionId();\n this.mutationFn = config.mutationFn;\n this.autoCommit = config.autoCommit ?? true;\n this.createdAt = new Date();\n this.sequenceNumber = sequenceNumber++;\n this.metadata = config.metadata ?? {};\n }\n\n setState(newState: TransactionState): void {\n this.state = newState;\n if (newState === 'completed' || newState === 'failed') {\n removeFromPendingList(this);\n }\n }\n\n mutate(callback: () => MutateCallbackResult): Transaction<T> {\n if (this.state !== 'pending') {\n throw new Error('Transaction must be pending to mutate');\n }\n\n const result = runWithActiveTransaction(this, callback);\n\n if (isPromiseLike(result)) {\n void Promise.resolve(result).then(\n () => scheduleAutoCommit(this),\n (error) => rejectMutateCallback(this, error),\n );\n } else {\n scheduleAutoCommit(this);\n }\n\n return this;\n }\n\n addRollbackHandler(handler: () => void): void {\n this.rollbackHandlers.push(handler);\n }\n\n applyMutations(mutations: Array<PendingMutation<any>>): void {\n for (const incoming of mutations) {\n const existingIndex = this.mutations.findIndex(\n (mutation) => mutation.globalKey === incoming.globalKey,\n );\n if (existingIndex >= 0) {\n const merged = mergePendingMutations(this.mutations[existingIndex]!, incoming);\n if (merged === null) this.mutations.splice(existingIndex, 1);\n else this.mutations[existingIndex] = merged;\n } else {\n this.mutations.push(incoming);\n }\n }\n }\n\n rollback(config?: { isSecondaryRollback?: boolean }): Transaction<T> {\n if (this.state === 'completed') {\n throw new Error('Cannot rollback a completed transaction');\n }\n\n const isSecondaryRollback = config?.isSecondaryRollback ?? false;\n this.setState('failed');\n\n const handlers = this.rollbackHandlers.splice(0).reverse();\n for (const handler of handlers) {\n handler();\n }\n\n if (!isSecondaryRollback) {\n const affectedKeys = new Set(this.mutations.map((mutation) => mutation.globalKey));\n for (const tx of [...pendingTransactions]) {\n if (tx.id === this.id || tx.state !== 'pending') continue;\n if (tx.mutations.some((mutation) => affectedKeys.has(mutation.globalKey))) {\n tx.rollback({ isSecondaryRollback: true });\n }\n }\n }\n\n this.isPersisted.reject(this.error?.error ?? new Error('Transaction rolled back'));\n this.touchCollection();\n return this;\n }\n\n touchCollection(): void {\n const touched = new Set<string>();\n for (const mutation of this.mutations) {\n const collection = mutation.collection;\n if (touched.has(collection.id)) continue;\n collection._state?.onTransactionStateChange?.();\n if ((collection._state?.pendingSyncedTransactions?.length ?? 0) > 0) {\n collection._state?.commitPendingTransactions?.();\n }\n touched.add(collection.id);\n }\n }\n\n async commit(): Promise<Transaction<T>> {\n if (this.state !== 'pending') {\n throw new Error('Transaction must be pending to commit');\n }\n\n this.setState('persisting');\n\n if (this.mutations.length === 0) {\n this.setState('completed');\n this.isPersisted.resolve(this);\n return this;\n }\n\n try {\n await this.mutationFn({\n transaction: this as unknown as TransactionWithMutations<T>,\n });\n this.rollbackHandlers.length = 0;\n this.setState('completed');\n this.touchCollection();\n this.isPersisted.resolve(this);\n } catch (error) {\n const originalError = error instanceof Error ? error : new Error(String(error));\n this.error = { message: originalError.message, error: originalError };\n this.rollback();\n throw originalError;\n }\n\n return this;\n }\n\n compareCreatedAt(other: Transaction<any>): number {\n const timeDiff = this.createdAt.getTime() - other.createdAt.getTime();\n if (timeDiff !== 0) return timeDiff;\n return this.sequenceNumber - other.sequenceNumber;\n }\n}\n","import { OutOfSpaceError, ValidationError } from '../errors.js';\n\n/** Decode UTF-8 bytes directly, copying shared views only on runtimes that reject them. */\nexport function decodeUtf8Bytes(\n bytes: Uint8Array,\n decoder: TextDecoder = new TextDecoder('utf-8', { fatal: false }),\n): string {\n if (bytes.byteLength === 0) return '';\n try {\n return decoder.decode(bytes);\n } catch (error) {\n if (typeof SharedArrayBuffer !== 'undefined' && bytes.buffer instanceof SharedArrayBuffer) {\n return decoder.decode(Uint8Array.from(bytes));\n }\n throw error;\n }\n}\n\n/**\n * Per-column append-only byte heap used by Utf8 columns. Strings are written\n * contiguously; each row owns a `[start, end)` byte range stored externally\n * in the column's offsets buffer. Updates always append fresh bytes at the\n * tail — old bytes are leaked until a future compaction pass.\n *\n * The heap is a Uint8Array view onto the segment; we own only the bump\n * cursor and encoder/decoder.\n */\nexport class ValuesHeap {\n private cursor = 0;\n private readonly bytes: Uint8Array;\n private readonly encoder = new TextEncoder();\n private readonly decoder = new TextDecoder('utf-8', { fatal: false });\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n /** Current bump position (= first free byte). */\n get used(): number {\n return this.cursor;\n }\n\n /** Total capacity in bytes. */\n get capacity(): number {\n return this.bytes.byteLength;\n }\n\n /** Read-only view of the underlying byte buffer. Used by snapshot export. */\n get rawBytes(): Uint8Array {\n return this.bytes;\n }\n\n /** Append raw bytes; returns their `[start, end)` range. */\n appendBytes(src: Uint8Array): { start: number; end: number } {\n if (src.length === 0) return { start: this.cursor, end: this.cursor };\n if (this.cursor + src.length > this.bytes.byteLength) {\n throw new OutOfSpaceError(\n `values heap full: need ${src.length}, free ${\n this.bytes.byteLength - this.cursor\n }`,\n );\n }\n this.bytes.set(src, this.cursor);\n const start = this.cursor;\n this.cursor += src.length;\n return { start, end: this.cursor };\n }\n\n /**\n * Encode `value` as UTF-8 and append to the heap. Returns the byte range\n * `[start, end)` where the encoded bytes live.\n */\n append(value: string): { start: number; end: number } {\n if (value.length === 0) return { start: this.cursor, end: this.cursor };\n const scratch = this.encoder.encode(value);\n return this.appendBytes(scratch);\n }\n\n /** Decode a `[start, end)` byte range back to a string. */\n read(start: number, end: number): string {\n if (start < 0 || end < start || end > this.bytes.byteLength) {\n throw new ValidationError(\n `values heap read out of range: [${start}, ${end}) cap=${this.bytes.byteLength}`,\n );\n }\n return decodeUtf8Bytes(this.bytes.subarray(start, end), this.decoder);\n }\n\n /** Read a `[start, end)` range as a copy of raw bytes. */\n readBytes(start: number, end: number): Uint8Array {\n if (start < 0 || end < start || end > this.bytes.byteLength) {\n throw new ValidationError(\n `values heap read out of range: [${start}, ${end}) cap=${this.bytes.byteLength}`,\n );\n }\n return this.bytes.slice(start, end);\n }\n\n /**\n * Copy bytes `[start, end)` from this heap directly into `dest` starting\n * at `destOffset`. No allocation. Used by compaction to shuffle live\n * ranges without a per-row Uint8Array allocation.\n */\n copyInto(start: number, end: number, dest: Uint8Array, destOffset: number): void {\n if (start < 0 || end < start || end > this.bytes.byteLength) {\n throw new ValidationError(\n `values heap copyInto out of range: [${start}, ${end}) cap=${this.bytes.byteLength}`,\n );\n }\n if (end === start) return;\n dest.set(this.bytes.subarray(start, end), destOffset);\n }\n\n /**\n * Reset the cursor to zero. The caller must have already copied any live\n * ranges elsewhere. Used by `Collection.compact()`.\n */\n resetEmpty(): void {\n this.cursor = 0;\n // We do NOT zero the existing bytes; subsequent writes overwrite as\n // needed. Readers only use live ranges via the offsets buffer.\n }\n\n /**\n * Overwrite the heap with `src[0..length)` starting at byte 0 and set\n * the cursor to `length`. Caller guarantees `length <= capacity`. Used\n * by `Collection.compact()` to swap a rebuilt heap back in place.\n */\n rewrite(src: Uint8Array, length: number): void {\n if (length < 0 || length > this.bytes.byteLength) {\n throw new ValidationError(\n `rewrite length ${length} out of range for capacity ${this.bytes.byteLength}`,\n );\n }\n if (length > 0) this.bytes.set(src.subarray(0, length), 0);\n this.cursor = length;\n }\n}\n\n/**\n * Side table for a dictionary-encoded Utf8 column. Code 0 is the first\n * interned string — nulls are signalled via the column's validity bitmap,\n * not via a reserved code.\n *\n * Dictionary is append-only in Phase 3. A later phase may add reference\n * counts and compaction.\n */\nexport class Dictionary {\n private codeByString = new Map<string, number>();\n private stringByCode: string[] = [];\n\n /** Number of distinct strings currently interned. */\n get size(): number {\n return this.stringByCode.length;\n }\n\n /** Return the code for `s`, interning it if absent. */\n intern(s: string): number {\n const existing = this.codeByString.get(s);\n if (existing !== undefined) return existing;\n const code = this.stringByCode.length;\n this.stringByCode.push(s);\n this.codeByString.set(s, code);\n return code;\n }\n\n /** Return the code for `s`, or undefined if not interned. */\n lookup(s: string): number | undefined {\n return this.codeByString.get(s);\n }\n\n /** Decode a code back to its string. Throws on unknown codes. */\n decode(code: number): string {\n const s = this.stringByCode[code];\n if (s === undefined) {\n throw new ValidationError(`unknown dictionary code ${code}`);\n }\n return s;\n }\n\n /** Iterate all (code, string) pairs in insertion order. */\n *entries(): IterableIterator<[number, string]> {\n for (let i = 0; i < this.stringByCode.length; i++) {\n yield [i, this.stringByCode[i]!];\n }\n }\n}\n","/**\n * Child-buffer state for list<T> columns.\n *\n * Unlike fixed-width and varlen columns, list children are unbounded at\n * schema-compile time — any row can append arbitrarily many elements.\n * Rather than reserve a huge slab in the SAB segment up front, the child\n * lives in JS heap typed arrays that grow by doubling. This sacrifices\n * zero-copy cross-worker sharing for list columns (noted in the PRD as\n * a Phase 8 tradeoff), but keeps top-level collection allocation\n * predictable.\n *\n * The parent list column keeps `Int32Array(capacity * 2)` ranged-offset\n * pairs `[childStart, childEnd)` referring to contiguous slices of\n * `ListChildState.values`. Updates append new child elements and\n * repoint the parent range — the old child elements leak until\n * `Collection.compact()` rebuilds the child heap.\n */\n\nimport { ColumnTypeCode, isVariableWidth } from '../schema/types.js';\nimport type { CompiledColumn } from '../schema/schema.js';\nimport { Dictionary, ValuesHeap } from './varlen.js';\n\nexport type ListChildTyped =\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Float32Array\n | Float64Array\n | BigInt64Array\n | BigUint64Array;\n\n/**\n * Mutable child buffer for a list column. `values` is resized (doubled)\n * on demand; callers must re-read `values` after any `ensureCapacity`\n * call — the typed array reference may change.\n *\n * For `list<utf8>` and `list<binary>`, each child element stores a\n * ranged-offset pair `[start, end)` into a shared `ValuesHeap` at\n * `heap.rawBytes`. The `values` typed array in that case is\n * `Int32Array(childCapacity * 2)`.\n */\nexport class ListChildState {\n /** Compiled child element column (shape of each element). */\n readonly child: CompiledColumn;\n values: ListChildTyped;\n validity: Uint8Array | null;\n /** Number of child elements written so far (== offsets cursor). */\n cursor: number;\n /** Current allocated length of `values` (in element slots, not bytes). */\n capacity: number;\n heap: ValuesHeap | null;\n dictionary: Dictionary | null;\n /** Per-column version for the child — bumped on every write into it. */\n version: number;\n\n constructor(child: CompiledColumn, initialCapacity: number) {\n this.child = child;\n const cap = Math.max(16, initialCapacity);\n this.capacity = cap;\n this.values = allocateTyped(child.typeCode, cap);\n this.validity = child.nullable ? new Uint8Array((cap + 7) >>> 3) : null;\n this.cursor = 0;\n this.version = 0;\n if (isVariableWidth(child.typeCode)) {\n const heapBytes = child.valuesHeapBytes ?? 1024;\n this.heap = new ValuesHeap(new Uint8Array(heapBytes));\n this.dictionary = null;\n } else if (child.typeCode === ColumnTypeCode.DictUtf8) {\n this.heap = null;\n this.dictionary = new Dictionary();\n } else {\n this.heap = null;\n this.dictionary = null;\n }\n }\n\n /**\n * Ensure at least `extra` more element slots are available. Grows by\n * doubling (plus any extra needed to satisfy large appends).\n */\n ensureCapacity(extra: number): void {\n const needed = this.cursor + extra;\n if (needed <= this.capacity) return;\n let cap = this.capacity;\n while (cap < needed) cap *= 2;\n // For utf8/binary child, the `values` array is i32 pairs — the\n // element slot count is `values.length / 2`, so `cap` here is in\n // logical *elements*, not underlying typed-array length.\n const newValues = allocateTyped(this.child.typeCode, cap);\n copyTyped(this.values, newValues, this.elementsToTypedLength(this.cursor));\n this.values = newValues;\n if (this.validity) {\n const newBitmap = new Uint8Array((cap + 7) >>> 3);\n newBitmap.set(this.validity);\n this.validity = newBitmap;\n }\n this.capacity = cap;\n }\n\n /** Convert element count to typed-array slot count (×2 for range pairs). */\n private elementsToTypedLength(elements: number): number {\n const c = this.child.typeCode;\n if (c === ColumnTypeCode.Utf8 || c === ColumnTypeCode.Binary) return elements * 2;\n return elements;\n }\n}\n\nfunction allocateTyped(code: ColumnTypeCode, elements: number): ListChildTyped {\n switch (code) {\n case ColumnTypeCode.Bool:\n case ColumnTypeCode.UInt8:\n return new Uint8Array(elements);\n case ColumnTypeCode.Int8:\n return new Int8Array(elements);\n case ColumnTypeCode.Int16:\n return new Int16Array(elements);\n case ColumnTypeCode.UInt16:\n return new Uint16Array(elements);\n case ColumnTypeCode.Int32:\n return new Int32Array(elements);\n case ColumnTypeCode.UInt32:\n case ColumnTypeCode.DictUtf8:\n return new Uint32Array(elements);\n case ColumnTypeCode.Float32:\n return new Float32Array(elements);\n case ColumnTypeCode.Float64:\n return new Float64Array(elements);\n case ColumnTypeCode.Int64:\n return new BigInt64Array(elements);\n case ColumnTypeCode.UInt64:\n return new BigUint64Array(elements);\n case ColumnTypeCode.Utf8:\n case ColumnTypeCode.Binary:\n // i32 ranged-offset pairs per element.\n return new Int32Array(elements * 2);\n case ColumnTypeCode.List:\n case ColumnTypeCode.Struct:\n case ColumnTypeCode.Point:\n case ColumnTypeCode.LineString:\n case ColumnTypeCode.Polygon:\n throw new Error(\n `list children of type ${code} (list/struct/geo) are rejected at schema-compile time`,\n );\n }\n}\n\nfunction copyTyped(\n from: ListChildTyped,\n to: ListChildTyped,\n length: number,\n): void {\n // Both have identical element types; both extend from TypedArray so\n // the `.set` method is present.\n (to as unknown as { set: (arr: ListChildTyped) => void }).set(\n from.subarray(0, length) as ListChildTyped,\n );\n}\n","import type { IndexConstructor } from '../indexes/base-index.js';\nimport type {\n DeleteMutationFn,\n InsertMutationFn,\n SyncConfig,\n UpdateMutationFn,\n} from '../tanstack-types.js';\nimport type { Collection, RowValue } from './collection.js';\n\n/**\n * Layer-E metadata attached to Collections created through createCollection().\n * Kept separate from createCollection.ts so collection mutation wiring can read\n * handlers without creating a circular import.\n */\nexport interface CollectionMetadata {\n sync?: SyncConfig;\n onInsert?: InsertMutationFn;\n onUpdate?: UpdateMutationFn;\n onDelete?: DeleteMutationFn;\n getKey?: (item: RowValue) => number | string;\n gcTime?: number;\n startSync?: boolean;\n syncMode?: 'eager' | 'on-demand';\n autoIndex?: 'off' | 'eager';\n defaultIndexType?: IndexConstructor;\n}\n\nconst metadataByCollection = new WeakMap<Collection, CollectionMetadata>();\n\nexport function setCollectionMetadata(\n collection: Collection,\n metadata: CollectionMetadata,\n): void {\n metadataByCollection.set(collection, metadata);\n}\n\nexport function getCollectionMetadata(\n collection: Collection,\n): Readonly<CollectionMetadata> | undefined {\n return metadataByCollection.get(collection);\n}\n","import { ValidationError } from '../errors.js';\nimport { assertValidPoint, type Point } from './point-column.js';\n\nexport type LineString = readonly Point[];\n\nfunction describeLineString(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map((item) => Array.isArray(item) ? `[${item.map(String).join(', ')}]` : String(item)).join(', ')}]`;\n return String(value);\n}\n\nexport function assertValidLineString(\n value: unknown,\n label = 'linestring',\n): asserts value is LineString {\n if (!Array.isArray(value)) {\n throw new ValidationError(`${label} must be an array of points, got ${describeLineString(value)}`);\n }\n if (value.length < 2) {\n throw new ValidationError(`${label} must contain at least two points`);\n }\n for (let i = 0; i < value.length; i++) {\n assertValidPoint(value[i], `${label}[${i}]`);\n }\n}\n\nexport class LineStringColumn {\n readonly ranges: Int32Array;\n coords: Float64Array;\n readonly bboxCache: Float64Array;\n cursor = 0;\n private vertexCapacity: number;\n\n constructor(\n capacity: number,\n ranges: Int32Array = new Int32Array(capacity * 2),\n initialVertexCapacity = Math.max(16, capacity * 4),\n bboxCache: Float64Array = new Float64Array(capacity * 4),\n ) {\n if (!Number.isInteger(capacity) || capacity < 0) {\n throw new RangeError('capacity must be a non-negative integer');\n }\n if (ranges.length < capacity * 2) {\n throw new RangeError('ranges buffer is too small for linestring capacity');\n }\n if (!Number.isInteger(initialVertexCapacity) || initialVertexCapacity < 0) {\n throw new RangeError('initialVertexCapacity must be a non-negative integer');\n }\n if (bboxCache.length < capacity * 4) {\n throw new RangeError('bboxCache buffer is too small for linestring capacity');\n }\n this.ranges = ranges;\n this.vertexCapacity = Math.max(1, initialVertexCapacity);\n this.coords = new Float64Array(this.vertexCapacity * 2);\n this.bboxCache = bboxCache;\n for (let row = 0; row < capacity; row++) this.setNull(row);\n }\n\n set(row: number, value: LineString): void {\n assertValidLineString(value);\n this.ensureVertexCapacity(value.length);\n const start = this.cursor;\n for (let i = 0; i < value.length; i++) {\n const point = value[i]!;\n const offset = (start + i) * 2;\n this.coords[offset] = point[0];\n this.coords[offset + 1] = point[1];\n }\n this.cursor += value.length;\n this.ranges[row * 2] = start;\n this.ranges[row * 2 + 1] = this.cursor;\n this.updateBbox(row, value);\n }\n\n get(row: number): LineString {\n const start = this.ranges[row * 2] ?? 0;\n const end = this.ranges[row * 2 + 1] ?? 0;\n const out: Point[] = [];\n for (let vertex = start; vertex < end; vertex++) {\n const offset = vertex * 2;\n out.push([\n this.coords[offset] ?? Number.NaN,\n this.coords[offset + 1] ?? Number.NaN,\n ]);\n }\n return out;\n }\n\n setNull(row: number): void {\n this.ranges[row * 2] = 0;\n this.ranges[row * 2 + 1] = 0;\n const bboxOffset = row * 4;\n this.bboxCache[bboxOffset] = Number.NaN;\n this.bboxCache[bboxOffset + 1] = Number.NaN;\n this.bboxCache[bboxOffset + 2] = Number.NaN;\n this.bboxCache[bboxOffset + 3] = Number.NaN;\n }\n\n copy(fromRow: number, toRow: number): void {\n const bboxOffset = fromRow * 4;\n if (!Number.isFinite(this.bboxCache[bboxOffset])) {\n this.setNull(toRow);\n return;\n }\n this.set(toRow, this.get(fromRow));\n }\n\n private ensureVertexCapacity(extraVertices: number): void {\n const needed = this.cursor + extraVertices;\n if (needed <= this.vertexCapacity) return;\n let nextCapacity = this.vertexCapacity;\n while (nextCapacity < needed) nextCapacity *= 2;\n const next = new Float64Array(nextCapacity * 2);\n next.set(this.coords.subarray(0, this.cursor * 2));\n this.coords = next;\n this.vertexCapacity = nextCapacity;\n }\n\n private updateBbox(row: number, value: LineString): void {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const [lng, lat] of value) {\n minX = Math.min(minX, lng);\n minY = Math.min(minY, lat);\n maxX = Math.max(maxX, lng);\n maxY = Math.max(maxY, lat);\n }\n const bboxOffset = row * 4;\n this.bboxCache[bboxOffset] = minX;\n this.bboxCache[bboxOffset + 1] = minY;\n this.bboxCache[bboxOffset + 2] = maxX;\n this.bboxCache[bboxOffset + 3] = maxY;\n }\n}\n","import Flatbush from 'flatbush';\nimport { assertValidBbox, bboxIntersectsRaw, type BBox } from './bbox.js';\n\nexport interface BuildSpatialIndexOptions {\n readonly bboxCacheVersion?: number;\n readonly indexVersion?: number;\n readonly nodeSize?: number;\n}\n\nexport interface SpatialIndexState {\n readonly base: Flatbush | null;\n readonly baseRowIds: Uint32Array;\n readonly baseCacheRows: Uint32Array;\n /** Immutable mini-indexes built from inserts/updates since the base build. */\n readonly segments: SpatialIndexSegment[];\n readonly dirtyRows: Set<number>;\n readonly deletedRows: Set<number>;\n readonly bboxCacheVersion: number;\n readonly indexVersion: number;\n}\n\nexport interface SpatialIndexSegment {\n readonly index: Flatbush | null;\n readonly rowIds: Uint32Array;\n readonly cacheRows: Uint32Array;\n}\n\nexport function buildSpatialIndex(\n rowIds: Uint32Array | ReadonlyArray<number>,\n bboxCache: Float64Array,\n options: BuildSpatialIndexOptions = {},\n): SpatialIndexState {\n const candidateRowIds = rowIds instanceof Uint32Array\n ? new Uint32Array(rowIds)\n : Uint32Array.from(rowIds);\n const candidateCacheRows = inferBaseCacheRows(candidateRowIds, bboxCache);\n const validRowIds: number[] = [];\n const validCacheRows: number[] = [];\n const validBboxes: BBox[] = [];\n for (let i = 0; i < candidateRowIds.length; i++) {\n const bbox = readBboxOrNull(bboxCache, candidateCacheRows[i]!);\n if (bbox === null) continue;\n validRowIds.push(candidateRowIds[i]!);\n validCacheRows.push(candidateCacheRows[i]!);\n validBboxes.push(bbox);\n }\n const baseRowIds = Uint32Array.from(validRowIds);\n const baseCacheRows = Uint32Array.from(validCacheRows);\n\n const base = baseRowIds.length === 0\n ? null\n : new Flatbush(baseRowIds.length, options.nodeSize);\n if (base !== null) {\n for (const bbox of validBboxes) {\n base.add(bbox[0], bbox[1], bbox[2], bbox[3]);\n }\n base.finish();\n }\n\n return {\n base,\n baseRowIds,\n baseCacheRows,\n segments: [],\n dirtyRows: new Set<number>(),\n deletedRows: new Set<number>(),\n bboxCacheVersion: options.bboxCacheVersion ?? 0,\n indexVersion: options.indexVersion ?? 1,\n };\n}\n\nexport function searchSpatialIndex(\n state: SpatialIndexState,\n bboxCache: Float64Array,\n query: BBox,\n): Uint32Array {\n assertValidBbox(query, 'query');\n\n const matches = new Set<number>();\n if (state.base !== null) {\n const baseHits = state.base.search(query[0], query[1], query[2], query[3]);\n for (const index of baseHits) {\n const rowId = state.baseRowIds[index]!;\n if (state.deletedRows.has(rowId) || state.dirtyRows.has(rowId)) continue;\n const bbox = readBboxOrNull(bboxCache, state.baseCacheRows[index]!);\n if (bbox !== null && bboxIntersectsRaw(bbox, query)) {\n matches.add(rowId);\n }\n }\n }\n\n for (const segment of state.segments) {\n if (segment.index === null) continue;\n const hits = segment.index.search(query[0], query[1], query[2], query[3]);\n for (const index of hits) {\n const rowId = segment.rowIds[index]!;\n if (state.deletedRows.has(rowId) || state.dirtyRows.has(rowId)) continue;\n const bbox = readBboxOrNull(bboxCache, segment.cacheRows[index]!);\n if (bbox !== null && bboxIntersectsRaw(bbox, query)) matches.add(rowId);\n }\n }\n\n const dirtyRows = Array.from(state.dirtyRows).sort((a, b) => a - b);\n for (const rowId of dirtyRows) {\n if (state.deletedRows.has(rowId)) continue;\n const bbox = readBboxOrNull(bboxCache, rowId);\n if (bbox !== null && bboxIntersectsRaw(bbox, query)) {\n matches.add(rowId);\n }\n }\n\n return Uint32Array.from(Array.from(matches).sort((a, b) => a - b));\n}\n\n/**\n * Freeze the mutable dirty overlay into a small Flatbush segment. Stale\n * entries in older segments remain safe because every hit is exact-checked\n * against the current bbox cache. This makes large insert bursts logarithmic\n * at query time without rebuilding the full immutable base on every write.\n */\nexport function flushSpatialIndexDirty(\n state: SpatialIndexState,\n bboxCache: Float64Array,\n): number {\n if (state.dirtyRows.size === 0) return 0;\n const rowIds = Array.from(state.dirtyRows)\n .filter((rowId) => !state.deletedRows.has(rowId))\n .sort((a, b) => a - b);\n state.dirtyRows.clear();\n if (rowIds.length === 0) return 0;\n\n const cacheRows = inferBaseCacheRows(Uint32Array.from(rowIds), bboxCache);\n const validRowIds: number[] = [];\n const validCacheRows: number[] = [];\n const bboxes: BBox[] = [];\n for (let i = 0; i < rowIds.length; i++) {\n const bbox = readBboxOrNull(bboxCache, cacheRows[i]!);\n if (bbox === null) continue;\n validRowIds.push(rowIds[i]!);\n validCacheRows.push(cacheRows[i]!);\n bboxes.push(bbox);\n }\n if (validRowIds.length === 0) return 0;\n\n const index = new Flatbush(validRowIds.length);\n for (const bbox of bboxes) index.add(bbox[0], bbox[1], bbox[2], bbox[3]);\n index.finish();\n state.segments.push({\n index,\n rowIds: Uint32Array.from(validRowIds),\n cacheRows: Uint32Array.from(validCacheRows),\n });\n return validRowIds.length;\n}\n\nfunction inferBaseCacheRows(rowIds: Uint32Array, bboxCache: Float64Array): Uint32Array {\n if (rowIds.length === 0) return new Uint32Array();\n let maxRowId = 0;\n for (const rowId of rowIds) if (rowId > maxRowId) maxRowId = rowId;\n if (bboxCache.length >= (maxRowId + 1) * 4) {\n return new Uint32Array(rowIds);\n }\n if (bboxCache.length === rowIds.length * 4) {\n return Uint32Array.from(rowIds, (_rowId, index) => index);\n }\n throw new RangeError('bbox cache length must cover indexed row ids or be four values per indexed row');\n}\n\nfunction assertReadableCacheRow(cache: Float64Array, rowId: number): void {\n if (!Number.isInteger(rowId) || rowId < 0 || (rowId + 1) * 4 > cache.length) {\n throw new RangeError('bbox cache missing indexed row');\n }\n}\n\nfunction readBboxOrNull(cache: Float64Array, index: number): BBox | null {\n assertReadableCacheRow(cache, index);\n const offset = index * 4;\n const bbox: BBox = [\n cache[offset]!,\n cache[offset + 1]!,\n cache[offset + 2]!,\n cache[offset + 3]!,\n ];\n try {\n assertValidBbox(bbox, `bboxCache[${index}]`);\n return bbox;\n } catch {\n return null;\n }\n}\n","import {\n NotFoundError,\n OutOfSpaceError,\n ValidationError,\n} from '../errors.js';\nimport type { CompiledColumn, CompiledSchema } from '../schema/schema.js';\nimport {\n ColumnTypeCode,\n type ColumnTypeName,\n isDictionary,\n isVariableWidth,\n} from '../schema/types.js';\nimport { Segment, createSegment } from '../sab/segment.js';\nimport { ARROW_ALIGN, alignUp } from '../sab/atomics.js';\nimport { BasicIndex } from '../indexes/basic-index.js';\nimport { ensureIndexForExpression } from '../indexes/auto-index.js';\nimport type { IndexConstructor, IndexInterface } from '../indexes/base-index.js';\nimport type { IndexOptions } from '../indexes/index-options.js';\nimport type { BasicExpression } from '../query/ir.js';\nimport {\n createSingleRowRefProxy,\n toExpression,\n type SingleRowRefProxy,\n} from '../query/ref-proxy.js';\nimport { RowIndex } from './rowIndex.js';\nimport { UndoRing, type UndoOp, type UndoRecord } from './undoRing.js';\nimport {\n ChangeEmitter,\n type ChangeEvent,\n type ChangeListener,\n} from './events.js';\nimport { TypedEventEmitter } from './typedEmitter.js';\nimport type {\n ChangeMessage,\n CollectionSubscription,\n CurrentStateAsChangesOptions,\n InsertConfig,\n OperationConfig,\n PendingMutation,\n StringCollationConfig,\n SubscribeChangesOptions,\n UtilsRecord,\n} from '../tanstack-types.js';\nimport {\n createTransaction,\n getActiveTransaction,\n type Transaction,\n} from '../transactions.js';\nimport { Dictionary, ValuesHeap } from './varlen.js';\nimport { ListChildState } from './listChild.js';\nimport { getCollectionMetadata } from './metadata.js';\nimport { assertValidBbox, type BBox } from '../geo/bbox.js';\nimport { haversineDistanceMetersXY } from '../geo/distance.js';\nimport { LineStringColumn, type LineString } from '../geo/linestring-column.js';\nimport { PointColumn, type Point } from '../geo/point-column.js';\nimport { PolygonColumn, type Polygon } from '../geo/polygon-column.js';\nimport {\n buildSpatialIndex,\n flushSpatialIndexDirty,\n searchSpatialIndex,\n type SpatialIndexState,\n} from '../geo/rtree.js';\n\nlet collectionMutationIdCounter = 0;\n\nfunction randomCollectionMutationId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `mutation-${Date.now()}-${collectionMutationIdCounter++}`\n );\n}\n\n/** Row value for a schema with primitive + utf8 + binary + list + struct + geo columns. */\nexport type RowValue = Record<\n string,\n | number\n | bigint\n | boolean\n | string\n | Uint8Array\n | readonly unknown[]\n | Record<string, unknown>\n | Point\n | LineString\n | Polygon\n | null\n>;\n\n/**\n * Collection lifecycle status. Mirrors `@tanstack/db`'s\n * `CollectionStatus` union bit-for-bit:\n *\n * - `idle` — created but sync not started (used only with\n * `startSync: false` sync configs).\n * - `loading` — sync has started and is loading.\n * - `ready` — collection is usable; data available.\n * - `error` — sync initialization failed.\n * - `cleaned-up` — resources released; no further use.\n *\n * In-memory collections (our current default) start in `'ready'` and\n * only transition to `'cleaned-up'` via `cleanup()`.\n */\nexport type CollectionStatus =\n | 'idle'\n | 'loading'\n | 'ready'\n | 'error'\n | 'cleaned-up';\n\n/**\n * Payload for the `status:change` event. Matches @tanstack/db's\n * `CollectionStatusChangeEvent`.\n */\nexport interface CollectionStatusChangeEvent {\n type: 'status:change';\n collection: Collection;\n previousStatus: CollectionStatus;\n status: CollectionStatus;\n}\n\n/**\n * Payload for `subscribers:change`. Fires whenever the number of\n * `subscribeChanges` subscribers grows or shrinks.\n */\nexport interface CollectionSubscribersChangeEvent {\n type: 'subscribers:change';\n collection: Collection;\n previousSubscriberCount: number;\n subscriberCount: number;\n}\n\n/**\n * Payload for `truncate`. Fires when the backing sync source has\n * instructed us to drop all rows (e.g. after a must-refetch\n * signal). Currently unused at the collection layer but exposed\n * for parity; Layer E wires it up.\n */\nexport interface CollectionTruncateEvent {\n type: 'truncate';\n collection: Collection;\n}\n\n/**\n * All events a Collection can emit. Matches @tanstack/db's\n * `AllCollectionEvents` in shape (minus index-add/remove, which\n * land in Layer D, and loadingSubset, which is subset-load-only).\n */\nexport type CollectionEvents = {\n 'status:change': CollectionStatusChangeEvent;\n 'subscribers:change': CollectionSubscribersChangeEvent;\n truncate: CollectionTruncateEvent;\n 'status:idle': CollectionStatusChangeEvent;\n 'status:loading': CollectionStatusChangeEvent;\n 'status:ready': CollectionStatusChangeEvent;\n 'status:error': CollectionStatusChangeEvent;\n 'status:cleaned-up': CollectionStatusChangeEvent;\n};\n\nexport type IndexExpressionCallback = (\n row: SingleRowRefProxy<Record<string, unknown>>,\n) => unknown;\n\nexport type CollectionIndexOptions = IndexOptions<IndexConstructor<number>>;\n\nexport type AutoIndexMode = 'off' | 'eager';\n\nexport interface SpatialIndexOptions {\n readonly column: string;\n readonly type: 'rtree';\n readonly eager?: boolean;\n}\n\nexport type SpatialIndexConfig = SpatialIndexOptions | readonly SpatialIndexOptions[];\n\nexport interface CollectionRuntimeConfig {\n autoIndex: AutoIndexMode;\n defaultIndexType?: IndexConstructor<number>;\n spatialIndex?: SpatialIndexConfig;\n}\n\nexport interface CollectionOptions {\n /** Maximum number of rows the collection can hold. Required in Phase 1. */\n capacity: number;\n /** Undo ring capacity in entries. Default 4096. */\n undoCapacity?: number;\n /**\n * When true, `delete(id)` sets a `__deleted` flag and keeps the row slot.\n * The column must be declared in the schema as `{ type: 'bool' }`.\n * Defaults to true if `__deleted` column exists, else false.\n */\n softDelete?: boolean;\n /**\n * Optional stable identifier for the collection. Mirrors\n * `@tanstack/db`'s `CollectionConfig.id`. Defaults to\n * `${schema.name}:${monotonicCounter}`. Used for debugging,\n * devtools, and as a key in broadcast/sync adapters.\n */\n id?: string;\n /**\n * Utility functions attached to this collection. Exposed via the\n * `utils` getter. Callers can use these to plumb collection-specific\n * helpers (e.g. `refetch`, `setState`) without subclassing. Matches\n * `@tanstack/db`'s `CollectionConfig.utils`.\n */\n utils?: UtilsRecord;\n /**\n * String collation config — influences `orderBy` over string\n * columns. Currently stored and echoed through `compareOptions`; the\n * query layer picks it up in Layer C. Matches `@tanstack/db`'s\n * `CollectionConfig.compareOptions`.\n */\n compareOptions?: StringCollationConfig;\n /** Auto-index strategy. `eager` creates indexes for simple subscribed where expressions. */\n autoIndex?: AutoIndexMode;\n /** Default index implementation used by auto-index and option-less createIndex. */\n defaultIndexType?: IndexConstructor<number>;\n /** Optional R-tree index config for point/linestring/polygon envelopes. */\n spatialIndex?: SpatialIndexConfig;\n}\n\ninterface ColumnBuffer {\n readonly column: CompiledColumn;\n /**\n * Fixed-width columns: typed array of length `capacity` holding the\n * actual values. Utf8/Binary columns: `Int32Array` of length\n * `capacity * 2` holding `[start, end)` byte ranges into `heap`.\n * DictUtf8 columns: `Uint32Array(capacity)` of dictionary codes.\n * List columns: `Int32Array(capacity * 2)` of range pairs into\n * `list.values`. LineString/Polygon columns: `Int32Array(capacity * 2)` of\n * range pairs into geo child storage. Struct columns: a zero-length\n * sentinel (the value storage lives on the per-field buffers in\n * `structFields`).\n */\n readonly values: TypedValueArray;\n /** Validity bitmap (1 byte per 8 rows), or null if column not nullable. */\n readonly validity: Uint8Array | null;\n /** Per-column version counter, bumped on every mutation touching it. */\n version: number;\n /** Present only on Utf8/Binary columns. */\n readonly heap: ValuesHeap | null;\n /** Present only on DictUtf8 columns. */\n readonly dictionary: Dictionary | null;\n /**\n * Present only on List columns. Holds the child-element typed-array\n * + child validity + (optional) child heap/dictionary. Allocated off\n * the SAB segment because the child size is unbounded at schema\n * compile time.\n */\n list: ListChildState | null;\n /** Present only on Point columns. Owns coordinate storage + bbox cache. */\n readonly point: PointColumn | null;\n /** Present only on LineString columns. Owns variable coordinates + bbox cache. */\n readonly lineString: LineStringColumn | null;\n /** Present only on Polygon columns. Owns variable rings/coordinates + bbox cache. */\n readonly polygon: PolygonColumn | null;\n /**\n * Present only on Struct columns. One per-field column buffer per\n * declared field. Field buffers share the parent's row cursor.\n */\n readonly structFields: ColumnBuffer[] | null;\n readonly structFieldsByName: ReadonlyMap<string, ColumnBuffer> | null;\n}\n\nexport type TypedValueArray =\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Float32Array\n | Float64Array\n | BigInt64Array\n | BigUint64Array;\n\n/**\n * Internal scan-view entry exposed via `_internalScanColumns()` for the\n * vectorized kernel. Not part of the public API surface — may change.\n */\nexport interface ScanColumn {\n readonly name: string;\n readonly typeCode: ColumnTypeCode;\n readonly nullable: boolean;\n readonly validity: Uint8Array | null;\n readonly values: TypedValueArray;\n readonly heap: ValuesHeap | null;\n readonly dictionary: Dictionary | null;\n}\n\n/**\n * Tree-shaped view emitted by `bulkColumnViewsTree()` for the snapshot\n * exporter. Internal surface — subject to change.\n */\nexport interface TreeView {\n readonly name: string;\n readonly type: ColumnTypeName;\n readonly typeCode: ColumnTypeCode;\n readonly nullable: boolean;\n readonly validity: Uint8Array | null;\n readonly primaryBuffer: Uint8Array;\n readonly heap: Uint8Array | null;\n readonly dictionaryEntries: readonly string[] | null;\n readonly listChildElements?: number;\n readonly listChild?: TreeView;\n readonly fields?: readonly TreeView[];\n}\n\n/**\n * Phase 1 Collection: fixed-capacity, fixed-width primitive columns, dense\n * `uint32` PK, single-writer. No cross-worker attach yet (Segment is created\n * locally); the SAB buffer is exposed via `getSegmentBuffer()` for future\n * worker handoff.\n */\nexport class Collection {\n readonly schema: CompiledSchema;\n readonly capacity: number;\n private readonly segment: Segment;\n private readonly columns: Map<string, ColumnBuffer>;\n private readonly columnList: ColumnBuffer[];\n private readonly rowIndex = new RowIndex();\n private readonly undo: UndoRing;\n private readonly pkColumn: ColumnBuffer;\n private readonly deletedColumn: ColumnBuffer | null;\n private readonly softDelete: boolean;\n private readonly emitter = new ChangeEmitter();\n /**\n * TanStack-DB-compatible high-level event emitter. Handles\n * `status:change`, `subscribers:change`, `truncate`, `index:added`,\n * `index:removed`, and per-status events. Separate from the\n * low-level per-mutation `ChangeEmitter` above because the event\n * cadences differ: mutation events fire on every row touch; these\n * fire on lifecycle transitions.\n */\n private readonly events = new TypedEventEmitter<CollectionEvents>();\n /** Active secondary indexes keyed by monotonically assigned index id. */\n private readonly _indexes = new Map<number, IndexInterface<number>>();\n /** Active geometry-envelope spatial indexes keyed by column name. */\n private readonly _spatialIndexes = new Map<string, SpatialIndexState>();\n private _nextIndexId = 0;\n /**\n * Tracks external subscribers created via `subscribeChanges`. Used\n * by `subscriberCount` getter and emitted via `subscribers:change`.\n */\n private _subscriberCount = 0;\n /** Dense row cursor: next row slot to use. */\n private rowCursor = 0;\n /** Monotonic collection-wide version counter. */\n private _globalVersion = 0;\n /** Stable identifier (see `id` getter). */\n private readonly _id: string;\n /** Utils record (see `utils` getter). */\n private readonly _utils: UtilsRecord;\n /** Compare options for string orderBy (see `compareOptions` getter). */\n private readonly _compareOptions: StringCollationConfig;\n /** TanStack-shaped runtime collection config needed by index planning. */\n private readonly _config: CollectionRuntimeConfig;\n /** Undo marks registered for optimistic transaction rollbacks. */\n private readonly transactionRollbackMarks = new WeakMap<Transaction<any>, number>();\n /** Attached sync source lifecycle state. */\n private syncStarted = false;\n private syncCleanup: (() => void) | null = null;\n\n private constructor(\n schema: CompiledSchema,\n segment: Segment,\n columns: Map<string, ColumnBuffer>,\n capacity: number,\n undoCapacity: number,\n softDelete: boolean,\n id: string,\n utils: UtilsRecord,\n compareOptions: StringCollationConfig,\n config: CollectionRuntimeConfig,\n ) {\n this.schema = schema;\n this.segment = segment;\n this.columns = columns;\n this.columnList = [...columns.values()].sort(\n (a, b) => a.column.index - b.column.index,\n );\n this.capacity = capacity;\n this.undo = new UndoRing(undoCapacity);\n this.pkColumn = columns.get(schema.primaryKey)!;\n const del = columns.get('__deleted');\n this.deletedColumn = del ?? null;\n this.softDelete = softDelete && del !== null && del !== undefined;\n this._id = id;\n this._utils = utils;\n this._compareOptions = compareOptions;\n this._config = config;\n }\n\n static create(\n schema: CompiledSchema,\n options: CollectionOptions,\n ): Collection {\n if (options.capacity <= 0) {\n throw new RangeError('capacity must be > 0');\n }\n\n const capacity = options.capacity;\n\n // Size the segment. Per-column allocation plan:\n // * validity bitmap (if nullable): ceil(capacity/8) bytes\n // * primary buffer:\n // - fixed-width : capacity * byteWidth\n // - utf8/binary : capacity * 2 * 4 (i32 [start, end) pairs)\n // - dict_utf8 : capacity * 4 (u32 codes)\n // - list : capacity * 2 * 4 (i32 [start, end) pairs into child)\n // - point : capacity * 2 * 8 (Float64 [lng, lat] pairs)\n // - linestring : capacity * 2 * 4 (i32 [start, end) pairs into coords)\n // - polygon : capacity * 2 * 4 (i32 [start, end) pairs into rings)\n // - struct : 0 (fields carry primary storage)\n // * values heap (utf8/binary only): options heap bytes\n // * point/linestring/polygon bbox cache lives with geo column (JS heap in v1)\n // * struct fields: recursively allocated per-field using the same plan\n // (field types are restricted to leaves in v1)\n // Each region is 64B aligned to match Arrow layout.\n const heapBytesFor = (c: CompiledColumn): number => {\n const def = c.valuesHeapBytes ?? Math.max(1024, 32 * capacity);\n return def;\n };\n const primaryBytesFor = (c: CompiledColumn): number => {\n if (\n c.typeCode === ColumnTypeCode.Utf8 ||\n c.typeCode === ColumnTypeCode.Binary ||\n c.typeCode === ColumnTypeCode.List ||\n c.typeCode === ColumnTypeCode.LineString ||\n c.typeCode === ColumnTypeCode.Polygon\n ) {\n return capacity * 8; // i32 pair per row\n }\n if (c.typeCode === ColumnTypeCode.Struct) return 0;\n return c.byteWidth * capacity;\n };\n\n // Walk the compiled schema (including struct fields) to tally segment bytes.\n const tallyColumn = (c: CompiledColumn, total: number): number => {\n if (c.nullable) total = alignUp(total, ARROW_ALIGN) + bitmapBytes(capacity);\n const primary = primaryBytesFor(c);\n if (primary > 0) total = alignUp(total, ARROW_ALIGN) + primary;\n if (\n c.typeCode === ColumnTypeCode.Utf8 ||\n c.typeCode === ColumnTypeCode.Binary\n ) {\n total = alignUp(total, ARROW_ALIGN) + heapBytesFor(c);\n }\n if (c.typeCode === ColumnTypeCode.Struct && c.fields) {\n for (const f of c.fields) total = tallyColumn(f, total);\n }\n // List children live in JS heap — no segment bytes.\n return total;\n };\n\n let total = 0;\n for (const c of schema.columns) total = tallyColumn(c, total);\n total = alignUp(total, ARROW_ALIGN);\n\n const HEADER = 4096;\n const segment = createSegment(HEADER + total);\n segment.allocate(HEADER, ARROW_ALIGN);\n\n const columns = new Map<string, ColumnBuffer>();\n\n const allocateColumn = (c: CompiledColumn): ColumnBuffer => {\n let validity: Uint8Array | null = null;\n if (c.nullable) {\n const off = segment.allocate(bitmapBytes(capacity), ARROW_ALIGN);\n validity = new Uint8Array(segment.buffer, off, bitmapBytes(capacity));\n }\n\n let values: TypedValueArray;\n let heap: ValuesHeap | null = null;\n let dictionary: Dictionary | null = null;\n let list: ListChildState | null = null;\n let point: PointColumn | null = null;\n let lineString: LineStringColumn | null = null;\n let polygon: PolygonColumn | null = null;\n let structFields: ColumnBuffer[] | null = null;\n let structFieldsByName: Map<string, ColumnBuffer> | null = null;\n\n if (c.typeCode === ColumnTypeCode.Utf8) {\n const rangeOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Int32Array(segment.buffer, rangeOff, capacity * 2);\n const heapBytes = heapBytesFor(c);\n const heapOff = segment.allocate(heapBytes, ARROW_ALIGN);\n heap = new ValuesHeap(new Uint8Array(segment.buffer, heapOff, heapBytes));\n } else if (c.typeCode === ColumnTypeCode.Binary) {\n const rangeOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Int32Array(segment.buffer, rangeOff, capacity * 2);\n const heapBytes = heapBytesFor(c);\n const heapOff = segment.allocate(heapBytes, ARROW_ALIGN);\n heap = new ValuesHeap(new Uint8Array(segment.buffer, heapOff, heapBytes));\n } else if (c.typeCode === ColumnTypeCode.DictUtf8) {\n const codeOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Uint32Array(segment.buffer, codeOff, capacity);\n dictionary = new Dictionary();\n } else if (c.typeCode === ColumnTypeCode.List) {\n const rangeOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Int32Array(segment.buffer, rangeOff, capacity * 2);\n list = new ListChildState(c.childColumn!, capacity * 4);\n } else if (c.typeCode === ColumnTypeCode.Point) {\n const coordOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Float64Array(segment.buffer, coordOff, capacity * 2);\n point = new PointColumn(capacity, values as Float64Array);\n } else if (c.typeCode === ColumnTypeCode.LineString) {\n const rangeOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Int32Array(segment.buffer, rangeOff, capacity * 2);\n lineString = new LineStringColumn(capacity, values as Int32Array);\n } else if (c.typeCode === ColumnTypeCode.Polygon) {\n const rangeOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = new Int32Array(segment.buffer, rangeOff, capacity * 2);\n polygon = new PolygonColumn(capacity, {\n ranges: values as Int32Array,\n ...(c.autoCloseRings !== undefined ? { autoCloseRings: c.autoCloseRings } : {}),\n });\n } else if (c.typeCode === ColumnTypeCode.Struct) {\n // Struct has no primary buffer; allocate per-field column bufs.\n values = new Uint8Array(0);\n const fieldList: ColumnBuffer[] = [];\n const byName = new Map<string, ColumnBuffer>();\n for (const f of c.fields ?? []) {\n const fb = allocateColumn(f);\n fieldList.push(fb);\n byName.set(f.name.split('.').pop()!, fb);\n }\n structFields = fieldList;\n structFieldsByName = byName;\n } else {\n const valOff = segment.allocate(primaryBytesFor(c), ARROW_ALIGN);\n values = createTypedView(c.typeCode, segment.buffer, valOff, capacity);\n }\n\n return {\n column: c,\n values,\n validity,\n version: 0,\n heap,\n dictionary,\n list,\n point,\n lineString,\n polygon,\n structFields,\n structFieldsByName,\n };\n };\n\n for (const c of schema.columns) {\n columns.set(c.name, allocateColumn(c));\n }\n\n const undoCapacity = options.undoCapacity ?? 4096;\n const softDelete = options.softDelete ?? columns.has('__deleted');\n const autoIndex = options.autoIndex ?? 'off';\n if (autoIndex === 'eager' && !options.defaultIndexType) {\n throw new ValidationError(\n \"autoIndex: 'eager' requires defaultIndexType to be set. Import an index type and set it, e.g. createCollection({ defaultIndexType: BasicIndex, autoIndex: 'eager', ... }).\",\n );\n }\n const runtimeConfig: CollectionRuntimeConfig = { autoIndex };\n if (options.defaultIndexType !== undefined) {\n runtimeConfig.defaultIndexType = options.defaultIndexType;\n }\n if (options.spatialIndex !== undefined) {\n runtimeConfig.spatialIndex = options.spatialIndex;\n }\n const id =\n options.id ?? `${schema.name}:${++Collection._idCounter}`;\n const utils: UtilsRecord = options.utils ?? {};\n const compareOptions: StringCollationConfig =\n options.compareOptions ?? { stringSort: 'lexical' };\n const coll = new Collection(\n schema,\n segment,\n columns,\n capacity,\n undoCapacity,\n softDelete,\n id,\n utils,\n compareOptions,\n runtimeConfig,\n );\n coll.initializeSpatialIndexes(options.spatialIndex);\n // In-memory collections are born ready. Fire onFirstReady listeners\n // on the next microtask (never synchronously from construction).\n queueMicrotask(() => coll._markReady());\n return coll;\n }\n\n /** Monotonic counter for default `id` assignment. */\n private static _idCounter = 0;\n\n /** Number of live (non-deleted) rows. */\n get size(): number {\n if (!this.softDelete || !this.deletedColumn) return this.rowIndex.size;\n // Count non-deleted rows via rowIndex entries.\n let n = 0;\n for (const [, row] of this.rowIndex.entries()) {\n if (!this.readBool(this.deletedColumn, row)) n++;\n }\n return n;\n }\n\n /** Raw row slot count (including tombstoned rows for soft-delete). */\n get rowCount(): number {\n return this.rowCursor;\n }\n\n get globalVersion(): number {\n return this._globalVersion;\n }\n\n /** Runtime collection config (TanStack-shaped subset). */\n get config(): Readonly<CollectionRuntimeConfig> {\n return this._config;\n }\n\n /** Read the version counter for a single column. */\n columnVersion(name: string): number {\n const c = this.columns.get(name);\n if (!c) throw new ValidationError(`unknown column \"${name}\"`);\n return c.version;\n }\n\n /** Expose the underlying segment buffer (for future worker handoff). */\n getSegmentBuffer(): SharedArrayBuffer | ArrayBuffer {\n return this.segment.buffer;\n }\n\n /** Subscribe to mutation events. Returns an unsubscribe function. */\n subscribe(listener: ChangeListener): () => void {\n return this.emitter.subscribe(listener);\n }\n\n // ---------------------------------------------------------------------\n // TanStack DB-compatible change subscription + event emitter\n // (@tanstack/db parity — Layer B.3)\n //\n // `subscribeChanges` is the high-level API: each mutation becomes a\n // single-element `ChangeMessage[]` batch delivered to the callback.\n // Future work (Layer E + F) may batch multiple mutations per flush\n // when a transaction is open; until then the cadence is 1:1 with\n // the underlying ChangeEmitter.\n //\n // `on`/`once`/`off`/`waitFor` are type-safe facades over the\n // `CollectionEvents` emitter — they cover lifecycle transitions\n // (status change, subscribers change, truncate) that are orthogonal\n // to the row-level change stream. Matches @tanstack/db CollectionImpl.\n // ---------------------------------------------------------------------\n\n /** Count of active `subscribeChanges` subscribers. */\n get subscriberCount(): number {\n return this._subscriberCount;\n }\n\n /**\n * Subscribe to collection changes as TanStack DB `ChangeMessage[]`\n * batches. The callback receives an array of change messages;\n * batches contain a single message in Layer B (one message per\n * mutation). Layer E's transaction machinery will coalesce\n * multiple mutations into a single array when a tx commits.\n *\n * When `options.includeInitialState` is true, the callback is\n * invoked synchronously with one `insert` message per current\n * live row before any mutation-driven calls.\n *\n * Returns a `CollectionSubscription` handle; call `unsubscribe()`\n * to detach. Reading `subscriberCount` also reflects the count.\n */\n subscribeChanges(\n callback: (changes: ChangeMessage<RowValue, number>[]) => void,\n options?: SubscribeChangesOptions,\n ): CollectionSubscription {\n const whereExpression = this._subscribeWhereExpression(options);\n if (whereExpression) ensureIndexForExpression(whereExpression, this);\n\n let active = true;\n const sentKeys = new Set<number>();\n\n const markCurrentRowsSeen = (): void => {\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n sentKeys.add(pk);\n }\n };\n\n const safeCallback = (\n changes: ChangeMessage<RowValue, number>[],\n phase: 'initial' | 'change' = 'change',\n ): void => {\n try {\n callback(changes);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[arrowbase] subscribeChanges ${phase} callback threw:`, err);\n }\n };\n\n const deliverChanges = (changes: ChangeMessage<RowValue, number>[]): void => {\n if (!active) return;\n const filtered = this.filterAndFlipSubscriptionChanges(changes, sentKeys);\n if (filtered === null) return;\n safeCallback(filtered);\n };\n\n // Bump subscriber count and emit.\n const prev = this._subscriberCount++;\n this.events.emit('subscribers:change', {\n type: 'subscribers:change',\n collection: this,\n previousSubscriberCount: prev,\n subscriberCount: this._subscriberCount,\n });\n\n if (options?.includeInitialState) {\n const initial = this.currentStateAsChanges();\n for (const change of initial) sentKeys.add(change.key);\n if (initial.length > 0) safeCallback(initial, 'initial');\n } else if (options?.includeInitialState === false) {\n markCurrentRowsSeen();\n }\n\n const unsubscribeInner = this.emitter.subscribe((ev) => {\n if (!active) return;\n if (ev.op === 'rollback' && ev.changes) {\n deliverChanges(ev.changes as ChangeMessage<RowValue, number>[]);\n return;\n }\n const msg = this._changeEventToMessage(ev);\n if (msg === null) return;\n deliverChanges([msg]);\n });\n\n const sub: CollectionSubscription = {\n status: 'ready',\n unsubscribe: () => {\n if (!active) return;\n active = false;\n unsubscribeInner();\n const prevN = this._subscriberCount--;\n this.events.emit('subscribers:change', {\n type: 'subscribers:change',\n collection: this,\n previousSubscriberCount: prevN,\n subscriberCount: this._subscriberCount,\n });\n },\n };\n return sub;\n }\n\n /**\n * Return the current live state as an array of `insert`\n * `ChangeMessage`s. Analogous to @tanstack/db's\n * `currentStateAsChanges()`. Options are accepted for future\n * compat (where / orderBy / limit) but are no-ops in Layer B;\n * Layer C wires them up to the query path.\n */\n currentStateAsChanges(\n _options?: CurrentStateAsChangesOptions,\n ): ChangeMessage<RowValue, number>[] {\n const out: ChangeMessage<RowValue, number>[] = [];\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n out.push({\n key: pk,\n value: this.snapshotRow(row),\n type: 'insert',\n });\n }\n return out;\n }\n\n /**\n * Map a low-level `ChangeEvent` to a TanStack `ChangeMessage`.\n * Returns null for `rollback`/`compact` — those don't have a 1:1\n * representation in TanStack DB's model (they'd decompose into a\n * series of inverse inserts/updates/deletes). Layer E will handle\n * that decomposition; for now consumers that care must observe\n * the low-level `subscribe()` channel.\n */\n private _changeEventToMessage(\n ev: ChangeEvent,\n ): ChangeMessage<RowValue, number> | null {\n switch (ev.op) {\n case 'insert':\n return {\n key: ev.rowId,\n value: (ev.value ?? {}) as RowValue,\n type: 'insert',\n };\n case 'update': {\n const msg: ChangeMessage<RowValue, number> = {\n key: ev.rowId,\n value: (ev.value ?? {}) as RowValue,\n type: 'update',\n };\n if (ev.previousValue) {\n // Merge prev subset into a full \"before\" snapshot by\n // starting from current value and overlaying prev fields.\n const before: Record<string, unknown> = { ...(ev.value ?? {}) };\n for (const [k, v] of Object.entries(ev.previousValue)) {\n before[k] = v;\n }\n msg.previousValue = before as RowValue;\n }\n return msg;\n }\n case 'delete':\n return {\n key: ev.rowId,\n value: (ev.value ?? {}) as RowValue,\n type: 'delete',\n };\n default:\n return null;\n }\n }\n\n private filterAndFlipSubscriptionChanges(\n changes: ChangeMessage<RowValue, number>[],\n sentKeys: Set<number>,\n ): ChangeMessage<RowValue, number>[] | null {\n const out: ChangeMessage<RowValue, number>[] = [];\n let sawUnseenDelete = false;\n\n for (const change of changes) {\n const key = Number(change.key);\n if (change.type === 'insert') {\n if (sentKeys.has(key)) continue;\n sentKeys.add(key);\n out.push(change);\n } else if (change.type === 'update') {\n if (sentKeys.has(key)) {\n out.push(change);\n } else {\n sentKeys.add(key);\n out.push({ key: change.key, value: change.value, type: 'insert' });\n }\n } else {\n if (sentKeys.has(key)) {\n sentKeys.delete(key);\n out.push(change);\n } else {\n sawUnseenDelete = true;\n }\n }\n }\n\n if (out.length > 0) return out;\n return sawUnseenDelete ? [] : null;\n }\n\n private _subscribeWhereExpression(\n options?: SubscribeChangesOptions,\n ): BasicExpression | undefined {\n if (!options) return undefined;\n const hasWhere = typeof options.where === 'function';\n const hasWhereExpression = options.whereExpression !== undefined;\n if (hasWhere && hasWhereExpression) {\n throw new ValidationError('subscribeChanges: cannot specify both where and whereExpression');\n }\n if (options.whereExpression !== undefined) return options.whereExpression;\n if (!hasWhere) return undefined;\n\n const row = createSingleRowRefProxy<Record<string, unknown>>();\n return toExpression(options.where!(row)) as BasicExpression;\n }\n\n /** Type-safe event subscription. Returns an unsubscribe fn. */\n on<K extends keyof CollectionEvents>(\n event: K,\n callback: (payload: CollectionEvents[K]) => void,\n ): () => void {\n return this.events.on(event, callback);\n }\n\n /** Subscribe for one emission of `event`. Returns unsubscribe fn. */\n once<K extends keyof CollectionEvents>(\n event: K,\n callback: (payload: CollectionEvents[K]) => void,\n ): () => void {\n return this.events.once(event, callback);\n }\n\n /** Remove a specific `on`/`once` listener. */\n off<K extends keyof CollectionEvents>(\n event: K,\n callback: (payload: CollectionEvents[K]) => void,\n ): void {\n this.events.off(event, callback);\n }\n\n /**\n * Await the next emission of `event`. Rejects with a timeout error\n * if `timeout` ms elapse first. Matches @tanstack/db semantics.\n */\n waitFor<K extends keyof CollectionEvents>(\n event: K,\n timeout?: number,\n ): Promise<CollectionEvents[K]> {\n return this.events.waitFor(event, timeout);\n }\n\n /** List all column names in declaration order. */\n columnNames(): readonly string[] {\n return this.columnList.map((c) => c.column.name);\n }\n\n /** True when the collection has a soft-delete column active. */\n get hasSoftDelete(): boolean {\n return this.softDelete;\n }\n\n // ---------------------------------------------------------------------\n // Snapshot integration (low-level; prefer `exportSnapshot`/`importSnapshot`).\n // ---------------------------------------------------------------------\n\n /**\n * Expose underlying buffer views to the snapshot exporter. Rows are\n * emitted up to `rowCursor`, so consumers copy the *used* subregion\n * of each typed-array buffer (not the whole allocated capacity). This\n * keeps snapshots proportional to live data.\n */\n bulkColumnViews(): ReadonlyArray<{\n name: string;\n type: ColumnTypeName;\n typeCode: ColumnTypeCode;\n nullable: boolean;\n validity: Uint8Array | null;\n primaryBuffer: Uint8Array;\n heap: Uint8Array | null;\n dictionaryEntries: readonly string[] | null;\n }> {\n return this.columnList.map((col) => {\n const validity = col.validity\n ? col.validity.slice(0, (this.rowCursor + 7) >>> 3)\n : null;\n const primary = extractPrimaryBytes(col, this.rowCursor);\n const heap = col.heap ? col.heap.rawBytes.slice(0, col.heap.used) : null;\n const dictionaryEntries = col.dictionary\n ? [...col.dictionary.entries()].map(([, s]) => s)\n : null;\n return {\n name: col.column.name,\n type: col.column.type,\n typeCode: col.column.typeCode,\n nullable: col.column.nullable,\n validity,\n primaryBuffer: primary,\n heap,\n dictionaryEntries,\n };\n });\n }\n\n /**\n * Tree-shaped column view for the snapshot exporter. Mirrors the\n * compiled schema: list columns carry a `listChild` view; struct\n * columns carry a `fields` array. Each leaf view is slice-copied\n * up to the collection's current row cursor (for leaves) or list\n * child cursor (for list children) so the snapshot size is\n * proportional to live data.\n */\n bulkColumnViewsTree(): ReadonlyArray<TreeView> {\n return this.columnList.map((c) => this.buildTreeView(c));\n }\n\n private buildTreeView(col: ColumnBuffer): TreeView {\n const tc = col.column.typeCode;\n const validity = col.validity\n ? col.validity.slice(0, (this.rowCursor + 7) >>> 3)\n : null;\n const primary = extractPrimaryBytes(col, this.rowCursor);\n const heap = col.heap ? col.heap.rawBytes.slice(0, col.heap.used) : null;\n const dictionaryEntries = col.dictionary\n ? [...col.dictionary.entries()].map(([, s]) => s)\n : null;\n\n if (tc === ColumnTypeCode.List) {\n const listState = col.list!;\n return {\n name: col.column.name,\n type: col.column.type,\n typeCode: tc,\n nullable: col.column.nullable,\n validity,\n primaryBuffer: primary,\n heap,\n dictionaryEntries,\n listChildElements: listState.cursor,\n listChild: buildListChildTreeView(col.column.name, listState),\n };\n }\n\n if (tc === ColumnTypeCode.Struct) {\n return {\n name: col.column.name,\n type: col.column.type,\n typeCode: tc,\n nullable: col.column.nullable,\n validity,\n primaryBuffer: primary, // empty\n heap: null,\n dictionaryEntries: null,\n fields: (col.structFields ?? []).map((f) => this.buildTreeView(f)),\n };\n }\n\n return {\n name: col.column.name,\n type: col.column.type,\n typeCode: tc,\n nullable: col.column.nullable,\n validity,\n primaryBuffer: primary,\n heap,\n dictionaryEntries,\n };\n }\n\n /** Internal: restore the monotonic `globalVersion` after a snapshot import. */\n _restoreGlobalVersionForSnapshot(version: number): void {\n if (!Number.isInteger(version) || version < this._globalVersion) {\n throw new ValidationError(\n `cannot restore globalVersion to ${version}; current is ${this._globalVersion}`,\n );\n }\n this._globalVersion = version;\n }\n\n /**\n * Internal low-level scan view for the query kernel. Exposes raw\n * typed-array references + heap + dictionary so the kernel can read\n * values by (column, row ordinal) without allocating a row object.\n *\n * The returned arrays are live views into the collection's storage.\n * Do not mutate them. Their validity is bounded by the next mutation\n * that may resize the segment (today the segment capacity is fixed,\n * so views remain stable for the lifetime of the collection — but\n * this is an implementation detail that can change).\n */\n _internalScanColumns(): readonly ScanColumn[] {\n return this.columnList.map((col) => ({\n name: col.column.name,\n typeCode: col.column.typeCode,\n nullable: col.column.nullable,\n validity: col.validity,\n values: col.values,\n heap: col.heap,\n dictionary: col.dictionary,\n }));\n }\n\n /**\n * Internal: yield live row ordinals (respecting soft-delete) in PK\n * insertion order. The kernel iterates these to drive vectorized scans.\n */\n *_internalLiveOrdinals(\n options?: { includeSoftDeleted?: boolean },\n ): IterableIterator<number> {\n const include = options?.includeSoftDeleted === true;\n const del = this.deletedColumn;\n const soft = this.softDelete;\n if (!soft || !del || include) {\n for (const [, row] of this.rowIndex.entries()) yield row;\n return;\n }\n const validity = del.validity;\n const values = del.values as Uint8Array;\n for (const [, row] of this.rowIndex.entries()) {\n // readBool inlined for speed.\n if (validity && !getValidity(validity, row)) {\n // null treated as not-deleted (normal-mode insert path defaults to false)\n yield row;\n continue;\n }\n if ((values[row] ?? 0) === 0) yield row;\n }\n }\n\n /**\n * Internal: yield live row ordinals whose primary keys are in `keys`, preserving scan order.\n */\n *_internalLiveOrdinalsForKeys(keys: ReadonlySet<number>): IterableIterator<number> {\n const del = this.deletedColumn;\n const soft = this.softDelete;\n\n // Sparse index hits should be O(k), not O(collection size). Preserve the\n // old scan-order contract by sorting resolved ordinals back to insertion order.\n if (keys.size * 8 < this.rowIndex.size) {\n const ordinals: number[] = [];\n for (const pk of keys) {\n const row = this.rowIndex.lookup(pk);\n if (row === undefined) continue;\n if (soft && del && this.readBool(del, row)) continue;\n ordinals.push(row);\n }\n ordinals.sort((a, b) => a - b);\n for (const row of ordinals) yield row;\n return;\n }\n\n for (const [pk, row] of this.rowIndex.entries()) {\n if (!keys.has(pk)) continue;\n if (soft && del && this.readBool(del, row)) continue;\n yield row;\n }\n }\n\n /** Search an attached geometry-envelope index. Returns row ordinals. */\n _internalSearchSpatialIndex(column: string, query: BBox): Uint32Array | undefined {\n let state = this._spatialIndexes.get(column);\n if (!state) return undefined;\n const col = this.columns.get(column);\n const bboxCache = col ? this.spatialBboxCache(col) : null;\n if (bboxCache === null) return undefined;\n flushSpatialIndexDirty(state, bboxCache);\n if (state.segments.length >= 64) {\n state = this.rebuildSpatialIndexColumn(column, state, bboxCache);\n }\n return searchSpatialIndex(state, bboxCache, query);\n }\n\n /** Resolve a primary key to its current row ordinal without materializing a row. */\n _internalRowOrdinalForKey(key: number): number | undefined {\n const row = this.rowIndex.lookup(key);\n if (row === undefined) return undefined;\n if (this.softDelete && this.deletedColumn && this.readBool(this.deletedColumn, row)) return undefined;\n return row;\n }\n\n /** Evaluate a bbox predicate directly against the cached geometry envelope. */\n _internalGeometryBboxMatches(\n column: string,\n row: number,\n query: BBox,\n mode: 'intersects' | 'within',\n ): boolean {\n assertValidBbox(query, 'query');\n const col = this.columns.get(column);\n const cache = col ? this.spatialBboxCache(col) : null;\n if (cache === null) return false;\n const offset = row * 4;\n const minX = cache[offset];\n const minY = cache[offset + 1];\n const maxX = cache[offset + 2];\n const maxY = cache[offset + 3];\n if (![minX, minY, maxX, maxY].every(Number.isFinite)) return false;\n if (mode === 'within') {\n return minX! >= query[0] && minY! >= query[1] && maxX! <= query[2] && maxY! <= query[3];\n }\n return minX! <= query[2] && maxX! >= query[0] && minY! <= query[3] && maxY! >= query[1];\n }\n\n /** Evaluate point distance directly against coordinate buffers. */\n _internalPointDWithin(column: string, row: number, point: Point, meters: number): boolean {\n const col = this.columns.get(column);\n if (!col?.point || (col.validity && !getValidity(col.validity, row))) return false;\n const offset = row * 2;\n return haversineDistanceMetersXY(\n col.point.coords[offset]!,\n col.point.coords[offset + 1]!,\n point[0],\n point[1],\n ) <= meters;\n }\n\n /**\n * Internal: read a single cell at (column, row) for the kernel. Used\n * to materialize projected rows only after filter + sort + limit\n * have produced a final ordinal list.\n */\n _internalReadCell(colName: string, row: number): RowValue[string] {\n const col = this.columns.get(colName);\n if (!col) throw new ValidationError(`unknown column \"${colName}\"`);\n return this.readCell(col, row);\n }\n\n /**\n * Introspection view for devtools. Returns per-column metadata\n * (version, null count, heap usage, dictionary sample) without\n * exposing live buffers. `nullCount` walks the validity bitmap once\n * per nullable column — O(rowCursor) total. Safe to call on a hot\n * path but not a no-op.\n */\n describeColumnViews(): ReadonlyArray<{\n name: string;\n type: ColumnTypeName;\n nullable: boolean;\n version: number;\n nullCount: number;\n heap: { used: number; capacity: number } | null;\n dictionaryEntries: readonly string[] | null;\n }> {\n return this.columnList.map((col) => {\n let nullCount = 0;\n if (col.validity) {\n for (let r = 0; r < this.rowCursor; r++) {\n if (!getValidity(col.validity, r)) nullCount++;\n }\n }\n return {\n name: col.column.name,\n type: col.column.type,\n nullable: col.column.nullable,\n version: col.version,\n nullCount,\n heap: col.heap\n ? { used: col.heap.used, capacity: col.heap.capacity }\n : null,\n dictionaryEntries: col.dictionary\n ? [...col.dictionary.entries()].map(([, s]) => s)\n : null,\n };\n });\n }\n\n // ---------------------------------------------------------------------\n // Mutations\n // ---------------------------------------------------------------------\n\n insert(row: RowValue, config: InsertConfig = {}): Transaction<RowValue> {\n return this.applyCollectionMutation('insert', config, () => {\n const applied = this.insertRaw(row);\n return this.createPendingMutation(\n 'insert',\n applied.key,\n {},\n applied.value,\n applied.value,\n config,\n );\n });\n }\n\n update(id: number, patch: Partial<RowValue>): Transaction<RowValue>;\n update(id: number, callback: (draft: RowValue) => void): Transaction<RowValue>;\n update(\n id: number,\n config: OperationConfig,\n callback: Partial<RowValue> | ((draft: RowValue) => void),\n ): Transaction<RowValue>;\n update(\n id: number,\n patchOrConfigOrCallback:\n | Partial<RowValue>\n | OperationConfig\n | ((draft: RowValue) => void),\n maybeCallback?: Partial<RowValue> | ((draft: RowValue) => void),\n ): Transaction<RowValue> {\n const { config, patch } = this.resolveUpdatePatch(\n id,\n patchOrConfigOrCallback,\n maybeCallback,\n );\n return this.applyCollectionMutation('update', config, () => {\n const applied = this.updateRaw(id, patch);\n return this.createPendingMutation(\n 'update',\n id,\n applied.original,\n applied.modified,\n applied.changes,\n config,\n );\n });\n }\n\n delete(id: number, config: OperationConfig = {}): Transaction<RowValue> {\n return this.applyCollectionMutation('delete', config, () => {\n const applied = this.deleteRaw(id);\n return this.createPendingMutation(\n 'delete',\n id,\n applied.original,\n applied.modified,\n applied.changes,\n config,\n );\n });\n }\n\n private applyCollectionMutation(\n type: 'insert' | 'update' | 'delete',\n config: OperationConfig,\n apply: () => PendingMutation<RowValue>,\n ): Transaction<RowValue> {\n const active = getActiveTransaction() as Transaction<RowValue> | undefined;\n const tx =\n active ??\n createTransaction<RowValue>({\n mutationFn: async ({ transaction }) => {\n await this.callCollectionMutationHandler(\n type,\n transaction as unknown as Transaction<RowValue>,\n );\n },\n });\n\n this.registerTransactionRollback(tx);\n\n let mutation: PendingMutation<RowValue>;\n try {\n mutation = apply();\n } catch (error) {\n if (!active) {\n const originalError = error instanceof Error ? error : new Error(String(error));\n tx.error = { message: originalError.message, error: originalError };\n void tx.isPersisted.promise.catch(() => undefined);\n tx.rollback();\n }\n throw error;\n }\n\n tx.applyMutations([mutation]);\n if (!active && type === 'update' && this.shouldConfirmSyncedUpdates()) {\n this._internalConfirmSyncedMutations([mutation]);\n }\n if (!active) void tx.commit().catch(() => undefined);\n return tx;\n }\n\n private registerTransactionRollback(tx: Transaction<any>): void {\n if (this.transactionRollbackMarks.has(tx)) return;\n const mark = this.beginTransaction();\n this.transactionRollbackMarks.set(tx, mark);\n tx.addRollbackHandler(() => {\n const rollbackMark = this.transactionRollbackMarks.get(tx);\n if (rollbackMark === undefined) return;\n this.transactionRollbackMarks.delete(tx);\n this.rollback(rollbackMark);\n });\n }\n\n private shouldConfirmSyncedUpdates(): boolean {\n return this._utils.__arrowbaseLocalOnlyConfirmUpdates === true;\n }\n\n private async callCollectionMutationHandler(\n type: 'insert' | 'update' | 'delete',\n transaction: Transaction<RowValue>,\n ): Promise<void> {\n const metadata = getCollectionMetadata(this);\n const params = { transaction, collection: this } as any;\n if (type === 'insert') {\n await metadata?.onInsert?.(params);\n } else if (type === 'update') {\n await metadata?.onUpdate?.(params);\n } else {\n await metadata?.onDelete?.(params);\n }\n }\n\n private createPendingMutation(\n type: 'insert' | 'update' | 'delete',\n key: number,\n original: RowValue | {},\n modified: RowValue,\n changes: Partial<RowValue> | RowValue,\n config: OperationConfig,\n ): PendingMutation<RowValue> {\n const now = new Date();\n return {\n mutationId: randomCollectionMutationId(),\n original: original as PendingMutation<RowValue>['original'],\n modified,\n changes: changes as PendingMutation<RowValue>['changes'],\n globalKey: `KEY::${this.id}/${key}`,\n key,\n metadata: config.metadata,\n syncMetadata: {},\n optimistic: config.optimistic ?? true,\n type,\n createdAt: now,\n updatedAt: now,\n collection: this,\n };\n }\n\n private resolveUpdatePatch(\n id: number,\n patchOrConfigOrCallback:\n | Partial<RowValue>\n | OperationConfig\n | ((draft: RowValue) => void),\n maybeCallback?: Partial<RowValue> | ((draft: RowValue) => void),\n ): { config: OperationConfig; patch: Partial<RowValue> } {\n if (typeof patchOrConfigOrCallback === 'function') {\n return {\n config: {},\n patch: this.patchFromCallback(id, patchOrConfigOrCallback),\n };\n }\n\n if (maybeCallback !== undefined) {\n const updater = maybeCallback;\n return {\n config: patchOrConfigOrCallback as OperationConfig,\n patch:\n typeof updater === 'function'\n ? this.patchFromCallback(id, updater)\n : updater,\n };\n }\n\n return { config: {}, patch: patchOrConfigOrCallback as Partial<RowValue> };\n }\n\n private patchFromCallback(\n id: number,\n callback: (draft: RowValue) => void,\n ): Partial<RowValue> {\n const current = this.get(id);\n if (!current) this.rowIndex.require(id);\n const before = current ?? this.snapshotRow(this.rowIndex.require(id));\n const draft = { ...before };\n callback(draft);\n const patch: Partial<RowValue> = {};\n for (const [name, value] of Object.entries(draft)) {\n if (!Object.is(value, before[name])) {\n patch[name] = value as RowValue[string];\n }\n }\n return patch;\n }\n\n private insertRaw(row: RowValue): { key: number; value: RowValue } {\n const pk = this.coerceUint32(row[this.schema.primaryKey], this.schema.primaryKey);\n if (this.rowIndex.lookup(pk) !== undefined) {\n throw new ValidationError(`duplicate primary key ${pk}`);\n }\n if (this.rowCursor >= this.capacity) {\n throw new OutOfSpaceError(\n `collection \"${this.schema.name}\" is at capacity ${this.capacity}`,\n );\n }\n\n const rowIdx = this.rowCursor++;\n const touched = new Set<string>();\n for (const col of this.columnList) {\n const val = row[col.column.name];\n this.writeCell(col, rowIdx, val ?? null);\n col.version = (col.version + 1) >>> 0;\n touched.add(col.column.name);\n }\n this.rowIndex.insert(pk, rowIdx);\n this.markSpatialRowDirty(rowIdx);\n const value = this.snapshotRow(rowIdx);\n this.addToIndexes(pk, value);\n this.undo.push('insert', pk, rowIdx, {});\n this._globalVersion++;\n this.emitter.emit({\n op: 'insert',\n rowId: pk,\n columns: touched,\n globalVersion: this._globalVersion,\n value,\n });\n return { key: pk, value };\n }\n\n private updateRaw(\n id: number,\n patch: Partial<RowValue>,\n ): { original: RowValue; modified: RowValue; changes: Partial<RowValue> } {\n for (const name of Object.keys(patch)) {\n if (name === this.schema.primaryKey) {\n throw new ValidationError(`cannot update primary key`);\n }\n if (!this.columns.has(name)) {\n throw new ValidationError(`unknown column \"${name}\"`);\n }\n }\n\n const row = this.rowIndex.require(id);\n const before = this.snapshotRow(row);\n const prev: Record<string, unknown> = {};\n const touched = new Set<string>();\n for (const [name, value] of Object.entries(patch)) {\n const col = this.columns.get(name)!;\n prev[name] = this.readCell(col, row);\n this.writeCell(col, row, value ?? null);\n col.version = (col.version + 1) >>> 0;\n touched.add(name);\n }\n const after = this.snapshotRow(row);\n const changes: Partial<RowValue> = {};\n for (const name of touched) {\n changes[name] = after[name] as RowValue[string];\n }\n this.markSpatialRowDirty(row, touched);\n this.updateIndexes(id, before, after);\n this.undo.push('update', id, row, prev);\n this._globalVersion++;\n this.emitter.emit({\n op: 'update',\n rowId: id,\n columns: touched,\n globalVersion: this._globalVersion,\n value: after,\n previousValue: prev,\n });\n return { original: before, modified: after, changes };\n }\n\n private deleteRaw(\n id: number,\n ): { original: RowValue; modified: RowValue; changes: RowValue } {\n const row = this.rowIndex.require(id);\n const before = this.snapshotRow(row);\n this.markSpatialRowDeleted(row);\n const touched = new Set<string>();\n // Value to emit: for soft-delete it's the row after the flip (with\n // __deleted: true); for hard-delete it's the snapshot taken before\n // removal (the row slot is unreachable via rowIndex after).\n let emittedValue: Record<string, unknown>;\n let emittedPrev: Record<string, unknown> | undefined;\n if (this.softDelete && this.deletedColumn) {\n const prev = this.readBool(this.deletedColumn, row);\n this.removeFromIndexes(id, before);\n emittedPrev = { __deleted: prev };\n this.writeCell(this.deletedColumn, row, true);\n this.deletedColumn.version = (this.deletedColumn.version + 1) >>> 0;\n this.undo.push('delete', id, row, { __deleted: prev });\n touched.add('__deleted');\n emittedValue = this.snapshotRow(row);\n } else {\n // Hard delete: snapshot the full row before removing.\n const snap = this.snapshotRow(row);\n this.removeFromIndexes(id, snap);\n this.rowIndex.remove(id);\n // Mark row as free via PK=0 and all columns untouched; the slot is not\n // reclaimed in Phase 1. Iteration uses rowIndex so the row is invisible.\n this.undo.push('delete', id, row, {}, snap);\n emittedValue = snap;\n }\n this._globalVersion++;\n this.emitter.emit({\n op: 'delete',\n rowId: id,\n columns: this.softDelete ? touched : 'all',\n globalVersion: this._globalVersion,\n value: emittedValue,\n ...(emittedPrev !== undefined ? { previousValue: emittedPrev } : {}),\n });\n return { original: before, modified: before, changes: before };\n }\n\n get(id: number): RowValue | undefined {\n const row = this.rowIndex.lookup(id);\n if (row === undefined) return undefined;\n if (this.softDelete && this.deletedColumn && this.readBool(this.deletedColumn, row)) {\n return undefined;\n }\n return this.snapshotRow(row);\n }\n\n /**\n * Iterate rows as plain JS objects.\n *\n * By default, soft-deleted rows are excluded. Pass\n * `{ includeSoftDeleted: true }` to include them — useful for sync\n * adapters that want to mirror tombstones to downstream stores.\n */\n *rows(options?: { includeSoftDeleted?: boolean }): IterableIterator<RowValue> {\n const include = options?.includeSoftDeleted === true;\n for (const [, row] of this.rowIndex.entries()) {\n if (\n !include &&\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n yield this.snapshotRow(row);\n }\n }\n\n // ---------------------------------------------------------------------\n // Map-like read surface (@tanstack/db parity — Layer B.1)\n //\n // `has` / `keys` / `values` / `entries` / `forEach` / `map` match the\n // Map-like read API of `@tanstack/db`'s CollectionImpl. They iterate\n // the same live rows as `rows()` but yield the stable primary-key\n // instead of (or alongside) the materialized row.\n //\n // `state` and `toArray` are lazy-cached snapshots invalidated on the\n // next mutation via globalVersion bookkeeping. Iteration methods\n // never build the cached Map/Array — only an explicit read of\n // `.state` or `.toArray` does.\n // ---------------------------------------------------------------------\n\n /** Cached `Map<pk, row>` view. Built lazily on first read. */\n private _stateCache: Map<number, RowValue> | null = null;\n /** `globalVersion` at the moment `_stateCache` was built. */\n private _stateCacheVersion = -1;\n /** Cached dense `row[]` view. Built lazily on first read. */\n private _toArrayCache: RowValue[] | null = null;\n /** `globalVersion` at the moment `_toArrayCache` was built. */\n private _toArrayCacheVersion = -1;\n\n // ---------------------------------------------------------------------\n // Status / lifecycle (@tanstack/db parity — Layer B.2)\n //\n // In-memory collections have no asynchronous initialization, so we\n // start in 'ready' and never pass through 'idle'/'loading' unless\n // a future sync-backed config explicitly requests it (deferred work).\n // The hooks still exist and obey the same invariants:\n // - onFirstReady: fires exactly once; if already ready at the call\n // site, resolves on the next microtask (NOT synchronously — that\n // would make listener ordering observable and break React's\n // expectation that effects run after paint).\n // - isReady(): the canonical check.\n // - preload()/stateWhenReady()/toArrayWhenReady(): Promise shapes\n // that await ready-state.\n // - startSyncImmediate(): no-op for in-memory; reserved for\n // sync-backed configs.\n // A Layer-E sync-adapter rewire may transition through 'loading' →\n // 'ready'. Rows that change status after construction bump\n // `_statusChanged` to wake waiting promises.\n // ---------------------------------------------------------------------\n\n private _status: CollectionStatus = 'ready';\n private _firstReadyListeners: Array<() => void> = [];\n private _firstReadyFired = false;\n /** Promises awaiting `preload()` / `stateWhenReady()` / etc. */\n private _readyPromise: Promise<void> | null = null;\n private _readyResolve: (() => void) | null = null;\n\n /**\n * Current lifecycle status of the collection. For in-memory\n * collections this starts as `'ready'` and stays there until\n * `cleanup()` transitions to `'cleaned-up'`.\n */\n get status(): CollectionStatus {\n return this._status;\n }\n\n /** `true` iff status is `'ready'`. */\n isReady(): boolean {\n return this._status === 'ready';\n }\n\n /**\n * Register a callback that fires exactly once, the first time the\n * collection becomes ready. If the collection is already ready, the\n * callback is invoked on the next microtask (never synchronously, so\n * ordering is predictable and matches @tanstack/db).\n *\n * Duplicate registrations are allowed; each registered callback\n * fires at most once.\n */\n onFirstReady(callback: () => void): void {\n if (this._firstReadyFired) {\n queueMicrotask(callback);\n return;\n }\n this._firstReadyListeners.push(callback);\n }\n\n /**\n * Internal helper for lifecycle machinery to mark the collection as\n * ready. Not exposed publicly — callers use the sync-config\n * `markReady` callback instead. For in-memory collections this is\n * invoked once during construction.\n */\n private _markReady(): void {\n if (this._firstReadyFired) return;\n this._firstReadyFired = true;\n const previousStatus = this._status;\n this._status = 'ready';\n // Fan out listeners in the order they were registered.\n const listeners = this._firstReadyListeners;\n this._firstReadyListeners = [];\n for (const cb of listeners) {\n try {\n cb();\n } catch {\n // Per @tanstack/db semantics, a throwing listener must not\n // prevent the others from firing. We silently swallow.\n }\n }\n this._readyResolve?.();\n // Fire the corresponding high-level events on the event bus.\n // `previousStatus === this._status` only happens when we were\n // already 'ready' at birth (the common case), in which case\n // @tanstack/db still fires the `status:change` to let\n // onFirstReady observers chain off it.\n if (previousStatus !== this._status) {\n const ev: CollectionStatusChangeEvent = {\n type: 'status:change',\n collection: this,\n previousStatus,\n status: this._status,\n };\n this.events.emit('status:change', ev);\n this.events.emit(`status:${this._status}` as const, ev);\n }\n }\n\n /**\n * Returns a promise that resolves when the collection is ready.\n * Resolves immediately if already ready. No-op for in-memory\n * collections after the first construction microtask.\n */\n preload(): Promise<void> {\n if (!this.syncStarted) this.startSyncImmediate();\n if (this._firstReadyFired) return Promise.resolve();\n if (this._readyPromise) return this._readyPromise;\n this._readyPromise = new Promise<void>((resolve) => {\n this._readyResolve = resolve;\n });\n return this._readyPromise;\n }\n\n /**\n * Request eager synchronous start of any attached sync source. For\n * pure in-memory collections this is a no-op; the hook exists so\n * sync-backed subclasses / configs can override it without breaking\n * the TanStack surface.\n */\n startSyncImmediate(): void {\n if (this.syncStarted) return;\n const metadata = getCollectionMetadata(this);\n const sync = metadata?.sync;\n if (!sync) return;\n\n this.syncStarted = true;\n let batch: Array<ChangeMessage<RowValue, number>> | null = null;\n\n const flush = (): void => {\n const messages = batch ?? [];\n batch = null;\n for (const message of messages) this.applySyncMessage(message);\n };\n\n const cleanup = sync.sync({\n collection: this,\n begin: () => {\n batch = [];\n },\n write: (message) => {\n const narrowed = message as ChangeMessage<RowValue, number>;\n if (batch) batch.push(narrowed);\n else this.applySyncMessage(narrowed);\n },\n commit: flush,\n markReady: () => this._markReady(),\n truncate: () => this.truncateFromSync(),\n });\n\n this.syncCleanup = cleanup ?? null;\n }\n\n private primaryKeyFromMessage(message: ChangeMessage<RowValue, number>): number {\n const rawKey = message.key ?? this.getKeyFromItem(message.value);\n const numericKey = Number(rawKey);\n if (!Number.isFinite(numericKey)) {\n throw new ValidationError(`sync message key must be numeric (got ${String(rawKey)})`);\n }\n return numericKey;\n }\n\n private patchFromSyncValue(value: RowValue): Partial<RowValue> {\n const patch: Partial<RowValue> = {};\n for (const [name, fieldValue] of Object.entries(value)) {\n if (name !== this.schema.primaryKey) patch[name] = fieldValue as RowValue[string];\n }\n return patch;\n }\n\n private applySyncMessage(message: ChangeMessage<RowValue, number>): void {\n const key = this.primaryKeyFromMessage(message);\n const storedRow = this.rowIndex.lookup(key);\n if (message.type === 'delete') {\n if (storedRow !== undefined) this.deleteRaw(key);\n return;\n }\n\n if (storedRow !== undefined) {\n this.updateRaw(key, this.patchFromSyncValue(message.value));\n } else {\n this.insertRaw(message.value);\n }\n }\n\n private truncateFromSync(): void {\n const keys = [...this.keys()];\n for (const key of keys) this.deleteRaw(key);\n this.events.emit('truncate', { type: 'truncate', collection: this });\n }\n\n /**\n * Resolves with a Map snapshot of the collection once ready. After\n * the collection is ready this is equivalent to reading `state`\n * (still reuses the lazy cache).\n */\n async stateWhenReady(): Promise<Map<number, RowValue>> {\n await this.preload();\n return this.state;\n }\n\n /**\n * Resolves with a dense array snapshot once ready.\n */\n async toArrayWhenReady(): Promise<RowValue[]> {\n await this.preload();\n return this.toArray;\n }\n\n // ---------------------------------------------------------------------\n // Identity / utils / config accessors (@tanstack/db parity — B.5–B.7)\n // ---------------------------------------------------------------------\n\n /** Stable collection identifier. Matches @tanstack/db's `Collection.id`. */\n get id(): string {\n return this._id;\n }\n\n /**\n * Collection-scoped utility record. Callers can plumb helper\n * functions (e.g. `refetch`, `reset`, `prefetchPage`) via\n * `CollectionOptions.utils`. The getter returns the live record;\n * mutating it after construction is NOT recommended but not\n * forbidden (matches @tanstack/db).\n */\n get utils(): UtilsRecord {\n return this._utils;\n }\n\n /**\n * String collation config for orderBy on string columns. Matches\n * `@tanstack/db`'s `Collection.compareOptions`. Defaults to\n * `{ stringSort: 'lexical' }` when not configured.\n */\n get compareOptions(): StringCollationConfig {\n return this._compareOptions;\n }\n\n /**\n * Whether a sync-layer subset load is in flight. Always `false`\n * for in-memory collections (no subset loading). Present for\n * @tanstack/db parity; sync-backed collections override.\n */\n get isLoadingSubset(): boolean {\n return false;\n }\n\n /** Secondary indexes attached to this collection. */\n get indexes(): ReadonlyMap<number, IndexInterface<number>> {\n return this._indexes;\n }\n\n createIndex(\n callback: IndexExpressionCallback,\n options?: CollectionIndexOptions,\n ): IndexInterface<number> {\n const row = createSingleRowRefProxy<Record<string, unknown>>();\n const expression = toExpression(callback(row)) as BasicExpression;\n if (expression.type !== 'ref') {\n throw new ValidationError('createIndex callback must return a row field reference');\n }\n\n const id = ++this._nextIndexId;\n const IndexType = options?.indexType ?? this._config.defaultIndexType ?? BasicIndex;\n const index = new IndexType(id, expression, options?.name, options?.options) as IndexInterface<number>;\n index.build(this.entries());\n this._indexes.set(id, index);\n return index;\n }\n\n /**\n * Return the primary key value of a row-shaped item. Matches\n * `@tanstack/db`'s `Collection.getKeyFromItem(item)`. Reads the\n * schema's PK column from the given row.\n *\n * @throws ValidationError if the PK column is missing from `item`.\n */\n getKeyFromItem(item: Readonly<RowValue>): number {\n const pk = item[this.schema.primaryKey];\n if (pk === undefined || pk === null) {\n throw new ValidationError(\n `getKeyFromItem: item is missing primary-key column \"${this.schema.primaryKey}\"`,\n );\n }\n if (typeof pk !== 'number') {\n throw new ValidationError(\n `getKeyFromItem: primary key must be a number (got ${typeof pk})`,\n );\n }\n return pk;\n }\n\n /**\n * Validate a data record against the collection schema. Matches\n * `@tanstack/db`'s `Collection.validateData(data, type, key?)`.\n *\n * For `'insert'`: every column declared in the schema must be\n * present (or nullable-null) and typed correctly.\n * For `'update'`: only provided columns are checked; the PK column\n * must NOT appear in the patch.\n *\n * Returns the validated data (same shape as input on success).\n * Throws `ValidationError` on failure — matches the reference's\n * `TOutput | never` return shape.\n */\n validateData(\n data: unknown,\n type: 'insert' | 'update',\n _key?: number,\n ): RowValue {\n if (data === null || typeof data !== 'object') {\n throw new ValidationError(\n `validateData: expected object, got ${data === null ? 'null' : typeof data}`,\n );\n }\n const rec = data as Record<string, unknown>;\n // Shape-check against schema columns.\n if (type === 'insert') {\n for (const col of this.columnList) {\n const name = col.column.name;\n const val = rec[name];\n if (val === undefined) {\n // Treat explicit `undefined` as \"column missing\"; allow\n // nullable columns to be absent (coerced to null at insert\n // time). Non-nullable columns must be provided.\n if (!col.column.nullable) {\n throw new ValidationError(\n `validateData(insert): required column \"${name}\" missing`,\n );\n }\n }\n }\n } else {\n // Update: reject PK in patch.\n if (this.schema.primaryKey in rec) {\n throw new ValidationError(\n `validateData(update): cannot patch primary key \"${this.schema.primaryKey}\"`,\n );\n }\n for (const key of Object.keys(rec)) {\n if (!this.columns.has(key)) {\n throw new ValidationError(\n `validateData(update): unknown column \"${key}\"`,\n );\n }\n }\n }\n return rec as RowValue;\n }\n\n // ---------------------------------------------------------------------\n // Cleanup (@tanstack/db parity — B.8)\n // ---------------------------------------------------------------------\n\n /**\n * Release resources: detach every `subscribeChanges`/`on` listener,\n * drop cached state, clear the undo ring, transition status to\n * `'cleaned-up'`. Idempotent; subsequent mutations will still work\n * but no longer notify external subscribers.\n *\n * Matches `@tanstack/db`'s `Collection.cleanup()`. Async for\n * parity; the in-memory implementation completes after a single\n * microtask so `await cleanup()` returns on the next tick.\n */\n async cleanup(): Promise<void> {\n if (this._status === 'cleaned-up') return;\n const previousStatus = this._status;\n this._status = 'cleaned-up';\n\n // Detach sync source cleanup before clearing local event listeners.\n this.syncCleanup?.();\n this.syncCleanup = null;\n this.syncStarted = false;\n\n // Emit the terminal status events FIRST — before clearing\n // listeners — so observers see the transition.\n const ev: CollectionStatusChangeEvent = {\n type: 'status:change',\n collection: this,\n previousStatus,\n status: 'cleaned-up',\n };\n this.events.emit('status:change', ev);\n this.events.emit('status:cleaned-up', ev);\n\n // Now drop every event subscriber.\n this.events.clearAll();\n // The low-level ChangeEmitter has no bulk-clear; emptying the\n // internal Set is the cleanest path. Accessing the private\n // field is acceptable here — cleanup() is the sanctioned\n // lifecycle terminator.\n (this.emitter as unknown as { listeners: Set<unknown> }).listeners.clear();\n // Reset subscriber bookkeeping.\n this._subscriberCount = 0;\n // Drop cached views.\n this._stateCache = null;\n this._stateCacheVersion = -1;\n this._toArrayCache = null;\n this._toArrayCacheVersion = -1;\n\n // Resolve on the microtask boundary so awaiting callers don't\n // observe the transition synchronously (matches\n // @tanstack/db's async-cleanup contract).\n await Promise.resolve();\n }\n\n /**\n * Return true if the collection contains a live (non-soft-deleted)\n * row with the given primary key.\n */\n has(id: number): boolean {\n const row = this.rowIndex.lookup(id);\n if (row === undefined) return false;\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n return false;\n }\n return true;\n }\n\n /**\n * Iterate primary keys of live rows in insertion order.\n *\n * Matches `Map.prototype.keys()` shape.\n */\n *keys(): IterableIterator<number> {\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n yield pk;\n }\n }\n\n /**\n * Iterate live row values. Identical to `rows()` with default\n * options — provided under the TanStack DB-compatible name.\n */\n *values(): IterableIterator<RowValue> {\n for (const [, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n yield this.snapshotRow(row);\n }\n }\n\n /**\n * Iterate `[pk, row]` tuples for live rows.\n *\n * Matches `Map.prototype.entries()` shape.\n */\n *entries(): IterableIterator<[number, RowValue]> {\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n yield [pk, this.snapshotRow(row)];\n }\n }\n\n /**\n * Apply `callback(value, key, index)` to every live row. `index` is\n * the 0-based position in the live sequence (not the underlying row\n * slot).\n */\n forEach(\n callback: (value: RowValue, key: number, index: number) => void,\n ): void {\n let i = 0;\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n callback(this.snapshotRow(row), pk, i++);\n }\n }\n\n /**\n * Like `Array.prototype.map`, but over live rows. Returns a dense\n * array. Matches `@tanstack/db` CollectionImpl.map.\n */\n map<U>(callback: (value: RowValue, key: number, index: number) => U): U[] {\n const out: U[] = [];\n let i = 0;\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n out.push(callback(this.snapshotRow(row), pk, i++));\n }\n return out;\n }\n\n /**\n * Map of live rows keyed by primary key. Materialized lazily on\n * first access and cached until the next mutation bumps\n * `globalVersion`.\n *\n * Reading `.state` N times between mutations builds the map once.\n * Never use it if you only need to iterate — `values()` / `rows()`\n * stream without materializing the Map.\n */\n /**\n * Lazily materialized snapshot of the live-row state as a\n * `Map<PK, row>`. Matches `@tanstack/db`'s `Collection.state` both\n * in shape and in semantics: the returned Map IS the internal\n * cache, not a clone — mutating it is undefined behavior (same\n * caveat as upstream). The cache is invalidated on every write,\n * so a fresh Map materializes lazily on the next read.\n *\n * The `Map` return type is widened (vs `ReadonlyMap`) for\n * TanStack parity; prefer `values()` / `entries()` / `has()` /\n * `get()` for mutation-proof access.\n */\n get state(): Map<number, RowValue> {\n if (\n this._stateCache !== null &&\n this._stateCacheVersion === this._globalVersion\n ) {\n return this._stateCache;\n }\n const m = new Map<number, RowValue>();\n for (const [pk, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n m.set(pk, this.snapshotRow(row));\n }\n this._stateCache = m;\n this._stateCacheVersion = this._globalVersion;\n return m;\n }\n\n /**\n * Dense array of live rows in insertion order. Materialized lazily\n * on first access and cached until the next mutation bumps\n * `globalVersion`.\n *\n * Matches `@tanstack/db`'s `Collection.toArray` shape and\n * semantics: the returned array IS the cache — mutating it is\n * undefined behavior. Prefer `values()` / `rows()` for iteration.\n *\n * Repeated reads between mutations are O(1).\n */\n get toArray(): RowValue[] {\n if (\n this._toArrayCache !== null &&\n this._toArrayCacheVersion === this._globalVersion\n ) {\n return this._toArrayCache;\n }\n const arr: RowValue[] = [];\n for (const [, row] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, row)\n ) {\n continue;\n }\n arr.push(this.snapshotRow(row));\n }\n this._toArrayCache = arr;\n this._toArrayCacheVersion = this._globalVersion;\n return arr;\n }\n\n // ---------------------------------------------------------------------\n // Transactions / undo\n // ---------------------------------------------------------------------\n\n /** Take a mark; use with `rollback(mark)` to undo everything after. */\n beginTransaction(): number {\n return this.undo.mark();\n }\n\n /**\n * Roll back all mutations that happened at or after `mark`, newest-first.\n * Throws `UndoError` if the ring has wrapped past `mark`.\n */\n rollback(mark: number): void {\n const records = this.undo.drainSince(mark);\n const changes: ChangeMessage<RowValue, number>[] = [];\n for (const rec of records) {\n changes.push(this.rollbackRecordToChange(rec));\n this.applyInverse(rec.op, rec.rowId, rec.row, rec.prev, rec.snapshot);\n }\n if (records.length > 0) {\n // Coalesce into a single broad event plus decomposed TanStack changes.\n this.emitter.emit({\n op: 'rollback',\n rowId: records[0]!.rowId,\n columns: 'all',\n globalVersion: this._globalVersion,\n changes: changes.reverse(),\n });\n }\n }\n\n // ---------------------------------------------------------------------\n // Compaction\n // ---------------------------------------------------------------------\n\n /**\n * Compact the collection:\n * 1. Drop any soft-deleted rows (they remain in the segment as zombies\n * until compact runs).\n * 2. Re-pack remaining live rows into a dense [0, liveCount) row slot\n * range, preserving their relative order by existing row index.\n * 3. Rebuild utf8/binary values heaps, discarding bytes that are not\n * referenced by a live row (reclaims space leaked by prior updates).\n * 4. Invalidate the undo ring (old row indices become meaningless).\n * 5. Bump all column versions + emit a single 'compact' ChangeEvent so\n * reactive queries recompute.\n *\n * Returns `{ reclaimedRows, reclaimedHeapBytes }` for observability.\n */\n compact(): { reclaimedRows: number; reclaimedHeapBytes: number } {\n // 1. Gather live rows sorted by current row index so output order is\n // stable and matches existing iteration order.\n const live: Array<{ id: number; oldRow: number }> = [];\n for (const [id, oldRow] of this.rowIndex.entries()) {\n if (\n this.softDelete &&\n this.deletedColumn &&\n this.readBool(this.deletedColumn, oldRow)\n ) {\n continue;\n }\n live.push({ id, oldRow });\n }\n live.sort((a, b) => a.oldRow - b.oldRow);\n\n const liveCount = live.length;\n const reclaimedRows = this.rowCursor - liveCount;\n\n // 2. Enumerate every leaf-or-list column buffer that needs shuffling.\n // Struct columns contribute their field buffers (plus their own\n // parent validity); list columns contribute themselves (we\n // rebuild the child heap in step 5).\n const leafCols: ColumnBuffer[] = [];\n const collectLeaves = (col: ColumnBuffer): void => {\n if (col.column.typeCode === ColumnTypeCode.Struct) {\n // Struct parent has validity but no primary/values — only its\n // fields carry storage.\n for (const f of col.structFields ?? []) collectLeaves(f);\n } else {\n leafCols.push(col);\n }\n };\n for (const col of this.columnList) collectLeaves(col);\n\n // Prepare varlen scratch buffers (utf8 + binary only — list has its\n // own path below).\n const varlenCols = leafCols.filter(\n (c) =>\n c.column.typeCode === ColumnTypeCode.Utf8 ||\n c.column.typeCode === ColumnTypeCode.Binary,\n );\n const heapBytesBefore = new Map<ColumnBuffer, number>();\n const scratch = new Map<\n ColumnBuffer,\n { ranges: Int32Array; bytes: Uint8Array; used: number }\n >();\n for (const col of varlenCols) {\n heapBytesBefore.set(col, col.heap!.used);\n scratch.set(col, {\n ranges: new Int32Array(liveCount * 2),\n bytes: new Uint8Array(col.heap!.capacity),\n used: 0,\n });\n }\n\n // Prepare fresh child buffers for every list column. We build into\n // them as we shuffle, and swap them in after the pass completes.\n const listCols = leafCols.filter(\n (c) => c.column.typeCode === ColumnTypeCode.List,\n );\n const listScratch = new Map<\n ColumnBuffer,\n { ranges: Int32Array; child: ListChildState; childBytesBefore: number }\n >();\n for (const col of listCols) {\n const oldChild = col.list!;\n const childBytesBefore = oldChild.heap\n ? oldChild.heap.used\n : this.listChildTypedBytes(oldChild);\n listScratch.set(col, {\n ranges: new Int32Array(liveCount * 2),\n child: new ListChildState(\n oldChild.child,\n Math.max(16, oldChild.cursor),\n ),\n childBytesBefore,\n });\n }\n\n // Also need to shuffle validity bits of struct *parents* (their\n // field buffers are already in `leafCols`).\n const structParents: ColumnBuffer[] = this.columnList.filter(\n (c) =>\n c.column.typeCode === ColumnTypeCode.Struct && c.validity !== null,\n );\n\n // 3. Shuffle every leaf column into its new dense row slots.\n for (let newRow = 0; newRow < liveCount; newRow++) {\n const oldRow = live[newRow]!.oldRow;\n // Struct parent validity bits first.\n for (const sp of structParents) {\n const wasValid = getValidity(sp.validity!, oldRow);\n setValidity(sp.validity!, newRow, wasValid);\n }\n for (const col of leafCols) {\n const wasValid = col.validity ? getValidity(col.validity, oldRow) : true;\n if (col.validity) setValidity(col.validity, newRow, wasValid);\n\n const tc = col.column.typeCode;\n if (tc === ColumnTypeCode.Utf8 || tc === ColumnTypeCode.Binary) {\n const s = scratch.get(col)!;\n if (!wasValid) {\n s.ranges[newRow * 2] = 0;\n s.ranges[newRow * 2 + 1] = 0;\n continue;\n }\n const oldRanges = col.values as Int32Array;\n const start = oldRanges[oldRow * 2] ?? 0;\n const end = oldRanges[oldRow * 2 + 1] ?? 0;\n const len = end - start;\n if (len > 0) {\n col.heap!.copyInto(start, end, s.bytes, s.used);\n }\n s.ranges[newRow * 2] = s.used;\n s.ranges[newRow * 2 + 1] = s.used + len;\n s.used += len;\n } else if (tc === ColumnTypeCode.List) {\n const s = listScratch.get(col)!;\n if (!wasValid) {\n s.ranges[newRow * 2] = 0;\n s.ranges[newRow * 2 + 1] = 0;\n continue;\n }\n // Read list elements from the *old* child at the old range,\n // write them into the scratch child buffer.\n const oldRanges = col.values as Int32Array;\n const start = oldRanges[oldRow * 2] ?? 0;\n const end = oldRanges[oldRow * 2 + 1] ?? 0;\n const n = end - start;\n s.child.ensureCapacity(n);\n const writeCursorBefore = s.child.cursor;\n for (let i = 0; i < n; i++) {\n const v = this.readListElement(col.list!, start + i);\n this.writeListElement(s.child, writeCursorBefore + i, v);\n }\n s.child.cursor += n;\n s.ranges[newRow * 2] = writeCursorBefore;\n s.ranges[newRow * 2 + 1] = writeCursorBefore + n;\n } else if (tc === ColumnTypeCode.Point) {\n if (!wasValid) {\n col.point!.setNull(newRow);\n continue;\n }\n col.point!.copy(oldRow, newRow);\n } else if (tc === ColumnTypeCode.LineString) {\n if (!wasValid) {\n col.lineString!.setNull(newRow);\n continue;\n }\n col.lineString!.copy(oldRow, newRow);\n } else if (tc === ColumnTypeCode.Polygon) {\n if (!wasValid) {\n col.polygon!.setNull(newRow);\n continue;\n }\n col.polygon!.copy(oldRow, newRow);\n } else if (tc === ColumnTypeCode.Int64 || tc === ColumnTypeCode.UInt64) {\n const vals = col.values as BigInt64Array;\n vals[newRow] = vals[oldRow] ?? 0n;\n } else {\n type Small = Exclude<\n typeof col.values,\n BigInt64Array | BigUint64Array\n >;\n const vals = col.values as Small;\n vals[newRow] = vals[oldRow] ?? 0;\n }\n }\n }\n\n // 4. Clear trailing validity bits beyond the new dense range.\n for (const sp of structParents) {\n for (let r = liveCount; r < this.rowCursor; r++) {\n setValidity(sp.validity!, r, false);\n }\n }\n for (const col of leafCols) {\n if (col.validity) {\n for (let r = liveCount; r < this.rowCursor; r++) {\n setValidity(col.validity, r, false);\n }\n }\n }\n\n // 5. Commit scratch buffers (utf8/binary + list).\n let reclaimedHeapBytes = 0;\n for (const col of varlenCols) {\n const s = scratch.get(col)!;\n const destRanges = col.values as Int32Array;\n destRanges.set(s.ranges);\n destRanges.fill(0, liveCount * 2);\n col.heap!.rewrite(s.bytes, s.used);\n const before = heapBytesBefore.get(col)!;\n reclaimedHeapBytes += Math.max(0, before - s.used);\n }\n for (const col of listCols) {\n const s = listScratch.get(col)!;\n const destRanges = col.values as Int32Array;\n destRanges.set(s.ranges);\n destRanges.fill(0, liveCount * 2);\n const bytesAfter = s.child.heap\n ? s.child.heap.used\n : this.listChildTypedBytes(s.child);\n reclaimedHeapBytes += Math.max(0, s.childBytesBefore - bytesAfter);\n col.list = s.child;\n }\n\n // 6. Rebuild rowIndex + rowCursor.\n this.rowIndex.clear();\n for (let newRow = 0; newRow < liveCount; newRow++) {\n this.rowIndex.insert(live[newRow]!.id, newRow);\n }\n this.rowCursor = liveCount;\n this.rebuildIndexes();\n\n // 7. Invalidate undo ring; old row indices are stale.\n this.undo.clear();\n\n // 8. Bump all column versions + global version + emit.\n const bumpVersions = (col: ColumnBuffer): void => {\n col.version = (col.version + 1) >>> 0;\n if (col.structFields) {\n for (const f of col.structFields) bumpVersions(f);\n }\n };\n for (const col of this.columnList) bumpVersions(col);\n this.rebuildSpatialIndexes();\n this._globalVersion++;\n this.emitter.emit({\n op: 'compact',\n rowId: 0,\n columns: 'all',\n globalVersion: this._globalVersion,\n });\n\n return { reclaimedRows, reclaimedHeapBytes };\n }\n\n _internalConfirmSyncedMutations(\n mutations: Array<PendingMutation<RowValue>>,\n ): void {\n for (const mutation of mutations) {\n if (mutation.type !== 'update') continue;\n const key = Number(mutation.key);\n const row = this.rowIndex.lookup(key);\n if (row === undefined) continue;\n const value = this.snapshotRow(row);\n this._globalVersion++;\n this.emitter.emit({\n op: 'update',\n rowId: key,\n columns: 'all',\n globalVersion: this._globalVersion,\n value,\n previousValue: value,\n });\n }\n }\n\n private rollbackRecordToChange(\n rec: UndoRecord,\n ): ChangeMessage<RowValue, number> {\n if (rec.op === 'insert') {\n return {\n key: rec.rowId,\n value: this.snapshotRow(rec.row),\n type: 'delete',\n };\n }\n if (rec.op === 'update') {\n const beforeRollback = this.snapshotRow(rec.row);\n return {\n key: rec.rowId,\n value: { ...beforeRollback, ...rec.prev } as RowValue,\n previousValue: beforeRollback,\n type: 'update',\n };\n }\n return {\n key: rec.rowId,\n value: (rec.snapshot ?? { ...this.snapshotRow(rec.row), ...rec.prev }) as RowValue,\n type: 'insert',\n };\n }\n\n private applyInverse(\n op: UndoOp,\n id: number,\n row: number,\n prev: Readonly<Record<string, unknown>>,\n snapshot?: Readonly<Record<string, unknown>>,\n ): void {\n switch (op) {\n case 'insert': {\n // Undo insert → remove from index. Row slot stays (leaked in Phase 1).\n this.removeFromIndexes(id, this.snapshotRow(row));\n this.markSpatialRowDeleted(row);\n this.rowIndex.remove(id);\n // Do NOT decrement rowCursor: safer for concurrent readers even\n // though Phase 1 is single-threaded.\n for (const col of this.columnList) col.version = (col.version + 1) >>> 0;\n this._globalVersion++;\n return;\n }\n case 'update': {\n const before = this.snapshotRow(row);\n const touched = new Set<string>();\n for (const [name, value] of Object.entries(prev)) {\n const col = this.columns.get(name)!;\n this.writeCell(col, row, value as RowValue[string]);\n col.version = (col.version + 1) >>> 0;\n touched.add(name);\n }\n this.markSpatialRowDirty(row, touched);\n this.updateIndexes(id, before, this.snapshotRow(row));\n this._globalVersion++;\n return;\n }\n case 'delete': {\n if (this.softDelete && this.deletedColumn) {\n const was = (prev.__deleted as boolean | null | undefined) ?? false;\n this.writeCell(this.deletedColumn, row, was);\n this.deletedColumn.version = (this.deletedColumn.version + 1) >>> 0;\n } else if (snapshot) {\n // Re-insert the prior snapshot into its original row slot.\n for (const col of this.columnList) {\n const v = snapshot[col.column.name];\n if (v !== undefined) {\n this.writeCell(col, row, v as RowValue[string]);\n col.version = (col.version + 1) >>> 0;\n }\n }\n this.rowIndex.insert(id, row);\n }\n this.markSpatialRowDirty(row);\n this.addToIndexes(id, this.snapshotRow(row));\n this._globalVersion++;\n return;\n }\n }\n }\n\n private initializeSpatialIndexes(config?: SpatialIndexConfig): void {\n if (config === undefined) return;\n const configs = Array.isArray(config) ? config : [config];\n for (const spatial of configs) {\n if (spatial.type !== 'rtree') {\n throw new ValidationError(`unsupported spatial index type \"${spatial.type}\"`);\n }\n const col = this.columns.get(spatial.column);\n if (!col) throw new ValidationError(`unknown spatial index column \"${spatial.column}\"`);\n const bboxCache = this.spatialBboxCache(col);\n if (bboxCache === null) {\n throw new ValidationError(\n `spatial index column \"${spatial.column}\" must be a point, linestring, or polygon column`,\n );\n }\n const rowOrdinals: number[] = [];\n for (const row of this.liveRowOrdinalsForSpatialIndex()) rowOrdinals.push(row);\n this._spatialIndexes.set(\n spatial.column,\n buildSpatialIndex(Uint32Array.from(rowOrdinals), bboxCache),\n );\n }\n }\n\n private spatialBboxCache(col: ColumnBuffer): Float64Array | null {\n return col.point?.bboxCache ?? col.lineString?.bboxCache ?? col.polygon?.bboxCache ?? null;\n }\n\n private *liveRowOrdinalsForSpatialIndex(): IterableIterator<number> {\n const del = this.deletedColumn;\n const soft = this.softDelete;\n for (const [, row] of this.rowIndex.entries()) {\n if (soft && del && this.readBool(del, row)) continue;\n yield row;\n }\n }\n\n private markSpatialRowDirty(\n row: number,\n touchedColumns?: ReadonlySet<string> | 'all',\n ): void {\n if (this._spatialIndexes.size === 0) return;\n const isDeleted =\n this.softDelete &&\n this.deletedColumn !== null &&\n this.readBool(this.deletedColumn, row);\n for (const [column, state] of this._spatialIndexes) {\n if (\n touchedColumns !== undefined &&\n touchedColumns !== 'all' &&\n !touchedColumns.has(column) &&\n !(this.deletedColumn && touchedColumns.has(this.deletedColumn.column.name))\n ) {\n continue;\n }\n if (isDeleted) {\n state.deletedRows.add(row);\n state.dirtyRows.delete(row);\n } else {\n state.deletedRows.delete(row);\n state.dirtyRows.add(row);\n const col = this.columns.get(column);\n const bboxCache = col ? this.spatialBboxCache(col) : null;\n if (bboxCache !== null && state.dirtyRows.size >= 1_024) {\n flushSpatialIndexDirty(state, bboxCache);\n if (state.segments.length >= 64) {\n this.rebuildSpatialIndexColumn(column, state, bboxCache);\n }\n }\n }\n }\n }\n\n private markSpatialRowDeleted(row: number): void {\n for (const state of this._spatialIndexes.values()) {\n state.deletedRows.add(row);\n state.dirtyRows.delete(row);\n }\n }\n\n private rebuildSpatialIndexes(): void {\n for (const [column, state] of this._spatialIndexes) {\n const col = this.columns.get(column);\n const bboxCache = col ? this.spatialBboxCache(col) : null;\n if (bboxCache === null) continue;\n this.rebuildSpatialIndexColumn(column, state, bboxCache);\n }\n }\n\n private rebuildSpatialIndexColumn(\n column: string,\n state: SpatialIndexState,\n bboxCache: Float64Array,\n ): SpatialIndexState {\n const rowOrdinals = Uint32Array.from(this.liveRowOrdinalsForSpatialIndex());\n const rebuilt = buildSpatialIndex(rowOrdinals, bboxCache, {\n indexVersion: state.indexVersion + 1,\n bboxCacheVersion: state.bboxCacheVersion + 1,\n });\n this._spatialIndexes.set(column, rebuilt);\n return rebuilt;\n }\n\n private addToIndexes(id: number, row: RowValue): void {\n if (this.isSoftDeletedValue(row)) return;\n for (const index of this._indexes.values()) index.add(id, row);\n }\n\n private removeFromIndexes(id: number, row: RowValue): void {\n if (this.isSoftDeletedValue(row)) return;\n for (const index of this._indexes.values()) index.remove(id, row);\n }\n\n private updateIndexes(id: number, before: RowValue, after: RowValue): void {\n const wasIndexed = !this.isSoftDeletedValue(before);\n const isIndexed = !this.isSoftDeletedValue(after);\n for (const index of this._indexes.values()) {\n if (wasIndexed && isIndexed) index.update(id, before, after);\n else if (wasIndexed) index.remove(id, before);\n else if (isIndexed) index.add(id, after);\n }\n }\n\n private rebuildIndexes(): void {\n for (const index of this._indexes.values()) index.build(this.entries());\n }\n\n private isSoftDeletedValue(row: RowValue): boolean {\n return this.softDelete && row.__deleted === true;\n }\n\n // ---------------------------------------------------------------------\n // Low-level cell I/O\n // ---------------------------------------------------------------------\n\n private writeCell(col: ColumnBuffer, row: number, value: unknown): void {\n if (value === null || value === undefined) {\n if (!col.column.nullable) {\n throw new ValidationError(\n `column \"${col.column.name}\" is not nullable`,\n );\n }\n setValidity(col.validity!, row, false);\n if (col.column.typeCode === ColumnTypeCode.Point) col.point!.setNull(row);\n if (col.column.typeCode === ColumnTypeCode.LineString) {\n col.lineString!.setNull(row);\n }\n if (col.column.typeCode === ColumnTypeCode.Polygon) {\n col.polygon!.setNull(row);\n }\n return;\n }\n if (col.validity) setValidity(col.validity, row, true);\n\n const code = col.column.typeCode;\n if (code === ColumnTypeCode.Utf8) {\n if (typeof value !== 'string') {\n throw new ValidationError(\n `column \"${col.column.name}\" expects string, got ${typeof value}`,\n );\n }\n const range = col.heap!.append(value);\n const ranges = col.values as Int32Array;\n ranges[row * 2] = range.start;\n ranges[row * 2 + 1] = range.end;\n return;\n }\n if (code === ColumnTypeCode.Binary) {\n if (!(value instanceof Uint8Array)) {\n throw new ValidationError(\n `column \"${col.column.name}\" expects Uint8Array, got ${typeof value}`,\n );\n }\n const range = col.heap!.appendBytes(value);\n const ranges = col.values as Int32Array;\n ranges[row * 2] = range.start;\n ranges[row * 2 + 1] = range.end;\n return;\n }\n if (code === ColumnTypeCode.DictUtf8) {\n if (typeof value !== 'string') {\n throw new ValidationError(\n `column \"${col.column.name}\" expects string, got ${typeof value}`,\n );\n }\n const codeVal = col.dictionary!.intern(value);\n (col.values as Uint32Array)[row] = codeVal;\n return;\n }\n if (code === ColumnTypeCode.List) {\n if (!Array.isArray(value)) {\n throw new ValidationError(\n `column \"${col.column.name}\" expects an array, got ${typeof value}`,\n );\n }\n this.writeListCell(col, row, value as readonly unknown[]);\n return;\n }\n if (code === ColumnTypeCode.Struct) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ValidationError(\n `column \"${col.column.name}\" expects an object, got ${typeof value}`,\n );\n }\n this.writeStructCell(col, row, value as Record<string, unknown>);\n return;\n }\n if (code === ColumnTypeCode.Point) {\n col.point!.set(row, value as Point);\n return;\n }\n if (code === ColumnTypeCode.LineString) {\n col.lineString!.set(row, value as LineString);\n return;\n }\n if (code === ColumnTypeCode.Polygon) {\n col.polygon!.set(row, value as Polygon);\n return;\n }\n if (code === ColumnTypeCode.Bool) {\n // Phase 1 stores bool as u8 (0/1). Packed bitmap can come later.\n const v = value === true ? 1 : value === false ? 0 : this.coerceBoolNumber(value, col.column.name);\n (col.values as Uint8Array)[row] = v;\n return;\n }\n if (code === ColumnTypeCode.Int64 || code === ColumnTypeCode.UInt64) {\n if (typeof value === 'bigint') {\n (col.values as BigInt64Array)[row] = value;\n } else if (typeof value === 'number' && Number.isInteger(value)) {\n (col.values as BigInt64Array)[row] = BigInt(value);\n } else {\n throw new ValidationError(\n `column \"${col.column.name}\" expects bigint, got ${typeof value}`,\n );\n }\n return;\n }\n if (typeof value !== 'number') {\n throw new ValidationError(\n `column \"${col.column.name}\" expects number, got ${typeof value}`,\n );\n }\n (col.values as Exclude<TypedValueArray, BigInt64Array | BigUint64Array>)[row] = value;\n }\n\n private readCell(col: ColumnBuffer, row: number): RowValue[string] {\n if (col.validity && !getValidity(col.validity, row)) return null;\n const code = col.column.typeCode;\n if (code === ColumnTypeCode.Utf8) {\n const ranges = col.values as Int32Array;\n const start = ranges[row * 2] ?? 0;\n const end = ranges[row * 2 + 1] ?? 0;\n return col.heap!.read(start, end);\n }\n if (code === ColumnTypeCode.Binary) {\n const ranges = col.values as Int32Array;\n const start = ranges[row * 2] ?? 0;\n const end = ranges[row * 2 + 1] ?? 0;\n return col.heap!.readBytes(start, end);\n }\n if (code === ColumnTypeCode.DictUtf8) {\n const codeVal = (col.values as Uint32Array)[row] ?? 0;\n return col.dictionary!.decode(codeVal);\n }\n if (code === ColumnTypeCode.List) {\n return this.readListCell(col, row);\n }\n if (code === ColumnTypeCode.Struct) {\n return this.readStructCell(col, row);\n }\n if (code === ColumnTypeCode.Point) {\n return col.point!.get(row);\n }\n if (code === ColumnTypeCode.LineString) {\n return col.lineString!.get(row);\n }\n if (code === ColumnTypeCode.Polygon) {\n return col.polygon!.get(row);\n }\n if (code === ColumnTypeCode.Bool) {\n return ((col.values as Uint8Array)[row] ?? 0) !== 0;\n }\n if (code === ColumnTypeCode.Int64 || code === ColumnTypeCode.UInt64) {\n return (col.values as BigInt64Array)[row] ?? 0n;\n }\n return (col.values as Exclude<TypedValueArray, BigInt64Array | BigUint64Array>)[row] ?? 0;\n }\n\n private readBool(col: ColumnBuffer, row: number): boolean {\n if (col.column.typeCode !== ColumnTypeCode.Bool) {\n throw new ValidationError(`column \"${col.column.name}\" is not bool`);\n }\n if (col.validity && !getValidity(col.validity, row)) return false;\n return ((col.values as Uint8Array)[row] ?? 0) !== 0;\n }\n\n // -------------------- List cell I/O --------------------\n\n private writeListCell(\n col: ColumnBuffer,\n row: number,\n value: readonly unknown[],\n ): void {\n const listState = col.list!;\n const n = value.length;\n listState.ensureCapacity(n);\n const startElement = listState.cursor;\n for (let i = 0; i < n; i++) {\n this.writeListElement(listState, startElement + i, value[i]);\n }\n listState.cursor += n;\n listState.version = (listState.version + 1) >>> 0;\n const ranges = col.values as Int32Array;\n ranges[row * 2] = startElement;\n ranges[row * 2 + 1] = startElement + n;\n }\n\n private writeListElement(\n state: ListChildState,\n element: number,\n value: unknown,\n ): void {\n const code = state.child.typeCode;\n if (value === null || value === undefined) {\n if (!state.child.nullable) {\n throw new ValidationError(\n `list child \"${state.child.name}\" does not allow null elements`,\n );\n }\n setValidity(state.validity!, element, false);\n // Leave slot bytes untouched; readers short-circuit on validity.\n return;\n }\n if (state.validity) setValidity(state.validity, element, true);\n\n if (code === ColumnTypeCode.Utf8) {\n if (typeof value !== 'string') {\n throw new ValidationError(\n `list<utf8> element expects string, got ${typeof value}`,\n );\n }\n const range = state.heap!.append(value);\n const ranges = state.values as Int32Array;\n ranges[element * 2] = range.start;\n ranges[element * 2 + 1] = range.end;\n return;\n }\n if (code === ColumnTypeCode.Binary) {\n if (!(value instanceof Uint8Array)) {\n throw new ValidationError(\n `list<binary> element expects Uint8Array`,\n );\n }\n const range = state.heap!.appendBytes(value);\n const ranges = state.values as Int32Array;\n ranges[element * 2] = range.start;\n ranges[element * 2 + 1] = range.end;\n return;\n }\n if (code === ColumnTypeCode.DictUtf8) {\n if (typeof value !== 'string') {\n throw new ValidationError(\n `list<dict_utf8> element expects string, got ${typeof value}`,\n );\n }\n (state.values as Uint32Array)[element] = state.dictionary!.intern(value);\n return;\n }\n if (code === ColumnTypeCode.Bool) {\n const v =\n value === true ? 1 : value === false ? 0 : this.coerceBoolNumber(value, state.child.name);\n (state.values as Uint8Array)[element] = v;\n return;\n }\n if (code === ColumnTypeCode.Int64 || code === ColumnTypeCode.UInt64) {\n if (typeof value === 'bigint') {\n (state.values as BigInt64Array)[element] = value;\n } else if (typeof value === 'number' && Number.isInteger(value)) {\n (state.values as BigInt64Array)[element] = BigInt(value);\n } else {\n throw new ValidationError(\n `list<${state.child.type}> element expects bigint`,\n );\n }\n return;\n }\n if (typeof value !== 'number') {\n throw new ValidationError(\n `list<${state.child.type}> element expects number, got ${typeof value}`,\n );\n }\n (state.values as Exclude<ListChildState['values'], BigInt64Array | BigUint64Array>)[\n element\n ] = value;\n }\n\n private readListCell(col: ColumnBuffer, row: number): readonly unknown[] {\n const ranges = col.values as Int32Array;\n const start = ranges[row * 2] ?? 0;\n const end = ranges[row * 2 + 1] ?? 0;\n const state = col.list!;\n const n = end - start;\n const out = new Array<unknown>(n);\n for (let i = 0; i < n; i++) {\n out[i] = this.readListElement(state, start + i);\n }\n return out;\n }\n\n private listChildTypedBytes(state: ListChildState): number {\n // Approximate byte size of the child's currently-used primary slots,\n // ignoring the heap (counted separately). For utf8/binary children\n // the typed array is Int32Array of range pairs → cursor * 8 bytes;\n // otherwise cursor * element byte width.\n const code = state.child.typeCode;\n const perElement =\n code === ColumnTypeCode.Utf8 || code === ColumnTypeCode.Binary\n ? 8\n : state.child.byteWidth;\n return state.cursor * perElement;\n }\n\n private readListElement(state: ListChildState, element: number): unknown {\n if (state.validity && !getValidity(state.validity, element)) return null;\n const code = state.child.typeCode;\n if (code === ColumnTypeCode.Utf8) {\n const ranges = state.values as Int32Array;\n const s = ranges[element * 2] ?? 0;\n const e = ranges[element * 2 + 1] ?? 0;\n return state.heap!.read(s, e);\n }\n if (code === ColumnTypeCode.Binary) {\n const ranges = state.values as Int32Array;\n const s = ranges[element * 2] ?? 0;\n const e = ranges[element * 2 + 1] ?? 0;\n return state.heap!.readBytes(s, e);\n }\n if (code === ColumnTypeCode.DictUtf8) {\n return state.dictionary!.decode((state.values as Uint32Array)[element] ?? 0);\n }\n if (code === ColumnTypeCode.Bool) {\n return ((state.values as Uint8Array)[element] ?? 0) !== 0;\n }\n if (code === ColumnTypeCode.Int64 || code === ColumnTypeCode.UInt64) {\n return (state.values as BigInt64Array)[element] ?? 0n;\n }\n return (state.values as Exclude<ListChildState['values'], BigInt64Array | BigUint64Array>)[element] ?? 0;\n }\n\n // -------------------- Struct cell I/O --------------------\n\n private writeStructCell(\n col: ColumnBuffer,\n row: number,\n value: Record<string, unknown>,\n ): void {\n const fields = col.structFieldsByName!;\n // Enforce shape: every declared field must be present; unknown\n // fields are rejected so typos surface early. Nulls are fine when\n // the field is nullable.\n for (const [key] of Object.entries(value)) {\n if (!fields.has(key)) {\n throw new ValidationError(\n `unknown field \"${key}\" in struct \"${col.column.name}\"`,\n );\n }\n }\n for (const [name, fb] of fields) {\n const v = value[name];\n if (v === undefined) {\n if (!fb.column.nullable) {\n throw new ValidationError(\n `struct \"${col.column.name}\" field \"${name}\" is required`,\n );\n }\n this.writeCell(fb, row, null);\n } else {\n this.writeCell(fb, row, v as RowValue[string]);\n }\n fb.version = (fb.version + 1) >>> 0;\n }\n }\n\n private readStructCell(col: ColumnBuffer, row: number): Record<string, unknown> {\n const fields = col.structFieldsByName!;\n const out: Record<string, unknown> = {};\n for (const [name, fb] of fields) {\n out[name] = this.readCell(fb, row);\n }\n return out;\n }\n\n private snapshotRow(row: number): RowValue {\n const out: RowValue = {};\n for (const col of this.columnList) {\n out[col.column.name] = this.readCell(col, row);\n }\n return out;\n }\n\n private coerceUint32(value: unknown, field: string): number {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0 || value > 0xffffffff) {\n throw new ValidationError(`\"${field}\" must be a uint32, got ${String(value)}`);\n }\n return value >>> 0;\n }\n\n private coerceBoolNumber(value: unknown, field: string): number {\n if (typeof value === 'number' && (value === 0 || value === 1)) return value;\n throw new ValidationError(`\"${field}\" expects boolean, got ${String(value)}`);\n }\n}\n\n// -----------------------------------------------------------------------\n// helpers\n// -----------------------------------------------------------------------\n\nfunction bitmapBytes(capacity: number): number {\n return (capacity + 7) >>> 3;\n}\n\n/**\n * Return a freshly-allocated `Uint8Array` copy of the used region of a\n * column's primary buffer. Fixed-width: `rowCursor * byteWidth`.\n * Utf8/Binary/List/LineString/Polygon: `rowCursor * 8` (2 i32 offsets per row).\n * Dict_utf8: `rowCursor * 4`.\n */\nfunction extractPrimaryBytes(\n col: ColumnBuffer,\n rowCursor: number,\n): Uint8Array {\n const tc = col.column.typeCode;\n if (tc === ColumnTypeCode.Struct) return new Uint8Array(0);\n let byteLength: number;\n if (\n tc === ColumnTypeCode.Utf8 ||\n tc === ColumnTypeCode.Binary ||\n tc === ColumnTypeCode.List ||\n tc === ColumnTypeCode.LineString ||\n tc === ColumnTypeCode.Polygon\n ) {\n byteLength = rowCursor * 8;\n } else {\n byteLength = rowCursor * col.column.byteWidth;\n }\n const values = col.values;\n const src = new Uint8Array(values.buffer, values.byteOffset, values.byteLength);\n return src.slice(0, byteLength);\n}\n\n/**\n * Build a TreeView for a list column's child. The child lives in JS\n * heap (ListChildState) and its typed-array is used up to `cursor`\n * elements. For utf8/binary child the typed-array length counts\n * ranged-offset pairs (×2 per element); for other child types it is\n * one slot per element. We slice the underlying bytes accordingly.\n */\nfunction buildListChildTreeView(\n parentName: string,\n state: ListChildState,\n): TreeView {\n const child = state.child;\n const tc = child.typeCode;\n const elementCount = state.cursor;\n const perElement =\n tc === ColumnTypeCode.Utf8 || tc === ColumnTypeCode.Binary ? 8 : child.byteWidth;\n const primaryBytes = elementCount * perElement;\n const src = new Uint8Array(\n state.values.buffer,\n state.values.byteOffset,\n state.values.byteLength,\n );\n const primary = src.slice(0, primaryBytes);\n const validity = state.validity\n ? state.validity.slice(0, (elementCount + 7) >>> 3)\n : null;\n const heap = state.heap ? state.heap.rawBytes.slice(0, state.heap.used) : null;\n const dictionaryEntries = state.dictionary\n ? [...state.dictionary.entries()].map(([, s]) => s)\n : null;\n return {\n name: `${parentName}.items`,\n type: child.type,\n typeCode: tc,\n nullable: child.nullable,\n validity,\n primaryBuffer: primary,\n heap,\n dictionaryEntries,\n };\n}\n\nfunction setValidity(bitmap: Uint8Array, row: number, valid: boolean): void {\n const byte = row >>> 3;\n const bit = 1 << (row & 7);\n const cur = bitmap[byte] ?? 0;\n bitmap[byte] = valid ? (cur | bit) & 0xff : (cur & ~bit) & 0xff;\n}\n\nfunction getValidity(bitmap: Uint8Array, row: number): boolean {\n const byte = row >>> 3;\n const bit = 1 << (row & 7);\n return ((bitmap[byte] ?? 0) & bit) !== 0;\n}\n\nfunction createTypedView(\n code: ColumnTypeCode,\n buffer: ArrayBufferLike,\n byteOffset: number,\n length: number,\n): TypedValueArray {\n switch (code) {\n case ColumnTypeCode.Bool:\n case ColumnTypeCode.UInt8:\n return new Uint8Array(buffer, byteOffset, length);\n case ColumnTypeCode.Int8:\n return new Int8Array(buffer, byteOffset, length);\n case ColumnTypeCode.Int16:\n return new Int16Array(buffer, byteOffset, length);\n case ColumnTypeCode.UInt16:\n return new Uint16Array(buffer, byteOffset, length);\n case ColumnTypeCode.Int32:\n return new Int32Array(buffer, byteOffset, length);\n case ColumnTypeCode.UInt32:\n return new Uint32Array(buffer, byteOffset, length);\n case ColumnTypeCode.Float32:\n return new Float32Array(buffer, byteOffset, length);\n case ColumnTypeCode.Float64:\n return new Float64Array(buffer, byteOffset, length);\n case ColumnTypeCode.Int64:\n return new BigInt64Array(buffer, byteOffset, length);\n case ColumnTypeCode.UInt64:\n return new BigUint64Array(buffer, byteOffset, length);\n case ColumnTypeCode.Utf8:\n case ColumnTypeCode.Binary:\n case ColumnTypeCode.DictUtf8:\n case ColumnTypeCode.List:\n case ColumnTypeCode.Struct:\n case ColumnTypeCode.Point:\n case ColumnTypeCode.LineString:\n case ColumnTypeCode.Polygon:\n // These types go through dedicated allocation paths in Collection.create\n // and never flow through createTypedView.\n throw new Error(`createTypedView called with non-primitive code ${code}`);\n }\n}\n\n// Re-export type for public API consumers.\nexport type { ColumnTypeName };\n","import { SchemaError } from '../errors.js';\nimport {\n type ColumnTypeName,\n type ColumnTypeCode,\n TYPE_NAME_TO_CODE,\n byteWidthOf,\n isVariableWidth,\n isListType,\n isStructType,\n isLeafType,\n isGeoType,\n ColumnTypeCode as TypeCode,\n} from './types.js';\n\n/** User-facing column definition. */\nexport interface ColumnDef {\n type: ColumnTypeName;\n /** If false (default), nulls are not allowed and no validity bitmap is kept. */\n nullable?: boolean;\n /**\n * For `utf8`/`binary` columns: total bytes reserved for the values\n * heap. For `list<utf8>`/`list<binary>` columns: bytes reserved for\n * the **child** heap. Defaults to `32 * capacity` otherwise.\n */\n valuesHeapBytes?: number;\n /** Required when `type === 'list'`. The child element type. */\n items?: ColumnDef;\n /** Required when `type === 'struct'`. Map of field name → def. */\n fields?: Record<string, ColumnDef>;\n /** For polygon columns: append first point when a ring is open. */\n autoCloseRings?: boolean;\n}\n\n/** User-facing schema definition input. */\nexport interface SchemaInput {\n name: string;\n /**\n * Primary key must be a `uint32` column in Phase 1. Defaults to `__id`\n * if present.\n */\n primaryKey?: string;\n columns: Record<string, ColumnDef>;\n}\n\n/** Compiled, immutable schema describing a collection's columns. */\nexport interface CompiledColumn {\n readonly name: string;\n readonly index: number;\n readonly type: ColumnTypeName;\n readonly typeCode: ColumnTypeCode;\n /**\n * For fixed-width columns: byte width of a single element.\n * For Utf8/Binary: byte width of the offsets-array element (i32 = 4).\n * For DictUtf8: byte width of a code (u32 = 4).\n * For List: byte width of the offsets-array element (i32 = 4).\n * For Struct: 0 (no primary buffer — fields carry the storage).\n */\n readonly byteWidth: number;\n readonly nullable: boolean;\n /**\n * For utf8/binary columns: total bytes reserved in the values heap.\n * For list<utf8>/list<binary> columns: bytes reserved for the child heap.\n * Undefined uses the default (32 bytes per row).\n */\n readonly valuesHeapBytes: number | undefined;\n /**\n * For List columns: the compiled child element column. `index === -1`\n * on the child to signal \"this is not a top-level column\". Its\n * `byteWidth` drives child-array allocation. Child is always a leaf\n * type (primitive, utf8, dict_utf8, binary, or bool) in v1.\n */\n readonly childColumn?: CompiledColumn;\n /**\n * For Struct columns: child field columns in declaration order. Each\n * field column has `index` ≥ 0 but is *not* present in the top-level\n * `columns` array of the parent schema — fields live only on their\n * struct parent. Nested structs and list-fields are rejected in v1.\n */\n readonly fields?: readonly CompiledColumn[];\n readonly fieldsByName?: ReadonlyMap<string, CompiledColumn>;\n /** Polygon-only storage option. */\n readonly autoCloseRings?: boolean;\n}\n\nexport interface CompiledSchema {\n readonly name: string;\n readonly primaryKey: string;\n readonly primaryKeyIndex: number;\n readonly columns: readonly CompiledColumn[];\n readonly columnsByName: ReadonlyMap<string, CompiledColumn>;\n readonly fingerprint: bigint;\n}\n\nconst DEFAULT_PK = '__id';\n\n/**\n * Compile a user schema into the immutable layout used by allocators and\n * collections. Validates:\n * - non-empty column set\n * - no duplicate names\n * - PK exists and has type uint32 (Phase 1 constraint)\n * - all column types are supported\n */\nexport function defineSchema(input: SchemaInput): CompiledSchema {\n if (!input.name || input.name.length === 0) {\n throw new SchemaError('schema.name is required');\n }\n\n const entries = Object.entries(input.columns);\n if (entries.length === 0) {\n throw new SchemaError(`schema \"${input.name}\" must declare at least one column`);\n }\n\n const seen = new Set<string>();\n const columns: CompiledColumn[] = [];\n for (let i = 0; i < entries.length; i++) {\n const [name, def] = entries[i]!;\n if (seen.has(name)) {\n throw new SchemaError(`duplicate column \"${name}\"`);\n }\n seen.add(name);\n const compiled = compileColumn(name, def, i, {\n allowList: true,\n allowStruct: true,\n isChild: false,\n });\n columns.push(compiled);\n }\n\n const pkName = input.primaryKey ?? DEFAULT_PK;\n const pk = columns.find((c) => c.name === pkName);\n if (!pk) {\n throw new SchemaError(\n `primary key column \"${pkName}\" is not declared on schema \"${input.name}\"`,\n );\n }\n if (pk.type !== 'uint32') {\n throw new SchemaError(\n `Phase 1 only supports uint32 primary keys; \"${pk.name}\" is ${pk.type}`,\n );\n }\n if (pk.nullable) {\n throw new SchemaError(`primary key \"${pk.name}\" cannot be nullable`);\n }\n\n const fingerprint = computeFingerprint(input.name, columns);\n\n return {\n name: input.name,\n primaryKey: pk.name,\n primaryKeyIndex: pk.index,\n columns,\n columnsByName: new Map(columns.map((c) => [c.name, c])),\n fingerprint,\n };\n}\n\n/**\n * Deterministic 64-bit fingerprint over `(name, [(colName, typeCode,\n * nullable)...])`. Not cryptographic; used only to detect cross-segment\n * schema mismatch.\n */\nfunction computeFingerprint(\n name: string,\n columns: readonly CompiledColumn[],\n): bigint {\n // FNV-1a 64-bit\n let h = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n const mask = 0xffffffffffffffffn;\n\n const mix = (s: string): void => {\n for (let i = 0; i < s.length; i++) {\n h = ((h ^ BigInt(s.charCodeAt(i))) * prime) & mask;\n }\n h = ((h ^ 0xffn) * prime) & mask; // field separator\n };\n\n const mixColumn = (c: CompiledColumn): void => {\n mix(c.name);\n h = ((h ^ BigInt(c.typeCode)) * prime) & mask;\n h = ((h ^ (c.nullable ? 1n : 0n)) * prime) & mask;\n if (c.autoCloseRings) h = ((h ^ 1n) * prime) & mask;\n if (c.childColumn) mixColumn(c.childColumn);\n if (c.fields) {\n for (const f of c.fields) mixColumn(f);\n }\n };\n\n mix(name);\n for (const c of columns) mixColumn(c);\n return h;\n}\n\ninterface CompileCtx {\n allowList: boolean;\n allowStruct: boolean;\n isChild: boolean;\n}\n\nfunction compileColumn(\n name: string,\n def: ColumnDef,\n index: number,\n ctx: CompileCtx,\n): CompiledColumn {\n const typeCode = TYPE_NAME_TO_CODE[def.type];\n if (typeCode === undefined) {\n throw new SchemaError(`unknown column type \"${def.type}\" on \"${name}\"`);\n }\n\n // Validate nested type restrictions.\n if (ctx.isChild && isGeoType(typeCode)) {\n throw new SchemaError(\n `geo columns cannot be nested inside list/struct (column \"${name}\")`,\n );\n }\n if (isListType(typeCode) && !ctx.allowList) {\n throw new SchemaError(\n `list columns cannot be nested inside another list/struct (column \"${name}\")`,\n );\n }\n if (isStructType(typeCode) && !ctx.allowStruct) {\n throw new SchemaError(\n `struct columns cannot be nested inside another list/struct (column \"${name}\")`,\n );\n }\n\n // valuesHeapBytes validation.\n if (def.autoCloseRings !== undefined) {\n if (typeCode !== TypeCode.Polygon) {\n throw new SchemaError(\n `autoCloseRings is only valid on polygon columns; \"${name}\" is ${def.type}`,\n );\n }\n if (typeof def.autoCloseRings !== 'boolean') {\n throw new SchemaError(`autoCloseRings on \"${name}\" must be boolean`);\n }\n }\n\n if (def.valuesHeapBytes !== undefined) {\n const valid =\n isVariableWidth(typeCode) ||\n // list<utf8|binary> — heap lives on the child.\n (isListType(typeCode) &&\n def.items !== undefined &&\n isVariableWidth(TYPE_NAME_TO_CODE[def.items.type]!));\n if (!valid) {\n throw new SchemaError(\n `valuesHeapBytes is only valid on utf8/binary columns or list<utf8|binary>; \"${name}\" is ${def.type}`,\n );\n }\n if (!Number.isInteger(def.valuesHeapBytes) || def.valuesHeapBytes <= 0) {\n throw new SchemaError(\n `valuesHeapBytes on \"${name}\" must be a positive integer`,\n );\n }\n }\n\n let childColumn: CompiledColumn | undefined;\n let fields: readonly CompiledColumn[] | undefined;\n let fieldsByName: ReadonlyMap<string, CompiledColumn> | undefined;\n\n if (isListType(typeCode)) {\n if (!def.items) {\n throw new SchemaError(`list column \"${name}\" requires an \"items\" type`);\n }\n const childCode = TYPE_NAME_TO_CODE[def.items.type];\n if (childCode === undefined) {\n throw new SchemaError(\n `unknown list item type \"${def.items.type}\" on \"${name}\"`,\n );\n }\n if (isGeoType(childCode)) {\n throw new SchemaError(\n `geo columns cannot be nested inside list/struct (column \"${name}.items\")`,\n );\n }\n if (!isLeafType(childCode)) {\n throw new SchemaError(\n `list items must be a leaf type (primitive only; no nested list/struct/geo); \"${name}.items\" is ${def.items.type}`,\n );\n }\n // Child values heap lives on the list column, not the items def —\n // forward the parent's heap sizing when items is utf8/binary.\n const heap = def.valuesHeapBytes ?? def.items.valuesHeapBytes;\n const childDef: ColumnDef = {\n ...def.items,\n ...(heap !== undefined ? { valuesHeapBytes: heap } : {}),\n };\n childColumn = compileColumn(`${name}.items`, childDef, -1, {\n allowList: false,\n allowStruct: false,\n isChild: true,\n });\n } else if (isStructType(typeCode)) {\n if (!def.fields || Object.keys(def.fields).length === 0) {\n throw new SchemaError(\n `struct column \"${name}\" requires a non-empty \"fields\" map`,\n );\n }\n const fieldList: CompiledColumn[] = [];\n const byName = new Map<string, CompiledColumn>();\n let fi = 0;\n for (const [fname, fdef] of Object.entries(def.fields)) {\n if (byName.has(fname)) {\n throw new SchemaError(\n `duplicate field \"${fname}\" in struct column \"${name}\"`,\n );\n }\n const compiled = compileColumn(`${name}.${fname}`, fdef, fi++, {\n allowList: false,\n allowStruct: false,\n isChild: true,\n });\n fieldList.push(compiled);\n byName.set(fname, compiled);\n }\n fields = fieldList;\n fieldsByName = byName;\n } else if (def.items !== undefined) {\n throw new SchemaError(\n `only list columns accept \"items\"; \"${name}\" is ${def.type}`,\n );\n } else if (def.fields !== undefined) {\n throw new SchemaError(\n `only struct columns accept \"fields\"; \"${name}\" is ${def.type}`,\n );\n }\n\n return {\n name,\n index,\n type: def.type,\n typeCode,\n byteWidth: byteWidthOf(typeCode),\n nullable: def.nullable ?? false,\n valuesHeapBytes: def.valuesHeapBytes,\n ...(def.autoCloseRings !== undefined ? { autoCloseRings: def.autoCloseRings } : {}),\n ...(childColumn ? { childColumn } : {}),\n ...(fields ? { fields } : {}),\n ...(fieldsByName ? { fieldsByName } : {}),\n };\n}\n","/**\n * Apache Arrow IPC export/import adapter.\n *\n * Optional subpath (`arrowbase/arrow`). `apache-arrow` is an optional\n * peerDep — install it separately if you need IPC interop:\n *\n * pnpm add apache-arrow\n *\n * This module converts between an ArrowBase {@link Collection} and an\n * Arrow IPC byte stream (or file). ArrowBase owns its own in-memory\n * layout (ranged offsets, SAB-backed), which is deliberately not\n * byte-compatible with Arrow's dense offsets format. Export here\n * therefore materializes rows and rebuilds an Arrow Table via\n * `apache-arrow`'s builders — correct and simple, not zero-copy.\n *\n * ### Type mapping\n *\n * | ArrowBase | arrow-js |\n * |----------------------|------------------------------|\n * | bool | Bool |\n * | int8/16/32 | Int8/16/32 |\n * | int64 | Int64 (BigInt64) |\n * | uint8/16/32 | Uint8/16/32 |\n * | uint64 | Uint64 (BigUint64) |\n * | float32/64 | Float32/Float64 |\n * | utf8 | Utf8 |\n * | dict_utf8 | Dictionary<Int32, Utf8> |\n * | binary | Binary |\n * | list<T> | List<map(T)> |\n * | struct<fields> | Struct<map(fields)> |\n *\n * ### Internal columns\n *\n * By default `__deleted` is stripped on export (soft-deleted rows are\n * also removed from the output) and `__id` is preserved as a plain\n * uint32. Pass `{ includeInternalColumns: true }` to keep `__deleted`.\n */\n\nimport type * as Arrow from 'apache-arrow';\nimport { Collection, type RowValue } from './collection/collection.js';\nimport {\n defineSchema,\n type CompiledColumn,\n type CompiledSchema,\n type ColumnDef,\n type SchemaInput,\n} from './schema/schema.js';\nimport { ColumnTypeCode } from './schema/types.js';\nimport { SchemaError } from './errors.js';\n\nconst ARROW_EXTENSION_NAME = 'ARROW:extension:name';\nconst ARROW_EXTENSION_METADATA = 'ARROW:extension:metadata';\nconst GEOARROW_POINT = 'geoarrow.point';\nconst GEOARROW_LINESTRING = 'geoarrow.linestring';\nconst GEOARROW_POLYGON = 'geoarrow.polygon';\nconst GEOARROW_EPSG_4326_METADATA = JSON.stringify({\n crs: 'EPSG:4326',\n edges: 'planar',\n});\n\n// ---------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------\n\nexport interface ExportArrowOptions {\n /**\n * 'stream' (default) produces the Arrow IPC stream format\n * (schema + record batches). 'file' wraps it in the random-access\n * file format with a footer.\n */\n format?: 'stream' | 'file';\n /**\n * If false (default), soft-deleted rows are skipped and `__deleted`\n * is omitted from the Arrow schema. If true, all rows are exported\n * and `__deleted` is included as a bool column.\n */\n includeInternalColumns?: boolean;\n /**\n * Dynamically resolved apache-arrow module (for callers that must\n * control module loading, e.g., ESM + bundler edge cases). Most\n * callers should leave this undefined — we will import lazily.\n */\n arrow?: typeof Arrow;\n}\n\nexport interface ImportArrowOptions {\n /**\n * Row capacity to allocate for the rehydrated collection.\n * Defaults to the Arrow Table's `numRows`.\n */\n capacity?: number;\n /**\n * Override the schema name. Defaults to `'arrow'`.\n */\n name?: string;\n /** See {@link ExportArrowOptions.arrow}. */\n arrow?: typeof Arrow;\n}\n\n/**\n * Export a collection as Arrow IPC bytes. Returns a `Uint8Array`; copy\n * `.buffer` if you need an `ArrayBuffer`.\n */\nexport async function exportArrowIPC(\n collection: Collection,\n options?: ExportArrowOptions,\n): Promise<Uint8Array> {\n const arrow = options?.arrow ?? (await loadArrow());\n const table = buildTable(collection, arrow, options);\n const fmt = options?.format ?? 'stream';\n return arrow.tableToIPC(table, fmt);\n}\n\n/**\n * Rebuild a collection from Arrow IPC bytes. The Arrow schema is\n * translated into an ArrowBase schema; types that have no ArrowBase\n * equivalent (e.g., Timestamp, Decimal) will throw.\n */\nexport async function importArrowIPC(\n buf: Uint8Array | ArrayBuffer,\n options?: ImportArrowOptions,\n): Promise<Collection> {\n const arrow = options?.arrow ?? (await loadArrow());\n const bytes = buf instanceof Uint8Array ? buf : new Uint8Array(buf);\n // tableFromIPC auto-detects stream vs file format. We only use the\n // explicit `format` hint for error-reporting parity.\n const table = arrow.tableFromIPC(bytes) as Arrow.Table;\n return rehydrateCollection(table, arrow, options);\n}\n\n/**\n * Build an Arrow `Table` from a collection without serializing it.\n * Exposed for users who want to stream multiple collections into the\n * same IPC writer, or who want to cross-check column-level data.\n */\nexport async function exportArrowTable(\n collection: Collection,\n options?: ExportArrowOptions,\n): Promise<Arrow.Table> {\n const arrow = options?.arrow ?? (await loadArrow());\n return buildTable(collection, arrow, options);\n}\n\n// ---------------------------------------------------------------------\n// Module loading\n// ---------------------------------------------------------------------\n\nasync function loadArrow(): Promise<typeof Arrow> {\n try {\n // Dynamic import so that consumers who never touch this subpath\n // don't pay the apache-arrow bundle cost.\n return (await import('apache-arrow')) as unknown as typeof Arrow;\n } catch (err) {\n throw new Error(\n 'arrowbase/arrow requires the optional peer dependency \"apache-arrow\". ' +\n 'Install it: `pnpm add apache-arrow` (v19+). Original error: ' +\n (err instanceof Error ? err.message : String(err)),\n );\n }\n}\n\n// ---------------------------------------------------------------------\n// Export: Collection → Arrow Table\n// ---------------------------------------------------------------------\n\nfunction buildTable(\n collection: Collection,\n arrow: typeof Arrow,\n options: ExportArrowOptions | undefined,\n): Arrow.Table {\n const includeInternal = options?.includeInternalColumns === true;\n const schema = collection.schema;\n\n // Pick exported columns. `__deleted` is dropped unless opted-in;\n // `__id` is always exported.\n const exportedCols = schema.columns.filter((c) => {\n if (c.name === '__deleted' && !includeInternal) return false;\n return true;\n });\n\n // Materialize rows as plain objects. Collect column-wise arrays for\n // `vectorFromArray`, which is the simplest arrow-js builder path.\n const perColumn = new Map<string, unknown[]>();\n for (const c of exportedCols) perColumn.set(c.name, []);\n\n const rowIter = collection.rows({ includeSoftDeleted: includeInternal });\n for (const row of rowIter) {\n for (const c of exportedCols) {\n perColumn.get(c.name)!.push(row[c.name]);\n }\n }\n\n // Build an arrow Field list with the right DataType per column,\n // plus one Vector per column. Use vectorFromArray with an explicit\n // DataType so dict-utf8 and int64 land in the right encoding.\n const fields: Arrow.Field[] = [];\n const vectors: Arrow.Vector[] = [];\n for (const c of exportedCols) {\n const values = perColumn.get(c.name)!;\n const dtype = compiledColumnToArrowType(c, arrow);\n const vec = buildVector(values, c, dtype, arrow);\n vectors.push(vec);\n fields.push(compiledColumnToArrowField(c, dtype, arrow));\n }\n\n const arrowSchema = new arrow.Schema(fields);\n // `new Table(schema, { colName: vector, ... })` uses the overload that\n // preserves the caller-supplied schema (including nullability flags).\n const cols: Record<string, Arrow.Vector> = {};\n for (let i = 0; i < fields.length; i++) {\n cols[fields[i]!.name] = vectors[i]!;\n }\n return new arrow.Table(arrowSchema, cols);\n}\n\nfunction compiledColumnToArrowField(\n c: CompiledColumn,\n dtype: Arrow.DataType,\n arrow: typeof Arrow,\n): Arrow.Field {\n const extensionName = geoArrowExtensionName(c.typeCode);\n if (extensionName !== undefined) {\n return new arrow.Field(c.name, dtype, c.nullable, geoArrowMetadata(extensionName));\n }\n return new arrow.Field(c.name, dtype, c.nullable);\n}\n\nfunction geoArrowExtensionName(typeCode: ColumnTypeCode): string | undefined {\n switch (typeCode) {\n case ColumnTypeCode.Point:\n return GEOARROW_POINT;\n case ColumnTypeCode.LineString:\n return GEOARROW_LINESTRING;\n case ColumnTypeCode.Polygon:\n return GEOARROW_POLYGON;\n default:\n return undefined;\n }\n}\n\nfunction geoArrowMetadata(extensionName: string): Map<string, string> {\n return new Map([\n [ARROW_EXTENSION_NAME, extensionName],\n [ARROW_EXTENSION_METADATA, GEOARROW_EPSG_4326_METADATA],\n ]);\n}\n\nfunction geoArrowPointType(arrow: typeof Arrow): Arrow.FixedSizeList {\n return new arrow.FixedSizeList(\n 2,\n new arrow.Field('xy', new arrow.Float64(), false),\n ) as Arrow.FixedSizeList;\n}\n\nfunction geoArrowLineStringType(arrow: typeof Arrow): Arrow.List {\n return new arrow.List(\n new arrow.Field('vertices', geoArrowPointType(arrow), false),\n ) as Arrow.List;\n}\n\nfunction geoArrowPolygonType(arrow: typeof Arrow): Arrow.List {\n return new arrow.List(\n new arrow.Field('rings', geoArrowLineStringType(arrow), false),\n ) as Arrow.List;\n}\n\nfunction compiledColumnToArrowType(\n c: CompiledColumn,\n arrow: typeof Arrow,\n): Arrow.DataType {\n switch (c.typeCode) {\n case ColumnTypeCode.Bool: return new arrow.Bool();\n case ColumnTypeCode.Int8: return new arrow.Int8();\n case ColumnTypeCode.Int16: return new arrow.Int16();\n case ColumnTypeCode.Int32: return new arrow.Int32();\n case ColumnTypeCode.Int64: return new arrow.Int64();\n case ColumnTypeCode.UInt8: return new arrow.Uint8();\n case ColumnTypeCode.UInt16: return new arrow.Uint16();\n case ColumnTypeCode.UInt32: return new arrow.Uint32();\n case ColumnTypeCode.UInt64: return new arrow.Uint64();\n case ColumnTypeCode.Float32: return new arrow.Float32();\n case ColumnTypeCode.Float64: return new arrow.Float64();\n case ColumnTypeCode.Utf8: return new arrow.Utf8();\n case ColumnTypeCode.Binary: return new arrow.Binary();\n case ColumnTypeCode.DictUtf8: {\n // Arrow dict: Dictionary<indexType, valueType, id>.\n // Use Int32 indexes (arrow-js default); dictionary ID = column index.\n const indexType = new arrow.Int32();\n return new arrow.Dictionary(new arrow.Utf8(), indexType, c.index, false);\n }\n case ColumnTypeCode.List: {\n const child = c.childColumn!;\n return new arrow.List(\n new arrow.Field(\n 'item',\n compiledColumnToArrowType(child, arrow),\n child.nullable,\n ),\n );\n }\n case ColumnTypeCode.Struct: {\n // CompiledColumn.name of a struct field is `${parent}.${field}`.\n // Use `fieldsByName` to recover the bare local field name that\n // consumers of the Arrow schema expect.\n const fields: Arrow.Field[] = [];\n for (const [localName, f] of c.fieldsByName!) {\n fields.push(\n new arrow.Field(\n localName,\n compiledColumnToArrowType(f, arrow),\n f.nullable,\n ),\n );\n }\n return new arrow.Struct(fields);\n }\n case ColumnTypeCode.Point:\n return geoArrowPointType(arrow);\n case ColumnTypeCode.LineString:\n return geoArrowLineStringType(arrow);\n case ColumnTypeCode.Polygon:\n return geoArrowPolygonType(arrow);\n default: {\n // Exhaustiveness check.\n const _n: never = c.typeCode;\n throw new SchemaError(`unsupported column type code ${String(_n)}`);\n }\n }\n}\n\nfunction buildVector(\n values: unknown[],\n _col: CompiledColumn,\n dtype: Arrow.DataType,\n arrow: typeof Arrow,\n): Arrow.Vector {\n // vectorFromArray with an explicit type handles nulls (undefined →\n // null) and coerces JS values into the underlying typed array. For\n // Int64/UInt64 values, we pass through bigints as-is.\n // `vectorFromArray` supports Utf8/Binary/Dictionary/List/Struct/\n // Float/Int/Bool out of the box when given a DataType instance.\n return arrow.vectorFromArray(values, dtype);\n}\n\n// ---------------------------------------------------------------------\n// Import: Arrow Table → Collection\n// ---------------------------------------------------------------------\n\nfunction rehydrateCollection(\n table: Arrow.Table,\n arrow: typeof Arrow,\n options: ImportArrowOptions | undefined,\n): Collection {\n const fields = table.schema.fields;\n if (fields.length === 0) {\n throw new SchemaError('Arrow table has no fields; cannot rehydrate');\n }\n\n const columns: Record<string, ColumnDef> = {};\n const fieldToColName: string[] = [];\n let hasIdColumn = false;\n for (const f of fields) {\n const def = arrowFieldToColumnDef(f, arrow);\n columns[f.name] = def;\n fieldToColName.push(f.name);\n if (f.name === '__id') hasIdColumn = true;\n }\n\n // ArrowBase requires a uint32 PK called `__id` by default. If the\n // input lacks it, synthesize one from the row index.\n if (!hasIdColumn) {\n columns['__id'] = { type: 'uint32' };\n }\n\n const input: SchemaInput = {\n name: options?.name ?? 'arrow',\n columns,\n };\n const compiled = defineSchema(input);\n\n const capacity =\n options?.capacity ??\n Math.max(16, table.numRows + Math.ceil(table.numRows / 4));\n const c = Collection.create(compiled, { capacity });\n\n // Walk rows, copy field values, fill `__id` if synthesized.\n const rows = table.toArray() as Array<Record<string, unknown>>;\n for (let i = 0; i < rows.length; i++) {\n const src = rows[i]!;\n const dst: Record<string, unknown> = {};\n for (const colName of fieldToColName) {\n dst[colName] = normalizeArrowValue(src[colName], compiled, colName);\n }\n if (!hasIdColumn) dst['__id'] = i;\n c.insert(dst as RowValue);\n }\n\n return c;\n}\n\nfunction arrowFieldToColumnDef(\n field: Arrow.Field,\n arrow: typeof Arrow,\n): ColumnDef {\n const t = field.type;\n const nullable = field.nullable;\n\n // We check against arrow-js's `Type` enum via `typeId`.\n // Known mapping mirrors the export table in reverse.\n const TypeEnum = arrow.Type;\n\n const extensionName = field.metadata.get(ARROW_EXTENSION_NAME);\n if (extensionName === GEOARROW_POINT) {\n assertGeoArrowPointType(t, arrow, 'geoarrow.point');\n return { type: 'point', nullable };\n }\n if (extensionName === GEOARROW_LINESTRING) {\n assertGeoArrowLineStringType(t, arrow, 'geoarrow.linestring');\n return { type: 'linestring', nullable };\n }\n if (extensionName === GEOARROW_POLYGON) {\n assertGeoArrowPolygonType(t, arrow, 'geoarrow.polygon');\n return { type: 'polygon', nullable };\n }\n\n if (t instanceof arrow.Bool) return { type: 'bool', nullable };\n if (t instanceof arrow.Int) {\n const bits = (t as Arrow.Int).bitWidth;\n const signed = (t as Arrow.Int).isSigned;\n const name =\n (signed ? 'int' : 'uint') +\n (bits === 64 ? '64' : bits === 32 ? '32' : bits === 16 ? '16' : '8');\n return { type: name as ColumnDef['type'], nullable };\n }\n if (t instanceof arrow.Float) {\n const p = (t as Arrow.Float).precision;\n if (p === arrow.Precision.SINGLE) return { type: 'float32', nullable };\n if (p === arrow.Precision.DOUBLE) return { type: 'float64', nullable };\n throw new SchemaError(`unsupported Arrow Float precision ${p}`);\n }\n if (t instanceof arrow.Utf8) return { type: 'utf8', nullable };\n if (t instanceof arrow.Binary) return { type: 'binary', nullable };\n if (t instanceof arrow.Dictionary) {\n const value = (t as Arrow.Dictionary).dictionary;\n if (!(value instanceof arrow.Utf8)) {\n throw new SchemaError(\n 'only Dictionary<_, Utf8> is supported; got non-string dictionary',\n );\n }\n return { type: 'dict_utf8', nullable };\n }\n if (t instanceof arrow.List) {\n const childField = (t as Arrow.List).children[0]!;\n const childDef = arrowFieldToColumnDef(childField, arrow);\n return { type: 'list', nullable, items: childDef };\n }\n if (t instanceof arrow.Struct) {\n const fields: Record<string, ColumnDef> = {};\n for (const f of (t as Arrow.Struct).children) {\n fields[f.name] = arrowFieldToColumnDef(f, arrow);\n }\n return { type: 'struct', nullable, fields };\n }\n\n // Everything else — Timestamp, Decimal, Date_, FixedSizeBinary, etc.\n // — is out of scope for v1.\n throw new SchemaError(\n `Arrow type ${TypeEnum[t.typeId] ?? t.typeId} is not supported by ArrowBase`,\n );\n}\n\nfunction assertGeoArrowPointType(\n t: Arrow.DataType,\n arrow: typeof Arrow,\n label: string,\n): asserts t is Arrow.FixedSizeList {\n if (!(t instanceof arrow.FixedSizeList)) {\n throw new SchemaError(`${label} must be FixedSizeList<Float64>[2]`);\n }\n const pointType = t as Arrow.FixedSizeList;\n const child = pointType.children[0];\n if (\n pointType.listSize !== 2 ||\n child === undefined ||\n !(child.type instanceof arrow.Float) ||\n (child.type as Arrow.Float).precision !== arrow.Precision.DOUBLE\n ) {\n throw new SchemaError(`${label} must be FixedSizeList<Float64>[2]`);\n }\n}\n\nfunction assertGeoArrowLineStringType(\n t: Arrow.DataType,\n arrow: typeof Arrow,\n label: string,\n): asserts t is Arrow.List {\n if (!(t instanceof arrow.List)) {\n throw new SchemaError(`${label} must be List<FixedSizeList<Float64>[2]>`);\n }\n const child = (t as Arrow.List).children[0];\n if (child === undefined) {\n throw new SchemaError(`${label} must be List<FixedSizeList<Float64>[2]>`);\n }\n assertGeoArrowPointType(child.type, arrow, `${label} child`);\n}\n\nfunction assertGeoArrowPolygonType(\n t: Arrow.DataType,\n arrow: typeof Arrow,\n label: string,\n): asserts t is Arrow.List {\n if (!(t instanceof arrow.List)) {\n throw new SchemaError(`${label} must be List<List<FixedSizeList<Float64>[2]>>`);\n }\n const child = (t as Arrow.List).children[0];\n if (child === undefined) {\n throw new SchemaError(`${label} must be List<List<FixedSizeList<Float64>[2]>>`);\n }\n assertGeoArrowLineStringType(child.type, arrow, `${label} child`);\n}\n\n/**\n * Arrow row proxies produce nested StructRow / Vector values that\n * aren't plain JS objects. Recursively coerce them so `Collection.insert`\n * sees the shape it expects.\n */\nfunction normalizeArrowValue(\n value: unknown,\n schema: CompiledSchema,\n colName: string,\n): unknown {\n const col = schema.columnsByName.get(colName);\n if (!col) return value;\n return normalizeByColumn(value, col);\n}\n\nfunction normalizeByColumn(value: unknown, col: CompiledColumn): unknown {\n if (value === null || value === undefined) return value;\n switch (col.typeCode) {\n case ColumnTypeCode.Point:\n return normalizePointValue(value);\n case ColumnTypeCode.LineString:\n return normalizeLineStringValue(value);\n case ColumnTypeCode.Polygon:\n return normalizePolygonValue(value);\n case ColumnTypeCode.List: {\n const child = col.childColumn!;\n const arr = value as ArrayLike<unknown> & Iterable<unknown>;\n const out: unknown[] = [];\n for (const v of arr) out.push(normalizeByColumn(v, child));\n return out;\n }\n case ColumnTypeCode.Struct: {\n const rec = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n // CompiledColumn.fieldsByName is keyed by the bare local name,\n // which matches the Arrow StructRow / plain-object shape.\n const source =\n typeof (rec as { toJSON?: () => Record<string, unknown> }).toJSON ===\n 'function'\n ? (rec as { toJSON: () => Record<string, unknown> }).toJSON()\n : rec;\n for (const [localName, field] of col.fieldsByName!) {\n out[localName] = normalizeByColumn(source[localName], field);\n }\n return out;\n }\n case ColumnTypeCode.Binary: {\n // Arrow often returns a Uint8Array view that may share buffer\n // state with the record batch. Copy to decouple ownership.\n if (value instanceof Uint8Array) return new Uint8Array(value);\n return value;\n }\n case ColumnTypeCode.Int64:\n case ColumnTypeCode.UInt64: {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number') return BigInt(value);\n return value;\n }\n default:\n return value;\n }\n}\n\nfunction normalizePointValue(value: unknown): [number, number] {\n if (Array.isArray(value)) return [value[0] as number, value[1] as number];\n if (typeof value === 'object' && value !== null && Symbol.iterator in value) {\n const coords = Array.from(value as Iterable<unknown>);\n return [coords[0] as number, coords[1] as number];\n }\n throw new SchemaError('geoarrow.point value must be iterable [lng, lat]');\n}\n\nfunction normalizeLineStringValue(value: unknown): [number, number][] {\n if (typeof value === 'object' && value !== null && Symbol.iterator in value) {\n return Array.from(value as Iterable<unknown>).map(normalizePointValue);\n }\n throw new SchemaError('geoarrow.linestring value must be iterable points');\n}\n\nfunction normalizePolygonValue(value: unknown): [number, number][][] {\n if (typeof value === 'object' && value !== null && Symbol.iterator in value) {\n return Array.from(value as Iterable<unknown>).map(normalizeLineStringValue);\n }\n throw new SchemaError('geoarrow.polygon value must be iterable rings');\n}\n"]}
|