Skip to content

Find whereExpression examples in subscribeChanges#943

Merged
kevin-dp merged 6 commits intomainfrom
claude/whereexpression-subscribechanges-01CAXj3xYLmTeA1ZGtxzz6Hv
Jan 7, 2026
Merged

Find whereExpression examples in subscribeChanges#943
kevin-dp merged 6 commits intomainfrom
claude/whereexpression-subscribechanges-01CAXj3xYLmTeA1ZGtxzz6Hv

Conversation

@KyleAMathews
Copy link
Collaborator

Add a where callback option to SubscribeChangesOptions that allows filtering changes using query builder functions (eq, gt, and, etc.) with a row proxy, instead of requiring manual IR construction with PropRef.

Before:

import { eq, PropRef } from "@tanstack/db"
collection.subscribeChanges(callback, {
  whereExpression: eq(new PropRef(["status"]), "active")
})

After:

import { eq } from "@tanstack/db"
collection.subscribeChanges(callback, {
  where: (row) => eq(row.status, "active")
})

Changes:

  • Add generic where callback to SubscribeChangesOptions<T>
  • Compile where callback to whereExpression in CollectionChangesManager
  • Update JSDoc examples to show correct usage
  • Add tests for single and multiple condition filtering

🎯 Changes

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested this code locally with pnpm test:pr.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

@changeset-bot
Copy link

changeset-bot bot commented Dec 1, 2025

🦋 Changeset detected

Latest commit: 3805fcd

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

This PR includes changesets to release 12 packages
Name Type
@tanstack/db Patch
@tanstack/angular-db Patch
@tanstack/electric-db-collection Patch
@tanstack/offline-transactions Patch
@tanstack/powersync-db-collection Patch
@tanstack/query-db-collection Patch
@tanstack/react-db Patch
@tanstack/rxdb-db-collection Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db Patch

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
Copy link

pkg-pr-new bot commented Dec 1, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 589477f

@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

Size Change: +241 B (+0.27%)

Total Size: 89.7 kB

Filename Size Change
./packages/db/dist/esm/collection/changes.js 1.16 kB +161 B (+16.12%) ⚠️
./packages/db/dist/esm/collection/index.js 3.32 kB +80 B (+2.47%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.46 kB
./packages/db/dist/esm/collection/subscription.js 3.62 kB
./packages/db/dist/esm/collection/sync.js 2.38 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.27 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.68 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.93 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 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 733 B
./packages/db/dist/esm/query/builder/index.js 3.96 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.35 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.8 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.46 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.33 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.9 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 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 881 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 852 B
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

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

@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

Size Change: 0 B

Total Size: 3.35 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.12 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 431 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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

Copy link
Contributor

@kevin-dp kevin-dp left a comment

Choose a reason for hiding this comment

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

Nice addition. I left just one nit.


const subscription = new CollectionSubscription(this.collection, callback, {
...options,
includeInitialState: options.includeInitialState,
Copy link
Contributor

Choose a reason for hiding this comment

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

I'd rather keep ...options because spreading is more future proof in case we add new fields to the options. But i understand we want to spread all except where. Perhaps:

const { where, ...opts } = options
const subscription = new CollectionSubscription(this.collection, callback, {
  ...opts,
  whereExpression,
  ...

Copy link
Contributor

Choose a reason for hiding this comment

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

@claude please apply the fix described in my previous comment.

Copy link
Contributor

@claude claude bot Jan 7, 2026

Choose a reason for hiding this comment

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

Claude finished @kevin-dp's task in 1m 1s —— View job


Applied Kevin's suggested fix

Todo List

  • Read current implementation in packages/db/src/collection/changes.ts
  • Apply destructuring fix to make spreading more future-proof
  • Commit and push changes

Summary

I've applied the fix to use destructuring for more future-proof option spreading in packages/db/src/collection/changes.ts:113-128.

The change:

  • Destructures where from options and spreads the rest as opts
  • Spreads ...opts when creating the CollectionSubscription instead of manually listing properties
  • This ensures any future options will automatically be passed through without code changes

The commit has been pushed to the PR branch.

--- | Branch: claude/whereexpression-subscribechanges-01CAXj3xYLmTeA1ZGtxzz6Hv

claude added 4 commits January 7, 2026 11:19
Add a `where` callback option to `SubscribeChangesOptions` that allows
filtering changes using query builder functions (eq, gt, and, etc.)
with a row proxy, instead of requiring manual IR construction with
PropRef.

Before:
```ts
import { eq, PropRef } from "@tanstack/db"
collection.subscribeChanges(callback, {
  whereExpression: eq(new PropRef(["status"]), "active")
})
```

After:
```ts
import { eq } from "@tanstack/db"
collection.subscribeChanges(callback, {
  where: (row) => eq(row.status, "active")
})
```

Changes:
- Add generic `where` callback to `SubscribeChangesOptions<T>`
- Compile `where` callback to `whereExpression` in CollectionChangesManager
- Update JSDoc examples to show correct usage
- Add tests for single and multiple condition filtering
@kevin-dp kevin-dp force-pushed the claude/whereexpression-subscribechanges-01CAXj3xYLmTeA1ZGtxzz6Hv branch from 459b741 to 9225ffd Compare January 7, 2026 10:19
@kevin-dp
Copy link
Contributor

kevin-dp commented Jan 7, 2026

I rebased this branch and CI is green. I'll have Claude fix my nit and then it should be ready to go.

Co-authored-by: Kevin <kevin-dp@users.noreply.github.com>
@kevin-dp kevin-dp merged commit b1cc4a7 into main Jan 7, 2026
@kevin-dp kevin-dp deleted the claude/whereexpression-subscribechanges-01CAXj3xYLmTeA1ZGtxzz6Hv branch January 7, 2026 15:40
@github-actions github-actions bot mentioned this pull request Jan 6, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Jan 7, 2026

🎉 This PR has been released!

Thank you for your contribution!

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.

3 participants