Skip to content

fix: default getKey on live query collections fails on enriched objects#1432

Merged
kevin-dp merged 3 commits intomainfrom
fix/live-query-collection-default-getkey
Mar 30, 2026
Merged

fix: default getKey on live query collections fails on enriched objects#1432
kevin-dp merged 3 commits intomainfrom
fix/live-query-collection-default-getkey

Conversation

@kevin-dp
Copy link
Copy Markdown
Contributor

Summary

  • The default WeakMap-based getKey for live query collections breaks when a live query collection (without a custom getKey) is used as a source in another live query collection. Virtual props enrichment creates new object references that miss the WeakMap, causing all items to resolve to key undefined and collapse into a single item.
  • Falls back to item.$key (already set by virtual props enrichment) when the WeakMap lookup misses.
  • Adds 3 regression tests covering chained live query collections without custom getKey: simple query, join query, and update propagation.

Fixes #1423

Test plan

  • New tests reproduce the issue (return 1 item instead of N) before the fix
  • All 3 new tests pass after the fix
  • Full live-query-collection.test.ts suite passes (52/52)

🤖 Generated with Claude Code

kevin-dp and others added 2 commits March 30, 2026 14:57
The default WeakMap-based getKey for live query collections breaks when
enriched change values (with virtual props) are passed through chained
collections. The enriched objects are new references not found in the
WeakMap, causing all items to resolve to key `undefined` and collide.

Fall back to `item.$key` (set by virtual props enrichment) when the
WeakMap lookup misses.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Mar 30, 2026

More templates

@tanstack/angular-db

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

@tanstack/browser-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/browser-db-sqlite-persistence@1432

@tanstack/capacitor-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/capacitor-db-sqlite-persistence@1432

@tanstack/cloudflare-durable-objects-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/cloudflare-durable-objects-db-sqlite-persistence@1432

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/db-sqlite-persistence-core

npm i https://pkg.pr.new/@tanstack/db-sqlite-persistence-core@1432

@tanstack/electric-db-collection

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

@tanstack/electron-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/electron-db-sqlite-persistence@1432

@tanstack/expo-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/expo-db-sqlite-persistence@1432

@tanstack/node-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/node-db-sqlite-persistence@1432

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/react-native-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/react-native-db-sqlite-persistence@1432

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/tauri-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/tauri-db-sqlite-persistence@1432

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: f2821a4

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 30, 2026

Size Change: +7 B (+0.01%)

Total Size: 113 kB

📦 View Changed
Filename Size Change
packages/db/dist/esm/query/live/collection-config-builder.js 7.79 kB +7 B (+0.09%)
ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/collection/change-events.js 1.39 kB
packages/db/dist/esm/collection/changes.js 1.38 kB
packages/db/dist/esm/collection/cleanup-queue.js 810 B
packages/db/dist/esm/collection/events.js 434 B
packages/db/dist/esm/collection/index.js 3.61 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 1.69 kB
packages/db/dist/esm/collection/mutations.js 2.47 kB
packages/db/dist/esm/collection/state.js 5.26 kB
packages/db/dist/esm/collection/subscription.js 3.74 kB
packages/db/dist/esm/collection/sync.js 2.88 kB
packages/db/dist/esm/collection/transaction-metadata.js 144 B
packages/db/dist/esm/deferred.js 207 B
packages/db/dist/esm/errors.js 4.92 kB
packages/db/dist/esm/event-emitter.js 748 B
packages/db/dist/esm/index.js 3 kB
packages/db/dist/esm/indexes/auto-index.js 830 B
packages/db/dist/esm/indexes/base-index.js 729 B
packages/db/dist/esm/indexes/basic-index.js 2.05 kB
packages/db/dist/esm/indexes/btree-index.js 2.17 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 538 B
packages/db/dist/esm/local-only.js 890 B
packages/db/dist/esm/local-storage.js 2.1 kB
packages/db/dist/esm/optimistic-action.js 359 B
packages/db/dist/esm/paced-mutations.js 496 B
packages/db/dist/esm/proxy.js 3.75 kB
packages/db/dist/esm/query/builder/functions.js 905 B
packages/db/dist/esm/query/builder/index.js 5.25 kB
packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.62 kB
packages/db/dist/esm/query/compiler/expressions.js 430 B
packages/db/dist/esm/query/compiler/group-by.js 2.69 kB
packages/db/dist/esm/query/compiler/index.js 3.63 kB
packages/db/dist/esm/query/compiler/joins.js 2.11 kB
packages/db/dist/esm/query/compiler/order-by.js 1.51 kB
packages/db/dist/esm/query/compiler/select.js 1.11 kB
packages/db/dist/esm/query/effect.js 4.78 kB
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir.js 829 B
packages/db/dist/esm/query/live-query-collection.js 360 B
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/collection-subscriber.js 1.94 kB
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/utils.js 1.64 kB
packages/db/dist/esm/query/optimizer.js 2.62 kB
packages/db/dist/esm/query/predicate-utils.js 2.97 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/query/subset-dedupe.js 960 B
packages/db/dist/esm/scheduler.js 1.3 kB
packages/db/dist/esm/SortedMap.js 1.3 kB
packages/db/dist/esm/strategies/debounceStrategy.js 247 B
packages/db/dist/esm/strategies/queueStrategy.js 428 B
packages/db/dist/esm/strategies/throttleStrategy.js 246 B
packages/db/dist/esm/transactions.js 2.9 kB
packages/db/dist/esm/utils.js 927 B
packages/db/dist/esm/utils/array-utils.js 273 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 5.61 kB
packages/db/dist/esm/utils/comparison.js 1.05 kB
packages/db/dist/esm/utils/cursor.js 457 B
packages/db/dist/esm/utils/index-optimization.js 1.54 kB
packages/db/dist/esm/utils/type-guards.js 157 B
packages/db/dist/esm/virtual-props.js 360 B

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 30, 2026

Size Change: 0 B

Total Size: 4.23 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/index.js 249 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.32 kB
packages/react-db/dist/esm/useLiveQuery.js 1.34 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 559 B
packages/react-db/dist/esm/usePacedMutations.js 401 B

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

@kevin-dp kevin-dp requested a review from samwillis March 30, 2026 13:05
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@samwillis samwillis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

love a one line change bug fix!

@kevin-dp kevin-dp merged commit c314c36 into main Mar 30, 2026
7 checks passed
@kevin-dp kevin-dp deleted the fix/live-query-collection-default-getkey branch March 30, 2026 13:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

react-db@0.1.78 electric createLiveQueryCollection inconsistent data without getKey

2 participants