diff --git a/src/main/java/io/weaviate/client/v1/misc/model/RQConfig.java b/src/main/java/io/weaviate/client/v1/misc/model/RQConfig.java new file mode 100644 index 000000000..2019a8573 --- /dev/null +++ b/src/main/java/io/weaviate/client/v1/misc/model/RQConfig.java @@ -0,0 +1,19 @@ +package io.weaviate.client.v1.misc.model; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import lombok.experimental.FieldDefaults; + +@Getter +@Builder +@ToString +@EqualsAndHashCode +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class RQConfig { + Boolean enabled; + Long bits; + Long rescoreLimit; +} diff --git a/src/main/java/io/weaviate/client/v1/misc/model/VectorIndexConfig.java b/src/main/java/io/weaviate/client/v1/misc/model/VectorIndexConfig.java index f66ac0211..c7ed61804 100644 --- a/src/main/java/io/weaviate/client/v1/misc/model/VectorIndexConfig.java +++ b/src/main/java/io/weaviate/client/v1/misc/model/VectorIndexConfig.java @@ -30,14 +30,14 @@ public class VectorIndexConfig { PQConfig pq; BQConfig bq; SQConfig sq; + RQConfig rq; @SerializedName("multivector") MultiVectorConfig multiVector; public enum FilterStrategy { @SerializedName("sweeping") - SWEEPING, - @SerializedName("acorn") + SWEEPING, @SerializedName("acorn") ACORN; } } diff --git a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java index 95d0db20f..cb76a1227 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -3,13 +3,12 @@ public class WeaviateVersion { // docker image version - public static final String WEAVIATE_IMAGE = "1.31.0"; + public static final String WEAVIATE_IMAGE = "1.32.0-rc.1-175d482"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_VERSION = "1.31.0"; + public static final String EXPECTED_WEAVIATE_VERSION = "1.32.0-rc.1"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_GIT_HASH = "79499d6"; + public static final String EXPECTED_WEAVIATE_GIT_HASH = "175d482"; - private WeaviateVersion() { - } + private WeaviateVersion() {} } diff --git a/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLMultiTargetSearchTest.java b/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLMultiTargetSearchTest.java index 8b3ae714f..0c75178eb 100644 --- a/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLMultiTargetSearchTest.java +++ b/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLMultiTargetSearchTest.java @@ -17,6 +17,7 @@ import io.weaviate.client.v1.misc.model.BQConfig; import io.weaviate.client.v1.misc.model.PQConfig; import io.weaviate.client.v1.misc.model.SQConfig; +import io.weaviate.client.v1.misc.model.RQConfig; import io.weaviate.client.v1.misc.model.VectorIndexConfig; import io.weaviate.client.v1.schema.model.DataType; import io.weaviate.client.v1.schema.model.Property; @@ -72,6 +73,7 @@ public void after() { private final String titleAndContent = "titleAndContent"; private final String title1 = "title1"; private final String title2 = "title2"; + private final String title3 = "title3"; private final String bringYourOwnVector = "bringYourOwnVector"; private final String bringYourOwnVector2 = "bringYourOwnVector2"; @@ -85,119 +87,92 @@ public void shouldPerformMultiTargetSearch() throws InterruptedException { weights.put(titleAndContent, 0.1f); weights.put(title1, 0.6f); weights.put(title2, 0.3f); - Targets targets = Targets.builder() - .targetVectors(new String[]{ titleAndContent, title1, title2 }) - .combinationMethod(Targets.CombinationMethod.manualWeights) - .weights(weights) - .build(); + weights.put(title3, 0.1f); + Targets targets = + Targets.builder().targetVectors(new String[] {titleAndContent, title1, title2, title3}) + .combinationMethod(Targets.CombinationMethod.manualWeights).weights(weights).build(); NearTextArgument nearText = gql.arguments().nearTextArgBuilder() - .concepts(new String[]{ "Water black" }) - .targets(targets) - .build(); - Result response = doGet(get -> get - .withClassName(className) - .withNearText(nearText) - .withFields(_additional)); + .concepts(new String[] {"Water black"}).targets(targets).build(); + Result response = + doGet(get -> get.withClassName(className).withNearText(nearText).withFields(_additional)); assertGetContainsIds(response, className, id1, id2, id3); // nearVector with single vector-per-target Map vectorPerTarget = new HashMap<>(); - vectorPerTarget.put(bringYourOwnVector, new Float[]{ .99f, .88f, .77f }); - vectorPerTarget.put(bringYourOwnVector2, new Float[]{ .11f, .22f, .33f }); - weights = new HashMap() {{ - this.put(bringYourOwnVector, 0.1f); - this.put(bringYourOwnVector2, 0.6f); - }}; - targets = Targets.builder() - .targetVectors(new String[]{ bringYourOwnVector, bringYourOwnVector2 }) - .combinationMethod(Targets.CombinationMethod.manualWeights) - .weights(weights) - .build(); + vectorPerTarget.put(bringYourOwnVector, new Float[] {.99f, .88f, .77f}); + vectorPerTarget.put(bringYourOwnVector2, new Float[] {.11f, .22f, .33f}); + weights = new HashMap() { + { + this.put(bringYourOwnVector, 0.1f); + this.put(bringYourOwnVector2, 0.6f); + } + }; + targets = + Targets.builder().targetVectors(new String[] {bringYourOwnVector, bringYourOwnVector2}) + .combinationMethod(Targets.CombinationMethod.manualWeights).weights(weights).build(); final NearVectorArgument nearVector1 = gql.arguments().nearVectorArgBuilder() - .vectorPerTarget(vectorPerTarget) - .targets(targets).build(); - response = doGet(get -> get - .withClassName(className) - .withNearVector(nearVector1) - .withFields(_additional)); + .vectorPerTarget(vectorPerTarget).targets(targets).build(); + response = doGet( + get -> get.withClassName(className).withNearVector(nearVector1).withFields(_additional)); assertNull("check error in response:", response.getError()); assertGetContainsIds(response, className, id2, id3); // nearVector with multiple vector-per-target Map vectorsPerTarget = new HashMap<>(); - vectorsPerTarget.put(bringYourOwnVector, new Float[][]{ new Float[]{ .99f, .88f, .77f }, new Float[]{ .99f, .88f, .77f } }); - vectorsPerTarget.put(bringYourOwnVector2, new Float[][]{ new Float[]{ .11f, .22f, .33f } }); + vectorsPerTarget.put(bringYourOwnVector, + new Float[][] {new Float[] {.99f, .88f, .77f}, new Float[] {.99f, .88f, .77f}}); + vectorsPerTarget.put(bringYourOwnVector2, new Float[][] {new Float[] {.11f, .22f, .33f}}); Map weightsMulti = new HashMap<>(); - weightsMulti.put(bringYourOwnVector, new Float[]{ 0.5f, 0.5f }); - weightsMulti.put(bringYourOwnVector2, new Float[]{ 0.6f }); - targets = Targets.builder() - .targetVectors(new String[]{ bringYourOwnVector, bringYourOwnVector2 }) - .combinationMethod(Targets.CombinationMethod.manualWeights) - .weightsMulti(weightsMulti) - .build(); + weightsMulti.put(bringYourOwnVector, new Float[] {0.5f, 0.5f}); + weightsMulti.put(bringYourOwnVector2, new Float[] {0.6f}); + targets = + Targets.builder().targetVectors(new String[] {bringYourOwnVector, bringYourOwnVector2}) + .combinationMethod(Targets.CombinationMethod.manualWeights).weightsMulti(weightsMulti) + .build(); final NearVectorArgument nearVector2 = gql.arguments().nearVectorArgBuilder() - .vectorsPerTarget(vectorsPerTarget) - .targets(targets).build(); - response = doGet(get -> get - .withClassName(className) - .withNearVector(nearVector2) - .withFields(_additional)); + .vectorsPerTarget(vectorsPerTarget).targets(targets).build(); + response = doGet( + get -> get.withClassName(className).withNearVector(nearVector2).withFields(_additional)); assertNull("check error in response:", response.getError()); assertGetContainsIds(response, className, id2, id3); // nearObject - targets = Targets.builder() - .targetVectors(new String[]{ bringYourOwnVector, bringYourOwnVector2, titleAndContent, title1, title2 }) - .combinationMethod(Targets.CombinationMethod.average) - .build(); - NearObjectArgument nearObject = gql.arguments().nearObjectArgBuilder() - .id(id3).targets(targets).build(); - response = doGet(get -> get - .withClassName(className) - .withNearObject(nearObject) - .withFields(_additional)); + targets = Targets + .builder().targetVectors(new String[] {bringYourOwnVector, bringYourOwnVector2, + titleAndContent, title1, title2, title3}) + .combinationMethod(Targets.CombinationMethod.average).build(); + NearObjectArgument nearObject = + gql.arguments().nearObjectArgBuilder().id(id3).targets(targets).build(); + response = doGet( + get -> get.withClassName(className).withNearObject(nearObject).withFields(_additional)); assertGetContainsIds(response, className, id2, id3); } private void setupDB(String className) { // clean Result delete = syncClient.schema().allDeleter().run(); - assertThat(delete).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + assertThat(delete).isNotNull().returns(false, Result::hasErrors).returns(true, + Result::getResult); // create class List properties = Arrays.asList( - Property.builder() - .name("title") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("content") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("title1") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("title2") - .dataType(Collections.singletonList(DataType.TEXT)) - .build() - ); + Property.builder().name("title").dataType(Collections.singletonList(DataType.TEXT)).build(), + Property.builder().name("content").dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder().name("title1").dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder().name("title2").dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder().name("title3").dataType(Collections.singletonList(DataType.TEXT)) + .build()); Map vectorConfig = new HashMap<>(); vectorConfig.put(titleAndContent, getTitleAndContentVectorConfig()); vectorConfig.put(title1, getTitle1VectorConfig()); vectorConfig.put(title2, getTitle2VectorConfig()); + vectorConfig.put(title3, getTitle3VectorConfig()); vectorConfig.put(bringYourOwnVector, getBringYourOwnVectorVectorConfig()); vectorConfig.put(bringYourOwnVector2, getBringYourOwnVectorVectorConfig2()); - Result createResult = syncClient.schema().classCreator() - .withClass(WeaviateClass.builder() - .className(className) - .properties(properties) - .vectorConfig(vectorConfig) - .build() - ) - .run(); - assertThat(createResult).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + Result createResult = + syncClient.schema().classCreator().withClass(WeaviateClass.builder().className(className) + .properties(properties).vectorConfig(vectorConfig).build()).run(); + assertThat(createResult).isNotNull().returns(false, Result::hasErrors).returns(true, + Result::getResult); // add data // obj1 Map props1 = new HashMap<>(); @@ -205,7 +180,8 @@ private void setupDB(String className) { props1.put("content", "A great fantasy novel"); props1.put("title1", "J.R.R. Tolkien The Lord of the Rings"); props1.put("title2", "Rings"); - Float[] vector1a = new Float[]{ 0.77f, 0.88f, 0.77f }; + props1.put("title3", "Book"); + Float[] vector1a = new Float[] {0.77f, 0.88f, 0.77f}; Map vectors1 = new HashMap<>(); vectors1.put("bringYourOwnVector", vector1a); // don't add vector for bringYourOwnVector2 @@ -215,19 +191,22 @@ private void setupDB(String className) { props2.put("content", "A great science fiction book"); props2.put("title1", "Jacek Dukaj Black Oceans"); props2.put("title2", "Water"); - Float[] vector2a = new Float[]{ 0.11f, 0.22f, 0.33f }; - Float[] vector2b = new Float[]{ 0.11f, 0.11f, 0.11f }; + props2.put("title3", "Book"); + Float[] vector2a = new Float[] {0.11f, 0.22f, 0.33f}; + Float[] vector2b = new Float[] {0.11f, 0.11f, 0.11f}; Map vectors2 = new HashMap<>(); vectors2.put("bringYourOwnVector", vector2a); vectors2.put("bringYourOwnVector2", vector2b); // obj2 Map props3 = new HashMap<>(); props3.put("title", "Into the Water"); - props3.put("content", "New York Times bestseller and global phenomenon The Girl on the Train returns with Into the Water"); + props3.put("content", + "New York Times bestseller and global phenomenon The Girl on the Train returns with Into the Water"); props3.put("title1", "Paula Hawkins Into the Water"); props3.put("title2", "Water go into it"); - Float[] vector3a = new Float[]{ 0.99f, 0.88f, 0.77f }; - Float[] vector3b = new Float[]{ 0.99f, 0.88f, 0.77f }; + props3.put("title3", "Book"); + Float[] vector3a = new Float[] {0.99f, 0.88f, 0.77f}; + Float[] vector3b = new Float[] {0.99f, 0.88f, 0.77f}; Map vectors3 = new HashMap<>(); vectors3.put("bringYourOwnVector", vector3a); vectors3.put("bringYourOwnVector2", vector3b); @@ -236,21 +215,18 @@ private void setupDB(String className) { WeaviateObject obj2 = createObject(id2, className, props2, vectors2); WeaviateObject obj3 = createObject(id3, className, props3, vectors3); - Result result = syncClient.batch().objectsBatcher() - .withObjects(obj1, obj2, obj3) - .run(); + Result result = + syncClient.batch().objectsBatcher().withObjects(obj1, obj2, obj3).run(); - assertThat(result).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).asInstanceOf(ARRAY) - .hasSize(3); + assertThat(result).isNotNull().returns(false, Result::hasErrors).extracting(Result::getResult) + .asInstanceOf(ARRAY).hasSize(3); } private WeaviateClass.VectorConfig getTitleAndContentVectorConfig() { Map titleAndContent = new HashMap<>(); Map text2vecContextionarySettings = new HashMap<>(); text2vecContextionarySettings.put("vectorizeClassName", false); - text2vecContextionarySettings.put("properties", new String[]{ "title", "content" }); + text2vecContextionarySettings.put("properties", new String[] {"title", "content"}); titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); return getHNSWSQVectorConfig(titleAndContent); } @@ -259,7 +235,7 @@ private WeaviateClass.VectorConfig getTitle1VectorConfig() { Map titleAndContent = new HashMap<>(); Map text2vecContextionarySettings = new HashMap<>(); text2vecContextionarySettings.put("vectorizeClassName", false); - text2vecContextionarySettings.put("properties", new String[]{ "title1" }); + text2vecContextionarySettings.put("properties", new String[] {"title1"}); titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); return getHNSWPQVectorConfig(titleAndContent); } @@ -268,11 +244,20 @@ private WeaviateClass.VectorConfig getTitle2VectorConfig() { Map titleAndContent = new HashMap<>(); Map text2vecContextionarySettings = new HashMap<>(); text2vecContextionarySettings.put("vectorizeClassName", false); - text2vecContextionarySettings.put("properties", new String[]{ "title2" }); + text2vecContextionarySettings.put("properties", new String[] {"title2"}); titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); return getHNSWVectorConfig(titleAndContent); } + private WeaviateClass.VectorConfig getTitle3VectorConfig() { + Map titleAndContent = new HashMap<>(); + Map text2vecContextionarySettings = new HashMap<>(); + text2vecContextionarySettings.put("vectorizeClassName", false); + text2vecContextionarySettings.put("properties", new String[] {"title3"}); + titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); + return getHNSWRQVectorConfig(titleAndContent); + } + private WeaviateClass.VectorConfig getBringYourOwnVectorVectorConfig() { Map byov = new HashMap<>(); byov.put("none", new Object()); @@ -286,54 +271,47 @@ private WeaviateClass.VectorConfig getBringYourOwnVectorVectorConfig2() { } private WeaviateClass.VectorConfig getFlatBQVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("flat") - .vectorizer(vectorizerConfig) - .vectorIndexConfig(VectorIndexConfig.builder() - .bq(BQConfig.builder().enabled(true).build()) - .build()) - .build(); + return WeaviateClass.VectorConfig.builder().vectorIndexType("flat").vectorizer(vectorizerConfig) + .vectorIndexConfig( + VectorIndexConfig.builder().bq(BQConfig.builder().enabled(true).build()).build()) + .build(); } private WeaviateClass.VectorConfig getFlatVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("flat") - .vectorizer(vectorizerConfig) - .build(); + return WeaviateClass.VectorConfig.builder().vectorIndexType("flat").vectorizer(vectorizerConfig) + .build(); } private WeaviateClass.VectorConfig getHNSWVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("hnsw") - .vectorizer(vectorizerConfig) - .build(); + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw").vectorizer(vectorizerConfig) + .build(); } private WeaviateClass.VectorConfig getHNSWPQVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("hnsw") - .vectorizer(vectorizerConfig) - .vectorIndexConfig(VectorIndexConfig.builder() - .pq(PQConfig.builder().enabled(true).build()) - .build()) - .build(); + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw").vectorizer(vectorizerConfig) + .vectorIndexConfig( + VectorIndexConfig.builder().pq(PQConfig.builder().enabled(true).build()).build()) + .build(); } private WeaviateClass.VectorConfig getHNSWSQVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("hnsw") - .vectorizer(vectorizerConfig) - .vectorIndexConfig(VectorIndexConfig.builder() - .sq(SQConfig.builder().enabled(true).build()) - .build()) - .build(); + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw").vectorizer(vectorizerConfig) + .vectorIndexConfig( + VectorIndexConfig.builder().sq(SQConfig.builder().enabled(true).build()).build()) + .build(); + } + + private WeaviateClass.VectorConfig getHNSWRQVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw").vectorizer(vectorizerConfig) + .vectorIndexConfig( + VectorIndexConfig.builder().rq(RQConfig.builder().enabled(true).build()).build()) + .build(); } - private WeaviateObject createObject(String id, String className, Map props, Map vectors) { - WeaviateObject.WeaviateObjectBuilder obj = WeaviateObject.builder() - .id(id) - .className(className) - .properties(props); + private WeaviateObject createObject(String id, String className, Map props, + Map vectors) { + WeaviateObject.WeaviateObjectBuilder obj = + WeaviateObject.builder().id(id).className(className).properties(props); if (vectors != null) { obj = obj.vectors(vectors); } @@ -341,17 +319,16 @@ private WeaviateObject createObject(String id, String className, Map response, String className, String... expectedIds) { - assertThat(response).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).isNotNull() - .extracting(GraphQLResponse::getData).isInstanceOf(Map.class) - .extracting(data -> ((Map) data).get("Get")).isInstanceOf(Map.class) - .extracting(get -> ((Map) get).get(className)).isInstanceOf(List.class).asList() - .hasSize(expectedIds.length) - .extracting(obj -> ((Map) obj).get("_additional")) - .extracting(add -> ((Map) add).get("id")) - .containsExactlyInAnyOrder((Object[]) expectedIds); + private void assertGetContainsIds(Result response, String className, + String... expectedIds) { + assertThat(response).isNotNull().returns(false, Result::hasErrors).extracting(Result::getResult) + .isNotNull().extracting(GraphQLResponse::getData).isInstanceOf(Map.class) + .extracting(data -> ((Map) data).get("Get")).isInstanceOf(Map.class) + .extracting(get -> ((Map) get).get(className)).isInstanceOf(List.class) + .asList().hasSize(expectedIds.length) + .extracting(obj -> ((Map) obj).get("_additional")) + .extracting(add -> ((Map) add).get("id")) + .containsExactlyInAnyOrder((Object[]) expectedIds); } private Result doGet(Consumer build) { diff --git a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTargetSearchTest.java b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTargetSearchTest.java index 6ea4701db..eda577cf8 100644 --- a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTargetSearchTest.java +++ b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTargetSearchTest.java @@ -14,6 +14,7 @@ import io.weaviate.client.v1.misc.model.BQConfig; import io.weaviate.client.v1.misc.model.PQConfig; import io.weaviate.client.v1.misc.model.SQConfig; +import io.weaviate.client.v1.misc.model.RQConfig; import io.weaviate.client.v1.misc.model.VectorIndexConfig; import io.weaviate.client.v1.schema.model.DataType; import io.weaviate.client.v1.schema.model.Property; @@ -33,312 +34,290 @@ import org.junit.Test; public class ClientGraphQLMultiTargetSearchTest { - private WeaviateClient client; + private WeaviateClient client; - private final String id1 = "00000000-0000-0000-0000-000000000001"; - private final String id2 = "00000000-0000-0000-0000-000000000002"; - private final String id3 = "00000000-0000-0000-0000-000000000003"; + private final String id1 = "00000000-0000-0000-0000-000000000001"; + private final String id2 = "00000000-0000-0000-0000-000000000002"; + private final String id3 = "00000000-0000-0000-0000-000000000003"; - private final String titleAndContent = "titleAndContent"; - private final String title1 = "title1"; - private final String title2 = "title2"; - private final String bringYourOwnVector = "bringYourOwnVector"; - private final String bringYourOwnVector2 = "bringYourOwnVector2"; + private final String titleAndContent = "titleAndContent"; + private final String title1 = "title1"; + private final String title2 = "title2"; + private final String title3 = "title3"; + private final String bringYourOwnVector = "bringYourOwnVector"; + private final String bringYourOwnVector2 = "bringYourOwnVector2"; - @ClassRule - public static WeaviateDockerCompose compose = new WeaviateDockerCompose(WeaviateVersion.WEAVIATE_IMAGE); + @ClassRule + public static WeaviateDockerCompose compose = + new WeaviateDockerCompose(WeaviateVersion.WEAVIATE_IMAGE); - @Before - public void before() { - String httpHost = compose.getHttpHostAddress(); - String grpcHost = compose.getGrpcHostAddress(); - Config config = new Config("http", httpHost); - config.setGRPCSecured(false); - config.setGRPCHost(grpcHost); + @Before + public void before() { + String httpHost = compose.getHttpHostAddress(); + String grpcHost = compose.getGrpcHostAddress(); + Config config = new Config("http", httpHost); + config.setGRPCSecured(false); + config.setGRPCHost(grpcHost); - client = new WeaviateClient(config); - } + client = new WeaviateClient(config); + } - @Test - public void shouldPerformMultiTargetSearch() throws InterruptedException { - String className = "MultiTargetSearch"; - setupDB(className); - Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("id").build(), Field.builder().name("distance").build()}) - .build(); - // nearText - Map weights = new HashMap<>(); - weights.put(titleAndContent, 0.1f); - weights.put(title1, 0.6f); - weights.put(title2, 0.3f); - Targets targets = Targets.builder() - .targetVectors(new String[]{titleAndContent, title1, title2}) - .combinationMethod(Targets.CombinationMethod.manualWeights) - .weights(weights) - .build(); - NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"Water black"}) - .targets(targets) - .build(); - Result response = client.graphQL().get() - .withClassName(className) - .withNearText(nearText) - .withFields(_additional) - .run(); - assertGetContainsIds(response, className, id1, id2, id3); - // nearVector with single vector-per-target - Map vectorPerTarget = new HashMap<>(); - vectorPerTarget.put(bringYourOwnVector, new Float[]{.99f, .88f, .77f}); - vectorPerTarget.put(bringYourOwnVector2, new Float[]{.11f, .22f, .33f}); - weights = new HashMap() {{ - this.put(bringYourOwnVector, 0.1f); - this.put(bringYourOwnVector2, 0.6f); - }}; - targets = Targets.builder() - .targetVectors(new String[]{bringYourOwnVector, bringYourOwnVector2}) - .combinationMethod(Targets.CombinationMethod.manualWeights) - .weights(weights) - .build(); - NearVectorArgument nearVector = client.graphQL().arguments().nearVectorArgBuilder() - .vectorPerTarget(vectorPerTarget) - .targets(targets).build(); - response = client.graphQL().get() - .withClassName(className) - .withNearVector(nearVector) - .withFields(_additional) - .run(); - assertNull("check error in response:", response.getError()); - assertGetContainsIds(response, className, id2, id3); - // nearVector with multiple vector-per-target - Map vectorsPerTarget = new HashMap<>(); - vectorsPerTarget.put(bringYourOwnVector, new Float[][]{new Float[]{.99f, .88f, .77f}, new Float[]{.99f, .88f, .77f}}); - vectorsPerTarget.put(bringYourOwnVector2, new Float[][]{new Float[]{.11f, .22f, .33f}}); - Map weightsMulti = new HashMap<>(); - weightsMulti.put(bringYourOwnVector, new Float[]{0.5f, 0.5f}); - weightsMulti.put(bringYourOwnVector2, new Float[]{0.6f}); - targets = Targets.builder() - .targetVectors(new String[]{bringYourOwnVector, bringYourOwnVector2}) - .combinationMethod(Targets.CombinationMethod.manualWeights) - .weightsMulti(weightsMulti) - .build(); - nearVector = client.graphQL().arguments().nearVectorArgBuilder() - .vectorsPerTarget(vectorsPerTarget) - .targets(targets).build(); - response = client.graphQL().get() - .withClassName(className) - .withNearVector(nearVector) - .withFields(_additional) - .run(); - assertNull("check error in response:", response.getError()); - assertGetContainsIds(response, className, id2, id3); - // nearObject - targets = Targets.builder() - .targetVectors(new String[]{bringYourOwnVector, bringYourOwnVector2, titleAndContent, title1, title2}) - .combinationMethod(Targets.CombinationMethod.average) - .build(); - NearObjectArgument nearObject = client.graphQL().arguments().nearObjectArgBuilder() - .id(id3).targets(targets).build(); - response = client.graphQL().get() - .withClassName(className) - .withNearObject(nearObject) - .withFields(_additional) - .run(); - assertGetContainsIds(response, className, id2, id3); - } + @Test + public void shouldPerformMultiTargetSearch() throws InterruptedException { + String className = "MultiTargetSearch"; + setupDB(className); + Field _additional = Field.builder().name("_additional").fields(new Field[] { + Field.builder().name("id").build(), Field.builder().name("distance").build()}) + .build(); + // nearText + Map weights = new HashMap<>(); + weights.put(titleAndContent, 0.1f); + weights.put(title1, 0.6f); + weights.put(title2, 0.3f); + weights.put(title3, 0.1f); + Targets targets = Targets.builder() + .targetVectors(new String[] {titleAndContent, title1, title2, title3}) + .combinationMethod(Targets.CombinationMethod.manualWeights).weights(weights) + .build(); + NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() + .concepts(new String[] {"Water black"}).targets(targets).build(); + Result response = client.graphQL().get().withClassName(className) + .withNearText(nearText).withFields(_additional).run(); + assertGetContainsIds(response, className, id1, id2, id3); + // nearVector with single vector-per-target + Map vectorPerTarget = new HashMap<>(); + vectorPerTarget.put(bringYourOwnVector, new Float[] {.99f, .88f, .77f}); + vectorPerTarget.put(bringYourOwnVector2, new Float[] {.11f, .22f, .33f}); + weights = new HashMap() { + { + this.put(bringYourOwnVector, 0.1f); + this.put(bringYourOwnVector2, 0.6f); + } + }; + targets = Targets.builder() + .targetVectors(new String[] {bringYourOwnVector, bringYourOwnVector2}) + .combinationMethod(Targets.CombinationMethod.manualWeights).weights(weights) + .build(); + NearVectorArgument nearVector = client.graphQL().arguments().nearVectorArgBuilder() + .vectorPerTarget(vectorPerTarget).targets(targets).build(); + response = client.graphQL().get().withClassName(className).withNearVector(nearVector) + .withFields(_additional).run(); + assertNull("check error in response:", response.getError()); + assertGetContainsIds(response, className, id2, id3); + // nearVector with multiple vector-per-target + Map vectorsPerTarget = new HashMap<>(); + vectorsPerTarget.put(bringYourOwnVector, + new Float[][] {new Float[] {.99f, .88f, .77f}, new Float[] {.99f, .88f, .77f}}); + vectorsPerTarget.put(bringYourOwnVector2, new Float[][] {new Float[] {.11f, .22f, .33f}}); + Map weightsMulti = new HashMap<>(); + weightsMulti.put(bringYourOwnVector, new Float[] {0.5f, 0.5f}); + weightsMulti.put(bringYourOwnVector2, new Float[] {0.6f}); + targets = Targets.builder() + .targetVectors(new String[] {bringYourOwnVector, bringYourOwnVector2}) + .combinationMethod(Targets.CombinationMethod.manualWeights) + .weightsMulti(weightsMulti).build(); + nearVector = client.graphQL().arguments().nearVectorArgBuilder() + .vectorsPerTarget(vectorsPerTarget).targets(targets).build(); + response = client.graphQL().get().withClassName(className).withNearVector(nearVector) + .withFields(_additional).run(); + assertNull("check error in response:", response.getError()); + assertGetContainsIds(response, className, id2, id3); + // nearObject + targets = Targets.builder() + .targetVectors(new String[] {bringYourOwnVector, bringYourOwnVector2, + titleAndContent, title1, title2, title3}) + .combinationMethod(Targets.CombinationMethod.average).build(); + NearObjectArgument nearObject = client.graphQL().arguments().nearObjectArgBuilder().id(id3) + .targets(targets).build(); + response = client.graphQL().get().withClassName(className).withNearObject(nearObject) + .withFields(_additional).run(); + assertGetContainsIds(response, className, id2, id3); + } - private void setupDB(String className) { - // clean - Result delete = client.schema().allDeleter().run(); - assertThat(delete).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); - // create class - List properties = Arrays.asList( - Property.builder() - .name("title") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("content") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("title1") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("title2") - .dataType(Collections.singletonList(DataType.TEXT)) - .build()); - Map vectorConfig = new HashMap<>(); - vectorConfig.put(titleAndContent, getTitleAndContentVectorConfig()); - vectorConfig.put(title1, getTitle1VectorConfig()); - vectorConfig.put(title2, getTitle2VectorConfig()); - vectorConfig.put(bringYourOwnVector, getBringYourOwnVectorVectorConfig()); - vectorConfig.put(bringYourOwnVector2, getBringYourOwnVectorVectorConfig2()); - Result createResult = client.schema().classCreator() - .withClass(WeaviateClass.builder() - .className(className) - .properties(properties) - .vectorConfig(vectorConfig) - .build() - ) - .run(); - assertThat(createResult).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); - // add data - // obj1 - Map props1 = new HashMap<>(); - props1.put("title", "The Lord of the Rings"); - props1.put("content", "A great fantasy novel"); - props1.put("title1", "J.R.R. Tolkien The Lord of the Rings"); - props1.put("title2", "Rings"); - Float[] vector1a = new Float[]{0.77f, 0.88f, 0.77f}; - Map vectors1 = new HashMap<>(); - vectors1.put("bringYourOwnVector", vector1a); - // don't add vector for bringYourOwnVector2 - // obj2 - Map props2 = new HashMap<>(); - props2.put("title", "Black Oceans"); - props2.put("content", "A great science fiction book"); - props2.put("title1", "Jacek Dukaj Black Oceans"); - props2.put("title2", "Water"); - Float[] vector2a = new Float[]{0.11f, 0.22f, 0.33f}; - Float[] vector2b = new Float[]{0.11f, 0.11f, 0.11f}; - Map vectors2 = new HashMap<>(); - vectors2.put("bringYourOwnVector", vector2a); - vectors2.put("bringYourOwnVector2", vector2b); - // obj2 - Map props3 = new HashMap<>(); - props3.put("title", "Into the Water"); - props3.put("content", "New York Times bestseller and global phenomenon The Girl on the Train returns with Into the Water"); - props3.put("title1", "Paula Hawkins Into the Water"); - props3.put("title2", "Water go into it"); - Float[] vector3a = new Float[]{0.99f, 0.88f, 0.77f}; - Float[] vector3b = new Float[]{0.99f, 0.88f, 0.77f}; - Map vectors3 = new HashMap<>(); - vectors3.put("bringYourOwnVector", vector3a); - vectors3.put("bringYourOwnVector2", vector3b); + private void setupDB(String className) { + // clean + Result delete = client.schema().allDeleter().run(); + assertThat(delete).isNotNull().returns(false, Result::hasErrors).returns(true, + Result::getResult); + // create class + List properties = Arrays.asList( + Property.builder().name("title").dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder().name("content") + .dataType(Collections.singletonList(DataType.TEXT)).build(), + Property.builder().name("title1").dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder().name("title2").dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder().name("title3").dataType(Collections.singletonList(DataType.TEXT)) + .build()); + Map vectorConfig = new HashMap<>(); + vectorConfig.put(titleAndContent, getTitleAndContentVectorConfig()); + vectorConfig.put(title1, getTitle1VectorConfig()); + vectorConfig.put(title2, getTitle2VectorConfig()); + vectorConfig.put(title3, getTitle3VectorConfig()); + vectorConfig.put(bringYourOwnVector, getBringYourOwnVectorVectorConfig()); + vectorConfig.put(bringYourOwnVector2, getBringYourOwnVectorVectorConfig2()); + Result createResult = client.schema().classCreator() + .withClass(WeaviateClass.builder().className(className).properties(properties) + .vectorConfig(vectorConfig).build()) + .run(); + assertThat(createResult).isNotNull().returns(false, Result::hasErrors).returns(true, + Result::getResult); + // add data + // obj1 + Map props1 = new HashMap<>(); + props1.put("title", "The Lord of the Rings"); + props1.put("content", "A great fantasy novel"); + props1.put("title1", "J.R.R. Tolkien The Lord of the Rings"); + props1.put("title2", "Rings"); + props1.put("title3", "Book"); + Float[] vector1a = new Float[] {0.77f, 0.88f, 0.77f}; + Map vectors1 = new HashMap<>(); + vectors1.put("bringYourOwnVector", vector1a); + // don't add vector for bringYourOwnVector2 + // obj2 + Map props2 = new HashMap<>(); + props2.put("title", "Black Oceans"); + props2.put("content", "A great science fiction book"); + props2.put("title1", "Jacek Dukaj Black Oceans"); + props2.put("title2", "Water"); + props2.put("title3", "Book"); + Float[] vector2a = new Float[] {0.11f, 0.22f, 0.33f}; + Float[] vector2b = new Float[] {0.11f, 0.11f, 0.11f}; + Map vectors2 = new HashMap<>(); + vectors2.put("bringYourOwnVector", vector2a); + vectors2.put("bringYourOwnVector2", vector2b); + // obj2 + Map props3 = new HashMap<>(); + props3.put("title", "Into the Water"); + props3.put("content", + "New York Times bestseller and global phenomenon The Girl on the Train returns with Into the Water"); + props3.put("title1", "Paula Hawkins Into the Water"); + props3.put("title2", "Water go into it"); + props3.put("title3", "Book"); + Float[] vector3a = new Float[] {0.99f, 0.88f, 0.77f}; + Float[] vector3b = new Float[] {0.99f, 0.88f, 0.77f}; + Map vectors3 = new HashMap<>(); + vectors3.put("bringYourOwnVector", vector3a); + vectors3.put("bringYourOwnVector2", vector3b); - WeaviateObject obj1 = createObject(id1, className, props1, vectors1); - WeaviateObject obj2 = createObject(id2, className, props2, vectors2); - WeaviateObject obj3 = createObject(id3, className, props3, vectors3); + WeaviateObject obj1 = createObject(id1, className, props1, vectors1); + WeaviateObject obj2 = createObject(id2, className, props2, vectors2); + WeaviateObject obj3 = createObject(id3, className, props3, vectors3); - Result result = client.batch().objectsBatcher() - .withObjects(obj1, obj2, obj3) - .run(); - assertThat(result).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).asInstanceOf(ARRAY) - .hasSize(3); - } + Result result = + client.batch().objectsBatcher().withObjects(obj1, obj2, obj3).run(); + assertThat(result).isNotNull().returns(false, Result::hasErrors) + .extracting(Result::getResult).asInstanceOf(ARRAY).hasSize(3); + } - private WeaviateClass.VectorConfig getTitleAndContentVectorConfig() { - Map titleAndContent = new HashMap<>(); - Map text2vecContextionarySettings = new HashMap<>(); - text2vecContextionarySettings.put("vectorizeClassName", false); - text2vecContextionarySettings.put("properties", new String[]{"title", "content"}); - titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); - return getHNSWSQVectorConfig(titleAndContent); - } + private WeaviateClass.VectorConfig getTitleAndContentVectorConfig() { + Map titleAndContent = new HashMap<>(); + Map text2vecContextionarySettings = new HashMap<>(); + text2vecContextionarySettings.put("vectorizeClassName", false); + text2vecContextionarySettings.put("properties", new String[] {"title", "content"}); + titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); + return getHNSWSQVectorConfig(titleAndContent); + } - private WeaviateClass.VectorConfig getTitle1VectorConfig() { - Map titleAndContent = new HashMap<>(); - Map text2vecContextionarySettings = new HashMap<>(); - text2vecContextionarySettings.put("vectorizeClassName", false); - text2vecContextionarySettings.put("properties", new String[]{"title1"}); - titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); - return getHNSWPQVectorConfig(titleAndContent); - } + private WeaviateClass.VectorConfig getTitle1VectorConfig() { + Map titleAndContent = new HashMap<>(); + Map text2vecContextionarySettings = new HashMap<>(); + text2vecContextionarySettings.put("vectorizeClassName", false); + text2vecContextionarySettings.put("properties", new String[] {"title1"}); + titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); + return getHNSWPQVectorConfig(titleAndContent); + } + + private WeaviateClass.VectorConfig getTitle2VectorConfig() { + Map titleAndContent = new HashMap<>(); + Map text2vecContextionarySettings = new HashMap<>(); + text2vecContextionarySettings.put("vectorizeClassName", false); + text2vecContextionarySettings.put("properties", new String[] {"title2"}); + titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); + return getHNSWVectorConfig(titleAndContent); + } + + private WeaviateClass.VectorConfig getTitle3VectorConfig() { + Map titleAndContent = new HashMap<>(); + Map text2vecContextionarySettings = new HashMap<>(); + text2vecContextionarySettings.put("vectorizeClassName", false); + text2vecContextionarySettings.put("properties", new String[] {"title3"}); + titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); + return getHNSWRQVectorConfig(titleAndContent); + } - private WeaviateClass.VectorConfig getTitle2VectorConfig() { - Map titleAndContent = new HashMap<>(); - Map text2vecContextionarySettings = new HashMap<>(); - text2vecContextionarySettings.put("vectorizeClassName", false); - text2vecContextionarySettings.put("properties", new String[]{"title2"}); - titleAndContent.put("text2vec-contextionary", text2vecContextionarySettings); - return getHNSWVectorConfig(titleAndContent); - } + private WeaviateClass.VectorConfig getBringYourOwnVectorVectorConfig() { + Map byov = new HashMap<>(); + byov.put("none", new Object()); + return getFlatBQVectorConfig(byov); + } - private WeaviateClass.VectorConfig getBringYourOwnVectorVectorConfig() { - Map byov = new HashMap<>(); - byov.put("none", new Object()); - return getFlatBQVectorConfig(byov); - } + private WeaviateClass.VectorConfig getBringYourOwnVectorVectorConfig2() { + Map byov = new HashMap<>(); + byov.put("none", new Object()); + return getFlatVectorConfig(byov); + } - private WeaviateClass.VectorConfig getBringYourOwnVectorVectorConfig2() { - Map byov = new HashMap<>(); - byov.put("none", new Object()); - return getFlatVectorConfig(byov); - } + private WeaviateClass.VectorConfig getFlatBQVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("flat") + .vectorizer(vectorizerConfig).vectorIndexConfig(VectorIndexConfig.builder() + .bq(BQConfig.builder().enabled(true).build()).build()) + .build(); + } - private WeaviateClass.VectorConfig getFlatBQVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("flat") - .vectorizer(vectorizerConfig) - .vectorIndexConfig(VectorIndexConfig.builder() - .bq(BQConfig.builder().enabled(true).build()) - .build()) - .build(); - } + private WeaviateClass.VectorConfig getFlatVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("flat") + .vectorizer(vectorizerConfig).build(); + } - private WeaviateClass.VectorConfig getFlatVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("flat") - .vectorizer(vectorizerConfig) - .build(); - } + private WeaviateClass.VectorConfig getHNSWVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw") + .vectorizer(vectorizerConfig).build(); + } - private WeaviateClass.VectorConfig getHNSWVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("hnsw") - .vectorizer(vectorizerConfig) - .build(); - } + private WeaviateClass.VectorConfig getHNSWPQVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw") + .vectorizer(vectorizerConfig).vectorIndexConfig(VectorIndexConfig.builder() + .pq(PQConfig.builder().enabled(true).build()).build()) + .build(); + } - private WeaviateClass.VectorConfig getHNSWPQVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("hnsw") - .vectorizer(vectorizerConfig) - .vectorIndexConfig(VectorIndexConfig.builder() - .pq(PQConfig.builder().enabled(true).build()) - .build()) - .build(); - } + private WeaviateClass.VectorConfig getHNSWSQVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw") + .vectorizer(vectorizerConfig).vectorIndexConfig(VectorIndexConfig.builder() + .sq(SQConfig.builder().enabled(true).build()).build()) + .build(); + } - private WeaviateClass.VectorConfig getHNSWSQVectorConfig(Map vectorizerConfig) { - return WeaviateClass.VectorConfig.builder() - .vectorIndexType("hnsw") - .vectorizer(vectorizerConfig) - .vectorIndexConfig(VectorIndexConfig.builder() - .sq(SQConfig.builder().enabled(true).build()) - .build()) - .build(); - } + private WeaviateClass.VectorConfig getHNSWRQVectorConfig(Map vectorizerConfig) { + return WeaviateClass.VectorConfig.builder().vectorIndexType("hnsw") + .vectorizer(vectorizerConfig).vectorIndexConfig(VectorIndexConfig.builder() + .rq(RQConfig.builder().enabled(true).build()).build()) + .build(); + } - private WeaviateObject createObject(String id, String className, Map props, Map vectors) { - WeaviateObject.WeaviateObjectBuilder obj = WeaviateObject.builder() - .id(id) - .className(className) - .properties(props); - if (vectors != null) { - obj = obj.vectors(vectors); + private WeaviateObject createObject(String id, String className, Map props, + Map vectors) { + WeaviateObject.WeaviateObjectBuilder obj = + WeaviateObject.builder().id(id).className(className).properties(props); + if (vectors != null) { + obj = obj.vectors(vectors); + } + return obj.build(); } - return obj.build(); - } - private void assertGetContainsIds(Result response, String className, String... expectedIds) { - assertThat(response).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).isNotNull() - .extracting(GraphQLResponse::getData).isInstanceOf(Map.class) - .extracting(data -> ((Map) data).get("Get")).isInstanceOf(Map.class) - .extracting(get -> ((Map) get).get(className)).isInstanceOf(List.class).asList() - .hasSize(expectedIds.length) - .extracting(obj -> ((Map) obj).get("_additional")) - .extracting(add -> ((Map) add).get("id")) - .containsExactlyInAnyOrder(expectedIds); - } + private void assertGetContainsIds(Result response, String className, + String... expectedIds) { + assertThat(response).isNotNull().returns(false, Result::hasErrors) + .extracting(Result::getResult).isNotNull().extracting(GraphQLResponse::getData) + .isInstanceOf(Map.class).extracting(data -> ((Map) data).get("Get")) + .isInstanceOf(Map.class) + .extracting(get -> ((Map) get).get(className)) + .isInstanceOf(List.class).asList().hasSize(expectedIds.length) + .extracting(obj -> ((Map) obj).get("_additional")) + .extracting(add -> ((Map) add).get("id")) + .containsExactlyInAnyOrder(expectedIds); + } } diff --git a/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java b/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java index a8257f16e..f648a8166 100644 --- a/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java +++ b/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java @@ -337,7 +337,7 @@ public static void testListExistingBackups(List> supplierCreate) { @@ -664,10 +664,12 @@ private static void waitForCreateStatus(Supplier result) { - assumeTrue( - "this operation is not implemented on the server", - result.getError().getMessages().stream() - .noneMatch(err -> err.getMessage().toLowerCase().contains("not implemented")) - ); + if (result.hasErrors()) { + assumeTrue( + "this operation is not implemented on the server", + result.getError().getMessages().stream() + .noneMatch(err -> err.getMessage().toLowerCase().contains("not implemented")) + ); + } } } diff --git a/src/test/java/io/weaviate/integration/tests/batch/ClientBatchGrpcCreateTestSuite.java b/src/test/java/io/weaviate/integration/tests/batch/ClientBatchGrpcCreateTestSuite.java index 53843e44d..02f418703 100644 --- a/src/test/java/io/weaviate/integration/tests/batch/ClientBatchGrpcCreateTestSuite.java +++ b/src/test/java/io/weaviate/integration/tests/batch/ClientBatchGrpcCreateTestSuite.java @@ -6,6 +6,7 @@ import io.weaviate.client.v1.data.model.WeaviateObject; import io.weaviate.client.v1.misc.model.BQConfig; import io.weaviate.client.v1.misc.model.SQConfig; +import io.weaviate.client.v1.misc.model.RQConfig; import io.weaviate.client.v1.misc.model.VectorIndexConfig; import io.weaviate.client.v1.schema.model.Property; import io.weaviate.client.v1.schema.model.WeaviateClass; @@ -20,10 +21,10 @@ public class ClientBatchGrpcCreateTestSuite { public static void shouldCreateBatch(WeaviateClient client, - Function> createClass, - Function> batchCreate, - Function>> fetchObject, - Function> deleteClass) { + Function> createClass, + Function> batchCreate, + Function>> fetchObject, + Function> deleteClass) { testSuite t = new testSuite(client, createClass, batchCreate, fetchObject, deleteClass); @@ -36,6 +37,7 @@ public static void shouldCreateBatch(WeaviateClient client, t.testCreateBatchWithMultiReferenceWithNested(); t.testCreateBatchWithFlatVectorIndex(); t.testCreateBatchWithHNSWSQVectorIndex(); + t.testCreateBatchWithHNSWRQVectorIndex(); } private static class testSuite { @@ -47,8 +49,9 @@ private static class testSuite { private final Function> deleteClass; public testSuite(WeaviateClient client, Function> createClass, - Function> batchCreate, Function>> fetchObject, - Function> deleteClass) { + Function> batchCreate, + Function>> fetchObject, + Function> deleteClass) { this.client = client; this.createClass = createClass; this.batchCreate = batchCreate; @@ -57,7 +60,8 @@ public testSuite(WeaviateClient client, Function> } public void testCreateBatchWithReferenceWithoutNested() { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); // create ref class and populate objects testData.createRefClassesWithObjects(client); // create all properties class @@ -70,7 +74,8 @@ public void testCreateBatchWithReferenceWithoutNested() { } public void testCreateBatchWithMultiReferenceWithoutNested() { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); // create ref class and populate objects testData.createRefClassesWithObjects(client); // create all properties class @@ -83,7 +88,8 @@ public void testCreateBatchWithMultiReferenceWithoutNested() { } public void testCreateBatchWithReferenceWithNested() { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); // create ref class and populate objects testData.createRefClassesWithObjects(client); // create all properties class @@ -96,7 +102,8 @@ public void testCreateBatchWithReferenceWithNested() { } public void testCreateBatchWithMultiReferenceWithNested() { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); // create ref class and populate objects testData.createRefClassesWithObjects(client); // create all properties class @@ -109,7 +116,8 @@ public void testCreateBatchWithMultiReferenceWithNested() { } public void testCreateBatch(String vectorIndexType, VectorIndexConfig vectorIndexConfig) { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); String className = testData.CLASS_NAME; List properties = testData.properties(); WeaviateObject[] objects = testData.objects(); @@ -117,16 +125,20 @@ public void testCreateBatch(String vectorIndexType, VectorIndexConfig vectorInde } public void testCreateBatchWithFlatVectorIndex() { - VectorIndexConfig vectorIndexConfig = VectorIndexConfig.builder() - .bq(BQConfig.builder().enabled(true).build()) - .build(); + VectorIndexConfig vectorIndexConfig = + VectorIndexConfig.builder().bq(BQConfig.builder().enabled(true).build()).build(); testCreateBatch("flat", vectorIndexConfig); } public void testCreateBatchWithHNSWSQVectorIndex() { - VectorIndexConfig vectorIndexConfig = VectorIndexConfig.builder() - .sq(SQConfig.builder().enabled(true).build()) - .build(); + VectorIndexConfig vectorIndexConfig = + VectorIndexConfig.builder().sq(SQConfig.builder().enabled(true).build()).build(); + testCreateBatch("hnsw", vectorIndexConfig); + } + + public void testCreateBatchWithHNSWRQVectorIndex() { + VectorIndexConfig vectorIndexConfig = + VectorIndexConfig.builder().rq(RQConfig.builder().enabled(true).build()).build(); testCreateBatch("hnsw", vectorIndexConfig); } @@ -135,7 +147,8 @@ public void testCreateBatch() { } public void testCreateBatchWithNested() { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); String className = testData.CLASS_NAME; List properties = testData.propertiesWithNestedObject(); WeaviateObject[] objects = testData.objectsWithNestedObject(); @@ -143,58 +156,53 @@ public void testCreateBatchWithNested() { } public void testCreateBatchWithNestedAndNestArrayObject() { - WeaviateTestGenerics.AllPropertiesSchema testData = new WeaviateTestGenerics.AllPropertiesSchema(); + WeaviateTestGenerics.AllPropertiesSchema testData = + new WeaviateTestGenerics.AllPropertiesSchema(); String className = testData.CLASS_NAME; List properties = testData.propertiesWithNestedObjectAndNestedArrayObject(); WeaviateObject[] objects = testData.objectsWithNestedObjectAndNestedArrayObject(); testCreateBatch(className, properties, objects); } - public void testCreateBatch(String className, List properties, WeaviateObject[] objects) { + public void testCreateBatch(String className, List properties, + WeaviateObject[] objects) { testCreateBatch(className, properties, objects, null, null); } - public void testCreateBatch(String className, List properties, WeaviateObject[] objects, - String vectorIndexType, VectorIndexConfig vectorIndexConfig) { + public void testCreateBatch(String className, List properties, + WeaviateObject[] objects, String vectorIndexType, VectorIndexConfig vectorIndexConfig) { // create schema - WeaviateClass.WeaviateClassBuilder weaviateClassBuilder = WeaviateClass.builder() - .className(className) - .properties(properties); + WeaviateClass.WeaviateClassBuilder weaviateClassBuilder = + WeaviateClass.builder().className(className).properties(properties); if (StringUtils.isNotBlank(vectorIndexType) && vectorIndexConfig != null) { weaviateClassBuilder.vectorIndexType(vectorIndexType).vectorIndexConfig(vectorIndexConfig); } Result createResult = this.createClass.apply(weaviateClassBuilder.build()); - assertThat(createResult).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + assertThat(createResult).isNotNull().returns(false, Result::hasErrors).returns(true, + Result::getResult); Result result = this.batchCreate.apply(objects); - assertThat(result).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).asInstanceOf(ARRAY) - .hasSize(objects.length); + assertThat(result).isNotNull().returns(false, Result::hasErrors).extracting(Result::getResult) + .asInstanceOf(ARRAY).hasSize(objects.length); for (WeaviateObject obj : objects) { Result> resultObj = fetchObject.apply(obj); - assertThat(resultObj).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).isNotNull() - .extracting(r -> r.get(0)).isNotNull() - .satisfies(o -> { - assertThat(o.getId()).isEqualTo(obj.getId()); - assertThat(o.getVector()).isNotEmpty(); - assertThat(o.getProperties()).isNotNull() - .extracting(Map::size).isEqualTo(obj.getProperties().size()); - obj.getProperties().keySet().forEach(propName -> { - assertThat(o.getProperties().get(propName)).isNotNull(); + assertThat(resultObj).isNotNull().returns(false, Result::hasErrors) + .extracting(Result::getResult).isNotNull().extracting(r -> r.get(0)).isNotNull() + .satisfies(o -> { + assertThat(o.getId()).isEqualTo(obj.getId()); + assertThat(o.getVector()).isNotEmpty(); + assertThat(o.getProperties()).isNotNull().extracting(Map::size) + .isEqualTo(obj.getProperties().size()); + obj.getProperties().keySet().forEach(propName -> { + assertThat(o.getProperties().get(propName)).isNotNull(); + }); }); - }); } // clean up Result delete = this.deleteClass.apply(className); - assertThat(delete).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).isEqualTo(Boolean.TRUE); + assertThat(delete).isNotNull().returns(false, Result::hasErrors).extracting(Result::getResult) + .isEqualTo(Boolean.TRUE); } } }