Skip to content

Query Driven Sync with On-Demand Collection Loading - #763

Merged
samwillis merged 7 commits into
mainfrom
query-driven-sync
Nov 12, 2025
Merged

Query Driven Sync with On-Demand Collection Loading#763
samwillis merged 7 commits into
mainfrom
query-driven-sync

Conversation

@samwillis

@samwillissamwillis commented Nov 5, 2025

Copy link
Copy Markdown
Collaborator

@changeset-bot

changeset-botBot commented Nov 5, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 471fa8f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
NameType
@tanstack/dbPatch
@tanstack/query-db-collectionPatch
@tanstack/db-ivmPatch
@tanstack/electric-db-collectionPatch
@tanstack/angular-dbPatch
@tanstack/db-collection-e2ePatch
@tanstack/powersync-db-collectionPatch
@tanstack/react-dbPatch
@tanstack/rxdb-db-collectionPatch
@tanstack/solid-dbPatch
@tanstack/svelte-dbPatch
@tanstack/trailbase-db-collectionPatch
@tanstack/vue-dbPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new

pkg-pr-newBot commented Nov 5, 2025

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@763

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@763

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@763

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@763

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@763

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@763

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@763

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@763

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@763

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@763

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@763

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@763

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@763

commit: 471fa8f

@github-actions

github-actionsBot commented Nov 5, 2025

Copy link
Copy Markdown
Contributor

Size Change: +5.99 kB (+7.49%) 🔍

Total Size: 86 kB

FilenameSizeChange
./packages/db/dist/esm/collection/change-events.js1.38 kB+21 B (+1.54%)
./packages/db/dist/esm/collection/index.js3.24 kB+121 B (+3.88%)
./packages/db/dist/esm/index.js2.63 kB+266 B (+11.26%)⚠️
./packages/db/dist/esm/indexes/auto-index.js742 B+11 B (+1.5%)
./packages/db/dist/esm/query/builder/functions.js733 B+127 B (+20.96%)🚨
./packages/db/dist/esm/query/builder/index.js3.84 kB-15 B (-0.39%)
./packages/db/dist/esm/query/compiler/expressions.js691 B+17 B (+2.52%)
./packages/db/dist/esm/query/compiler/order-by.js1.25 kB+79 B (+6.75%)🔍
./packages/db/dist/esm/query/live/collection-config-builder.js5.26 kB+109 B (+2.12%)
./packages/db/dist/esm/utils/index-optimization.js1.51 kB+20 B (+1.34%)
./packages/db/dist/esm/query/expression-helpers.js1.43 kB+1.43 kB (new file)🆕
./packages/db/dist/esm/query/predicate-utils.js2.88 kB+2.88 kB (new file)🆕
./packages/db/dist/esm/query/subset-dedupe.js921 B+921 B (new file)🆕
ℹ️ View Unchanged
FilenameSize
./packages/db/dist/esm/collection/changes.js977 B
./packages/db/dist/esm/collection/events.js388 B
./packages/db/dist/esm/collection/indexes.js1.1 kB
./packages/db/dist/esm/collection/lifecycle.js1.67 kB
./packages/db/dist/esm/collection/mutations.js2.26 kB
./packages/db/dist/esm/collection/state.js3.43 kB
./packages/db/dist/esm/collection/subscription.js2.42 kB
./packages/db/dist/esm/collection/sync.js2.12 kB
./packages/db/dist/esm/deferred.js207 B
./packages/db/dist/esm/errors.js4.11 kB
./packages/db/dist/esm/event-emitter.js748 B
./packages/db/dist/esm/indexes/base-index.js766 B
./packages/db/dist/esm/indexes/btree-index.js1.87 kB
./packages/db/dist/esm/indexes/lazy-index.js1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js513 B
./packages/db/dist/esm/local-only.js837 B
./packages/db/dist/esm/local-storage.js2.04 kB
./packages/db/dist/esm/optimistic-action.js359 B
./packages/db/dist/esm/paced-mutations.js496 B
./packages/db/dist/esm/proxy.js3.22 kB
./packages/db/dist/esm/query/builder/ref-proxy.js917 B
./packages/db/dist/esm/query/compiler/evaluators.js1.35 kB
./packages/db/dist/esm/query/compiler/group-by.js1.8 kB
./packages/db/dist/esm/query/compiler/index.js1.96 kB
./packages/db/dist/esm/query/compiler/joins.js2 kB
./packages/db/dist/esm/query/compiler/select.js1.07 kB
./packages/db/dist/esm/query/ir.js673 B
./packages/db/dist/esm/query/live-query-collection.js360 B
./packages/db/dist/esm/query/live/collection-registry.js264 B
./packages/db/dist/esm/query/live/collection-subscriber.js1.77 kB
./packages/db/dist/esm/query/live/internal.js130 B
./packages/db/dist/esm/query/optimizer.js2.6 kB
./packages/db/dist/esm/scheduler.js1.21 kB
./packages/db/dist/esm/SortedMap.js1.18 kB
./packages/db/dist/esm/strategies/debounceStrategy.js237 B
./packages/db/dist/esm/strategies/queueStrategy.js418 B
./packages/db/dist/esm/strategies/throttleStrategy.js236 B
./packages/db/dist/esm/transactions.js2.9 kB
./packages/db/dist/esm/utils.js881 B
./packages/db/dist/esm/utils/browser-polyfills.js304 B
./packages/db/dist/esm/utils/btree.js5.61 kB
./packages/db/dist/esm/utils/comparison.js852 B
./packages/db/dist/esm/utils/type-guards.js157 B

compressed-size-action::db-package-size

@github-actions

github-actionsBot commented Nov 5, 2025

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 3.34 kB

ℹ️ View Unchanged
FilenameSize
./packages/react-db/dist/esm/index.js225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js1.11 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js431 B
./packages/react-db/dist/esm/usePacedMutations.js401 B

compressed-size-action::react-db-package-size

samwillisand others added 6 commits November 11, 2025 16:00
)
* Add unit tests that reproduce the problems with moveWindow on infinite limits
* Handle Infinity limit in move
* Changeset
* Add support for orderBy and limit options in currentStateAsChanges
* Unit tests for currentStateAsChanges
* changeset
* fix for eslint
* Move helper functions to the end of the file
* add predicate utils
* optimise in when all primatives
* optimisations
* changeset
* minusWherePredicates
* Add unit test for OR in both subset and superset that shows bug with OR handling
* Reorder OR handling to fix bug and handle AND similarly
* change chageset
* dedupe code
* add createDeduplicatedLoadSubset function
* convert deduper to a class, with reset, and dedupe inflight
* Simplify matching of inflight requests
* Improve minusWherePredicates such that it can handle common conditions in a conjunction
* Modify DeduplicatedLoadSubset.loadSubset such that it only loads the missing data
* Remove unused predicate helper functions
* Fix eslint issue
* Prettier
* Unify handling of IN and OR
* Handle subset that is false
* Fix isLimitSubset to correctly handle unlimited subsets
---------
Co-authored-by: Kevin De Porre <kevin@electric-sql.com>
* Callback that informs about deduplicated loadSubset calls
* Unit tests for onDeduplicate callback + move dedupe test files to the right folder
* changeset
* Object params
* Updated lockfile
* fix lock file
---------
Co-authored-by: Sam Willis <sam.willis@gmail.com>
* Handle pushed down predicates in query collection
Co-authored-by: Kevin De Porre <kevin@electric-sql.com>
Co-authored-by: Sam Willis <sam.willis@gmail.com>
* Deduplicate loadSubset requests in Query collection
* Unit test for deduplicating limited ordered queries in query collection
* GC tanstack query when subscription is unsubscribed
---------
Co-authored-by: Sam Willis <sam.willis@gmail.com>
Co-authored-by: Kevin De Porre <kevin@electric-sql.com>
* Handle pushed down predicates in Electric collection
Co-authored-by: Kevin De Porre <kevin@electric-sql.com>
Co-authored-by: Sam Willis <sam.willis@gmail.com>
* use the subsetDuduper for electric
* Leave fixme
* fix DeduplicatedLoadSubset call
* fix tests
---------
Co-authored-by: Sam Willis <sam.willis@gmail.com>
#762)
* Add optional compareOptions to the Collection Config which act as collection-wide config and allow queries to override those.
* Fix import
* changeset
* Ran prettier
* update docs
* Live queries inherit compare options from collection in the FROM clause
* Explicit compare options for live queries
* Rename compareOptions to defaultStringCollation in the collection config and live query collection config
* Docs update
---------
Co-authored-by: Sam Willis <sam.willis@gmail.com>
…#786)
* feat: add expression helpers for parsing LoadSubsetOptions in queryFn
Add reusable expression parsing utilities to help developers translate TanStack DB
predicates (where, orderBy, limit) into their API's format.
- Add expression-helpers.ts with generic parsing utilities
- parseWhereExpression: Parse where clauses with custom handlers
- parseOrderByExpression: Parse order by into simple array
- extractSimpleComparisons: Extract simple AND-ed filters
- parseLoadSubsetOptions: Convenience function for all options
- walkExpression, extractFieldPath, extractValue: Lower-level helpers
- Export helpers from query-db-collection package
- Add comprehensive documentation to query-collection.md
- How LoadSubsetOptions are passed via ctx.meta
- Expression helper usage with REST and GraphQL examples
- API reference for all helper functions
- Tips and best practices
This makes it much easier to implement query collections with predicate push-down
without having to manually parse expression AST trees.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: add comprehensive tests for expression helpers
- 35 test cases covering all helper functions
- Tests for parseWhereExpression with various operators
- Tests for parseOrderByExpression with sorting options
- Tests for extractSimpleComparisons
- Tests for parseLoadSubsetOptions
- Tests for low-level helpers (extractFieldPath, extractValue, walkExpression)
- Integration test for complex real-world query scenarios
All tests passing with 93.65% coverage of expression-helpers.ts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: add changeset for expression helpers
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: make GraphQL example more generic
Remove Hasura-specific emphasis in GraphQL example section.
The underscore-prefixed operators are common GraphQL conventions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: clarify GraphQL format is not prescriptive
Change 'the GraphQL format' to 'a GraphQL format' to avoid
implying this is the only way to structure GraphQL queries.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: remove Electric DB reference from tips
Remove implementation-specific reference to Electric DB Collection
from the tips section.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: make loadSubsetOptions always an object
- Add default empty object parameter to createQueryFromOpts
- Remove ?? {} pattern from all documentation
- Update changeset example
- Update PR description
This makes the API cleaner - users can now access
ctx.meta.loadSubsetOptions directly without null coalescing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: add explicit type annotations to avoid implicit any
- Import BasicExpression and OrderBy from IR namespace
- Add type annotations to all lambda parameters
- Remove unnecessary type checks that were always true
- Fix variable shadowing in walkExpression visitor parameter
- Fixes build type errors and eslint warnings in expression-helpers.ts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* style: fix prettier formatting in changeset
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: correct TypeScript types in expression-helpers tests
* feat: address Sam's review feedback
- Add OperatorName type and operators constant to db package
- Improve ParseWhereOptions handlers type to know IR operators
- Support array indices in FieldPath (string | number)
- Add locale/string collation options to ParsedOrderBy
- Make extractSimpleComparisons throw on unsupported operations (or, not, etc.)
- Update tests to expect throws instead of silent skipping
* fix: remove invalid sensitivity/locale fields from test mocks
CompareOptions uses StringCollationConfig which has stringSort, locale, and localeOptions fields, not sensitivity and locale at the top level.
* fix: handle discriminated union for CompareOptions properly
Use 'in' operator to check for optional fields (locale, localeOptions) that only exist when stringSort is 'locale'
* move helpers to main db package
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Sam Willis <sam.willis@gmail.com>
* Implement end-to-end tests for sync feature
Implement end-to-end tests for sync feature
Implement end-to-end tests for sync feature
chore: revert pnpm-lock.yaml to match query-driven-sync
chore: update pnpm-lock.yaml with e2e test pg dependencies
bump pnpm/action-setup version
fix pnpmlockfile
format
only run normal tests on test command
tidy and fix types
fixes
ci fix
tidy
checkpoint
cleanup between each test
add cleanup between tests
all e2e tests pass!
cleanup live queries
fixes for ci
add propper mutations to e2e tests
fix ci timouts
move the badly named accumulated data tests
fix ci flake
working query e2e tests
fix lint
fix assertions
Fix race condition between test and logical replication stream
Handle isNull and isUndefined in expression helpers
Ran prettier.
fix ci
update docs
add suport for not to extractSimpleComparisons and get tests to pass
try and fix ci race
* increase timeout
@samwillis
samwillis merged commit 528882e into mainNov 12, 2025
8 of 9 checks passed
@samwillis
samwillis deleted the query-driven-sync branch November 12, 2025 00:30
@github-actionsgithub-actionsBot mentioned this pull request Nov 12, 2025
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR has been released!

Thank you for your contribution!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

3 participants

@samwillis@KyleAMathews@kevin-dp