-
Notifications
You must be signed in to change notification settings - Fork 152
Pass in join information into queryFn for on-demand syncMode #1128
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
KyleAMathews
wants to merge
5
commits into
main
Choose a base branch
from
claude/investigate-db-tasks-fXs2R
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… mode Investigates the pagination issue when using queryCollection with joins in on-demand syncMode. Documents the root cause (LoadSubsetOptions lacks join information) and proposes extending the type to include join details so backends can perform server-side joins before pagination.
This enables server-side joins before pagination for queryCollection, solving the issue where pagination was applied before join filters, leading to inconsistent page sizes. Changes: - Add JoinInfo type with collection ID, alias, type, keys, where, orderBy - Extend LoadSubsetOptions with optional joins array - Extract join info during query optimization (extractJoinInfo) - Pass join info through CompilationResult → CollectionConfigBuilder - Include join info when creating subscriptions - Pass joins in loadSubset calls from CollectionSubscription - Serialize joins in query keys for queryCollection The queryFn now receives join information in context.meta.loadSubsetOptions.joins, allowing construction of server-side join queries that filter before pagination. Closes: Investigation for passing join info to queryFn in on-demand mode
🦋 Changeset detectedLatest commit: f529c55 The changes in this PR will be included in the next version bump. This PR includes changesets to release 12 packages
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 |
More templates
@tanstack/angular-db
@tanstack/db
@tanstack/db-ivm
@tanstack/electric-db-collection
@tanstack/offline-transactions
@tanstack/powersync-db-collection
@tanstack/query-db-collection
@tanstack/react-db
@tanstack/rxdb-db-collection
@tanstack/solid-db
@tanstack/svelte-db
@tanstack/trailbase-db-collection
@tanstack/vue-db
commit: |
Contributor
|
Size Change: +641 B (+0.71%) Total Size: 91.2 kB
ℹ️ View Unchanged
|
Contributor
|
Size Change: 0 B Total Size: 3.47 kB ℹ️ View Unchanged
|
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Passes join information to
queryFnin on-demand mode, enabling server-side joins before pagination. This fixes inconsistent page sizes when queries combine pagination with filters on joined collections.Reviewer Guidance
Root Cause
When using
queryCollectionwith joins and pagination (e.g.,limit: 10), the pagination was applied before join filters:queryFnreceived{ limit: 10, where: <main collection filters only> }The join information was lost during compilation, so
queryFnhad no way to construct a server-side query that joins and filters before paginating.Approach
Extract join information during query optimization and thread it through the compilation pipeline to
LoadSubsetOptions:Key Invariants
FROM tasks JOIN accountsproduces{ tasks: [accountJoinInfo] }account.*go intojoinInfo.where, notloadSubsetOptions.wherelocalKeyalways references main collection,foreignKeyalways references joined collection (even if IR has them swapped)getInnermostCollectionId()recursively finds the actual collection ID through QueryRef chainsNon-goals
queryFnimplementations decide how to use itjoinsis optional; existingqueryFnimplementations work without modificationTrade-offs
Why extract at optimizer level?
The optimizer already analyzes WHERE clauses by source alias (
sourceWhereClauses). Extracting join info here reuses that analysis and keeps join-related logic centralized.Why include
whereandorderByin JoinInfo?Server-side queries need the complete picture. Including these avoids multiple round-trips through the compilation result to reconstruct which filters apply to which joins.
Verification
Files Changed
packages/db/src/types.tsJoinInfotype, extendLoadSubsetOptionswithjoinspackages/db/src/query/optimizer.tsextractJoinInfo(), includejoinInfoBySourcein optimization resultpackages/db/src/query/compiler/index.tsjoinInfoBySourcethroughCompilationResultpackages/db/src/query/live/collection-config-builder.tsjoinInfoBySourceCachepackages/db/src/query/live/collection-subscriber.tsgetJoinInfoForAlias(), pass to subscriptionspackages/db/src/collection/subscription.tsjoinsinloadSubsetcallspackages/query-db-collection/src/serialization.tspackages/db/tests/query/optimizer.test.ts