diff --git a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/delete/DeleteResult.java b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/delete/DeleteResult.java index 02762c21..615537c1 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/delete/DeleteResult.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/delete/DeleteResult.java @@ -24,7 +24,7 @@ package com.kingsrook.qqq.backend.core.model.actions.delete; import java.util.List; import com.kingsrook.qqq.backend.core.model.actions.AbstractQResult; -import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; +import com.kingsrook.qqq.backend.core.model.data.QRecord; /******************************************************************************* @@ -33,14 +33,14 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; *******************************************************************************/ public class DeleteResult extends AbstractQResult { - List records; + List records; /******************************************************************************* ** *******************************************************************************/ - public List getRecords() + public List getRecords() { return records; } @@ -50,7 +50,7 @@ public class DeleteResult extends AbstractQResult /******************************************************************************* ** *******************************************************************************/ - public void setRecords(List records) + public void setRecords(List records) { this.records = records; } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/insert/InsertResult.java b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/insert/InsertResult.java index 99ce580d..0995408e 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/insert/InsertResult.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/insert/InsertResult.java @@ -24,7 +24,7 @@ package com.kingsrook.qqq.backend.core.model.actions.insert; import java.util.List; import com.kingsrook.qqq.backend.core.model.actions.AbstractQResult; -import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; +import com.kingsrook.qqq.backend.core.model.data.QRecord; /******************************************************************************* @@ -33,14 +33,14 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; *******************************************************************************/ public class InsertResult extends AbstractQResult { - List records; + List records; /******************************************************************************* ** *******************************************************************************/ - public List getRecords() + public List getRecords() { return records; } @@ -50,7 +50,7 @@ public class InsertResult extends AbstractQResult /******************************************************************************* ** *******************************************************************************/ - public void setRecords(List records) + public void setRecords(List records) { this.records = records; } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/update/UpdateResult.java b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/update/UpdateResult.java index d8ab1411..9b6b26ed 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/update/UpdateResult.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/update/UpdateResult.java @@ -24,7 +24,7 @@ package com.kingsrook.qqq.backend.core.model.actions.update; import java.util.List; import com.kingsrook.qqq.backend.core.model.actions.AbstractQResult; -import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; +import com.kingsrook.qqq.backend.core.model.data.QRecord; /******************************************************************************* @@ -33,14 +33,14 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; *******************************************************************************/ public class UpdateResult extends AbstractQResult { - List records; + List records; /******************************************************************************* ** *******************************************************************************/ - public List getRecords() + public List getRecords() { return records; } @@ -50,7 +50,7 @@ public class UpdateResult extends AbstractQResult /******************************************************************************* ** *******************************************************************************/ - public void setRecords(List records) + public void setRecords(List records) { this.records = records; } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java b/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java index 07a0e51e..cbb622e3 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java @@ -29,20 +29,53 @@ import java.util.Map; /******************************************************************************* - * Data Record within qqq. e.g., a single row from a database. - * - * Actual values (e.g., as stored in the backend system) are in the `values` - * map. Keys in this map are fieldNames from the QTableMetaData. - * - * "Display values" (e.g., labels for possible values, or formatted numbers - * (e.g., quantities with commas)) are in the displayValues map. + ** Data Record within qqq. e.g., a single row from a database. + ** + ** Actual values (e.g., as stored in the backend system) are in the `values` + ** map. Keys in this map are fieldNames from the QTableMetaData. + ** + ** "Display values" (e.g., labels for possible values, or formatted numbers + ** (e.g., quantities with commas)) are in the displayValues map. + ** + ** backendDetails are additional data about a record, that aren't strictly + ** values, but are more like meta-data - e.g., for a file-backend, what file the + ** record came from. + ** + ** Errors are meant to hold information about things that went wrong when + ** processing a record - e.g., in a list of records that may be the output of an + ** action, like a bulk load. TODO - redo as some status object? *******************************************************************************/ public class QRecord implements Serializable { - private String tableName; - //x private Serializable primaryKey; - private Map values = new LinkedHashMap<>(); - private Map displayValues = new LinkedHashMap<>(); + private String tableName; + private Map values = new LinkedHashMap<>(); + private Map displayValues = new LinkedHashMap<>(); + private Map backendDetails = new LinkedHashMap<>(); + // todo private List errors = new ArrayList<>(); + + + + /******************************************************************************* + ** Default constructor. + *******************************************************************************/ + public QRecord() + { + } + + + + /******************************************************************************* + ** Copy constructor. + ** TODO ... should this do deep copies? + *******************************************************************************/ + public QRecord(QRecord record) + { + this.tableName = record.tableName; + this.values = record.values; + this.displayValues = record.displayValues; + this.backendDetails = record.backendDetails; + // todo! this.errors = record.errors; + } @@ -120,34 +153,6 @@ public class QRecord implements Serializable return (this); } - //x /******************************************************************************* - //x ** Getter for primaryKey - //x ** - //x *******************************************************************************/ - //x public Serializable getPrimaryKey() - //x { - //x return primaryKey; - //x } - - //x /******************************************************************************* - //x ** Setter for primaryKey - //x ** - //x *******************************************************************************/ - //x public void setPrimaryKey(Serializable primaryKey) - //x { - //x this.primaryKey = primaryKey; - //x } - - //x /******************************************************************************* - //x ** Setter for primaryKey - //x ** - //x *******************************************************************************/ - //x public QRecord withPrimaryKey(Serializable primaryKey) - //x { - //x this.primaryKey = primaryKey; - //x return (this); - //x } - /******************************************************************************* @@ -247,4 +252,70 @@ public class QRecord implements Serializable return ((LocalDate) values.get(fieldName)); } + + + /******************************************************************************* + ** Getter for backendDetails + ** + *******************************************************************************/ + public Map getBackendDetails() + { + return backendDetails; + } + + + + /******************************************************************************* + ** Setter for backendDetails + ** + *******************************************************************************/ + public void setBackendDetails(Map backendDetails) + { + this.backendDetails = backendDetails; + } + + + + /******************************************************************************* + ** Add one backendDetail to this record + ** + *******************************************************************************/ + public void addBackendDetail(String key, Serializable value) + { + this.backendDetails.put(key, value); + } + + + + /******************************************************************************* + ** Fluently Add one backendDetail to this record + ** + *******************************************************************************/ + public QRecord withBackendDetail(String key, Serializable value) + { + addBackendDetail(key, value); + return (this); + } + + + + /******************************************************************************* + ** Get one backendDetail from this record + ** + *******************************************************************************/ + public Serializable getBackendDetail(String key) + { + return this.backendDetails.get(key); + } + + + /******************************************************************************* + ** Get one backendDetail from this record as a String + ** + *******************************************************************************/ + public String getBackendDetailString(String key) + { + return (String) this.backendDetails.get(key); + } + } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java index cb59dc22..929520a4 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java @@ -26,7 +26,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.modules.interfaces.DeleteInterface; @@ -47,10 +46,10 @@ public class MockDeleteAction implements DeleteInterface DeleteResult rs = new DeleteResult(); rs.setRecords(deleteRequest.getPrimaryKeys().stream().map(primaryKey -> - { - QRecord qRecord = new QRecord().withTableName(deleteRequest.getTableName()).withValue("id", primaryKey); - return new QRecordWithStatus(qRecord); - }).toList()); + new QRecord() + .withTableName(deleteRequest.getTableName()) + .withValue("id", primaryKey)) + .toList()); return rs; } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockInsertAction.java b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockInsertAction.java index 55199158..f92c78b5 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockInsertAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockInsertAction.java @@ -25,7 +25,6 @@ package com.kingsrook.qqq.backend.core.modules.mock; 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.QRecordWithStatus; import com.kingsrook.qqq.backend.core.modules.interfaces.InsertInterface; @@ -45,10 +44,7 @@ public class MockInsertAction implements InsertInterface { InsertResult rs = new InsertResult(); - rs.setRecords(insertRequest.getRecords().stream().map(qRecord -> - { - return new QRecordWithStatus(qRecord); - }).toList()); + rs.setRecords(insertRequest.getRecords()); return rs; } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockUpdateAction.java b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockUpdateAction.java index d5371c55..cbc93400 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockUpdateAction.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockUpdateAction.java @@ -25,7 +25,6 @@ package com.kingsrook.qqq.backend.core.modules.mock; 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.QRecordWithStatus; import com.kingsrook.qqq.backend.core.modules.interfaces.UpdateInterface; @@ -45,10 +44,7 @@ public class MockUpdateAction implements UpdateInterface { UpdateResult rs = new UpdateResult(); - rs.setRecords(updateRequest.getRecords().stream().map(qRecord -> - { - return new QRecordWithStatus(qRecord); - }).toList()); + rs.setRecords(updateRequest.getRecords()); return rs; } diff --git a/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java b/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java index 02566b76..7826c6a8 100644 --- a/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java +++ b/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java @@ -28,7 +28,6 @@ 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.TestUtils; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -55,7 +54,7 @@ class DeleteActionTest DeleteResult result = new DeleteAction().execute(request); assertNotNull(result); assertEquals(2, result.getRecords().size()); - assertTrue(result.getRecords().stream().allMatch(r -> r.getErrors() == null)); + // todo - add errors to QRecord? assertTrue(result.getRecords().stream().allMatch(r -> r.getErrors() == null)); } } diff --git a/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java b/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java index 31c144b4..4b8e47d7 100644 --- a/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java +++ b/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java @@ -60,8 +60,9 @@ class JsonUtilsTest public void test_toJsonQRecordInput() { QRecord qRecord = getQRecord(); - String json = JsonUtils.toJson(qRecord); - assertEquals("{\"tableName\":\"foo\",\"values\":{\"foo\":\"Foo\",\"bar\":3.14159},\"displayValues\":{}}", json); + String json = JsonUtils.toJson(qRecord); + assertEquals(""" + {"tableName":"foo","values":{"foo":"Foo","bar":3.14159},"displayValues":{},"backendDetails":{}}""", json); } @@ -90,6 +91,7 @@ class JsonUtilsTest } + /******************************************************************************* ** *******************************************************************************/ @@ -109,7 +111,7 @@ class JsonUtilsTest public void test_toPrettyJsonQRecordInput() { QRecord qRecord = getQRecord(); - String json = JsonUtils.toPrettyJson(qRecord); + String json = JsonUtils.toPrettyJson(qRecord); // todo assertEquals("{\"tableName\":\"foo\",\"primaryKey\":1,\"values\":{\"foo\":\"Foo\",\"bar\":3.14159}}", json); }