2525import java .time .Clock ;
2626import java .time .Duration ;
2727import java .time .Instant ;
28- import java .util .*;
28+ import java .util .ArrayList ;
29+ import java .util .Collections ;
30+ import java .util .HashMap ;
31+ import java .util .List ;
32+ import java .util .Map ;
33+ import java .util .Optional ;
2934import java .util .concurrent .CompletableFuture ;
3035import java .util .function .BiConsumer ;
36+ import java .util .function .Consumer ;
3137
3238import static org .dataloader .impl .Assertions .nonNull ;
3339
5460 *
5561 * @param <K> type parameter indicating the type of the data load keys
5662 * @param <V> type parameter indicating the type of the data that is returned
57- *
5863 * @author <a href="https://github.com/aschrijver/">Arnold Schrijver</a>
5964 * @author <a href="https://github.com/bbakerman/">Brad Baker</a>
6065 */
@@ -65,6 +70,8 @@ public class DataLoader<K, V> {
6570 private final StatisticsCollector stats ;
6671 private final CacheMap <Object , V > futureCache ;
6772 private final ValueCache <K , V > valueCache ;
73+ private final DataLoaderOptions options ;
74+ private final Object batchLoadFunction ;
6875
6976 /**
7077 * Creates new DataLoader with the specified batch loader function and default options
@@ -73,9 +80,7 @@ public class DataLoader<K, V> {
7380 * @param batchLoadFunction the batch load function to use
7481 * @param <K> the key type
7582 * @param <V> the value type
76- *
7783 * @return a new DataLoader
78- *
7984 * @deprecated use {@link DataLoaderFactory} instead
8085 */
8186 @ Deprecated
@@ -90,9 +95,7 @@ public static <K, V> DataLoader<K, V> newDataLoader(BatchLoader<K, V> batchLoadF
9095 * @param options the options to use
9196 * @param <K> the key type
9297 * @param <V> the value type
93- *
9498 * @return a new DataLoader
95- *
9699 * @deprecated use {@link DataLoaderFactory} instead
97100 */
98101 @ Deprecated
@@ -114,9 +117,7 @@ public static <K, V> DataLoader<K, V> newDataLoader(BatchLoader<K, V> batchLoadF
114117 * @param batchLoadFunction the batch load function to use that uses {@link org.dataloader.Try} objects
115118 * @param <K> the key type
116119 * @param <V> the value type
117- *
118120 * @return a new DataLoader
119- *
120121 * @deprecated use {@link DataLoaderFactory} instead
121122 */
122123 @ Deprecated
@@ -133,9 +134,7 @@ public static <K, V> DataLoader<K, V> newDataLoaderWithTry(BatchLoader<K, Try<V>
133134 * @param options the options to use
134135 * @param <K> the key type
135136 * @param <V> the value type
136- *
137137 * @return a new DataLoader
138- *
139138 * @see DataLoaderFactory#newDataLoaderWithTry(BatchLoader)
140139 * @deprecated use {@link DataLoaderFactory} instead
141140 */
@@ -151,9 +150,7 @@ public static <K, V> DataLoader<K, V> newDataLoaderWithTry(BatchLoader<K, Try<V>
151150 * @param batchLoadFunction the batch load function to use
152151 * @param <K> the key type
153152 * @param <V> the value type
154- *
155153 * @return a new DataLoader
156- *
157154 * @deprecated use {@link DataLoaderFactory} instead
158155 */
159156 @ Deprecated
@@ -168,9 +165,7 @@ public static <K, V> DataLoader<K, V> newDataLoader(BatchLoaderWithContext<K, V>
168165 * @param options the options to use
169166 * @param <K> the key type
170167 * @param <V> the value type
171- *
172168 * @return a new DataLoader
173- *
174169 * @deprecated use {@link DataLoaderFactory} instead
175170 */
176171 @ Deprecated
@@ -192,9 +187,7 @@ public static <K, V> DataLoader<K, V> newDataLoader(BatchLoaderWithContext<K, V>
192187 * @param batchLoadFunction the batch load function to use that uses {@link org.dataloader.Try} objects
193188 * @param <K> the key type
194189 * @param <V> the value type
195- *
196190 * @return a new DataLoader
197- *
198191 * @deprecated use {@link DataLoaderFactory} instead
199192 */
200193 @ Deprecated
@@ -211,9 +204,7 @@ public static <K, V> DataLoader<K, V> newDataLoaderWithTry(BatchLoaderWithContex
211204 * @param options the options to use
212205 * @param <K> the key type
213206 * @param <V> the value type
214- *
215207 * @return a new DataLoader
216- *
217208 * @see DataLoaderFactory#newDataLoaderWithTry(BatchLoader)
218209 * @deprecated use {@link DataLoaderFactory} instead
219210 */
@@ -229,9 +220,7 @@ public static <K, V> DataLoader<K, V> newDataLoaderWithTry(BatchLoaderWithContex
229220 * @param batchLoadFunction the batch load function to use
230221 * @param <K> the key type
231222 * @param <V> the value type
232- *
233223 * @return a new DataLoader
234- *
235224 * @deprecated use {@link DataLoaderFactory} instead
236225 */
237226 @ Deprecated
@@ -246,9 +235,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoader(MappedBatchLoader<K, V
246235 * @param options the options to use
247236 * @param <K> the key type
248237 * @param <V> the value type
249- *
250238 * @return a new DataLoader
251- *
252239 * @deprecated use {@link DataLoaderFactory} instead
253240 */
254241 @ Deprecated
@@ -271,9 +258,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoader(MappedBatchLoader<K, V
271258 * @param batchLoadFunction the batch load function to use that uses {@link org.dataloader.Try} objects
272259 * @param <K> the key type
273260 * @param <V> the value type
274- *
275261 * @return a new DataLoader
276- *
277262 * @deprecated use {@link DataLoaderFactory} instead
278263 */
279264 @ Deprecated
@@ -290,9 +275,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoaderWithTry(MappedBatchLoad
290275 * @param options the options to use
291276 * @param <K> the key type
292277 * @param <V> the value type
293- *
294278 * @return a new DataLoader
295- *
296279 * @see DataLoaderFactory#newDataLoaderWithTry(BatchLoader)
297280 * @deprecated use {@link DataLoaderFactory} instead
298281 */
@@ -308,9 +291,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoaderWithTry(MappedBatchLoad
308291 * @param batchLoadFunction the batch load function to use
309292 * @param <K> the key type
310293 * @param <V> the value type
311- *
312294 * @return a new DataLoader
313- *
314295 * @deprecated use {@link DataLoaderFactory} instead
315296 */
316297 @ Deprecated
@@ -325,9 +306,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoader(MappedBatchLoaderWithC
325306 * @param options the options to use
326307 * @param <K> the key type
327308 * @param <V> the value type
328- *
329309 * @return a new DataLoader
330- *
331310 * @deprecated use {@link DataLoaderFactory} instead
332311 */
333312 @ Deprecated
@@ -349,9 +328,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoader(MappedBatchLoaderWithC
349328 * @param batchLoadFunction the batch load function to use that uses {@link org.dataloader.Try} objects
350329 * @param <K> the key type
351330 * @param <V> the value type
352- *
353331 * @return a new DataLoader
354- *
355332 * @deprecated use {@link DataLoaderFactory} instead
356333 */
357334 @ Deprecated
@@ -368,9 +345,7 @@ public static <K, V> DataLoader<K, V> newMappedDataLoaderWithTry(MappedBatchLoad
368345 * @param options the options to use
369346 * @param <K> the key type
370347 * @param <V> the value type
371- *
372348 * @return a new DataLoader
373- *
374349 * @see DataLoaderFactory#newDataLoaderWithTry(BatchLoader)
375350 * @deprecated use {@link DataLoaderFactory} instead
376351 */
@@ -383,7 +358,6 @@ public static <K, V> DataLoader<K, V> newMappedDataLoaderWithTry(MappedBatchLoad
383358 * Creates a new data loader with the provided batch load function, and default options.
384359 *
385360 * @param batchLoadFunction the batch load function to use
386- *
387361 * @deprecated use {@link DataLoaderFactory} instead
388362 */
389363 @ Deprecated
@@ -396,7 +370,6 @@ public DataLoader(BatchLoader<K, V> batchLoadFunction) {
396370 *
397371 * @param batchLoadFunction the batch load function to use
398372 * @param options the batch load options
399- *
400373 * @deprecated use {@link DataLoaderFactory} instead
401374 */
402375 @ Deprecated
@@ -416,6 +389,8 @@ public DataLoader(BatchLoader<K, V> batchLoadFunction, DataLoaderOptions options
416389 this .valueCache = determineValueCache (loaderOptions );
417390 // order of keys matter in data loader
418391 this .stats = nonNull (loaderOptions .getStatisticsCollector ());
392+ this .batchLoadFunction = nonNull (batchLoadFunction );
393+ this .options = loaderOptions ;
419394
420395 this .helper = new DataLoaderHelper <>(this , batchLoadFunction , loaderOptions , this .futureCache , this .valueCache , this .stats , clock );
421396 }
@@ -431,6 +406,32 @@ private ValueCache<K, V> determineValueCache(DataLoaderOptions loaderOptions) {
431406 return (ValueCache <K , V >) loaderOptions .valueCache ().orElseGet (ValueCache ::defaultValueCache );
432407 }
433408
409+ /**
410+ * @return the options used to build this {@link DataLoader}
411+ */
412+ public DataLoaderOptions getOptions () {
413+ return options ;
414+ }
415+
416+ /**
417+ * @return the batch load interface used to build this {@link DataLoader}
418+ */
419+ public Object getBatchLoadFunction () {
420+ return batchLoadFunction ;
421+ }
422+
423+ /**
424+ * This allows you to change the current {@link DataLoader} and turn it into a new one
425+ *
426+ * @param builderConsumer the {@link DataLoaderFactory.Builder} consumer for changing the {@link DataLoader}
427+ * @return a newly built {@link DataLoader} instance
428+ */
429+ public DataLoader <K , V > transform (Consumer <DataLoaderFactory .Builder <K , V >> builderConsumer ) {
430+ DataLoaderFactory .Builder <K , V > builder = DataLoaderFactory .builder (this );
431+ builderConsumer .accept (builder );
432+ return builder .build ();
433+ }
434+
434435 /**
435436 * This returns the last instant the data loader was dispatched. When the data loader is created this value is set to now.
436437 *
@@ -457,7 +458,6 @@ public Duration getTimeSinceDispatch() {
457458 * and returned from cache).
458459 *
459460 * @param key the key to load
460- *
461461 * @return the future of the value
462462 */
463463 public CompletableFuture <V > load (K key ) {
@@ -475,7 +475,6 @@ public CompletableFuture<V> load(K key) {
475475 * NOTE : This will NOT cause a data load to happen. You must call {@link #load(Object)} for that to happen.
476476 *
477477 * @param key the key to check
478- *
479478 * @return an Optional to the future of the value
480479 */
481480 public Optional <CompletableFuture <V >> getIfPresent (K key ) {
@@ -494,7 +493,6 @@ public Optional<CompletableFuture<V>> getIfPresent(K key) {
494493 * NOTE : This will NOT cause a data load to happen. You must call {@link #load(Object)} for that to happen.
495494 *
496495 * @param key the key to check
497- *
498496 * @return an Optional to the future of the value
499497 */
500498 public Optional <CompletableFuture <V >> getIfCompleted (K key ) {
@@ -514,7 +512,6 @@ public Optional<CompletableFuture<V>> getIfCompleted(K key) {
514512 *
515513 * @param key the key to load
516514 * @param keyContext a context object that is specific to this key
517- *
518515 * @return the future of the value
519516 */
520517 public CompletableFuture <V > load (K key , Object keyContext ) {
@@ -530,7 +527,6 @@ public CompletableFuture<V> load(K key, Object keyContext) {
530527 * and returned from cache).
531528 *
532529 * @param keys the list of keys to load
533- *
534530 * @return the composite future of the list of values
535531 */
536532 public CompletableFuture <List <V >> loadMany (List <K > keys ) {
@@ -550,7 +546,6 @@ public CompletableFuture<List<V>> loadMany(List<K> keys) {
550546 *
551547 * @param keys the list of keys to load
552548 * @param keyContexts the list of key calling context objects
553- *
554549 * @return the composite future of the list of values
555550 */
556551 public CompletableFuture <List <V >> loadMany (List <K > keys , List <Object > keyContexts ) {
@@ -583,7 +578,6 @@ public CompletableFuture<List<V>> loadMany(List<K> keys, List<Object> keyContext
583578 * {@link org.dataloader.MappedBatchLoaderWithContext} to help retrieve data.
584579 *
585580 * @param keysAndContexts the map of keys to their respective contexts
586- *
587581 * @return the composite future of the map of keys and values
588582 */
589583 public CompletableFuture <Map <K , V >> loadMany (Map <K , ?> keysAndContexts ) {
@@ -656,7 +650,6 @@ public int dispatchDepth() {
656650 * on the next load request.
657651 *
658652 * @param key the key to remove
659- *
660653 * @return the data loader for fluent coding
661654 */
662655 public DataLoader <K , V > clear (K key ) {
@@ -670,7 +663,6 @@ public DataLoader<K, V> clear(K key) {
670663 *
671664 * @param key the key to remove
672665 * @param handler a handler that will be called after the async remote clear completes
673- *
674666 * @return the data loader for fluent coding
675667 */
676668 public DataLoader <K , V > clear (K key , BiConsumer <Void , Throwable > handler ) {
@@ -696,7 +688,6 @@ public DataLoader<K, V> clearAll() {
696688 * Clears the entire cache map of the loader, and of the cached value store.
697689 *
698690 * @param handler a handler that will be called after the async remote clear all completes
699- *
700691 * @return the data loader for fluent coding
701692 */
702693 public DataLoader <K , V > clearAll (BiConsumer <Void , Throwable > handler ) {
@@ -714,7 +705,6 @@ public DataLoader<K, V> clearAll(BiConsumer<Void, Throwable> handler) {
714705 *
715706 * @param key the key
716707 * @param value the value
717- *
718708 * @return the data loader for fluent coding
719709 */
720710 public DataLoader <K , V > prime (K key , V value ) {
@@ -726,7 +716,6 @@ public DataLoader<K, V> prime(K key, V value) {
726716 *
727717 * @param key the key
728718 * @param error the exception to prime instead of a value
729- *
730719 * @return the data loader for fluent coding
731720 */
732721 public DataLoader <K , V > prime (K key , Exception error ) {
@@ -740,7 +729,6 @@ public DataLoader<K, V> prime(K key, Exception error) {
740729 *
741730 * @param key the key
742731 * @param value the value
743- *
744732 * @return the data loader for fluent coding
745733 */
746734 public DataLoader <K , V > prime (K key , CompletableFuture <V > value ) {
@@ -760,7 +748,6 @@ public DataLoader<K, V> prime(K key, CompletableFuture<V> value) {
760748 * If no cache key function is present in {@link DataLoaderOptions}, then the returned value equals the input key.
761749 *
762750 * @param key the input key
763- *
764751 * @return the cache key after the input is transformed with the cache key function
765752 */
766753 public Object getCacheKey (K key ) {
@@ -779,6 +766,7 @@ public Statistics getStatistics() {
779766
780767 /**
781768 * Gets the cacheMap associated with this data loader passed in via {@link DataLoaderOptions#cacheMap()}
769+ *
782770 * @return the cacheMap of this data loader
783771 */
784772 public CacheMap <Object , V > getCacheMap () {
@@ -788,6 +776,7 @@ public CacheMap<Object, V> getCacheMap() {
788776
789777 /**
790778 * Gets the valueCache associated with this data loader passed in via {@link DataLoaderOptions#valueCache()}
779+ *
791780 * @return the valueCache of this data loader
792781 */
793782 public ValueCache <K , V > getValueCache () {
0 commit comments