From 3d9a6fa24957c6ed068458b5170b4df6a0d16554 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Tue, 5 Mar 2024 12:14:45 -0600 Subject: [PATCH 1/3] updates to allow update input to omit updating the modify date behavior --- .../core/actions/tables/InsertAction.java | 4 +- .../core/actions/tables/UpdateAction.java | 11 +++- .../actions/values/ValueBehaviorApplier.java | 7 ++- .../actions/tables/update/UpdateInput.java | 36 +++++++++++- .../fields/DynamicDefaultValueBehavior.java | 7 ++- .../model/metadata/fields/FieldBehavior.java | 3 +- .../metadata/fields/ValueTooLongBehavior.java | 7 ++- .../LoadViaUpdateStep.java | 14 ++++- .../core/actions/tables/UpdateActionTest.java | 56 +++++++++++++++++++ .../values/ValueBehaviorApplierTest.java | 41 +++++++++++++- .../DynamicDefaultValueBehaviorTest.java | 36 +++++++++--- 11 files changed, 199 insertions(+), 23 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java index 0b29598e..ea3df9c0 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java @@ -242,7 +242,7 @@ public class InsertAction extends AbstractQActionFunction> behaviorsToOmit = null; + if(BooleanUtils.isTrue(updateInput.getOmitModifyDateUpdate())) + { + behaviorsToOmit = Set.of(DynamicDefaultValueBehavior.MODIFY_DATE); + } + + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.UPDATE, updateInput.getInstance(), table, updateInput.getRecords(), behaviorsToOmit); validatePrimaryKeysAreGiven(updateInput); if(oldRecordList.isPresent()) 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 8e92e786..778df8f2 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 @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.actions.values; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldBehavior; @@ -32,7 +33,7 @@ import com.kingsrook.qqq.backend.core.utils.CollectionUtils; /******************************************************************************* - ** Utility class to apply value behaviors to records. + ** Utility class to apply value behaviors to records. *******************************************************************************/ public class ValueBehaviorApplier { @@ -51,7 +52,7 @@ public class ValueBehaviorApplier /******************************************************************************* ** *******************************************************************************/ - public static void applyFieldBehaviors(Action action, QInstance instance, QTableMetaData table, List recordList) + public static void applyFieldBehaviors(Action action, QInstance instance, QTableMetaData table, List recordList, Set> behaviorsToOmit) { if(CollectionUtils.nullSafeIsEmpty(recordList)) { @@ -62,7 +63,7 @@ public class ValueBehaviorApplier { for(FieldBehavior fieldBehavior : CollectionUtils.nonNullCollection(field.getBehaviors())) { - fieldBehavior.apply(action, recordList, instance, table, field); + fieldBehavior.apply(action, recordList, instance, table, field, behaviorsToOmit); } } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/update/UpdateInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/update/UpdateInput.java index 7c96c5f0..7f81a3ae 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/update/UpdateInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/update/UpdateInput.java @@ -52,8 +52,9 @@ public class UpdateInput extends AbstractTableActionInput private Boolean areAllValuesBeingUpdatedTheSame = null; private boolean omitTriggeringAutomations = false; - private boolean omitDmlAudit = false; - private String auditContext = null; + private boolean omitDmlAudit = false; + private boolean omitModifyDateUpdate = false; + private String auditContext = null; @@ -353,4 +354,35 @@ public class UpdateInput extends AbstractTableActionInput return (this); } + + + /******************************************************************************* + ** Getter for omitModifyDateUpdate + *******************************************************************************/ + public boolean getOmitModifyDateUpdate() + { + return (this.omitModifyDateUpdate); + } + + + + /******************************************************************************* + ** Setter for omitModifyDateUpdate + *******************************************************************************/ + public void setOmitModifyDateUpdate(boolean omitModifyDateUpdate) + { + this.omitModifyDateUpdate = omitModifyDateUpdate; + } + + + + /******************************************************************************* + ** Fluent setter for omitModifyDateUpdate + *******************************************************************************/ + public UpdateInput withOmitModifyDateUpdate(boolean omitModifyDateUpdate) + { + this.omitModifyDateUpdate = omitModifyDateUpdate; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehavior.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehavior.java index f1243776..0a782774 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehavior.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehavior.java @@ -26,6 +26,7 @@ import java.io.Serializable; import java.time.Instant; import java.time.LocalDate; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.values.ValueBehaviorApplier; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.data.QRecord; @@ -65,12 +66,16 @@ public enum DynamicDefaultValueBehavior implements FieldBehavior recordList, QInstance instance, QTableMetaData table, QFieldMetaData field) + public void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field, Set> behaviorsToOmit) { if(this.equals(NONE)) { return; } + if(behaviorsToOmit != null && behaviorsToOmit.contains(this)) + { + return; + } switch(this) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldBehavior.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldBehavior.java index 0169dd3a..215843df 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldBehavior.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldBehavior.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.model.metadata.fields; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.values.ValueBehaviorApplier; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; @@ -49,7 +50,7 @@ public interface FieldBehavior> /******************************************************************************* ** Apply this behavior to a list of records *******************************************************************************/ - void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field); + void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field, Set> behaviorsToOmit); /******************************************************************************* ** control if multiple behaviors of this type should be allowed together on a field. diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/ValueTooLongBehavior.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/ValueTooLongBehavior.java index 5d091ba1..77cd24cd 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/ValueTooLongBehavior.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/ValueTooLongBehavior.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.model.metadata.fields; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.values.ValueBehaviorApplier; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.data.QRecord; @@ -65,12 +66,16 @@ public enum ValueTooLongBehavior implements FieldBehavior ** *******************************************************************************/ @Override - public void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field) + public void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field, Set> behaviorsToOmit) { if(this.equals(PASS_THROUGH)) { return; } + if(behaviorsToOmit != null && behaviorsToOmit.contains(this)) + { + return; + } String fieldName = field.getName(); if(!QFieldType.STRING.equals(field.getType())) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaUpdateStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaUpdateStep.java index b9472c38..9a9364a9 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaUpdateStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaUpdateStep.java @@ -32,6 +32,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.InputSource; import com.kingsrook.qqq.backend.core.model.actions.tables.QInputSource; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateOutput; +import org.apache.commons.lang.BooleanUtils; /******************************************************************************* @@ -40,7 +41,9 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateOutput; *******************************************************************************/ public class LoadViaUpdateStep extends AbstractLoadStep { - public static final String FIELD_DESTINATION_TABLE = "destinationTable"; + public static final String FIELD_DESTINATION_TABLE = "destinationTable"; + public static final String DO_NOT_UPDATE_MODIFY_DATE_FIELD_NAME = "doNotUpdateModifyDateFieldName"; + public static final String DO_NOT_TRIGGER_AUTOMATIONS_FIELD_NAME = "doNotTriggerAutomationsFieldName"; @@ -67,6 +70,15 @@ public class LoadViaUpdateStep extends AbstractLoadStep updateInput.setRecords(runBackendStepInput.getRecords()); getTransaction().ifPresent(updateInput::setTransaction); updateInput.setAsyncJobCallback(runBackendStepInput.getAsyncJobCallback()); + + ////////////////////////////////////////////////////////////////////////////////////////// + // look for flags in the input to either not update modify dates or not run automations // + ////////////////////////////////////////////////////////////////////////////////////////// + boolean doNotUpdateModifyDate = BooleanUtils.isTrue(runBackendStepInput.getValueBoolean(LoadViaUpdateStep.DO_NOT_UPDATE_MODIFY_DATE_FIELD_NAME)); + boolean doNotTriggerAutomations = BooleanUtils.isTrue(runBackendStepInput.getValueBoolean(LoadViaUpdateStep.DO_NOT_TRIGGER_AUTOMATIONS_FIELD_NAME)); + updateInput.setOmitModifyDateUpdate(doNotUpdateModifyDate); + updateInput.setOmitTriggeringAutomations(doNotTriggerAutomations); + UpdateOutput updateOutput = new UpdateAction().execute(updateInput); runBackendStepOutput.getRecords().addAll(updateOutput.getRecords()); } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/UpdateActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/UpdateActionTest.java index 27878e2f..cd91ab96 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/UpdateActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/UpdateActionTest.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.actions.tables; import java.math.BigDecimal; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -787,4 +788,59 @@ class UpdateActionTest extends BaseTest } } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testUpdateDoNotUpdateModifyDate() throws QException + { + QContext.getQSession().withSecurityKeyValues(MapBuilder.of(TestUtils.SECURITY_KEY_TYPE_STORE_ALL_ACCESS, ListBuilder.of(true))); + + //////////////////////////////////////////////////// + // create a test order and capture its modifyDate // + //////////////////////////////////////////////////// + InsertInput insertInput = new InsertInput(); + insertInput.setTableName(TestUtils.TABLE_NAME_ORDER); + insertInput.setRecords(List.of(new QRecord())); + QRecord qRecord = new InsertAction().execute(insertInput).getRecords().get(0); + + Instant initialModifyDate = qRecord.getValueInstant("modifyDate"); + assertNotNull(initialModifyDate); + + /////////////////////////////////////////////////////////////////// + // update the order, the modify date should be in the future now // + /////////////////////////////////////////////////////////////////// + { + UpdateInput updateInput = new UpdateInput(); + updateInput.setTableName(TestUtils.TABLE_NAME_ORDER); + updateInput.setRecords(List.of(qRecord)); + QRecord updatedRecord = new UpdateAction().execute(updateInput).getRecords().get(0); + + Instant newModifyDate = updatedRecord.getValueInstant("modifyDate"); + assertNotNull(initialModifyDate); + assertThat(initialModifyDate).isBefore(newModifyDate); + + ///////////////////////////////////////////////////////////////////////////// + // set the initial modify date to this modify date for the next test below // + ///////////////////////////////////////////////////////////////////////////// + initialModifyDate = newModifyDate; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + // now do an update setting flag to not update the modify date, then compare, should be equal // + //////////////////////////////////////////////////////////////////////////////////////////////// + { + UpdateInput updateInput = new UpdateInput(); + updateInput.setTableName(TestUtils.TABLE_NAME_ORDER); + updateInput.setRecords(List.of(qRecord)); + updateInput.setOmitModifyDateUpdate(true); + QRecord updatedRecord = new UpdateAction().execute(updateInput).getRecords().get(0); + + Instant newModifyDate = updatedRecord.getValueInstant("modifyDate"); + assertNotNull(initialModifyDate); + assertThat(initialModifyDate).isEqualTo(newModifyDate); + } + } } 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 60589039..96f9d297 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 @@ -24,10 +24,12 @@ package com.kingsrook.qqq.backend.core.actions.values; import java.util.List; import java.util.Optional; +import java.util.Set; import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldBehavior; 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.utils.TestUtils; @@ -35,6 +37,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -63,7 +66,7 @@ class ValueBehaviorApplierTest extends BaseTest new QRecord().withValue("id", 2).withValue("firstName", "John").withValue("lastName", "Last name too long").withValue("email", "john@smith.com"), new QRecord().withValue("id", 3).withValue("firstName", "First name too long").withValue("lastName", "Smith").withValue("email", "john.smith@emaildomainwayytolongtofit.com") ); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, recordList); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, recordList, null); assertEquals("First name", getRecordById(recordList, 1).getValueString("firstName")); assertEquals("Last na...", getRecordById(recordList, 2).getValueString("lastName")); @@ -73,6 +76,38 @@ class ValueBehaviorApplierTest extends BaseTest + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testOmitBehaviors() + { + QInstance qInstance = QContext.getQInstance(); + QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY); + table.getField("firstName").withMaxLength(10).withBehavior(ValueTooLongBehavior.TRUNCATE); + table.getField("lastName").withMaxLength(10).withBehavior(ValueTooLongBehavior.TRUNCATE_ELLIPSIS); + table.getField("email").withMaxLength(20).withBehavior(ValueTooLongBehavior.ERROR); + + List recordList = List.of( + new QRecord().withValue("id", 1).withValue("firstName", "First name too long").withValue("lastName", "Smith").withValue("email", "john@smith.com"), + new QRecord().withValue("id", 2).withValue("firstName", "John").withValue("lastName", "Last name too long").withValue("email", "john@smith.com"), + new QRecord().withValue("id", 3).withValue("firstName", "First name too long").withValue("lastName", "Smith").withValue("email", "john.smith@emaildomainwayytolongtofit.com") + ); + + Set> behaviorsToOmit = Set.of(ValueTooLongBehavior.ERROR); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, recordList, behaviorsToOmit); + + /////////////////////////////////////////////////////////////////////////////////////////// + // the third error behavior was set to be omitted, so no errors should be on that record // + /////////////////////////////////////////////////////////////////////////////////////////// + assertEquals("First name", getRecordById(recordList, 1).getValueString("firstName")); + assertEquals("Last na...", getRecordById(recordList, 2).getValueString("lastName")); + assertEquals("john.smith@emaildomainwayytolongtofit.com", getRecordById(recordList, 3).getValueString("email")); + assertTrue(getRecordById(recordList, 3).getErrors().isEmpty()); + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -95,7 +130,7 @@ class ValueBehaviorApplierTest extends BaseTest new QRecord().withValue("id", 1).withValue("firstName", "First name too long").withValue("lastName", null).withValue("email", "john@smith.com"), new QRecord().withValue("id", 2).withValue("firstName", "").withValue("lastName", "Last name too long").withValue("email", "john@smith.com") ); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, recordList); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, recordList, null); assertEquals("First name too long", getRecordById(recordList, 1).getValueString("firstName")); assertNull(getRecordById(recordList, 1).getValueString("lastName")); @@ -118,4 +153,4 @@ class ValueBehaviorApplierTest extends BaseTest return (recordOpt.get()); } -} \ No newline at end of file +} diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehaviorTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehaviorTest.java index d93057a6..ad07b882 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehaviorTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/DynamicDefaultValueBehaviorTest.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.model.metadata.fields; import java.time.LocalDate; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.actions.values.ValueBehaviorApplier; import com.kingsrook.qqq.backend.core.context.QContext; @@ -38,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; /******************************************************************************* - ** Unit test for DynamicDefaultValueBehavior + ** Unit test for DynamicDefaultValueBehavior *******************************************************************************/ class DynamicDefaultValueBehaviorTest extends BaseTest { @@ -53,7 +54,7 @@ class DynamicDefaultValueBehaviorTest extends BaseTest QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY); QRecord record = new QRecord().withValue("id", 1); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record)); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record), null); assertNotNull(record.getValue("createDate")); assertNotNull(record.getValue("modifyDate")); @@ -71,7 +72,7 @@ class DynamicDefaultValueBehaviorTest extends BaseTest QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY); QRecord record = new QRecord().withValue("id", 1); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.UPDATE, qInstance, table, List.of(record)); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.UPDATE, qInstance, table, List.of(record), null); assertNull(record.getValue("createDate")); assertNotNull(record.getValue("modifyDate")); @@ -79,6 +80,25 @@ class DynamicDefaultValueBehaviorTest extends BaseTest + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testOmitModifyDateUpdate() + { + QInstance qInstance = QContext.getQInstance(); + QTableMetaData table = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY); + + Set> behaviorsToOmit = Set.of(DynamicDefaultValueBehavior.MODIFY_DATE); + QRecord record = new QRecord().withValue("id", 1); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.UPDATE, qInstance, table, List.of(record), behaviorsToOmit); + + assertNull(record.getValue("createDate")); + assertNull(record.getValue("modifyDate")); + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -92,11 +112,11 @@ class DynamicDefaultValueBehaviorTest extends BaseTest QRecord record = new QRecord().withValue("id", 1); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record)); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record), null); assertNull(record.getValue("createDate")); assertNull(record.getValue("modifyDate")); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.UPDATE, qInstance, table, List.of(record)); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.UPDATE, qInstance, table, List.of(record), null); assertNull(record.getValue("createDate")); assertNull(record.getValue("modifyDate")); } @@ -114,7 +134,7 @@ class DynamicDefaultValueBehaviorTest extends BaseTest table.getField("createDate").withType(QFieldType.DATE); QRecord record = new QRecord().withValue("id", 1); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record)); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record), null); assertNotNull(record.getValue("createDate")); assertThat(record.getValue("createDate")).isInstanceOf(LocalDate.class); } @@ -132,8 +152,8 @@ class DynamicDefaultValueBehaviorTest extends BaseTest table.getField("firstName").withBehavior(DynamicDefaultValueBehavior.CREATE_DATE); QRecord record = new QRecord().withValue("id", 1); - ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record)); + ValueBehaviorApplier.applyFieldBehaviors(ValueBehaviorApplier.Action.INSERT, qInstance, table, List.of(record), null); assertNull(record.getValue("firstName")); } -} \ No newline at end of file +} From 83ba490eb9116fc37a4de17465aeb7e0e4ef4da3 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Tue, 5 Mar 2024 13:59:50 -0600 Subject: [PATCH 2/3] downgraded expected audit failures to debug --- .../kingsrook/qqq/backend/core/actions/audits/AuditAction.java | 2 +- .../qqq/backend/core/actions/audits/DMLAuditAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java index 540d0611..a85cad87 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java @@ -295,7 +295,7 @@ public class AuditAction extends AbstractQActionFunction Date: Tue, 5 Mar 2024 14:24:19 -0600 Subject: [PATCH 3/3] changed audit failures from debugs to warnings --- .../kingsrook/qqq/backend/core/actions/audits/AuditAction.java | 2 +- .../qqq/backend/core/actions/audits/DMLAuditAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java index a85cad87..518718a9 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/audits/AuditAction.java @@ -295,7 +295,7 @@ public class AuditAction extends AbstractQActionFunction