From 90f836472ae8ef347c3affd754ea555920922171 Mon Sep 17 00:00:00 2001 From: samvazquez Date: Mon, 25 Apr 2022 22:15:36 -0700 Subject: [PATCH 1/7] feat: get all read-only values from cacheMap --- src/main/java/org/dataloader/CacheMap.java | 7 +++ src/main/java/org/dataloader/DataLoader.java | 12 ++-- .../java/org/dataloader/DataLoaderHelper.java | 12 ++-- .../org/dataloader/impl/DefaultCacheMap.java | 11 +++- src/test/java/ReadmeExamples.java | 10 ++-- .../dataloader/DataLoaderCacheMapTest.java | 60 +++++++++++++++++++ .../dataloader/DataLoaderIfPresentTest.java | 1 - .../dataloader/fixtures/CustomCacheMap.java | 6 ++ 8 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 src/test/java/org/dataloader/DataLoaderCacheMapTest.java diff --git a/src/main/java/org/dataloader/CacheMap.java b/src/main/java/org/dataloader/CacheMap.java index 0db31b8..9859485 100644 --- a/src/main/java/org/dataloader/CacheMap.java +++ b/src/main/java/org/dataloader/CacheMap.java @@ -19,6 +19,7 @@ import org.dataloader.annotations.PublicSpi; import org.dataloader.impl.DefaultCacheMap; +import java.util.Collection; import java.util.concurrent.CompletableFuture; /** @@ -73,6 +74,12 @@ static CacheMap simpleMap() { */ CompletableFuture get(K key); + /** + * Gets a collection of CompletableFutures of the cache map. + * @return the collection of cached values + */ + Collection> getAll(); + /** * Creates a new cache map entry with the specified key and value, or updates the value if the key already exists. * diff --git a/src/main/java/org/dataloader/DataLoader.java b/src/main/java/org/dataloader/DataLoader.java index 05abf42..5670ecf 100644 --- a/src/main/java/org/dataloader/DataLoader.java +++ b/src/main/java/org/dataloader/DataLoader.java @@ -25,10 +25,7 @@ import java.time.Clock; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; @@ -452,6 +449,13 @@ public Duration getTimeSinceDispatch() { return Duration.between(helper.getLastDispatchTime(), helper.now()); } + /** + * This returns a read-only collection of CompletableFutures of the cache map. + * @return read-only collection of CompletableFutures + */ + public Collection> getCacheFutures() { + return helper.getCacheFutures(); + } /** * Requests to load the data with the specified key asynchronously, and returns a future of the resulting value. diff --git a/src/main/java/org/dataloader/DataLoaderHelper.java b/src/main/java/org/dataloader/DataLoaderHelper.java index ae22e04..cc8aacc 100644 --- a/src/main/java/org/dataloader/DataLoaderHelper.java +++ b/src/main/java/org/dataloader/DataLoaderHelper.java @@ -7,13 +7,7 @@ import java.time.Clock; import java.time.Instant; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; @@ -99,6 +93,10 @@ public Instant getLastDispatchTime() { return lastDispatchTime.get(); } + public Collection> getCacheFutures() { + return Collections.unmodifiableCollection(futureCache.getAll()); + } + Optional> getIfPresent(K key) { synchronized (dataLoader) { boolean cachingEnabled = loaderOptions.cachingEnabled(); diff --git a/src/main/java/org/dataloader/impl/DefaultCacheMap.java b/src/main/java/org/dataloader/impl/DefaultCacheMap.java index 9346ad8..3aa4777 100644 --- a/src/main/java/org/dataloader/impl/DefaultCacheMap.java +++ b/src/main/java/org/dataloader/impl/DefaultCacheMap.java @@ -19,8 +19,7 @@ import org.dataloader.CacheMap; import org.dataloader.annotations.Internal; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; /** @@ -60,6 +59,14 @@ public CompletableFuture get(K key) { return cache.get(key); } + /** + * {@inheritDoc} + */ + @Override + public Collection> getAll() { + return cache.values(); + } + /** * {@inheritDoc} */ diff --git a/src/test/java/ReadmeExamples.java b/src/test/java/ReadmeExamples.java index 33b1607..6e228a7 100644 --- a/src/test/java/ReadmeExamples.java +++ b/src/test/java/ReadmeExamples.java @@ -16,10 +16,7 @@ import org.dataloader.stats.ThreadLocalStatisticsCollector; import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.stream.Collectors; @@ -221,6 +218,11 @@ public CompletableFuture get(Object key) { return null; } + @Override + public Collection> getAll() { + return null; + } + @Override public CacheMap set(Object key, CompletableFuture value) { return null; diff --git a/src/test/java/org/dataloader/DataLoaderCacheMapTest.java b/src/test/java/org/dataloader/DataLoaderCacheMapTest.java new file mode 100644 index 0000000..b2d8fdf --- /dev/null +++ b/src/test/java/org/dataloader/DataLoaderCacheMapTest.java @@ -0,0 +1,60 @@ +package org.dataloader; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static org.dataloader.DataLoaderFactory.newDataLoader; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Tests for cacheMap functionality.. + */ +public class DataLoaderCacheMapTest { + + private BatchLoader keysAsValues() { + return CompletableFuture::completedFuture; + } + + @Test + public void should_provide_all_futures_from_cache() { + DataLoader dataLoader = newDataLoader(keysAsValues()); + + dataLoader.load(1); + dataLoader.load(2); + dataLoader.load(1); + + Collection> futures = dataLoader.getCacheFutures(); + assertThat(futures.size(), equalTo(2)); + } + + @Test + public void should_access_to_future_dependants() { + DataLoader dataLoader = newDataLoader(keysAsValues()); + + dataLoader.load(1).handle((v, t) -> t); + dataLoader.load(2).handle((v, t) -> t); + dataLoader.load(1).handle((v, t) -> t); + + Collection> futures = dataLoader.getCacheFutures(); + + List> futuresList = new ArrayList<>(futures); + assertThat(futuresList.get(0).getNumberOfDependents(), equalTo(2)); + assertThat(futuresList.get(1).getNumberOfDependents(), equalTo(1)); + } + + @Test(expected = UnsupportedOperationException.class) + public void should_throw_exception__on_mutation_attempt() { + DataLoader dataLoader = newDataLoader(keysAsValues()); + + dataLoader.load(1).handle((v, t) -> t); + + Collection> futures = dataLoader.getCacheFutures(); + + futures.add(CompletableFuture.completedFuture(2)); + } +} diff --git a/src/test/java/org/dataloader/DataLoaderIfPresentTest.java b/src/test/java/org/dataloader/DataLoaderIfPresentTest.java index 5e29d54..916fdef 100644 --- a/src/test/java/org/dataloader/DataLoaderIfPresentTest.java +++ b/src/test/java/org/dataloader/DataLoaderIfPresentTest.java @@ -11,7 +11,6 @@ import static org.hamcrest.Matchers.sameInstance; import static org.junit.Assert.assertThat; - /** * Tests for IfPresent and IfCompleted functionality. */ diff --git a/src/test/java/org/dataloader/fixtures/CustomCacheMap.java b/src/test/java/org/dataloader/fixtures/CustomCacheMap.java index 51e6687..695da5e 100644 --- a/src/test/java/org/dataloader/fixtures/CustomCacheMap.java +++ b/src/test/java/org/dataloader/fixtures/CustomCacheMap.java @@ -2,6 +2,7 @@ import org.dataloader.CacheMap; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -24,6 +25,11 @@ public CompletableFuture get(String key) { return stash.get(key); } + @Override + public Collection> getAll() { + return stash.values(); + } + @Override public CacheMap set(String key, CompletableFuture value) { stash.put(key, value); From e9287320abd6c852eabb0311d8984a18804983f3 Mon Sep 17 00:00:00 2001 From: samvazquez Date: Tue, 26 Apr 2022 09:28:14 -0700 Subject: [PATCH 2/7] feat: avoid importing all --- src/main/java/org/dataloader/DataLoaderHelper.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dataloader/DataLoaderHelper.java b/src/main/java/org/dataloader/DataLoaderHelper.java index cc8aacc..993fa53 100644 --- a/src/main/java/org/dataloader/DataLoaderHelper.java +++ b/src/main/java/org/dataloader/DataLoaderHelper.java @@ -7,7 +7,14 @@ import java.time.Clock; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; From b88f1ff5f0b530ef09eb5137e5fa40d5f80304aa Mon Sep 17 00:00:00 2001 From: samvazquez Date: Tue, 26 Apr 2022 09:29:01 -0700 Subject: [PATCH 3/7] feat: avoid importing all --- src/main/java/org/dataloader/DataLoader.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dataloader/DataLoader.java b/src/main/java/org/dataloader/DataLoader.java index 5670ecf..07c4a85 100644 --- a/src/main/java/org/dataloader/DataLoader.java +++ b/src/main/java/org/dataloader/DataLoader.java @@ -25,7 +25,11 @@ import java.time.Clock; import java.time.Duration; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; From 1bc485bac86abec0405bdd2821a7c0f0f812df14 Mon Sep 17 00:00:00 2001 From: samvazquez Date: Tue, 26 Apr 2022 09:30:20 -0700 Subject: [PATCH 4/7] feat: avoid importing all --- src/main/java/org/dataloader/impl/DefaultCacheMap.java | 4 +++- src/test/java/ReadmeExamples.java | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/dataloader/impl/DefaultCacheMap.java b/src/main/java/org/dataloader/impl/DefaultCacheMap.java index 3aa4777..fa89bb0 100644 --- a/src/main/java/org/dataloader/impl/DefaultCacheMap.java +++ b/src/main/java/org/dataloader/impl/DefaultCacheMap.java @@ -19,7 +19,9 @@ import org.dataloader.CacheMap; import org.dataloader.annotations.Internal; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CompletableFuture; /** diff --git a/src/test/java/ReadmeExamples.java b/src/test/java/ReadmeExamples.java index 6e228a7..e37550e 100644 --- a/src/test/java/ReadmeExamples.java +++ b/src/test/java/ReadmeExamples.java @@ -16,7 +16,11 @@ import org.dataloader.stats.ThreadLocalStatisticsCollector; import java.time.Duration; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.stream.Collectors; From 176f85f609a9803c2aadd0c6e06074771fd76b46 Mon Sep 17 00:00:00 2001 From: samvazquez Date: Thu, 5 May 2022 22:50:51 -0700 Subject: [PATCH 5/7] feat: futureCache getAll in DataLoader --- src/main/java/org/dataloader/CacheMap.java | 3 ++- src/main/java/org/dataloader/DataLoader.java | 2 +- src/main/java/org/dataloader/DataLoaderHelper.java | 5 ----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/dataloader/CacheMap.java b/src/main/java/org/dataloader/CacheMap.java index 9859485..36e5385 100644 --- a/src/main/java/org/dataloader/CacheMap.java +++ b/src/main/java/org/dataloader/CacheMap.java @@ -20,6 +20,7 @@ import org.dataloader.impl.DefaultCacheMap; import java.util.Collection; +import java.util.Collections; import java.util.concurrent.CompletableFuture; /** @@ -75,7 +76,7 @@ static CacheMap simpleMap() { CompletableFuture get(K key); /** - * Gets a collection of CompletableFutures of the cache map. + * Gets a read-only collection of CompletableFutures of the cache map. * @return the collection of cached values */ Collection> getAll(); diff --git a/src/main/java/org/dataloader/DataLoader.java b/src/main/java/org/dataloader/DataLoader.java index 07c4a85..c70a9e8 100644 --- a/src/main/java/org/dataloader/DataLoader.java +++ b/src/main/java/org/dataloader/DataLoader.java @@ -458,7 +458,7 @@ public Duration getTimeSinceDispatch() { * @return read-only collection of CompletableFutures */ public Collection> getCacheFutures() { - return helper.getCacheFutures(); + return Collections.unmodifiableCollection(futureCache.getAll()); } /** diff --git a/src/main/java/org/dataloader/DataLoaderHelper.java b/src/main/java/org/dataloader/DataLoaderHelper.java index 993fa53..ae22e04 100644 --- a/src/main/java/org/dataloader/DataLoaderHelper.java +++ b/src/main/java/org/dataloader/DataLoaderHelper.java @@ -9,7 +9,6 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -100,10 +99,6 @@ public Instant getLastDispatchTime() { return lastDispatchTime.get(); } - public Collection> getCacheFutures() { - return Collections.unmodifiableCollection(futureCache.getAll()); - } - Optional> getIfPresent(K key) { synchronized (dataLoader) { boolean cachingEnabled = loaderOptions.cachingEnabled(); From 908a4a3d2262512d34e0ab931d2c054a0b345707 Mon Sep 17 00:00:00 2001 From: samvazquez Date: Thu, 5 May 2022 22:52:46 -0700 Subject: [PATCH 6/7] feat: update javadocs --- src/main/java/org/dataloader/CacheMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/dataloader/CacheMap.java b/src/main/java/org/dataloader/CacheMap.java index 36e5385..7e6948a 100644 --- a/src/main/java/org/dataloader/CacheMap.java +++ b/src/main/java/org/dataloader/CacheMap.java @@ -76,7 +76,7 @@ static CacheMap simpleMap() { CompletableFuture get(K key); /** - * Gets a read-only collection of CompletableFutures of the cache map. + * Gets a collection of CompletableFutures from the cache map. * @return the collection of cached values */ Collection> getAll(); From b04dfa039dbff257ec9cf9ed990686e8234da7bd Mon Sep 17 00:00:00 2001 From: samvazquez Date: Tue, 10 May 2022 23:02:40 -0700 Subject: [PATCH 7/7] feat: getters for futureCache and cacheMap --- src/main/java/org/dataloader/CacheMap.java | 1 - src/main/java/org/dataloader/DataLoader.java | 26 ++++++++++++------- .../dataloader/DataLoaderCacheMapTest.java | 15 ++--------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/dataloader/CacheMap.java b/src/main/java/org/dataloader/CacheMap.java index 7e6948a..6d27a47 100644 --- a/src/main/java/org/dataloader/CacheMap.java +++ b/src/main/java/org/dataloader/CacheMap.java @@ -20,7 +20,6 @@ import org.dataloader.impl.DefaultCacheMap; import java.util.Collection; -import java.util.Collections; import java.util.concurrent.CompletableFuture; /** diff --git a/src/main/java/org/dataloader/DataLoader.java b/src/main/java/org/dataloader/DataLoader.java index c70a9e8..e800a55 100644 --- a/src/main/java/org/dataloader/DataLoader.java +++ b/src/main/java/org/dataloader/DataLoader.java @@ -26,7 +26,6 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -453,14 +452,6 @@ public Duration getTimeSinceDispatch() { return Duration.between(helper.getLastDispatchTime(), helper.now()); } - /** - * This returns a read-only collection of CompletableFutures of the cache map. - * @return read-only collection of CompletableFutures - */ - public Collection> getCacheFutures() { - return Collections.unmodifiableCollection(futureCache.getAll()); - } - /** * Requests to load the data with the specified key asynchronously, and returns a future of the resulting value. *

@@ -760,4 +751,21 @@ public Statistics getStatistics() { return stats.getStatistics(); } + /** + * Gets the cacheMap associated with this data loader passed in via {@link DataLoaderOptions#cacheMap()} + * @return the cacheMap of this data loader + */ + public CacheMap getCacheMap() { + return futureCache; + } + + + /** + * Gets the valueCache associated with this data loader passed in via {@link DataLoaderOptions#valueCache()} + * @return the valueCache of this data loader + */ + public ValueCache getValueCache() { + return valueCache; + } + } diff --git a/src/test/java/org/dataloader/DataLoaderCacheMapTest.java b/src/test/java/org/dataloader/DataLoaderCacheMapTest.java index b2d8fdf..abfc8d3 100644 --- a/src/test/java/org/dataloader/DataLoaderCacheMapTest.java +++ b/src/test/java/org/dataloader/DataLoaderCacheMapTest.java @@ -28,7 +28,7 @@ public void should_provide_all_futures_from_cache() { dataLoader.load(2); dataLoader.load(1); - Collection> futures = dataLoader.getCacheFutures(); + Collection> futures = dataLoader.getCacheMap().getAll(); assertThat(futures.size(), equalTo(2)); } @@ -40,21 +40,10 @@ public void should_access_to_future_dependants() { dataLoader.load(2).handle((v, t) -> t); dataLoader.load(1).handle((v, t) -> t); - Collection> futures = dataLoader.getCacheFutures(); + Collection> futures = dataLoader.getCacheMap().getAll(); List> futuresList = new ArrayList<>(futures); assertThat(futuresList.get(0).getNumberOfDependents(), equalTo(2)); assertThat(futuresList.get(1).getNumberOfDependents(), equalTo(1)); } - - @Test(expected = UnsupportedOperationException.class) - public void should_throw_exception__on_mutation_attempt() { - DataLoader dataLoader = newDataLoader(keysAsValues()); - - dataLoader.load(1).handle((v, t) -> t); - - Collection> futures = dataLoader.getCacheFutures(); - - futures.add(CompletableFuture.completedFuture(2)); - } }