diff --git a/packages/core-data/src/queried-data/get-query-parts.js b/packages/core-data/src/queried-data/get-query-parts.js index ad6ed09792c00..9b54bd4c7cfa2 100644 --- a/packages/core-data/src/queried-data/get-query-parts.js +++ b/packages/core-data/src/queried-data/get-query-parts.js @@ -48,7 +48,7 @@ export function getQueryParts( query ) { for ( let i = 0; i < keys.length; i++ ) { const key = keys[ i ]; - const value = query[ key ]; + let value = query[ key ]; switch ( key ) { case 'page': @@ -73,6 +73,8 @@ export function getQueryParts( query ) { // Example: Asking for titles in posts without title support. if ( key === '_fields' ) { parts.fields = getNormalizedCommaSeparable( value ); + // Make sure to normalize value for `stableKey` + value = parts.fields.join(); } // While it could be any deterministic string, for simplicity's diff --git a/packages/core-data/src/queried-data/test/get-query-parts.js b/packages/core-data/src/queried-data/test/get-query-parts.js index 9390c1b36ac16..156e18c995cc4 100644 --- a/packages/core-data/src/queried-data/test/get-query-parts.js +++ b/packages/core-data/src/queried-data/test/get-query-parts.js @@ -79,4 +79,16 @@ describe( 'getQueryParts', () => { include: null, } ); } ); + + it( 'encodes stable string key with fields parameters', () => { + const parts = getQueryParts( { _fields: [ 'id', 'title' ] } ); + + expect( parts ).toEqual( { + page: 1, + perPage: 10, + stableKey: '_fields=id%2Ctitle', + fields: [ 'id', 'title' ], + include: null, + } ); + } ); } ); diff --git a/packages/core-data/src/queried-data/test/selectors.js b/packages/core-data/src/queried-data/test/selectors.js index f9aa52e1176ca..76dec520a7358 100644 --- a/packages/core-data/src/queried-data/test/selectors.js +++ b/packages/core-data/src/queried-data/test/selectors.js @@ -94,7 +94,7 @@ describe( 'getQueriedItems', () => { 2: true, }, queries: { - '_fields%5B0%5D=content': [ 1, 2 ], + '_fields=content': [ 1, 2 ], }, }; @@ -133,7 +133,7 @@ describe( 'getQueriedItems', () => { 2: true, }, queries: { - '_fields%5B0%5D=content&_fields%5B1%5D=meta.template': [ 1, 2 ], + '_fields=content%2Cmeta.template': [ 1, 2 ], }, }; diff --git a/packages/core-data/src/test/selectors.js b/packages/core-data/src/test/selectors.js index 0ec684a21d33d..f0350af96e2b7 100644 --- a/packages/core-data/src/test/selectors.js +++ b/packages/core-data/src/test/selectors.js @@ -248,6 +248,39 @@ describe( 'getEntityRecords', () => { ] ); } ); + it( 'should return filtered items', () => { + const state = deepFreeze( { + entities: { + data: { + postType: { + post: { + queriedData: { + items: { + 1: { + id: 1, + content: 'chicken', + author: 'bob', + }, + }, + itemIsComplete: { + 1: true, + }, + queries: { + '_fields=id%2Ccontent': [ 1 ], + }, + }, + }, + }, + }, + }, + } ); + expect( + getEntityRecords( state, 'postType', 'post', { + _fields: [ 'id', 'content' ], + } ) + ).toEqual( [ { id: 1, content: 'chicken' } ] ); + } ); + it( 'should return the same instance with the same arguments', () => { let state = deepFreeze( { entities: {