Skip to content

Commit 9bbddfa

Browse files
committed
Sql cache: use a single transaction when using MemoryCache chaining (apollographql#5840)
1 parent e0aaeb2 commit 9bbddfa

File tree

2 files changed

+32
-19
lines changed
  • libraries
    • apollo-normalized-cache-api-incubating/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api
    • apollo-normalized-cache-api/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api

2 files changed

+32
-19
lines changed

libraries/apollo-normalized-cache-api-incubating/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,7 @@ class MemoryCache(
9898
return emptySet()
9999
}
100100
return lockWrite {
101-
val oldRecord = loadRecord(record.key, cacheHeaders)
102-
val changedKeys = if (oldRecord == null) {
103-
lruCache[record.key] = record
104-
record.fieldKeys()
105-
} else {
106-
val (mergedRecord, changedKeys) = recordMerger.merge(existing = oldRecord, incoming = record, newDate = null)
107-
lruCache[record.key] = mergedRecord
108-
changedKeys
109-
}
101+
val changedKeys = internalMerge(record, cacheHeaders, recordMerger)
110102
changedKeys + nextCache?.merge(record, cacheHeaders, recordMerger).orEmpty()
111103
}
112104
}
@@ -115,7 +107,23 @@ class MemoryCache(
115107
if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) {
116108
return emptySet()
117109
}
118-
return lockWrite { records.flatMap { record -> merge(record, cacheHeaders, recordMerger) } }.toSet()
110+
return lockWrite {
111+
val changedKeys = records.flatMap { record -> internalMerge(record, cacheHeaders, recordMerger) }.toSet()
112+
changedKeys + nextCache?.merge(records, cacheHeaders, recordMerger).orEmpty()
113+
}
114+
}
115+
116+
private fun internalMerge(record: Record, cacheHeaders: CacheHeaders, recordMerger: RecordMerger): Set<String> {
117+
val oldRecord = loadRecord(record.key, cacheHeaders)
118+
val changedKeys = if (oldRecord == null) {
119+
lruCache[record.key] = record
120+
record.fieldKeys()
121+
} else {
122+
val (mergedRecord, changedKeys) = recordMerger.merge(existing = oldRecord, incoming = record, newDate = null)
123+
lruCache[record.key] = mergedRecord
124+
changedKeys
125+
}
126+
return changedKeys
119127
}
120128

121129
override fun dump(): Map<KClass<*>, Map<String, Record>> {

libraries/apollo-normalized-cache-api/src/commonMain/kotlin/com/apollographql/apollo3/cache/normalized/api/MemoryCache.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,19 @@ class MemoryCache(
9494
return emptySet()
9595
}
9696

97+
val changedKeys = internalMerge(record, cacheHeaders)
98+
return changedKeys + nextCache?.merge(record, cacheHeaders).orEmpty()
99+
}
100+
101+
override fun merge(records: Collection<Record>, cacheHeaders: CacheHeaders): Set<String> {
102+
if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) {
103+
return emptySet()
104+
}
105+
val changedKeys = records.flatMap { record -> internalMerge(record, cacheHeaders) }.toSet()
106+
return changedKeys + nextCache?.merge(records, cacheHeaders).orEmpty()
107+
}
108+
109+
private fun internalMerge(record: Record, cacheHeaders: CacheHeaders): Set<String> {
97110
val oldRecord = loadRecord(record.key, cacheHeaders)
98111
val changedKeys = if (oldRecord == null) {
99112
lruCache[record.key] = CacheEntry(
@@ -109,15 +122,7 @@ class MemoryCache(
109122
)
110123
changedKeys
111124
}
112-
113-
return changedKeys + nextCache?.merge(record, cacheHeaders).orEmpty()
114-
}
115-
116-
override fun merge(records: Collection<Record>, cacheHeaders: CacheHeaders): Set<String> {
117-
if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) {
118-
return emptySet()
119-
}
120-
return records.flatMap { record -> merge(record, cacheHeaders) }.toSet()
125+
return changedKeys
121126
}
122127

123128
override fun dump(): Map<KClass<*>, Map<String, Record>> {

0 commit comments

Comments
 (0)