diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/RDBMSBackendModule.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/RDBMSBackendModule.java index 0f6f6984..d2b00152 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/RDBMSBackendModule.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/RDBMSBackendModule.java @@ -38,7 +38,7 @@ import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSTableBackendDe /******************************************************************************* - ** + ** QQQ Backend module for working with Relational Databases (RDBMS's). *******************************************************************************/ public class RDBMSBackendModule implements QBackendModuleInterface { diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java index 1c4c7ec5..64560aa2 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java @@ -31,7 +31,6 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteRequest; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteResult; import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; @@ -72,14 +71,14 @@ public class RDBMSDeleteAction extends AbstractRDBMSAction implements DeleteInte Connection connection = connectionManager.getConnection((RDBMSBackendMetaData)deleteRequest.getBackend()); QueryManager.executeUpdateForRowCount(connection, sql, params); - List recordsWithStatus = new ArrayList<>(); - rs.setRecords(recordsWithStatus); + List outputRecords = new ArrayList<>(); + rs.setRecords(outputRecords); for(Serializable primaryKey : deleteRequest.getPrimaryKeys()) { QRecord qRecord = new QRecord().withTableName(deleteRequest.getTableName()).withValue("id", primaryKey); // todo uh, identify any errors? - QRecordWithStatus recordWithStatus = new QRecordWithStatus(qRecord); - recordsWithStatus.add(recordWithStatus); + QRecord outputRecord = new QRecord(qRecord); + outputRecords.add(outputRecord); } return rs; diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java index 55b0885c..e8408aef 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertAction.java @@ -30,10 +30,10 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertRequest; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertResult; import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData; @@ -50,6 +50,11 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte *******************************************************************************/ public InsertResult execute(InsertRequest insertRequest) throws QException { + if(CollectionUtils.nullSafeIsEmpty(insertRequest.getRecords())) + { + throw (new QException("Request to insert 0 records.")); + } + try { InsertResult rs = new InsertResult(); @@ -96,15 +101,15 @@ public class RDBMSInsertAction extends AbstractRDBMSAction implements InsertInte // todo - non-serial-id style tables // todo - other generated values, e.g., createDate... maybe need to re-select? List idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params); - List recordsWithStatus = new ArrayList<>(); - rs.setRecords(recordsWithStatus); + List outputRecords = new ArrayList<>(); + rs.setRecords(outputRecords); int index = 0; for(QRecord record : insertRequest.getRecords()) { Integer id = idList.get(index++); - QRecordWithStatus recordWithStatus = new QRecordWithStatus(record); - recordWithStatus.setValue(table.getPrimaryKeyField(), id); - recordsWithStatus.add(recordWithStatus); + QRecord outputRecord = new QRecord(record); + outputRecord.setValue(table.getPrimaryKeyField(), id); + outputRecords.add(outputRecord); } return rs; diff --git a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java index 43232dfa..12d48e56 100644 --- a/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateAction.java @@ -30,7 +30,6 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateRequest; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateResult; import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.modules.interfaces.UpdateInterface; @@ -55,8 +54,8 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte UpdateResult rs = new UpdateResult(); QTableMetaData table = updateRequest.getTable(); - List recordsWithStatus = new ArrayList<>(); - rs.setRecords(recordsWithStatus); + List outputRecords = new ArrayList<>(); + rs.setRecords(outputRecords); // todo - sql batch for performance // todo - if setting a bunch of records to have the same value, a single update where id IN? @@ -82,8 +81,8 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte ConnectionManager connectionManager = new ConnectionManager(); Connection connection = connectionManager.getConnection((RDBMSBackendMetaData) updateRequest.getBackend()); - QRecordWithStatus recordWithStatus = new QRecordWithStatus(record); - recordsWithStatus.add(recordWithStatus); + QRecord outputRecord = new QRecord(record); + outputRecords.add(outputRecord); try { @@ -98,7 +97,8 @@ public class RDBMSUpdateAction extends AbstractRDBMSAction implements UpdateInte } catch(Exception e) { - recordWithStatus.setErrors(new ArrayList<>(List.of(e))); + // todo - how to communicate errors??? outputRecord.setErrors(new ArrayList<>(List.of(e))); + throw new QException("Error executing update: " + e.getMessage(), e); } } diff --git a/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java b/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java index d15a0492..8547040c 100644 --- a/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java +++ b/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java @@ -25,7 +25,6 @@ package com.kingsrook.qqq.backend.module.rdbms.actions; import java.util.List; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteRequest; import com.kingsrook.qqq.backend.core.model.actions.delete.DeleteResult; -import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.module.rdbms.TestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -61,7 +60,7 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest deleteRequest.setPrimaryKeys(List.of(1, 2, 3, 4, 5)); DeleteResult deleteResult = new RDBMSDeleteAction().execute(deleteRequest); assertEquals(5, deleteResult.getRecords().size(), "Unfiltered delete should return all rows"); - assertTrue(deleteResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(deleteResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT id FROM person", (rs -> assertFalse(rs.next()))); } @@ -77,7 +76,7 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest deleteRequest.setPrimaryKeys(List.of(1)); DeleteResult deleteResult = new RDBMSDeleteAction().execute(deleteRequest); assertEquals(1, deleteResult.getRecords().size(), "Should delete one row"); - assertTrue(deleteResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(deleteResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT id FROM person WHERE id = 1", (rs -> assertFalse(rs.next()))); } @@ -93,7 +92,7 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest deleteRequest.setPrimaryKeys(List.of(1, 3, 5)); DeleteResult deleteResult = new RDBMSDeleteAction().execute(deleteRequest); assertEquals(3, deleteResult.getRecords().size(), "Should delete one row"); - assertTrue(deleteResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(deleteResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT id FROM person", (rs -> { int rowsFound = 0; while(rs.next()) diff --git a/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java b/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java index ac0b5f49..d07d6450 100644 --- a/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java +++ b/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java @@ -26,13 +26,11 @@ import java.util.List; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertRequest; import com.kingsrook.qqq.backend.core.model.actions.insert.InsertResult; import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.module.rdbms.TestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; /******************************************************************************* @@ -68,7 +66,7 @@ public class RDBMSInsertActionTest extends RDBMSActionTest InsertResult insertResult = new RDBMSInsertAction().execute(insertRequest); assertEquals(1, insertResult.getRecords().size(), "Should return 1 row"); assertNotNull(insertResult.getRecords().get(0).getValue("id"), "Should have an id in the row"); - assertTrue(insertResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(insertResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT * FROM person WHERE last_name = 'Kirk'", (rs -> { int rowsFound = 0; while(rs.next()) @@ -105,7 +103,7 @@ public class RDBMSInsertActionTest extends RDBMSActionTest assertEquals(2, insertResult.getRecords().size(), "Should return 1 row"); assertEquals(6, insertResult.getRecords().get(0).getValue("id"), "Should have next id in the row"); assertEquals(7, insertResult.getRecords().get(1).getValue("id"), "Should have next id in the row"); - assertTrue(insertResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(insertResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT * FROM person WHERE last_name = 'Picard'", (rs -> { int rowsFound = 0; while(rs.next()) diff --git a/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java b/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java index be6a06a9..0cbe75a2 100644 --- a/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java +++ b/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java @@ -26,13 +26,11 @@ import java.util.List; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateRequest; import com.kingsrook.qqq.backend.core.model.actions.update.UpdateResult; import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.module.rdbms.TestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -70,7 +68,7 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest UpdateResult updateResult = new RDBMSUpdateAction().execute(updateRequest); assertEquals(1, updateResult.getRecords().size(), "Should return 1 row"); assertEquals(2, updateResult.getRecords().get(0).getValue("id"), "Should have id=2 in the row"); - assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT * FROM person WHERE last_name = 'Kirk'", (rs -> { int rowsFound = 0; while(rs.next()) @@ -115,7 +113,7 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest assertEquals(2, updateResult.getRecords().size(), "Should return 2 rows"); assertEquals(1, updateResult.getRecords().get(0).getValue("id"), "Should have expected ids in the row"); assertEquals(3, updateResult.getRecords().get(1).getValue("id"), "Should have expected ids in the row"); - assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); + // todo - add errors to QRecord? assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); runTestSql("SELECT * FROM person WHERE last_name = 'From Bewitched'", (rs -> { int rowsFound = 0; while(rs.next())