diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/CacheUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/CacheUtils.java index a54dd92e..f8e64ff7 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/CacheUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/CacheUtils.java @@ -46,7 +46,7 @@ public class CacheUtils /******************************************************************************* ** *******************************************************************************/ - static QRecord mapSourceRecordToCacheRecord(QTableMetaData table, QRecord recordFromSource) + static QRecord mapSourceRecordToCacheRecord(QTableMetaData table, QRecord recordFromSource, CacheUseCase cacheUseCase) { QRecord cacheRecord = new QRecord(recordFromSource); @@ -58,7 +58,10 @@ public class CacheUtils { if(fieldName.equals(table.getPrimaryKeyField())) { - cacheRecord.removeValue(fieldName); + if(!cacheUseCase.getDoCopySourcePrimaryKeyToCache()) + { + cacheRecord.removeValue(fieldName); + } } else if(!cacheRecord.getValues().containsKey(fieldName)) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java index e8b79d6f..2d830636 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelper.java @@ -79,9 +79,9 @@ public class QueryActionCacheHelper { private static final QLogger LOG = QLogger.getLogger(QueryActionCacheHelper.class); - private boolean isQueryInputCacheable = false; - private Set cacheUseCases = new HashSet<>(); - private CacheUseCase.Type activeCacheUseCase = null; + private boolean isQueryInputCacheable = false; + private Map cacheUseCaseMap = new HashMap<>(); + private CacheUseCase activeCacheUseCase = null; private UniqueKey cacheUniqueKey = null; private ListingHash uniqueKeyValues = new ListingHash<>(); @@ -122,7 +122,7 @@ public class QueryActionCacheHelper QTableMetaData table = queryInput.getTable(); List recordsToReturn = recordsFromSource.stream() - .map(r -> CacheUtils.mapSourceRecordToCacheRecord(table, r)) + .map(r -> CacheUtils.mapSourceRecordToCacheRecord(table, r, activeCacheUseCase)) .toList(); queryOutput.addRecords(recordsToReturn); @@ -220,7 +220,7 @@ public class QueryActionCacheHelper List refreshedRecordsToReturn = recordsFromSource.stream() .map(r -> { - QRecord recordToCache = CacheUtils.mapSourceRecordToCacheRecord(table, r); + QRecord recordToCache = CacheUtils.mapSourceRecordToCacheRecord(table, r, activeCacheUseCase); recordToCache.setValue(table.getPrimaryKeyField(), uniqueKeyToPrimaryKeyMap.get(getUniqueKeyValues(recordToCache))); return (recordToCache); }) @@ -391,10 +391,10 @@ public class QueryActionCacheHelper for(CacheUseCase cacheUseCase : CollectionUtils.nonNullList(table.getCacheOf().getUseCases())) { - cacheUseCases.add(cacheUseCase.getType()); + cacheUseCaseMap.put(cacheUseCase.getType(), cacheUseCase); } - if(cacheUseCases.contains(CacheUseCase.Type.UNIQUE_KEY_TO_UNIQUE_KEY)) + if(cacheUseCaseMap.containsKey(CacheUseCase.Type.UNIQUE_KEY_TO_UNIQUE_KEY)) { if(queryInput.getFilter() == null) { @@ -475,7 +475,7 @@ public class QueryActionCacheHelper return; } - LOG.trace("Unable to cache: No supported use case: " + cacheUseCases); + LOG.trace("Unable to cache: No supported use case: " + cacheUseCaseMap.keySet()); } @@ -491,7 +491,7 @@ public class QueryActionCacheHelper { this.cacheUniqueKey = uniqueKey; isQueryInputCacheable = true; - activeCacheUseCase = CacheUseCase.Type.UNIQUE_KEY_TO_UNIQUE_KEY; + activeCacheUseCase = cacheUseCaseMap.get(CacheUseCase.Type.UNIQUE_KEY_TO_UNIQUE_KEY); return true; } } @@ -536,14 +536,14 @@ public class QueryActionCacheHelper List recordsFromSource = null; QTableMetaData table = queryInput.getTable(); - if(CacheUseCase.Type.UNIQUE_KEY_TO_UNIQUE_KEY.equals(activeCacheUseCase)) + if(CacheUseCase.Type.UNIQUE_KEY_TO_UNIQUE_KEY.equals(activeCacheUseCase.getType())) { recordsFromSource = getFromCachedSourceForUniqueKeyToUniqueKey(queryInput, uniqueKeyValues, table.getCacheOf().getSourceTable()); } else { // todo!! - throw (new NotImplementedException("Not-yet-implemented cache use case type: " + activeCacheUseCase)); + throw (new NotImplementedException("Not-yet-implemented cache use case type: " + activeCacheUseCase.getType())); } return (recordsFromSource); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java index 1aea5d49..7f5852fb 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java @@ -49,6 +49,7 @@ public class CacheUseCase ////////////////////////// private UniqueKey cacheUniqueKey; private UniqueKey sourceUniqueKey; + private boolean doCopySourcePrimaryKeyToCache = false; private List excludeRecordsMatching; @@ -222,4 +223,35 @@ public class CacheUseCase return (this); } + + + /******************************************************************************* + ** Getter for doCopySourcePrimaryKeyToCache + *******************************************************************************/ + public boolean getDoCopySourcePrimaryKeyToCache() + { + return (this.doCopySourcePrimaryKeyToCache); + } + + + + /******************************************************************************* + ** Setter for doCopySourcePrimaryKeyToCache + *******************************************************************************/ + public void setDoCopySourcePrimaryKeyToCache(boolean doCopySourcePrimaryKeyToCache) + { + this.doCopySourcePrimaryKeyToCache = doCopySourcePrimaryKeyToCache; + } + + + + /******************************************************************************* + ** Fluent setter for doCopySourcePrimaryKeyToCache + *******************************************************************************/ + public CacheUseCase withDoCopySourcePrimaryKeyToCache(boolean doCopySourcePrimaryKeyToCache) + { + this.doCopySourcePrimaryKeyToCache = doCopySourcePrimaryKeyToCache; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java index 1f40e9ec..100d705b 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java @@ -105,6 +105,7 @@ public class QQQTablesMetaDataProvider .withCacheSourceMisses(false) .withCacheUniqueKey(new UniqueKey("name")) .withSourceUniqueKey(new UniqueKey("name")) + .withDoCopySourcePrimaryKeyToCache(true) ) );