CE-1402 Fix (with test) applying field filter behaviors

This commit is contained in:
2024-06-25 10:32:33 -05:00
parent 1eb078d916
commit 7cbd6705e1
2 changed files with 88 additions and 12 deletions

View File

@ -159,6 +159,7 @@ public class ValueBehaviorApplier
} }
} }
QFilterCriteria criteriaToUse = criteria;
if(field != null) if(field != null)
{ {
for(FieldBehavior<?> fieldBehavior : CollectionUtils.nonNullCollection(field.getBehaviors())) 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 // // call to apply the behavior on the criteria - which will return a //
// new criteria if any values are changed, else the input criteria // // 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; needToUseClone = true;
} }
else
{
newCriteriaList.add(criteria);
}
} }
} }
} }
newCriteriaList.add(criteriaToUse);
} }
///////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -22,6 +22,7 @@
package com.kingsrook.qqq.backend.core.actions.values; package com.kingsrook.qqq.backend.core.actions.values;
import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; 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.CaseChangeBehavior;
import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldBehavior; 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.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.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.ValueTooLongBehavior; import com.kingsrook.qqq.backend.core.model.metadata.fields.ValueTooLongBehavior;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; 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"); QRecord record = new QRecord().withValue("firstName", "Homer").withValue("lastName", "Simpson").withValue("ssn", "0123456789");
ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.FORMATTING, qInstance, table, List.of(record), null); ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.FORMATTING, qInstance, table, List.of(record), null);
assertEquals("HOMER", record.getDisplayValue("firstName")); assertEquals("HOMER", record.getDisplayValue("firstName"));
assertNull(record.getDisplayValue("lastName")); // noop will literally do nothing, not even pass value through. 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 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("square", hasCriteriaAndSubFilterUpdated.getCriteria().get(0).getValues().get(0));
assertEquals("circle", hasCriteriaAndSubFilterUpdated.getSubFilters().get(0).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); QQueryFilter hasMultiValueCriteriaUpdated = ValueBehaviorApplier.applyFieldBehaviorsToFilter(qInstance, table, hasMultiValueCriteriaToUpdate, null);
assertNotSame(hasMultiValueCriteriaToUpdate, hasMultiValueCriteriaUpdated); assertNotSame(hasMultiValueCriteriaToUpdate, hasMultiValueCriteriaUpdated);
assertEquals(List.of("triangle", "square"), hasMultiValueCriteriaUpdated.getCriteria().get(0).getValues()); assertEquals(List.of("triangle", "square"), hasMultiValueCriteriaUpdated.getCriteria().get(0).getValues());
assertEquals(hasMultiValueCriteriaToUpdate.getSubFilters(), hasMultiValueCriteriaUpdated.getSubFilters()); 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<AppendSomethingBehavior>, FieldFilterBehavior<AppendSomethingBehavior>
{
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<QRecord> recordList, QInstance instance, QTableMetaData table, QFieldMetaData field)
{
//////////
// noop //
//////////
}
} }
} }