From 10338a502fe99d106bdcc4cad9108bea97d4ddb8 Mon Sep 17 00:00:00 2001 From: Martin Bonnin Date: Mon, 11 Jan 2021 19:40:40 +0100 Subject: [PATCH] make NormalizationIR internal --- .../normalized/internal/NormalizationIR.kt | 6 +++--- .../internal/NormalizationIRResponseWriter.kt | 2 +- .../cache/normalized/internal/Normalizer.kt | 6 +++--- .../internal/OperationCacheExtensions.kt | 12 +++++++++++ .../apollo/internal/RealApolloStore.kt | 20 ++++++++----------- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIR.kt b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIR.kt index e21cc2c07bf..071c116c793 100644 --- a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIR.kt +++ b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIR.kt @@ -6,7 +6,7 @@ import com.apollographql.apollo.api.ResponseField /** * A hierarchy of Json object with their fields attached used for normalization */ -object NormalizationIR { +internal object NormalizationIR { sealed class Element { class Object(val fields: kotlin.collections.List) : Element() { data class Field(val fieldKey: String, val field: ResponseField, val element: Element) @@ -17,7 +17,7 @@ object NormalizationIR { } } -fun NormalizationIR.Element.mergeWith(other: NormalizationIR.Element): NormalizationIR.Element { +internal fun NormalizationIR.Element.mergeWith(other: NormalizationIR.Element): NormalizationIR.Element { return when { this is NormalizationIR.Element.Scalar && other is NormalizationIR.Element.Scalar -> { check(this.value == other.value) @@ -50,4 +50,4 @@ fun NormalizationIR.Element.mergeWith(other: NormalizationIR.Element): Normaliza } } -fun NormalizationIR.Element.Object.Field.mergeWith(other: NormalizationIR.Element.Object.Field) = copy(element = element.mergeWith(other.element)) \ No newline at end of file +internal fun NormalizationIR.Element.Object.Field.mergeWith(other: NormalizationIR.Element.Object.Field) = copy(element = element.mergeWith(other.element)) \ No newline at end of file diff --git a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIRResponseWriter.kt b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIRResponseWriter.kt index d0510e2fa28..0b87df122c9 100644 --- a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIRResponseWriter.kt +++ b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/NormalizationIRResponseWriter.kt @@ -11,7 +11,7 @@ import com.apollographql.apollo.api.internal.Utils.shouldSkip /** * */ -class NormalizationIRResponseWriter( +internal class NormalizationIRResponseWriter( private val operationVariables: Operation.Variables, private val customScalarAdapters: CustomScalarAdapters, ) : ResponseWriter, ResponseWriter.ListItemWriter { diff --git a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/Normalizer.kt b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/Normalizer.kt index 76917fb7e5b..591074326b9 100644 --- a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/Normalizer.kt +++ b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/Normalizer.kt @@ -9,12 +9,12 @@ import com.apollographql.apollo.cache.normalized.Record /** * Takes a AJObject and returns a list of [Record] */ -class Normalizer(private val cacheKeyResolver: CacheKeyResolver) { +internal class Normalizer(private val cacheKeyResolver: CacheKeyResolver) { private val records = mutableMapOf() - fun normalize(`object`: NormalizationIR.Element.Object, rootKey: String?): Map { - `object`.normalize(rootKey, null) + fun normalize(obj: NormalizationIR.Element.Object, rootKey: String?): Map { + obj.normalize(rootKey, null) return records } diff --git a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/OperationCacheExtensions.kt b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/OperationCacheExtensions.kt index ae96d10a9b2..820c0370b2c 100644 --- a/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/OperationCacheExtensions.kt +++ b/apollo-normalized-cache/src/commonMain/kotlin/com/apollographql/apollo/cache/normalized/internal/OperationCacheExtensions.kt @@ -1,6 +1,7 @@ package com.apollographql.apollo.cache.normalized.internal import com.apollographql.apollo.api.CustomScalarAdapters +import com.apollographql.apollo.api.Fragment import com.apollographql.apollo.api.Operation import com.apollographql.apollo.cache.normalized.Record import com.apollographql.apollo.cache.normalized.CacheKeyResolver @@ -15,6 +16,17 @@ fun Operation.normalize( return Normalizer(cacheKeyResolver).normalize(writer.root, null).values.toSet() } +fun Fragment.normalize( + data: D, + customScalarAdapters: CustomScalarAdapters, + cacheKeyResolver: CacheKeyResolver, + rootKey: String +): Set { + val writer = NormalizationIRResponseWriter(variables(), customScalarAdapters) + adapter().toResponse(writer, data) + return Normalizer(cacheKeyResolver).normalize(writer.root, rootKey).values.toSet() +} + fun Set?.dependentKeys(): Set { return this?.flatMap { it.keys() + it.key diff --git a/apollo-runtime/src/main/java/com/apollographql/apollo/internal/RealApolloStore.kt b/apollo-runtime/src/main/java/com/apollographql/apollo/internal/RealApolloStore.kt index 67b55450287..51521859a55 100644 --- a/apollo-runtime/src/main/java/com/apollographql/apollo/internal/RealApolloStore.kt +++ b/apollo-runtime/src/main/java/com/apollographql/apollo/internal/RealApolloStore.kt @@ -8,6 +8,7 @@ import com.apollographql.apollo.api.Response.Companion.builder import com.apollographql.apollo.api.internal.ApolloLogger import com.apollographql.apollo.api.internal.MapResponseReader import com.apollographql.apollo.api.internal.ResponseAdapter +import com.apollographql.apollo.api.parseData import com.apollographql.apollo.cache.CacheHeaders import com.apollographql.apollo.cache.normalized.ApolloStore import com.apollographql.apollo.cache.normalized.ApolloStore.RecordChangeSubscriber @@ -23,9 +24,6 @@ import com.apollographql.apollo.cache.normalized.internal.ReadableStore import com.apollographql.apollo.cache.normalized.internal.RealCacheKeyBuilder import com.apollographql.apollo.cache.normalized.internal.Transaction import com.apollographql.apollo.cache.normalized.internal.WriteableStore -import com.apollographql.apollo.api.parseData -import com.apollographql.apollo.cache.normalized.internal.Normalizer -import com.apollographql.apollo.cache.normalized.internal.NormalizationIRResponseWriter import com.apollographql.apollo.cache.normalized.internal.dependentKeys import com.apollographql.apollo.cache.normalized.internal.normalize import java.util.ArrayList @@ -192,7 +190,7 @@ class RealApolloStore(normalizedCache: NormalizedCache, ): ApolloStoreOperation> { return object : ApolloStoreOperation>(dispatcher) { override fun perform(): Set { - val changedKeys = doWrite(operation, operationData, false, null) + val changedKeys = doWriteOperation(operation, operationData, false, null) if (publish) { publish(changedKeys) } @@ -213,7 +211,7 @@ class RealApolloStore(normalizedCache: NormalizedCache, return object : ApolloStoreOperation>(dispatcher) { override fun perform(): Set { return writeTransaction { - val changedKeys = doWrite(fragment.adapter(), cacheKey, fragment.variables(), fragmentData) + val changedKeys = doWriteFragment(fragment, cacheKey, fragmentData) if (publish) { publish(changedKeys) } @@ -227,7 +225,7 @@ class RealApolloStore(normalizedCache: NormalizedCache, mutationId: UUID): ApolloStoreOperation> { return object : ApolloStoreOperation>(dispatcher) { override fun perform(): Set { - return doWrite(operation, operationData, true, mutationId) + return doWriteOperation(operation, operationData, true, mutationId) } } } @@ -236,7 +234,7 @@ class RealApolloStore(normalizedCache: NormalizedCache, mutationId: UUID): ApolloStoreOperation { return object : ApolloStoreOperation(dispatcher) { override fun perform(): Boolean { - val changedKeys = doWrite(operation, operationData, true, mutationId) + val changedKeys = doWriteOperation(operation, operationData, true, mutationId) publish(changedKeys) return java.lang.Boolean.TRUE } @@ -307,7 +305,7 @@ class RealApolloStore(normalizedCache: NormalizedCache, }) } - fun doWrite( + fun doWriteOperation( operation: Operation, operationData: D, optimistic: Boolean, @@ -325,10 +323,8 @@ class RealApolloStore(normalizedCache: NormalizedCache, } - fun doWrite(adapter: ResponseAdapter, cacheKey: CacheKey, variables: Operation.Variables, value: D): Set = writeTransaction { - val writer = NormalizationIRResponseWriter(variables, customScalarAdapters) - adapter.toResponse(writer, value) - val records = Normalizer(cacheKeyResolver).normalize(writer.root, cacheKey.key).values.toSet() + fun doWriteFragment(fragment: Fragment, cacheKey: CacheKey, data: D): Set = writeTransaction { + val records = fragment.normalize(data, customScalarAdapters, cacheKeyResolver, cacheKey.key) merge(records, CacheHeaders.NONE) } } \ No newline at end of file