From 92708681ba5c2a3a71808bbe2700abaf7635cf5b Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 3 Jun 2025 08:56:16 +0200 Subject: [PATCH 1/3] feat: add searchOperator (minimum_should_match) to bm25 and hybrid arguments --- .../graphql/query/argument/Bm25Argument.java | 38 +++++++++++++-- .../query/argument/HybridArgument.java | 4 ++ .../query/argument/Bm25ArgumentTest.java | 48 ++++++++++++++----- .../query/argument/HybridArgumentTest.java | 18 ++++++- 4 files changed, 92 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java b/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java index 0a0342304..c2bd9abcf 100644 --- a/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java +++ b/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java @@ -1,16 +1,17 @@ package io.weaviate.client.v1.graphql.query.argument; +import java.util.LinkedHashSet; +import java.util.Set; + import io.weaviate.client.v1.graphql.query.util.Serializer; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import lombok.experimental.FieldDefaults; -import java.util.LinkedHashSet; -import java.util.Set; - @Getter @Builder @ToString @@ -19,6 +20,7 @@ public class Bm25Argument implements Argument { String query; String[] properties; + SearchOperator searchOperator; @Override public String build() { @@ -28,7 +30,37 @@ public String build() { if (properties != null) { arg.add(String.format("properties:%s", Serializer.arrayWithQuotes(properties))); } + if (searchOperator != null) { + arg.add(String.format("searchOperator:%s", searchOperator.build())); + } return String.format("bm25:{%s}", String.join(" ", arg)); } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + public static class SearchOperator implements Argument { + private static final String OR = "Or"; + private static final String AND = "And"; + + private String operator; + private int minimumMatch; + + public static SearchOperator and() { + return new SearchOperator(AND, 0); // minimumMatch ignored for And + } + + public static SearchOperator or(int minimumMatch) { + return new SearchOperator(OR, minimumMatch); + } + + @Override + public String build() { + String query = "{operator:" + operator; + if (operator != AND) { + query += " minimumOrTokensMatch:" + minimumMatch; + } + query += "}"; + return query; + } + } } diff --git a/src/main/java/io/weaviate/client/v1/graphql/query/argument/HybridArgument.java b/src/main/java/io/weaviate/client/v1/graphql/query/argument/HybridArgument.java index 0a8214915..619ee5706 100644 --- a/src/main/java/io/weaviate/client/v1/graphql/query/argument/HybridArgument.java +++ b/src/main/java/io/weaviate/client/v1/graphql/query/argument/HybridArgument.java @@ -29,6 +29,7 @@ public class HybridArgument implements Argument { String[] targetVectors; Searches searches; Targets targets; + Bm25Argument.SearchOperator bm25SearchOperator; @Override public String build() { @@ -63,6 +64,9 @@ public String build() { } arg.add(String.format("searches:{%s}", String.join(" ", searchesArgs))); } + if (bm25SearchOperator != null) { + arg.add(String.format("bm25SearchOperator:%s", bm25SearchOperator.build())); + } if (targets != null) { arg.add(String.format("%s", targets.build())); } diff --git a/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java b/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java index 672e745dd..f85fa3006 100644 --- a/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java +++ b/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java @@ -1,16 +1,16 @@ package io.weaviate.client.v1.graphql.query.argument; -import org.junit.Test; - import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + public class Bm25ArgumentTest { @Test public void shouldCreateArgument() { Bm25Argument bm25 = Bm25Argument.builder() - .query("I'm a simple string") - .build(); + .query("I'm a simple string") + .build(); String str = bm25.build(); @@ -20,26 +20,50 @@ public void shouldCreateArgument() { @Test public void shouldCreateArgumentWithProperties() { Bm25Argument bm25 = Bm25Argument.builder() - .query("I'm a simple string") - .properties(new String[]{"prop1", "prop2"}) - .build(); + .query("I'm a simple string") + .properties(new String[] { "prop1", "prop2" }) + .build(); String str = bm25.build(); assertThat(str).isEqualTo("bm25:{query:\"I'm a simple string\" " + - "properties:[\"prop1\",\"prop2\"]}"); + "properties:[\"prop1\",\"prop2\"]}"); + } + + @Test + public void shouldCreateArgumentWithSearchOperator_And() { + Bm25Argument bm25 = Bm25Argument.builder() + .query("hello") + .searchOperator(Bm25Argument.SearchOperator.and()) + .build(); + + String str = bm25.build(); + + assertThat(str).isEqualTo("bm25:{query:\"hello\" searchOperator:{operator:And}}"); + } + + @Test + public void shouldCreateArgumentWithSearchOperator_Or() { + Bm25Argument bm25 = Bm25Argument.builder() + .query("hello") + .searchOperator(Bm25Argument.SearchOperator.or(2)) + .build(); + + String str = bm25.build(); + + assertThat(str).isEqualTo("bm25:{query:\"hello\" searchOperator:{operator:Or minimumOrTokensMatch:2}}"); } @Test public void shouldCreateArgumentWithChars() { Bm25Argument bm25 = Bm25Argument.builder() - .query("\"I'm a complex string\" says the {'`:string:`'}") - .properties(new String[]{"prop:\"'`{0}`'\""}) - .build(); + .query("\"I'm a complex string\" says the {'`:string:`'}") + .properties(new String[] { "prop:\"'`{0}`'\"" }) + .build(); String str = bm25.build(); assertThat(str).isEqualTo("bm25:{query:\"\\\"I'm a complex string\\\" says the {'`:string:`'}\" " + - "properties:[\"prop:\\\"'`{0}`'\\\"\"]}"); + "properties:[\"prop:\\\"'`{0}`'\\\"\"]}"); } } diff --git a/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java b/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java index c2600619b..af074036b 100644 --- a/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java +++ b/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java @@ -133,7 +133,23 @@ public static Object[][] provideTestCases() { .build()) .build(), "hybrid:{query:\"ColBERT me if you can!\" searches:{nearVector:{vector:[[1.0,2.0,3.0],[4.0,5.0,6.0]] targetVectors:[\"colbert\"]}}}", - } + }, + { + "bm25 search operator And", + HybridArgument.builder() + .query("hello") + .bm25SearchOperator(Bm25Argument.SearchOperator.and()) + .build(), + "hybrid:{query:\"hello\" bm25SearchOperator:{operator:And}}", + }, + { + "bm25 search operator Or", + HybridArgument.builder() + .query("hello") + .bm25SearchOperator(Bm25Argument.SearchOperator.or(2)) + .build(), + "hybrid:{query:\"hello\" bm25SearchOperator:{operator:Or minimumOrTokensMatch:2}}", + }, }; } From 2ee5c73a582ac10a0806539a04ad28dcbede37d1 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Mon, 16 Jun 2025 13:42:35 +0200 Subject: [PATCH 2/3] fix: always include minimumOrTokensMatch argument GraphQL validation on the server makes this a required parameter even though it's ignored for operator=And --- .../graphql/query/argument/Bm25Argument.java | 9 +- .../query/argument/Bm25ArgumentTest.java | 2 +- .../query/argument/HybridArgumentTest.java | 2 +- .../integration/client/WeaviateVersion.java | 7 +- .../client/graphql/ClientGraphQLTest.java | 1724 +++++++++-------- 5 files changed, 970 insertions(+), 774 deletions(-) diff --git a/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java b/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java index c2bd9abcf..0d17462f8 100644 --- a/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java +++ b/src/main/java/io/weaviate/client/v1/graphql/query/argument/Bm25Argument.java @@ -55,12 +55,9 @@ public static SearchOperator or(int minimumMatch) { @Override public String build() { - String query = "{operator:" + operator; - if (operator != AND) { - query += " minimumOrTokensMatch:" + minimumMatch; - } - query += "}"; - return query; + // While minimumOrTokensMatch is ignored, it should nevertheless be included + // in the query, otherwise the server refuses to execute it. + return String.format("{operator:%s minimumOrTokensMatch:%s}", operator, minimumMatch); } } } diff --git a/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java b/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java index f85fa3006..2189366b0 100644 --- a/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java +++ b/src/test/java/io/weaviate/client/v1/graphql/query/argument/Bm25ArgumentTest.java @@ -39,7 +39,7 @@ public void shouldCreateArgumentWithSearchOperator_And() { String str = bm25.build(); - assertThat(str).isEqualTo("bm25:{query:\"hello\" searchOperator:{operator:And}}"); + assertThat(str).isEqualTo("bm25:{query:\"hello\" searchOperator:{operator:And minimumOrTokensMatch:0}}"); } @Test diff --git a/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java b/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java index af074036b..ecc37bcab 100644 --- a/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java +++ b/src/test/java/io/weaviate/client/v1/graphql/query/argument/HybridArgumentTest.java @@ -140,7 +140,7 @@ public static Object[][] provideTestCases() { .query("hello") .bm25SearchOperator(Bm25Argument.SearchOperator.and()) .build(), - "hybrid:{query:\"hello\" bm25SearchOperator:{operator:And}}", + "hybrid:{query:\"hello\" bm25SearchOperator:{operator:And minimumOrTokensMatch:0}}", }, { "bm25 search operator Or", diff --git a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java index 5b1c1381a..358cd29d5 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -3,12 +3,13 @@ public class WeaviateVersion { // docker image version - public static final String WEAVIATE_IMAGE = "1.31.0-rc.0-5ff7495"; + public static final String WEAVIATE_IMAGE = "1.31.0"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_VERSION = "1.31.0-rc.0"; + public static final String EXPECTED_WEAVIATE_VERSION = "1.31.0"; // to be set according to weaviate docker image public static final String EXPECTED_WEAVIATE_GIT_HASH = "5ff7495"; - private WeaviateVersion() {} + private WeaviateVersion() { + } } diff --git a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLTest.java b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLTest.java index e9693f5f7..34ecbe995 100644 --- a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLTest.java +++ b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLTest.java @@ -1,9 +1,38 @@ package io.weaviate.integration.client.graphql; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.ARRAY; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + +import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.stream.IntStream; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; + import io.weaviate.client.Config; import io.weaviate.client.WeaviateClient; import io.weaviate.client.base.Result; -import io.weaviate.client.base.Serializer; import io.weaviate.client.v1.batch.model.ObjectGetResponse; import io.weaviate.client.v1.batch.model.ObjectGetResponseStatus; import io.weaviate.client.v1.batch.model.ObjectsGetResponseAO2Result; @@ -13,6 +42,7 @@ import io.weaviate.client.v1.graphql.model.ExploreFields; import io.weaviate.client.v1.graphql.model.GraphQLResponse; import io.weaviate.client.v1.graphql.query.argument.Bm25Argument; +import io.weaviate.client.v1.graphql.query.argument.Bm25Argument.SearchOperator; import io.weaviate.client.v1.graphql.query.argument.GroupArgument; import io.weaviate.client.v1.graphql.query.argument.GroupByArgument; import io.weaviate.client.v1.graphql.query.argument.GroupType; @@ -31,36 +61,6 @@ import io.weaviate.client.v1.schema.model.WeaviateClass; import io.weaviate.integration.client.WeaviateDockerCompose; import io.weaviate.integration.client.WeaviateTestGenerics; -import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateFormatUtils; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.InstanceOfAssertFactories.ARRAY; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Test; public class ClientGraphQLTest extends AbstractClientGraphQLTest { private String address; @@ -104,7 +104,6 @@ public void testGraphQLGet() { assertEquals(4, getPizza.size()); } - @Test public void testRawGraphQL() { // given @@ -132,7 +131,6 @@ public void testRawGraphQL() { assertEquals(4, getPizza.size()); } - @Test public void testGraphQLGetWithNearObjectAndCertainty() { // given @@ -140,23 +138,26 @@ public void testGraphQLGetWithNearObjectAndCertainty() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d962b"; - WeaviateObject soupWithID = WeaviateObject.builder().className("Soup").id(newObjID).properties(new HashMap() {{ - put("name", "JustSoup"); - put("description", "soup with id"); - }}).build(); + WeaviateObject soupWithID = WeaviateObject.builder().className("Soup").id(newObjID) + .properties(new HashMap() { + { + put("name", "JustSoup"); + put("description", "soup with id"); + } + }).build(); NearObjectArgument nearObjectArgument = client.graphQL().arguments().nearObjectArgBuilder() - .id(newObjID).certainty(0.99f).build(); + .id(newObjID).certainty(0.99f).build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(soupWithID).run(); Result result = client.graphQL().get().withClassName("Soup") - .withNearObject(nearObjectArgument) - .withFields(name, _additional).run(); + .withNearObject(nearObjectArgument) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -185,23 +186,26 @@ public void testGraphQLGetWithNearObjectAndDistance() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d962b"; - WeaviateObject soupWithID = WeaviateObject.builder().className("Soup").id(newObjID).properties(new HashMap() {{ - put("name", "JustSoup"); - put("description", "soup with id"); - }}).build(); + WeaviateObject soupWithID = WeaviateObject.builder().className("Soup").id(newObjID) + .properties(new HashMap() { + { + put("name", "JustSoup"); + put("description", "soup with id"); + } + }).build(); NearObjectArgument nearObjectArgument = client.graphQL().arguments().nearObjectArgBuilder() - .id(newObjID).distance(0.01f).build(); + .id(newObjID).distance(0.01f).build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(soupWithID).run(); Result result = client.graphQL().get().withClassName("Soup") - .withNearObject(nearObjectArgument) - .withFields(name, _additional).run(); + .withNearObject(nearObjectArgument) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -223,7 +227,6 @@ public void testGraphQLGetWithNearObjectAndDistance() { assertEquals(1, getSoup.size()); } - @Test public void testBm25() { // given @@ -232,19 +235,19 @@ public void testBm25() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); Bm25Argument bm25 = client.graphQL().arguments().bm25ArgBuilder() - .query("innovation") - .properties(new String[]{"description"}) - .build(); + .query("innovation") + .properties(new String[] { "description" }) + .build(); Field name = Field.builder().name("description").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("id").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get().withClassName("Pizza") - .withBm25(bm25) - .withFields(name, _additional).run(); + .withBm25(bm25) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -266,6 +269,94 @@ public void testBm25() { assertTrue(descr.contains("innovation")); } + @Test + public void testBm25_searchOperator_And() { + // given + Config config = new Config("http", address); + WeaviateClient client = new WeaviateClient(config); + WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); + + Bm25Argument bm25 = client.graphQL().arguments().bm25ArgBuilder() + .query("innovation") + .properties(new String[] { "description" }) + .searchOperator(SearchOperator.and()) + .build(); + + Field name = Field.builder().name("description").build(); + Field _additional = Field.builder() + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); + // when + testGenerics.createTestSchemaAndData(client); + Result result = client.graphQL().get().withClassName("Pizza") + .withBm25(bm25) + .withFields(name, _additional).run(); + testGenerics.cleanupWeaviate(client); + // then + assertNotNull(result); + assertNull(result.getError()); + GraphQLResponse resp = result.getResult(); + assertNotNull(resp); + assertNotNull(resp.getData()); + assertTrue(resp.getData() instanceof Map); + Map data = (Map) resp.getData(); + assertNotNull(data.get("Get")); + assertTrue(data.get("Get") instanceof Map); + Map get = (Map) data.get("Get"); + assertNotNull(get.get("Pizza")); + assertTrue(get.get("Pizza") instanceof List); + List pizza = (List) get.get("Pizza"); + assertEquals(1, pizza.size()); + Map fields = (Map) pizza.get(0); + String descr = (String) fields.get("description"); + assertTrue(descr.contains("innovation")); + } + + @Test + public void testBm25_searchOperator_Or() { + // given + Config config = new Config("http", address); + WeaviateClient client = new WeaviateClient(config); + WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); + + Bm25Argument bm25 = client.graphQL().arguments().bm25ArgBuilder() + .query("innovation") + .properties(new String[] { "description" }) + .searchOperator(SearchOperator.or(1)) + .build(); + + Field name = Field.builder().name("description").build(); + Field _additional = Field.builder() + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); + // when + testGenerics.createTestSchemaAndData(client); + Result result = client.graphQL().get().withClassName("Pizza") + .withBm25(bm25) + .withFields(name, _additional).run(); + testGenerics.cleanupWeaviate(client); + // then + assertNotNull(result); + assertNull(result.getError()); + GraphQLResponse resp = result.getResult(); + assertNotNull(resp); + assertNotNull(resp.getData()); + assertTrue(resp.getData() instanceof Map); + Map data = (Map) resp.getData(); + assertNotNull(data.get("Get")); + assertTrue(data.get("Get") instanceof Map); + Map get = (Map) data.get("Get"); + assertNotNull(get.get("Pizza")); + assertTrue(get.get("Pizza") instanceof List); + List pizza = (List) get.get("Pizza"); + assertEquals(1, pizza.size()); + Map fields = (Map) pizza.get(0); + String descr = (String) fields.get("description"); + assertTrue(descr.contains("innovation")); + } + @Test public void testHybrid() { // given @@ -274,19 +365,19 @@ public void testHybrid() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); HybridArgument hybrid = client.graphQL().arguments().hybridArgBuilder() - .query("some say revolution") - .alpha(0.8f) - .build(); + .query("some say revolution") + .alpha(0.8f) + .build(); Field name = Field.builder().name("description").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("id").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get().withClassName("Pizza") - .withHybrid(hybrid) - .withFields(name, _additional).run(); + .withHybrid(hybrid) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -303,6 +394,81 @@ public void testHybrid() { assertTrue(get.get("Pizza") instanceof List); } + @Test + public void testHybrid_bm25SearchOperator_And() { + // given + Config config = new Config("http", address); + WeaviateClient client = new WeaviateClient(config); + WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); + + HybridArgument hybrid = client.graphQL().arguments().hybridArgBuilder() + .query("some say revolution") + .alpha(0.8f) + .bm25SearchOperator(SearchOperator.and()) + .build(); + Field name = Field.builder().name("description").build(); + Field _additional = Field.builder() + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); + // when + testGenerics.createTestSchemaAndData(client); + Result result = client.graphQL().get().withClassName("Pizza") + .withHybrid(hybrid) + .withFields(name, _additional).run(); + testGenerics.cleanupWeaviate(client); + // then + assertNotNull(result); + assertFalse(result.hasErrors()); + GraphQLResponse resp = result.getResult(); + assertNotNull(resp); + assertNotNull(resp.getData()); + assertTrue(resp.getData() instanceof Map); + Map data = (Map) resp.getData(); + assertNotNull(data.get("Get")); + assertTrue(data.get("Get") instanceof Map); + Map get = (Map) data.get("Get"); + assertNotNull(get.get("Pizza")); + assertTrue(get.get("Pizza") instanceof List); + } + + @Test + public void testHybrid_bm25SearchOperator_Or() { + // given + Config config = new Config("http", address); + WeaviateClient client = new WeaviateClient(config); + WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); + + HybridArgument hybrid = client.graphQL().arguments().hybridArgBuilder() + .query("some say revolution") + .alpha(0.8f) + .bm25SearchOperator(SearchOperator.or(1)) + .build(); + Field name = Field.builder().name("description").build(); + Field _additional = Field.builder() + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); + // when + testGenerics.createTestSchemaAndData(client); + Result result = client.graphQL().get().withClassName("Pizza") + .withHybrid(hybrid) + .withFields(name, _additional).run(); + testGenerics.cleanupWeaviate(client); + // then + assertNotNull(result); + assertFalse(result.hasErrors()); + GraphQLResponse resp = result.getResult(); + assertNotNull(resp); + assertNotNull(resp.getData()); + assertTrue(resp.getData() instanceof Map); + Map data = (Map) resp.getData(); + assertNotNull(data.get("Get")); + assertTrue(data.get("Get") instanceof Map); + Map get = (Map) data.get("Get"); + assertNotNull(get.get("Pizza")); + assertTrue(get.get("Pizza") instanceof List); + } @Test public void testGraphQLGetWithNearTextAndCertainty() { @@ -311,23 +477,23 @@ public void testGraphQLGetWithNearTextAndCertainty() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); NearTextMoveParameters moveAway = NearTextMoveParameters.builder() - .concepts(new String[]{"Universally"}).force(0.8f) - .build(); + .concepts(new String[] { "Universally" }).force(0.8f) + .build(); NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"some say revolution"}) - .moveAwayFrom(moveAway) - .certainty(0.8f) - .build(); + .concepts(new String[] { "some say revolution" }) + .moveAwayFrom(moveAway) + .certainty(0.8f) + .build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get().withClassName("Pizza") - .withNearText(nearText) - .withFields(name, _additional).run(); + .withNearText(nearText) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -353,23 +519,23 @@ public void testGraphQLGetWithNearTextAndDistance() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); NearTextMoveParameters moveAway = NearTextMoveParameters.builder() - .concepts(new String[]{"Universally"}).force(0.8f) - .build(); + .concepts(new String[] { "Universally" }).force(0.8f) + .build(); NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"some say revolution"}) - .moveAwayFrom(moveAway) - .distance(0.4f) - .build(); + .concepts(new String[] { "some say revolution" }) + .moveAwayFrom(moveAway) + .distance(0.4f) + .build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get().withClassName("Pizza") - .withNearText(nearText) - .withFields(name, _additional).run(); + .withNearText(nearText) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -396,41 +562,47 @@ public void testGraphQLGetWithNearTextAndMoveParamsAndCertainty() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID1 = "6baed48e-2afe-4be4-a09d-b00a955d962b"; String newObjID2 = "6baed48e-2afe-4be4-a09d-b00a955d962a"; - WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID1).properties(new HashMap() {{ - put("name", "JustPizza1"); - put("description", "Universally pizza with id"); - }}).build(); - WeaviateObject pizzaWithID2 = WeaviateObject.builder().className("Pizza").id(newObjID2).properties(new HashMap() {{ - put("name", "JustPizza2"); - put("description", "Universally pizza with some other id"); - }}).build(); + WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID1) + .properties(new HashMap() { + { + put("name", "JustPizza1"); + put("description", "Universally pizza with id"); + } + }).build(); + WeaviateObject pizzaWithID2 = WeaviateObject.builder().className("Pizza").id(newObjID2) + .properties(new HashMap() { + { + put("name", "JustPizza2"); + put("description", "Universally pizza with some other id"); + } + }).build(); NearTextMoveParameters moveAway = NearTextMoveParameters.builder() - .objects(new NearTextMoveParameters.ObjectMove[]{ - NearTextMoveParameters.ObjectMove.builder().id(newObjID1).build() - }).force(0.9f).build(); + .objects(new NearTextMoveParameters.ObjectMove[] { + NearTextMoveParameters.ObjectMove.builder().id(newObjID1).build() + }).force(0.9f).build(); NearTextMoveParameters moveTo = NearTextMoveParameters.builder() - .objects(new NearTextMoveParameters.ObjectMove[]{ - NearTextMoveParameters.ObjectMove.builder().id(newObjID2).build() - }).force(0.9f).build(); + .objects(new NearTextMoveParameters.ObjectMove[] { + NearTextMoveParameters.ObjectMove.builder().id(newObjID2).build() + }).force(0.9f).build(); NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"Universally pizza with id"}) - .moveAwayFrom(moveAway) - .moveTo(moveTo) - .certainty(0.4f) - .build(); + .concepts(new String[] { "Universally pizza with id" }) + .moveAwayFrom(moveAway) + .moveTo(moveTo) + .certainty(0.4f) + .build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(pizzaWithID, pizzaWithID2).run(); Result result = client.graphQL().get() - .withClassName("Pizza") - .withNearText(nearText) - .withFields(name, _additional) - .run(); + .withClassName("Pizza") + .withNearText(nearText) + .withFields(name, _additional) + .run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -460,41 +632,47 @@ public void testGraphQLGetWithNearTextAndMoveParamsAndDistance() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID1 = "6baed48e-2afe-4be4-a09d-b00a955d962b"; String newObjID2 = "6baed48e-2afe-4be4-a09d-b00a955d962a"; - WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID1).properties(new HashMap() {{ - put("name", "JustPizza1"); - put("description", "Universally pizza with id"); - }}).build(); - WeaviateObject pizzaWithID2 = WeaviateObject.builder().className("Pizza").id(newObjID2).properties(new HashMap() {{ - put("name", "JustPizza2"); - put("description", "Universally pizza with some other id"); - }}).build(); + WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID1) + .properties(new HashMap() { + { + put("name", "JustPizza1"); + put("description", "Universally pizza with id"); + } + }).build(); + WeaviateObject pizzaWithID2 = WeaviateObject.builder().className("Pizza").id(newObjID2) + .properties(new HashMap() { + { + put("name", "JustPizza2"); + put("description", "Universally pizza with some other id"); + } + }).build(); NearTextMoveParameters moveAway = NearTextMoveParameters.builder() - .objects(new NearTextMoveParameters.ObjectMove[]{ - NearTextMoveParameters.ObjectMove.builder().id(newObjID1).build() - }).force(0.9f).build(); + .objects(new NearTextMoveParameters.ObjectMove[] { + NearTextMoveParameters.ObjectMove.builder().id(newObjID1).build() + }).force(0.9f).build(); NearTextMoveParameters moveTo = NearTextMoveParameters.builder() - .objects(new NearTextMoveParameters.ObjectMove[]{ - NearTextMoveParameters.ObjectMove.builder().id(newObjID2).build() - }).force(0.9f).build(); + .objects(new NearTextMoveParameters.ObjectMove[] { + NearTextMoveParameters.ObjectMove.builder().id(newObjID2).build() + }).force(0.9f).build(); NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"Universally pizza with id"}) - .moveAwayFrom(moveAway) - .moveTo(moveTo) - .distance(0.6f) - .build(); + .concepts(new String[] { "Universally pizza with id" }) + .moveAwayFrom(moveAway) + .moveTo(moveTo) + .distance(0.6f) + .build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(pizzaWithID, pizzaWithID2).run(); Result result = client.graphQL().get() - .withClassName("Pizza") - .withNearText(nearText) - .withFields(name, _additional) - .run(); + .withClassName("Pizza") + .withNearText(nearText) + .withFields(name, _additional) + .run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -523,20 +701,20 @@ public void testGraphQLGetWithNearTextAndLimitAndCertainty() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"some say revolution"}) - .certainty(0.8f) - .build(); + .concepts(new String[] { "some say revolution" }) + .certainty(0.8f) + .build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get().withClassName("Pizza") - .withNearText(nearText) - .withLimit(1) - .withFields(name, _additional).run(); + .withNearText(nearText) + .withLimit(1) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -562,20 +740,20 @@ public void testGraphQLGetWithNearTextAndLimitAndDistance() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(new String[]{"some say revolution"}) - .distance(0.4f) - .build(); + .concepts(new String[] { "some say revolution" }) + .distance(0.4f) + .build(); Field name = Field.builder().name("name").build(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("certainty").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("certainty").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get().withClassName("Pizza") - .withNearText(nearText) - .withLimit(1) - .withFields(name, _additional).run(); + .withNearText(nearText) + .withLimit(1) + .withFields(name, _additional).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -603,39 +781,43 @@ public void testGraphQLGetWithWhereByFieldTokenizedProperty() { Field name = Field.builder().name("name").build(); WhereArgument whereFullString = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"name"}) - .operator(Operator.Equal) - .valueText("Frutti di Mare") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "name" }) + .operator(Operator.Equal) + .valueText("Frutti di Mare") + .build()) + .build(); WhereArgument wherePartString = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"name"}) - .operator(Operator.Equal) - .valueText("Frutti") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "name" }) + .operator(Operator.Equal) + .valueText("Frutti") + .build()) + .build(); WhereArgument whereFullText = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"description"}) - .operator(Operator.Equal) - .valueText("Universally accepted to be the best pizza ever created.") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "description" }) + .operator(Operator.Equal) + .valueText("Universally accepted to be the best pizza ever created.") + .build()) + .build(); WhereArgument wherePartText = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"description"}) - .operator(Operator.Equal) - .valueText("Universally") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "description" }) + .operator(Operator.Equal) + .valueText("Universally") + .build()) + .build(); // when testGenerics.createTestSchemaAndData(client); - Result resultFullString = client.graphQL().get().withWhere(whereFullString).withClassName("Pizza").withFields(name).run(); - Result resultPartString = client.graphQL().get().withWhere(wherePartString).withClassName("Pizza").withFields(name).run(); - Result resultFullText = client.graphQL().get().withWhere(whereFullText).withClassName("Pizza").withFields(name).run(); - Result resultPartText = client.graphQL().get().withWhere(wherePartText).withClassName("Pizza").withFields(name).run(); + Result resultFullString = client.graphQL().get().withWhere(whereFullString).withClassName("Pizza") + .withFields(name).run(); + Result resultPartString = client.graphQL().get().withWhere(wherePartString).withClassName("Pizza") + .withFields(name).run(); + Result resultFullText = client.graphQL().get().withWhere(whereFullText).withClassName("Pizza") + .withFields(name).run(); + Result resultPartText = client.graphQL().get().withWhere(wherePartText).withClassName("Pizza") + .withFields(name).run(); testGenerics.cleanupWeaviate(client); // then assertWhereResultSize(1, resultFullString, "Pizza"); @@ -650,19 +832,19 @@ public void shouldSupportDeprecatedValueString() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); WhereArgument whereString = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"name"}) - .operator(Operator.Equal) - .valueString("Frutti di Mare") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "name" }) + .operator(Operator.Equal) + .valueString("Frutti di Mare") + .build()) + .build(); testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get() - .withWhere(whereString) - .withClassName("Pizza") - .withFields(Field.builder().name("name").build()) - .run(); + .withWhere(whereString) + .withClassName("Pizza") + .withFields(Field.builder().name("name").build()) + .run(); testGenerics.cleanupWeaviate(client); assertWhereResultSize(1, result, "Pizza"); @@ -680,21 +862,22 @@ public void testGraphQLGetWithWhereByDate() { cal.set(2022, Calendar.FEBRUARY, 1, 0, 0, 0); WhereArgument whereDate = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"bestBefore"}) - .operator(Operator.GreaterThan) - .valueDate(cal.getTime()) - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "bestBefore" }) + .operator(Operator.GreaterThan) + .valueDate(cal.getTime()) + .build()) + .build(); // when testGenerics.createTestSchemaAndData(client); - Result resultDate = client.graphQL().get().withWhere(whereDate).withClassName("Pizza").withFields(name).run(); + Result resultDate = client.graphQL().get().withWhere(whereDate).withClassName("Pizza") + .withFields(name).run(); testGenerics.cleanupWeaviate(client); // then List> maps = extractResult(resultDate, "Pizza"); assertThat(maps).hasSize(3) - .extracting(el -> (String) el.get("name")) - .contains("Frutti di Mare", "Hawaii", "Doener"); + .extracting(el -> (String) el.get("name")) + .contains("Frutti di Mare", "Hawaii", "Doener"); } @Test @@ -703,16 +886,17 @@ public void testGraphQLExploreWithCertainty() { Config config = new Config("http", address); WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); - ExploreFields[] fields = new ExploreFields[]{ExploreFields.CERTAINTY, ExploreFields.BEACON, ExploreFields.CLASS_NAME}; - String[] concepts = new String[]{"pineapple slices", "ham"}; + ExploreFields[] fields = new ExploreFields[] { ExploreFields.CERTAINTY, ExploreFields.BEACON, + ExploreFields.CLASS_NAME }; + String[] concepts = new String[] { "pineapple slices", "ham" }; NearTextMoveParameters moveTo = client.graphQL().arguments().nearTextMoveParameterBuilder() - .concepts(new String[]{"Pizza"}).force(0.3f).build(); + .concepts(new String[] { "Pizza" }).force(0.3f).build(); NearTextMoveParameters moveAwayFrom = client.graphQL().arguments().nearTextMoveParameterBuilder() - .concepts(new String[]{"toast", "bread"}).force(0.4f).build(); + .concepts(new String[] { "toast", "bread" }).force(0.4f).build(); NearTextArgument withNearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(concepts).certainty(0.40f) - .moveTo(moveTo).moveAwayFrom(moveAwayFrom) - .build(); + .concepts(concepts).certainty(0.40f) + .moveTo(moveTo).moveAwayFrom(moveAwayFrom) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().explore().withFields(fields).withNearText(withNearText).run(); @@ -738,16 +922,17 @@ public void testGraphQLExploreWithDistance() { Config config = new Config("http", address); WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); - ExploreFields[] fields = new ExploreFields[]{ExploreFields.CERTAINTY, ExploreFields.BEACON, ExploreFields.CLASS_NAME}; - String[] concepts = new String[]{"pineapple slices", "ham"}; + ExploreFields[] fields = new ExploreFields[] { ExploreFields.CERTAINTY, ExploreFields.BEACON, + ExploreFields.CLASS_NAME }; + String[] concepts = new String[] { "pineapple slices", "ham" }; NearTextMoveParameters moveTo = client.graphQL().arguments().nearTextMoveParameterBuilder() - .concepts(new String[]{"Pizza"}).force(0.3f).build(); + .concepts(new String[] { "Pizza" }).force(0.3f).build(); NearTextMoveParameters moveAwayFrom = client.graphQL().arguments().nearTextMoveParameterBuilder() - .concepts(new String[]{"toast", "bread"}).force(0.4f).build(); + .concepts(new String[] { "toast", "bread" }).force(0.4f).build(); NearTextArgument withNearText = client.graphQL().arguments().nearTextArgBuilder() - .concepts(concepts).distance(0.80f) - .moveTo(moveTo).moveAwayFrom(moveAwayFrom) - .build(); + .concepts(concepts).distance(0.80f) + .moveTo(moveTo).moveAwayFrom(moveAwayFrom) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().explore().withFields(fields).withNearText(withNearText).run(); @@ -774,9 +959,9 @@ public void testGraphQLAggregate() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").run(); @@ -795,25 +980,29 @@ public void testGraphQLAggregateWithWhereFilter() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d96ee"; - WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID).properties(new HashMap() {{ - put("name", "JustPizza"); - put("description", "pizza with id"); - }}).build(); + WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID) + .properties(new HashMap() { + { + put("name", "JustPizza"); + put("description", "pizza with id"); + } + }).build(); WhereArgument where = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"id"}) - .operator(Operator.Equal) - .valueText(newObjID) - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "id" }) + .operator(Operator.Equal) + .valueText(newObjID) + .build()) + .build(); Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(pizzaWithID).run(); - Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withWhere(where).run(); + Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza") + .withWhere(where).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -832,25 +1021,29 @@ public void testGraphQLAggregateWithGroupedByAndWhere() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d96ee"; - WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID).properties(new HashMap() {{ - put("name", "JustPizza"); - put("description", "pizza with id"); - }}).build(); + WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID) + .properties(new HashMap() { + { + put("name", "JustPizza"); + put("description", "pizza with id"); + } + }).build(); WhereArgument where = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"id"}) - .operator(Operator.Equal) - .valueText(newObjID) - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "id" }) + .operator(Operator.Equal) + .valueText(newObjID) + .build()) + .build(); Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(pizzaWithID).run(); - Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withGroupBy("name").withWhere(where).run(); + Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza") + .withGroupBy("name").withWhere(where).run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -869,18 +1062,22 @@ public void testGraphQLAggregateWithGroupedBy() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d96ee"; - WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID).properties(new HashMap() {{ - put("name", "JustPizza"); - put("description", "pizza with id"); - }}).build(); + WeaviateObject pizzaWithID = WeaviateObject.builder().className("Pizza").id(newObjID) + .properties(new HashMap() { + { + put("name", "JustPizza"); + put("description", "pizza with id"); + } + }).build(); Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); // when testGenerics.createTestSchemaAndData(client); Result insert = client.batch().objectsBatcher().withObjects(pizzaWithID).run(); - Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withGroupBy("name").run(); + Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza") + .withGroupBy("name").run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(insert); @@ -900,18 +1097,18 @@ public void testGraphQLAggregateWithNearVector() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); testGenerics.createTestSchemaAndData(client); Field additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("vector").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("vector").build() }) + .build(); Result result = client.graphQL().get().withClassName("Pizza").withFields(additional).run(); GraphQLResponse resp = result.getResult(); Float[] vec = getVectorFromResponse(resp); // when Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); NearVectorArgument nearVector = NearVectorArgument.builder().certainty(0.7f).vector(vec).build(); result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withNearVector(nearVector).run(); testGenerics.cleanupWeaviate(client); @@ -932,18 +1129,18 @@ public void testGraphQLAggregateWithNearObjectAndCertainty() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); testGenerics.createTestSchemaAndData(client); Field additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("id").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); Result result = client.graphQL().get().withClassName("Pizza").withFields(additional).run(); GraphQLResponse resp = result.getResult(); String id = getAdditionalFieldFromResponse(resp, "id"); // when Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); NearObjectArgument nearObject = NearObjectArgument.builder().certainty(0.7f).id(id).build(); result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withNearObject(nearObject).run(); testGenerics.cleanupWeaviate(client); @@ -964,18 +1161,18 @@ public void testGraphQLAggregateWithNearObjectAndDistance() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); testGenerics.createTestSchemaAndData(client); Field additional = Field.builder() - .name("_additional") - .fields(new Field[]{Field.builder().name("id").build()}) - .build(); + .name("_additional") + .fields(new Field[] { Field.builder().name("id").build() }) + .build(); Result result = client.graphQL().get().withClassName("Pizza").withFields(additional).run(); GraphQLResponse resp = result.getResult(); String id = getAdditionalFieldFromResponse(resp, "id"); // when Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); NearObjectArgument nearObject = NearObjectArgument.builder().distance(0.3f).id(id).build(); result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withNearObject(nearObject).run(); testGenerics.cleanupWeaviate(client); @@ -998,11 +1195,12 @@ public void testGraphQLAggregateWithNearTextAndCertainty() { // when Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); - NearTextArgument nearText = NearTextArgument.builder().certainty(0.7f).concepts(new String[]{"pizza"}).build(); - Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withNearText(nearText).run(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); + NearTextArgument nearText = NearTextArgument.builder().certainty(0.7f).concepts(new String[] { "pizza" }).build(); + Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza") + .withNearText(nearText).run(); testGenerics.cleanupWeaviate(client); // then @@ -1023,11 +1221,12 @@ public void testGraphQLAggregateWithNearTextAndDistance() { // when Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); - NearTextArgument nearText = NearTextArgument.builder().distance(0.6f).concepts(new String[]{"pizza"}).build(); - Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza").withNearText(nearText).run(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); + NearTextArgument nearText = NearTextArgument.builder().distance(0.6f).concepts(new String[] { "pizza" }).build(); + Result result = client.graphQL().aggregate().withFields(meta).withClassName("Pizza") + .withNearText(nearText).run(); testGenerics.cleanupWeaviate(client); // then @@ -1049,17 +1248,17 @@ public void testGraphQLAggregateWithObjectLimitAndCertainty() { // when Integer objectLimit = 1; Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); - NearTextArgument nearText = NearTextArgument.builder().certainty(0.7f).concepts(new String[]{"pizza"}).build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); + NearTextArgument nearText = NearTextArgument.builder().certainty(0.7f).concepts(new String[] { "pizza" }).build(); Result result = client.graphQL() - .aggregate() - .withFields(meta) - .withClassName("Pizza") - .withNearText(nearText) - .withObjectLimit(objectLimit) - .run(); + .aggregate() + .withFields(meta) + .withClassName("Pizza") + .withNearText(nearText) + .withObjectLimit(objectLimit) + .run(); testGenerics.cleanupWeaviate(client); // then @@ -1081,17 +1280,17 @@ public void testGraphQLAggregateWithObjectLimitAndDistance() { // when Integer objectLimit = 1; Field meta = Field.builder() - .name("meta") - .fields(new Field[]{Field.builder().name("count").build()}) - .build(); - NearTextArgument nearText = NearTextArgument.builder().distance(0.3f).concepts(new String[]{"pizza"}).build(); + .name("meta") + .fields(new Field[] { Field.builder().name("count").build() }) + .build(); + NearTextArgument nearText = NearTextArgument.builder().distance(0.3f).concepts(new String[] { "pizza" }).build(); Result result = client.graphQL() - .aggregate() - .withFields(meta) - .withClassName("Pizza") - .withNearText(nearText) - .withObjectLimit(objectLimit) - .run(); + .aggregate() + .withFields(meta) + .withClassName("Pizza") + .withNearText(nearText) + .withObjectLimit(objectLimit) + .run(); testGenerics.cleanupWeaviate(client); // then @@ -1109,16 +1308,16 @@ public void testGraphQLGetWithGroup() { WeaviateClient client = new WeaviateClient(config); WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); GroupArgument group = client.graphQL().arguments().groupArgBuilder() - .type(GroupType.merge).force(1.0f).build(); + .type(GroupType.merge).force(1.0f).build(); Field name = Field.builder().name("name").build(); // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get() - .withClassName("Soup") - .withFields(name) - .withGroup(group) - .withLimit(7) - .run(); + .withClassName("Soup") + .withFields(name) + .withGroup(group) + .withLimit(7) + .run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -1145,29 +1344,29 @@ public void testGraphQLGetWithSort() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); Field name = Field.builder().name("name").build(); SortArgument byNameDesc = client.graphQL().arguments().sortArgBuilder() - .path(new String[]{"name"}) - .order(SortOrder.desc) - .build(); - String[] expectedByNameDesc = new String[]{"Quattro Formaggi", "Hawaii", "Frutti di Mare", "Doener"}; + .path(new String[] { "name" }) + .order(SortOrder.desc) + .build(); + String[] expectedByNameDesc = new String[] { "Quattro Formaggi", "Hawaii", "Frutti di Mare", "Doener" }; SortArgument byPriceAsc = client.graphQL().arguments().sortArgBuilder() - .path(new String[]{"price"}) - .order(SortOrder.asc) - .build(); - String[] expectedByPriceAsc = new String[]{"Hawaii", "Doener", "Quattro Formaggi", "Frutti di Mare"}; + .path(new String[] { "price" }) + .order(SortOrder.asc) + .build(); + String[] expectedByPriceAsc = new String[] { "Hawaii", "Doener", "Quattro Formaggi", "Frutti di Mare" }; // when testGenerics.createTestSchemaAndData(client); Result resultByNameDesc = client.graphQL().get() - .withClassName("Pizza") - .withSort(byNameDesc) - .withFields(name).run(); + .withClassName("Pizza") + .withSort(byNameDesc) + .withFields(name).run(); Result resultByDescriptionAsc = client.graphQL().get() - .withClassName("Pizza") - .withSort(byPriceAsc) - .withFields(name).run(); + .withClassName("Pizza") + .withSort(byPriceAsc) + .withFields(name).run(); Result resultByNameDescByPriceAsc = client.graphQL().get() - .withClassName("Pizza") - .withSort(byNameDesc, byPriceAsc) - .withFields(name).run(); + .withClassName("Pizza") + .withSort(byNameDesc, byPriceAsc) + .withFields(name).run(); testGenerics.cleanupWeaviate(client); // then expectPizzaNamesOrder(resultByNameDesc, expectedByNameDesc); @@ -1183,40 +1382,40 @@ public void testGraphQLGetWithTimestampFilters() { WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); testGenerics.createTestSchemaAndData(client); Field additional = Field.builder() - .name("_additional") - .fields(new Field[]{ - Field.builder().name("id").build(), - Field.builder().name("creationTimeUnix").build(), - Field.builder().name("lastUpdateTimeUnix").build() - }) - .build(); + .name("_additional") + .fields(new Field[] { + Field.builder().name("id").build(), + Field.builder().name("creationTimeUnix").build(), + Field.builder().name("lastUpdateTimeUnix").build() + }) + .build(); Result expected = client.graphQL().get().withClassName("Pizza").withFields(additional).run(); GraphQLResponse resp = expected.getResult(); String expectedCreateTime = getAdditionalFieldFromResponse(resp, "creationTimeUnix"); String expectedUpdateTime = getAdditionalFieldFromResponse(resp, "lastUpdateTimeUnix"); WhereArgument createTimeFilter = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"_creationTimeUnix"}) - .operator(Operator.Equal) - .valueText(expectedCreateTime) - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "_creationTimeUnix" }) + .operator(Operator.Equal) + .valueText(expectedCreateTime) + .build()) + .build(); WhereArgument updateTimeFilter = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"_lastUpdateTimeUnix"}) - .operator(Operator.Equal) - .valueText(expectedCreateTime) - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "_lastUpdateTimeUnix" }) + .operator(Operator.Equal) + .valueText(expectedCreateTime) + .build()) + .build(); // when Result createTimeResult = client.graphQL().get() - .withClassName("Pizza") - .withWhere(createTimeFilter) - .withFields(additional).run(); + .withClassName("Pizza") + .withWhere(createTimeFilter) + .withFields(additional).run(); Result updateTimeResult = client.graphQL().get() - .withClassName("Pizza") - .withWhere(updateTimeFilter) - .withFields(additional).run(); + .withClassName("Pizza") + .withWhere(updateTimeFilter) + .withFields(additional).run(); // then String resultCreateTime = getAdditionalFieldFromResponse(createTimeResult.getResult(), "creationTimeUnix"); assertEquals(expectedCreateTime, resultCreateTime); @@ -1235,8 +1434,8 @@ public void testGraphQLGetUsingCursorAPI() { // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get() - .withClassName("Pizza").withAfter("00000000-0000-0000-0000-000000000000").withLimit(10).withFields(name) - .run(); + .withClassName("Pizza").withAfter("00000000-0000-0000-0000-000000000000").withLimit(10).withFields(name) + .run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -1265,8 +1464,8 @@ public void testGraphQLGetUsingLimitAndOffset() { // when testGenerics.createTestSchemaAndData(client); Result result = client.graphQL().get() - .withClassName("Pizza").withOffset(3).withLimit(4).withFields(name) - .run(); + .withClassName("Pizza").withOffset(3).withLimit(4).withFields(name) + .run(); testGenerics.cleanupWeaviate(client); // then assertNotNull(result); @@ -1297,15 +1496,15 @@ public void shouldRunGenerativeSearchWithSingleResult() { Field name = Field.builder().name("name").build(); GenerativeSearchBuilder generativeSearch = GenerativeSearchBuilder.builder() - .singleResultPrompt("Describe this pizza : {name}") - .build(); + .singleResultPrompt("Describe this pizza : {name}") + .build(); // when Result result = client.graphQL().get() - .withClassName("Pizza") - .withFields(name) - .withGenerativeSearch(generativeSearch) - .run(); + .withClassName("Pizza") + .withFields(name) + .withGenerativeSearch(generativeSearch) + .run(); testGenerics.cleanupWeaviate(client); // then @@ -1336,15 +1535,15 @@ public void shouldRunGenerativeSearchWithGroupedResult() { Field name = Field.builder().name("name").build(); GenerativeSearchBuilder generativeSearch = GenerativeSearchBuilder.builder() - .groupedResultTask("Describe these pizzas") - .build(); + .groupedResultTask("Describe these pizzas") + .build(); // when Result result = client.graphQL().get() - .withClassName("Pizza") - .withFields(name) - .withGenerativeSearch(generativeSearch) - .run(); + .withClassName("Pizza") + .withFields(name) + .withGenerativeSearch(generativeSearch) + .run(); testGenerics.cleanupWeaviate(client); // then @@ -1381,16 +1580,16 @@ public void shouldRunGenerativeSearchWithGroupedResultAndProperties() { Field name = Field.builder().name("name").build(); GenerativeSearchBuilder generativeSearch = GenerativeSearchBuilder.builder() - .groupedResultTask("Describe these pizzas") - .groupedResultProperties(new String[]{"name", "description"}) - .build(); + .groupedResultTask("Describe these pizzas") + .groupedResultProperties(new String[] { "name", "description" }) + .build(); // when Result result = client.graphQL().get() - .withClassName("Pizza") - .withFields(name) - .withGenerativeSearch(generativeSearch) - .run(); + .withClassName("Pizza") + .withFields(name) + .withGenerativeSearch(generativeSearch) + .run(); testGenerics.cleanupWeaviate(client); // then @@ -1427,16 +1626,16 @@ public void shouldRunGenerativeSearchWithBothSingleAndGroupedResults() { Field name = Field.builder().name("name").build(); GenerativeSearchBuilder generativeSearch = GenerativeSearchBuilder.builder() - .singleResultPrompt("Describe this pizza : {name}") - .groupedResultTask("Describe these pizzas") - .build(); + .singleResultPrompt("Describe this pizza : {name}") + .groupedResultTask("Describe these pizzas") + .build(); // when Result result = client.graphQL().get() - .withClassName("Pizza") - .withFields(name) - .withGenerativeSearch(generativeSearch) - .run(); + .withClassName("Pizza") + .withFields(name) + .withGenerativeSearch(generativeSearch) + .run(); testGenerics.cleanupWeaviate(client); // then @@ -1498,46 +1697,47 @@ public void testGraphQLGetWithGroupBy() { WeaviateClient client = new WeaviateClient(config); // hits - Field[] hits = new Field[]{ - Field.builder() - .name("ofDocument") - .fields(new Field[]{ - Field.builder().name("... on Document") - .fields(new Field[]{Field.builder().name("_additional{id}").build()}).build() - }) - .build(), - Field.builder().name("_additional{id distance}").build(), + Field[] hits = new Field[] { + Field.builder() + .name("ofDocument") + .fields(new Field[] { + Field.builder().name("... on Document") + .fields(new Field[] { Field.builder().name("_additional{id}").build() }).build() + }) + .build(), + Field.builder().name("_additional{id distance}").build(), }; // group Field group = Field.builder() - .name("group") - .fields(new Field[]{ - Field.builder().name("id").build(), - Field.builder().name("groupedBy") - .fields(new Field[]{ - Field.builder().name("value").build(), - Field.builder().name("path").build(), - }).build(), - Field.builder().name("count").build(), - Field.builder().name("maxDistance").build(), - Field.builder().name("minDistance").build(), - Field.builder().name("hits").fields(hits).build(), - }).build(); + .name("group") + .fields(new Field[] { + Field.builder().name("id").build(), + Field.builder().name("groupedBy") + .fields(new Field[] { + Field.builder().name("value").build(), + Field.builder().name("path").build(), + }).build(), + Field.builder().name("count").build(), + Field.builder().name("maxDistance").build(), + Field.builder().name("minDistance").build(), + Field.builder().name("hits").fields(hits).build(), + }).build(); // _additional - Field _additional = Field.builder().name("_additional").fields(new Field[]{group}).build(); + Field _additional = Field.builder().name("_additional").fields(new Field[] { group }).build(); // Property that we group by Field ofDocument = Field.builder().name("ofDocument{__typename}").build(); // filter arguments GroupByArgument groupBy = client.graphQL().arguments().groupByArgBuilder() - .path(new String[]{"ofDocument"}).groups(3).objectsPerGroup(10).build(); - NearObjectArgument nearObject = client.graphQL().arguments().nearObjectArgBuilder().id("00000000-0000-0000-0000-000000000001").build(); + .path(new String[] { "ofDocument" }).groups(3).objectsPerGroup(10).build(); + NearObjectArgument nearObject = client.graphQL().arguments().nearObjectArgBuilder() + .id("00000000-0000-0000-0000-000000000001").build(); // when testData.createAndInsertData(client); Result groupByResult = client.graphQL().get() - .withClassName(testData.PASSAGE) - .withNearObject(nearObject) - .withGroupBy(groupBy) - .withFields(ofDocument, _additional).run(); + .withClassName(testData.PASSAGE) + .withNearObject(nearObject) + .withGroupBy(groupBy) + .withFields(ofDocument, _additional).run(); testData.cleanupWeaviate(client); // then assertThat(groupByResult).isNotNull(); @@ -1549,7 +1749,8 @@ public void testGraphQLGetWithGroupBy() { assertThat(groups).isNotNull().hasSize(3); for (int i = 0; i < 3; i++) { assertThat(groups.get(i).minDistance).isEqualTo(groups.get(i).getHits().get(0).get_additional().getDistance()); - assertThat(groups.get(i).maxDistance).isEqualTo(groups.get(i).getHits().get(groups.get(i).getHits().size() - 1).get_additional().getDistance()); + assertThat(groups.get(i).maxDistance) + .isEqualTo(groups.get(i).getHits().get(groups.get(i).getHits().size() - 1).get_additional().getDistance()); } checkGroupElements(expectedHitsA, groups.get(0).getHits()); checkGroupElements(expectedHitsB, groups.get(1).getHits()); @@ -1562,45 +1763,45 @@ public void testGraphQLGetWithGroupByWithHybrid() { WeaviateClient client = new WeaviateClient(config); // hits - Field[] hits = new Field[]{ - Field.builder().name("content").build(), - Field.builder().name("_additional{id distance}").build(), + Field[] hits = new Field[] { + Field.builder().name("content").build(), + Field.builder().name("_additional{id distance}").build(), }; // group Field group = Field.builder() - .name("group") - .fields(new Field[]{ - Field.builder().name("id").build(), - Field.builder().name("groupedBy") - .fields(new Field[]{ - Field.builder().name("value").build(), - Field.builder().name("path").build(), - }).build(), - Field.builder().name("count").build(), - Field.builder().name("maxDistance").build(), - Field.builder().name("minDistance").build(), - Field.builder().name("hits").fields(hits).build(), - }).build(); + .name("group") + .fields(new Field[] { + Field.builder().name("id").build(), + Field.builder().name("groupedBy") + .fields(new Field[] { + Field.builder().name("value").build(), + Field.builder().name("path").build(), + }).build(), + Field.builder().name("count").build(), + Field.builder().name("maxDistance").build(), + Field.builder().name("minDistance").build(), + Field.builder().name("hits").fields(hits).build(), + }).build(); // _additional - Field _additional = Field.builder().name("_additional").fields(new Field[]{group}).build(); + Field _additional = Field.builder().name("_additional").fields(new Field[] { group }).build(); // Property that we group by Field content = Field.builder().name("content").build(); // filter arguments GroupByArgument groupBy = client.graphQL().arguments().groupByArgBuilder() - .path(new String[]{"content"}).groups(3).objectsPerGroup(10).build(); - NearTextArgument nearText = NearTextArgument.builder().concepts(new String[]{"Passage content 2"}).build(); + .path(new String[] { "content" }).groups(3).objectsPerGroup(10).build(); + NearTextArgument nearText = NearTextArgument.builder().concepts(new String[] { "Passage content 2" }).build(); HybridArgument hybrid = HybridArgument.builder() - .searches(HybridArgument.Searches.builder().nearText(nearText).build()) - .query("Passage content 2") - .alpha(0.9f) - .build(); + .searches(HybridArgument.Searches.builder().nearText(nearText).build()) + .query("Passage content 2") + .alpha(0.9f) + .build(); // when testData.createAndInsertData(client); Result groupByResult = client.graphQL().get() - .withClassName(testData.PASSAGE) - .withHybrid(hybrid) - .withGroupBy(groupBy) - .withFields(content, _additional).run(); + .withClassName(testData.PASSAGE) + .withHybrid(hybrid) + .withGroupBy(groupBy) + .withFields(content, _additional).run(); testData.cleanupWeaviate(client); // then assertThat(groupByResult).isNotNull(); @@ -1615,7 +1816,8 @@ public void testGraphQLGetWithGroupByWithHybrid() { assertThat(groups.get(i).groupedBy.value).isEqualTo("Passage content 2"); } assertThat(groups.get(i).minDistance).isEqualTo(groups.get(i).getHits().get(0).get_additional().getDistance()); - assertThat(groups.get(i).maxDistance).isEqualTo(groups.get(i).getHits().get(groups.get(i).getHits().size() - 1).get_additional().getDistance()); + assertThat(groups.get(i).maxDistance) + .isEqualTo(groups.get(i).getHits().get(groups.get(i).getHits().size() - 1).get_additional().getDistance()); } } @@ -1718,97 +1920,96 @@ public void shouldSupportSearchByUUID() { String className = "ClassUUID"; WeaviateClass clazz = WeaviateClass.builder() - .className(className) - .description("class with uuid properties") - .properties(Arrays.asList( - Property.builder() - .dataType(Collections.singletonList(DataType.UUID)) - .name("uuidProp") - .build(), - Property.builder() - .dataType(Collections.singletonList(DataType.UUID_ARRAY)) - .name("uuidArrayProp") - .build() - )) - .build(); + .className(className) + .description("class with uuid properties") + .properties(Arrays.asList( + Property.builder() + .dataType(Collections.singletonList(DataType.UUID)) + .name("uuidProp") + .build(), + Property.builder() + .dataType(Collections.singletonList(DataType.UUID_ARRAY)) + .name("uuidArrayProp") + .build())) + .build(); String id = "abefd256-8574-442b-9293-9205193737ee"; Map properties = new HashMap<>(); properties.put("uuidProp", "7aaa79d3-a564-45db-8fa8-c49e20b8a39a"); - properties.put("uuidArrayProp", new String[]{ - "f70512a3-26cb-4ae4-9369-204555917f15", - "9e516f40-fd54-4083-a476-f4675b2b5f92" + properties.put("uuidArrayProp", new String[] { + "f70512a3-26cb-4ae4-9369-204555917f15", + "9e516f40-fd54-4083-a476-f4675b2b5f92" }); Result createStatus = client.schema().classCreator() - .withClass(clazz) - .run(); + .withClass(clazz) + .run(); assertThat(createStatus).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); Result objectStatus = client.data().creator() - .withClassName(className) - .withID(id) - .withProperties(properties) - .run(); + .withClassName(className) + .withID(id) + .withProperties(properties) + .run(); assertThat(objectStatus).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).isNotNull(); + .returns(false, Result::hasErrors) + .extracting(Result::getResult).isNotNull(); Field fieldId = Field.builder() - .name("_additional") - .fields(Field.builder().name("id").build()) - .build(); + .name("_additional") + .fields(Field.builder().name("id").build()) + .build(); WhereArgument whereUuid = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"uuidProp"}) - .operator(Operator.Equal) - .valueText("7aaa79d3-a564-45db-8fa8-c49e20b8a39a") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "uuidProp" }) + .operator(Operator.Equal) + .valueText("7aaa79d3-a564-45db-8fa8-c49e20b8a39a") + .build()) + .build(); WhereArgument whereUuidArray1 = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"uuidArrayProp"}) - .operator(Operator.Equal) - .valueText("f70512a3-26cb-4ae4-9369-204555917f15") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "uuidArrayProp" }) + .operator(Operator.Equal) + .valueText("f70512a3-26cb-4ae4-9369-204555917f15") + .build()) + .build(); WhereArgument whereUuidArray2 = WhereArgument.builder() - .filter(WhereFilter.builder() - .path(new String[]{"uuidArrayProp"}) - .operator(Operator.Equal) - .valueText("9e516f40-fd54-4083-a476-f4675b2b5f92") - .build()) - .build(); + .filter(WhereFilter.builder() + .path(new String[] { "uuidArrayProp" }) + .operator(Operator.Equal) + .valueText("9e516f40-fd54-4083-a476-f4675b2b5f92") + .build()) + .build(); Result resultUuid = client.graphQL().get() - .withWhere(whereUuid) - .withClassName(className) - .withFields(fieldId) - .run(); + .withWhere(whereUuid) + .withClassName(className) + .withFields(fieldId) + .run(); Result resultUuidArray1 = client.graphQL().get() - .withWhere(whereUuidArray1) - .withClassName(className) - .withFields(fieldId) - .run(); + .withWhere(whereUuidArray1) + .withClassName(className) + .withFields(fieldId) + .run(); Result resultUuidArray2 = client.graphQL().get() - .withWhere(whereUuidArray2) - .withClassName(className) - .withFields(fieldId) - .run(); + .withWhere(whereUuidArray2) + .withClassName(className) + .withFields(fieldId) + .run(); - assertIds(className, resultUuid, new String[]{id}); - assertIds(className, resultUuidArray1, new String[]{id}); - assertIds(className, resultUuidArray2, new String[]{id}); + assertIds(className, resultUuid, new String[] { id }); + assertIds(className, resultUuidArray1, new String[] { id }); + assertIds(className, resultUuidArray2, new String[] { id }); Result deleteStatus = client.schema().allDeleter().run(); assertThat(deleteStatus).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); } @Test @@ -1817,79 +2018,77 @@ public void shouldSupportSearchWithContains() { String className = "ContainsClass"; Result createResult = client.schema().classCreator() - .withClass(WeaviateClass.builder() - .className(className) - .properties(Arrays.asList( - Property.builder() - .name("bool") - .dataType(Collections.singletonList(DataType.BOOLEAN)) - .build(), - Property.builder() - .name("bools") - .dataType(Collections.singletonList(DataType.BOOLEAN_ARRAY)) - .build(), - - Property.builder() - .name("int") - .dataType(Collections.singletonList(DataType.INT)) - .build(), - Property.builder() - .name("ints") - .dataType(Collections.singletonList(DataType.INT_ARRAY)) - .build(), - - Property.builder() - .name("number") - .dataType(Collections.singletonList(DataType.NUMBER)) - .build(), - Property.builder() - .name("numbers") - .dataType(Collections.singletonList(DataType.NUMBER_ARRAY)) - .build(), - - Property.builder() - .name("string") - .dataType(Collections.singletonList(DataType.STRING)) - .build(), - Property.builder() - .name("strings") - .dataType(Collections.singletonList(DataType.STRING_ARRAY)) - .build(), - - Property.builder() - .name("text") - .dataType(Collections.singletonList(DataType.TEXT)) - .build(), - Property.builder() - .name("texts") - .dataType(Collections.singletonList(DataType.TEXT_ARRAY)) - .build(), - - Property.builder() - .name("date") - .dataType(Collections.singletonList(DataType.DATE)) - .build(), - Property.builder() - .name("dates") - .dataType(Collections.singletonList(DataType.DATE_ARRAY)) - .build(), - - Property.builder() - .name("uuid") - .dataType(Collections.singletonList(DataType.UUID)) - .build(), - Property.builder() - .name("uuids") - .dataType(Collections.singletonList(DataType.UUID_ARRAY)) - .build() - )) - .build() - ) - .run(); + .withClass(WeaviateClass.builder() + .className(className) + .properties(Arrays.asList( + Property.builder() + .name("bool") + .dataType(Collections.singletonList(DataType.BOOLEAN)) + .build(), + Property.builder() + .name("bools") + .dataType(Collections.singletonList(DataType.BOOLEAN_ARRAY)) + .build(), + + Property.builder() + .name("int") + .dataType(Collections.singletonList(DataType.INT)) + .build(), + Property.builder() + .name("ints") + .dataType(Collections.singletonList(DataType.INT_ARRAY)) + .build(), + + Property.builder() + .name("number") + .dataType(Collections.singletonList(DataType.NUMBER)) + .build(), + Property.builder() + .name("numbers") + .dataType(Collections.singletonList(DataType.NUMBER_ARRAY)) + .build(), + + Property.builder() + .name("string") + .dataType(Collections.singletonList(DataType.STRING)) + .build(), + Property.builder() + .name("strings") + .dataType(Collections.singletonList(DataType.STRING_ARRAY)) + .build(), + + Property.builder() + .name("text") + .dataType(Collections.singletonList(DataType.TEXT)) + .build(), + Property.builder() + .name("texts") + .dataType(Collections.singletonList(DataType.TEXT_ARRAY)) + .build(), + + Property.builder() + .name("date") + .dataType(Collections.singletonList(DataType.DATE)) + .build(), + Property.builder() + .name("dates") + .dataType(Collections.singletonList(DataType.DATE_ARRAY)) + .build(), + + Property.builder() + .name("uuid") + .dataType(Collections.singletonList(DataType.UUID)) + .build(), + Property.builder() + .name("uuids") + .dataType(Collections.singletonList(DataType.UUID_ARRAY)) + .build())) + .build()) + .run(); assertThat(createResult).isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); String id1 = "00000000-0000-0000-0000-000000000001"; String id2 = "00000000-0000-0000-0000-000000000002"; @@ -1906,281 +2105,280 @@ public void shouldSupportSearchWithContains() { cal3.set(2023, Calendar.MARCH, 15, 17, 1, 2); Date date3 = cal3.getTime(); - String[] ids = new String[]{ - id1, id2, id3 + String[] ids = new String[] { + id1, id2, id3 }; - Boolean[] bools = new Boolean[]{ - true, false, true + Boolean[] bools = new Boolean[] { + true, false, true }; - Boolean[][] boolsArray = new Boolean[][]{ - {true, false, true}, - {true, false}, - {true}, + Boolean[][] boolsArray = new Boolean[][] { + { true, false, true }, + { true, false }, + { true }, }; - Integer[] ints = new Integer[]{ - 1, 2, 3 + Integer[] ints = new Integer[] { + 1, 2, 3 }; - Integer[][] intsArray = new Integer[][]{ - {1, 2, 3}, - {1, 2}, - {1}, + Integer[][] intsArray = new Integer[][] { + { 1, 2, 3 }, + { 1, 2 }, + { 1 }, }; - Double[] numbers = new Double[]{ - 1.1, 2.2, 3.3 + Double[] numbers = new Double[] { + 1.1, 2.2, 3.3 }; - Double[][] numbersArray = new Double[][]{ - {1.1, 2.2, 3.3}, - {1.1, 2.2}, - {1.1}, + Double[][] numbersArray = new Double[][] { + { 1.1, 2.2, 3.3 }, + { 1.1, 2.2 }, + { 1.1 }, }; - String[] strings = new String[]{ - "string1", "string2", "string3" + String[] strings = new String[] { + "string1", "string2", "string3" }; - String[][] stringsArray = new String[][]{ - {"string1", "string2", "string3"}, - {"string1", "string2"}, - {"string1"}, + String[][] stringsArray = new String[][] { + { "string1", "string2", "string3" }, + { "string1", "string2" }, + { "string1" }, }; - String[] texts = new String[]{ - "text1", "text2", "text3" + String[] texts = new String[] { + "text1", "text2", "text3" }; - String[][] textsArray = new String[][]{ - {"text1", "text2", "text3"}, - {"text1", "text2"}, - {"text1"}, + String[][] textsArray = new String[][] { + { "text1", "text2", "text3" }, + { "text1", "text2" }, + { "text1" }, }; - Date[] dates = new Date[]{ - date1, date2, date3 + Date[] dates = new Date[] { + date1, date2, date3 }; - Date[][] datesArray = new Date[][]{ - {date1, date2, date3}, - {date1, date2}, - {date1}, + Date[][] datesArray = new Date[][] { + { date1, date2, date3 }, + { date1, date2 }, + { date1 }, }; - String[] uuids = new String[]{ - id1, id2, id3 + String[] uuids = new String[] { + id1, id2, id3 }; - String[][] uuidsArray = new String[][]{ - {id1, id2, id3}, - {id1, id2}, - {id1}, + String[][] uuidsArray = new String[][] { + { id1, id2, id3 }, + { id1, id2 }, + { id1 }, }; Function formatDate = date -> DateFormatUtils.format(date, "yyyy-MM-dd'T'HH:mm:ssZZZZZ"); WeaviateObject[] objects = IntStream.range(0, ids.length).mapToObj(i -> { - Map props = new HashMap<>(); - props.put("bool", bools[i]); - props.put("bools", boolsArray[i]); - props.put("int", ints[i]); - props.put("ints", intsArray[i]); - props.put("number", numbers[i]); - props.put("numbers", numbersArray[i]); - props.put("string", strings[i]); - props.put("strings", stringsArray[i]); - props.put("text", texts[i]); - props.put("texts", textsArray[i]); - props.put("date", formatDate.apply(dates[i])); - props.put("dates", Arrays.stream(datesArray[i]).map(formatDate).toArray(String[]::new)); - props.put("uuid", uuids[i]); - props.put("uuids", uuidsArray[i]); - - return WeaviateObject.builder() + Map props = new HashMap<>(); + props.put("bool", bools[i]); + props.put("bools", boolsArray[i]); + props.put("int", ints[i]); + props.put("ints", intsArray[i]); + props.put("number", numbers[i]); + props.put("numbers", numbersArray[i]); + props.put("string", strings[i]); + props.put("strings", stringsArray[i]); + props.put("text", texts[i]); + props.put("texts", textsArray[i]); + props.put("date", formatDate.apply(dates[i])); + props.put("dates", Arrays.stream(datesArray[i]).map(formatDate).toArray(String[]::new)); + props.put("uuid", uuids[i]); + props.put("uuids", uuidsArray[i]); + + return WeaviateObject.builder() .className(className) .id(ids[i]) .properties(props) .build(); - } - ).toArray(WeaviateObject[]::new); + }).toArray(WeaviateObject[]::new); Result batchResult = client.batch().objectsBatcher() - .withObjects(objects) - .run(); + .withObjects(objects) + .run(); assertBatchSuccessful(objects, batchResult); - BiConsumer runAndAssertExpectedIds = (filter, expectedIds) -> { Result gqlResult = client.graphQL().get() - .withClassName(className) - .withWhere(WhereArgument.builder().filter(filter).build()) - .withFields(Field.builder() - .name("_additional") - .fields(Field.builder().name("id").build()) - .build(), - Field.builder().name("bool").build(), - Field.builder().name("bools").build()) - .run(); + .withClassName(className) + .withWhere(WhereArgument.builder().filter(filter).build()) + .withFields(Field.builder() + .name("_additional") + .fields(Field.builder().name("id").build()) + .build(), + Field.builder().name("bool").build(), + Field.builder().name("bools").build()) + .run(); assertIds(className, gqlResult, expectedIds); }; // FIXME: 0 returned - // runAndAssertExpectedIds.accept( - // WhereFilter.builder().path("bools").operator(Operator.ContainsAll).valueBoolean(boolsArray[0]).build(), - // new String[]{id1, id2}); + // runAndAssertExpectedIds.accept( + // WhereFilter.builder().path("bools").operator(Operator.ContainsAll).valueBoolean(boolsArray[0]).build(), + // new String[]{id1, id2}); // FIXME: 0 returned - // runAndAssertExpectedIds.accept( - // WhereFilter.builder().path("bools").operator(Operator.ContainsAll).valueBoolean(boolsArray[1]).build(), - // new String[]{id1, id2}); + // runAndAssertExpectedIds.accept( + // WhereFilter.builder().path("bools").operator(Operator.ContainsAll).valueBoolean(boolsArray[1]).build(), + // new String[]{id1, id2}); // FIXME: 1 returned - // runAndAssertExpectedIds.accept( - // WhereFilter.builder().path("bools").operator(Operator.ContainsAll).valueBoolean(boolsArray[2]).build(), - // new String[]{id1, id2, id3}); + // runAndAssertExpectedIds.accept( + // WhereFilter.builder().path("bools").operator(Operator.ContainsAll).valueBoolean(boolsArray[2]).build(), + // new String[]{id1, id2, id3}); // FIXME: 1 returned - // runAndAssertExpectedIds.accept( - // WhereFilter.builder().path("bools").operator(Operator.ContainsAny).valueBoolean(boolsArray[0]).build(), - // new String[]{id1, id2, id3}); + // runAndAssertExpectedIds.accept( + // WhereFilter.builder().path("bools").operator(Operator.ContainsAny).valueBoolean(boolsArray[0]).build(), + // new String[]{id1, id2, id3}); // FIXME: 1 returned - // runAndAssertExpectedIds.accept( - // WhereFilter.builder().path("bools").operator(Operator.ContainsAny).valueBoolean(boolsArray[1]).build(), - // new String[]{id1, id2, id3}); + // runAndAssertExpectedIds.accept( + // WhereFilter.builder().path("bools").operator(Operator.ContainsAny).valueBoolean(boolsArray[1]).build(), + // new String[]{id1, id2, id3}); // FIXME: 1 returned - // runAndAssertExpectedIds.accept( - // WhereFilter.builder().path("bools").operator(Operator.ContainsAny).valueBoolean(boolsArray[2]).build(), - // new String[]{id1, id2, id3}); + // runAndAssertExpectedIds.accept( + // WhereFilter.builder().path("bools").operator(Operator.ContainsAny).valueBoolean(boolsArray[2]).build(), + // new String[]{id1, id2, id3}); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("ints").operator(Operator.ContainsAll).valueInt(intsArray[0]).build(), - new String[]{id1}); + WhereFilter.builder().path("ints").operator(Operator.ContainsAll).valueInt(intsArray[0]).build(), + new String[] { id1 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("ints").operator(Operator.ContainsAll).valueInt(intsArray[1]).build(), - new String[]{id1, id2}); + WhereFilter.builder().path("ints").operator(Operator.ContainsAll).valueInt(intsArray[1]).build(), + new String[] { id1, id2 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("ints").operator(Operator.ContainsAll).valueInt(intsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("ints").operator(Operator.ContainsAll).valueInt(intsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("ints").operator(Operator.ContainsAny).valueInt(intsArray[0]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("ints").operator(Operator.ContainsAny).valueInt(intsArray[0]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("ints").operator(Operator.ContainsAny).valueInt(intsArray[1]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("ints").operator(Operator.ContainsAny).valueInt(intsArray[1]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("ints").operator(Operator.ContainsAny).valueInt(intsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("ints").operator(Operator.ContainsAny).valueInt(intsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("numbers").operator(Operator.ContainsAll).valueNumber(numbersArray[0]).build(), - new String[]{id1}); + WhereFilter.builder().path("numbers").operator(Operator.ContainsAll).valueNumber(numbersArray[0]).build(), + new String[] { id1 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("numbers").operator(Operator.ContainsAll).valueNumber(numbersArray[1]).build(), - new String[]{id1, id2}); + WhereFilter.builder().path("numbers").operator(Operator.ContainsAll).valueNumber(numbersArray[1]).build(), + new String[] { id1, id2 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("numbers").operator(Operator.ContainsAll).valueNumber(numbersArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("numbers").operator(Operator.ContainsAll).valueNumber(numbersArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("numbers").operator(Operator.ContainsAny).valueNumber(numbersArray[0]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("numbers").operator(Operator.ContainsAny).valueNumber(numbersArray[0]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("numbers").operator(Operator.ContainsAny).valueNumber(numbersArray[1]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("numbers").operator(Operator.ContainsAny).valueNumber(numbersArray[1]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("numbers").operator(Operator.ContainsAny).valueNumber(numbersArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("numbers").operator(Operator.ContainsAny).valueNumber(numbersArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("strings").operator(Operator.ContainsAll).valueString(stringsArray[0]).build(), - new String[]{id1}); + WhereFilter.builder().path("strings").operator(Operator.ContainsAll).valueString(stringsArray[0]).build(), + new String[] { id1 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("strings").operator(Operator.ContainsAll).valueString(stringsArray[1]).build(), - new String[]{id1, id2}); + WhereFilter.builder().path("strings").operator(Operator.ContainsAll).valueString(stringsArray[1]).build(), + new String[] { id1, id2 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("strings").operator(Operator.ContainsAll).valueString(stringsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("strings").operator(Operator.ContainsAll).valueString(stringsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("strings").operator(Operator.ContainsAny).valueString(stringsArray[0]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("strings").operator(Operator.ContainsAny).valueString(stringsArray[0]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("strings").operator(Operator.ContainsAny).valueString(stringsArray[1]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("strings").operator(Operator.ContainsAny).valueString(stringsArray[1]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("strings").operator(Operator.ContainsAny).valueString(stringsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("strings").operator(Operator.ContainsAny).valueString(stringsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("texts").operator(Operator.ContainsAll).valueText(textsArray[0]).build(), - new String[]{id1}); + WhereFilter.builder().path("texts").operator(Operator.ContainsAll).valueText(textsArray[0]).build(), + new String[] { id1 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("texts").operator(Operator.ContainsAll).valueText(textsArray[1]).build(), - new String[]{id1, id2}); + WhereFilter.builder().path("texts").operator(Operator.ContainsAll).valueText(textsArray[1]).build(), + new String[] { id1, id2 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("texts").operator(Operator.ContainsAll).valueText(textsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("texts").operator(Operator.ContainsAll).valueText(textsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("texts").operator(Operator.ContainsAny).valueText(textsArray[0]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("texts").operator(Operator.ContainsAny).valueText(textsArray[0]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("texts").operator(Operator.ContainsAny).valueText(textsArray[1]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("texts").operator(Operator.ContainsAny).valueText(textsArray[1]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("texts").operator(Operator.ContainsAny).valueText(textsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("texts").operator(Operator.ContainsAny).valueText(textsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("dates").operator(Operator.ContainsAll).valueDate(datesArray[0]).build(), - new String[]{id1}); + WhereFilter.builder().path("dates").operator(Operator.ContainsAll).valueDate(datesArray[0]).build(), + new String[] { id1 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("dates").operator(Operator.ContainsAll).valueDate(datesArray[1]).build(), - new String[]{id1, id2}); + WhereFilter.builder().path("dates").operator(Operator.ContainsAll).valueDate(datesArray[1]).build(), + new String[] { id1, id2 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("dates").operator(Operator.ContainsAll).valueDate(datesArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("dates").operator(Operator.ContainsAll).valueDate(datesArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("dates").operator(Operator.ContainsAny).valueDate(datesArray[0]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("dates").operator(Operator.ContainsAny).valueDate(datesArray[0]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("dates").operator(Operator.ContainsAny).valueDate(datesArray[1]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("dates").operator(Operator.ContainsAny).valueDate(datesArray[1]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("dates").operator(Operator.ContainsAny).valueDate(datesArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("dates").operator(Operator.ContainsAny).valueDate(datesArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("uuids").operator(Operator.ContainsAll).valueText(uuidsArray[0]).build(), - new String[]{id1}); + WhereFilter.builder().path("uuids").operator(Operator.ContainsAll).valueText(uuidsArray[0]).build(), + new String[] { id1 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("uuids").operator(Operator.ContainsAll).valueText(uuidsArray[1]).build(), - new String[]{id1, id2}); + WhereFilter.builder().path("uuids").operator(Operator.ContainsAll).valueText(uuidsArray[1]).build(), + new String[] { id1, id2 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("uuids").operator(Operator.ContainsAll).valueText(uuidsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("uuids").operator(Operator.ContainsAll).valueText(uuidsArray[2]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("uuids").operator(Operator.ContainsAny).valueText(uuidsArray[0]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("uuids").operator(Operator.ContainsAny).valueText(uuidsArray[0]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("uuids").operator(Operator.ContainsAny).valueText(uuidsArray[1]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("uuids").operator(Operator.ContainsAny).valueText(uuidsArray[1]).build(), + new String[] { id1, id2, id3 }); runAndAssertExpectedIds.accept( - WhereFilter.builder().path("uuids").operator(Operator.ContainsAny).valueText(uuidsArray[2]).build(), - new String[]{id1, id2, id3}); + WhereFilter.builder().path("uuids").operator(Operator.ContainsAny).valueText(uuidsArray[2]).build(), + new String[] { id1, id2, id3 }); } protected void assertIds(String className, Result gqlResult, String[] expectedIds) { assertThat(gqlResult).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); - - List> results = (List>) ((Map) (((Map) (gqlResult.getResult().getData())).get( - "Get"))).get(className); + .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); + + List> results = (List>) ((Map) (((Map) (gqlResult + .getResult().getData())).get( + "Get"))) + .get(className); String[] resultIds = results.stream() - .map(m -> m.get("_additional")) - .map(a -> ((Map) a).get("id")) - .toArray(String[]::new); + .map(m -> m.get("_additional")) + .map(a -> ((Map) a).get("id")) + .toArray(String[]::new); assertThat(resultIds).containsExactlyInAnyOrder(expectedIds); } private void assertBatchSuccessful(WeaviateObject[] objects, Result batchResult) { assertThat(batchResult).isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult).asInstanceOf(ARRAY) - .hasSize(objects.length); - Arrays.stream(batchResult.getResult()).forEach(resp -> - assertThat(resp).isNotNull() + .returns(false, Result::hasErrors) + .extracting(Result::getResult).asInstanceOf(ARRAY) + .hasSize(objects.length); + Arrays.stream(batchResult.getResult()).forEach(resp -> assertThat(resp).isNotNull() .extracting(ObjectGetResponse::getResult) .returns(ObjectGetResponseStatus.SUCCESS, ObjectsGetResponseAO2Result::getStatus)); } From 79c459a461583602a8af484ddbb37c9bfd7fc1e2 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Mon, 16 Jun 2025 15:00:18 +0200 Subject: [PATCH 3/3] ci: update expected Weaviate commit hash --- .../java/io/weaviate/integration/client/WeaviateVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java index 358cd29d5..95d0db20f 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -8,7 +8,7 @@ public class WeaviateVersion { // to be set according to weaviate docker image public static final String EXPECTED_WEAVIATE_VERSION = "1.31.0"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_GIT_HASH = "5ff7495"; + public static final String EXPECTED_WEAVIATE_GIT_HASH = "79499d6"; private WeaviateVersion() { }