Don't allow empty filter for non-string types. Add null filter. (#7501)

This commit is contained in:
Oreille
2021-08-19 16:02:54 +02:00
committed by GitHub
parent 67e9b94f10
commit 49e4a9b0de
3 changed files with 45 additions and 15 deletions

View File

@@ -300,15 +300,13 @@ export function applyFilter(
if (operator === '_empty' || (operator === '_nempty' && compareValue === false)) {
dbQuery[logical].andWhere((query) => {
query.whereNull(key);
query.orWhere(key, '=', '');
query.where(key, '=', '');
});
}
if (operator === '_nempty' || (operator === '_empty' && compareValue === false)) {
dbQuery[logical].andWhere((query) => {
query.whereNotNull(key);
query.orWhere(key, '!=', '');
query.where(key, '!=', '');
});
}

View File

@@ -11,7 +11,6 @@ export default function getAvailableOperatorsForType(type: Type): OperatorType {
switch (type) {
// Text
case 'binary':
case 'json':
case 'hash':
case 'string':
return {
@@ -27,27 +26,36 @@ export default function getAvailableOperatorsForType(type: Type): OperatorType {
'neq',
'empty',
'nempty',
'null',
'nnull',
'in',
'nin',
],
};
// JSON
case 'json':
return {
type,
operators: ['eq', 'neq', 'null', 'nnull', 'in', 'nin'],
};
// UUID
case 'uuid':
return {
type,
operators: ['eq', 'neq', 'empty', 'nempty', 'in', 'nin'],
operators: ['eq', 'neq', 'null', 'nnull', 'in', 'nin'],
};
// Boolean
case 'boolean':
return {
type,
operators: ['eq', 'neq', 'empty', 'nempty'],
operators: ['eq', 'neq', 'null', 'nnull'],
};
// Numbers
case 'integer':
case 'decimal':
return {
type,
operators: ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'empty', 'nempty', 'in', 'nin'],
operators: ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'null', 'nnull', 'in', 'nin'],
};
// Datetime
case 'dateTime':
@@ -55,13 +63,13 @@ export default function getAvailableOperatorsForType(type: Type): OperatorType {
case 'time':
return {
type,
operators: ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'empty', 'nempty', 'in', 'nin'],
operators: ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'null', 'nnull', 'in', 'nin'],
};
// Geometry
case 'geometry':
return {
type,
operators: ['eq', 'neq', 'intersects', 'nintersects', 'intersects_bbox', 'nintersects_bbox'],
operators: ['eq', 'neq', 'null', 'nnull', 'intersects', 'nintersects', 'intersects_bbox', 'nintersects_bbox'],
};
default:
return {
@@ -79,6 +87,8 @@ export default function getAvailableOperatorsForType(type: Type): OperatorType {
'nbetween',
'empty',
'nempty',
'null',
'nnull',
'in',
'nin',
],

View File

@@ -4,7 +4,6 @@ export function getFilterOperatorsForType(type: Type): ClientFilterOperator[] {
switch (type) {
// Text
case 'binary':
case 'json':
case 'hash':
case 'string':
case 'csv':
@@ -22,23 +21,44 @@ export function getFilterOperatorsForType(type: Type): ClientFilterOperator[] {
'in',
'nin',
];
// JSON
case 'json':
return ['eq', 'neq', 'null', 'nnull', 'in', 'nin'];
// UUID
case 'uuid':
return ['eq', 'neq', 'empty', 'nempty', 'in', 'nin'];
return ['eq', 'neq', 'null', 'nnull', 'in', 'nin'];
// Boolean
case 'boolean':
return ['eq', 'neq', 'empty', 'nempty'];
return ['eq', 'neq', 'null', 'nnull'];
// Numbers
case 'integer':
case 'decimal':
return ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'empty', 'nempty', 'in', 'nin'];
return ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'null', 'nnull', 'in', 'nin'];
// Datetime
case 'dateTime':
case 'date':
case 'time':
return ['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'nbetween', 'empty', 'nempty', 'in', 'nin'];
return [
'eq',
'neq',
'null',
'nnull',
'lt',
'lte',
'gt',
'gte',
'between',
'nbetween',
'null',
'nnull',
'in',
'nin',
];
case 'geometry':
return ['eq', 'neq', 'intersects', 'nintersects', 'intersects_bbox', 'nintersects_bbox'];
@@ -57,6 +77,8 @@ export function getFilterOperatorsForType(type: Type): ClientFilterOperator[] {
'nbetween',
'empty',
'nempty',
'null',
'nnull',
'in',
'nin',
];