From 2facc32de0877dd549cecaf4e58a6a20c62444ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:51:46 +0900 Subject: [PATCH 1/7] feat: Add mongodb multiple sort --- .../db-mongodb/src/queries/buildSortParam.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/db-mongodb/src/queries/buildSortParam.ts b/packages/db-mongodb/src/queries/buildSortParam.ts index 2503e659f73..ef890b1c354 100644 --- a/packages/db-mongodb/src/queries/buildSortParam.ts +++ b/packages/db-mongodb/src/queries/buildSortParam.ts @@ -28,6 +28,27 @@ export const buildSortParam = ({ }: Args): PaginateOptions['sort'] => { let sortProperty: string let sortDirection: SortDirection = 'desc' + const isSortMultipleField = sort.includes(' ') ?? false + + if (isSortMultipleField) { + const sortFields = sort.split(' ') + return sortFields.reduce((acc, sortField) => { + const isDesc = sortField.indexOf('-') === 0 + let currentSortProperty = sortField.replace(/^-/, '') + + if (currentSortProperty === 'id') { + currentSortProperty = '_id' + } else { + currentSortProperty = getLocalizedSortProperty({ + config, + fields, + locale, + segments: currentSortProperty.split('.'), + }) + } + return [...acc, `${isDesc ? '-' : ''}${currentSortProperty}`] + }, []) + } if (!sort) { if (timestamps) { From 3a45cd6176df823096c541749270d91e96a457d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:51:49 +0900 Subject: [PATCH 2/7] WIP: Add multiple params for postgres --- packages/db-postgres/src/find/findMany.ts | 6 +- .../db-postgres/src/queries/buildQuery.ts | 75 +++++++++---------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/db-postgres/src/find/findMany.ts index 41ce010ff8d..29c796e01f9 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/db-postgres/src/find/findMany.ts @@ -55,9 +55,9 @@ export const findMany = async function find({ const selectDistinctMethods: ChainedMethods = [] - if (orderBy?.order && orderBy?.column) { + if (orderBy.length) { selectDistinctMethods.push({ - args: [orderBy.order(orderBy.column)], + args: orderBy.map(({ column, order }) => order(column)), method: 'orderBy', }) } @@ -115,7 +115,7 @@ export const findMany = async function find({ if (where) { findManyArgs.where = where } - findManyArgs.orderBy = orderBy.order(orderBy.column) + findManyArgs.orderBy = orderBy.map(({ column, order }) => order(column)) } const findPromise = db.query[tableName].findMany(findManyArgs) diff --git a/packages/db-postgres/src/queries/buildQuery.ts b/packages/db-postgres/src/queries/buildQuery.ts index 4cc21a50b1c..ee4990e12c0 100644 --- a/packages/db-postgres/src/queries/buildQuery.ts +++ b/packages/db-postgres/src/queries/buildQuery.ts @@ -31,7 +31,7 @@ type Result = { orderBy: { column: GenericColumn order: typeof asc | typeof desc - } + }[] selectFields: Record where: SQL } @@ -49,54 +49,53 @@ const buildQuery = async function buildQuery({ const joins: BuildQueryJoins = {} const joinAliases: BuildQueryJoinAliases = [] - const orderBy: Result['orderBy'] = { - column: null, - order: null, - } + let orderBy: Result['orderBy'] = [] if (sort) { - let sortPath - - if (sort[0] === '-') { - sortPath = sort.substring(1) - orderBy.order = desc - } else { - sortPath = sort - orderBy.order = asc - } - - try { - const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ - adapter, - collectionPath: sortPath, - fields, - joinAliases, - joins, - locale, - pathSegments: sortPath.replace(/__/g, '.').split('.'), - selectFields, - tableName, - value: sortPath, - }) - orderBy.column = sortTable?.[sortTableColumnName] - } catch (err) { - // continue - } + orderBy = sort.split(' ').map((sortString) => { + const sortPath = sortString.replace(/^-/, '') + try { + const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ + adapter, + collectionPath: sortPath, + fields, + joinAliases, + joins, + locale, + pathSegments: sortPath.replace(/__/g, '.').split('.'), + selectFields, + tableName, + value: sortPath, + }) + return { + order: sortString[0] === '-' ? desc : asc, + column: sortTable?.[sortTableColumnName] ?? null, + } + } catch (err) { + // continue + } + }) } - if (!orderBy?.column) { - orderBy.order = desc + if (!orderBy.length) { + const firstOrderBy = { + column: null, + order: null, + } + firstOrderBy.order = desc const createdAt = adapter.tables[tableName]?.createdAt if (createdAt) { - orderBy.column = createdAt + firstOrderBy.column = createdAt } else { - orderBy.column = adapter.tables[tableName].id + firstOrderBy.column = adapter.tables[tableName].id } + + orderBy = [firstOrderBy] } - if (orderBy.column) { - selectFields.sort = orderBy.column + if (orderBy.length) { + selectFields.sort = orderBy[0].column } let where: SQL From 8d1c70959f1dceaa7393d94162c046dd312ce468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:51:52 +0900 Subject: [PATCH 3/7] chore: Delete unused nullish operator --- packages/db-mongodb/src/queries/buildSortParam.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/db-mongodb/src/queries/buildSortParam.ts b/packages/db-mongodb/src/queries/buildSortParam.ts index ef890b1c354..33c8cb5f821 100644 --- a/packages/db-mongodb/src/queries/buildSortParam.ts +++ b/packages/db-mongodb/src/queries/buildSortParam.ts @@ -28,7 +28,7 @@ export const buildSortParam = ({ }: Args): PaginateOptions['sort'] => { let sortProperty: string let sortDirection: SortDirection = 'desc' - const isSortMultipleField = sort.includes(' ') ?? false + const isSortMultipleField = sort.includes(' ') if (isSortMultipleField) { const sortFields = sort.split(' ') From 5becc57e27d62da62d92ed369883925f8ba7c29d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:51:55 +0900 Subject: [PATCH 4/7] fix: Change string format from space to comma --- packages/db-mongodb/src/queries/buildSortParam.ts | 4 ++-- packages/db-postgres/src/queries/buildQuery.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/db-mongodb/src/queries/buildSortParam.ts b/packages/db-mongodb/src/queries/buildSortParam.ts index 33c8cb5f821..c820954af18 100644 --- a/packages/db-mongodb/src/queries/buildSortParam.ts +++ b/packages/db-mongodb/src/queries/buildSortParam.ts @@ -28,10 +28,10 @@ export const buildSortParam = ({ }: Args): PaginateOptions['sort'] => { let sortProperty: string let sortDirection: SortDirection = 'desc' - const isSortMultipleField = sort.includes(' ') + const isSortMultipleField = sort.includes(',') if (isSortMultipleField) { - const sortFields = sort.split(' ') + const sortFields = sort.split(',') return sortFields.reduce((acc, sortField) => { const isDesc = sortField.indexOf('-') === 0 let currentSortProperty = sortField.replace(/^-/, '') diff --git a/packages/db-postgres/src/queries/buildQuery.ts b/packages/db-postgres/src/queries/buildQuery.ts index ee4990e12c0..139dfe7cf4e 100644 --- a/packages/db-postgres/src/queries/buildQuery.ts +++ b/packages/db-postgres/src/queries/buildQuery.ts @@ -52,7 +52,7 @@ const buildQuery = async function buildQuery({ let orderBy: Result['orderBy'] = [] if (sort) { - orderBy = sort.split(' ').map((sortString) => { + orderBy = sort.split(',').map((sortString) => { const sortPath = sortString.replace(/^-/, '') try { const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ @@ -68,8 +68,8 @@ const buildQuery = async function buildQuery({ value: sortPath, }) return { - order: sortString[0] === '-' ? desc : asc, column: sortTable?.[sortTableColumnName] ?? null, + order: sortString[0] === '-' ? desc : asc, } } catch (err) { // continue From 059f8af4e500d10dcf915cd2d6b24eb07c891312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:51:59 +0900 Subject: [PATCH 5/7] fix: mongodb typing error --- .../db-mongodb/src/queries/buildSortParam.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/db-mongodb/src/queries/buildSortParam.ts b/packages/db-mongodb/src/queries/buildSortParam.ts index c820954af18..6868df87649 100644 --- a/packages/db-mongodb/src/queries/buildSortParam.ts +++ b/packages/db-mongodb/src/queries/buildSortParam.ts @@ -8,7 +8,7 @@ type Args = { config: SanitizedConfig fields: Field[] locale: string - sort: string + sort: string | undefined timestamps: boolean } @@ -30,7 +30,13 @@ export const buildSortParam = ({ let sortDirection: SortDirection = 'desc' const isSortMultipleField = sort.includes(',') - if (isSortMultipleField) { + if (!sort) { + if (timestamps) { + sortProperty = 'createdAt' + } else { + sortProperty = '_id' + } + } else if (isSortMultipleField) { const sortFields = sort.split(',') return sortFields.reduce((acc, sortField) => { const isDesc = sortField.indexOf('-') === 0 @@ -48,14 +54,6 @@ export const buildSortParam = ({ } return [...acc, `${isDesc ? '-' : ''}${currentSortProperty}`] }, []) - } - - if (!sort) { - if (timestamps) { - sortProperty = 'createdAt' - } else { - sortProperty = '_id' - } } else if (sort.indexOf('-') === 0) { sortProperty = sort.substring(1) } else { From d574fb77f77933b22b7d679ffd3bfb44476d5896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:52:02 +0900 Subject: [PATCH 6/7] fix: Fix queryDraft error --- .../db-postgres/src/queries/buildQuery.ts | 47 ++++++++++--------- .../src/versions/drafts/getQueryDraftsSort.ts | 21 +++++---- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/packages/db-postgres/src/queries/buildQuery.ts b/packages/db-postgres/src/queries/buildQuery.ts index 139dfe7cf4e..a6120a3b3ff 100644 --- a/packages/db-postgres/src/queries/buildQuery.ts +++ b/packages/db-postgres/src/queries/buildQuery.ts @@ -52,29 +52,32 @@ const buildQuery = async function buildQuery({ let orderBy: Result['orderBy'] = [] if (sort) { - orderBy = sort.split(',').map((sortString) => { - const sortPath = sortString.replace(/^-/, '') - try { - const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ - adapter, - collectionPath: sortPath, - fields, - joinAliases, - joins, - locale, - pathSegments: sortPath.replace(/__/g, '.').split('.'), - selectFields, - tableName, - value: sortPath, - }) - return { - column: sortTable?.[sortTableColumnName] ?? null, - order: sortString[0] === '-' ? desc : asc, + orderBy = sort + .split(',') + .map((sortString) => { + const sortPath = sortString.replace(/^-/, '') + try { + const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ + adapter, + collectionPath: sortPath, + fields, + joinAliases, + joins, + locale, + pathSegments: sortPath.replace(/__/g, '.').split('.'), + selectFields, + tableName, + value: sortPath, + }) + return { + column: sortTable?.[sortTableColumnName] ?? null, + order: sortString[0] === '-' ? desc : asc, + } + } catch (err) { + // continue } - } catch (err) { - // continue - } - }) + }) + .filter((sortInfo) => !!sortInfo) } if (!orderBy.length) { diff --git a/packages/payload/src/versions/drafts/getQueryDraftsSort.ts b/packages/payload/src/versions/drafts/getQueryDraftsSort.ts index 3da4ec9350e..64b07fda971 100644 --- a/packages/payload/src/versions/drafts/getQueryDraftsSort.ts +++ b/packages/payload/src/versions/drafts/getQueryDraftsSort.ts @@ -5,13 +5,16 @@ export const getQueryDraftsSort = (sort: string): string => { if (!sort) return sort - let direction = '' - let orderBy = sort - - if (sort[0] === '-') { - direction = '-' - orderBy = sort.substring(1) - } - - return `${direction}version.${orderBy}` + return sort + .split(' ') + .map((sortString) => { + let direction = '' + let orderBy = sortString + if (sortString[0] === '-') { + direction = '-' + orderBy = sortString.substring(1) + } + return `${direction}version.${orderBy}` + }) + .join(' ') } From d179bbef04d534b59a7d714369634fcfea6338da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=AC=EC=9C=A4=EC=84=AD?= Date: Wed, 22 May 2024 17:56:35 +0900 Subject: [PATCH 7/7] fix: change sort split word --- packages/payload/src/versions/drafts/getQueryDraftsSort.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/versions/drafts/getQueryDraftsSort.ts b/packages/payload/src/versions/drafts/getQueryDraftsSort.ts index 64b07fda971..1a7dbd19e83 100644 --- a/packages/payload/src/versions/drafts/getQueryDraftsSort.ts +++ b/packages/payload/src/versions/drafts/getQueryDraftsSort.ts @@ -6,7 +6,7 @@ export const getQueryDraftsSort = (sort: string): string => { if (!sort) return sort return sort - .split(' ') + .split(',') .map((sortString) => { let direction = '' let orderBy = sortString @@ -16,5 +16,5 @@ export const getQueryDraftsSort = (sort: string): string => { } return `${direction}version.${orderBy}` }) - .join(' ') + .join(',') }