diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java index d4ae9a96..188eae69 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java @@ -133,6 +133,23 @@ public class QueryActionCacheHelper insertInput.setRecords(recordsToCache); insertInput.setSkipUniqueKeyCheck(true); InsertOutput insertOutput = new InsertAction().execute(insertInput); + + ////////////////////////////////////////////////////////// + // set the (generated) ids in the records being returne // + ////////////////////////////////////////////////////////// + Map, QRecord> insertedRecordsByUniqueKey = new HashMap<>(); + for(QRecord record : insertOutput.getRecords()) + { + insertedRecordsByUniqueKey.put(getUniqueKeyValues(record), record); + } + for(QRecord record : recordsToReturn) + { + QRecord insertedRecord = insertedRecordsByUniqueKey.get(getUniqueKeyValues(record)); + if(insertedRecord != null) + { + record.setValue(table.getPrimaryKeyField(), insertedRecord.getValue(table.getPrimaryKeyField())); + } + } } catch(Exception e) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java index eeef3387..f1d6827b 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java @@ -349,32 +349,37 @@ public class MemoryRecordStore QFieldMetaData primaryKeyField = table.getField(table.getPrimaryKeyField()); for(QRecord record : input.getRecords()) { - if(CollectionUtils.nullSafeHasContents(record.getErrors())) + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // make a copy of the record, to be inserted, and returned. this can avoid some cases where the in-memory store acts // + // differently from other backends, because of having the same record variable in the backend store and in the user-code. // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + QRecord recordToInsert = new QRecord(record); + if(CollectionUtils.nullSafeHasContents(recordToInsert.getErrors())) { - outputRecords.add(record); + outputRecords.add(recordToInsert); continue; } ///////////////////////////////////////////////// // set the next serial in the record if needed // ///////////////////////////////////////////////// - if(record.getValue(primaryKeyField.getName()) == null && primaryKeyField.getType().equals(QFieldType.INTEGER)) + if(recordToInsert.getValue(primaryKeyField.getName()) == null && primaryKeyField.getType().equals(QFieldType.INTEGER)) { - record.setValue(primaryKeyField.getName(), nextSerial++); + recordToInsert.setValue(primaryKeyField.getName(), nextSerial++); } /////////////////////////////////////////////////////////////////////////////////////////////////// // make sure that if the user supplied a serial, greater than the one we had, that we skip ahead // /////////////////////////////////////////////////////////////////////////////////////////////////// - if(primaryKeyField.getType().equals(QFieldType.INTEGER) && record.getValueInteger(primaryKeyField.getName()) > nextSerial) + if(primaryKeyField.getType().equals(QFieldType.INTEGER) && recordToInsert.getValueInteger(primaryKeyField.getName()) > nextSerial) { - nextSerial = record.getValueInteger(primaryKeyField.getName()) + 1; + nextSerial = recordToInsert.getValueInteger(primaryKeyField.getName()) + 1; } - tableData.put(record.getValue(primaryKeyField.getName()), record); + tableData.put(recordToInsert.getValue(primaryKeyField.getName()), recordToInsert); if(returnInsertedRecords) { - outputRecords.add(record); + outputRecords.add(recordToInsert); } } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java index b0ebe6b7..b0f21491 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java @@ -87,6 +87,7 @@ class QueryActionCacheHelperTest extends BaseTest assertNotEquals(0, queryOutput.getRecords().size()); assertNotNull(queryOutput.getRecords().get(0).getValue("cachedDate")); assertEquals(3, queryOutput.getRecords().get(0).getValue("noOfSides")); + assertNotNull(queryOutput.getRecords().get(0).getValue("id")); } ////////////////////////////////////////////////////////////////////////////////////