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

Add support for page=1 and perPage=-1 to getMergedItemIds #22707

Merged
merged 8 commits into from
May 28, 2020

Conversation

adamziel
Copy link
Contributor

@adamziel adamziel commented May 28, 2020

Description

getMergedItemIds() does not handle a scenario where perPage = -1 (nextItemIds are all ids from all pages). This results in the following issue:

# getMergedItemIds( [1, 2, 3], [ 1, 3 ], 1, -1 );
[1, 3, 3]

A practical consequence of this is that dispatching receiveEntityRecords with data similar to these:

{
    kind: "root",
    name: "menuItem",
    type: "RECEIVE_ITEMS",
    items: [ /*... less items than currently in the state ...*/ ],
    menus: 2,
    per_page: -1
}

Updates the state in such a way that entities.data.menuItem.queriedData.queries["menus=2"] contains duplicate entries like [1, 2, 3, 2, 3]. This in turn causes a select() call to return duplicate results.

How has this been tested?

Confirm all unit and e2e tests pass

Types of changes

Bug fix (non-breaking change which fixes an issue)

Checklist:

  • My code is tested (Tested with Navigation screen: Atomic save using customizer API endpoint #22603 but Travis is still running).
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@github-actions
Copy link

github-actions bot commented May 28, 2020

Size Change: +37 B (0%)

Total Size: 1.12 MB

Filename Size Change
build/block-library/editor-rtl.css 7.21 kB +7 B (0%)
build/block-library/editor.css 7.21 kB +6 B (0%)
build/block-library/index.js 119 kB +12 B (0%)
build/core-data/index.js 11.4 kB +12 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.62 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.83 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 6.48 kB 0 B
build/block-directory/style-rtl.css 788 B 0 B
build/block-directory/style.css 788 B 0 B
build/block-editor/index.js 105 kB 0 B
build/block-editor/style-rtl.css 11 kB 0 B
build/block-editor/style.css 11 kB 0 B
build/block-library/style-rtl.css 7.68 kB 0 B
build/block-library/style.css 7.68 kB 0 B
build/block-library/theme-rtl.css 684 B 0 B
build/block-library/theme.css 686 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.1 kB 0 B
build/components/index.js 190 kB 0 B
build/components/style-rtl.css 17.1 kB 0 B
build/components/style.css 17.1 kB 0 B
build/compose/index.js 9.31 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.42 kB 0 B
build/date/index.js 5.47 kB 0 B
build/deprecated/index.js 771 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.11 kB 0 B
build/edit-navigation/index.js 6.62 kB 0 B
build/edit-navigation/style-rtl.css 857 B 0 B
build/edit-navigation/style.css 856 B 0 B
build/edit-post/index.js 302 kB 0 B
build/edit-post/style-rtl.css 12.2 kB 0 B
build/edit-post/style.css 12.2 kB 0 B
build/edit-site/index.js 14 kB 0 B
build/edit-site/style-rtl.css 5.52 kB 0 B
build/edit-site/style.css 5.53 kB 0 B
build/edit-widgets/index.js 8.05 kB 0 B
build/edit-widgets/style-rtl.css 4.59 kB 0 B
build/edit-widgets/style.css 4.59 kB 0 B
build/editor/editor-styles-rtl.css 425 B 0 B
build/editor/editor-styles.css 428 B 0 B
build/editor/index.js 44.6 kB 0 B
build/editor/style-rtl.css 5.06 kB 0 B
build/editor/style.css 5.06 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.71 kB 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.51 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 5.29 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 14.8 kB 0 B
build/server-side-render/index.js 2.68 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.02 kB 0 B
build/viewport/index.js 1.84 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

@adamziel adamziel marked this pull request as ready for review May 28, 2020 14:02
@adamziel adamziel marked this pull request as draft May 28, 2020 14:02
@adamziel adamziel self-assigned this May 28, 2020
@adamziel adamziel added the [Package] Core data /packages/core-data label May 28, 2020
@adamziel adamziel force-pushed the fix/queries-reducer-duplicating-ids branch from f62448c to df6e43b Compare May 28, 2020 14:03
@adamziel adamziel changed the title Add support page=1 and perPage=-1 to getMergedItemIds Add support for page=1 and perPage=-1 to getMergedItemIds May 28, 2020
@adamziel adamziel marked this pull request as ready for review May 28, 2020 14:28
Copy link
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

It gets a bit strange to consider, since technically -1 is not a valid value for the per_page parameter. The support is added externally via apiFetch fetchAllMiddleware middleware. I guess it's fair to consider this support consistently across packages, despite not being supported by the REST endpoints themselves.

@@ -32,6 +32,7 @@ import getQueryParts from './get-query-parts';
* @return {number[]} Merged array of item IDs.
*/
export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) {
const receivedAllIds = page === 1 && perPage === -1;
Copy link
Member

@aduth aduth May 28, 2020

Choose a reason for hiding this comment

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

Isn't it the case that the entire function can be short-circuited if this is true?

Suggested change
const receivedAllIds = page === 1 && perPage === -1;
const receivedAllIds = page === 1 && perPage === -1;
if ( receivedAllIds ) {
return nextItemIds;
}

Copy link
Contributor Author

@adamziel adamziel May 28, 2020

Choose a reason for hiding this comment

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

It is! In fact that's also how my initial attempt looked like. It's just the result is would no longer be "sparse-like" as it normally is - it works for me if it works for you though :-) I just updated the PR accordingly.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Actually I'm wrong, the result will be exactly the same, maybe except for the fact that now it returns the original object instead of a new one.

Copy link
Contributor Author

@adamziel adamziel May 28, 2020

Choose a reason for hiding this comment

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

I just updated it to return a copy instead of the original list to maintain the consistency with the other code branch.

Copy link
Member

Choose a reason for hiding this comment

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

Personally I don't think it matters too much if it returns a copy, since the function doesn't really assert one way or the other, and in most cases throughout the code, we encourage to avoid object mutation and make no guarantees about behaviors (or misbehaviors) when mutation is performed.

@@ -45,7 +49,6 @@ export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) {
const mergedItemIds = new Array( size );

for ( let i = 0; i < size; i++ ) {
// Preserve existing item ID except for subset of range of next items.
Copy link
Member

Choose a reason for hiding this comment

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

If the comment still applies, can it be left intact?

@@ -32,6 +32,7 @@ import getQueryParts from './get-query-parts';
* @return {number[]} Merged array of item IDs.
*/
export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) {
const receivedAllIds = page === 1 && perPage === -1;
Copy link
Member

Choose a reason for hiding this comment

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

Personally I don't think it matters too much if it returns a copy, since the function doesn't really assert one way or the other, and in most cases throughout the code, we encourage to avoid object mutation and make no guarantees about behaviors (or misbehaviors) when mutation is performed.

@adamziel
Copy link
Contributor Author

@aduth I just addressed your notes 👍

Copy link
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

Looks good 👍

@adamziel adamziel merged commit 5550a60 into master May 28, 2020
@adamziel adamziel deleted the fix/queries-reducer-duplicating-ids branch May 28, 2020 17:48
@github-actions github-actions bot added this to the Gutenberg 8.3 milestone May 28, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Core data /packages/core-data
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants