diff --git a/src/main/java/org/dataloader/BatchLoader.java b/src/main/java/org/dataloader/BatchLoader.java
index 2b0c3c5..df11f89 100644
--- a/src/main/java/org/dataloader/BatchLoader.java
+++ b/src/main/java/org/dataloader/BatchLoader.java
@@ -17,8 +17,8 @@
package org.dataloader;
import org.dataloader.annotations.PublicSpi;
-import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.concurrent.CompletionStage;
@@ -40,7 +40,7 @@
* 2, 9, 6, 1
* ]
*
- *
+ *
* and loading from a back-end service returned this list of values:
*
*
@@ -50,7 +50,7 @@
* { id: 2, name: 'San Francisco' },
* ]
*
- *
+ *
* then the batch loader function contract has been broken.
*
* The back-end service returned results in a different order than we requested, likely because it was more efficient for it to
@@ -77,7 +77,7 @@
@FunctionalInterface
@PublicSpi
@NullMarked
-public interface BatchLoader {
+public interface BatchLoader {
/**
* Called to batch load the provided keys and return a promise to a list of values.
@@ -85,7 +85,6 @@ public interface BatchLoader {
* If you need calling context then implement {@link org.dataloader.BatchLoaderWithContext}
*
* @param keys the collection of keys to load
- *
* @return a promise of the values for those keys
*/
CompletionStage> load(List keys);
diff --git a/src/main/java/org/dataloader/BatchLoaderWithContext.java b/src/main/java/org/dataloader/BatchLoaderWithContext.java
index eba26e4..fb6ff71 100644
--- a/src/main/java/org/dataloader/BatchLoaderWithContext.java
+++ b/src/main/java/org/dataloader/BatchLoaderWithContext.java
@@ -2,6 +2,7 @@
import org.dataloader.annotations.PublicSpi;
import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.concurrent.CompletionStage;
@@ -16,7 +17,7 @@
*/
@PublicSpi
@NullMarked
-public interface BatchLoaderWithContext {
+public interface BatchLoaderWithContext {
/**
* Called to batch load the provided keys and return a promise to a list of values. This default
* version can be given an environment object to that maybe be useful during the call. A typical use case
diff --git a/src/main/java/org/dataloader/DataLoaderHelper.java b/src/main/java/org/dataloader/DataLoaderHelper.java
index 7858780..f4a8f10 100644
--- a/src/main/java/org/dataloader/DataLoaderHelper.java
+++ b/src/main/java/org/dataloader/DataLoaderHelper.java
@@ -594,11 +594,11 @@ private boolean isMapLoader() {
}
private boolean isPublisher() {
- return batchLoadFunction instanceof BatchPublisher;
+ return batchLoadFunction instanceof BatchPublisher || batchLoadFunction instanceof BatchPublisherWithContext;
}
private boolean isMappedPublisher() {
- return batchLoadFunction instanceof MappedBatchPublisher;
+ return batchLoadFunction instanceof MappedBatchPublisher || batchLoadFunction instanceof MappedBatchPublisherWithContext;
}
private DataLoaderInstrumentation instrumentation() {
diff --git a/src/main/java/org/dataloader/MappedBatchLoader.java b/src/main/java/org/dataloader/MappedBatchLoader.java
index 1ad4c79..179d6a2 100644
--- a/src/main/java/org/dataloader/MappedBatchLoader.java
+++ b/src/main/java/org/dataloader/MappedBatchLoader.java
@@ -18,6 +18,7 @@
import org.dataloader.annotations.PublicSpi;
import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import java.util.Map;
import java.util.Set;
@@ -59,7 +60,7 @@
*/
@PublicSpi
@NullMarked
-public interface MappedBatchLoader {
+public interface MappedBatchLoader {
/**
* Called to batch load the provided keys and return a promise to a map of values.
diff --git a/src/main/java/org/dataloader/MappedBatchLoaderWithContext.java b/src/main/java/org/dataloader/MappedBatchLoaderWithContext.java
index 9559260..9f342d4 100644
--- a/src/main/java/org/dataloader/MappedBatchLoaderWithContext.java
+++ b/src/main/java/org/dataloader/MappedBatchLoaderWithContext.java
@@ -18,6 +18,7 @@
import org.dataloader.annotations.PublicSpi;
import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import java.util.Map;
import java.util.Set;
@@ -33,7 +34,7 @@
*/
@PublicSpi
@NullMarked
-public interface MappedBatchLoaderWithContext {
+public interface MappedBatchLoaderWithContext {
/**
* Called to batch load the provided keys and return a promise to a map of values.
*
diff --git a/src/main/java/org/dataloader/MappedBatchPublisher.java b/src/main/java/org/dataloader/MappedBatchPublisher.java
index 493401f..6637157 100644
--- a/src/main/java/org/dataloader/MappedBatchPublisher.java
+++ b/src/main/java/org/dataloader/MappedBatchPublisher.java
@@ -2,6 +2,7 @@
import org.dataloader.annotations.PublicSpi;
import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import java.util.Map;
@@ -20,7 +21,7 @@
*/
@PublicSpi
@NullMarked
-public interface MappedBatchPublisher {
+public interface MappedBatchPublisher {
/**
* Called to batch the provided keys into a stream of map entries of keys and values.
*
diff --git a/src/main/java/org/dataloader/MappedBatchPublisherWithContext.java b/src/main/java/org/dataloader/MappedBatchPublisherWithContext.java
index 7b862ca..dd8b5f9 100644
--- a/src/main/java/org/dataloader/MappedBatchPublisherWithContext.java
+++ b/src/main/java/org/dataloader/MappedBatchPublisherWithContext.java
@@ -2,6 +2,7 @@
import org.dataloader.annotations.PublicSpi;
import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import java.util.List;
@@ -17,7 +18,7 @@
*/
@PublicSpi
@NullMarked
-public interface MappedBatchPublisherWithContext {
+public interface MappedBatchPublisherWithContext {
/**
* Called to batch the provided keys into a stream of map entries of keys and values.
diff --git a/src/test/kotlin/org/dataloader/KotlinExamples.kt b/src/test/kotlin/org/dataloader/KotlinExamples.kt
index c415b1a..480a965 100644
--- a/src/test/kotlin/org/dataloader/KotlinExamples.kt
+++ b/src/test/kotlin/org/dataloader/KotlinExamples.kt
@@ -1,8 +1,8 @@
package org.dataloader
import org.junit.jupiter.api.Test
-import java.util.concurrent.CompletableFuture
-import java.util.concurrent.CompletableFuture.*
+import reactor.core.publisher.Flux
+import java.util.concurrent.CompletableFuture.completedFuture
/**
* Some Kotlin code to prove that are JSpecify annotations work here
@@ -13,7 +13,10 @@ class KotlinExamples {
@Test
fun `basic kotlin test of non nullable value types`() {
- val dataLoader: DataLoader = DataLoaderFactory.newDataLoader { keys -> completedFuture(keys.toList()) }
+ val batchLoadFunction = BatchLoader
+ { keys -> completedFuture(keys.toList()) }
+ val dataLoader: DataLoader =
+ DataLoaderFactory.newDataLoader(batchLoadFunction)
val cfA = dataLoader.load("A")
val cfB = dataLoader.load("B")
@@ -21,20 +24,72 @@ class KotlinExamples {
dataLoader.dispatch()
assert(cfA.join().equals("A"))
- assert(cfA.join().equals("A"))
+ assert(cfB.join().equals("B"))
}
@Test
fun `basic kotlin test of nullable value types`() {
- val dataLoader: DataLoader = DataLoaderFactory.newDataLoader { keys -> completedFuture(keys.toList()) }
+ val batchLoadFunction: BatchLoader = BatchLoader { keys -> completedFuture(keys.toList()) }
+ val dataLoader: DataLoader = DataLoaderFactory.newDataLoader(batchLoadFunction)
+
+ standardNullableAsserts(dataLoader)
+ }
+
+ @Test
+ fun `basic kotlin test of nullable value types in mapped batch loader`() {
+ val batchLoadFunction = MappedBatchLoader
+ { keys -> completedFuture(keys.associateBy({ it })) }
+
+ val dataLoader: DataLoader = DataLoaderFactory.newMappedDataLoader(batchLoadFunction)
+
+ standardNullableAsserts(dataLoader)
+ }
+
+ @Test
+ fun `basic kotlin test of nullable value types in mapped batch loader with context`() {
+ val batchLoadFunction = MappedBatchLoaderWithContext
+ { keys, env -> completedFuture(keys.associateBy({ it })) }
+
+ val dataLoader: DataLoader = DataLoaderFactory.newMappedDataLoader(batchLoadFunction)
+
+ standardNullableAsserts(dataLoader)
+ }
+ @Test
+ fun `basic kotlin test of nullable value types in mapped batch publisher`() {
+ val batchLoadFunction = MappedBatchPublisher
+ { keys, subscriber ->
+ val map: Map = keys.associateBy({ it })
+ Flux.fromIterable(map.entries).subscribe(subscriber);
+ }
+
+ val dataLoader: DataLoader = DataLoaderFactory.newMappedPublisherDataLoader(batchLoadFunction)
+
+ standardNullableAsserts(dataLoader)
+ }
+
+ @Test
+ fun `basic kotlin test of nullable value types in mapped batch publisher with context`() {
+ val batchLoadFunction = MappedBatchPublisherWithContext
+ { keys, subscriber, env ->
+ val map: Map = keys.associateBy({ it })
+ Flux.fromIterable(map.entries).subscribe(subscriber);
+ }
+
+ val dataLoader: DataLoader = DataLoaderFactory.newMappedPublisherDataLoader(batchLoadFunction)
+
+ standardNullableAsserts(dataLoader)
+ }
+
+ private fun standardNullableAsserts(dataLoader: DataLoader) {
val cfA = dataLoader.load("A")
val cfB = dataLoader.load("B")
dataLoader.dispatch()
assert(cfA.join().equals("A"))
- assert(cfA.join().equals("A"))
+ assert(cfB.join().equals("B"))
}
+
}
\ No newline at end of file