Skip to content
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

fix(QueriesObserver): fix improper sorting in QueriesObserver's #find… #8351

Merged
merged 4 commits into from
Nov 26, 2024

Conversation

jmtoung
Copy link
Contributor

@jmtoung jmtoung commented Nov 25, 2024

…MatchingObservers method

This commit fixes a bug in the QueriesObserver's #findMatchingObservers. The bug is present when there are duplicate unsorted queries, for example, ['A', 'B', 'A']. The bug results in #findMatchingObservers to return the queries in sorted order, or ['A', 'A', 'B'], which results in a mismatch between Array and Array. This bug was introduced in 5499577

…MatchingObservers method

This commit fixes a bug in the QueriesObserver's #findMatchingObservers. The bug is present when there are duplicate unsorted queries, for example, ['A', 'B', 'A']. The bug results in #findMatchingObservers to return the queries in sorted order, or ['A', 'A', 'B'], which results in a mismatch between Array<QueryObserverOptions> and Array<QueryObserverMatch>. This bug was introduced in TanStack@5499577
Copy link

nx-cloud bot commented Nov 25, 2024

☁️ Nx Cloud Report

CI is running/has finished running commands for commit 6d34f02. As they complete they will appear below. Click to see the status, the terminal output, and the build insights.

📂 See all runs for this CI Pipeline Execution


✅ Successfully ran 2 targets

Sent with 💌 from NxCloud.

Copy link
Collaborator

@TkDodo TkDodo left a comment

Choose a reason for hiding this comment

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

Having the same key inside useQueries multiple times is not something that we support. I’m sure we have a discussion / issue about this where we mentioned this. Maybe documenting this is the better way to go.

packages/query-core/src/queriesObserver.ts Show resolved Hide resolved
@TkDodo
Copy link
Collaborator

TkDodo commented Nov 25, 2024

oh, there should even be a warning in development mode. are you not seeing that ?

Copy link

pkg-pr-new bot commented Nov 25, 2024

Open in Stackblitz

More templates

@tanstack/angular-query-devtools-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-devtools-experimental@8351

@tanstack/angular-query-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-experimental@8351

@tanstack/eslint-plugin-query

npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@8351

@tanstack/query-broadcast-client-experimental

npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@8351

@tanstack/query-core

npm i https://pkg.pr.new/@tanstack/query-core@8351

@tanstack/query-async-storage-persister

npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@8351

@tanstack/query-devtools

npm i https://pkg.pr.new/@tanstack/query-devtools@8351

@tanstack/query-persist-client-core

npm i https://pkg.pr.new/@tanstack/query-persist-client-core@8351

@tanstack/query-sync-storage-persister

npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@8351

@tanstack/react-query

npm i https://pkg.pr.new/@tanstack/react-query@8351

@tanstack/react-query-devtools

npm i https://pkg.pr.new/@tanstack/react-query-devtools@8351

@tanstack/react-query-next-experimental

npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@8351

@tanstack/react-query-persist-client

npm i https://pkg.pr.new/@tanstack/react-query-persist-client@8351

@tanstack/solid-query

npm i https://pkg.pr.new/@tanstack/solid-query@8351

@tanstack/solid-query-devtools

npm i https://pkg.pr.new/@tanstack/solid-query-devtools@8351

@tanstack/solid-query-persist-client

npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@8351

@tanstack/svelte-query

npm i https://pkg.pr.new/@tanstack/svelte-query@8351

@tanstack/svelte-query-devtools

npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@8351

@tanstack/svelte-query-persist-client

npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@8351

@tanstack/vue-query

npm i https://pkg.pr.new/@tanstack/vue-query@8351

@tanstack/vue-query-devtools

npm i https://pkg.pr.new/@tanstack/vue-query-devtools@8351

commit: 6d34f02

@jmtoung
Copy link
Contributor Author

jmtoung commented Nov 25, 2024

Having the same key inside useQueries multiple times is not something that we support. I’m sure we have a discussion / issue about this where we mentioned this. Maybe documenting this is the better way to go.

Not supporting same key is fine, but this bug was introduced by this recent change 5499577

Prior to this change, duplicate keys wouldn't result in a mismatch between input and output.

@TkDodo
Copy link
Collaborator

TkDodo commented Nov 25, 2024

Prior to this change, duplicate keys wouldn't result in a mismatch between input and output.

but “duplicate keys” and “same keys” are the same thing? Our warning even says that the behaviour is potentially unexpected.

@jmtoung
Copy link
Contributor Author

jmtoung commented Nov 25, 2024

oh, there should even be a warning in development mode. are you not seeing that ?

I am seeing the warning, but I think we should still fix it to return the correct order, even in spite of duplicate queries.

In other words, after the bug was introduced, useQueries(['A', 'B', 'A']) returns ['A', 'A', B'], whereas it should return ['A', 'B', 'A']. This bug was recently introduced here 5499577.

In that commit, we refactored things to efficiently loop over Array<QueryObserverOptions> once, but we introduced a bad sort that sorts by options.queryHash

@jmtoung
Copy link
Contributor Author

jmtoung commented Nov 25, 2024

Prior to this change, duplicate keys wouldn't result in a mismatch between input and output.

but “duplicate keys” and “same keys” are the same thing? Our warning even says that the behaviour is potentially unexpected.

Yes, the warning does warn against having duplicate/same queries, but in the event that a caller has duplicate/same queries, wouldn't we want to return the correct answer to the best of our abilities? The library used to, but only recently started to return the wrong value after this change.

Copy link

codecov bot commented Nov 26, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 62.90%. Comparing base (dfe2cd1) to head (6d34f02).
Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##             main    #8351       +/-   ##
===========================================
+ Coverage   45.97%   62.90%   +16.93%     
===========================================
  Files         200      136       -64     
  Lines        7509     4799     -2710     
  Branches     1718     1348      -370     
===========================================
- Hits         3452     3019      -433     
+ Misses       3680     1540     -2140     
+ Partials      377      240      -137     
Components Coverage Δ
@tanstack/angular-query-devtools-experimental ∅ <ø> (∅)
@tanstack/angular-query-experimental 87.13% <ø> (ø)
@tanstack/eslint-plugin-query ∅ <ø> (∅)
@tanstack/query-async-storage-persister 43.85% <ø> (ø)
@tanstack/query-broadcast-client-experimental ∅ <ø> (∅)
@tanstack/query-codemods ∅ <ø> (∅)
@tanstack/query-core 94.52% <100.00%> (+0.82%) ⬆️
@tanstack/query-devtools 4.78% <ø> (ø)
@tanstack/query-persist-client-core 57.73% <ø> (ø)
@tanstack/query-sync-storage-persister 84.61% <ø> (ø)
@tanstack/react-query 95.54% <ø> (ø)
@tanstack/react-query-devtools 10.00% <ø> (ø)
@tanstack/react-query-next-experimental ∅ <ø> (∅)
@tanstack/react-query-persist-client 100.00% <ø> (ø)
@tanstack/solid-query 78.20% <ø> (ø)
@tanstack/solid-query-devtools ∅ <ø> (∅)
@tanstack/solid-query-persist-client 100.00% <ø> (ø)
@tanstack/svelte-query 87.33% <ø> (ø)
@tanstack/svelte-query-devtools ∅ <ø> (∅)
@tanstack/svelte-query-persist-client 100.00% <ø> (ø)
@tanstack/vue-query 71.45% <ø> (ø)
@tanstack/vue-query-devtools ∅ <ø> (∅)

@TkDodo TkDodo merged commit 3b7556f into TanStack:main Nov 26, 2024
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants