Skip to content

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

Merged
adamziel merged 8 commits intomasterfrom
fix/queries-reducer-duplicating-ids
May 28, 2020
Merged

Add support for page=1 and perPage=-1 to getMergedItemIds#22707
adamziel merged 8 commits intomasterfrom
fix/queries-reducer-duplicating-ids

Conversation

@adamziel
Copy link
Copy Markdown
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
Copy Markdown

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
Copy Markdown
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.

* @return {number[]} Merged array of item IDs.
*/
export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) {
const receivedAllIds = page === 1 && perPage === -1;
Copy link
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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.

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
Copy Markdown
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?

* @return {number[]} Merged array of item IDs.
*/
export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) {
const receivedAllIds = page === 1 && perPage === -1;
Copy link
Copy Markdown
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
Copy Markdown
Contributor Author

@aduth I just addressed your notes 👍

Copy link
Copy Markdown
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