mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 05:01:07 +00:00
CE-1402 Fix (with test) applying field filter behaviors
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -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 //
|
||||||
|
//////////
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user