From 65690a675c17cfacebe775a327a57741ac09416a Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 11 Apr 2024 15:37:19 -0400 Subject: [PATCH] fix(db-postgres): relationship query pagination (#5802) --- packages/db-postgres/src/find/findMany.ts | 2 +- test/collections-rest/int.spec.ts | 180 +++++++++++++++++++--- 2 files changed, 162 insertions(+), 20 deletions(-) diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/db-postgres/src/find/findMany.ts index 48b2b678e4..5aebd8e216 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/db-postgres/src/find/findMany.ts @@ -120,7 +120,7 @@ export const findMany = async function find({ const findPromise = db.query[tableName].findMany(findManyArgs) - if (pagination !== false && (orderedIDs ? orderedIDs?.length >= limit : true)) { + if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) { const selectCountMethods: ChainedMethods = [] joinAliases.forEach(({ condition, table }) => { diff --git a/test/collections-rest/int.spec.ts b/test/collections-rest/int.spec.ts index 79aab12899..4c06345b17 100644 --- a/test/collections-rest/int.spec.ts +++ b/test/collections-rest/int.spec.ts @@ -1191,40 +1191,182 @@ describe('collections-rest', () => { expect(result.docs).toEqual([post1]) }) - describe('limit', () => { + describe('pagination', () => { + let relatedDoc + beforeEach(async () => { - await mapAsync([...Array(50)], async (_, i) => - createPost({ number: i, title: 'limit-test' }), - ) + relatedDoc = await payload.create({ + collection: relationSlug, + data: { + name: 'test', + }, + }) + await mapAsync([...Array(10)], async (_, i) => { + await createPost({ + number: i, + relationField: relatedDoc.id as string, + title: 'paginate-test', + }) + }) }) - it('should query a limited set of docs', async () => { - const { result, status } = await client.find({ - limit: 15, + it('should paginate with where query', async () => { + const { result: page1 } = await client.find({ + limit: 4, query: { title: { - equals: 'limit-test', + equals: 'paginate-test', }, }, }) - expect(status).toEqual(200) - expect(result.docs).toHaveLength(15) - }) - - it('should query all docs when limit=0', async () => { - const { result, status } = await client.find({ - limit: 0, + const { result: page2 } = await client.find({ + limit: 4, + page: 2, query: { title: { - equals: 'limit-test', + equals: 'paginate-test', }, }, }) - expect(status).toEqual(200) - expect(result.docs).toHaveLength(50) - expect(result.totalPages).toEqual(1) + const { result: page3 } = await client.find({ + limit: 4, + page: 3, + query: { + title: { + equals: 'paginate-test', + }, + }, + }) + + expect(page1.hasNextPage).toStrictEqual(true) + expect(page1.hasPrevPage).toStrictEqual(false) + expect(page1.limit).toStrictEqual(4) + expect(page1.nextPage).toStrictEqual(2) + expect(page1.page).toStrictEqual(1) + expect(page1.pagingCounter).toStrictEqual(1) + expect(page1.prevPage).toStrictEqual(null) + expect(page1.totalDocs).toStrictEqual(10) + expect(page1.totalPages).toStrictEqual(3) + + expect(page2.hasNextPage).toStrictEqual(true) + expect(page2.hasPrevPage).toStrictEqual(true) + expect(page2.limit).toStrictEqual(4) + expect(page2.nextPage).toStrictEqual(3) + expect(page2.page).toStrictEqual(2) + expect(page2.pagingCounter).toStrictEqual(5) + expect(page2.prevPage).toStrictEqual(1) + expect(page2.totalDocs).toStrictEqual(10) + expect(page2.totalPages).toStrictEqual(3) + + expect(page3.hasNextPage).toStrictEqual(false) + expect(page3.hasPrevPage).toStrictEqual(true) + expect(page3.limit).toStrictEqual(4) + expect(page3.nextPage).toStrictEqual(null) + expect(page3.page).toStrictEqual(3) + expect(page3.pagingCounter).toStrictEqual(9) + expect(page3.prevPage).toStrictEqual(2) + expect(page3.totalDocs).toStrictEqual(10) + expect(page3.totalPages).toStrictEqual(3) + }) + + it('should paginate with where query on relationships', async () => { + const { result: page1 } = await client.find({ + limit: 4, + query: { + relationField: { + equals: relatedDoc.id, + }, + }, + }) + + const { result: page2 } = await client.find({ + limit: 4, + page: 2, + query: { + relationField: { + equals: relatedDoc.id, + }, + }, + }) + + const { result: page3 } = await client.find({ + limit: 4, + page: 3, + query: { + relationField: { + equals: relatedDoc.id, + }, + }, + }) + + expect(page1.hasNextPage).toStrictEqual(true) + expect(page1.hasPrevPage).toStrictEqual(false) + expect(page1.limit).toStrictEqual(4) + expect(page1.nextPage).toStrictEqual(2) + expect(page1.page).toStrictEqual(1) + expect(page1.pagingCounter).toStrictEqual(1) + expect(page1.prevPage).toStrictEqual(null) + expect(page1.totalDocs).toStrictEqual(10) + expect(page1.totalPages).toStrictEqual(3) + + expect(page2.hasNextPage).toStrictEqual(true) + expect(page2.hasPrevPage).toStrictEqual(true) + expect(page2.limit).toStrictEqual(4) + expect(page2.nextPage).toStrictEqual(3) + expect(page2.page).toStrictEqual(2) + expect(page2.pagingCounter).toStrictEqual(5) + expect(page2.prevPage).toStrictEqual(1) + expect(page2.totalDocs).toStrictEqual(10) + expect(page2.totalPages).toStrictEqual(3) + + expect(page3.hasNextPage).toStrictEqual(false) + expect(page3.hasPrevPage).toStrictEqual(true) + expect(page3.limit).toStrictEqual(4) + expect(page3.nextPage).toStrictEqual(null) + expect(page3.page).toStrictEqual(3) + expect(page3.pagingCounter).toStrictEqual(9) + expect(page3.prevPage).toStrictEqual(2) + expect(page3.totalDocs).toStrictEqual(10) + expect(page3.totalPages).toStrictEqual(3) + }) + + describe('limit', () => { + beforeEach(async () => { + await mapAsync([...Array(50)], async (_, i) => + createPost({ number: i, title: 'limit-test' }), + ) + }) + + it('should query a limited set of docs', async () => { + const { result, status } = await client.find({ + limit: 15, + query: { + title: { + equals: 'limit-test', + }, + }, + }) + + expect(status).toStrictEqual(200) + expect(result.docs).toHaveLength(15) + }) + + it('should query all docs when limit=0', async () => { + const { result, status } = await client.find({ + limit: 0, + query: { + title: { + equals: 'limit-test', + }, + }, + }) + + expect(status).toStrictEqual(200) + expect(result.docs).toHaveLength(50) + expect(result.totalPages).toStrictEqual(1) + }) }) })