From d271ab7fc82725b567f4318d7c01b8c77f1d1728 Mon Sep 17 00:00:00 2001 From: BoD Date: Mon, 22 Apr 2024 14:14:26 +0200 Subject: [PATCH] Call version of merge taking multiple records from MemoryCache when chaining --- .../cache/normalized/api/MemoryCache.kt | 28 ++++++++++++------- .../cache/normalized/api/MemoryCache.kt | 23 +++++++++------ 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/libraries/apollo-normalized-cache-api-incubating/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt b/libraries/apollo-normalized-cache-api-incubating/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt index 35e7250c41f..c5ba6c5ca7f 100644 --- a/libraries/apollo-normalized-cache-api-incubating/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt +++ b/libraries/apollo-normalized-cache-api-incubating/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt @@ -98,15 +98,7 @@ class MemoryCache( return emptySet() } return lockWrite { - val oldRecord = loadRecord(record.key, cacheHeaders) - val changedKeys = if (oldRecord == null) { - lruCache[record.key] = record - record.fieldKeys() - } else { - val (mergedRecord, changedKeys) = recordMerger.merge(existing = oldRecord, incoming = record, newDate = null) - lruCache[record.key] = mergedRecord - changedKeys - } + val changedKeys = internalMerge(record, cacheHeaders, recordMerger) changedKeys + nextCache?.merge(record, cacheHeaders, recordMerger).orEmpty() } } @@ -115,7 +107,23 @@ class MemoryCache( if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) { return emptySet() } - return lockWrite { records.flatMap { record -> merge(record, cacheHeaders, recordMerger) } }.toSet() + return lockWrite { + val changedKeys = records.flatMap { record -> internalMerge(record, cacheHeaders, recordMerger) }.toSet() + changedKeys + nextCache?.merge(records, cacheHeaders, recordMerger).orEmpty() + } + } + + private fun internalMerge(record: Record, cacheHeaders: CacheHeaders, recordMerger: RecordMerger): Set { + val oldRecord = loadRecord(record.key, cacheHeaders) + val changedKeys = if (oldRecord == null) { + lruCache[record.key] = record + record.fieldKeys() + } else { + val (mergedRecord, changedKeys) = recordMerger.merge(existing = oldRecord, incoming = record, newDate = null) + lruCache[record.key] = mergedRecord + changedKeys + } + return changedKeys } override fun dump(): Map, Map> { diff --git a/libraries/apollo-normalized-cache-api/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt b/libraries/apollo-normalized-cache-api/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt index fc19783e863..b2e689e8ffd 100644 --- a/libraries/apollo-normalized-cache-api/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt +++ b/libraries/apollo-normalized-cache-api/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt @@ -94,6 +94,19 @@ class MemoryCache( return emptySet() } + val changedKeys = internalMerge(record, cacheHeaders) + return changedKeys + nextCache?.merge(record, cacheHeaders).orEmpty() + } + + override fun merge(records: Collection, cacheHeaders: CacheHeaders): Set { + if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) { + return emptySet() + } + val changedKeys = records.flatMap { record -> internalMerge(record, cacheHeaders) }.toSet() + return changedKeys + nextCache?.merge(records, cacheHeaders).orEmpty() + } + + private fun internalMerge(record: Record, cacheHeaders: CacheHeaders): Set { val oldRecord = loadRecord(record.key, cacheHeaders) val changedKeys = if (oldRecord == null) { lruCache[record.key] = CacheEntry( @@ -109,15 +122,7 @@ class MemoryCache( ) changedKeys } - - return changedKeys + nextCache?.merge(record, cacheHeaders).orEmpty() - } - - override fun merge(records: Collection, cacheHeaders: CacheHeaders): Set { - if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) { - return emptySet() - } - return records.flatMap { record -> merge(record, cacheHeaders) }.toSet() + return changedKeys } override fun dump(): Map, Map> {