From 7cbd6705e1060352396ee5729779da7b24fe9a6f Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 25 Jun 2024 10:32:33 -0500 Subject: [PATCH] CE-1402 Fix (with test) applying field filter behaviors --- .../actions/values/ValueBehaviorApplier.java | 18 ++-- .../values/ValueBehaviorApplierTest.java | 82 ++++++++++++++++++- 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplier.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplier.java index 2baebf71..62442fe1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplier.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplier.java @@ -159,6 +159,7 @@ public class ValueBehaviorApplier } } + QFilterCriteria criteriaToUse = criteria; if(field != null) { for(FieldBehavior fieldBehavior : CollectionUtils.nonNullCollection(field.getBehaviors())) @@ -175,23 +176,20 @@ public class ValueBehaviorApplier // call to apply the behavior on the criteria - which will return a // // new criteria if any values are changed, else the input criteria // ////////////////////////////////////////////////////////////////////// - QFilterCriteria newCriteria = apply(criteria, instance, table, field, filterBehavior); + criteriaToUse = apply(criteriaToUse, instance, table, field, filterBehavior); - if(newCriteria != criteria) + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // if the new criteria is not the same as the old criteria, mark that we need to make and return a clone. // + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + if(criteriaToUse != criteria) { - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - // if the new criteria is not the same as the old criteria, mark that we need to make and return a clone. // - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - newCriteriaList.add(newCriteria); needToUseClone = true; } - else - { - newCriteriaList.add(criteria); - } } } } + + newCriteriaList.add(criteriaToUse); } ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplierTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplierTest.java index 5e5b95b5..338bb103 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplierTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/ValueBehaviorApplierTest.java @@ -22,6 +22,7 @@ package com.kingsrook.qqq.backend.core.actions.values; +import java.io.Serializable; import java.util.List; import java.util.Optional; import java.util.Set; @@ -35,6 +36,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.fields.CaseChangeBehavior; import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldBehavior; import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldDisplayBehavior; +import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldFilterBehavior; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.ValueTooLongBehavior; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; @@ -164,7 +166,7 @@ class ValueBehaviorApplierTest extends BaseTest QRecord record = new QRecord().withValue("firstName", "Homer").withValue("lastName", "Simpson").withValue("ssn", "0123456789"); ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.FORMATTING, qInstance, table, List.of(record), null); - + assertEquals("HOMER", record.getDisplayValue("firstName")); assertNull(record.getDisplayValue("lastName")); // noop will literally do nothing, not even pass value through. assertEquals("0123456789", record.getValueString("ssn")); // formatting action should not run the too-long truncate behavior @@ -314,11 +316,87 @@ class ValueBehaviorApplierTest extends BaseTest assertEquals("square", hasCriteriaAndSubFilterUpdated.getCriteria().get(0).getValues().get(0)); assertEquals("circle", hasCriteriaAndSubFilterUpdated.getSubFilters().get(0).getCriteria().get(0).getValues().get(0)); - QQueryFilter hasMultiValueCriteriaToUpdate = new QQueryFilter().withCriteria(new QFilterCriteria("name", QCriteriaOperator.EQUALS, "Triangle", "Square")); + QQueryFilter hasMultiValueCriteriaToUpdate = new QQueryFilter().withCriteria(new QFilterCriteria("name", QCriteriaOperator.IN, "Triangle", "Square")); QQueryFilter hasMultiValueCriteriaUpdated = ValueBehaviorApplier.applyFieldBehaviorsToFilter(qInstance, table, hasMultiValueCriteriaToUpdate, null); assertNotSame(hasMultiValueCriteriaToUpdate, hasMultiValueCriteriaUpdated); assertEquals(List.of("triangle", "square"), hasMultiValueCriteriaUpdated.getCriteria().get(0).getValues()); assertEquals(hasMultiValueCriteriaToUpdate.getSubFilters(), hasMultiValueCriteriaUpdated.getSubFilters()); + + QQueryFilter hasMultipleCriteriaOnlyToUpdate = new QQueryFilter() + .withCriteria(new QFilterCriteria("name", QCriteriaOperator.EQUALS, "Square")) + .withCriteria(new QFilterCriteria("id", QCriteriaOperator.IS_NOT_BLANK)); + + QQueryFilter hasMultipleCriteriaOnlyOneUpdated = ValueBehaviorApplier.applyFieldBehaviorsToFilter(qInstance, table, hasMultipleCriteriaOnlyToUpdate, null); + assertNotSame(hasMultipleCriteriaOnlyToUpdate, hasMultipleCriteriaOnlyOneUpdated); + assertEquals(2, hasMultipleCriteriaOnlyOneUpdated.getCriteria().size()); + assertEquals(List.of("square"), hasMultipleCriteriaOnlyOneUpdated.getCriteria().get(0).getValues()); + assertEquals(hasMultipleCriteriaOnlyToUpdate.getSubFilters(), hasMultipleCriteriaOnlyOneUpdated.getSubFilters()); + + ////////////////////////////////////////////////////////// + // set 2 behaviors on the field - make sure both happen // + ////////////////////////////////////////////////////////// + field.setBehaviors(Set.of(CaseChangeBehavior.TO_LOWER_CASE, new AppendSomethingBehavior("-x"))); + QQueryFilter criteriaValueToUpdateTwice = new QQueryFilter().withCriteria(new QFilterCriteria("name", QCriteriaOperator.EQUALS, "Triangle")); + QQueryFilter criteriaValueUpdatedTwice = ValueBehaviorApplier.applyFieldBehaviorsToFilter(qInstance, table, criteriaValueToUpdateTwice, null); + assertNotSame(criteriaValueToUpdateTwice, criteriaValueUpdatedTwice); + assertEquals("triangle-x", criteriaValueUpdatedTwice.getCriteria().get(0).getValues().get(0)); + assertEquals(criteriaValueToUpdateTwice.getSubFilters(), criteriaValueUpdatedTwice.getSubFilters()); + } + + + + /*************************************************************************** + * + ***************************************************************************/ + public static class AppendSomethingBehavior implements FieldBehavior, FieldFilterBehavior + { + private String something; + + + + /******************************************************************************* + ** Constructor + ** + *******************************************************************************/ + public AppendSomethingBehavior(String something) + { + this.something = something; + } + + + + /*************************************************************************** + * + ***************************************************************************/ + @Override + public Serializable applyToFilterCriteriaValue(Serializable value, QInstance instance, QTableMetaData table, QFieldMetaData field) + { + return value + something; + } + + + + /*************************************************************************** + * + ***************************************************************************/ + @Override + public AppendSomethingBehavior getDefault() + { + return null; + } + + + + /*************************************************************************** + * + ***************************************************************************/ + @Override + public void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field) + { + ////////// + // noop // + ////////// + } } }