Skip to content

Enable auto-indexing for nested field paths - #728

Merged
KyleAMathews merged 4 commits into
mainfrom
claude/fix-issue-727-011CUc2REsYmG5e6RfmPDCdY
Oct 31, 2025
Merged

Enable auto-indexing for nested field paths#728
KyleAMathews merged 4 commits into
mainfrom
claude/fix-issue-727-011CUc2REsYmG5e6RfmPDCdY

Conversation

@KyleAMathews

Copy link
Copy Markdown
Collaborator

This fix allows auto-indexes to be created for nested field paths (e.g., profile.score, metadata.stats.views), not just top-level fields. This resolves performance issues where queries with eq(), gt(), etc. on nested fields were forced to do full table scans instead of using indexes.

Changes:

  • Remove the fieldPath.length !== 1 restriction in extractIndexableExpressions()
  • Update ensureIndexForField() to properly traverse nested paths when creating index accessors
  • Add comprehensive tests for nested path auto-indexing with 1, 2, and 3-level nesting
  • Verify that nested path indexes are properly used by the query optimizer

Fixes#727

🤖 Generated with Claude Code

🎯 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).

This fix allows auto-indexes to be created for nested field paths
(e.g., `profile.score`, `metadata.stats.views`), not just top-level
fields. This resolves performance issues where queries with `eq()`,
`gt()`, etc. on nested fields were forced to do full table scans
instead of using indexes.
Changes:
- Remove the `fieldPath.length !== 1` restriction in `extractIndexableExpressions()`
- Update `ensureIndexForField()` to properly traverse nested paths when creating index accessors
- Add comprehensive tests for nested path auto-indexing with 1, 2, and 3-level nesting
- Verify that nested path indexes are properly used by the query optimizer
Fixes#727
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Oct 29, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f44b33a

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

This PR includes changesets to release 12 packages
NameType
@tanstack/dbPatch
@tanstack/angular-dbPatch
@tanstack/electric-db-collectionPatch
@tanstack/query-db-collectionPatch
@tanstack/react-dbPatch
@tanstack/rxdb-db-collectionPatch
@tanstack/solid-dbPatch
@tanstack/svelte-dbPatch
@tanstack/trailbase-db-collectionPatch
@tanstack/vue-dbPatch
todosPatch
@tanstack/db-example-react-todoPatch

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 Oct 29, 2025

Copy link
Copy Markdown
More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: f44b33a

@github-actions

github-actionsBot commented Oct 29, 2025

Copy link
Copy Markdown
Contributor

Size Change: +63 B (+0.07%)

Total Size: 84.5 kB

FilenameSizeChange
./packages/db/dist/esm/indexes/auto-index.js857 B+63 B (+7.93%)🔍
ℹ️ View Unchanged
FilenameSize
./packages/db/dist/esm/collection/change-events.js1.63 kB
./packages/db/dist/esm/collection/changes.js1.01 kB
./packages/db/dist/esm/collection/events.js413 B
./packages/db/dist/esm/collection/index.js3.23 kB
./packages/db/dist/esm/collection/indexes.js1.16 kB
./packages/db/dist/esm/collection/lifecycle.js1.8 kB
./packages/db/dist/esm/collection/mutations.js2.52 kB
./packages/db/dist/esm/collection/state.js3.8 kB
./packages/db/dist/esm/collection/subscription.js2.2 kB
./packages/db/dist/esm/collection/sync.js2.2 kB
./packages/db/dist/esm/deferred.js230 B
./packages/db/dist/esm/errors.js3.48 kB
./packages/db/dist/esm/event-emitter.js798 B
./packages/db/dist/esm/index.js1.62 kB
./packages/db/dist/esm/indexes/base-index.js835 B
./packages/db/dist/esm/indexes/btree-index.js2 kB
./packages/db/dist/esm/indexes/lazy-index.js1.21 kB
./packages/db/dist/esm/indexes/reverse-index.js577 B
./packages/db/dist/esm/local-only.js967 B
./packages/db/dist/esm/local-storage.js2.42 kB
./packages/db/dist/esm/optimistic-action.js294 B
./packages/db/dist/esm/proxy.js3.86 kB
./packages/db/dist/esm/query/builder/functions.js615 B
./packages/db/dist/esm/query/builder/index.js4.04 kB
./packages/db/dist/esm/query/builder/ref-proxy.js938 B
./packages/db/dist/esm/query/compiler/evaluators.js1.55 kB
./packages/db/dist/esm/query/compiler/expressions.js760 B
./packages/db/dist/esm/query/compiler/group-by.js2.04 kB
./packages/db/dist/esm/query/compiler/index.js2.21 kB
./packages/db/dist/esm/query/compiler/joins.js2.65 kB
./packages/db/dist/esm/query/compiler/order-by.js1.43 kB
./packages/db/dist/esm/query/compiler/select.js1.28 kB
./packages/db/dist/esm/query/ir.js785 B
./packages/db/dist/esm/query/live-query-collection.js404 B
./packages/db/dist/esm/query/live/collection-config-builder.js5.54 kB
./packages/db/dist/esm/query/live/collection-registry.js233 B
./packages/db/dist/esm/query/live/collection-subscriber.js2.11 kB
./packages/db/dist/esm/query/optimizer.js3.33 kB
./packages/db/dist/esm/scheduler.js1.29 kB
./packages/db/dist/esm/SortedMap.js1.24 kB
./packages/db/dist/esm/transactions.js3.05 kB
./packages/db/dist/esm/utils.js1.01 kB
./packages/db/dist/esm/utils/browser-polyfills.js365 B
./packages/db/dist/esm/utils/btree.js6.01 kB
./packages/db/dist/esm/utils/comparison.js754 B
./packages/db/dist/esm/utils/index-optimization.js1.73 kB

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

@github-actions

github-actionsBot commented Oct 29, 2025

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 2.89 kB

ℹ️ View Unchanged
FilenameSize
./packages/react-db/dist/esm/index.js168 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js1.41 kB
./packages/react-db/dist/esm/useLiveQuery.js1.31 kB

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

@samwillissamwillis left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Looks good except for the naming of the auto indexes - that plus a changeset and it will be good to merge.

return current
},
{
name: `auto_${fieldPath.join(`_`)}`,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I'm not sure I like the naming of the index by replacing of the periods with underscores. It could product a conflict.

Maybe these automatic indexes should be named "auto:path.to.field" - no chance of a conflict.

claudeand others added 2 commits October 31, 2025 12:46
Change auto-index naming from 'auto_field_path' to 'auto:field.path'
to prevent ambiguity between nested paths and fields with underscores.
Examples:
- user.profile -> auto:user.profile
- user_profile -> auto:user_profile
(no conflict!)
Co-authored-by: Sam Willis <sam.willis@gmail.com>
@KyleAMathewsKyleAMathews changed the title Fix GitHub issue #727 in TanStack DBEnable auto-indexing for nested field pathsOct 31, 2025
@KyleAMathews
KyleAMathews merged commit 979a66f into mainOct 31, 2025
6 checks passed
@KyleAMathews
KyleAMathews deleted the claude/fix-issue-727-011CUc2REsYmG5e6RfmPDCdY branch October 31, 2025 12:59
@github-actionsgithub-actionsBot mentioned this pull request Oct 31, 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

None yet

Development

Successfully merging this pull request may close these issues.

Auto-index not used for simple eq(date) / eq(dispatchId) filters → heavy “graph run” time on param change

3 participants

@KyleAMathews@samwillis@claude