From 9ee63d2181ef4dff891c43b9e6a2c90b7f797991 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 2 Sep 2025 12:52:46 +0200 Subject: [PATCH 1/8] feat(sync): add overwriteAlias --- .../client/v1/backup/api/BackupRestorer.java | 9 ++++ .../integration/client/WeaviateVersion.java | 2 +- .../client/backup/ClientBackupTest.java | 49 +++++++++++++++++++ .../tests/backup/BackupTestSuite.java | 11 +++++ 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/weaviate/client/v1/backup/api/BackupRestorer.java b/src/main/java/io/weaviate/client/v1/backup/api/BackupRestorer.java index 51e82950f..7f17bdb29 100644 --- a/src/main/java/io/weaviate/client/v1/backup/api/BackupRestorer.java +++ b/src/main/java/io/weaviate/client/v1/backup/api/BackupRestorer.java @@ -24,6 +24,7 @@ public class BackupRestorer extends BaseClient implements private String[] excludeClassNames; private String backend; private String backupId; + private Boolean overwriteAlias; private BackupRestoreConfig config; private boolean waitForCompletion; @@ -47,6 +48,11 @@ public BackupRestorer withBackend(String backend) { return this; } + public BackupRestorer withOverwriteAlias(Boolean overwriteAlias) { + this.overwriteAlias = overwriteAlias; + return this; + } + public BackupRestorer withConfig(BackupRestoreConfig config) { this.config = config; return this; @@ -72,6 +78,7 @@ public Result run() { BackupRestore payload = BackupRestore.builder() .include(includeClassNames) .exclude(excludeClassNames) + .overwriteAlias(overwriteAlias) .config(config) .build(); @@ -146,6 +153,8 @@ private static class BackupRestore { String[] include; @SerializedName("exclude") String[] exclude; + @SerializedName("overwriteAlias") + Boolean overwriteAlias; } @Getter diff --git a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java index c87083d70..510700a4f 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -3,7 +3,7 @@ public class WeaviateVersion { // docker image version - public static final String WEAVIATE_IMAGE = "1.32.0"; + public static final String WEAVIATE_IMAGE = "1.33.0-rc.0"; // to be set according to weaviate docker image public static final String EXPECTED_WEAVIATE_VERSION = "1.32.0"; diff --git a/src/test/java/io/weaviate/integration/client/backup/ClientBackupTest.java b/src/test/java/io/weaviate/integration/client/backup/ClientBackupTest.java index a1e721019..7c8fabc8b 100644 --- a/src/test/java/io/weaviate/integration/client/backup/ClientBackupTest.java +++ b/src/test/java/io/weaviate/integration/client/backup/ClientBackupTest.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import java.util.concurrent.Callable; import java.util.function.Function; import java.util.function.Supplier; @@ -19,6 +20,7 @@ import io.weaviate.client.WeaviateAuthClient; import io.weaviate.client.WeaviateClient; import io.weaviate.client.base.Result; +import io.weaviate.client.v1.aliases.model.Alias; import io.weaviate.client.v1.auth.exception.AuthException; import io.weaviate.client.v1.backup.api.BackupCreator; import io.weaviate.client.v1.backup.api.BackupRestorer; @@ -514,6 +516,53 @@ public void shouldRestoreWithRbacOptions() { () -> client.roles().getter().withName(roleName).run()); } + @Test + public void testOverwriteAlias_true() throws Exception { + String originalClass = "CollectionOverwriteAlias"; + String alias = originalClass + "Alias"; + String differentClass = "Different" + originalClass; + + Runnable arrange = () -> { + Result res; + + res = client.schema().classCreator() + .withClass(WeaviateClass.builder().className(originalClass).build()) + .run(); + Assertions.assertThat(res.getError()).isNull(); + res = client.alias().creator().withClassName(originalClass).withAlias(alias).run(); + Assertions.assertThat(res.getError()).isNull(); + + res = client.backup().creator() + .withBackupId(backupId) + .withBackend(BackupTestSuite.BACKEND) + .withIncludeClassNames(originalClass) + .withWaitForCompletion(true) + .run(); + Assertions.assertThat(res.getError()).isNull(); + + res = client.schema().classDeleter().withClassName(originalClass).run(); + Assertions.assertThat(res.getError()).isNull(); + res = client.schema().classCreator() + .withClass(WeaviateClass.builder().className(differentClass).build()) + .run(); + Assertions.assertThat(res.getError()).isNull(); + res = client.alias().updater().withAlias(alias).withNewClassName(differentClass).run(); + Assertions.assertThat(res.getError()).isNull(); + }; + + Callable> act = () -> client.backup().restorer() + .withBackupId(backupId) + .withBackend(BackupTestSuite.BACKEND) + .withIncludeClassNames(originalClass) + .withWaitForCompletion(true) + .withOverwriteAlias(true) + .run(); + + Supplier getAlias = () -> client.alias().getter().withAlias(alias).run().getResult(); + + BackupTestSuite.testOverwriteAlias_true(arrange, act, getAlias, originalClass); + } + @NotNull private Function> createSupplierGQLOfClass() { return (String className) -> client.graphQL().get() diff --git a/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java b/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java index d68c9aa6d..cc8997ce9 100644 --- a/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java +++ b/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java @@ -19,6 +19,7 @@ import io.weaviate.client.base.Result; import io.weaviate.client.base.WeaviateError; import io.weaviate.client.base.WeaviateErrorMessage; +import io.weaviate.client.v1.aliases.model.Alias; import io.weaviate.client.v1.backup.model.Backend; import io.weaviate.client.v1.backup.model.BackupCreateResponse; import io.weaviate.client.v1.backup.model.BackupCreateStatusResponse; @@ -639,6 +640,16 @@ public static void testBackupRestoreWithRbacOptions(String backupId, } + public static void testOverwriteAlias_true( + Runnable arrange, + Callable> act, + Supplier supplierAlias, String wantClassName) throws Exception { + arrange.run(); + Result result = act.call(); + assertThat(result.getError()).isNull(); + assertThat(supplierAlias.get().getClassName()).isEqualTo(wantClassName); + } + private static void assertThatAllPizzasExist(Function> supplierGQLOfClass) { assertThatAllFoodObjectsExist(supplierGQLOfClass, "Pizza", "Quattro Formaggi", "Frutti di Mare", "Hawaii", "Doener"); From 4e67df0479732aa4bc4f2e38e050f26b07c14b7c Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 2 Sep 2025 12:52:46 +0200 Subject: [PATCH 2/8] feat(async): add overwriteAlias --- .../v1/async/backup/api/BackupRestorer.java | 9 ++++ .../client/async/backup/ClientBackupTest.java | 52 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/main/java/io/weaviate/client/v1/async/backup/api/BackupRestorer.java b/src/main/java/io/weaviate/client/v1/async/backup/api/BackupRestorer.java index 20195f44e..5a7eac7af 100644 --- a/src/main/java/io/weaviate/client/v1/async/backup/api/BackupRestorer.java +++ b/src/main/java/io/weaviate/client/v1/async/backup/api/BackupRestorer.java @@ -40,6 +40,7 @@ public class BackupRestorer extends AsyncBaseClient private String[] excludeClassNames; private String backend; private String backupId; + private Boolean overwriteAlias; private BackupRestoreConfig config; private boolean waitForCompletion; private final Executor executor; @@ -81,6 +82,11 @@ public BackupRestorer withWaitForCompletion(boolean waitForCompletion) { return this; } + public BackupRestorer withOverwriteAlias(boolean overwriteAlias) { + this.overwriteAlias = overwriteAlias; + return this; + } + @Override public Future> run(FutureCallback> callback) { if (waitForCompletion) { @@ -94,6 +100,7 @@ private Future> restore(FutureCallback { + Result res; + + res = async.schema().classCreator() + .withClass(WeaviateClass.builder().className(originalClass).build()) + .run().get(); + Assertions.assertThat(res.getError()).isNull(); + res = async.alias().creator().withClassName(originalClass).withAlias(alias).run().get(); + Assertions.assertThat(res.getError()).isNull(); + + res = async.backup().creator() + .withBackupId(backupId) + .withBackend(BackupTestSuite.BACKEND) + .withIncludeClassNames(originalClass) + .withWaitForCompletion(true) + .run().get(); + Assertions.assertThat(res.getError()).isNull(); + + res = async.schema().classDeleter().withClassName(originalClass).run().get(); + Assertions.assertThat(res.getError()).isNull(); + res = async.schema().classCreator() + .withClass(WeaviateClass.builder().className(differentClass).build()) + .run().get(); + Assertions.assertThat(res.getError()).isNull(); + res = async.alias().updater().withAlias(alias).withNewClassName(differentClass).run().get(); + Assertions.assertThat(res.getError()).isNull(); + + return null; // satisfy Callable + }); + + Callable> act = () -> async.backup().restorer() + .withBackupId(backupId) + .withBackend(BackupTestSuite.BACKEND) + .withIncludeClassNames(originalClass) + .withWaitForCompletion(true) + .withOverwriteAlias(true) + .run().get(); + + Supplier getAlias = supplier(() -> async.alias().getter().withAlias(alias).run().get().getResult()); + + BackupTestSuite.testOverwriteAlias_true(arrange, act, getAlias, originalClass); + } + } + @FunctionalInterface interface ThrowingSupplier { T get() throws Exception; From 184e73a173c32816f40868463aa7e0e25454355e Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 2 Sep 2025 14:50:29 +0200 Subject: [PATCH 3/8] test: fix expected commit hash --- .../java/io/weaviate/integration/client/WeaviateVersion.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java index 510700a4f..5191ec286 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -6,9 +6,9 @@ public class WeaviateVersion { public static final String WEAVIATE_IMAGE = "1.33.0-rc.0"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_VERSION = "1.32.0"; + public static final String EXPECTED_WEAVIATE_VERSION = "1.32.0-rc.0"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_GIT_HASH = "7cebee0"; + public static final String EXPECTED_WEAVIATE_GIT_HASH = "7a6f802"; private WeaviateVersion() { } From a4276a9b76d3b7634d3f7cc4d180ffee29728ad3 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 2 Sep 2025 15:43:33 +0200 Subject: [PATCH 4/8] test: fix typo --- .../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 5191ec286..645dbce0e 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -6,7 +6,7 @@ public class WeaviateVersion { public static final String WEAVIATE_IMAGE = "1.33.0-rc.0"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_VERSION = "1.32.0-rc.0"; + public static final String EXPECTED_WEAVIATE_VERSION = "1.33.0-rc.0"; // to be set according to weaviate docker image public static final String EXPECTED_WEAVIATE_GIT_HASH = "7a6f802"; From 166c7d50c8ddbf222bbf5562b6ea11b6ab80b5b6 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 2 Sep 2025 15:48:33 +0200 Subject: [PATCH 5/8] test: relax error message checks These are server-specific and have nothing to do with the client logic --- .../weaviate/integration/tests/backup/BackupTestSuite.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java b/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java index cc8997ce9..2b339ddf2 100644 --- a/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java +++ b/src/test/java/io/weaviate/integration/tests/backup/BackupTestSuite.java @@ -15,6 +15,7 @@ import java.util.function.Supplier; import org.apache.http.HttpStatus; +import org.assertj.core.api.InstanceOfAssertFactories; import io.weaviate.client.base.Result; import io.weaviate.client.base.WeaviateError; @@ -405,8 +406,8 @@ public static void testFailOnRestoreBackupForExistingClass(Supplier> supplierCreate, From d372d5e0bd3429afbf75b2408cac66497880dcdb Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 2 Sep 2025 16:06:40 +0200 Subject: [PATCH 6/8] test: keep calm and update expected git hash once more --- .../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 645dbce0e..6f5a26294 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.33.0-rc.0"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_GIT_HASH = "7a6f802"; + public static final String EXPECTED_WEAVIATE_GIT_HASH = "15c08c7"; private WeaviateVersion() { } From d8e8ba4019bce54b7c6890be3490374c389deaf8 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Wed, 3 Sep 2025 16:53:05 +0200 Subject: [PATCH 7/8] test: delete server-related assertion This test simply checks that server returns some string exactly, which is based _entirely_ on how the server is configured and has no relation to the client-side logic. It is deserialized in and Object, so there is no special behavior to verify. The assertion does fail with v1.33.0-rc.0 though, because the server started returning a different string. Once again, this string is not something that affects client behavior in any way. --- .../io/weaviate/integration/tests/misc/MiscTestSuite.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/io/weaviate/integration/tests/misc/MiscTestSuite.java b/src/test/java/io/weaviate/integration/tests/misc/MiscTestSuite.java index 4cc97d2a3..962ccab22 100644 --- a/src/test/java/io/weaviate/integration/tests/misc/MiscTestSuite.java +++ b/src/test/java/io/weaviate/integration/tests/misc/MiscTestSuite.java @@ -1,13 +1,14 @@ package io.weaviate.integration.tests.misc; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.misc.model.Meta; import static io.weaviate.integration.client.WeaviateVersion.EXPECTED_WEAVIATE_VERSION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.misc.model.Meta; + public class MiscTestSuite { public static void assertLivenessOrReadiness(Result result) { assertNotNull(result); @@ -19,8 +20,5 @@ public static void assertMeta(Result meta) { assertNull(meta.getError()); assertEquals("http://[::]:8080", meta.getResult().getHostname()); assertEquals(EXPECTED_WEAVIATE_VERSION, meta.getResult().getVersion()); - assertEquals("{backup-filesystem={backupsPath=/tmp/backups}, " + - "generative-openai={documentationHref=https://platform.openai.com/docs/api-reference/completions, name=Generative Search - OpenAI}, " + - "text2vec-contextionary={version=en0.16.0-v1.2.1, wordCount=818072.0}}", meta.getResult().getModules().toString()); } } From f6505a0c36c490f94b5acd50ed55790705218001 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Tue, 9 Sep 2025 13:27:34 +0200 Subject: [PATCH 8/8] ci: disable breaking Explore test They are breaking due to a regression in Weaviate v1.33. --- .../async/graphql/ClientGraphQLTest.java | 1068 +++++++++-------- .../client/graphql/ClientGraphQLTest.java | 8 + 2 files changed, 567 insertions(+), 509 deletions(-) diff --git a/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLTest.java b/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLTest.java index 1346ab15d..7ea809492 100644 --- a/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLTest.java +++ b/src/test/java/io/weaviate/integration/client/async/graphql/ClientGraphQLTest.java @@ -1,5 +1,28 @@ package io.weaviate.integration.client.async.graphql; +import static org.junit.Assert.fail; +import static org.junit.Assume.assumeTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; + +import org.assertj.core.api.Assertions; +import org.junit.After; +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; @@ -12,29 +35,26 @@ import io.weaviate.client.v1.batch.model.ObjectGetResponse; import io.weaviate.client.v1.data.model.WeaviateObject; import io.weaviate.client.v1.filters.Operator; -import io.weaviate.client.v1.filters.WhereFilter; import io.weaviate.client.v1.graphql.model.ExploreFields; import io.weaviate.client.v1.graphql.model.GraphQLResponse; -import io.weaviate.client.v1.graphql.query.argument.*; +import io.weaviate.client.v1.graphql.query.argument.Bm25Argument; +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; +import io.weaviate.client.v1.graphql.query.argument.HybridArgument; +import io.weaviate.client.v1.graphql.query.argument.NearObjectArgument; +import io.weaviate.client.v1.graphql.query.argument.NearTextArgument; +import io.weaviate.client.v1.graphql.query.argument.NearTextMoveParameters; +import io.weaviate.client.v1.graphql.query.argument.NearVectorArgument; +import io.weaviate.client.v1.graphql.query.argument.SortArgument; +import io.weaviate.client.v1.graphql.query.argument.SortOrder; +import io.weaviate.client.v1.graphql.query.argument.WhereArgument; import io.weaviate.client.v1.graphql.query.fields.Field; import io.weaviate.client.v1.schema.model.DataType; import io.weaviate.client.v1.schema.model.Property; import io.weaviate.client.v1.schema.model.WeaviateClass; import io.weaviate.integration.client.WeaviateDockerCompose; import io.weaviate.integration.client.WeaviateTestGenerics; -import org.assertj.core.api.Assertions; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Test; - -import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.function.Consumer; - -import static org.junit.Assert.fail; -import static org.junit.Assume.assumeTrue; -import static org.junit.jupiter.api.Assertions.*; public class ClientGraphQLTest extends AbstractAsyncClientTest { private final WeaviateTestGenerics testGenerics = new WeaviateTestGenerics(); @@ -68,7 +88,7 @@ public void after() { @Test public void testGraphQLGet() { Result result = doGet(get -> get.withClassName("Pizza") - .withFields(field("name"))); + .withFields(field("name"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(4, pizzas.size(), "wrong number of pizzas returned"); @@ -88,32 +108,32 @@ public void testGraphQLRaw() { public void testGraphQLGetWithNearObjectAndCertainty() { String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d962b"; NearObjectArgument nearObjectArgument = gql.arguments() - .nearObjectArgBuilder() - .id(newObjID) - .certainty(0.99f) - .build(); + .nearObjectArgBuilder() + .id(newObjID) + .certainty(0.99f) + .build(); WeaviateObject soupWithID = WeaviateObject.builder() - .className("Soup") - .id(newObjID) - .properties(new HashMap() { - { - put("name", "JustSoup"); - put("description", "soup with id"); - } - }) - .build(); + .className("Soup") + .id(newObjID) + .properties(new HashMap() { + { + put("name", "JustSoup"); + put("description", "soup with id"); + } + }) + .build(); // Insert additional test data Result insert = syncClient.batch() - .objectsBatcher() - .withObjects(soupWithID) - .run(); + .objectsBatcher() + .withObjects(soupWithID) + .run(); assumeTrue("all test objects inserted successfully", insert.getResult().length == 1); Result result = doGet(get -> get.withClassName("Soup") - .withNearObject(nearObjectArgument) - .withFields(field("name"), _additional("certainty"))); + .withNearObject(nearObjectArgument) + .withFields(field("name"), _additional("certainty"))); List soups = extractClass(result, "Get", "Soup"); assertEquals(1, soups.size(), "wrong number of soups"); @@ -123,31 +143,31 @@ public void testGraphQLGetWithNearObjectAndCertainty() { public void testGraphQLGetWithNearObjectAndDistance() { String newObjID = "6baed48e-2afe-4be4-a09d-b00a955d962b"; NearObjectArgument nearObjectArgument = gql.arguments() - .nearObjectArgBuilder() - .id(newObjID) - .distance(0.1f) - .build(); + .nearObjectArgBuilder() + .id(newObjID) + .distance(0.1f) + .build(); WeaviateObject soupWithID = WeaviateObject.builder() - .className("Soup") - .id(newObjID) - .properties(new HashMap() { - { - put("name", "JustSoup"); - put("description", "soup with id"); - } - }) - .build(); + .className("Soup") + .id(newObjID) + .properties(new HashMap() { + { + put("name", "JustSoup"); + put("description", "soup with id"); + } + }) + .build(); // Insert additional test data syncClient.batch() - .objectsBatcher() - .withObjects(soupWithID) - .run(); + .objectsBatcher() + .withObjects(soupWithID) + .run(); Result result = doGet(get -> get.withClassName("Soup") - .withNearObject(nearObjectArgument) - .withFields(field("name"), _additional("distance"))); + .withNearObject(nearObjectArgument) + .withFields(field("name"), _additional("distance"))); List soups = extractClass(result, "Get", "Soup"); assertEquals(1, soups.size(), "wrong number of soups"); @@ -157,14 +177,14 @@ public void testGraphQLGetWithNearObjectAndDistance() { @SuppressWarnings("unchecked") public void testBm25() { Bm25Argument bm25 = gql.arguments() - .bm25ArgBuilder() - .query("innovation") - .properties(new String[]{ "description" }) - .build(); + .bm25ArgBuilder() + .query("innovation") + .properties(new String[] { "description" }) + .build(); Result result = doGet(get -> get.withClassName("Pizza") - .withBm25(bm25) - .withFields(field("description"), _additional("id", "distance"))); + .withBm25(bm25) + .withFields(field("description"), _additional("id", "distance"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(1, pizzas.size(), "wrong number of pizzas"); @@ -176,14 +196,14 @@ public void testBm25() { @Test public void testHybrid() { HybridArgument hybrid = gql.arguments() - .hybridArgBuilder() - .query("some say revolution") - .alpha(0.8f) - .build(); + .hybridArgBuilder() + .query("some say revolution") + .alpha(0.8f) + .build(); Result result = doGet(get -> get.withClassName("Pizza") - .withHybrid(hybrid) - .withFields(field("description"), _additional("id"))); + .withHybrid(hybrid) + .withFields(field("description"), _additional("id"))); List pizzas = extractClass(result, "Get", "Pizza"); assertFalse(pizzas.isEmpty(), "didn't get any pizzas"); @@ -192,19 +212,19 @@ public void testHybrid() { @Test public void testGraphQLGetWithNearTextAndCertainty() { NearTextMoveParameters moveAway = NearTextMoveParameters.builder() - .concepts(new String[]{ "Universally" }) - .force(0.8f) - .build(); + .concepts(new String[] { "Universally" }) + .force(0.8f) + .build(); NearTextArgument nearText = gql.arguments() - .nearTextArgBuilder() - .concepts(new String[]{ "some say revolution" }) - .moveAwayFrom(moveAway) - .certainty(0.8f) - .build(); + .nearTextArgBuilder() + .concepts(new String[] { "some say revolution" }) + .moveAwayFrom(moveAway) + .certainty(0.8f) + .build(); Result result = doGet(get -> get.withClassName("Pizza") - .withNearText(nearText) - .withFields(field("name"), _additional("certainty"))); + .withNearText(nearText) + .withFields(field("name"), _additional("certainty"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(1, pizzas.size(), "wrong number of pizzas"); @@ -213,19 +233,19 @@ public void testGraphQLGetWithNearTextAndCertainty() { @Test public void testGraphQLGetWithNearTextAndDistance() { NearTextMoveParameters moveAway = NearTextMoveParameters.builder() - .concepts(new String[]{ "Universally" }) - .force(0.8f) - .build(); + .concepts(new String[] { "Universally" }) + .force(0.8f) + .build(); NearTextArgument nearText = gql.arguments() - .nearTextArgBuilder() - .concepts(new String[]{ "some say revolution" }) - .moveAwayFrom(moveAway) - .distance(0.4f) - .build(); + .nearTextArgBuilder() + .concepts(new String[] { "some say revolution" }) + .moveAwayFrom(moveAway) + .distance(0.4f) + .build(); Result result = doGet(get -> get.withClassName("Pizza") - .withNearText(nearText) - .withFields(field("name"), _additional("distance"))); + .withNearText(nearText) + .withFields(field("name"), _additional("distance"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(1, pizzas.size(), "wrong number of pizzas"); @@ -236,56 +256,56 @@ public void testGraphQLGetWithNearTextAndMoveParamsAndCertainty() { 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(); + .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(); + .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 = gql.arguments() - .nearTextArgBuilder() - .concepts(new String[]{ "Universally pizza with id" }) - .moveAwayFrom(moveAway) - .moveTo(moveTo) - .certainty(0.4f) - .build(); + .nearTextArgBuilder() + .concepts(new String[] { "Universally pizza with id" }) + .moveAwayFrom(moveAway) + .moveTo(moveTo) + .certainty(0.4f) + .build(); // Insert additional test data Result insert = syncClient.batch() - .objectsBatcher() - .withObjects(pizzaWithID, pizzaWithID2) - .run(); + .objectsBatcher() + .withObjects(pizzaWithID, pizzaWithID2) + .run(); assumeTrue("all test objects inserted successfully", insert.getResult().length == 2); Result result = doGet(get -> get.withClassName("Pizza") - .withNearText(nearText) - .withFields(field("name"), _additional("certainty"))); + .withNearText(nearText) + .withFields(field("name"), _additional("certainty"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(6, pizzas.size(), "wrong number of pizzas"); @@ -296,56 +316,56 @@ public void testGraphQLGetWithNearTextAndMoveParamsAndDistance() { 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(); + .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(); + .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 = gql.arguments() - .nearTextArgBuilder() - .concepts(new String[]{ "Universally pizza with id" }) - .moveAwayFrom(moveAway) - .moveTo(moveTo) - .distance(0.6f) - .build(); + .nearTextArgBuilder() + .concepts(new String[] { "Universally pizza with id" }) + .moveAwayFrom(moveAway) + .moveTo(moveTo) + .distance(0.6f) + .build(); // Insert additional test data Result insert = syncClient.batch() - .objectsBatcher() - .withObjects(pizzaWithID, pizzaWithID2) - .run(); + .objectsBatcher() + .withObjects(pizzaWithID, pizzaWithID2) + .run(); assumeTrue("all test objects inserted successfully", insert.getResult().length == 2); Result result = doGet(get -> get.withClassName("Pizza") - .withNearText(nearText) - .withFields(field("name"), _additional("distance"))); + .withNearText(nearText) + .withFields(field("name"), _additional("distance"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(6, pizzas.size(), "wrong number of pizzas"); @@ -354,15 +374,15 @@ public void testGraphQLGetWithNearTextAndMoveParamsAndDistance() { @Test public void testGraphQLGetWithNearTextAndLimitAndCertainty() { NearTextArgument nearText = gql.arguments() - .nearTextArgBuilder() - .concepts(new String[]{ "some say revolution" }) - .certainty(0.8f) - .build(); + .nearTextArgBuilder() + .concepts(new String[] { "some say revolution" }) + .certainty(0.8f) + .build(); Result result = doGet(get -> get.withClassName("Pizza") - .withNearText(nearText) - .withLimit(1) - .withFields(field("name"), _additional("certainty"))); + .withNearText(nearText) + .withLimit(1) + .withFields(field("name"), _additional("certainty"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(1, pizzas.size(), "wrong number of pizzas"); @@ -371,15 +391,15 @@ public void testGraphQLGetWithNearTextAndLimitAndCertainty() { @Test public void testGraphQLGetWithNearTextAndLimitAndDistance() { NearTextArgument nearText = gql.arguments() - .nearTextArgBuilder() - .concepts(new String[]{ "some say revolution" }) - .distance(0.4f) - .build(); + .nearTextArgBuilder() + .concepts(new String[] { "some say revolution" }) + .distance(0.4f) + .build(); Result result = doGet(get -> get.withClassName("Pizza") - .withNearText(nearText) - .withLimit(1) - .withFields(field("name"), _additional("distance"))); + .withNearText(nearText) + .withLimit(1) + .withFields(field("name"), _additional("distance"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(1, pizzas.size(), "wrong number of pizzas"); @@ -390,21 +410,22 @@ public void testGraphQLGetWithWhereByFieldTokenizedProperty() { Field name = field("name"); WhereArgument whereFullString = whereText("name", Operator.Equal, "Frutti di Mare"); WhereArgument wherePartString = whereText("name", Operator.Equal, "Frutti"); - WhereArgument whereFullText = whereText("description", Operator.Equal, "Universally accepted to be the best pizza ever created."); + WhereArgument whereFullText = whereText("description", Operator.Equal, + "Universally accepted to be the best pizza ever created."); WhereArgument wherePartText = whereText("description", Operator.Equal, "Universally"); // when Result resultFullString = doGet(get -> get.withWhere(whereFullString) - .withClassName("Pizza") - .withFields(name)); + .withClassName("Pizza") + .withFields(name)); Result resultPartString = doGet(get -> get.withWhere(wherePartString) - .withClassName("Pizza") - .withFields(name)); + .withClassName("Pizza") + .withFields(name)); Result resultFullText = doGet(get -> get.withWhere(whereFullText) - .withClassName("Pizza") - .withFields(name)); + .withClassName("Pizza") + .withFields(name)); Result resultPartText = doGet(get -> get.withWhere(wherePartText) - .withClassName("Pizza") - .withFields(name)); + .withClassName("Pizza") + .withFields(name)); // then assertWhereResultSize(1, resultFullString, "Pizza"); assertWhereResultSize(0, resultPartString, "Pizza"); @@ -417,8 +438,8 @@ public void shouldSupportDeprecatedValueString() { WhereArgument whereString = whereText("name", Operator.Equal, "Frutti di Mare"); Result result = doGet(get -> get.withWhere(whereString) - .withClassName("Pizza") - .withFields(field("name"))); + .withClassName("Pizza") + .withFields(field("name"))); assertWhereResultSize(1, result, "Pizza"); } @@ -430,69 +451,79 @@ public void testGraphQLGetWithWhereByDate() { WhereArgument whereDate = whereDate("bestBefore", Operator.GreaterThan, cal.getTime()); Result resultDate = doGet(get -> get.withWhere(whereDate) - .withClassName("Pizza") - .withFields(field("name"))); + .withClassName("Pizza") + .withFields(field("name"))); List> result = extractClass(resultDate, "Get", "Pizza"); Assertions.assertThat(result) - .hasSize(3) - .extracting(el -> (String) el.get("name")) - .contains("Frutti di Mare", "Hawaii", "Doener"); + .hasSize(3) + .extracting(el -> (String) el.get("name")) + .contains("Frutti di Mare", "Hawaii", "Doener"); } + /** + * @see https://github.com/weaviate/java-client/pull/456#issuecomment-3270249876 + */ + @Ignore("Regression in Explorer API in v1.33") @Test public void testGraphQLExploreWithCertainty() { - 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 = gql.arguments() - .nearTextMoveParameterBuilder() - .concepts(new String[]{ "Pizza" }) - .force(0.3f) - .build(); + .nearTextMoveParameterBuilder() + .concepts(new String[] { "Pizza" }) + .force(0.3f) + .build(); NearTextMoveParameters moveAwayFrom = gql.arguments() - .nearTextMoveParameterBuilder() - .concepts(new String[]{ "toast", "bread" }) - .force(0.4f) - .build(); + .nearTextMoveParameterBuilder() + .concepts(new String[] { "toast", "bread" }) + .force(0.4f) + .build(); NearTextArgument withNearText = gql.arguments() - .nearTextArgBuilder() - .concepts(concepts) - .certainty(0.40f) - .moveTo(moveTo) - .moveAwayFrom(moveAwayFrom) - .build(); + .nearTextArgBuilder() + .concepts(concepts) + .certainty(0.40f) + .moveTo(moveTo) + .moveAwayFrom(moveAwayFrom) + .build(); Result result = doExplore(explore -> explore.withFields(fields) - .withNearText(withNearText)); + .withNearText(withNearText)); List got = extractQueryResult(result, "Explore"); assertEquals(6, got.size()); } + /** + * @see https://github.com/weaviate/java-client/pull/456#issuecomment-3270249876 + */ + @Ignore("Regression in Explorer API in v1.33") @Test public void testGraphQLExploreWithDistance() { - 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 = gql.arguments() - .nearTextMoveParameterBuilder() - .concepts(new String[]{ "Pizza" }) - .force(0.3f) - .build(); + .nearTextMoveParameterBuilder() + .concepts(new String[] { "Pizza" }) + .force(0.3f) + .build(); NearTextMoveParameters moveAwayFrom = gql.arguments() - .nearTextMoveParameterBuilder() - .concepts(new String[]{ "toast", "bread" }) - .force(0.4f) - .build(); + .nearTextMoveParameterBuilder() + .concepts(new String[] { "toast", "bread" }) + .force(0.4f) + .build(); NearTextArgument withNearText = gql.arguments() - .nearTextArgBuilder() - .concepts(concepts) - .distance(0.80f) - .moveTo(moveTo) - .moveAwayFrom(moveAwayFrom) - .build(); + .nearTextArgBuilder() + .concepts(concepts) + .distance(0.80f) + .moveTo(moveTo) + .moveAwayFrom(moveAwayFrom) + .build(); Result result = doExplore(explore -> explore.withFields(fields) - .withNearText(withNearText)); + .withNearText(withNearText)); List got = extractQueryResult(result, "Explore"); assertEquals(6, got.size()); @@ -501,7 +532,7 @@ public void testGraphQLExploreWithDistance() { @Test public void testGraphQLAggregate() { Result result = doAggregate(aggregate -> aggregate.withFields(meta("count")) - .withClassName("Pizza")); + .withClassName("Pizza")); assertAggregateMetaCount(result, "Pizza", 1, 4.0d); } @@ -510,26 +541,26 @@ public void testGraphQLAggregate() { public void testGraphQLAggregateWithWhereFilter() { 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(); + .className("Pizza") + .id(newObjID) + .properties(new HashMap() { + { + put("name", "JustPizza"); + put("description", "pizza with id"); + } + }) + .build(); // Insert additional test data Result insert = syncClient.batch() - .objectsBatcher() - .withObjects(pizzaWithID) - .run(); + .objectsBatcher() + .withObjects(pizzaWithID) + .run(); assumeTrue("all test objects inserted successfully", insert.getResult().length == 1); Result result = doAggregate(aggregate -> aggregate.withFields(meta("count")) - .withClassName("Pizza") - .withWhere(whereText("id", Operator.Equal, newObjID))); + .withClassName("Pizza") + .withWhere(whereText("id", Operator.Equal, newObjID))); assertAggregateMetaCount(result, "Pizza", 1, 1.0d); } @@ -539,27 +570,27 @@ public void testGraphQLAggregateWithGroupedByAndWhere() { // given 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(); + .className("Pizza") + .id(newObjID) + .properties(new HashMap() { + { + put("name", "JustPizza"); + put("description", "pizza with id"); + } + }) + .build(); // Insert additional test objects Result insert = syncClient.batch() - .objectsBatcher() - .withObjects(pizzaWithID) - .run(); + .objectsBatcher() + .withObjects(pizzaWithID) + .run(); assumeTrue("all test objects inserted successfully", insert.getResult().length == 1); Result result = doAggregate(aggregate -> aggregate.withFields(meta("count")) - .withClassName("Pizza") - .withGroupBy("name") - .withWhere(whereText("id", Operator.Equal, newObjID))); + .withClassName("Pizza") + .withGroupBy("name") + .withWhere(whereText("id", Operator.Equal, newObjID))); assertAggregateMetaCount(result, "Pizza", 1, 1.0d); } @@ -568,26 +599,26 @@ public void testGraphQLAggregateWithGroupedByAndWhere() { public void testGraphQLAggregateWithGroupedBy() { 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(); + .className("Pizza") + .id(newObjID) + .properties(new HashMap() { + { + put("name", "JustPizza"); + put("description", "pizza with id"); + } + }) + .build(); // Insert additional test data Result insert = syncClient.batch() - .objectsBatcher() - .withObjects(pizzaWithID) - .run(); + .objectsBatcher() + .withObjects(pizzaWithID) + .run(); assumeTrue("all test objects inserted successfully", insert.getResult().length == 1); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withGroupBy("name")); + .withFields(meta("count")) + .withGroupBy("name")); assertAggregateMetaCount(result, "Pizza", 5, 1.0d); } @@ -595,16 +626,16 @@ public void testGraphQLAggregateWithGroupedBy() { @Test public void testGraphQLAggregateWithNearVector() { Result getVector = doGet(get -> get.withClassName("Pizza") - .withFields(_additional("vector"))); + .withFields(_additional("vector"))); Float[] vector = extractVector(getVector, "Get", "Pizza"); NearVectorArgument nearVector = NearVectorArgument.builder() - .certainty(0.7f) - .vector(vector) - .build(); + .certainty(0.7f) + .vector(vector) + .build(); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withNearVector(nearVector)); + .withFields(meta("count")) + .withNearVector(nearVector)); assertAggregateMetaCount(result, "Pizza", 1, 4.0d); } @@ -612,17 +643,17 @@ public void testGraphQLAggregateWithNearVector() { @Test public void testGraphQLAggregateWithNearObjectAndCertainty() { Result getId = doGet(get -> get.withClassName("Pizza") - .withFields(_additional("id"))); + .withFields(_additional("id"))); String id = extractAdditional(getId, "Get", "Pizza", "id"); // when NearObjectArgument nearObject = NearObjectArgument.builder() - .certainty(0.7f) - .id(id) - .build(); + .certainty(0.7f) + .id(id) + .build(); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withNearObject(nearObject)); + .withFields(meta("count")) + .withNearObject(nearObject)); assertAggregateMetaCount(result, "Pizza", 1, 4.0d); } @@ -630,16 +661,16 @@ public void testGraphQLAggregateWithNearObjectAndCertainty() { @Test public void testGraphQLAggregateWithNearObjectAndDistance() { Result getId = doGet(get -> get.withClassName("Pizza") - .withFields(_additional("id"))); + .withFields(_additional("id"))); String id = extractAdditional(getId, "Get", "Pizza", "id"); NearObjectArgument nearObject = NearObjectArgument.builder() - .distance(0.3f) - .id(id) - .build(); + .distance(0.3f) + .id(id) + .build(); Result result = doAggregate(aggregate -> aggregate.withFields(meta("count")) - .withClassName("Pizza") - .withNearObject(nearObject)); + .withClassName("Pizza") + .withNearObject(nearObject)); assertAggregateMetaCount(result, "Pizza", 1, 4.0d); } @@ -647,13 +678,13 @@ public void testGraphQLAggregateWithNearObjectAndDistance() { @Test public void testGraphQLAggregateWithNearTextAndCertainty() { NearTextArgument nearText = NearTextArgument.builder() - .certainty(0.7f) - .concepts(new String[]{ "pizza" }) - .build(); + .certainty(0.7f) + .concepts(new String[] { "pizza" }) + .build(); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withNearText(nearText)); + .withFields(meta("count")) + .withNearText(nearText)); assertAggregateMetaCount(result, "Pizza", 1, 4.0d); } @@ -661,13 +692,13 @@ public void testGraphQLAggregateWithNearTextAndCertainty() { @Test public void testGraphQLAggregateWithNearTextAndDistance() { NearTextArgument nearText = NearTextArgument.builder() - .distance(0.6f) - .concepts(new String[]{ "pizza" }) - .build(); + .distance(0.6f) + .concepts(new String[] { "pizza" }) + .build(); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withNearText(nearText)); + .withFields(meta("count")) + .withNearText(nearText)); assertAggregateMetaCount(result, "Pizza", 1, 4.0d); } @@ -676,14 +707,14 @@ public void testGraphQLAggregateWithNearTextAndDistance() { public void testGraphQLAggregateWithObjectLimitAndCertainty() { int limit = 1; NearTextArgument nearText = NearTextArgument.builder() - .certainty(0.7f) - .concepts(new String[]{ "pizza" }) - .build(); + .certainty(0.7f) + .concepts(new String[] { "pizza" }) + .build(); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withNearText(nearText) - .withObjectLimit(limit)); + .withFields(meta("count")) + .withNearText(nearText) + .withObjectLimit(limit)); assertAggregateMetaCount(result, "Pizza", 1, (double) limit); } @@ -692,14 +723,14 @@ public void testGraphQLAggregateWithObjectLimitAndCertainty() { public void testGraphQLAggregateWithObjectLimitAndDistance() { int limit = 1; NearTextArgument nearText = NearTextArgument.builder() - .distance(0.3f) - .concepts(new String[]{ "pizza" }) - .build(); + .distance(0.3f) + .concepts(new String[] { "pizza" }) + .build(); Result result = doAggregate(aggregate -> aggregate.withClassName("Pizza") - .withFields(meta("count")) - .withNearText(nearText) - .withObjectLimit(limit)); + .withFields(meta("count")) + .withNearText(nearText) + .withObjectLimit(limit)); assertAggregateMetaCount(result, "Pizza", 1, (double) limit); } @@ -707,15 +738,15 @@ public void testGraphQLAggregateWithObjectLimitAndDistance() { @Test public void testGraphQLGetWithGroup() { GroupArgument group = gql.arguments() - .groupArgBuilder() - .type(GroupType.merge) - .force(1.0f) - .build(); + .groupArgBuilder() + .type(GroupType.merge) + .force(1.0f) + .build(); Result result = doGet(get -> get.withClassName("Soup") - .withFields(field("name")) - .withGroup(group) - .withLimit(7)); + .withFields(field("name")) + .withGroup(group) + .withLimit(7)); List soups = extractClass(result, "Get", "Soup"); assertEquals(1, soups.size(), "wrong number of soups"); @@ -724,22 +755,22 @@ public void testGraphQLGetWithGroup() { @Test public void testGraphQLGetWithSort() { SortArgument byNameDesc = sort(SortOrder.desc, "name"); - String[] expectedByNameDesc = new String[]{ "Quattro Formaggi", "Hawaii", "Frutti di Mare", "Doener" }; + String[] expectedByNameDesc = new String[] { "Quattro Formaggi", "Hawaii", "Frutti di Mare", "Doener" }; SortArgument byPriceAsc = sort(SortOrder.asc, "price"); - String[] expectedByPriceAsc = new String[]{ "Hawaii", "Doener", "Quattro Formaggi", "Frutti di Mare" }; + String[] expectedByPriceAsc = new String[] { "Hawaii", "Doener", "Quattro Formaggi", "Frutti di Mare" }; Field name = field("name"); Result resultByNameDesc = doGet(get -> get.withClassName("Pizza") - .withSort(byNameDesc) - .withFields(name)); + .withSort(byNameDesc) + .withFields(name)); Result resultByDescriptionAsc = doGet(get -> get.withClassName("Pizza") - .withSort(byPriceAsc) - .withFields(name)); + .withSort(byPriceAsc) + .withFields(name)); Result resultByNameDescByPriceAsc = doGet(get -> get.withClassName("Pizza") - .withSort(byNameDesc, byPriceAsc) - .withFields(name)); + .withSort(byNameDesc, byPriceAsc) + .withFields(name)); assertObjectNamesEqual(resultByNameDesc, "Get", "Pizza", expectedByNameDesc); assertObjectNamesEqual(resultByDescriptionAsc, "Get", "Pizza", expectedByPriceAsc); @@ -750,17 +781,17 @@ public void testGraphQLGetWithSort() { public void testGraphQLGetWithTimestampFilters() { Field additional = _additional("id", "creationTimeUnix", "lastUpdateTimeUnix"); Result expected = doGet(get -> get.withClassName("Pizza") - .withFields(additional)); + .withFields(additional)); String expectedCreateTime = extractAdditional(expected, "Get", "Pizza", "creationTimeUnix"); String expectedUpdateTime = extractAdditional(expected, "Get", "Pizza", "lastUpdateTimeUnix"); Result createTimeResult = doGet(get -> get.withClassName("Pizza") - .withWhere(whereText("_creationTimeUnix", Operator.Equal, expectedCreateTime)) - .withFields(additional)); + .withWhere(whereText("_creationTimeUnix", Operator.Equal, expectedCreateTime)) + .withFields(additional)); Result updateTimeResult = doGet(get -> get.withClassName("Pizza") - .withWhere(whereText("_lastUpdateTimeUnix", Operator.Equal, expectedCreateTime)) - .withFields(additional)); + .withWhere(whereText("_lastUpdateTimeUnix", Operator.Equal, expectedCreateTime)) + .withFields(additional)); String resultCreateTime = extractAdditional(createTimeResult, "Get", "Pizza", "creationTimeUnix"); assertEquals(expectedCreateTime, resultCreateTime); @@ -772,9 +803,9 @@ public void testGraphQLGetWithTimestampFilters() { @Test public void testGraphQLGetUsingCursorAPI() { Result result = doGet(get -> get.withClassName("Pizza") - .withAfter("00000000-0000-0000-0000-000000000000") - .withLimit(10) - .withFields(field("name"))); + .withAfter("00000000-0000-0000-0000-000000000000") + .withLimit(10) + .withFields(field("name"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(3, pizzas.size(), "wrong number of pizzas"); @@ -783,9 +814,9 @@ public void testGraphQLGetUsingCursorAPI() { @Test public void testGraphQLGetUsingLimitAndOffset() { Result result = doGet(get -> get.withClassName("Pizza") - .withOffset(3) - .withLimit(4) - .withFields(field("name"))); + .withOffset(3) + .withLimit(4) + .withFields(field("name"))); List pizzas = extractClass(result, "Get", "Pizza"); assertEquals(1, pizzas.size(), "wrong number of pizzas"); @@ -793,91 +824,100 @@ public void testGraphQLGetUsingLimitAndOffset() { @Test public void testGraphQLGetWithGroupBy() { - 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(), }; 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(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{ group }) - .build(); + .name("_additional") + .fields(new Field[] { group }) + .build(); Field ofDocument = Field.builder() - .name("ofDocument{__typename}") - .build(); // Property that we group by + .name("ofDocument{__typename}") + .build(); // Property that we group by GroupByArgument groupBy = client.graphQL() - .arguments() - .groupByArgBuilder() - .path(new String[]{ "ofDocument" }) - .groups(3) - .objectsPerGroup(10) - .build(); + .arguments() + .groupByArgBuilder() + .path(new String[] { "ofDocument" }) + .groups(3) + .objectsPerGroup(10) + .build(); NearObjectArgument nearObject = client.graphQL() - .arguments() - .nearObjectArgBuilder() - .id("00000000-0000-0000-0000-000000000001") - .build(); + .arguments() + .nearObjectArgBuilder() + .id("00000000-0000-0000-0000-000000000001") + .build(); passageSchema.createAndInsertData(syncClient); try { Result result = doGet(get -> get.withClassName(passageSchema.PASSAGE) - .withNearObject(nearObject) - .withGroupBy(groupBy) - .withFields(ofDocument, _additional)); + .withNearObject(nearObject) + .withGroupBy(groupBy) + .withFields(ofDocument, _additional)); List> passages = extractClass(result, "Get", passageSchema.PASSAGE); assertEquals(3, passages.size(), "wrong number of passages"); - // This part of assertions is almost verbatim from package io.weaviate.integration.client.graphql.ClientGraphQLTest - // because it involves a lot of inner classes that we don't won't to redefine here. + // This part of assertions is almost verbatim from package + // io.weaviate.integration.client.graphql.ClientGraphQLTest + // because it involves a lot of inner classes that we don't won't to redefine + // here. List groups = getGroups(passages); Assertions.assertThat(groups) - .isNotNull() - .hasSize(3); + .isNotNull() + .hasSize(3); for (int i = 0; i < 3; i++) { Assertions.assertThat(groups.get(i).minDistance) - .isEqualTo(groups.get(i) - .getHits() - .get(0) - .get_additional() - .getDistance()); + .isEqualTo(groups.get(i) + .getHits() + .get(0) + .get_additional() + .getDistance()); Assertions.assertThat(groups.get(i).maxDistance) - .isEqualTo(groups.get(i) - .getHits() - .get(groups.get(i) - .getHits() - .size() - 1) - .get_additional() - .getDistance()); + .isEqualTo(groups.get(i) + .getHits() + .get(groups.get(i) + .getHits() + .size() - 1) + .get_additional() + .getDistance()); } checkGroupElements(expectedHitsA, groups.get(0) - .getHits()); + .getHits()); checkGroupElements(expectedHitsB, groups.get(1) - .getHits()); + .getHits()); } finally { passageSchema.cleanupWeaviate(syncClient); } @@ -885,87 +925,94 @@ public void testGraphQLGetWithGroupBy() { @Test public void testGraphQLGetWithGroupByWithHybrid() { - 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(), }; 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(); Field _additional = Field.builder() - .name("_additional") - .fields(new Field[]{ group }) - .build(); + .name("_additional") + .fields(new Field[] { group }) + .build(); Field content = Field.builder() - .name("content") - .build(); // Property that we group by + .name("content") + .build(); // Property that we group by GroupByArgument groupBy = client.graphQL() - .arguments() - .groupByArgBuilder() - .path(new String[]{ "content" }) - .groups(3) - .objectsPerGroup(10) - .build(); + .arguments() + .groupByArgBuilder() + .path(new String[] { "content" }) + .groups(3) + .objectsPerGroup(10) + .build(); NearTextArgument nearText = NearTextArgument.builder() - .concepts(new String[]{ "Passage content 2" }) - .build(); + .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(); passageSchema.createAndInsertData(syncClient); try { Result groupByResult = doGet(get -> get.withClassName(passageSchema.PASSAGE) - .withHybrid(hybrid) - .withGroupBy(groupBy) - .withFields(content, _additional)); + .withHybrid(hybrid) + .withGroupBy(groupBy) + .withFields(content, _additional)); List> result = extractClass(groupByResult, "Get", passageSchema.PASSAGE); Assertions.assertThat(result) - .isNotNull() - .hasSize(3); + .isNotNull() + .hasSize(3); List groups = getGroups(result); Assertions.assertThat(groups) - .isNotNull() - .hasSize(3); + .isNotNull() + .hasSize(3); for (int i = 0; i < 3; i++) { if (i == 0) { Assertions.assertThat(groups.get(i).groupedBy.value) - .isEqualTo("Passage content 2"); + .isEqualTo("Passage content 2"); } Assertions.assertThat(groups.get(i).minDistance) - .isEqualTo(groups.get(i) - .getHits() - .get(0) - .get_additional() - .getDistance()); + .isEqualTo(groups.get(i) + .getHits() + .get(0) + .get_additional() + .getDistance()); Assertions.assertThat(groups.get(i).maxDistance) - .isEqualTo(groups.get(i) - .getHits() - .get(groups.get(i) - .getHits() - .size() - 1) - .get_additional() - .getDistance()); + .isEqualTo(groups.get(i) + .getHits() + .get(groups.get(i) + .getHits() + .size() - 1) + .get_additional() + .getDistance()); } } finally { passageSchema.cleanupWeaviate(syncClient); @@ -976,45 +1023,46 @@ public void testGraphQLGetWithGroupByWithHybrid() { 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 = syncClient.schema() - .classCreator() - .withClass(clazz) - .run(); + .classCreator() + .withClass(clazz) + .run(); Assertions.assertThat(createStatus) - .isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + .isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); Result objectStatus = syncClient.data() - .creator() - .withClassName(className) - .withID(id) - .withProperties(properties) - .run(); + .creator() + .withClassName(className) + .withID(id) + .withProperties(properties) + .run(); Assertions.assertThat(objectStatus) - .isNotNull() - .returns(false, Result::hasErrors) - .extracting(Result::getResult) - .isNotNull(); + .isNotNull() + .returns(false, Result::hasErrors) + .extracting(Result::getResult) + .isNotNull(); Field fieldId = _additional("id"); WhereArgument whereUuid = whereText("uuidProp", Operator.Equal, "7aaa79d3-a564-45db-8fa8-c49e20b8a39a"); @@ -1022,26 +1070,26 @@ public void shouldSupportSearchByUUID() { WhereArgument whereUuidArray2 = whereText("uuidArrayProp", Operator.Equal, "9e516f40-fd54-4083-a476-f4675b2b5f92"); Result resultUuid = doGet(get -> get.withWhere(whereUuid) - .withClassName(className) - .withFields(fieldId)); + .withClassName(className) + .withFields(fieldId)); Result resultUuidArray1 = doGet(get -> get.withWhere(whereUuidArray1) - .withClassName(className) - .withFields(fieldId)); + .withClassName(className) + .withFields(fieldId)); Result resultUuidArray2 = doGet(get -> get.withWhere(whereUuidArray2) - .withClassName(className) - .withFields(fieldId)); + .withClassName(className) + .withFields(fieldId)); - 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 = syncClient.schema() - .allDeleter() - .run(); + .allDeleter() + .run(); Assertions.assertThat(deleteStatus) - .isNotNull() - .returns(false, Result::hasErrors) - .returns(true, Result::getResult); + .isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); } private Result doGet(Consumer build) { @@ -1049,7 +1097,7 @@ private Result doGet(Consumer build) { build.accept(get); try { return get.run() - .get(); + .get(); } catch (InterruptedException | ExecutionException e) { fail("graphQL.get(): " + e.getMessage()); return null; @@ -1061,7 +1109,7 @@ private Result doRaw(Consumer build) { build.accept(raw); try { return raw.run() - .get(); + .get(); } catch (InterruptedException | ExecutionException e) { fail("graphQL.raw(): " + e.getMessage()); return null; @@ -1073,7 +1121,7 @@ private Result doExplore(Consumer build) { build.accept(explore); try { return explore.run() - .get(); + .get(); } catch (InterruptedException | ExecutionException e) { fail("graphQL.explore(): " + e.getMessage()); return null; @@ -1085,7 +1133,7 @@ private Result doAggregate(Consumer build) { build.accept(aggregate); try { return aggregate.run() - .get(); + .get(); } catch (InterruptedException | ExecutionException e) { fail("graphQL.aggregate(): " + e.getMessage()); return null; @@ -1094,10 +1142,10 @@ private Result doAggregate(Consumer build) { private SortArgument sort(SortOrder ord, String... properties) { return gql.arguments() - .sortArgBuilder() - .path(properties) - .order(ord) - .build(); + .sortArgBuilder() + .path(properties) + .order(ord) + .build(); } private void assertWhereResultSize(int expectedSize, Result result, String className) { @@ -1105,9 +1153,9 @@ private void assertWhereResultSize(int expectedSize, Result res assertEquals(expectedSize, getClass.size()); } - @SuppressWarnings("unchecked") - private T extractAdditional(Result result, String queryType, String className, String fieldName) { + private T extractAdditional(Result result, String queryType, String className, + String fieldName) { List objects = extractClass(result, queryType, className); Map> firstObject = (Map>) objects.get(0); @@ -1121,13 +1169,14 @@ private Float[] extractVector(Result result, String queryType, Float[] out = new Float[vector.size()]; for (int i = 0; i < vector.size(); i++) { out[i] = vector.get(i) - .floatValue(); + .floatValue(); } return out; } @SuppressWarnings("unchecked") - private void assertAggregateMetaCount(Result result, String className, int wantObjects, Double wantCount) { + private void assertAggregateMetaCount(Result result, String className, int wantObjects, + Double wantCount) { List objects = extractClass(result, "Aggregate", className); assertEquals(wantObjects, objects.size(), "wrong number of objects"); @@ -1136,12 +1185,13 @@ private void assertAggregateMetaCount(Result result, String cla assertEquals(wantCount, meta.get("count"), "wrong meta:count"); } - private void assertObjectNamesEqual(Result result, String queryType, String className, String[] want) { + private void assertObjectNamesEqual(Result result, String queryType, String className, + String[] want) { List> objects = extractClass(result, queryType, className); assertEquals(want.length, objects.size()); for (int i = 0; i < want.length; i++) { assertEquals(want[i], objects.get(i) - .get("name"), String.format("%s[%d] has wrong name", className.toLowerCase(), i)); + .get("name"), String.format("%s[%d] has wrong name", className.toLowerCase(), i)); } } } 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 34ecbe995..4d57d46fa 100644 --- a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLTest.java +++ b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLTest.java @@ -880,6 +880,10 @@ public void testGraphQLGetWithWhereByDate() { .contains("Frutti di Mare", "Hawaii", "Doener"); } + /** + * @see https://github.com/weaviate/java-client/pull/456#issuecomment-3270249876 + */ + @Ignore("Regression in Explorer API in v1.33") @Test public void testGraphQLExploreWithCertainty() { // given @@ -916,6 +920,10 @@ public void testGraphQLExploreWithCertainty() { assertEquals(6, get.size()); } + /** + * @see https://github.com/weaviate/java-client/pull/456#issuecomment-3270249876 + */ + @Ignore("Regression in Explorer API in v1.33") @Test public void testGraphQLExploreWithDistance() { // given