Introduce RecordPipeBufferedWrapper, to be used in QueryAction when includingAssociations and writing to a pipe

This commit is contained in:
2023-04-28 14:22:29 -05:00
parent b7e39d6953
commit 0b7c2db452
5 changed files with 159 additions and 2 deletions

View File

@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.actions.tables;
import java.util.ArrayList;
import java.util.List;
import com.kingsrook.qqq.backend.core.BaseTest;
import com.kingsrook.qqq.backend.core.actions.async.AsyncRecordPipeLoop;
import com.kingsrook.qqq.backend.core.actions.reporting.RecordPipe;
import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.exceptions.QException;
@ -200,6 +201,41 @@ class QueryActionTest extends BaseTest
/*******************************************************************************
**
*******************************************************************************/
@Test
void testQueryManyRecordsAssociationsWithPipe() throws QException
{
QContext.getQSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_TYPE_STORE_ALL_ACCESS, true);
insertNOrdersWithAssociations(2500);
RecordPipe pipe = new RecordPipe(1000);
QueryInput queryInput = new QueryInput();
queryInput.setTableName(TestUtils.TABLE_NAME_ORDER);
queryInput.setRecordPipe(pipe);
queryInput.setIncludeAssociations(true);
int recordsConsumed = new AsyncRecordPipeLoop().run("Test", null, pipe, (callback) ->
{
new QueryAction().execute(queryInput);
return (true);
}, () ->
{
List<QRecord> records = pipe.consumeAvailableRecords();
for(QRecord record : records)
{
assertEquals(1, record.getAssociatedRecords().get("orderLine").size());
assertEquals(1, record.getAssociatedRecords().get("extrinsics").size());
}
return (records.size());
});
assertEquals(2500, recordsConsumed);
}
/*******************************************************************************
**
*******************************************************************************/
@ -356,4 +392,25 @@ class QueryActionTest extends BaseTest
));
new InsertAction().execute(insertInput);
}
/*******************************************************************************
**
*******************************************************************************/
private static void insertNOrdersWithAssociations(int n) throws QException
{
List<QRecord> recordList = new ArrayList<>();
for(int i = 0; i < n; i++)
{
recordList.add(new QRecord().withValue("storeId", 1).withValue("orderNo", "ORD" + i)
.withAssociatedRecord("orderLine", new QRecord().withValue("sku", "BASIC1").withValue("quantity", 3))
.withAssociatedRecord("extrinsics", new QRecord().withValue("key", "YOUR-FIELD").withValue("value", "YOUR-VALUE")));
}
InsertInput insertInput = new InsertInput();
insertInput.setTableName(TestUtils.TABLE_NAME_ORDER);
insertInput.setRecords(recordList);
new InsertAction().execute(insertInput);
}
}