From 3b862f4411d8577ea4a07efd7203cb1281d1ece7 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Dec 2025 22:58:40 +0000 Subject: [PATCH 1/2] fix(db): compile filter expression once instead of on every invocation Previously, `createFilterFunctionFromExpression` was calling `compileSingleRowExpression(expression)` inside the returned filter function, causing the expression to be recompiled for every item being filtered. This resulted in severe performance degradation when filtering large collections, as `normalizeValue` and other compilation functions were called thousands of times unnecessarily. Move the compilation outside the returned function so it happens once when the filter function is created. --- packages/db/src/collection/change-events.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/db/src/collection/change-events.ts b/packages/db/src/collection/change-events.ts index c9929e170..0ad3ca68b 100644 --- a/packages/db/src/collection/change-events.ts +++ b/packages/db/src/collection/change-events.ts @@ -221,9 +221,11 @@ export function createFilterFunction( export function createFilterFunctionFromExpression( expression: BasicExpression ): (item: T) => boolean { + // Compile expression once when filter function is created, not on every invocation + const evaluator = compileSingleRowExpression(expression) + return (item: T): boolean => { try { - const evaluator = compileSingleRowExpression(expression) const result = evaluator(item as Record) return toBooleanPredicate(result) } catch { From 4f4c021c3925de70912b1fdf221c3184a6f988de Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Dec 2025 23:15:15 +0000 Subject: [PATCH 2/2] chore: add changeset for filter expression compile fix --- .changeset/fix-filter-expression-compile.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/fix-filter-expression-compile.md diff --git a/.changeset/fix-filter-expression-compile.md b/.changeset/fix-filter-expression-compile.md new file mode 100644 index 000000000..8d637937e --- /dev/null +++ b/.changeset/fix-filter-expression-compile.md @@ -0,0 +1,7 @@ +--- +"@tanstack/db": patch +--- + +fix(db): compile filter expression once in createFilterFunctionFromExpression + +Fixed a performance issue in `createFilterFunctionFromExpression` where the expression was being recompiled on every filter call. This only affected realtime change event filtering for pushed-down predicates at the collection level when using orderBy + limit. The core query engine was not affected as it already compiled predicates once.