mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
Update to put the generated id on newly inserted cached records
This commit is contained in:
@ -133,6 +133,23 @@ public class QueryActionCacheHelper
|
|||||||
insertInput.setRecords(recordsToCache);
|
insertInput.setRecords(recordsToCache);
|
||||||
insertInput.setSkipUniqueKeyCheck(true);
|
insertInput.setSkipUniqueKeyCheck(true);
|
||||||
InsertOutput insertOutput = new InsertAction().execute(insertInput);
|
InsertOutput insertOutput = new InsertAction().execute(insertInput);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////
|
||||||
|
// set the (generated) ids in the records being returne //
|
||||||
|
//////////////////////////////////////////////////////////
|
||||||
|
Map<List<Serializable>, 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)
|
catch(Exception e)
|
||||||
{
|
{
|
||||||
|
@ -349,32 +349,37 @@ public class MemoryRecordStore
|
|||||||
QFieldMetaData primaryKeyField = table.getField(table.getPrimaryKeyField());
|
QFieldMetaData primaryKeyField = table.getField(table.getPrimaryKeyField());
|
||||||
for(QRecord record : input.getRecords())
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
// set the next serial in the record if needed //
|
// 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 //
|
// 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)
|
if(returnInsertedRecords)
|
||||||
{
|
{
|
||||||
outputRecords.add(record);
|
outputRecords.add(recordToInsert);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ class QueryActionCacheHelperTest extends BaseTest
|
|||||||
assertNotEquals(0, queryOutput.getRecords().size());
|
assertNotEquals(0, queryOutput.getRecords().size());
|
||||||
assertNotNull(queryOutput.getRecords().get(0).getValue("cachedDate"));
|
assertNotNull(queryOutput.getRecords().get(0).getValue("cachedDate"));
|
||||||
assertEquals(3, queryOutput.getRecords().get(0).getValue("noOfSides"));
|
assertEquals(3, queryOutput.getRecords().get(0).getValue("noOfSides"));
|
||||||
|
assertNotNull(queryOutput.getRecords().get(0).getValue("id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
Reference in New Issue
Block a user