mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 05:01:07 +00:00
Add overload of getForeignRecordMap that takes additional (base) filter for query
This commit is contained in:
@ -67,6 +67,21 @@ public class GeneralProcessUtils
|
||||
** via getForeignRecordMap(input, orderList, "clientId", "client", "id")
|
||||
*******************************************************************************/
|
||||
public static Map<Serializable, QRecord> getForeignRecordMap(AbstractActionInput parentActionInput, List<QRecord> sourceRecords, String sourceTableForeignKeyFieldName, String foreignTableName, String foreignTablePrimaryKeyName) throws QException
|
||||
{
|
||||
return getForeignRecordMap(parentActionInput, sourceRecords, sourceTableForeignKeyFieldName, foreignTableName, foreignTablePrimaryKeyName, new QQueryFilter());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** For a list of sourceRecords,
|
||||
** lookup records in the foreignTableName,
|
||||
** that have their foreignTablePrimaryKeyName in the sourceTableForeignKeyFieldName on the sourceRecords.
|
||||
**
|
||||
** e.g., for a list of orders (with a clientId field), build a map of client.id => client record
|
||||
** via getForeignRecordMap(input, orderList, "clientId", "client", "id")
|
||||
*******************************************************************************/
|
||||
public static Map<Serializable, QRecord> getForeignRecordMap(AbstractActionInput parentActionInput, List<QRecord> sourceRecords, String sourceTableForeignKeyFieldName, String foreignTableName, String foreignTablePrimaryKeyName, QQueryFilter additionalFilter) throws QException
|
||||
{
|
||||
Map<Serializable, QRecord> foreignRecordMap = new HashMap<>();
|
||||
QueryInput queryInput = new QueryInput(parentActionInput.getInstance());
|
||||
@ -74,7 +89,9 @@ public class GeneralProcessUtils
|
||||
queryInput.setTableName(foreignTableName);
|
||||
List<Serializable> foreignIds = new ArrayList<>(sourceRecords.stream().map(r -> r.getValue(sourceTableForeignKeyFieldName)).toList());
|
||||
|
||||
queryInput.setFilter(new QQueryFilter().withCriteria(new QFilterCriteria(foreignTablePrimaryKeyName, QCriteriaOperator.IN, foreignIds)));
|
||||
additionalFilter.addCriteria(new QFilterCriteria(foreignTablePrimaryKeyName, QCriteriaOperator.IN, foreignIds));
|
||||
queryInput.setFilter(additionalFilter);
|
||||
|
||||
QueryOutput queryOutput = new QueryAction().execute(queryInput);
|
||||
for(QRecord foreignRecord : queryOutput.getRecords())
|
||||
{
|
||||
|
@ -30,6 +30,9 @@ import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.QueryAction;
|
||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryOutput;
|
||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
||||
@ -92,6 +95,34 @@ class GeneralProcessUtilsTest
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testGetForeignRecordMapWithAdditionalFilter() throws QException
|
||||
{
|
||||
QInstance instance = TestUtils.defineInstance();
|
||||
|
||||
TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of(
|
||||
new QRecord().withValue("favoriteShapeId", 3),
|
||||
new QRecord().withValue("favoriteShapeId", 1)
|
||||
));
|
||||
TestUtils.insertDefaultShapes(instance);
|
||||
|
||||
QueryInput queryInput = new QueryInput(instance);
|
||||
queryInput.setSession(new QSession());
|
||||
queryInput.setTableName(TestUtils.TABLE_NAME_PERSON_MEMORY);
|
||||
QueryOutput queryOutput = new QueryAction().execute(queryInput);
|
||||
|
||||
QQueryFilter additionalFilter = new QQueryFilter(new QFilterCriteria("name", QCriteriaOperator.EQUALS, "Circle"));
|
||||
Map<Serializable, QRecord> foreignRecordMap = GeneralProcessUtils.getForeignRecordMap(queryInput, queryOutput.getRecords(), "favoriteShapeId", TestUtils.TABLE_NAME_SHAPE, "id", additionalFilter);
|
||||
|
||||
assertEquals(1, foreignRecordMap.size());
|
||||
assertEquals(3, foreignRecordMap.get(3).getValueInteger("id"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
|
Reference in New Issue
Block a user