mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
QQQ-16 updated for changes to qqq-backend-core
This commit is contained in:
@ -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
|
||||
{
|
||||
|
@ -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<QRecordWithStatus> recordsWithStatus = new ArrayList<>();
|
||||
rs.setRecords(recordsWithStatus);
|
||||
List<QRecord> 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;
|
||||
|
@ -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<Integer> idList = QueryManager.executeInsertForGeneratedIds(connection, sql.toString(), params);
|
||||
List<QRecordWithStatus> recordsWithStatus = new ArrayList<>();
|
||||
rs.setRecords(recordsWithStatus);
|
||||
List<QRecord> 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;
|
||||
|
@ -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<QRecordWithStatus> recordsWithStatus = new ArrayList<>();
|
||||
rs.setRecords(recordsWithStatus);
|
||||
List<QRecord> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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())
|
||||
|
@ -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())
|
||||
|
@ -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())
|
||||
|
Reference in New Issue
Block a user