fix(db-mongodb): removes precedence of regular chars over international chars in sort (#7294)

## Description

V2 PR [here](https://github.com/payloadcms/payload/pull/6923)

- [x] I have read and understand the
[CONTRIBUTING.md](https://github.com/payloadcms/payload/blob/main/CONTRIBUTING.md)
document in this repository.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## Checklist:

- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] Existing test suite passes locally with my changes
This commit is contained in:
Patrik
2024-07-23 09:03:00 -04:00
committed by GitHub
parent b6d4bc4d37
commit b3e8ddf302
8 changed files with 94 additions and 7 deletions

View File

@@ -54,6 +54,10 @@ export const find: Find = async function find(
useEstimatedCount,
}
if (locale && locale !== 'all' && locale !== '*') {
paginationOptions.collation = { locale, strength: 1 }
}
if (!useEstimatedCount && Object.keys(query).length === 0 && this.disableIndexHints !== true) {
// Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding
// a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,

View File

@@ -72,6 +72,10 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV
useEstimatedCount,
}
if (locale && locale !== 'all' && locale !== '*') {
paginationOptions.collation = { locale, strength: 1 }
}
if (!useEstimatedCount && Object.keys(query).length === 0 && this.disableIndexHints !== true) {
// Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding
// a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,

View File

@@ -69,6 +69,10 @@ export const findVersions: FindVersions = async function findVersions(
useEstimatedCount,
}
if (locale && locale !== 'all' && locale !== '*') {
paginationOptions.collation = { locale, strength: 1 }
}
if (!useEstimatedCount && Object.keys(query).length === 0 && this.disableIndexHints !== true) {
// Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding
// a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,

View File

@@ -57,6 +57,10 @@ export const queryDrafts: QueryDrafts = async function queryDrafts(
useEstimatedCount,
}
if (locale && locale !== 'all' && locale !== '*') {
paginationOptions.collation = { locale, strength: 1 }
}
if (
!useEstimatedCount &&
Object.keys(versionQuery).length === 0 &&

View File

@@ -12,6 +12,7 @@ import {
blocksWithLocalizedSameName,
defaultLocale,
englishTitle,
hungarianLocale,
localizedPostsSlug,
localizedSortSlug,
portugueseLocale,
@@ -70,6 +71,11 @@ export default buildConfigWithDefaults({
name: 'description',
type: 'text',
},
{
name: 'localizedDescription',
localized: true,
type: 'text',
},
{
name: 'localizedCheckbox',
localized: true,
@@ -310,6 +316,11 @@ export default buildConfigWithDefaults({
label: 'Arabic',
rtl: true,
},
{
code: hungarianLocale,
label: 'Hungarian',
rtl: false,
},
],
},
onInit: async (payload) => {

View File

@@ -12,6 +12,7 @@ import configPromise from './config.js'
import {
defaultLocale,
englishTitle,
hungarianLocale,
localizedPostsSlug,
localizedSortSlug,
portugueseLocale,
@@ -37,7 +38,6 @@ describe('Localization', () => {
beforeAll(async () => {
;({ payload, restClient } = await initPayloadInt(configPromise))
// @ts-expect-error Force typing
post1 = await payload.create({
collection,
data: {
@@ -45,7 +45,6 @@ describe('Localization', () => {
},
})
// @ts-expect-error Force typing
postWithLocalizedData = await payload.create({
collection,
data: {
@@ -185,7 +184,6 @@ describe('Localization', () => {
},
})
// @ts-expect-error Force typing
localizedPost = await payload.update({
id,
collection,
@@ -276,6 +274,67 @@ describe('Localization', () => {
expect(result.docs.map(({ id }) => id)).toContain(localizedPost.id)
})
if (['mongodb'].includes(process.env.PAYLOAD_DATABASE)) {
describe('Localized sorting', () => {
let localizedAccentPostOne: LocalizedPost
let localizedAccentPostTwo: LocalizedPost
beforeEach(async () => {
localizedAccentPostOne = await payload.create({
collection,
data: {
title: 'non accent post',
localizedDescription: 'something',
},
locale: englishLocale,
})
localizedAccentPostTwo = await payload.create({
collection,
data: {
title: 'accent post',
localizedDescription: 'veterinarian',
},
locale: englishLocale,
})
await payload.update({
id: localizedAccentPostOne.id,
collection,
data: {
title: 'non accent post',
localizedDescription: 'valami',
},
locale: hungarianLocale,
})
await payload.update({
id: localizedAccentPostTwo.id,
collection,
data: {
title: 'accent post',
localizedDescription: 'állatorvos',
},
locale: hungarianLocale,
})
})
it('should sort alphabetically even with accented letters', async () => {
const sortByDescriptionQuery = await payload.find({
collection,
sort: 'description',
where: {
title: {
like: 'accent',
},
},
locale: hungarianLocale,
})
expect(sortByDescriptionQuery.docs[0].id).toEqual(localizedAccentPostTwo.id)
})
})
}
})
})
@@ -352,7 +411,6 @@ describe('Localization', () => {
},
})
// @ts-expect-error Force typing
withRelationship = await payload.create({
collection: withLocalizedRelSlug,
data: {

View File

@@ -27,7 +27,7 @@ export interface Config {
globals: {
'global-array': GlobalArray;
};
locale: 'en' | 'es' | 'pt' | 'ar';
locale: 'en' | 'es' | 'hu' | 'pt' | 'ar';
user: User & {
collection: 'users';
};
@@ -70,6 +70,7 @@ export interface User {
export interface LocalizedPost {
id: string;
title?: string | null;
localizedDescription?: string | null;
description?: string | null;
localizedCheckbox?: boolean | null;
children?: (string | LocalizedPost)[] | null;

View File

@@ -8,6 +8,7 @@ export const relationSpanishTitle2 = `${relationSpanishTitle}2`
export const defaultLocale = 'en'
export const spanishLocale = 'es'
export const portugueseLocale = 'pt'
export const hungarianLocale = 'hu'
// Slugs
export const localizedPostsSlug = 'localized-posts'