Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(db-postgres): Add multiple field sort by string #6129

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion packages/db-mongodb/src/queries/buildSortParam.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
config: SanitizedConfig
fields: Field[]
locale: string
sort: string
sort: string | undefined
timestamps: boolean
}

Expand All @@ -28,13 +28,32 @@
}: Args): PaginateOptions['sort'] => {
let sortProperty: string
let sortDirection: SortDirection = 'desc'
const isSortMultipleField = sort.includes(',')

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › should create

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › should find

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › should count

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › should find where id

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › should find with pagination false

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › should update existing

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › Bulk operations › should bulk update

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › Bulk operations › should not bulk update with a bad query

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › Bulk operations › should not bulk update with a bad relationship query

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

Check failure on line 31 in packages/db-mongodb/src/queries/buildSortParam.ts

View workflow job for this annotation

GitHub Actions / tests-int (mongodb)

collections-rest › CRUD › Bulk operations › should not bulk update with a read restricted field query

TypeError: Cannot read properties of undefined (reading 'includes') at includes (../packages/db-mongodb/src/queries/buildSortParam.ts:31:36) at Object.find (../packages/db-mongodb/src/find.ts:39:26) at find (../packages/payload/src/collections/operations/find.ts:144:33) at registerLocalStrategy (../packages/payload/src/auth/strategies/local/register.ts:23:24) at createOperation (../packages/payload/src/collections/operations/create.ts:233:13) at Object.onInit (collections-rest/config.ts:284:5) at BasePayload.init (../packages/payload/src/index.ts:430:53) at getPayloadHMR (../packages/next/src/utilities/getPayloadHMR.ts:73:22) at initPayloadInt (helpers/initPayloadInt.ts:14:19) at Object.<anonymous> (collections-rest/int.spec.ts:25:33)

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
let currentSortProperty = sortField.replace(/^-/, '')

if (currentSortProperty === 'id') {
currentSortProperty = '_id'
} else {
currentSortProperty = getLocalizedSortProperty({
config,
fields,
locale,
segments: currentSortProperty.split('.'),
})
}
return [...acc, `${isDesc ? '-' : ''}${currentSortProperty}`]
}, [])
} else if (sort.indexOf('-') === 0) {
sortProperty = sort.substring(1)
} else {
Expand Down
6 changes: 3 additions & 3 deletions packages/db-postgres/src/find/findMany.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
})
}
Expand Down Expand Up @@ -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)
Expand Down
76 changes: 39 additions & 37 deletions packages/db-postgres/src/queries/buildQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type Result = {
orderBy: {
column: GenericColumn
order: typeof asc | typeof desc
}
}[]
selectFields: Record<string, GenericColumn>
where: SQL
}
Expand All @@ -49,54 +49,56 @@ 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 = 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
}
})
orderBy.column = sortTable?.[sortTableColumnName]
} catch (err) {
// continue
}
.filter((sortInfo) => !!sortInfo)
}

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
Expand Down
21 changes: 12 additions & 9 deletions packages/payload/src/versions/drafts/getQueryDraftsSort.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(',')
}
Loading