CE-1180 add option to setPrimaryKeyInInsertedRecords (on the INPUT records)

This commit is contained in:
2024-05-10 12:51:20 -05:00
parent c9e9d62098
commit f009d50631
3 changed files with 70 additions and 2 deletions

View File

@ -157,6 +157,17 @@ public class ReplaceAction extends AbstractQActionFunction<ReplaceInput, Replace
output.setDeleteOutput(deleteOutput);
}
if(input.getSetPrimaryKeyInInsertedRecords())
{
for(int i = 0; i < insertList.size(); i++)
{
if(i < insertOutput.getRecords().size())
{
insertList.get(i).setValue(primaryKeyField, insertOutput.getRecords().get(i).getValue(primaryKeyField));
}
}
}
if(weOwnTheTransaction)
{
transaction.commit();

View File

@ -39,8 +39,9 @@ public class ReplaceInput extends AbstractTableActionInput
private UniqueKey key;
private List<QRecord> records;
private QQueryFilter filter;
private boolean performDeletes = true;
private boolean allowNullKeyValuesToEqual = false;
private boolean performDeletes = true;
private boolean allowNullKeyValuesToEqual = false;
private boolean setPrimaryKeyInInsertedRecords = false;
private boolean omitDmlAudit = false;
@ -271,4 +272,35 @@ public class ReplaceInput extends AbstractTableActionInput
return (this);
}
/*******************************************************************************
** Getter for setPrimaryKeyInInsertedRecords
*******************************************************************************/
public boolean getSetPrimaryKeyInInsertedRecords()
{
return (this.setPrimaryKeyInInsertedRecords);
}
/*******************************************************************************
** Setter for setPrimaryKeyInInsertedRecords
*******************************************************************************/
public void setSetPrimaryKeyInInsertedRecords(boolean setPrimaryKeyInInsertedRecords)
{
this.setPrimaryKeyInInsertedRecords = setPrimaryKeyInInsertedRecords;
}
/*******************************************************************************
** Fluent setter for setPrimaryKeyInInsertedRecords
*******************************************************************************/
public ReplaceInput withSetPrimaryKeyInInsertedRecords(boolean setPrimaryKeyInInsertedRecords)
{
this.setPrimaryKeyInInsertedRecords = setPrimaryKeyInInsertedRecords;
return (this);
}
}

View File

@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.actions.tables;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.kingsrook.qqq.backend.core.BaseTest;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.count.CountInput;
@ -38,8 +39,11 @@ import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.metadata.tables.UniqueKey;
import com.kingsrook.qqq.backend.core.utils.TestUtils;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/*******************************************************************************
@ -81,12 +85,27 @@ class ReplaceActionTest extends BaseTest
replaceInput.setOmitDmlAudit(true);
replaceInput.setRecords(newPeople);
replaceInput.setFilter(null);
replaceInput.setSetPrimaryKeyInInsertedRecords(false);
ReplaceOutput replaceOutput = new ReplaceAction().execute(replaceInput);
assertEquals(1, replaceOutput.getInsertOutput().getRecords().size());
assertEquals(1, replaceOutput.getUpdateOutput().getRecords().size());
assertEquals(1, replaceOutput.getDeleteOutput().getDeletedRecordCount());
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// due to false for SetPrimaryKeyInInsertedRecords, make sure primary keys aren't on the records that got inserted //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Optional<QRecord> ned = newPeople.stream().filter(r -> r.getValueString("firstName").equals("Ned")).findFirst();
assertThat(ned).isPresent();
assertNull(ned.get().getValue("id"), "the record that got inserted should not have its primary key set");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// but note, homer (who was updated) would have had its primary key set too, as part of the internal processing that does the update. //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Optional<QRecord> homer = newPeople.stream().filter(r -> r.getValueString("firstName").equals("Homer")).findFirst();
assertThat(homer).isPresent();
assertNotNull(homer.get().getValue("id"), "the record that got updated should have its primary key set");
//////////////////////////////
// assert homer was updated //
//////////////////////////////
@ -136,12 +155,18 @@ class ReplaceActionTest extends BaseTest
replaceInput.setOmitDmlAudit(true);
replaceInput.setRecords(newPeople);
replaceInput.setFilter(null);
replaceInput.setSetPrimaryKeyInInsertedRecords(true);
ReplaceOutput replaceOutput = new ReplaceAction().execute(replaceInput);
assertEquals(2, replaceOutput.getInsertOutput().getRecords().size());
assertEquals(0, replaceOutput.getUpdateOutput().getRecords().size());
assertEquals(2, replaceOutput.getDeleteOutput().getDeletedRecordCount());
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// due to true for SetPrimaryKeyInInsertedRecords, make sure primary keys ARE on all the records that got inserted //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
assertTrue(newPeople.stream().allMatch(r -> r.getValue("id") != null), "All inserted records should have their primary key");
///////////////////////////////////////
// assert homer & marge were deleted //
///////////////////////////////////////