### What? Fixes https://github.com/payloadcms/payload/issues/5152 issue related to sorting by a localized field with SQLite / Postgres database adapters. ### Why? It was an incorrect behaviour. ### How? Modifies the `getTableColumnFromPath` file to have correct join conditions. Previously if you had this structure in the _locales table _locale title parent en A 1 es B 1 we sorted by everything that's here, but we need to sort only by the passed locale. Additionally fixes a typescript error in `dev.ts` that I added here https://github.com/payloadcms/payload/pull/8834 Also, removes the condition with `joins.length` in `countDistinct`. It was there as for this issue https://github.com/payloadcms/payload/issues/4889 because sorting by a localized property caused duplication. This can simnifically improve performance for `.find` with nested querying/sorting on large data sets, because `count(*)` is faster than `count(DISTINCT id)`
33 lines
777 B
TypeScript
33 lines
777 B
TypeScript
import type { ChainedMethods } from '@payloadcms/drizzle/types'
|
|
|
|
import { chainMethods } from '@payloadcms/drizzle'
|
|
import { count } from 'drizzle-orm'
|
|
|
|
import type { CountDistinct, SQLiteAdapter } from './types.js'
|
|
|
|
export const countDistinct: CountDistinct = async function countDistinct(
|
|
this: SQLiteAdapter,
|
|
{ db, joins, tableName, where },
|
|
) {
|
|
const chainedMethods: ChainedMethods = []
|
|
|
|
joins.forEach(({ condition, table }) => {
|
|
chainedMethods.push({
|
|
args: [table, condition],
|
|
method: 'leftJoin',
|
|
})
|
|
})
|
|
|
|
const countResult = await chainMethods({
|
|
methods: chainedMethods,
|
|
query: db
|
|
.select({
|
|
count: count(),
|
|
})
|
|
.from(this.tables[tableName])
|
|
.where(where),
|
|
})
|
|
|
|
return Number(countResult[0].count)
|
|
}
|