diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduper.java index b6d6e0d0..3370b68e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduper.java @@ -34,6 +34,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import static com.kingsrook.qqq.backend.core.logging.LogUtils.logPair; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.EQUALS; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.IN; +import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.IS_NOT_BLANK; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.NOT_EQUALS; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.NOT_IN; @@ -311,6 +312,28 @@ public class QQueryFilterDeduper log.add("Merge two not-equals as not-in"); continue; } + else if(IN.equals(other.getOperator()) && IS_NOT_BLANK.equals(criteria.getOperator())) + { + ////////////////////////////////////////////////////////////////////////// + // for an IN and IS_NOT_BLANK, remove the IS_NOT_BLANK - it's redundant // + ////////////////////////////////////////////////////////////////////////// + iterator.remove(); + didAnyGood = true; + log.add("Removing redundant is-not-blank"); + continue; + } + else if(IS_NOT_BLANK.equals(other.getOperator()) && IN.equals(criteria.getOperator())) + { + ////////////////////////////////////////////////////////////////////////// + // for an IN and IS_NOT_BLANK, remove the IS_NOT_BLANK - it's redundant // + ////////////////////////////////////////////////////////////////////////// + other.setOperator(IN); + other.setValues(new ArrayList<>(criteria.getValues())); + iterator.remove(); + didAnyGood = true; + log.add("Removing redundant is-not-blank"); + continue; + } else { log.add("Fail because unhandled operator pair"); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduperTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduperTest.java index 2f596de6..276dcbfb 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduperTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/QQueryFilterDeduperTest.java @@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.EQUALS; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.GREATER_THAN; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.IN; +import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.IS_NOT_BLANK; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.NOT_EQUALS; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator.NOT_IN; import static com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter.BooleanOperator.OR; @@ -352,4 +353,23 @@ class QQueryFilterDeduperTest extends BaseTest assertEquals(contradiction, dedupeFilter(contradiction)); } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testInAndIsNotBlank() + { + assertEquals(new QQueryFilter().withCriteria(new QFilterCriteria("f", IN, 1, 2)), dedupeFilter(new QQueryFilter() + .withCriteria(new QFilterCriteria("f", IN, 1, 2)) + .withCriteria(new QFilterCriteria("f", IS_NOT_BLANK)) + )); + + assertEquals(new QQueryFilter().withCriteria(new QFilterCriteria("f", IN, 1, 2)), dedupeFilter(new QQueryFilter() + .withCriteria(new QFilterCriteria("f", IS_NOT_BLANK)) + .withCriteria(new QFilterCriteria("f", IN, 1, 2)) + )); + } + } \ No newline at end of file