diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java b/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java index c8a12fa0..b4d86cfb 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java @@ -5,11 +5,11 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; import io.weaviate.client6.v1.api.collections.CollectionHandleDefaults; import io.weaviate.client6.v1.api.collections.ObjectMetadata; import io.weaviate.client6.v1.api.collections.WeaviateObject; +import io.weaviate.client6.v1.internal.MapUtil; import io.weaviate.client6.v1.internal.grpc.ByteStringUtil; import io.weaviate.client6.v1.internal.grpc.Rpc; import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateGrpc.WeaviateBlockingStub; @@ -65,8 +65,10 @@ public static Rpc, WeaviateProtoBatch.BatchObjectsReque var errors = new ArrayList(insertErrors.size()); var uuids = new ArrayList(); - var failed = insertErrors.stream() - .collect(Collectors.toMap(err -> err.getIndex(), err -> err.getError())); + var failed = MapUtil.collect( + insertErrors.stream(), + err -> err.getIndex(), + err -> err.getError()); var iter = insertObjects.listIterator(); while (iter.hasNext()) { @@ -137,6 +139,10 @@ public static void buildObject(WeaviateProtoBatch.BatchObject.Builder object var value = entry.getValue(); var protoValue = com.google.protobuf.Value.newBuilder(); + if (value == null) { + return; + } + if (value instanceof String v) { protoValue.setStringValue(v); } else if (value instanceof UUID v) { @@ -147,7 +153,7 @@ public static void buildObject(WeaviateProtoBatch.BatchObject.Builder object protoValue.setBoolValue(v.booleanValue()); } else if (value instanceof Number v) { protoValue.setNumberValue(v.doubleValue()); - } else if (value instanceof List v) { + } else if (value instanceof List v) { protoValue.setListValue( com.google.protobuf.ListValue.newBuilder() .addAllValues(v.stream() diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryRequest.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryRequest.java index 9f42be01..cb9daa54 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryRequest.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryRequest.java @@ -88,7 +88,13 @@ static Rpc(allObjects, groups); }, () -> rpc.method(), () -> rpc.methodAsync()); diff --git a/src/main/java/io/weaviate/client6/v1/internal/MapUtil.java b/src/main/java/io/weaviate/client6/v1/internal/MapUtil.java new file mode 100644 index 00000000..4186572b --- /dev/null +++ b/src/main/java/io/weaviate/client6/v1/internal/MapUtil.java @@ -0,0 +1,42 @@ +package io.weaviate.client6.v1.internal; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public final class MapUtil { + /** Prevent public initialization. */ + private MapUtil() { + } + + /** + * Collect stream entries into a map. Use this method whenever + * potential null keys or null values prohibit {@link Collectors#toMap}. + * + *

+ * Example: + * + *

{@code
+   * Map = MapUtil.collect(
+   *  Stream.of(1, 2, 3),
+   *  Function.identity(), // use value as key
+   *  el -> el.equals(3) ? null : el;
+   * );
+   *
+   * // Result: {1: 1, 2: 2, 3: null};
+   * }
+ * + * @param stream Stream of elements {@link T}. + * @param keyFn Transforms element {@link T} to key {@link K}. + * @param keyFn Transforms element {@link T} to value {@link V}. + * @return Map + */ + public static Map collect(Stream stream, Function keyFn, Function valueFn) { + return stream.collect( + HashMap::new, + (m, el) -> m.put(keyFn.apply(el), valueFn.apply(el)), + HashMap::putAll); + } +} diff --git a/src/main/java/io/weaviate/client6/v1/internal/orm/MapReader.java b/src/main/java/io/weaviate/client6/v1/internal/orm/MapReader.java index dcf0af65..004eb0a4 100644 --- a/src/main/java/io/weaviate/client6/v1/internal/orm/MapReader.java +++ b/src/main/java/io/weaviate/client6/v1/internal/orm/MapReader.java @@ -1,16 +1,19 @@ package io.weaviate.client6.v1.internal.orm; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; public class MapReader implements PropertiesReader> { private final Map properties; public MapReader(Map properties) { - this.properties = properties; + // Defensive copy to ensure original properties are not modified + this.properties = Collections.unmodifiableMap(new HashMap<>(properties)); } @Override public Map readProperties() { - return Map.copyOf(properties); // ensure original properties immutable + return properties; } }