Skip to content

Conversation

samwillis
Copy link
Collaborator

This removes all the additional state that was needed for each of the composed joins, and the need for the consolidate step. Delivers a father 50% speedup over the index refactor PR #549 this is stacked on.

Copy link

changeset-bot bot commented Sep 19, 2025

🦋 Changeset detected

Latest commit: 525621b

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

This PR includes changesets to release 13 packages
Name Type
@tanstack/db-ivm Patch
@tanstack/db Patch
@tanstack/angular-db Patch
@tanstack/electric-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
todos Patch
@tanstack/db-example-react-todo 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

Copy link

pkg-pr-new bot commented Sep 19, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 525621b

Copy link
Contributor

github-actions bot commented Sep 19, 2025

Size Change: -16 B (-0.02%)

Total Size: 76.9 kB

Filename Size Change
./packages/db/dist/esm/query/compiler/joins.js 2.5 kB -16 B (-0.63%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 963 B
./packages/db/dist/esm/collection/changes.js 1.01 kB
./packages/db/dist/esm/collection/events.js 660 B
./packages/db/dist/esm/collection/index.js 3.31 kB
./packages/db/dist/esm/collection/indexes.js 1.16 kB
./packages/db/dist/esm/collection/lifecycle.js 1.8 kB
./packages/db/dist/esm/collection/mutations.js 2.52 kB
./packages/db/dist/esm/collection/state.js 3.79 kB
./packages/db/dist/esm/collection/subscription.js 1.83 kB
./packages/db/dist/esm/collection/sync.js 1.68 kB
./packages/db/dist/esm/deferred.js 230 B
./packages/db/dist/esm/errors.js 3.1 kB
./packages/db/dist/esm/index.js 1.58 kB
./packages/db/dist/esm/indexes/auto-index.js 794 B
./packages/db/dist/esm/indexes/base-index.js 835 B
./packages/db/dist/esm/indexes/btree-index.js 2 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.21 kB
./packages/db/dist/esm/indexes/reverse-index.js 577 B
./packages/db/dist/esm/local-only.js 967 B
./packages/db/dist/esm/local-storage.js 2.33 kB
./packages/db/dist/esm/optimistic-action.js 294 B
./packages/db/dist/esm/proxy.js 3.86 kB
./packages/db/dist/esm/query/builder/functions.js 615 B
./packages/db/dist/esm/query/builder/index.js 4.04 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 938 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.55 kB
./packages/db/dist/esm/query/compiler/expressions.js 760 B
./packages/db/dist/esm/query/compiler/group-by.js 2.04 kB
./packages/db/dist/esm/query/compiler/index.js 2.04 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.21 kB
./packages/db/dist/esm/query/compiler/select.js 1.28 kB
./packages/db/dist/esm/query/ir.js 785 B
./packages/db/dist/esm/query/live-query-collection.js 340 B
./packages/db/dist/esm/query/live/collection-config-builder.js 3.03 kB
./packages/db/dist/esm/query/live/collection-subscriber.js 1.92 kB
./packages/db/dist/esm/query/optimizer.js 3.26 kB
./packages/db/dist/esm/SortedMap.js 1.24 kB
./packages/db/dist/esm/transactions.js 3 kB
./packages/db/dist/esm/utils.js 1.01 kB
./packages/db/dist/esm/utils/browser-polyfills.js 365 B
./packages/db/dist/esm/utils/btree.js 6.01 kB
./packages/db/dist/esm/utils/comparison.js 754 B
./packages/db/dist/esm/utils/index-optimization.js 1.73 kB

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

Copy link
Contributor

github-actions bot commented Sep 19, 2025

Size Change: 0 B

Total Size: 1.46 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 152 B
./packages/react-db/dist/esm/useLiveQuery.js 1.31 kB

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

if (multiplicity !== 0) {
results.add(
[key, [value, null]],
retract ? -multiplicity : +multiplicity
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't get the retract logic. If the key used to have multiplicity 0, then retract is true so we will add the new change to the index but with its negated multiplicity, why?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I've improved the comments and naming to try and explain this better, it's not really retraction, it that we are transitioning from not having any matches, to having matches, and so we need to send a retraction of the old row, with its old multiplicity so that the new rows can be sent.

const after = before + deltaMass

// Skip if presence doesn't flip (0->0, >0->different>0)
if ((before === 0) === (after === 0)) continue
Copy link
Contributor

Choose a reason for hiding this comment

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

Even if the presence doesn't flip, don't we need to update the indexes/mass index ?
Say, that before is 5 and the new delta has multiplicity -3. Then after is 2. So it is still visible and this won't update the index so in the index the key will still have multiplicity 5. Next time, if it receives a multiplicity of -3 the key will still not flip (even though it should at this point!) because it thinks the multiplicity is 5. This looks wrong to me?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Updating the multiplicity in the indexes happens regardless of this section of code, at the end of run().

Base automatically changed from samwillis/ivm-prefix-index to main September 23, 2025 13:48
@KyleAMathews KyleAMathews moved this to Todo in 1.0.0 release Sep 30, 2025
@samwillis samwillis force-pushed the samwillis/join-refactor branch from d7d8b48 to 7c52d67 Compare October 10, 2025 12:04
@samwillis samwillis force-pushed the samwillis/join-refactor branch from 7c52d67 to 9999958 Compare October 10, 2025 12:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants