Improve multi word filtering (#5034)

improve multi word search

closes #4212 
closes #3386
This commit is contained in:
martmull
2024-04-18 15:46:59 +02:00
committed by GitHub
parent 88c14b7e52
commit 1c1a055c94
54 changed files with 212 additions and 146 deletions

View File

@ -4,11 +4,13 @@ import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapTo
import { OrderBy } from '@/object-metadata/types/OrderBy';
import { DEFAULT_SEARCH_REQUEST_LIMIT } from '@/object-record/constants/DefaultSearchRequestLimit';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter';
import { EntitiesForMultipleEntitySelect } from '@/object-record/relation-picker/types/EntitiesForMultipleEntitySelect';
import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables';
import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables';
import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateILikeFiltersForCompositeFields';
import { isDefined } from '~/utils/isDefined';
type SearchFilter = { fieldNames: string[]; filter: string | number };
@ -56,28 +58,33 @@ export const useFilteredSearchEntityQuery = ({
return undefined;
}
return makeOrFilterVariables(
fieldNames.map((fieldName) => {
const formattedFilters = fieldNames.reduce(
(previousValue: ObjectRecordQueryFilter[], fieldName) => {
const [parentFieldName, subFieldName] = fieldName.split('.');
if (isNonEmptyString(subFieldName)) {
// Composite field
return {
[parentFieldName]: {
[subFieldName]: {
ilike: `%${filter}%`,
},
},
};
return [
...previousValue,
...generateILikeFiltersForCompositeFields(filter, parentFieldName, [
subFieldName,
]),
];
}
return {
[fieldName]: {
ilike: `%${filter}%`,
return [
...previousValue,
{
[fieldName]: {
ilike: `%${filter}%`,
},
},
};
}),
];
},
[],
);
return makeOrFilterVariables(formattedFilters);
});
const {