diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/DeleteAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/DeleteAction.java index a5028027..17a96091 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/DeleteAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/DeleteAction.java @@ -401,6 +401,7 @@ public class DeleteAction if(CollectionUtils.nullSafeHasContents(associatedKeys)) { DeleteInput nextLevelDeleteInput = new DeleteInput(); + nextLevelDeleteInput.setFlags(deleteInput.getFlags()); nextLevelDeleteInput.setTransaction(deleteInput.getTransaction()); nextLevelDeleteInput.setTableName(association.getAssociatedTableName()); nextLevelDeleteInput.setPrimaryKeys(associatedKeys); 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 29266e13..e56da2b7 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 @@ -34,7 +34,6 @@ import java.util.Set; import java.util.stream.Collectors; import com.kingsrook.qqq.backend.core.actions.AbstractQActionFunction; import com.kingsrook.qqq.backend.core.actions.ActionHelper; -import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.actions.audits.DMLAuditAction; import com.kingsrook.qqq.backend.core.actions.automation.AutomationStatus; import com.kingsrook.qqq.backend.core.actions.automation.RecordAutomationStatusUpdater; @@ -158,7 +157,7 @@ public class InsertAction extends AbstractQActionFunction insertedRecords, QBackendTransaction transaction) throws QException + private void manageAssociations(QTableMetaData table, List insertedRecords, InsertInput insertInput) throws QException { for(Association association : CollectionUtils.nonNullList(table.getAssociations())) { @@ -419,7 +418,8 @@ public class InsertAction extends AbstractQActionFunction r.getValue(associatedTable.getPrimaryKeyField())).collect(Collectors.toList())); @@ -617,6 +618,7 @@ public class UpdateAction LOG.debug("Updating associatedRecords", logPair("associatedTable", associatedTable.getName()), logPair("noOfRecords", nextLevelUpdates.size())); UpdateInput nextLevelUpdateInput = new UpdateInput(); nextLevelUpdateInput.setTransaction(updateInput.getTransaction()); + nextLevelUpdateInput.setFlags(updateInput.getFlags()); nextLevelUpdateInput.setTableName(association.getAssociatedTableName()); nextLevelUpdateInput.setRecords(nextLevelUpdates); UpdateOutput nextLevelUpdateOutput = new UpdateAction().execute(nextLevelUpdateInput); @@ -627,6 +629,7 @@ public class UpdateAction LOG.debug("Inserting associatedRecords", logPair("associatedTable", associatedTable.getName()), logPair("noOfRecords", nextLevelUpdates.size())); InsertInput nextLevelInsertInput = new InsertInput(); nextLevelInsertInput.setTransaction(updateInput.getTransaction()); + nextLevelInsertInput.setFlags(updateInput.getFlags()); nextLevelInsertInput.setTableName(association.getAssociatedTableName()); nextLevelInsertInput.setRecords(nextLevelInserts); InsertOutput nextLevelInsertOutput = new InsertAction().execute(nextLevelInsertInput); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/ActionFlag.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/ActionFlag.java new file mode 100644 index 00000000..eacb5923 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/ActionFlag.java @@ -0,0 +1,35 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2025. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.model.actions.tables; + + +import java.io.Serializable; + + +/******************************************************************************* + ** interface to mark enums (presumably classes too, but the original intent is + ** enums) that can be added to insert/update/delete action inputs to flag behaviors + *******************************************************************************/ +public interface ActionFlag extends Serializable +{ + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/delete/DeleteInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/delete/DeleteInput.java index c7a92518..9c555f53 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/delete/DeleteInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/delete/DeleteInput.java @@ -24,9 +24,12 @@ package com.kingsrook.qqq.backend.core.model.actions.tables.delete; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.ActionFlag; 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.query.QQueryFilter; @@ -47,6 +50,8 @@ public class DeleteInput extends AbstractTableActionInput private boolean omitDmlAudit = false; private String auditContext = null; + private Set flags; + /******************************************************************************* @@ -295,4 +300,65 @@ public class DeleteInput extends AbstractTableActionInput return (this); } + + + /******************************************************************************* + ** Getter for flags + *******************************************************************************/ + public Set getFlags() + { + return (this.flags); + } + + + + /******************************************************************************* + ** Setter for flags + *******************************************************************************/ + public void setFlags(Set flags) + { + this.flags = flags; + } + + + + /******************************************************************************* + ** Fluent setter for flags + *******************************************************************************/ + public DeleteInput withFlags(Set flags) + { + this.flags = flags; + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public DeleteInput withFlag(ActionFlag flag) + { + if(this.flags == null) + { + this.flags = new HashSet<>(); + } + this.flags.add(flag); + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public boolean hasFlag(ActionFlag flag) + { + if(this.flags == null) + { + return (false); + } + + return (this.flags.contains(flag)); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/insert/InsertInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/insert/InsertInput.java index 1753f61f..0bf2d301 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/insert/InsertInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/insert/InsertInput.java @@ -23,9 +23,12 @@ package com.kingsrook.qqq.backend.core.model.actions.tables.insert; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.ActionFlag; 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.data.QRecord; @@ -48,6 +51,8 @@ public class InsertInput extends AbstractTableActionInput private boolean omitDmlAudit = false; private String auditContext = null; + private Set flags; + /******************************************************************************* @@ -316,4 +321,65 @@ public class InsertInput extends AbstractTableActionInput return (this); } + + + /******************************************************************************* + ** Getter for flags + *******************************************************************************/ + public Set getFlags() + { + return (this.flags); + } + + + + /******************************************************************************* + ** Setter for flags + *******************************************************************************/ + public void setFlags(Set flags) + { + this.flags = flags; + } + + + + /******************************************************************************* + ** Fluent setter for flags + *******************************************************************************/ + public InsertInput withFlags(Set flags) + { + this.flags = flags; + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public InsertInput withFlag(ActionFlag flag) + { + if(this.flags == null) + { + this.flags = new HashSet<>(); + } + this.flags.add(flag); + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public boolean hasFlag(ActionFlag flag) + { + if(this.flags == null) + { + return (false); + } + + return (this.flags.contains(flag)); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/replace/ReplaceInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/replace/ReplaceInput.java index e518dec1..542c8045 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/replace/ReplaceInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/replace/ReplaceInput.java @@ -22,9 +22,12 @@ package com.kingsrook.qqq.backend.core.model.actions.tables.replace; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.ActionFlag; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.tables.UniqueKey; @@ -39,12 +42,14 @@ public class ReplaceInput extends AbstractTableActionInput private UniqueKey key; private List records; private QQueryFilter filter; - private boolean performDeletes = true; - private boolean allowNullKeyValuesToEqual = false; - private boolean setPrimaryKeyInInsertedRecords = false; + private boolean performDeletes = true; + private boolean allowNullKeyValuesToEqual = false; + private boolean setPrimaryKeyInInsertedRecords = false; private boolean omitDmlAudit = false; + private Set flags; + /******************************************************************************* @@ -303,4 +308,65 @@ public class ReplaceInput extends AbstractTableActionInput return (this); } + + + /******************************************************************************* + ** Getter for flags + *******************************************************************************/ + public Set getFlags() + { + return (this.flags); + } + + + + /******************************************************************************* + ** Setter for flags + *******************************************************************************/ + public void setFlags(Set flags) + { + this.flags = flags; + } + + + + /******************************************************************************* + ** Fluent setter for flags + *******************************************************************************/ + public ReplaceInput withFlags(Set flags) + { + this.flags = flags; + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public ReplaceInput withFlag(ActionFlag flag) + { + if(this.flags == null) + { + this.flags = new HashSet<>(); + } + this.flags.add(flag); + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public boolean hasFlag(ActionFlag flag) + { + if(this.flags == null) + { + return (false); + } + + return (this.flags.contains(flag)); + } + } 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 767b9ee5..d3645d37 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 @@ -23,9 +23,12 @@ package com.kingsrook.qqq.backend.core.model.actions.tables.update; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.ActionFlag; 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.data.QRecord; @@ -56,6 +59,8 @@ public class UpdateInput extends AbstractTableActionInput private boolean omitModifyDateUpdate = false; private String auditContext = null; + private Set flags; + /******************************************************************************* @@ -385,4 +390,65 @@ public class UpdateInput extends AbstractTableActionInput return (this); } + + + /******************************************************************************* + ** Getter for flags + *******************************************************************************/ + public Set getFlags() + { + return (this.flags); + } + + + + /******************************************************************************* + ** Setter for flags + *******************************************************************************/ + public void setFlags(Set flags) + { + this.flags = flags; + } + + + + /******************************************************************************* + ** Fluent setter for flags + *******************************************************************************/ + public UpdateInput withFlags(Set flags) + { + this.flags = flags; + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public UpdateInput withFlag(ActionFlag flag) + { + if(this.flags == null) + { + this.flags = new HashSet<>(); + } + this.flags.add(flag); + return (this); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public boolean hasFlag(ActionFlag flag) + { + if(this.flags == null) + { + return (false); + } + + return (this.flags.contains(flag)); + } + }