diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/RecordLookupHelper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/RecordLookupHelper.java index 527b7bfc..94ca1986 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/RecordLookupHelper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/RecordLookupHelper.java @@ -29,8 +29,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; +import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetInput; 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; @@ -48,8 +51,11 @@ import com.kingsrook.qqq.backend.core.utils.ValueUtils; *******************************************************************************/ public class RecordLookupHelper { - private Map> recordMaps = new HashMap<>(); - private Set preloadedKeys = new HashSet<>(); + private Map> recordMaps = new HashMap<>(); + + private Map, QRecord>> uniqueKeyMaps = new HashMap<>(); + + private Set preloadedKeys = new HashSet<>(); private Set> disallowedOneOffLookups = new HashSet<>(); @@ -65,6 +71,25 @@ public class RecordLookupHelper + /******************************************************************************* + ** Fetch a record from a table by a uniqueKey from the table + *******************************************************************************/ + public QRecord getRecordByUniqueKey(String tableName, Map uniqueKey) throws QException + { + String mapKey = tableName + "." + uniqueKey.keySet().stream().sorted().collect(Collectors.joining(",")); + Map, QRecord> recordMap = uniqueKeyMaps.computeIfAbsent(mapKey, (k) -> new HashMap<>()); + + if(!recordMap.containsKey(uniqueKey)) + { + QRecord record = new GetAction().executeForRecord(new GetInput(tableName).withUniqueKey(uniqueKey)); + recordMap.put(uniqueKey, record); + } + + return (recordMap.get(uniqueKey)); + } + + + /******************************************************************************* ** Fetch a record from a table by a key field (doesn't have to be its primary key). *******************************************************************************/