diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java index bf83def8..e1b7e137 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java @@ -67,6 +67,21 @@ public class GeneralProcessUtils ** via getForeignRecordMap(input, orderList, "clientId", "client", "id") *******************************************************************************/ public static Map getForeignRecordMap(AbstractActionInput parentActionInput, List 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 getForeignRecordMap(AbstractActionInput parentActionInput, List sourceRecords, String sourceTableForeignKeyFieldName, String foreignTableName, String foreignTablePrimaryKeyName, QQueryFilter additionalFilter) throws QException { Map foreignRecordMap = new HashMap<>(); QueryInput queryInput = new QueryInput(parentActionInput.getInstance()); @@ -74,7 +89,9 @@ public class GeneralProcessUtils queryInput.setTableName(foreignTableName); List 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()) { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java index f002552a..433f5f96 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java @@ -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 foreignRecordMap = GeneralProcessUtils.getForeignRecordMap(queryInput, queryOutput.getRecords(), "favoriteShapeId", TestUtils.TABLE_NAME_SHAPE, "id", additionalFilter); + + assertEquals(1, foreignRecordMap.size()); + assertEquals(3, foreignRecordMap.get(3).getValueInteger("id")); + } + + + /******************************************************************************* ** *******************************************************************************/