-
Notifications
You must be signed in to change notification settings - Fork 6
feat: subscribeChanges #30
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
base: main
Are you sure you want to change the base?
Conversation
|
commit: |
} else if (!prevDerivedState.has(key) && derivedState.has(key)) { | ||
changes.push({ type: `insert`, key, value: derivedState.get(key)! }) | ||
} else if (prevDerivedState.has(key) && derivedState.has(key)) { | ||
// Check if the value has changed and only emit a change if it has |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd say it's the collections job to figure out if something has changed. Deep equality is pretty fast but not that fast and it should be far more efficient for someone else to do it. So I'd remove all this checking code and just push out the updates.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we remove this check the tests fail, we get an insert and then two updates, when it should just be an insert.
When doing an inserting transaction we are somewhere triggering optimisticOperations
to be derived three times. That causes derivedState
and derivedChanges
to then be run three times.
I would only expect this to be triggered once.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh I was reacting to the code below:
// TODO: Better way to do this? deep equality?
const prevValue = JSON.stringify(prevDerivedState.get(key))
const newValue = JSON.stringify(derivedState.get(key))
if (prevValue !== newValue) {
Is this check necessary?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But sounds like this is a bug somewhere else?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, removing the JSON.stringify
check that the two values have changed results in the test failing.
I'm suspicious something else is triggering excessive recomputations.
This adds a few public APIs:
collection.derivedChanges
is a tanstack/storeDerived
state, it is replaced with the latest changes (insert/update/delete) each time the derived state changes. This can be used inside anEffect
along with other collections to essentially subscribe to a set of charges across the collections. This will be the foundation of the IVM queries.collection.currentStateAsChanges
returns the current state as a set of inserts. It's needed to bootstrap the initial state of a query.collection.subscribeChanges
is a thin wrapper of the above as a higher level public api