From 96a48b306de83b3b5955cfbb973ecbb209fe2e9a Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Mon, 26 May 2025 15:05:16 +0200 Subject: [PATCH 1/4] test: add unit test for serialization --- .../client/v1/data/model/WeaviateObject.java | 6 +- .../data/model/WeaviateObjectAdapterTest.java | 67 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java diff --git a/src/main/java/io/weaviate/client/v1/data/model/WeaviateObject.java b/src/main/java/io/weaviate/client/v1/data/model/WeaviateObject.java index b8e0934a7..a0721cab5 100644 --- a/src/main/java/io/weaviate/client/v1/data/model/WeaviateObject.java +++ b/src/main/java/io/weaviate/client/v1/data/model/WeaviateObject.java @@ -80,8 +80,12 @@ public static class Adapter implements JsonSerializer, JsonDeser public JsonElement serialize(WeaviateObject src, Type typeOfSrc, JsonSerializationContext ctx) { JsonObject result = gson.toJsonTree(src).getAsJsonObject(); + if (result.has("vectors") && result.getAsJsonObject("vectors").isEmpty()) { + result.remove("vectors"); + } + // Add multi-vectors to the named vectors map. - if (src.multiVectors != null) { + if (src.multiVectors != null && !src.multiVectors.isEmpty()) { if (!result.has("vectors")) { result.add("vectors", new JsonObject()); } diff --git a/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java b/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java new file mode 100644 index 000000000..5577b2c08 --- /dev/null +++ b/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java @@ -0,0 +1,67 @@ +package io.weaviate.client.v1.data.model; + +import java.util.Collections; + +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.jparams.junit4.JParamsTestRunner; +import com.jparams.junit4.data.DataMethod; + +@RunWith(JParamsTestRunner.class) +public class WeaviateObjectAdapterTest { + private static final Gson gson = new GsonBuilder() + .registerTypeAdapter(WeaviateObject.class, WeaviateObject.Adapter.INSTANCE) + .create(); + + public static Object[][] testCaseSerialize() { + return new Object[][] { + { + WeaviateObject.builder().vector(new Float[] { 1f, 2f, 3f }).build(), + "{\"vector\":[1.0,2.0,3.0]}" + }, + { + WeaviateObject.builder().vectors(Collections.singletonMap("single", new Float[] { 1f, 2f, 3f })).build(), + "{\"vectors\":{\"single\":[1.0,2.0,3.0]}}" + }, + { + WeaviateObject.builder() + .multiVectors(Collections.singletonMap("multi", new Float[][] { + { 1f, 2f, 3f }, + { 4f, 5f, 6f }, + })) + .build(), + "{\"vectors\":{\"multi\":[[1.0,2.0,3.0],[4.0, 5.0, 6.0]]}}" + }, + { + WeaviateObject.builder() + .vectors(Collections.singletonMap("single", new Float[] { 1f, 2f, 3f })) + .multiVectors(Collections.singletonMap("multi", new Float[][] { + { 1f, 2f, 3f }, + { 4f, 5f, 6f }, + })) + .build(), + "{\"vectors\":{\"single\":[1.0,2.0,3.0],\"multi\":[[1.0,2.0,3.0],[4.0, 5.0, 6.0]]}}" + }, + }; + } + + @Test + @DataMethod(source = WeaviateObjectAdapterTest.class, method = "testCaseSerialize") + public void test_toJson(WeaviateObject in, String want) { + String got = gson.toJson(in); + assertSameJson(got, want); + } + + private void assertSameJson(String got, String want) { + JsonElement gotEl = JsonParser.parseString(got); + JsonElement wantEl = JsonParser.parseString(want); + Assertions.assertThat(gotEl).isEqualTo(wantEl); + + } +} From e2f92758f2f1773ed6d7e963a8ec1d68c161cf1b Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Mon, 26 May 2025 15:19:03 +0200 Subject: [PATCH 2/4] test: add deserialization test cases --- .../v1/data/model/WeaviateObjectAdapterTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java b/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java index 5577b2c08..699ba8386 100644 --- a/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java +++ b/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java @@ -19,7 +19,7 @@ public class WeaviateObjectAdapterTest { .registerTypeAdapter(WeaviateObject.class, WeaviateObject.Adapter.INSTANCE) .create(); - public static Object[][] testCaseSerialize() { + public static Object[][] testCasesJson() { return new Object[][] { { WeaviateObject.builder().vector(new Float[] { 1f, 2f, 3f }).build(), @@ -52,12 +52,19 @@ public static Object[][] testCaseSerialize() { } @Test - @DataMethod(source = WeaviateObjectAdapterTest.class, method = "testCaseSerialize") + @DataMethod(source = WeaviateObjectAdapterTest.class, method = "testCasesJson") public void test_toJson(WeaviateObject in, String want) { String got = gson.toJson(in); assertSameJson(got, want); } + @Test + @DataMethod(source = WeaviateObjectAdapterTest.class, method = "testCasesJson") + public void test_fromJson(WeaviateObject want, String in) { + WeaviateObject got = gson.fromJson(in, WeaviateObject.class); + Assertions.assertThat(got).usingRecursiveComparison().isEqualTo(want); + } + private void assertSameJson(String got, String want) { JsonElement gotEl = JsonParser.parseString(got); JsonElement wantEl = JsonParser.parseString(want); From 02c4e2ce9992768027e21de2457c28bce93b9557 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Mon, 26 May 2025 15:23:46 +0200 Subject: [PATCH 3/4] format: remove redundant whitespace --- .../client/v1/data/model/WeaviateObjectAdapterTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java b/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java index 699ba8386..966892dd6 100644 --- a/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java +++ b/src/test/java/io/weaviate/client/v1/data/model/WeaviateObjectAdapterTest.java @@ -14,6 +14,11 @@ import com.jparams.junit4.data.DataMethod; @RunWith(JParamsTestRunner.class) +/** + * Test that WeaviateObject vectors are de-/serialized correctly. Specifically, + * single- and multi-vectors should be correctly combined under the "vectors" + * key in case any named vectors are present. + */ public class WeaviateObjectAdapterTest { private static final Gson gson = new GsonBuilder() .registerTypeAdapter(WeaviateObject.class, WeaviateObject.Adapter.INSTANCE) @@ -69,6 +74,5 @@ private void assertSameJson(String got, String want) { JsonElement gotEl = JsonParser.parseString(got); JsonElement wantEl = JsonParser.parseString(want); Assertions.assertThat(gotEl).isEqualTo(wantEl); - } } From c24a65ba3de950c26bddcaa8d683944ea0f8c246 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Mon, 26 May 2025 15:59:37 +0200 Subject: [PATCH 4/4] chore: delete unused property Multi-vectors can only be created as named vectors. --- .../io/weaviate/client/v1/batch/model/ObjectGetResponse.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/weaviate/client/v1/batch/model/ObjectGetResponse.java b/src/main/java/io/weaviate/client/v1/batch/model/ObjectGetResponse.java index 63ade384a..0b3e70b39 100644 --- a/src/main/java/io/weaviate/client/v1/batch/model/ObjectGetResponse.java +++ b/src/main/java/io/weaviate/client/v1/batch/model/ObjectGetResponse.java @@ -26,7 +26,6 @@ public class ObjectGetResponse { Map properties; Map additional; Float[] vector; - Float[][] multiVector; Map vectors; Map multiVectors; Object vectorWeights;