From 9eef9c9db478831a4d427a8d9bbf1c348fb1b19f Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Thu, 12 May 2022 21:32:44 -0400 Subject: [PATCH] fix(elasticSearch): do not define pageCursor on last page Signed-off-by: Phil Kuang --- .changeset/pretty-hornets-listen.md | 5 +++ .../engines/ElasticSearchSearchEngine.test.ts | 44 +++++++++++++++++++ .../src/engines/ElasticSearchSearchEngine.ts | 2 +- 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 .changeset/pretty-hornets-listen.md diff --git a/.changeset/pretty-hornets-listen.md b/.changeset/pretty-hornets-listen.md new file mode 100644 index 0000000000..6e0701e617 --- /dev/null +++ b/.changeset/pretty-hornets-listen.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-elasticsearch': patch +--- + +Fix issue where `nextPageCursor` is defined on the last page of results diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts index 134de5a9f6..24ceec2875 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.test.ts @@ -438,6 +438,50 @@ describe('ElasticSearchSearchEngine', () => { }); }); + it('should perform search query with less results than one page', async () => { + mock.clear({ + method: 'POST', + path: '/*__search/_search', + }); + mock.add( + { + method: 'POST', + path: '/*__search/_search', + }, + () => { + return { + hits: { + total: { value: 20, relation: 'eq' }, + hits: Array(20) + .fill(null) + .map((_, i) => ({ + _index: 'mytype-index__', + _source: { + value: `${i}`, + }, + })), + }, + }; + }, + ); + + const mockedSearchResult = await testSearchEngine.query({ + term: 'testTerm', + filters: {}, + }); + + expect(mockedSearchResult).toMatchObject({ + results: expect.arrayContaining( + Array(20) + .fill(null) + .map((_, i) => ({ + type: 'mytype', + document: { value: `${i}` }, + })), + ), + }); + }); + it('should perform search query with more results than one page', async () => { mock.clear({ method: 'POST', diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index 5ec33a95e3..00c25905c3 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -268,7 +268,7 @@ export class ElasticSearchSearchEngine implements SearchEngine { body: elasticSearchQuery, }); const { page } = decodePageCursor(query.pageCursor); - const hasNextPage = result.body.hits.total.value > page * pageSize; + const hasNextPage = result.body.hits.total.value > (page + 1) * pageSize; const hasPreviousPage = page > 0; const nextPageCursor = hasNextPage ? encodePageCursor({ page: page + 1 })