From 58fc2f9a7470ea1b0856ef471562eba5499e815a Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Thu, 15 May 2025 20:45:33 +0300 Subject: [PATCH] fix(db-postgres): build `near` sort query properly for point fields (#12240) Continuation of https://github.com/payloadcms/payload/pull/12185 and fix https://github.com/payloadcms/payload/issues/12221 The mentioned PR introduced auto sorting by the point field when a `near` query is used, but it didn't build actual needed query to order results by their distance to a _given_ (from the `near` query) point. Now, we build: ```sql order by pont_field <-> ST_SetSRID(ST_MakePoint(lng, lat), 4326) ``` Which does what we want --- packages/drizzle/src/queries/buildOrderBy.ts | 14 +++++++++++--- packages/drizzle/src/queries/buildQuery.ts | 1 + packages/drizzle/src/queries/parseParams.ts | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/drizzle/src/queries/buildOrderBy.ts b/packages/drizzle/src/queries/buildOrderBy.ts index da779bbb2..758b8854c 100644 --- a/packages/drizzle/src/queries/buildOrderBy.ts +++ b/packages/drizzle/src/queries/buildOrderBy.ts @@ -1,7 +1,7 @@ -import type { Table } from 'drizzle-orm' +import type { SQL, Table } from 'drizzle-orm' import type { FlattenedField, Sort } from 'payload' -import { asc, desc } from 'drizzle-orm' +import { asc, desc, or } from 'drizzle-orm' import type { DrizzleAdapter, GenericColumn } from '../types.js' import type { BuildQueryJoinAliases, BuildQueryResult } from './buildQuery.js' @@ -16,6 +16,7 @@ type Args = { joins: BuildQueryJoinAliases locale?: string parentIsLocalized: boolean + rawSort?: SQL selectFields: Record sort?: Sort tableName: string @@ -31,6 +32,7 @@ export const buildOrderBy = ({ joins, locale, parentIsLocalized, + rawSort, selectFields, sort, tableName, @@ -74,12 +76,18 @@ export const buildOrderBy = ({ value: sortProperty, }) if (sortTable?.[sortTableColumnName]) { + let order = sortDirection === 'asc' ? asc : desc + + if (rawSort) { + order = () => rawSort + } + orderBy.push({ column: aliasTable && tableName === getNameFromDrizzleTable(sortTable) ? aliasTable[sortTableColumnName] : sortTable[sortTableColumnName], - order: sortDirection === 'asc' ? asc : desc, + order, }) selectFields[sortTableColumnName] = sortTable[sortTableColumnName] diff --git a/packages/drizzle/src/queries/buildQuery.ts b/packages/drizzle/src/queries/buildQuery.ts index 9b5326b9c..b91869c46 100644 --- a/packages/drizzle/src/queries/buildQuery.ts +++ b/packages/drizzle/src/queries/buildQuery.ts @@ -79,6 +79,7 @@ const buildQuery = function buildQuery({ joins, locale, parentIsLocalized, + rawSort: context.rawSort, selectFields, sort: context.sort, tableName, diff --git a/packages/drizzle/src/queries/parseParams.ts b/packages/drizzle/src/queries/parseParams.ts index 90bba4136..8ca750366 100644 --- a/packages/drizzle/src/queries/parseParams.ts +++ b/packages/drizzle/src/queries/parseParams.ts @@ -14,7 +14,7 @@ import { buildAndOrConditions } from './buildAndOrConditions.js' import { getTableColumnFromPath } from './getTableColumnFromPath.js' import { sanitizeQueryValue } from './sanitizeQueryValue.js' -export type QueryContext = { sort: Sort } +export type QueryContext = { rawSort?: SQL; sort: Sort } type Args = { adapter: DrizzleAdapter @@ -348,6 +348,7 @@ export function parseParams({ } if (geoConstraints.length) { context.sort = relationOrPath + context.rawSort = sql`${table[columnName]} <-> ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)` constraints.push(and(...geoConstraints)) } break