mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
Add support for CriteriaOption.CASE_INSENSITIVE
This commit is contained in:
@ -34,6 +34,7 @@ import java.util.Objects;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
||||||
import com.kingsrook.qqq.backend.core.logging.QLogger;
|
import com.kingsrook.qqq.backend.core.logging.QLogger;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.CriteriaOption;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.JoinsContext;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.JoinsContext;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy;
|
||||||
@ -268,6 +269,11 @@ public class BackendQueryFilterUtils
|
|||||||
|
|
||||||
String regex = sqlLikeToRegex(criterionValue);
|
String regex = sqlLikeToRegex(criterionValue);
|
||||||
|
|
||||||
|
if(criterion.hasOption(CriteriaOption.CASE_INSENSITIVE))
|
||||||
|
{
|
||||||
|
return (stringValue.toLowerCase().matches(regex.toLowerCase()));
|
||||||
|
}
|
||||||
|
|
||||||
return (stringValue.matches(regex));
|
return (stringValue.matches(regex));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,6 +433,23 @@ public class BackendQueryFilterUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(criterion.hasOption(CriteriaOption.CASE_INSENSITIVE))
|
||||||
|
{
|
||||||
|
if(CollectionUtils.nullSafeHasContents(criterion.getValues()))
|
||||||
|
{
|
||||||
|
if(criterion.getValues().get(0) instanceof String)
|
||||||
|
{
|
||||||
|
for(Serializable criterionValue : criterion.getValues())
|
||||||
|
{
|
||||||
|
if(criterionValue instanceof String criterionValueString && value instanceof String valueString && criterionValueString.equalsIgnoreCase(valueString))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(value == null || !criterion.getValues().contains(value))
|
if(value == null || !criterion.getValues().contains(value))
|
||||||
{
|
{
|
||||||
return (false);
|
return (false);
|
||||||
@ -456,6 +479,14 @@ public class BackendQueryFilterUtils
|
|||||||
value = String.valueOf(value);
|
value = String.valueOf(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(criterion.hasOption(CriteriaOption.CASE_INSENSITIVE))
|
||||||
|
{
|
||||||
|
if(value instanceof String valueString && criteriaValue instanceof String criteriaValueString && valueString.equalsIgnoreCase(criteriaValueString))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!value.equals(criteriaValue))
|
if(!value.equals(criteriaValue))
|
||||||
{
|
{
|
||||||
return (false);
|
return (false);
|
||||||
@ -473,6 +504,14 @@ public class BackendQueryFilterUtils
|
|||||||
String stringValue = getStringFieldValue(value, fieldName, criterion);
|
String stringValue = getStringFieldValue(value, fieldName, criterion);
|
||||||
String criterionValue = getFirstStringCriterionValue(criterion);
|
String criterionValue = getFirstStringCriterionValue(criterion);
|
||||||
|
|
||||||
|
if(criterion.hasOption(CriteriaOption.CASE_INSENSITIVE))
|
||||||
|
{
|
||||||
|
if(stringValue.toLowerCase().contains(criterionValue.toLowerCase()))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!stringValue.contains(criterionValue))
|
if(!stringValue.contains(criterionValue))
|
||||||
{
|
{
|
||||||
return (false);
|
return (false);
|
||||||
@ -491,6 +530,14 @@ public class BackendQueryFilterUtils
|
|||||||
String stringValue = getStringFieldValue(value, fieldName, criterion);
|
String stringValue = getStringFieldValue(value, fieldName, criterion);
|
||||||
String criterionValue = getFirstStringCriterionValue(criterion);
|
String criterionValue = getFirstStringCriterionValue(criterion);
|
||||||
|
|
||||||
|
if(criterion.hasOption(CriteriaOption.CASE_INSENSITIVE))
|
||||||
|
{
|
||||||
|
if(stringValue.toLowerCase().startsWith(criterionValue.toLowerCase()))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!stringValue.startsWith(criterionValue))
|
if(!stringValue.startsWith(criterionValue))
|
||||||
{
|
{
|
||||||
return (false);
|
return (false);
|
||||||
@ -509,6 +556,14 @@ public class BackendQueryFilterUtils
|
|||||||
String stringValue = getStringFieldValue(value, fieldName, criterion);
|
String stringValue = getStringFieldValue(value, fieldName, criterion);
|
||||||
String criterionValue = getFirstStringCriterionValue(criterion);
|
String criterionValue = getFirstStringCriterionValue(criterion);
|
||||||
|
|
||||||
|
if(criterion.hasOption(CriteriaOption.CASE_INSENSITIVE))
|
||||||
|
{
|
||||||
|
if(stringValue.toLowerCase().endsWith(criterionValue.toLowerCase()))
|
||||||
|
{
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!stringValue.endsWith(criterionValue))
|
if(!stringValue.endsWith(criterionValue))
|
||||||
{
|
{
|
||||||
return (false);
|
return (false);
|
||||||
@ -665,4 +720,5 @@ public class BackendQueryFilterUtils
|
|||||||
regex.append("$");
|
regex.append("$");
|
||||||
return regex.toString();
|
return regex.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,10 @@
|
|||||||
package com.kingsrook.qqq.backend.core.modules.backend.implementations.utils;
|
package com.kingsrook.qqq.backend.core.modules.backend.implementations.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.CriteriaOption;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
||||||
@ -305,6 +307,73 @@ class BackendQueryFilterUtilsTest
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
**
|
||||||
|
***************************************************************************/
|
||||||
|
private QFilterCriteria newCaseInsensitiveCriteria(String fieldName, QCriteriaOperator operator, Serializable... values)
|
||||||
|
{
|
||||||
|
return new QFilterCriteria(fieldName, operator, values).withOption(CriteriaOption.CASE_INSENSITIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
**
|
||||||
|
***************************************************************************/
|
||||||
|
private QFilterCriteria newCaseInsensitiveCriteria(String fieldName, QCriteriaOperator operator, List<Serializable> values)
|
||||||
|
{
|
||||||
|
return new QFilterCriteria(fieldName, operator, values).withOption(CriteriaOption.CASE_INSENSITIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Test
|
||||||
|
void testDoesCriterionMatchCaseInsensitive()
|
||||||
|
{
|
||||||
|
////////////////
|
||||||
|
// like & not //
|
||||||
|
////////////////
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.LIKE, "Test"), "f", "test"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.LIKE, "test"), "f", "Test"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.LIKE, "T%"), "f", "test"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.LIKE, "t%"), "f", "Test"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.LIKE, "T_st"), "f", "test"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.LIKE, "t_st"), "f", "Test"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_LIKE, "Test"), "f", "Tst"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_LIKE, "Test"), "f", "tst"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_LIKE, "T%"), "f", "Rest"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_LIKE, "T_st"), "f", "Toast"));
|
||||||
|
|
||||||
|
//////////////
|
||||||
|
// IN & NOT //
|
||||||
|
//////////////
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.IN, "A"), "f", "a"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.IN, "a"), "f", "A"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.IN, "A", "B"), "f", "a"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.IN, "A", "b"), "f", "B"));
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.IN, List.of()), "f", "A"));
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.IN, ListBuilder.of(null)), "f", "A"));
|
||||||
|
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_IN, "A"), "f", "A"));
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_IN, "A", "B"), "f", "a"));
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_IN, "A", "b"), "f", "B"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_IN, List.of()), "f", "A"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_IN, ListBuilder.of(null)), "f", "A"));
|
||||||
|
|
||||||
|
///////////////////////////
|
||||||
|
// NOT_EQUALS_OR_IS_NULL //
|
||||||
|
///////////////////////////
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_EQUALS_OR_IS_NULL, "A"), "f", "A"));
|
||||||
|
assertFalse(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_EQUALS_OR_IS_NULL, "A"), "f", "a"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_EQUALS_OR_IS_NULL, "A"), "f", "B"));
|
||||||
|
assertTrue(BackendQueryFilterUtils.doesCriteriaMatch(newCaseInsensitiveCriteria("f", QCriteriaOperator.NOT_EQUALS_OR_IS_NULL, "A"), "f", null));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
Reference in New Issue
Block a user