/** * @param record The {@link Record} to merge. * @param cacheHeaders The {@link CacheHeaders} associated with the request which generated this record. * @return A set of record field keys that have changed. This set is returned by {@link Record#mergeWith(Record)}. */ @NotNull public Set<String> merge(@NotNull final Record record, @NotNull final CacheHeaders cacheHeaders) { checkNotNull(record, "apolloRecord == null"); checkNotNull(cacheHeaders, "cacheHeaders == null"); if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) { return Collections.emptySet(); } Set<String> nextCacheChangedKeys = nextCache().map(new Function<NormalizedCache, Set<String>>() { @NotNull @Override public Set<String> apply(@NotNull NormalizedCache cache) { return cache.merge(record, cacheHeaders); } }).or(Collections.<String>emptySet()); Set<String> currentCacheChangedKeys = performMerge(record, cacheHeaders); Set<String> changedKeys = new HashSet<>(); changedKeys.addAll(nextCacheChangedKeys); changedKeys.addAll(currentCacheChangedKeys); return changedKeys; }
/** * Calls through to {@link NormalizedCache#merge(Record, CacheHeaders)}. Implementations should override this method * if the underlying storage technology can offer an optimized manner to store multiple records. * * @param recordSet The set of Records to merge. * @param cacheHeaders The {@link CacheHeaders} associated with the request which generated this record. * @return A set of record field keys that have changed. This set is returned by {@link Record#mergeWith(Record)}. */ @NotNull public Set<String> merge(@NotNull final Collection<Record> recordSet, @NotNull final CacheHeaders cacheHeaders) { checkNotNull(recordSet, "recordSet == null"); checkNotNull(cacheHeaders, "cacheHeaders == null"); if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) { return Collections.emptySet(); } //noinspection ResultOfMethodCallIgnored Set<String> nextCacheChangedKeys = nextCache().map(new Function<NormalizedCache, Set<String>>() { @NotNull @Override public Set<String> apply(@NotNull NormalizedCache cache) { return cache.merge(recordSet, cacheHeaders); } }).or(Collections.<String>emptySet()); Set<String> currentCacheChangedKeys = new HashSet<>(); for (Record record : recordSet) { currentCacheChangedKeys.addAll(performMerge(record, cacheHeaders)); } Set<String> changedKeys = new HashSet<>(); changedKeys.addAll(nextCacheChangedKeys); changedKeys.addAll(currentCacheChangedKeys); return changedKeys; }