From 75b3883f348d8a638f5611ba845ffc7929208b86 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Wed, 24 Sep 2025 14:47:53 +0200 Subject: [PATCH 01/13] chore: add generic parameter to List instanceof check --- .../client6/v1/api/collections/data/InsertManyRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java b/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java index c8a12fa0..717b01c4 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java @@ -147,7 +147,7 @@ public static void buildObject(WeaviateProtoBatch.BatchObject.Builder object protoValue.setBoolValue(v.booleanValue()); } else if (value instanceof Number v) { protoValue.setNumberValue(v.doubleValue()); - } else if (value instanceof List v) { + } else if (value instanceof List v) { protoValue.setListValue( com.google.protobuf.ListValue.newBuilder() .addAllValues(v.stream() From 09d74d7c45c84f7cb046387e0ae5d78f4e2b154c Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Wed, 24 Sep 2025 20:22:11 +0200 Subject: [PATCH 02/13] feat: add overloaded .delete and .exists methods that accept a class --- .../WeaviateCollectionsClient.java | 28 +++++++++++++++++++ .../WeaviateCollectionsClientAsync.java | 18 ++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClient.java index 2bcb3071..b662dbd6 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClient.java @@ -224,6 +224,20 @@ public void delete(String collectionName) throws IOException { this.restTransport.performRequest(new DeleteCollectionRequest(collectionName), DeleteCollectionRequest._ENDPOINT); } + /** + * Delete a Weaviate collection. + * + * @param cls Class that represents an object in the collection. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ + public void delete(Class cls) throws IOException { + delete(CollectionDescriptor.ofClass(cls).collectionName()); + } + /** * Delete all collections in Weaviate. * @@ -252,4 +266,18 @@ public void deleteAll() throws IOException { public boolean exists(String collectionName) throws IOException { return getConfig(collectionName).isPresent(); } + + /** + * Check if a collection with this name exists. + * + * @param cls Class that represents an object in the collection. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ + public boolean exists(Class cls) throws IOException { + return exists(CollectionDescriptor.ofClass(cls).collectionName()); + } } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClientAsync.java b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClientAsync.java index e7e4755b..8f5c3516 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClientAsync.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateCollectionsClientAsync.java @@ -173,6 +173,15 @@ public CompletableFuture delete(String collectionName) { DeleteCollectionRequest._ENDPOINT); } + /** + * Delete a Weaviate collection. + * + * @param cls Class that represents an object in the collection. + */ + public CompletableFuture delete(Class cls) { + return delete(CollectionDescriptor.ofClass(cls).collectionName()); + } + /** * Delete all collections in Weaviate. */ @@ -193,4 +202,13 @@ public CompletableFuture deleteAll() throws IOException { public CompletableFuture exists(String collectionName) { return getConfig(collectionName).thenApply(Optional::isPresent); } + + /** + * Check if a collection with this name exists. + * + * @param cls Class that represents an object in the collection. + */ + public CompletableFuture exists(Class cls) { + return exists(CollectionDescriptor.ofClass(cls).collectionName()); + } } From cd6fe51915cac98acac70ad207b54e8455956206 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Wed, 24 Sep 2025 16:08:51 +0200 Subject: [PATCH 03/13] docs: add code examples to README - Connecting to Weaviate - Collection management - Data operations - Querying - ORM - Collection alias --- README.md | 467 ++++++++++++++++++ .../data/InsertObjectResponse.java | 14 - .../collections/query/BaseQueryOptions.java | 9 +- 3 files changed, 474 insertions(+), 16 deletions(-) delete mode 100644 src/main/java/io/weaviate/client6/v1/api/collections/data/InsertObjectResponse.java diff --git a/README.md b/README.md index de294fc2..605912ca 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ Official Weaviate Java Client. +> [!IMPORTANT] +> `client6` does not support many of the legacy features supported in other clients. Ensure your instance is running at least v1.32 to avoid compatibility issues. + ## Usage To start using Weaviate Java Client add the dependency to `pom.xml`: @@ -67,6 +70,470 @@ applicationDefaultJvmArgs += listOf( ) ``` +## Supported APIs + +### Tucked Builder + +Tucked Builder is an iteration of the Builder pattern that reduces boilerplate and leverages static typing and autocompletion to help API discovery. +It is well-worth getting familiar with Tucked Builders before diving into the next sections, as the library makes intensive use of this pattern across its API surface. + +If you've worked with Elasticserch Java API Client before, you'll recognize this pattern as [Builder lamba expressions](https://www.elastic.co/docs/reference/elasticsearch/clients/java/api-conventions/building-objects#_builder_lambda_expressions). + +Most operations in Weaviate have multiple optional parameters and Builder patter is a common way to implement that. For example, here's what a nearVector query _could_ look like: + +```java +import io.weaviate.client6.v1.api.collections.query.Hybrid; +import io.weaviate.client6.v1.api.collections.query.NearText; +import io.weaviate.client6.v1.api.collections.query.NearText.Move; + +Move moveTo = Move.builder() + .force(.5f) + .concepts("lullaby") + .build(); +NearText nearText = NearText.builder() + .concepts("sunshine", "butterflies") + .distance(.4f) + .moveTo(moveTo) + .build(); +Hybrid hybridQuery = Hybrid.builder() + .concepts("rainbow") + .nearText(nearText) + .queryProperties("title", "lyrics") + .returnProperties("album", "author") + .build(); + +songs.query.hybrid(hybridQuery); +``` + +The Tucked Builder pattern replaces repetitive `.builder() [...] .build()` with a **lambda expression** which accepts the pre-instantiated builder object as its only argument. +If that's a mouthful, take a look at what the query above looks like in `client6`. After all, seeing is believing: + +```java +import io.weaviate.client6.v1.api.collections.query.NearText; + +songs.query.hybrid( + "rainbow", + /* Hybrid.Builder */ h -> h + .nearText(NearText.of( + List.of("sunshine", "butterflies"), + /* NearText.Builder */ nt -> nt + .distance(.4f) + .moveTo(.5f, /* NearText.Move.Builder */ to -> to.concepts("lullaby")) + ) + .queryProperties("title", "lyrics") + .returnProperties("album", "author") +); +``` + +Notice how the type of each lambda argument can be automatically deduced from the methods' signatures. This allows the autocomplete to correctly suggest possible arguments, guiding you through the query API.The builder itself is "tucked" in the method's internals, so you needn't remember how to access or import it. What's more, the code reads a lot more like a query thanks to improved [locality](https://htmx.org/essays/locality-of-behaviour/). As you'll see in the examples below, you can also get creative with naming the lambda argument to act as hint for future readers. + +In real-world programs there will be cases where you need to inject some control-flow statements in the query builder code. Consider an example of limiting the number of query results based on some external value, such as a URL query paramter. Lambda expressions are fully-fledged functions, so you could add a if-statement right in the middle of it: + +```java +songs.query.hybrid("rainbow", h -> { + if (limitURL != null) { + h.limit(limitURL); + } + return h; +}); +``` + +This may get out of hand quickly if complex logic is involved. Or you may simply prefer the standard Builder pattern. Whichever's the case, `client6` has got you covered, as "tucked" builders are public members of the classes they build, and can be used directly: + +```java +Hybrid.Builder builder = new Hybrid.Builder("rainbow"); +if (limitURL != null) { + builder.limit(limitURL) +} + +// more complex steps... + +songs.query.hybrid(/* Hybrid */ builder.build()); +``` + +Finally, if you need to separate "query definition" from "performing the query", most objects provide two static factories: one with required arguments and one with required aruments and a tucked builder. + +```java +Hybrid requiredOnly = Hybrid.of("rainbow"); +Hybrid withOptional = Hybrid.of("rainbow", opt -> opt.limit(10)); + +songs.query.hybrid(withOptional); +``` + +### Connecting to a Weaviate instance + +```java +WeaviateClient client = WeaviateClient.connectToCustom( + conn -> conn + .scheme("http") + .httpPort(8080).httpHost("localhost") + .grpcPort(50051).grpcHost("localhost") + .setHeader("X-Custom-Header", "Readme") +); +``` + +Shorthand methods for connecting to a local instance and a Weaviate Cloud cluster are available too: + +```java +// Defaults to scheme=http, host=localhost, port=8080, grpcHost=locahost, grpcPort=50051 +WeaviateClient local = WeaviateClient.connectToLocal(local -> local.port(9090)); + +// Always uses httpPort=443, grpcPort=443, httpHost == gprcHost == , and API Key authentication +WeaviateClient wcd = WeaviateClient.connectToWeaviateCloud("my-cluster-url.io", "my-api-key"); +``` + +The client holds a number of resources (HTTP connection pools, gRPC channel) which must be disposed of correclty then they are no longer needed. +If the client's lifecycle is tied to that of your app, closing the client via `client.close()` is a good way to do that. + +Otherwise, it is a good idea to use the client inside a [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) statement: + +```java +try (final var client = new WeaviateClient(config)) { + // Do something with the client +} +``` +WeaviateClient will be automatically closed when execution exits the block. + +#### Authentication + +Weaviate supports several authentication methods: + +| Method | Client API reference | +| ------- | ------------------------------------------------------------------------------- | +| API Key | `Authentication.apiKey("my-api-key")` | +| Resource owner password | `Authentication.resourceOwnerPassword("username", "password")` | +| Client credentials | `Authentication.clientCredentials("clientKey", "clientSecret")` | +| Existing bearer token | `Authentication.apiKey("access-token", "refresh-token", 900)` | + +Follow the [documentation](https://docs.weaviate.io/deploy/configuration/authentication) for a detailed discussion. + +### Collection management + +```java +client.collections.create( + "Songs", + collection -> collection + .properties( + Property.text("title"), + Property.text("lyrics", p -> p.tokenization(Tokenization.WORD)), + Property.integer("yearReleased"), + Property.blob("albumCover"), + Property.bool("isSingle") + ) + .references( + ReferenceProperty.to("hasAwards", "GrammyAwards", "BillboardMusicAwards") + ) + .vectorConfig( + VectorConfig.text2vecWeaviate("title_vec", t2v -> t2v.sourceProperties("title")), + VectorConfig.text2vecWeaviate("lyrics_vec", t2v -> t2v.sourceProperties("lyrics")), + VectorConfig.img2vecNeural("cover_vec", i2v -> i2v.imageFields("albumCover")) + ) +); + +assert client.collections.exists("Songs"); + +client.collections.delete("Songs"); +assert !client.collections.exists("Songs"); +``` + +Other methods in `collections` namespace include: + +- `getConfig(String collection)` to fetch collection configuration; +- `list()` to fetch collection configurations for all existing collections +- `deleteAll()` to drop all collections and their data + +#### Using a Collection Handle + +Once a collection is created, you can obtain another client object (a "handle") that's scoped to that collection. + +```java +CollectionHandle> songs = client.collections.use("Songs"); +``` + +Using the handle, we can ingest new data into the collection and query it, as well as modify the configuration. +The handle object is thread safe and, although lightweight, is best created once and shared across threads / callers. + +```java +// Bad: creates a new CollectionHandle object for each iteration, strains the GC unnecessarily. +for (var song : mySongs) { + client.collections.use("Songs").data.insert(song); +} + +// Good: the same CollectionHandle is reused across multiple iterations / processes. +var songs = client.collections.use("Songs"); +Thread.run(() -> rapSongs.forEach(song -> songs.data.insert(song))); +Thread.run(() -> popSongs.forEach(song -> songs.data.insert(song))); +``` + +For the rest of the document, assume `songs` is handle for the "Songs" collection defined elsewhere. + +#### Generic `PropertiesT` + +Weaviate client lets you insert object properties in different "shapes". The compile-time type in which the properties must be passed is determied by a generic paramter in CollectionHandle object. +By defalt, the value for this parameter is `Map`. That allows you to think of your data as JSON objects with some additional metadata (vector embedding, UUID, certainty score, etc.). + +In practice this means that whenever data needs to be inserted, you need to pass an instance of `Map` and whenever it is queried, the properties are deserialized into a `Map`. +If you prefer stricter typing, you can leverage our built-in ORM to work with properties as custom Java types. We will return to this in the **ORM** section later. Assume for now that properties are being passed around as an "untyped" map. + +### Ingesting data + +Data operations are concentrated behind the `.data` namespace. + +#### Insert single object + +```java +var yellowSubmarine = songs.data.insert(Map.of("title", "Yellow Submarine", "lyrics", "...", "year", 1969); +System.out.println("Inserted new song at "+ yellowSubmarine.metadata().createdAt()); +System.out.println("Yellow Submarine uuid="+ yellowSubmarine.uuid()); +``` + +You can supply your own UUID and vector embedding: + +```java +songs.data.insert(Map.of(...), obj -> obj.uuid("valid-custom-uuid").vectors(Vectors.of("title_vec", new float[]{...}))); +``` + +Weaviate supports 1-dimensional and multi-dimensional vector embeddings, thanks to ColBERT-family modules. The associated vector can be `float[] | float[][]`. +Because Java does not support unions of primitive types, we define an abstraction called `Vectors` which is a container type for object's vector embeddings. + +Creating a new vector object is simple: + +- `Vectors.of(new float[]{...})`: default 1-d vector +- `Vectors.of("custom_1d", new float[]{...})`: 1-d vector with a custom name +- `Vectors.of(new float[][]{...})`: default 2-d vector +- `Vectors.of("custom_2d", new float[][]{...})`: 2-d vector with a custom name +- `Vectors.of(Vectors.of(...), Vectors.of(...))`: Multiple vectors, all must define a custom name + +Here's how you can retrieve the actual vector associated with the object: + +```java +Vectors vectors = yellowSubmarine.vectors(); +float[] v = vectors.getDefaultSingle(); // default 1-dimensional vector +float[] v = vectors.getSingle("custom_1d"); // 1-d vector with a custom name +float[][] v = vectors.getDefaultMulti(); // default 2-dimensional vector +float[][] v = vectors.getMulti("custom_2d"); // 2-d vector with a custom name +``` + +#### Batch insert + +> [!NOTE] +> Support for Dynamic Batching in `client6` will be added once Server-Side Batching becomes GA in Weaviate (est. v1.34) + +```java +InsertManyResponse response = songs.data.insertMany( + Map.of("title", "High-Speed Dirt", "artist", "Megadeth"), + Map.of("title", "Rattlehead", "artist", "Megadeth") +); + +if (!response.errors().isEmpty()) { + throw new RuntimeException(String.join(", ", response.errors())); +} +System.out.println("Inserted %d objects, took: %.2fs".formatted(response.reponses().size(), response.took())); +``` + +To supply your own UUID and vector embedding when inserting multiple objects wrap each obejct in `WeaviateObject.of(...)`: + +```java +songs.data.insertMany( + WeaviateObject.of(map1, obj -> obj.uuid(uuid1)), + WeaviateObject.of(map2, obj -> obj.uuid(uuid2)) +) +``` + +### Querying data + +Query methods are concentrated behind the `.query` namespace. + +By default, _all object properties_ and its UUID are included in the response. To select a subset of properties, pass their names to `.returnProperties(...)` method on the tucked builder. Retrieve additional metadata (where relevant) like so: + +```java +// Distance and Certainty are only relevant to semantic search +q -> q.returnMetadata(Metadata.VECTOR, Metadata.DISTANCE, Metadata.CERTAINTY) + +// Score and Explain Score are only relevant to BM25 and hybrid queries +q -> q.returnMetadata(Metadata.SCORE, Metadata.EXPLAIN_SCORE) +``` + +#### Semantic search + +```java +songs.query.nearVector(new float[]{...}, nv -> nv.distance(.3f)); +songs.query.nearText("a song about weather", nt -> nt.moveAway(.6f, from -> from.concepts("summertime"))); +songs.query.nearObject(yellowSubmarine.uuid(), nobj -> nobj.excludeSelf()); +songs.query.nearImage("base64-encoded-image"); +// Other "near-media" methods available: nearVideo, nearAudio, nearDepth, nearImu, nearThermal +``` + +> [!TIP] +> The first object returned in a NearObject query will _always_ be the search object itself. To filter it out, use the `.excludeSelf()` helper as in the example above. + +#### Keyword and Hybrid search + +```java +songs.query.bm25("rain", bm25 -> bm25.queryProeperties("lyrics")); + +songs.query.hybrid( + "rain", + h -> h + .queryProperties("lyrics") + .nearVector(NearVector.of(new float[]{...})) +); +``` + +#### Filtering + +Objects can be filtered by property or reference values. In the latter case you need to pass the "path" to the property in the referenced collection. + +```java +.where(Where.property("year").gte(1969)) +.where(Where.reference("hasAwards", "GrammyAwards", "category").eq("New Artist")) +``` + +Supported **comparison operators**: + +- Equal: `.eq` +- NotEqual: `.ne` +- LessThan: `.lt` +- LessThanEqual: `.lte` +- GreaterThan: `.gt` +- GreaterThanEqual: `.gte` +- Like: `.like` +- ContainsAll: `.containsAll` +- ContainsAny: `.containsAny` +- WithinGeoRange: `.withinGeoRange` + +Comparison operators can be grouped using **logical operators** with arbitrarily deep nesting. + +```java +.where( + Where.or( + Where.and( + Where.property("year").gt(2000), + Where.property("year").lt(2017) + ), + Where.or( + Where.property("artist").like("Boys"), + Where.property("genres").containsAny("#rock", "#rocknroll", "#grunge") + ) + ) +) +``` + +Operators passed in subsequent calls to `.where` are concatenated with the `.and` operartor. +These 3 calls are equivalent: + +```java +q -> q.where(Where.and(cond1, cond2)) +q -> q.where(cond1, cond2) +q -> q.where(cond1).where(cond2) +``` + +Passing `null` and and empty `Where[]` to any of the logical operators as well as to the `.where()` method is safe -- the empty operators will simply be ignored. + +#### Grouping results + +Every query above has an overloaded variant that accepts a group-by clause. + +```java +songs.query.nearVector(new float[]{...}, GroupBy.property("artist")); // Required arguments + GroupBy +songs.query.bm25("rain", bm25 -> bm25.queryProperties("lyrics"), GroupBy.property("artist")); // Required argument, optional parameters, GroupBy +``` + +The shape of the response object is different too, see [`QueryResponseGrouped`](./src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java). + +### Pagination + +TODO + +### Aggregating data + +TODO + +### Error handling + +TODO + +### ORM + +Weaviate client comes with a minimal ORM, which lets you serialize and deserialize object properties into Java **records**. Moreover, the client can create a collection based on the record's declared fields. +The "Songs" collection that we've been working with so far may look somethins like this: + + +```java +import io.weaviate.client6.v1.api.collections.annotations.Collection; +import io.weaviate.client6.v1.api.collections.annotations.Property; + +@Collection("Songs", description = "Global media library") +record Song( + String title, + String lyrics, + @Property("artist") String singer, + int year, + String[] genres +) {} +``` + +By default, the class and field names map to the collection and property names respectively. The `@Collection` and `@Property` annotations can be used to override those defaults. +To create the collection, pass the class definition to `.create`. + +```java +client.collections.create( + Song.class, + collection -> collection + .references(...) + .vectorConfig(...); +``` + +Ingestion and search work the same way, but will accept / return `Song.class` instances instead of `Map`. + +```java +Song trust = new Song("Bad", "...", "Michael Jackson", 1987, ...); +Song badGuy = new Song("Bad Guy", "...", "Billie Eilish", 2019, ...); +Song crown = new Song("You Should See Me in a Crown", "...", "Billie Eilish", 2019, ...); + +songs.data.insert(trust); +songs.data.insertMany(badGuy, crown); + +var result = songs.query.bm25("bad", opt -> opt.queryProperties("lyrics").returnProperties("artist")); + +for (var song : result.objects()) { + System.out.println(song.properties().artist()); +} +``` + +We want to stress that this ORM's focus is on improving type-safety around object properties and simplifying de-/serialization. The ORM is intentionally kept minimal and as such has the following limitations: + +- **Does not support BLOB properties.** On the wire, blob properties are represented as base64-encoded strings, and both logically map to the Java's `String`. Presently there isn't a good way for the client to deduce which property type should be created, so it always maps `Sting -> TEXT`. +- **Limited configuration options.** Vector indices, replication, multi-tenancy, and such need to be configured via a tucked builder in `.create(..., here -> here)`. +- **Does not support cross-references.** Properties and Cross-References are conceptually and "physically" separated in Weaviate' client libraries, so doing something like in the snippet below is not supported. + +```java +record Artist(String firstName, String lastName, int age) {}; + +record Song(String title, Artist artist) {}; + +var song1 = songs.query.byId(uuid1, song -> song.returnReferences(QueryReference.single("artist"))); +System.out.println("Artist's last name is: " + song1.properties().artist().lastName()); +``` + +Instead you'd work with cross-references same way as without the ORM: + +```java +System.out.println("Artist's last name is: " + song1.references().get("artist").properties().get("lastName")); +``` + +Some of these features may be added in future releases. + +### Collection alias + +```java +client.collections.alias("RapSongs", "Songs_Alias"); +client.collections.list(only -> only.collection("RapSongs")); +client.collections.get("Songs_Alias"); +client.collections.update("Songs_Alias", "PopSongs"); +client.collections.delete("Songs_Alias"); +``` + ## Useful resources - [Documentation](https://weaviate.io/developers/weaviate/current/client-libraries/java.html). diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertObjectResponse.java b/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertObjectResponse.java deleted file mode 100644 index c3eb95f2..00000000 --- a/src/main/java/io/weaviate/client6/v1/api/collections/data/InsertObjectResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.weaviate.client6.v1.api.collections.data; - -import com.google.gson.annotations.SerializedName; - -import io.weaviate.client6.v1.api.collections.Vectors; - -public record InsertObjectResponse( - @SerializedName("class") String collectionName, - @SerializedName("properties") T properties, - @SerializedName("id") String uuid, - @SerializedName("vectors") Vectors vectors, - @SerializedName("creationTimeUnix") Long createdAt, - @SerializedName("lastUpdateTimeUnix") Long lastUpdatedAt) { -} diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java index ad8d71b2..b3725923 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java @@ -82,14 +82,19 @@ public final SELF consistencyLevel(ConsistencyLevel consistencyLevel) { * {@code gte}, {@code like}, etc. * Subsequent calls to {@link #where} aggregate with an AND operator. * - *

- * See: {@link Where} + * @see Where */ public final SELF where(Where where) { this.where = this.where == null ? where : Where.and(this.where, where); return (SELF) this; } + /** Combine several conditions using with an AND operator. */ + public final SELF where(Where... wheres) { + Arrays.stream(wheres).map(this::where); + return (SELF) this; + } + public final SELF returnProperties(String... properties) { return returnProperties(Arrays.asList(properties)); } From c16c29c8d7c464938b89ebca64bf33ba0b0884b9 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Thu, 25 Sep 2025 11:33:44 +0200 Subject: [PATCH 04/13] docs: add section on Error Handling --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 605912ca..396b2bca 100644 --- a/README.md +++ b/README.md @@ -451,7 +451,25 @@ TODO ### Error handling -TODO +The client throws exceptions extending `WeaviateException`, which can be used as a catch-all case for any package-related exceptions. Other exception types, such as `IOException` which may be thrown by the underlying HTTP / gRPC libraries are allowed to propagate, as they usually signal different kinds of errors: malformed URL, network problems, etc. + +`WeaviateException` is an **unchecked exception**. + +```java +try (final var client = WeaviateClient.connectToLocal()) { + // Make some requests +} catch (WeaviateException | IOException e) { + e.printStackTrace(); +} +``` + +Concrete exception types: + +- `WeaviateApiException` - Bad request. +- `PaginationException` - Wrapper exception with pagination details (page size, last cursor UUID) +- `WeaviateConnectException` - Weaviate instance not available, failed to connect. +- `WeaviateOAuthException` - Error during OAuth credentials exchange. +- `WeaviateTransportException` - Internal transport layer exception. ### ORM From 48859fd93739771f319870434d35a0c093a5865c Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Thu, 25 Sep 2025 14:39:13 +0200 Subject: [PATCH 05/13] docs: document Pagination and Aggregation --- README.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 396b2bca..cf931f79 100644 --- a/README.md +++ b/README.md @@ -443,11 +443,89 @@ The shape of the response object is different too, see [`QueryResponseGrouped`]( ### Pagination -TODO +Paginating a Weaviate collection is straighforward and the API should is instantly familiar. `CursorSpliterator` powers 2 patterns for iterating over objects: +- the default Paginator object returned by `collection.paginate()` implements Iterable that can be used in a traditional for-loop +- `.stream()` presents the internal Spliterator via an idiomatic Stream API + +```java +var allSongs = songs.paginate(); + +for (WeaviateObject song : allSongs) { + // Traditional for-loop +} + +// Stream API +var allSongUUIDs = allSongs.stream().map(WeaviateObject::uuid).toList(); +``` + +Paginator can be configured to return a subset of properties / metadata fields, use a different page size (defaults to 100) or resume iteration from an arbitrary object. + +```java +// Create a paginator +var allSongs = things.paginate( + p -> p + .pageSize(10) + .resumeFrom("uuid-3") + .returnProperties("artist", "album") + .returnMetadata(Metadata.VECTOR)); + +// Process data +allSongs.stream().toList(); +``` ### Aggregating data -TODO +```java +songs.aggregate.overAll( + with -> with + .metrics( + Aggregate.integer("year", calc -> calc.min().max().median()), + Aggregate.text("album", calc -> calc.topOccurrences().topOccurencesCutoff(5)), + Aggregate.bool("isSingle", calc -> calc.percentageTrue().totalFalse()), + Aggregate.number("monthlyListeners", calc -> calc.mode().count()) + ) + .includeTotalCount(true) +) +``` + +#### Filtered aggregations + +To perform aggregations over query results, use one of the other method under the `aggregate` namespace: it has the same set of methods as the `query` namespace, with the exception of `.bm25(...)`, which cannot be used as an aggregation filter. + +```java +songs.aggregate.hybrid( + "summer of love", + hybrid -> hybrid + .queryProperties("title", "lyrics") + .nearVector(NearVector.of( + new float[]{...}, + nv -> nv.certainty(.7f) + ) + .alpha(.3f), + aggregate -> aggregate + .metrics( + Aggregate.text("artist", calc -> calc.topOccurrences()) + ) +); +``` + +Similartly, an overload with another parameter for a group-by clause is available: + +```java +songs.aggregate.nearObject( + yellowSubmarine.uuid(), + nearObject -> nearObject.excludeSelf(), + aggregate -> aggregate.metrics( + Aggregate.text("album", calc -> calc.topOccurrences()) + ), + GroupBy.property("year") +); +``` + +#### Counting collection objects + +To query the total object count in a collection use `songs.size()` shorthand. + ### Error handling From 52d978588edf3dba8a6838b9cbc9363a252b2fdb Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Thu, 25 Sep 2025 18:32:19 +0200 Subject: [PATCH 06/13] docs: write Javadoc for query, tenant, and collections namespace --- README.md | 4 +- .../client6/v1/api/WeaviateApiException.java | 16 +- .../v1/api/collections/CollectionConfig.java | 49 ++ .../v1/api/collections/CollectionHandle.java | 39 +- .../collections/CollectionHandleAsync.java | 8 + .../collections/CollectionHandleDefaults.java | 1 + .../client6/v1/api/collections/DataType.java | 11 + .../v1/api/collections/Generative.java | 6 + .../v1/api/collections/InvertedIndex.java | 58 +- .../v1/api/collections/MultiTenancy.java | 6 + .../v1/api/collections/Quantization.java | 25 + .../v1/api/collections/ReferenceProperty.java | 1 + .../v1/api/collections/Replication.java | 6 + .../client6/v1/api/collections/Reranker.java | 6 + .../v1/api/collections/VectorConfig.java | 2 + .../v1/api/collections/VectorIndex.java | 2 + .../v1/api/collections/WeaviateMetadata.java | 2 + .../v1/api/collections/WeaviateObject.java | 10 +- .../query/AbstractQueryClient.java | 583 ++++++++++++++++++ .../collections/query/BaseQueryOptions.java | 34 +- .../query/BaseVectorSearchBuilder.java | 17 + .../v1/api/collections/query/Bm25.java | 7 + .../v1/api/collections/query/ById.java | 7 + .../collections/query/ConsistencyLevel.java | 13 + .../v1/api/collections/query/GroupBy.java | 7 + .../v1/api/collections/query/Hybrid.java | 34 + .../api/collections/query/QueryMetadata.java | 25 +- .../collections/query/QueryObjectGrouped.java | 3 + .../api/collections/query/QueryReference.java | 33 + .../collections/query/QueryResponseGroup.java | 11 + .../query/QueryResponseGrouped.java | 2 + .../query/WeaviateQueryClient.java | 1 - .../query/WeaviateQueryClientAsync.java | 1 - .../v1/api/collections/query/Where.java | 3 + .../tenants/WeaviateTenantsClient.java | 172 ++++++ 35 files changed, 1178 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index cf931f79..ce2187b5 100644 --- a/README.md +++ b/README.md @@ -435,8 +435,8 @@ Passing `null` and and empty `Where[]` to any of the logical operators as well a Every query above has an overloaded variant that accepts a group-by clause. ```java -songs.query.nearVector(new float[]{...}, GroupBy.property("artist")); // Required arguments + GroupBy -songs.query.bm25("rain", bm25 -> bm25.queryProperties("lyrics"), GroupBy.property("artist")); // Required argument, optional parameters, GroupBy +songs.query.nearVector(new float[]{...}, GroupBy.property("artist", 10, 100)); // Required arguments + GroupBy +songs.query.bm25("rain", bm25 -> bm25.queryProperties("lyrics"), GroupBy.property("artist", 10, 100)); // Required argument, optional parameters, GroupBy ``` The shape of the response object is different too, see [`QueryResponseGrouped`](./src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java). diff --git a/src/main/java/io/weaviate/client6/v1/api/WeaviateApiException.java b/src/main/java/io/weaviate/client6/v1/api/WeaviateApiException.java index e91bc126..ee029da5 100644 --- a/src/main/java/io/weaviate/client6/v1/api/WeaviateApiException.java +++ b/src/main/java/io/weaviate/client6/v1/api/WeaviateApiException.java @@ -43,27 +43,37 @@ private WeaviateApiException(String method, String endpoint, int statusCode, Str this.grpcStatusCode = null; } + /** Get raw error message. */ + public String getError() { + return errorMessage; + } + + /** Check if the exception originates from the gRPC transport. */ public boolean isGPRC() { return source == Source.GRPC; } + /** Get the gRPC status code. */ public String grpcStatusCode() { + if (!isGPRC()) { + return null; + } return grpcStatusCode.toString(); } + /** Check if the exception originates from the HTTP transport. */ public boolean isHTTP() { return source == Source.HTTP; } + /** Get the endpoint that the failed request was sent to. */ public String endpoint() { return endpoint; } + /** Get the HTTP status code. */ public Integer httpStatusCode() { return httpStatusCode; } - public String getError() { - return errorMessage; - } } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionConfig.java b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionConfig.java index 581c357e..634bd971 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionConfig.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionConfig.java @@ -23,16 +23,27 @@ import io.weaviate.client6.v1.internal.ObjectBuilder; public record CollectionConfig( + /** Collection name. */ @SerializedName("class") String collectionName, + /** Collection description. */ @SerializedName("description") String description, + /** Collection properties. */ @SerializedName("properties") List properties, + /** Cross-reference properties. */ List references, + /** Vector indexes configured for this collection. */ @SerializedName("vectorConfig") Map vectors, + /** Multi-tenantcy options. */ @SerializedName("multiTenancyConfig") MultiTenancy multiTenancy, + /** Sharding configuration. */ @SerializedName("shardingConfig") Sharding sharding, + /** Replication configuration. */ @SerializedName("replicationConfig") Replication replication, + /** Inverted index configuration. */ @SerializedName("invertedIndexConfig") InvertedIndex invertedIndex, + /** Reranker modules. */ List rerankerModules, + /** Generative modules. */ Generative generativeModule) { public static CollectionConfig of(String collectionName) { @@ -100,15 +111,26 @@ public Builder(String collectionName) { this.collectionName = collectionName; } + /** Add collection description. */ public Builder description(String description) { this.description = description; return this; } + /** + * Add collection properties. + * + * @see Property + */ public Builder properties(Property... properties) { return properties(Arrays.asList(properties)); } + /** + * Add collection properties. + * + * @see Property + */ public Builder properties(List properties) { properties.forEach(property -> this.properties.put(property.propertyName(), property)); return this; @@ -118,10 +140,20 @@ private List propertyList() { return this.properties.values().stream().toList(); } + /** + * Add cross-reference properties. + * + * @see ReferenceProperty#to + */ public Builder references(ReferenceProperty... references) { return references(Arrays.asList(references)); } + /** + * Add cross-reference properties. + * + * @see ReferenceProperty#to + */ public Builder references(List references) { references.forEach(reference -> this.references.put(reference.propertyName(), reference)); return this; @@ -131,66 +163,83 @@ private List referenceList() { return this.references.values().stream().toList(); } + /** Add vector index configurations. */ public final Builder vectorConfig(Map vectors) { this.vectors.putAll(vectors); return this; } + /** + * Add vector index configurations. + * + * @see VectorConfig + */ @SafeVarargs public final Builder vectorConfig(Map.Entry... vectors) { this.vectors.putAll(Map.ofEntries(vectors)); return this; } + /** Configure collection's sharding. */ public Builder sharding(Sharding sharding) { this.sharding = sharding; return this; } + /** Configure collection's sharding. */ public Builder sharding(Function> fn) { this.sharding = Sharding.of(fn); return this; } + /** Configure multi-tenancy. */ public Builder multiTenancy(MultiTenancy multiTenancy) { this.multiTenancy = multiTenancy; return this; } + /** Configure multi-tenancy. */ public Builder multiTenancy(Function> fn) { this.multiTenancy = MultiTenancy.of(fn); return this; } + /** Configure replication. */ public Builder replication(Replication replication) { this.replication = replication; return this; } + /** Configure replication. */ public Builder replication(Function> fn) { this.replication = Replication.of(fn); return this; } + /** Change inverted index configurations. */ public Builder invertedIndex(InvertedIndex invertedIndex) { this.invertedIndex = invertedIndex; return this; } + /** Change inverted index configurations. */ public Builder invertedIndex(Function> fn) { this.invertedIndex = InvertedIndex.of(fn); return this; } + /** Add reranker modules. */ public Builder rerankerModules(Reranker... rerankerModules) { return rerankerModules(Arrays.asList(rerankerModules)); } + /** Add reranker modules. */ public Builder rerankerModules(List rerankerModules) { this.rerankerModules.addAll(rerankerModules); return this; } + /** Add a generative module. */ public Builder generativeModule(Generative generativeModule) { this.generativeModule = generativeModule; return this; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandle.java b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandle.java index 3a1b3503..08f41eca 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandle.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandle.java @@ -49,10 +49,39 @@ private CollectionHandle(CollectionHandle c, CollectionHandleDefaul this.tenants = c.tenants; } + /** + * Create a Paginator over the objects in this collection. + * + *

+ * Usage: + * + *

+   * {@code
+   * var things = client.collections.use("Things");
+   *
+   * // In a for-loop:
+   * for (final var thing : things.paginate()) {
+   *   // ... do something for each Thing object
+   * }
+   *
+   * // As a stream
+   * things.paginate().stream()
+   *  .map(...)
+   *  .collect(...);
+   * }
+ * + * @return An {@link Iterable} over this collection's objects. + */ public Paginator paginate() { return Paginator.of(this.query); } + /** + * Create a Paginator over the objects in this collection. + * + * @param fn Lambda expression for optional parameters. + * @return An {@link Iterable} over this collection's objects. + */ public Paginator paginate( Function, ObjectBuilder>> fn) { return Paginator.of(this.query, fn); @@ -68,7 +97,7 @@ public Paginator paginate( * collection exceeds {@link Long#MAX_VALUE} as this is unlikely to happen. * *

- * This is a shortcut for: + * This is a shorthand for: * *

{@code
    * handle.aggregate.overAll(all -> all.includeTotalCount(true)).totalCount()
@@ -78,22 +107,30 @@ public long size() {
     return this.aggregate.overAll(all -> all.includeTotalCount(true)).totalCount();
   }
 
+  /** Default consistency level for requests. */
   public ConsistencyLevel consistencyLevel() {
     return defaults.consistencyLevel();
   }
 
+  /** Obtain a collection handle with a different consistency level. */
   public CollectionHandle withConsistencyLevel(ConsistencyLevel consistencyLevel) {
     return new CollectionHandle<>(this, CollectionHandleDefaults.of(with -> with.consistencyLevel(consistencyLevel)));
   }
 
+  /** Default tenant for requests. */
   public String tenant() {
     return defaults.tenant();
   }
 
+  /** Obtain a collection handle with a different target tenant. */
   public CollectionHandle withTenant(String tenant) {
     return new CollectionHandle<>(this, CollectionHandleDefaults.of(with -> with.tenant(tenant)));
   }
 
+  /**
+   * Obtain a collection handle with different defaults
+   * (consistency level / tenant).
+   */
   public CollectionHandle withDefaults(
       Function> fn) {
     return new CollectionHandle<>(this, CollectionHandleDefaults.of(fn));
diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleAsync.java b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleAsync.java
index 1fdb73a3..5e8196dd 100644
--- a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleAsync.java
+++ b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleAsync.java
@@ -85,23 +85,31 @@ public CompletableFuture size() {
         .thenApply(AggregateResponse::totalCount);
   }
 
+  /** Default consistency level for requests. */
   public ConsistencyLevel consistencyLevel() {
     return defaults.consistencyLevel();
   }
 
+  /** Obtain a collection handle with a different consistency level. */
   public CollectionHandleAsync withConsistencyLevel(ConsistencyLevel consistencyLevel) {
     return new CollectionHandleAsync<>(this, CollectionHandleDefaults.of(
         def -> def.consistencyLevel(consistencyLevel)));
   }
 
+  /** Default tenant for requests. */
   public String tenant() {
     return defaults.tenant();
   }
 
+  /** Obtain a collection handle with a different target tenant. */
   public CollectionHandleAsync withTenant(String tenant) {
     return new CollectionHandleAsync<>(this, CollectionHandleDefaults.of(with -> with.tenant(tenant)));
   }
 
+  /**
+   * Obtain a collection handle with different defaults
+   * (consistency level / tenant).
+   */
   public CollectionHandleAsync withDefaults(
       Function> fn) {
     return new CollectionHandleAsync<>(this, CollectionHandleDefaults.of(fn));
diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleDefaults.java b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleDefaults.java
index 7ce9711b..c7952222 100644
--- a/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleDefaults.java
+++ b/src/main/java/io/weaviate/client6/v1/api/collections/CollectionHandleDefaults.java
@@ -54,6 +54,7 @@ public CollectionHandleDefaults build() {
     }
   }
 
+  /** Serialize default values to a URL query. */
   public Map queryParameters() {
     if (consistencyLevel == null && tenant == null) {
       return Collections.emptyMap();
diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/DataType.java b/src/main/java/io/weaviate/client6/v1/api/collections/DataType.java
index 32858bca..91584a79 100644
--- a/src/main/java/io/weaviate/client6/v1/api/collections/DataType.java
+++ b/src/main/java/io/weaviate/client6/v1/api/collections/DataType.java
@@ -19,6 +19,17 @@ public interface DataType {
   public static final String UUID = "uuid";
   public static final String UUID_ARRAY = "uuid[]";
 
+  /**
+   * Scalar/array types which Weaviate and WeaviateClient recognize.
+   *
+   * 

+ * Other data types are considered reference types, i.e. if a user creates a + * property with type {@code "timestamp"}, the client will count it a + * cross-reference to the {@code "timestamp"} collection. + * + * This is obviously wrong, so it is recommended to always create properties + * using {@link Property}'s factory classes. + */ public static final Set KNOWN_TYPES = ImmutableSet.of( TEXT, INT, BLOB, BOOL, DATE, UUID, NUMBER, TEXT_ARRAY, INT_ARRAY, NUMBER_ARRAY, BOOL_ARRAY, DATE_ARRAY, UUID_ARRAY); diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/Generative.java b/src/main/java/io/weaviate/client6/v1/api/collections/Generative.java index 2354d5b7..632713cd 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/Generative.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/Generative.java @@ -42,10 +42,16 @@ public static Kind valueOfJson(String jsonValue) { Object _self(); + /** Configure a default Cohere generative module. */ public static Generative cohere() { return CohereGenerative.of(); } + /** + * Configure a Cohere generative module. + * + * @param fn Lambda expression for optional parameters. + */ public static Generative cohere(Function> fn) { return CohereGenerative.of(fn); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/InvertedIndex.java b/src/main/java/io/weaviate/client6/v1/api/collections/InvertedIndex.java index 2edb9904..ad2fc17f 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/InvertedIndex.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/InvertedIndex.java @@ -9,12 +9,28 @@ import io.weaviate.client6.v1.internal.ObjectBuilder; public record InvertedIndex( + /** The frequency of cleanup operations in the HNSW vector index. */ @SerializedName("cleanupIntervalSeconds") Integer cleanupIntervalSeconds, + /** Parameters for BM25 ranking algorithm. */ @SerializedName("bm25") Bm25 bm25, + /** Common words which should be ignored in queries. */ @SerializedName("stopwords") Stopwords stopwords, + /** + * If true, indexes object creation and update timestamps, + * enabling filtering by creationTimeUnix and lastUpdateTimeUnix. + */ @SerializedName("indexTimestamps") Boolean indexTimestamps, + /** + * If true, indexes the null/non-null state of each property, + * enabling filtering for null values. + */ @SerializedName("indexNullState") Boolean indexNulls, + /** + * If true, indexes the length of each property, + * enabling filtering by property length. + */ @SerializedName("indexPropertyLength") Boolean indexPropertyLength, + /** If true, BlockMaxWAND optimization is used. */ @SerializedName("usingBlockMaxWAND") Boolean useBlockMaxWAND) { public static InvertedIndex of(Function> fn) { @@ -22,7 +38,9 @@ public static InvertedIndex of(Function> f } public record Bm25( + /** Free parameter for the BM25 ranking function. */ @SerializedName("b") Float b, + /** Free parameter for the BM25 ranking function. */ @SerializedName("k1") Float k1) { public static Bm25 of(Function> fn) { @@ -37,11 +55,13 @@ public static class Builder implements ObjectBuilder { private Float b; private Float k1; + /** Set free parameter {@code b} for the BM25 ranking function. */ public Builder b(float b) { this.b = b; return this; } + /** Set free parameter {@code k1} for the BM25 ranking function. */ public Builder k1(float k1) { this.k1 = k1; return this; @@ -55,8 +75,11 @@ public Bm25 build() { } public record Stopwords( + /** Selected preset. */ @SerializedName("preset") String preset, + /** Custom words added to the selected preset. */ @SerializedName("additions") List additions, + /** Words removed from the selected preset. */ @SerializedName("removals") List removals) { public static Stopwords of(Function> fn) { @@ -72,24 +95,29 @@ public static class Builder implements ObjectBuilder { private List additions; private List removals; + /** Select a preset to use for a particular language. */ public Builder preset(String preset) { this.preset = preset; return this; } + /** Add words to the selected preset. */ public Builder add(String... additions) { return add(Arrays.asList(additions)); } + /** Add words to the selected preset. */ public Builder add(List additions) { this.additions.addAll(additions); return this; } + /** Remove words from the selected preset. */ public Builder remove(String... removals) { return remove(Arrays.asList(removals)); } + /** Remove words from the selected preset. */ public Builder remove(List removals) { this.removals.addAll(removals); return this; @@ -122,37 +150,59 @@ public static class Builder implements ObjectBuilder { private Boolean indexPropertyLength; private Boolean useBlockMaxWAND; + /** Set the frequency of cleanup operations in the HNSW vector index. */ public Builder cleanupIntervalSeconds(int cleanupIntervalSeconds) { this.cleanupIntervalSeconds = cleanupIntervalSeconds; return this; } + /** Set {@code b} and {@code k1} parameters for BM25 ranking algorithm. */ public Builder bm25(Function> fn) { this.bm25 = Bm25.of(fn); return this; } + /** Select and configure a stopwords preset. */ public Builder stopwords(Function> fn) { this.stopwords = Stopwords.of(fn); return this; } - public Builder indexTimestamps(Boolean indexTimestamps) { + /** + * Enable / disable creating an index for creation / update timestamps. + * + * @see InvertedIndex#indexTimestamps + */ + public Builder indexTimestamps(boolean indexTimestamps) { this.indexTimestamps = indexTimestamps; return this; } - public Builder indexNulls(Boolean indexNulls) { + /** + * Enable / disable creating an index for null property values. + * + * @see InvertedIndex#indexNulls + */ + public Builder indexNulls(boolean indexNulls) { this.indexNulls = indexNulls; return this; } - public Builder indexPropertyLength(Boolean indexPropertyLength) { + /** + * Enable / disable creating an index for property lengths. + * + * @see InvertedIndex#indexPropertyLength + */ + public Builder indexPropertyLength(boolean indexPropertyLength) { this.indexPropertyLength = indexPropertyLength; return this; } - public Builder useBlockMaxWAND(Boolean useBlockMaxWAND) { + /** + * If true, indexes object creation and update timestamps, + * enabling filtering by creationTimeUnix and lastUpdateTimeUnix. + */ + public Builder useBlockMaxWAND(boolean useBlockMaxWAND) { this.useBlockMaxWAND = useBlockMaxWAND; return this; } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/MultiTenancy.java b/src/main/java/io/weaviate/client6/v1/api/collections/MultiTenancy.java index 9524a1f0..11227eee 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/MultiTenancy.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/MultiTenancy.java @@ -7,8 +7,11 @@ import io.weaviate.client6.v1.internal.ObjectBuilder; public record MultiTenancy( + /** Is multi-tenancy enabled for this collection. */ @SerializedName("enabled") boolean enabled, + /** Is auto tenant creation enabled for this collection. */ @SerializedName("autoTenantCreation") Boolean createAutomatically, + /** Is auto tenant activation enabled for this collection. */ @SerializedName("autoTenantActivation") Boolean activateAutomatically) { public static MultiTenancy of(Function> fn) { @@ -27,16 +30,19 @@ public static class Builder implements ObjectBuilder { private Boolean createAutomatically; private Boolean activateAutomatically; + /** Enable / disable multi-tenancy for this collection. */ public Builder enabled(boolean enabled) { this.enabled = enabled; return this; } + /** Enable / disable auto tenant creation. */ public Builder autoTenantCreation(boolean enabled) { this.createAutomatically = enabled; return this; } + /** Enable / disable auto tenant activation. */ public Builder autoTenantActivation(boolean enabled) { this.activateAutomatically = enabled; return this; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/Quantization.java b/src/main/java/io/weaviate/client6/v1/api/collections/Quantization.java index 64c4ec02..b17b1144 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/Quantization.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/Quantization.java @@ -51,38 +51,63 @@ public static Kind valueOfJson(String jsonValue) { Object _self(); + /** Disable any quantization for this collection. */ public static Quantization uncompressed() { return Uncompressed.of(); } + /** Enable binary quantization for this collection. */ public static Quantization bq() { return BQ.of(); } + /** + * Enable binary quantization for this collection. + * + * @param fn Lambda expression for optional parameters. + */ public static Quantization bq(Function> fn) { return BQ.of(fn); } + /** Enable product quantization for this collection. */ public static Quantization pq() { return PQ.of(); } + /** + * Enable product quantization for this collection. + * + * @param fn Lambda expression for optional parameters. + */ public static Quantization pq(Function> fn) { return PQ.of(fn); } + /** Enable scalar quantization for this collection. */ public static Quantization sq() { return SQ.of(); } + /** + * Enable scalar quantization for this collection. + * + * @param fn Lambda expression for optional parameters. + */ public static Quantization sq(Function> fn) { return SQ.of(fn); } + /** Enable rotational quantization for this collection. */ public static Quantization rq() { return RQ.of(); } + /** + * Enable rotational quantization for this collection. + * + * @param fn Lambda expression for optional parameters. + */ public static Quantization rq(Function> fn) { return RQ.of(fn); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/ReferenceProperty.java b/src/main/java/io/weaviate/client6/v1/api/collections/ReferenceProperty.java index 38716f78..7b3d3770 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/ReferenceProperty.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/ReferenceProperty.java @@ -44,6 +44,7 @@ public static ReferenceProperty to(String name, List collections) { return new ReferenceProperty(name, collections); } + /** This method is intended for client's internal use only. */ public Property toProperty() { return new Property.Builder(propertyName, dataTypes).build(); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/Replication.java b/src/main/java/io/weaviate/client6/v1/api/collections/Replication.java index 2b175bae..a01af272 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/Replication.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/Replication.java @@ -36,16 +36,22 @@ public static class Builder implements ObjectBuilder { private Boolean asyncEnabled; private DeletionStrategy deletionStrategy; + /** Set desired replication factor for this collection. */ public Builder replicationFactor(int replicationFactor) { this.replicationFactor = replicationFactor; return this; } + /** Enable / disable async replication. */ public Builder asyncEnabled(boolean asyncEnabled) { this.asyncEnabled = asyncEnabled; return this; } + /** + * Select the deletion strategy for resolving conflicts + * during async replication. + */ public Builder deletionStrategy(DeletionStrategy deletionStrategy) { this.deletionStrategy = deletionStrategy; return this; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/Reranker.java b/src/main/java/io/weaviate/client6/v1/api/collections/Reranker.java index fb473b40..08b6aeb8 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/Reranker.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/Reranker.java @@ -42,10 +42,16 @@ public static Kind valueOfJson(String jsonValue) { Object _self(); + /** Configure a default Cohere reranker module. */ public static Reranker cohere() { return CohereReranker.of(); } + /** + * Configure a Cohere reranker module. + * + * @param fn Lambda expression for optional parameters. + */ public static Reranker cohere(Function> fn) { return CohereReranker.of(fn); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/VectorConfig.java b/src/main/java/io/weaviate/client6/v1/api/collections/VectorConfig.java index 1e8cd96d..ae13f70c 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/VectorConfig.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/VectorConfig.java @@ -52,8 +52,10 @@ public static Kind valueOfJson(String jsonValue) { Object _self(); + /** Get vector index configuration for this vector. */ VectorIndex vectorIndex(); + /** Get quantization configuration for this vector. */ Quantization quantization(); /** Create a bring-your-own-vector vector index. */ diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/VectorIndex.java b/src/main/java/io/weaviate/client6/v1/api/collections/VectorIndex.java index 4da02656..51096f63 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/VectorIndex.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/VectorIndex.java @@ -45,10 +45,12 @@ public static Kind valueOfJson(String jsonValue) { VectorIndex.Kind _kind(); + /** Returns the on-the-wire name of the vector index type. */ default String type() { return _kind().jsonValue(); } + /** Get the concrete vector index configuration object. */ Object config(); public static enum CustomTypeAdapterFactory implements TypeAdapterFactory { diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateMetadata.java b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateMetadata.java index 9121e33c..a4b8cc05 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateMetadata.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateMetadata.java @@ -1,7 +1,9 @@ package io.weaviate.client6.v1.api.collections; public interface WeaviateMetadata { + /** Object's UUID. */ String uuid(); + /** Object's associated vector embeddings. */ Vectors vectors(); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateObject.java b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateObject.java index c96b2291..3180cf2e 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateObject.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/WeaviateObject.java @@ -43,20 +43,22 @@ public static WeaviateObject of( } public WeaviateObject(Builder builder) { - this(builder.collection, builder.properties, builder.references, builder.metadata); + this(builder.collectionName, builder.properties, builder.references, builder.metadata); } public static class Builder implements ObjectBuilder> { - private String collection; + private String collectionName; private P properties; private Map> references = new HashMap<>(); private M metadata; - public final Builder collection(String collection) { - this.collection = collection; + /** Set the name of the collection his object belongs to. */ + public final Builder collection(String collectionName) { + this.collectionName = collectionName; return this; } + /** Add object properties. */ public final Builder properties(P properties) { this.properties = properties; return this; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java index 356df14d..5be2587f 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java @@ -37,10 +37,17 @@ abstract class AbstractQueryClient> fn) { // Collection handle defaults (consistencyLevel / tenant) are irrelevant for // by-ID lookup. Do not `applyDefaults` to `fn`. @@ -62,327 +69,903 @@ protected final Optional> optionalF // Object queries ----------------------------------------------------------- + /** + * Retrieve objects without applying a Vector Search or Keyword Search filter. + * + * @param fn Lambda expression for optional parameters. + */ public ResponseT fetchObjects(Function> fn) { return fetchObjects(FetchObjects.of(fn)); } + /** + * Retrieve objects without applying a Vector Search or Keyword Search filter. + * + * @param query FetchObjects query. + */ public ResponseT fetchObjects(FetchObjects query) { return performRequest(query); } + /** + * Retrieve objects without applying a Vector Search or Keyword Search filter. + * + * + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT fetchObjects(Function> fn, GroupBy groupBy) { return fetchObjects(FetchObjects.of(fn), groupBy); } + /** + * Retrieve objects without applying a Vector Search or Keyword Search filter. + * + * @param query FetchObjects query. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT fetchObjects(FetchObjects query, GroupBy groupBy) { return performRequest(query, groupBy); } // BM25 queries ------------------------------------------------------------- + /** + * Query collection objects using keyword (BM25) search. + * + * @param query Query string. + */ public ResponseT bm25(String query) { return bm25(Bm25.of(query)); } + /** + * Query collection objects using keyword (BM25) search. + * + * @param query Query string. + * @param fn Lambda expression for optional parameters. + */ public ResponseT bm25(String query, Function> fn) { return bm25(Bm25.of(query, fn)); } + /** + * Query collection objects using keyword (BM25) search. + * + * @param query BM25 query request. + */ public ResponseT bm25(Bm25 query) { return performRequest(query); } + /** + * Query collection objects using keyword (BM25) search. + * + * @param query Query string. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT bm25(String query, GroupBy groupBy) { return bm25(Bm25.of(query), groupBy); } + /** + * Query collection objects using keyword (BM25) search. + * + * @param query Query string. + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT bm25(String query, Function> fn, GroupBy groupBy) { return bm25(Bm25.of(query, fn), groupBy); } + /** + * Query collection objects using keyword (BM25) search. + * + * @param query BM25 query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT bm25(Bm25 query, GroupBy groupBy) { return performRequest(query, groupBy); } // Hybrid queries ----------------------------------------------------------- + /** + * Query collection objects using hybrid search. + * + * @param query Query string. + */ public ResponseT hybrid(String query) { return hybrid(Hybrid.of(query)); } + /** + * Query collection objects using hybrid search. + * + * @param query Query string. + * @param fn Lambda expression for optional parameters. + */ public ResponseT hybrid(String query, Function> fn) { return hybrid(Hybrid.of(query, fn)); } + /** + * Query collection objects using hybrid search. + * + * @param query Hybrid query request. + */ public ResponseT hybrid(Hybrid query) { return performRequest(query); } + /** + * Query collection objects using hybrid search. + * + * @param query Query string. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT hybrid(String query, GroupBy groupBy) { return hybrid(Hybrid.of(query), groupBy); } + /** + * Query collection objects using hybrid search. + * + * @param query Query string. + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT hybrid(String query, Function> fn, GroupBy groupBy) { return hybrid(Hybrid.of(query, fn), groupBy); } + /** + * Query collection objects using hybrid search. + * + * @param query Query string. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT hybrid(Hybrid query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearVector queries ------------------------------------------------------- + /** + * Query collection objects using near vector search. + * + * @param vector Query vector. + */ public ResponseT nearVector(float[] vector) { return nearVector(NearVector.of(vector)); } + /** + * Query collection objects using near vector search. + * + * @param vector Query vector. + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearVector(float[] vector, Function> fn) { return nearVector(NearVector.of(vector, fn)); } + /** + * Query collection objects using near vector search. + * + * @param query Near vector query request. + */ public ResponseT nearVector(NearVector query) { return performRequest(query); } + /** + * Query collection objects using near vector search. + * + * @param vector Query vector. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearVector(float[] vector, GroupBy groupBy) { return nearVector(NearVector.of(vector), groupBy); } + /** + * Query collection objects using near vector search. + * + * @param vector Query vector. + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearVector(float[] vector, Function> fn, GroupBy groupBy) { return nearVector(NearVector.of(vector, fn), groupBy); } + /** + * Query collection objects using near vector search. + * + * @param query Near vector query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearVector(NearVector query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearObject queries ------------------------------------------------------- + /** + * Query collection objects using near object search. + * + * @param uuid Query object UUID. + */ public ResponseT nearObject(String uuid) { return nearObject(NearObject.of(uuid)); } + /** + * Query collection objects using near object search. + * + * @param uuid Query object UUID. + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearObject(String uuid, Function> fn) { return nearObject(NearObject.of(uuid, fn)); } + /** + * Query collection objects using near object search. + * + * @param query Near object query request. + */ public ResponseT nearObject(NearObject query) { return performRequest(query); } + /** + * Query collection objects using near object search. + * + * @param uuid Query object UUID. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearObject(String uuid, GroupBy groupBy) { return nearObject(NearObject.of(uuid), groupBy); } + /** + * Query collection objects using near object search. + * + * @param uuid Query object UUID. + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearObject(String uuid, Function> fn, GroupBy groupBy) { return nearObject(NearObject.of(uuid, fn), groupBy); } + /** + * Query collection objects using near object search. + * + * @param query Near object query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearObject(NearObject query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearText queries --------------------------------------------------------- + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + */ public ResponseT nearText(String... text) { return nearText(NearText.of(text)); } + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearText(String text, Function> fn) { return nearText(NearText.of(text, fn)); } + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearText(List text, Function> fn) { return nearText(NearText.of(text, fn)); } + /** + * Query collection objects using near text search. + * + * @param query Near text query request. + */ public ResponseT nearText(NearText query) { return performRequest(query); } + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearText(String text, GroupBy groupBy) { return nearText(NearText.of(text), groupBy); } + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearText(List text, GroupBy groupBy) { return nearText(NearText.of(text), groupBy); } + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearText(String text, Function> fn, GroupBy groupBy) { return nearText(NearText.of(text), groupBy); } + /** + * Query collection objects using near text search. + * + * @param text Query concepts. + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearText(List text, Function> fn, GroupBy groupBy) { return nearText(NearText.of(text), groupBy); } + /** + * Query collection objects using near text search. + * + * @param query Near text query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearText(NearText query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearImage queries -------------------------------------------------------- + /** + * Query collection objects using near image search. + * + * @param image Query image (base64-encoded). + */ public ResponseT nearImage(String image) { return nearImage(NearImage.of(image)); } + /** + * Query collection objects using near image search. + * + * @param image Query image (base64-encoded). + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearImage(String image, Function> fn) { return nearImage(NearImage.of(image, fn)); } + /** + * Query collection objects using near image search. + * + * @param query Near image query request. + */ public ResponseT nearImage(NearImage query) { return performRequest(query); } + /** + * Query collection objects using near image search. + * + * @param image Query image (base64-encoded). + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearImage(String image, GroupBy groupBy) { return nearImage(NearImage.of(image), groupBy); } + /** + * Query collection objects using near image search. + * + * @param image Query image (base64-encoded). + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearImage(String image, Function> fn, GroupBy groupBy) { return nearImage(NearImage.of(image, fn), groupBy); } + /** + * Query collection objects using near image search. + * + * @param query Near image query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearImage(NearImage query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearAudio queries -------------------------------------------------------- + /** + * Query collection objects using near audio search. + * + * @param audio Query audio (base64-encoded). + */ public ResponseT nearAudio(String audio) { return nearAudio(NearAudio.of(audio)); } + /** + * Query collection objects using near audio search. + * + * @param audio Query audio (base64-encoded). + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearAudio(String audio, Function> fn) { return nearAudio(NearAudio.of(audio, fn)); } + /** + * Query collection objects using near audio search. + * + * @param query Near audio query request. + */ public ResponseT nearAudio(NearAudio query) { return performRequest(query); } + /** + * Query collection objects using near audio search. + * + * @param audio Query audio (base64-encoded). + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearAudio(String audio, GroupBy groupBy) { return nearAudio(NearAudio.of(audio), groupBy); } + /** + * Query collection objects using near audio search. + * + * @param audio Query audio (base64-encoded). + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ + public GroupedResponseT nearAudio(String audio, Function> fn, GroupBy groupBy) { return nearAudio(NearAudio.of(audio, fn), groupBy); } + /** + * Query collection objects using near audio search. + * + * @param query Near audio query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearAudio(NearAudio query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearVideo queries -------------------------------------------------------- + /** + * Query collection objects using near video search. + * + * @param video Query video (base64-encoded). + */ public ResponseT nearVideo(String video) { return nearVideo(NearVideo.of(video)); } + /** + * Query collection objects using near video search. + * + * @param video Query video (base64-encoded). + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearVideo(String video, Function> fn) { return nearVideo(NearVideo.of(video, fn)); } + /** + * Query collection objects using near video search. + * + * @param query Near video query request. + */ public ResponseT nearVideo(NearVideo query) { return performRequest(query); } + /** + * Query collection objects using near video search. + * + * @param video Query video (base64-encoded). + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearVideo(String video, GroupBy groupBy) { return nearVideo(NearVideo.of(video), groupBy); } + /** + * Query collection objects using near video search. + * + * @param video Query video (base64-encoded). + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearVideo(String video, Function> fn, GroupBy groupBy) { return nearVideo(NearVideo.of(video, fn), groupBy); } + /** + * Query collection objects using near video search. + * + * @param query Near video query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearVideo(NearVideo query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearThermal queries ------------------------------------------------------ + /** + * Query collection objects using near thermal search. + * + * @param thermal Query thermal (base64-encoded). + */ public ResponseT nearThermal(String thermal) { return nearThermal(NearThermal.of(thermal)); } + /** + * Query collection objects using near thermal search. + * + * @param thermal Query thermal (base64-encoded). + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearThermal(String thermal, Function> fn) { return nearThermal(NearThermal.of(thermal, fn)); } + /** + * Query collection objects using near thermal search. + * + * @param query Near thermal query request. + */ public ResponseT nearThermal(NearThermal query) { return performRequest(query); } + /** + * Query collection objects using near thermal search. + * + * @param thermal Query thermal (base64-encoded). + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearThermal(String thermal, GroupBy groupBy) { return nearThermal(NearThermal.of(thermal), groupBy); } + /** + * Query collection objects using near thermal search. + * + * @param thermal Query thermal (base64-encoded). + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearThermal(String thermal, Function> fn, GroupBy groupBy) { return nearThermal(NearThermal.of(thermal, fn), groupBy); } + /** + * Query collection objects using near thermal search. + * + * @param query Near thermal query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearThermal(NearThermal query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearDepth queries -------------------------------------------------------- + /** + * Query collection objects using near depth search. + * + * @param depth Query depth (base64-encoded). + */ public ResponseT nearDepth(String depth) { return nearDepth(NearDepth.of(depth)); } + /** + * Query collection objects using near depth search. + * + * @param depth Query depth (base64-encoded). + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearDepth(String depth, Function> fn) { return nearDepth(NearDepth.of(depth, fn)); } + /** + * Query collection objects using near depth search. + * + * @param query Near depth query request. + */ public ResponseT nearDepth(NearDepth query) { return performRequest(query); } + /** + * Query collection objects using near depth search. + * + * @param depth Query depth (base64-encoded). + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearDepth(String depth, GroupBy groupBy) { return nearDepth(NearDepth.of(depth), groupBy); } + /** + * Query collection objects using near depth search. + * + * @param depth Query depth (base64-encoded). + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearDepth(String depth, Function> fn, GroupBy groupBy) { return nearDepth(NearDepth.of(depth, fn), groupBy); } + /** + * Query collection objects using near depth search. + * + * @param query Near depth query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearDepth(NearDepth query, GroupBy groupBy) { return performRequest(query, groupBy); } // NearImu queries ---------------------------------------------------------- + /** + * Query collection objects using near IMU search. + * + * @param imu Query IMU (base64-encoded). + */ public ResponseT nearImu(String imu) { return nearImu(NearImu.of(imu)); } + /** + * Query collection objects using near IMU search. + * + * @param imu Query IMU (base64-encoded). + * @param fn Lambda expression for optional parameters. + */ public ResponseT nearImu(String imu, Function> fn) { return nearImu(NearImu.of(imu, fn)); } + /** + * Query collection objects using near IMU search. + * + * @param query Near IMU query request. + */ public ResponseT nearImu(NearImu query) { return performRequest(query); } + /** + * Query collection objects using near IMU search. + * + * @param imu Query IMU (base64-encoded). + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearImu(String imu, GroupBy groupBy) { return nearImu(NearImu.of(imu), groupBy); } + /** + * Query collection objects using near IMU search. + * + * @param imu Query IMU (base64-encoded). + * @param fn Lambda expression for optional parameters. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearImu(String imu, Function> fn, GroupBy groupBy) { return nearImu(NearImu.of(imu, fn), groupBy); } + /** + * Query collection objects using near IMU search. + * + * @param query Near IMU query request. + * @param groupBy Group-by clause. + * @return Grouped query result. + * + * @see GroupBy + * @see QueryResponseGrouped + */ public GroupedResponseT nearImu(NearImu query, GroupBy groupBy) { return performRequest(query, groupBy); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java index b3725923..036ce116 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseQueryOptions.java @@ -52,26 +52,51 @@ protected Builder() { returnMetadata(MetadataField.UUID); } + /** + * Limit the number of returned objects. + * + *

+ * Combine with {@link #offset(int)} to use offset-based pagination. + */ public final SELF limit(int limit) { this.limit = limit; return (SELF) this; } + /** + * Skip the first N objects in the result set. + * + *

+ * Combine with {@link #limit(int)} to use offset-based pagination. + */ public final SELF offset(int offset) { this.offset = offset; return (SELF) this; } + /** + * Discard results after an automatically calculated cutoff point. + * + * @param autocut The number of "groups" to keep. + * @see Documentation + */ public final SELF autocut(int autocut) { this.autocut = autocut; return (SELF) this; } + /** + * Discard results before this object. + * + * @param after UUID of an object in this collection. + */ public final SELF after(String after) { this.after = after; return (SELF) this; } + /** Set consitency level for query resolution. */ public final SELF consistencyLevel(ConsistencyLevel consistencyLevel) { this.consistencyLevel = consistencyLevel; return (SELF) this; @@ -81,8 +106,6 @@ public final SELF consistencyLevel(ConsistencyLevel consistencyLevel) { * Filter result set using traditional filtering operators: {@code eq}, * {@code gte}, {@code like}, etc. * Subsequent calls to {@link #where} aggregate with an AND operator. - * - * @see Where */ public final SELF where(Where where) { this.where = this.where == null ? where : Where.and(this.where, where); @@ -95,33 +118,40 @@ public final SELF where(Where... wheres) { return (SELF) this; } + /** Select properties to include in the query result. */ public final SELF returnProperties(String... properties) { return returnProperties(Arrays.asList(properties)); } + /** Select properties to include in the query result. */ public final SELF returnProperties(List properties) { this.returnProperties.addAll(properties); return (SELF) this; } + /** Select cross-referenced objects to include in the query result. */ public final SELF returnReferences(QueryReference... references) { return returnReferences(Arrays.asList(references)); } + /** Select cross-referenced objects to include in the query result. */ public final SELF returnReferences(List references) { this.returnReferences.addAll(references); return (SELF) this; } + /** Select metadata to include in the query result. */ public final SELF returnMetadata(Metadata... metadata) { return returnMetadata(Arrays.asList(metadata)); } + /** Select metadata to include in the query result. */ public final SELF returnMetadata(List metadata) { this.returnMetadata.addAll(metadata); return (SELF) this; } + /** Include default vector. */ public final SELF includeVector() { return returnMetadata(Metadata.VECTOR); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java index 08b385a1..1cb8bc10 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java @@ -7,12 +7,29 @@ abstract class BaseVectorSearchBuilder + * Use {@link Hybrid.Builder#maxVectorDistance(float)} if {@link NearVector} or + * {@link NearText} are used as a vector search component in hybrid search. + */ @SuppressWarnings("unchecked") public SelfT distance(float distance) { this.distance = distance; return (SelfT) this; } + /** + * Discard objects whose vectors are further away + * from the target vector than the threshold according + * to a normalized (0 <= c <= 0) distance. + * + *

+ * Certainty is only meaningful for {@code cosine} distance. + * Prefer using {@link #distance(float)} to limit search results. + */ @SuppressWarnings("unchecked") public SelfT certainty(float certainty) { this.certainty = certainty; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/Bm25.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/Bm25.java index 9c48e610..899487a6 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/Bm25.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/Bm25.java @@ -39,15 +39,22 @@ public Builder(String query) { this.query = query; } + /** Select properties to be included in the results scoring. */ public Builder queryProperties(String... properties) { return queryProperties(Arrays.asList(properties)); } + /** Select properties to be included in the results scoring. */ public Builder queryProperties(List properties) { this.queryProperties.addAll(properties); return this; } + /** + * Select BM25 + * Search Operator to use. + */ public Builder searchOperator(SearchOperator searchOperator) { this.searchOperator = searchOperator; return this; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/ById.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/ById.java index 5a2bee97..7beb43f9 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/ById.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/ById.java @@ -48,33 +48,40 @@ public Builder(String uuid) { returnMetadata(MetadataField.UUID); } + /** Select properties to include in the query result. */ public final Builder returnProperties(String... properties) { return returnProperties(Arrays.asList(properties)); } + /** Select properties to include in the query result. */ public final Builder returnProperties(List properties) { this.returnProperties.addAll(properties); return this; } + /** Select cross-referenced objects to include in the query result. */ public final Builder returnReferences(QueryReference... references) { return returnReferences(Arrays.asList(references)); } + /** Select cross-referenced objects to include in the query result. */ public final Builder returnReferences(List references) { this.returnReferences.addAll(references); return this; } + /** Select metadata to include in the query result. */ public final Builder returnMetadata(Metadata... metadata) { return returnMetadata(Arrays.asList(metadata)); } + /** Select metadata to include in the query result. */ public final Builder returnMetadata(List metadata) { this.returnMetadata.addAll(metadata); return this; } + /** Include default vector. */ public final Builder includeVector() { return returnMetadata(Metadata.VECTOR); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/ConsistencyLevel.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/ConsistencyLevel.java index 5ed88258..326609d2 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/ConsistencyLevel.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/ConsistencyLevel.java @@ -6,8 +6,21 @@ import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateProtoSearchGet; public enum ConsistencyLevel { + /** + * The operation succeeds as soon as one replica acknowledges the request. This + * is the fastest and most available, but least consistent option. + */ ONE(WeaviateProtoBase.ConsistencyLevel.CONSISTENCY_LEVEL_ONE, "ONE"), + /** + * The operation succeeds when a majority of replicas (calculated as + * replication_factor/2 + 1) respond. This provides a balance between + * consistency and availability. + */ QUORUM(WeaviateProtoBase.ConsistencyLevel.CONSISTENCY_LEVEL_ONE, "QUORUM"), + /** + * The operation succeeds only when all replicas respond. This is the most + * consistent but least available and slowest option. + */ ALL(WeaviateProtoBase.ConsistencyLevel.CONSISTENCY_LEVEL_ONE, "ALL"); private final WeaviateProtoBase.ConsistencyLevel consistencyLevel; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/GroupBy.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/GroupBy.java index e79bd138..2cb430ff 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/GroupBy.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/GroupBy.java @@ -5,6 +5,13 @@ import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateProtoSearchGet; public record GroupBy(List path, int maxGroups, int maxObjectsPerGroup) { + /** + * Group results by the property value. + * + * @param property Property name. + * @param maxGroups Maximum number of groups to return. + * @param maxObjectsPerGroup Maximum number of objects to include in a group. + */ public static GroupBy property(String property, int maxGroups, int maxObjectsPerGroup) { return new GroupBy(List.of(property), maxGroups, maxObjectsPerGroup); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java index c67412b8..0b11226c 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java @@ -62,40 +62,74 @@ public Builder(String query) { this.query = query; } + /** Select properties to be included in the results scoring. */ public Builder queryProperties(String... properties) { return queryProperties(Arrays.asList(properties)); } + /** Select properties to be included in the results scoring. */ public Builder queryProperties(List properties) { this.queryProperties = properties; return this; } + /** + * Select BM25 + * Search Operator to use. + */ public Builder searchOperator(SearchOperator searchOperator) { this.searchOperator = searchOperator; return this; } + /** + * Apply custom weighting between vector search and keyword search components. + * + *

    + *
  • {@code alpha=1}: Pure BM25 search + *
  • {@code alpha=0}: Pure vector search + *
  • {@code alpha>0.5}: More weight to vector search + *
  • {@code alpha<0.5}: More weight to BM25 search + *
+ */ public Builder alpha(float alpha) { this.alpha = alpha; return this; } + /** + * Select the fusion algorithm for combining + * vector search and keyword search results. + */ public Builder fusionType(FusionType fusionType) { this.fusionType = fusionType; return this; } + /** Set the maximum allowable distance for the vector search component. */ public Builder maxVectorDistance(float maxVectorDistance) { this.maxVectorDistance = maxVectorDistance; return this; } + /** + * Vector search component. + * + * @see NearVector#of(float[]) + * @see NearVector#of(float[], Function) + */ public Builder nearVector(NearVector nearVector) { this.near = nearVector; return this; } + /** + * Vector search component. + * + * @see NearText#of(float[]) + * @see NearText#of(float[], Function) + */ public Builder nearText(NearText nearText) { this.near = nearText; return this; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java index 3573292a..5fc779e4 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java @@ -5,12 +5,19 @@ import io.weaviate.client6.v1.internal.ObjectBuilder; public record QueryMetadata(String uuid, + /** Vector embeddings associated with the object. */ Vectors vectors, + /** Object creation time as a Unix timestamp. */ Long creationTimeUnix, + /** Unix timestamp of the latest object update. */ Long lastUpdateTimeUnix, + /** Distances to the search vector. */ Float distance, + /** Distance metric normalized to 0 <= C <= 1 range. */ Float certainty, + /** BM25 ranking score. */ Float score, + /** Components of the BM25 ranking score. */ String explainScore) implements WeaviateMetadata { private QueryMetadata(Builder builder) { @@ -25,7 +32,7 @@ private QueryMetadata(Builder builder) { builder.explainScore); } - public static class Builder implements ObjectBuilder { + static class Builder implements ObjectBuilder { private String uuid; private Vectors vectors; private Long creationTimeUnix; @@ -35,42 +42,42 @@ public static class Builder implements ObjectBuilder { private Float score; private String explainScore; - public final Builder uuid(String uuid) { + final Builder uuid(String uuid) { this.uuid = uuid; return this; } - public final Builder vectors(Vectors vectors) { + final Builder vectors(Vectors vectors) { this.vectors = vectors; return this; } - public final Builder creationTimeUnix(Long creationTimeUnix) { + final Builder creationTimeUnix(Long creationTimeUnix) { this.creationTimeUnix = creationTimeUnix; return this; } - public final Builder lastUpdateTimeUnix(Long lastUpdateTimeUnix) { + final Builder lastUpdateTimeUnix(Long lastUpdateTimeUnix) { this.lastUpdateTimeUnix = lastUpdateTimeUnix; return this; } - public final Builder distance(Float distance) { + final Builder distance(Float distance) { this.distance = distance; return this; } - public final Builder certainty(Float certainty) { + final Builder certainty(Float certainty) { this.certainty = certainty; return this; } - public final Builder score(Float score) { + final Builder score(Float score) { this.score = score; return this; } - public final Builder explainScore(String explainScore) { + final Builder explainScore(String explainScore) { this.explainScore = explainScore; return this; } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryObjectGrouped.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryObjectGrouped.java index 1000d632..f35f3e82 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryObjectGrouped.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryObjectGrouped.java @@ -3,8 +3,11 @@ import io.weaviate.client6.v1.api.collections.WeaviateObject; public record QueryObjectGrouped( + /** Object properties. */ T properties, + /** Object metadata. */ QueryMetadata metadata, + /** Name of the group that the object belongs to. */ String belongsToGroup) { QueryObjectGrouped(WeaviateObject object, diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryReference.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryReference.java index f0a2c84a..c6aac5a7 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryReference.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryReference.java @@ -29,19 +29,44 @@ public QueryReference(Builder options) { new ArrayList<>(options.returnMetadata)); } + /** + * Retrieve object referenced by a single-target cross-reference property. + * + * @param property Name of the cross-reference property. + */ public static QueryReference single(String property) { return single(property, ObjectBuilder.identity()); } + /** + * Retrieve object referenced by a single-target cross-reference property. + * + * @param property Name of the cross-reference property. + * @param fn Lambda expression for optional parameters. + */ public static QueryReference single(String property, Function> fn) { return fn.apply(new Builder(null, property)).build(); } // TODO: check if we can supply mutiple collections + + /** + * Retrieve object referenced by a multi-target cross-reference property. + * + * @param property Name of the cross-reference property. + * @param collection Name of the target collection. + */ public static QueryReference multi(String property, String collection) { return multi(property, collection, ObjectBuilder.identity()); } + /** + * Retrieve object referenced by a multi-target cross-reference property. + * + * @param property Name of the cross-reference property. + * @param collection Name of the target collection. + * @param fn Lambda expression for optional parameters. + */ public static QueryReference multi(String property, String collection, Function> fn) { return fn.apply(new Builder(collection, property)).build(); @@ -62,38 +87,46 @@ public Builder(String collection, String property) { returnMetadata(MetadataField.UUID); } + /** Select vectors to return for each referenced object. */ public final Builder includeVectors(String... vectors) { this.includeVectors.addAll(Arrays.asList(vectors)); return this; } + /** Select properties to return for each referenced object. */ public final Builder returnProperties(String... properties) { return returnProperties(Arrays.asList(properties)); } + /** Select properties to return for each referenced object. */ public final Builder returnProperties(List properties) { this.returnProperties.addAll(properties); return this; } + /** Select nested references to return for each referenced object. */ public final Builder returnReferences(QueryReference... references) { return returnReferences(Arrays.asList(references)); } + /** Select nested references to return for each referenced object. */ public final Builder returnReferences(List references) { this.returnReferences.addAll(references); return this; } + /** Select metadata to return about each referenced object. */ public final Builder returnMetadata(Metadata... metadata) { return returnMetadata(Arrays.asList(metadata)); } + /** Select metadata to return about each referenced object. */ public final Builder returnMetadata(List metadata) { this.returnMetadata.addAll(metadata); return this; } + /** Include the default vector of the referenced object. */ public final Builder includeVector() { return returnMetadata(Metadata.VECTOR); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGroup.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGroup.java index 178af862..5ad75005 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGroup.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGroup.java @@ -3,9 +3,20 @@ import java.util.List; public record QueryResponseGroup( + /** Group name. */ String name, + /** + * The smallest distance value among all objects in the group, indicating the + * most similar object in that group to the query + */ Float minDistance, + /** + * The largest distance value among all objects in the group, indicating the + * least similar object in that group to the query. + */ Float maxDistance, + /** The size of the group. */ long numberOfObjects, + /** Objects retrieved in the query. */ List> objects) { } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java index 4c938352..9ee8442f 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java @@ -4,6 +4,8 @@ import java.util.Map; public record QueryResponseGrouped( + /** All objects retrieved in the query. */ List> objects, + /** Grouped response objects. */ Map> groups) { } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClient.java index 81a7c11b..d8858845 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClient.java @@ -42,5 +42,4 @@ protected final QueryResponseGrouped performRequest(QueryOperator operator, G var request = new QueryRequest(operator, groupBy); return this.grpcTransport.performRequest(request, QueryRequest.grouped(collection, defaults)); } - } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClientAsync.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClientAsync.java index 0c195e80..a774d0e2 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClientAsync.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/WeaviateQueryClientAsync.java @@ -43,5 +43,4 @@ protected final CompletableFuture> performRequest(QueryO var request = new QueryRequest(operator, groupBy); return this.grpcTransport.performRequestAsync(request, QueryRequest.grouped(collection, defaults)); } - } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/Where.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/Where.java index bde53a69..807f9aa6 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/Where.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/Where.java @@ -94,14 +94,17 @@ public static Where or(List operands) { // Comparison operators return fluid builder. // -------------------------------------------------------------------------- + /** Filter by object UUID. */ public static WhereBuilder uuid() { return property(ById.ID_PROPERTY); } + /** Filter by object property. */ public static WhereBuilder property(String property) { return new WhereBuilder(new PathOperand(property)); } + /** Filter by a property of the referenced object. */ public static WhereBuilder reference(String... path) { return new WhereBuilder(new PathOperand(path)); } diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java index 37385672..25b3c83f 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; +import io.weaviate.client6.v1.api.WeaviateApiException; import io.weaviate.client6.v1.internal.grpc.GrpcTransport; import io.weaviate.client6.v1.internal.orm.CollectionDescriptor; import io.weaviate.client6.v1.internal.rest.RestTransport; @@ -23,71 +24,242 @@ public WeaviateTenantsClient( this.grpcTransport = grpcTransport; } + /** + * Add more tenants to the collection. + * + * @param tenants Tenant configurations. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void create(Tenant... tenants) throws IOException { create(Arrays.asList(tenants)); } + /** + * Add more tenants to the collection. + * + * @param tenants Tenant configurations. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void create(List tenants) throws IOException { this.restTransport.performRequest(new CreateTenantsRequest(tenants), CreateTenantsRequest.endpoint(collection)); } + /** + * Get tenant information. + * + * @param tenant Tenant name. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public Optional get(String tenant) { var tenants = get(List.of(tenant)); return tenants.isEmpty() ? Optional.empty() : Optional.ofNullable(tenants.get(0)); } + /** + * List all existing tenants. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public List list() { return get(); } + /** + * List selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public List get(String... tenants) { return get(Arrays.asList(tenants)); } + /** + * List selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public List get(List tenants) { return this.grpcTransport.performRequest(new GetTenantsRequest(tenants), GetTenantsRequest.rpc(collection)); } + /** + * Update tenant configuration. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void update(Tenant... tenants) throws IOException { update(Arrays.asList(tenants)); } + /** + * Update tenant configuration. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void update(List tenants) throws IOException { this.restTransport.performRequest(new UpdateTenantsRequest(tenants), UpdateTenantsRequest.endpoint(collection)); } + /** + * Delete selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void delete(String... tenants) throws IOException { delete(Arrays.asList(tenants)); } + /** + * Delete selected tenants. + * + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void delete(List tenants) throws IOException { this.restTransport.performRequest(new DeleteTenantsRequest(tenants), DeleteTenantsRequest.endpoint(collection)); } + /** + * Check if such tenant exists. + * + * @param tenant Tenant name. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public boolean exists(String tenant) throws IOException { return this.restTransport.performRequest(new TenantExistsRequest(tenant), TenantExistsRequest.endpoint(collection)); } + /** + * Activate selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void activate(String... tenants) throws IOException { activate(Arrays.asList(tenants)); } + /** + * Activate selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void activate(List tenants) throws IOException { update(tenants.stream().map(Tenant::active).toList()); } + /** + * Deactivate selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void deactivate(String... tenants) throws IOException { deactivate(Arrays.asList(tenants)); } + /** + * Deactivate selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void deactivate(List tenants) throws IOException { update(tenants.stream().map(Tenant::inactive).toList()); } + /** + * Offload selected tenants. + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void offload(String... tenants) throws IOException { offload(Arrays.asList(tenants)); } + /** + * Offload selected tenants. + * + * + * @param tenants Tenant names. + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @throws IOException in case the request was not sent successfully + * due to a malformed request, a networking error + * or the server being unavailable. + */ public void offload(List tenants) throws IOException { update(tenants.stream().map(t -> new Tenant(t, TenantStatus.OFFLOADED)).toList()); } From 2fa2cb14dbf497d9bbf0db8878c19cb305c6b2a5 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Thu, 25 Sep 2025 18:39:42 +0200 Subject: [PATCH 07/13] docs: docuement throws WeaviateException --- .../query/AbstractQueryClient.java | 164 +++++++++++++++++- 1 file changed, 161 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java index 5be2587f..cc6492b3 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/AbstractQueryClient.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.function.Function; +import io.weaviate.client6.v1.api.WeaviateApiException; import io.weaviate.client6.v1.api.collections.CollectionHandleDefaults; import io.weaviate.client6.v1.api.collections.WeaviateObject; import io.weaviate.client6.v1.internal.ObjectBuilder; @@ -37,7 +38,15 @@ abstract class AbstractQueryClient> fn) { // Collection handle defaults (consistencyLevel / tenant) are irrelevant for @@ -73,6 +85,8 @@ protected final Optional> optionalF * Retrieve objects without applying a Vector Search or Keyword Search filter. * * @param fn Lambda expression for optional parameters. + * @throws WeaviateApiException in case the server returned with an + * error status code. */ public ResponseT fetchObjects(Function> fn) { return fetchObjects(FetchObjects.of(fn)); @@ -82,6 +96,8 @@ public ResponseT fetchObjects(Function> fn) { return bm25(Bm25.of(query, fn)); @@ -142,6 +166,8 @@ public ResponseT bm25(String query, Function> * Query collection objects using keyword (BM25) search. * * @param query BM25 query request. + * @throws WeaviateApiException in case the server returned with an + * error status code. */ public ResponseT bm25(Bm25 query) { return performRequest(query); @@ -153,6 +179,8 @@ public ResponseT bm25(Bm25 query) { * @param query Query string. * @param groupBy Group-by clause. * @return Grouped query result. + * @throws WeaviateApiException in case the server returned with an + * error status code. * * @see GroupBy * @see QueryResponseGrouped @@ -168,6 +196,8 @@ public GroupedResponseT bm25(String query, GroupBy groupBy) { * @param fn Lambda expression for optional parameters. * @param groupBy Group-by clause. * @return Grouped query result. + * @throws WeaviateApiException in case the server returned with an + * error status code. * * @see GroupBy * @see QueryResponseGrouped @@ -182,6 +212,8 @@ public GroupedResponseT bm25(String query, Function> fn) { return hybrid(Hybrid.of(query, fn)); @@ -215,6 +251,8 @@ public ResponseT hybrid(String query, Function> fn) { return nearVector(NearVector.of(vector, fn)); @@ -288,6 +336,8 @@ public ResponseT nearVector(float[] vector, Function> fn) { return nearObject(NearObject.of(uuid, fn)); @@ -362,6 +422,8 @@ public ResponseT nearObject(String uuid, Function> fn) { return nearText(NearText.of(text, fn)); @@ -437,6 +509,8 @@ public ResponseT nearText(String text, Function text, Function> fn) { return nearText(NearText.of(text, fn)); @@ -446,6 +520,8 @@ public ResponseT nearText(List text, Function text, GroupBy groupBy) { * @param fn Lambda expression for optional parameters. * @param groupBy Group-by clause. * @return Grouped query result. + * @throws WeaviateApiException in case the server returned with an + * error status code. * * @see GroupBy * @see QueryResponseGrouped @@ -502,6 +584,8 @@ public GroupedResponseT nearText(String text, Function text, Function> fn) { return nearImage(NearImage.of(image, fn)); @@ -550,6 +640,8 @@ public ResponseT nearImage(String image, Function> fn) { return nearAudio(NearAudio.of(audio, fn)); @@ -624,6 +726,8 @@ public ResponseT nearAudio(String audio, Function> fn) { return nearVideo(NearVideo.of(video, fn)); @@ -699,6 +813,8 @@ public ResponseT nearVideo(String video, Function> fn) { return nearThermal(NearThermal.of(thermal, fn)); @@ -773,6 +899,8 @@ public ResponseT nearThermal(String thermal, Function> fn) { return nearDepth(NearDepth.of(depth, fn)); @@ -847,6 +985,8 @@ public ResponseT nearDepth(String depth, Function> fn) { return nearImu(NearImu.of(imu, fn)); @@ -921,6 +1071,8 @@ public ResponseT nearImu(String imu, Function Date: Thu, 25 Sep 2025 18:50:39 +0200 Subject: [PATCH 08/13] chore: fix javadoc formatting --- .../v1/api/collections/query/BaseVectorSearchBuilder.java | 2 +- .../weaviate/client6/v1/api/collections/query/Hybrid.java | 6 ++---- .../client6/v1/api/collections/query/QueryMetadata.java | 6 ++++-- .../v1/api/collections/tenants/WeaviateTenantsClient.java | 6 ------ 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java index 1cb8bc10..afc96d33 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java @@ -24,7 +24,7 @@ public SelfT distance(float distance) { /** * Discard objects whose vectors are further away * from the target vector than the threshold according - * to a normalized (0 <= c <= 0) distance. + * to a normalized ({@code 0 <= c <= 0}) distance. * *

* Certainty is only meaningful for {@code cosine} distance. diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java index 0b11226c..dc5ef608 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/Hybrid.java @@ -116,8 +116,7 @@ public Builder maxVectorDistance(float maxVectorDistance) { /** * Vector search component. * - * @see NearVector#of(float[]) - * @see NearVector#of(float[], Function) + * @see NearVector#of */ public Builder nearVector(NearVector nearVector) { this.near = nearVector; @@ -127,8 +126,7 @@ public Builder nearVector(NearVector nearVector) { /** * Vector search component. * - * @see NearText#of(float[]) - * @see NearText#of(float[], Function) + * @see NearText#of */ public Builder nearText(NearText nearText) { this.near = nearText; diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java index 5fc779e4..25f8f676 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/query/QueryMetadata.java @@ -4,7 +4,9 @@ import io.weaviate.client6.v1.api.collections.WeaviateMetadata; import io.weaviate.client6.v1.internal.ObjectBuilder; -public record QueryMetadata(String uuid, +public record QueryMetadata( + /** Object UUID. */ + String uuid, /** Vector embeddings associated with the object. */ Vectors vectors, /** Object creation time as a Unix timestamp. */ @@ -13,7 +15,7 @@ public record QueryMetadata(String uuid, Long lastUpdateTimeUnix, /** Distances to the search vector. */ Float distance, - /** Distance metric normalized to 0 <= C <= 1 range. */ + /** Distance metric normalized to {@code 0 <= c <= 1} range. */ Float certainty, /** BM25 ranking score. */ Float score, diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java index 25b3c83f..fadb596d 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/tenants/WeaviateTenantsClient.java @@ -58,7 +58,6 @@ public void create(List tenants) throws IOException { * @param tenant Tenant name. * @throws WeaviateApiException in case the server returned with an * error status code. - * @throws IOException in case the request was not sent successfully * due to a malformed request, a networking error * or the server being unavailable. */ @@ -72,7 +71,6 @@ public Optional get(String tenant) { * * @throws WeaviateApiException in case the server returned with an * error status code. - * @throws IOException in case the request was not sent successfully * due to a malformed request, a networking error * or the server being unavailable. */ @@ -86,7 +84,6 @@ public List list() { * @param tenants Tenant names. * @throws WeaviateApiException in case the server returned with an * error status code. - * @throws IOException in case the request was not sent successfully * due to a malformed request, a networking error * or the server being unavailable. */ @@ -100,9 +97,6 @@ public List get(String... tenants) { * @param tenants Tenant names. * @throws WeaviateApiException in case the server returned with an * error status code. - * @throws IOException in case the request was not sent successfully - * due to a malformed request, a networking error - * or the server being unavailable. */ public List get(List tenants) { return this.grpcTransport.performRequest(new GetTenantsRequest(tenants), GetTenantsRequest.rpc(collection)); From 93a66323a7c10951ca2af1ff5f2898571e607e9f Mon Sep 17 00:00:00 2001 From: dyma solovei <53943884+bevzzz@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:13:48 +0200 Subject: [PATCH 09/13] chore: format README.md --- README.md | 168 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 117 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index ce2187b5..9886c901 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Official Weaviate Java Client. > [!IMPORTANT] -> `client6` does not support many of the legacy features supported in other clients. Ensure your instance is running at least v1.32 to avoid compatibility issues. +> `client6` does not support many of the legacy features supported in other clients. Ensure your instance is running at least `v1.32` to avoid compatibility issues. ## Usage @@ -125,7 +125,7 @@ songs.query.hybrid( ); ``` -Notice how the type of each lambda argument can be automatically deduced from the methods' signatures. This allows the autocomplete to correctly suggest possible arguments, guiding you through the query API.The builder itself is "tucked" in the method's internals, so you needn't remember how to access or import it. What's more, the code reads a lot more like a query thanks to improved [locality](https://htmx.org/essays/locality-of-behaviour/). As you'll see in the examples below, you can also get creative with naming the lambda argument to act as hint for future readers. +Notice how the type of each lambda argument can be automatically deduced from the methods' signatures. This allows the autocomplete to correctly suggest possible arguments, guiding you through the query API. The builder itself is "tucked" in the method's internals, so you needn't remember how to access or import it. What's more, the code reads a lot more like a query thanks to improved [locality](https://htmx.org/essays/locality-of-behaviour/). As you'll see in the examples below, you can also get creative with naming the lambda argument to act as hint for future readers. In real-world programs there will be cases where you need to inject some control-flow statements in the query builder code. Consider an example of limiting the number of query results based on some external value, such as a URL query paramter. Lambda expressions are fully-fledged functions, so you could add a if-statement right in the middle of it: @@ -138,7 +138,7 @@ songs.query.hybrid("rainbow", h -> { }); ``` -This may get out of hand quickly if complex logic is involved. Or you may simply prefer the standard Builder pattern. Whichever's the case, `client6` has got you covered, as "tucked" builders are public members of the classes they build, and can be used directly: +This may get out of hand quickly if complex logic is involved. Or you may simply prefer the standard Builder pattern. Whichever's the case, `client6` has got you covered. Tucked builders are public members of the classes they build, so they can be used directly. ```java Hybrid.Builder builder = new Hybrid.Builder("rainbow"); @@ -151,13 +151,11 @@ if (limitURL != null) { songs.query.hybrid(/* Hybrid */ builder.build()); ``` -Finally, if you need to separate "query definition" from "performing the query", most objects provide two static factories: one with required arguments and one with required aruments and a tucked builder. +Finally, if you need to separate "query definition" from "performing the query", most objects provide two static factories: one with only the required arguments and one with the required aruments and a tucked builder. ```java Hybrid requiredOnly = Hybrid.of("rainbow"); Hybrid withOptional = Hybrid.of("rainbow", opt -> opt.limit(10)); - -songs.query.hybrid(withOptional); ``` ### Connecting to a Weaviate instance @@ -182,29 +180,38 @@ WeaviateClient local = WeaviateClient.connectToLocal(local -> local.port(9090)); WeaviateClient wcd = WeaviateClient.connectToWeaviateCloud("my-cluster-url.io", "my-api-key"); ``` -The client holds a number of resources (HTTP connection pools, gRPC channel) which must be disposed of correclty then they are no longer needed. -If the client's lifecycle is tied to that of your app, closing the client via `client.close()` is a good way to do that. - -Otherwise, it is a good idea to use the client inside a [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) statement: - -```java -try (final var client = new WeaviateClient(config)) { - // Do something with the client -} -``` -WeaviateClient will be automatically closed when execution exits the block. +> [!TIP] +> The client holds a number of resources (HTTP connection pools, gRPC channel) which must be disposed of correclty then they are no longer needed. +> If the client's lifecycle is tied to that of your app, closing the client via `client.close()` is a good way to do that. +> +> Otherwise, use the client inside a [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) statement: +> +>```java +> try (final var client = new WeaviateClient(config)) { +> // Do something with the client +> } +> ``` +> WeaviateClient will be automatically closed when execution exits the block. #### Authentication Weaviate supports several authentication methods: -| Method | Client API reference | -| ------- | ------------------------------------------------------------------------------- | +| Method | Client API reference | +| ----------------------- | --------------------------------------------------------------- | | API Key | `Authentication.apiKey("my-api-key")` | | Resource owner password | `Authentication.resourceOwnerPassword("username", "password")` | | Client credentials | `Authentication.clientCredentials("clientKey", "clientSecret")` | | Existing bearer token | `Authentication.apiKey("access-token", "refresh-token", 900)` | +Pass the preferred authentication method as an argument to the connection builder to use it in the client: + +```java +WeaviateClient.connectToCustom( + conn -> conn.authentication(Authentication.apiKey("my-api-key") +); +``` + Follow the [documentation](https://docs.weaviate.io/deploy/configuration/authentication) for a detailed discussion. ### Collection management @@ -244,14 +251,14 @@ Other methods in `collections` namespace include: #### Using a Collection Handle -Once a collection is created, you can obtain another client object (a "handle") that's scoped to that collection. +Once a collection is created, you can obtain another client object that's scoped to that collection, called a _"handle"_. ```java CollectionHandle> songs = client.collections.use("Songs"); ``` Using the handle, we can ingest new data into the collection and query it, as well as modify the configuration. -The handle object is thread safe and, although lightweight, is best created once and shared across threads / callers. +The handle object is thread safe. Although lightweight, it is best created once and shared across threads / callers. ```java // Bad: creates a new CollectionHandle object for each iteration, strains the GC unnecessarily. @@ -269,11 +276,12 @@ For the rest of the document, assume `songs` is handle for the "Songs" collectio #### Generic `PropertiesT` -Weaviate client lets you insert object properties in different "shapes". The compile-time type in which the properties must be passed is determied by a generic paramter in CollectionHandle object. +Weaviate client lets you insert object properties in different "shapes". The compile-time type in which the properties must be passed is determined by a generic paramter in CollectionHandle object. By defalt, the value for this parameter is `Map`. That allows you to think of your data as JSON objects with some additional metadata (vector embedding, UUID, certainty score, etc.). -In practice this means that whenever data needs to be inserted, you need to pass an instance of `Map` and whenever it is queried, the properties are deserialized into a `Map`. -If you prefer stricter typing, you can leverage our built-in ORM to work with properties as custom Java types. We will return to this in the **ORM** section later. Assume for now that properties are being passed around as an "untyped" map. +In practice this means you'll be passing an instance of `Map` to insert a new object and receive its properties as `Map` when the collection is queried. + +If you prefer stricter typing, you can leverage our built-in ORM to work with properties as custom Java types. We will return to this in the **ORM** section later. Assume for now that properties are always being passed around as an "untyped" map. ### Ingesting data @@ -282,7 +290,11 @@ Data operations are concentrated behind the `.data` namespace. #### Insert single object ```java -var yellowSubmarine = songs.data.insert(Map.of("title", "Yellow Submarine", "lyrics", "...", "year", 1969); +var yellowSubmarine = songs.data.insert(Map.of( + "title", "Yellow Submarine", + "lyrics", "In the town where I was born...", + "year", 1969 +)); System.out.println("Inserted new song at "+ yellowSubmarine.metadata().createdAt()); System.out.println("Yellow Submarine uuid="+ yellowSubmarine.uuid()); ``` @@ -290,13 +302,20 @@ System.out.println("Yellow Submarine uuid="+ yellowSubmarine.uuid()); You can supply your own UUID and vector embedding: ```java -songs.data.insert(Map.of(...), obj -> obj.uuid("valid-custom-uuid").vectors(Vectors.of("title_vec", new float[]{...}))); +songs.data.insert( + Map.of(...), + obj -> obj + .uuid("valid-custom-uuid") + .vectors(Vectors.of("title_vec", new float[]{...})) +); ``` +#### `Vectors`? + Weaviate supports 1-dimensional and multi-dimensional vector embeddings, thanks to ColBERT-family modules. The associated vector can be `float[] | float[][]`. -Because Java does not support unions of primitive types, we define an abstraction called `Vectors` which is a container type for object's vector embeddings. +As Java does not have unions of primitive types, we define an abstraction called `Vectors` which is a container type for object's vector embeddings. -Creating a new vector object is simple: +Creating a new vector is simple: - `Vectors.of(new float[]{...})`: default 1-d vector - `Vectors.of("custom_1d", new float[]{...})`: 1-d vector with a custom name @@ -317,7 +336,7 @@ float[][] v = vectors.getMulti("custom_2d"); // 2-d vector with a custom name #### Batch insert > [!NOTE] -> Support for Dynamic Batching in `client6` will be added once Server-Side Batching becomes GA in Weaviate (est. v1.34) +> Support for Dynamic Batching in `client6` will be added once Server-Side Batching becomes GA in Weaviate (est. `v1.34`) ```java InsertManyResponse response = songs.data.insertMany( @@ -328,7 +347,10 @@ InsertManyResponse response = songs.data.insertMany( if (!response.errors().isEmpty()) { throw new RuntimeException(String.join(", ", response.errors())); } -System.out.println("Inserted %d objects, took: %.2fs".formatted(response.reponses().size(), response.took())); +System.out.println( + "Inserted %d objects, took: %.2fs" + .formatted(response.reponses().size(), response.took()) +); ``` To supply your own UUID and vector embedding when inserting multiple objects wrap each obejct in `WeaviateObject.of(...)`: @@ -357,9 +379,21 @@ q -> q.returnMetadata(Metadata.SCORE, Metadata.EXPLAIN_SCORE) #### Semantic search ```java -songs.query.nearVector(new float[]{...}, nv -> nv.distance(.3f)); -songs.query.nearText("a song about weather", nt -> nt.moveAway(.6f, from -> from.concepts("summertime"))); -songs.query.nearObject(yellowSubmarine.uuid(), nobj -> nobj.excludeSelf()); +songs.query.nearVector( + new float[]{...}, + nv -> nv.distance(.3f) +); + +songs.query.nearText( + "a song about weather", + nt -> nt.moveAway(.6f, from -> from.concepts("summertime")) +); + +songs.query.nearObject( + yellowSubmarine.uuid(), + nobj -> nobj.excludeSelf() +); + songs.query.nearImage("base64-encoded-image"); // Other "near-media" methods available: nearVideo, nearAudio, nearDepth, nearImu, nearThermal ``` @@ -370,7 +404,10 @@ songs.query.nearImage("base64-encoded-image"); #### Keyword and Hybrid search ```java -songs.query.bm25("rain", bm25 -> bm25.queryProeperties("lyrics")); +songs.query.bm25( + "rain", + bm25 -> bm25.queryProeperties("lyrics") +); songs.query.hybrid( "rain", @@ -423,9 +460,9 @@ Operators passed in subsequent calls to `.where` are concatenated with the `.and These 3 calls are equivalent: ```java -q -> q.where(Where.and(cond1, cond2)) -q -> q.where(cond1, cond2) -q -> q.where(cond1).where(cond2) +.where(Where.and(cond1, cond2)) +.where(cond1, cond2) +.where(cond1).where(cond2) ``` Passing `null` and and empty `Where[]` to any of the logical operators as well as to the `.where()` method is safe -- the empty operators will simply be ignored. @@ -435,15 +472,26 @@ Passing `null` and and empty `Where[]` to any of the logical operators as well a Every query above has an overloaded variant that accepts a group-by clause. ```java -songs.query.nearVector(new float[]{...}, GroupBy.property("artist", 10, 100)); // Required arguments + GroupBy -songs.query.bm25("rain", bm25 -> bm25.queryProperties("lyrics"), GroupBy.property("artist", 10, 100)); // Required argument, optional parameters, GroupBy +// Required arguments + GroupBy +songs.query.nearVector( + new float[]{...}, + GroupBy.property("artist", 10, 100) +); + +// Required argument, optional parameters, GroupBy +songs.query.bm25( + "rain", + bm25 -> bm25.queryProperties("lyrics"), + GroupBy.property("artist", 10, 100) +); ``` The shape of the response object is different too, see [`QueryResponseGrouped`](./src/main/java/io/weaviate/client6/v1/api/collections/query/QueryResponseGrouped.java). ### Pagination -Paginating a Weaviate collection is straighforward and the API should is instantly familiar. `CursorSpliterator` powers 2 patterns for iterating over objects: +Paginating a Weaviate collection is straighforward and its API should is instantly familiar. `CursorSpliterator` powers 2 patterns for iterating over objects: + - the default Paginator object returned by `collection.paginate()` implements Iterable that can be used in a traditional for-loop - `.stream()` presents the internal Spliterator via an idiomatic Stream API @@ -464,7 +512,7 @@ Paginator can be configured to return a subset of properties / metadata fields, // Create a paginator var allSongs = things.paginate( p -> p - .pageSize(10) + .pageSize(500) .resumeFrom("uuid-3") .returnProperties("artist", "album") .returnMetadata(Metadata.VECTOR)); @@ -531,7 +579,8 @@ To query the total object count in a collection use `songs.size()` shorthand. The client throws exceptions extending `WeaviateException`, which can be used as a catch-all case for any package-related exceptions. Other exception types, such as `IOException` which may be thrown by the underlying HTTP / gRPC libraries are allowed to propagate, as they usually signal different kinds of errors: malformed URL, network problems, etc. -`WeaviateException` is an **unchecked exception**. +> [!WARNING] +> `WeaviateException` is an **unchecked exception**. ```java try (final var client = WeaviateClient.connectToLocal()) { @@ -549,6 +598,7 @@ Concrete exception types: - `WeaviateOAuthException` - Error during OAuth credentials exchange. - `WeaviateTransportException` - Internal transport layer exception. + ### ORM Weaviate client comes with a minimal ORM, which lets you serialize and deserialize object properties into Java **records**. Moreover, the client can create a collection based on the record's declared fields. @@ -570,6 +620,7 @@ record Song( ``` By default, the class and field names map to the collection and property names respectively. The `@Collection` and `@Property` annotations can be used to override those defaults. + To create the collection, pass the class definition to `.create`. ```java @@ -583,21 +634,27 @@ client.collections.create( Ingestion and search work the same way, but will accept / return `Song.class` instances instead of `Map`. ```java -Song trust = new Song("Bad", "...", "Michael Jackson", 1987, ...); +Song bad = new Song("Bad", "...", "Michael Jackson", 1987, ...); Song badGuy = new Song("Bad Guy", "...", "Billie Eilish", 2019, ...); Song crown = new Song("You Should See Me in a Crown", "...", "Billie Eilish", 2019, ...); -songs.data.insert(trust); +songs.data.insert(bad); songs.data.insertMany(badGuy, crown); -var result = songs.query.bm25("bad", opt -> opt.queryProperties("lyrics").returnProperties("artist")); +var result = songs.query.bm25( + "bad", + opt -> opt + .queryProperties("lyrics") + .returnProperties("artist") +); -for (var song : result.objects()) { - System.out.println(song.properties().artist()); +for (var object : result.objects()) { + Song song = object.properties(); + System.out.println(song.artist()); } ``` -We want to stress that this ORM's focus is on improving type-safety around object properties and simplifying de-/serialization. The ORM is intentionally kept minimal and as such has the following limitations: +We want to stress that this ORM's focus is on improving type-safety around object properties and simplifying serialization/deserialization. It is intentionally kept minimal and as such has the following limitations: - **Does not support BLOB properties.** On the wire, blob properties are represented as base64-encoded strings, and both logically map to the Java's `String`. Presently there isn't a good way for the client to deduce which property type should be created, so it always maps `Sting -> TEXT`. - **Limited configuration options.** Vector indices, replication, multi-tenancy, and such need to be configured via a tucked builder in `.create(..., here -> here)`. @@ -608,14 +665,23 @@ record Artist(String firstName, String lastName, int age) {}; record Song(String title, Artist artist) {}; -var song1 = songs.query.byId(uuid1, song -> song.returnReferences(QueryReference.single("artist"))); -System.out.println("Artist's last name is: " + song1.properties().artist().lastName()); +var song1 = songs.query.byId( + uuid1, + song -> song.returnReferences(QueryReference.single("artist")) +); +System.out.println( + "Artist's last name is: " + + song1.properties().artist().lastName() +); ``` Instead you'd work with cross-references same way as without the ORM: ```java -System.out.println("Artist's last name is: " + song1.references().get("artist").properties().get("lastName")); +System.out.println( + "Artist's last name is: " + + song1.references().get("artist").properties().get("lastName") +); ``` Some of these features may be added in future releases. From 9ecad87facfc20892b6219aa430a23e524e80a46 Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Fri, 26 Sep 2025 13:25:33 +0200 Subject: [PATCH 10/13] docs: write javadoc for aggregations --- .../aggregate/AbstractAggregateClient.java | 957 +++++++++++++++++- .../api/collections/pagination/Paginator.java | 1 + 2 files changed, 902 insertions(+), 56 deletions(-) diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/aggregate/AbstractAggregateClient.java b/src/main/java/io/weaviate/client6/v1/api/collections/aggregate/AbstractAggregateClient.java index 6c6db167..c082ff70 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/aggregate/AbstractAggregateClient.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/aggregate/AbstractAggregateClient.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.function.Function; +import io.weaviate.client6.v1.api.WeaviateApiException; import io.weaviate.client6.v1.api.collections.CollectionHandleDefaults; import io.weaviate.client6.v1.api.collections.query.Hybrid; import io.weaviate.client6.v1.api.collections.query.NearAudio; @@ -44,39 +45,139 @@ abstract class AbstractAggregateClient { // OverAll ------------------------------------------------------------------ + /** + * Aggregate metrics over all objects in this collection. + * + * @param fn Lambda expression for optional parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT overAll(Function> fn) { return performRequest(Aggregation.of(fn)); } + /** + * Aggregate metrics over all objects in this collection. + * + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT overAll(Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(fn), groupBy); } // Hybrid ------------------------------------------------------------------- + /** + * Aggregate results of a hybrid search query. + * + * @param query Query string. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT hybrid(String query, Function> fn) { return hybrid(Hybrid.of(query), fn); } - public ResponseT hybrid(String query, Function> nv, + /** + * Aggregate results of a hybrid search query. + * + * @param query Query string. + * @param hybrid Lambda expression for optional hybrid search parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT hybrid(String query, Function> hybrid, Function> fn) { - return hybrid(Hybrid.of(query, nv), fn); - } - + return hybrid(Hybrid.of(query, hybrid), fn); + } + + /** + * Aggregate results of a hybrid search query. + * + * @param filter Hybrid query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT hybrid(Hybrid filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a hybrid search query. + * + * @param query Query string. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT hybrid(String query, Function> fn, GroupBy groupBy) { return hybrid(Hybrid.of(query), fn, groupBy); } - public GroupedResponseT hybrid(String query, Function> nv, + /** + * Aggregate results of a hybrid search query. + * + * @param query Query string. + * @param hybrid Lambda expression for optional hybrid search parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT hybrid(String query, Function> hybrid, Function> fn, GroupBy groupBy) { - return hybrid(Hybrid.of(query, nv), fn, groupBy); - } - + return hybrid(Hybrid.of(query, hybrid), fn, groupBy); + } + + /** + * Aggregate results of a hybrid search query. + * + * @param filter Hybrid query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT hybrid(Hybrid filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -84,29 +185,106 @@ public GroupedResponseT hybrid(Hybrid filter, Function> fn) { return nearVector(NearVector.of(vector), fn); } + /** + * Aggregate results of a near vector query. + * + * @param vector Query vector. + * @param nv Lambda expression for optional near vector parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearVector(float[] vector, Function> nv, Function> fn) { return nearVector(NearVector.of(vector, nv), fn); } + /** + * Aggregate results of a near vector query. + * + * @param filter Near vector query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearVector(NearVector filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near vector query. + * + * @param vector Query vector. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearVector(float[] vector, Function> fn, GroupBy groupBy) { return nearVector(NearVector.of(vector), fn, groupBy); } + /** + * Aggregate results of a near vector query. + * + * @param vector Query vector. + * @param nv Lambda expression for optional near vector parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearVector(float[] vector, Function> nv, Function> fn, GroupBy groupBy) { return nearVector(NearVector.of(vector, nv), fn, groupBy); } + /** + * Aggregate results of a near vector query. + * + * @param filter Near vector query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearVector(NearVector filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -114,29 +292,106 @@ public GroupedResponseT nearVector(NearVector filter, Function> fn) { return nearObject(NearObject.of(uuid), fn); } - public ResponseT nearObject(String uuid, Function> nv, + /** + * Aggregate results of a near object query. + * + * @param uuid Query object UUID. + * @param nobj Lambda expression for optional near object parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT nearObject(String uuid, Function> nobj, Function> fn) { - return nearObject(NearObject.of(uuid, nv), fn); - } - + return nearObject(NearObject.of(uuid, nobj), fn); + } + + /** + * Aggregate results of a near object query. + * + * @param filter Near object query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearObject(NearObject filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near object query. + * + * @param uuid Query object UUID. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearObject(String uuid, Function> fn, GroupBy groupBy) { return nearObject(NearObject.of(uuid), fn, groupBy); } - public GroupedResponseT nearObject(String uuid, Function> nv, + /** + * Aggregate results of a near object query. + * + * @param uuid Query object UUID. + * @param nobj Lambda expression for optional near object parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT nearObject(String uuid, Function> nobj, Function> fn, GroupBy groupBy) { - return nearObject(NearObject.of(uuid, nv), fn, groupBy); - } - + return nearObject(NearObject.of(uuid, nobj), fn, groupBy); + } + + /** + * Aggregate results of a near object query. + * + * @param filter Near object query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearObject(NearObject filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -144,48 +399,176 @@ public GroupedResponseT nearObject(NearObject filter, Function> fn) { return nearText(NearText.of(text), fn); } + /** + * Aggregate results of a near text query. + * + * @param concepts Query concepts. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearText(List concepts, Function> fn) { return nearText(NearText.of(concepts), fn); } + /** + * Aggregate results of a near text query. + * + * @param text Query string. + * @param nt Lambda expression for optional near text parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearText(String text, Function> nt, Function> fn) { return nearText(NearText.of(text, nt), fn); } + /** + * Aggregate results of a near text query. + * + * @param concepts Query concepts. + * @param nt Lambda expression for optional near text parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearText(List concepts, Function> nt, Function> fn) { return nearText(NearText.of(concepts, nt), fn); } + /** + * Aggregate results of a near text query. + * + * @param filter Near text query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + */ public ResponseT nearText(NearText filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near text query. + * + * @param text Query string. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearText(String text, Function> fn, GroupBy groupBy) { return nearText(NearText.of(text), fn, groupBy); } + /** + * Aggregate results of a near text query. + * + * @param concepts Query concepts. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearText(List concepts, Function> fn, GroupBy groupBy) { return nearText(NearText.of(concepts), fn, groupBy); } + /** + * Aggregate results of a near text query. + * + * @param text Query string. + * @param nt Lambda expression for optional near text parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearText(String text, Function> nt, Function> fn, GroupBy groupBy) { return nearText(NearText.of(text, nt), fn, groupBy); } + /** + * Aggregate results of a near text query. + * + * @param concepts Query concepts. + * @param nt Lambda expression for optional near text parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearText(List concepts, Function> nt, Function> fn, GroupBy groupBy) { return nearText(NearText.of(concepts, nt), fn, groupBy); } + /** + * Aggregate results of a near text query. + * + * @param filter Near text query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearText(NearText filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -193,29 +576,106 @@ public GroupedResponseT nearText(NearText filter, Function> fn) { return nearImage(NearImage.of(image), fn); } - public ResponseT nearImage(String image, Function> nv, + /** + * Aggregate results of a near image query. + * + * @param image Query image. + * @param ni Lambda expression for optional near image parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT nearImage(String image, Function> ni, Function> fn) { - return nearImage(NearImage.of(image, nv), fn); - } - + return nearImage(NearImage.of(image, ni), fn); + } + + /** + * Aggregate results of a near image query. + * + * @param filter Near image query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearImage(NearImage filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near image query. + * + * @param image Query image. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearImage(String image, Function> fn, GroupBy groupBy) { return nearImage(NearImage.of(image), fn, groupBy); } - public GroupedResponseT nearImage(String image, Function> nv, + /** + * Aggregate results of a near image query. + * + * @param image Query image. + * @param ni Lambda expression for optional near image parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT nearImage(String image, Function> ni, Function> fn, GroupBy groupBy) { - return nearImage(NearImage.of(image, nv), fn, groupBy); - } - + return nearImage(NearImage.of(image, ni), fn, groupBy); + } + + /** + * Aggregate results of a near image query. + * + * @param filter Near image query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearImage(NearImage filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -223,29 +683,106 @@ public GroupedResponseT nearImage(NearImage filter, Function> fn) { return nearAudio(NearAudio.of(audio), fn); } - public ResponseT nearAudio(String audio, Function> nv, + /** + * Aggregate results of a near audio query. + * + * @param audio Query audio. + * @param na Lambda expression for optional near audio parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT nearAudio(String audio, Function> na, Function> fn) { - return nearAudio(NearAudio.of(audio, nv), fn); - } - + return nearAudio(NearAudio.of(audio, na), fn); + } + + /** + * Aggregate results of a near audio query. + * + * @param filter Near audio query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearAudio(NearAudio filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near audio query. + * + * @param audio Query audio. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearAudio(String audio, Function> fn, GroupBy groupBy) { return nearAudio(NearAudio.of(audio), fn, groupBy); } - public GroupedResponseT nearAudio(String audio, Function> nv, + /** + * Aggregate results of a near audio query. + * + * @param audio Query audio. + * @param na Lambda expression for optional near audio parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT nearAudio(String audio, Function> na, Function> fn, GroupBy groupBy) { - return nearAudio(NearAudio.of(audio, nv), fn, groupBy); - } - + return nearAudio(NearAudio.of(audio, na), fn, groupBy); + } + + /** + * Aggregate results of a near audio query. + * + * @param filter Near audio query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearAudio(NearAudio filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -253,29 +790,106 @@ public GroupedResponseT nearAudio(NearAudio filter, Function> fn) { return nearVideo(NearVideo.of(video), fn); } + /** + * Aggregate results of a near video query. + * + * @param video Query video. + * @param nv Lambda expression for optional near video parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearVideo(String video, Function> nv, Function> fn) { return nearVideo(NearVideo.of(video, nv), fn); } + /** + * Aggregate results of a near video query. + * + * @param filter Near video query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearVideo(NearVideo filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near video query. + * + * @param video Query video. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearVideo(String video, Function> fn, GroupBy groupBy) { return nearVideo(NearVideo.of(video), fn, groupBy); } + /** + * Aggregate results of a near video query. + * + * @param video Query video. + * @param nv Lambda expression for optional near video parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearVideo(String video, Function> nv, Function> fn, GroupBy groupBy) { return nearVideo(NearVideo.of(video, nv), fn, groupBy); } + /** + * Aggregate results of a near video query. + * + * @param filter Near video query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearVideo(NearVideo filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -283,29 +897,106 @@ public GroupedResponseT nearVideo(NearVideo filter, Function> fn) { return nearThermal(NearThermal.of(thermal), fn); } - public ResponseT nearThermal(String thermal, Function> nv, + /** + * Aggregate results of a near thermal query. + * + * @param thermal Query thermal. + * @param nt Lambda expression for optional near thermal parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT nearThermal(String thermal, Function> nt, Function> fn) { - return nearThermal(NearThermal.of(thermal, nv), fn); - } - + return nearThermal(NearThermal.of(thermal, nt), fn); + } + + /** + * Aggregate results of a near thermal query. + * + * @param filter Near thermal query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearThermal(NearThermal filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near thermal query. + * + * @param thermal Query thermal. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearThermal(String thermal, Function> fn, GroupBy groupBy) { return nearThermal(NearThermal.of(thermal), fn, groupBy); } - public GroupedResponseT nearThermal(String thermal, Function> nv, + /** + * Aggregate results of a near thermal query. + * + * @param thermal Query thermal. + * @param nt Lambda expression for optional near thermal parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT nearThermal(String thermal, Function> nt, Function> fn, GroupBy groupBy) { - return nearThermal(NearThermal.of(thermal, nv), fn, groupBy); - } - + return nearThermal(NearThermal.of(thermal, nt), fn, groupBy); + } + + /** + * Aggregate results of a near thermal query. + * + * @param filter Near thermal query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearThermal(NearThermal filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -313,29 +1004,106 @@ public GroupedResponseT nearThermal(NearThermal filter, Function> fn) { return nearDepth(NearDepth.of(depth), fn); } - public ResponseT nearDepth(String depth, Function> nv, + /** + * Aggregate results of a near depth query. + * + * @param depth Query depth. + * @param nd Lambda expression for optional near depth parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT nearDepth(String depth, Function> nd, Function> fn) { - return nearDepth(NearDepth.of(depth, nv), fn); - } - + return nearDepth(NearDepth.of(depth, nd), fn); + } + + /** + * Aggregate results of a near depth query. + * + * @param filter Near depth query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearDepth(NearDepth filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near depth query. + * + * @param depth Query depth. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearDepth(String depth, Function> fn, GroupBy groupBy) { return nearDepth(NearDepth.of(depth), fn, groupBy); } - public GroupedResponseT nearDepth(String depth, Function> nv, + /** + * Aggregate results of a near depth query. + * + * @param depth Query depth. + * @param nd Lambda expression for optional near depth parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT nearDepth(String depth, Function> nd, Function> fn, GroupBy groupBy) { - return nearDepth(NearDepth.of(depth, nv), fn, groupBy); - } - + return nearDepth(NearDepth.of(depth, nd), fn, groupBy); + } + + /** + * Aggregate results of a near depth query. + * + * @param filter Near depth query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearDepth(NearDepth filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); @@ -343,29 +1111,106 @@ public GroupedResponseT nearDepth(NearDepth filter, Function> fn) { return nearImu(NearImu.of(imu), fn); } - public ResponseT nearImu(String imu, Function> nv, + /** + * Aggregate results of a near IMU query. + * + * @param imu Query IMU. + * @param ni Lambda expression for optional near IMU parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ + public ResponseT nearImu(String imu, Function> ni, Function> fn) { - return nearImu(NearImu.of(imu, nv), fn); - } - + return nearImu(NearImu.of(imu, ni), fn); + } + + /** + * Aggregate results of a near IMU query. + * + * @param filter Near IMU query request. + * @param fn Lambda expression for optional aggregation parameters. + * @return Aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * @see AggregateResponse + */ public ResponseT nearImu(NearImu filter, Function> fn) { return performRequest(Aggregation.of(filter, fn)); } + /** + * Aggregate results of a near IMU query. + * + * @param imu Query IMU. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearImu(String imu, Function> fn, GroupBy groupBy) { return nearImu(NearImu.of(imu), fn, groupBy); } - public GroupedResponseT nearImu(String imu, Function> nv, + /** + * Aggregate results of a near IMU query. + * + * @param imu Query IMU. + * @param ni Lambda expression for optional near IMU parameters. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ + public GroupedResponseT nearImu(String imu, Function> ni, Function> fn, GroupBy groupBy) { - return nearImu(NearImu.of(imu, nv), fn, groupBy); - } - + return nearImu(NearImu.of(imu, ni), fn, groupBy); + } + + /** + * Aggregate results of a near IMU query. + * + * @param filter Near IMU query request. + * @param fn Lambda expression for optional aggregation parameters. + * @param groupBy GroupBy clause. + * @return Grouped aggregation result. + * + * @throws WeaviateApiException in case the server returned with an + * error status code. + * + * @see GroupBy + * @see AggregateResponseGrouped + */ public GroupedResponseT nearImu(NearImu filter, Function> fn, GroupBy groupBy) { return performRequest(Aggregation.of(filter, fn), groupBy); diff --git a/src/main/java/io/weaviate/client6/v1/api/collections/pagination/Paginator.java b/src/main/java/io/weaviate/client6/v1/api/collections/pagination/Paginator.java index dfc7c90c..7d7dcb6f 100644 --- a/src/main/java/io/weaviate/client6/v1/api/collections/pagination/Paginator.java +++ b/src/main/java/io/weaviate/client6/v1/api/collections/pagination/Paginator.java @@ -74,6 +74,7 @@ public Builder(WeaviateQueryClient query) { // Pagination options ----------------------------------------------------- + /** Set a different page size. Defaults to 100. */ public Builder pageSize(int pageSize) { this.pageSize = pageSize; return this; From 542327432c6c7fdd47ccb508b3b7feae8ef33af9 Mon Sep 17 00:00:00 2001 From: dyma solovei <53943884+bevzzz@users.noreply.github.com> Date: Fri, 26 Sep 2025 16:16:33 +0200 Subject: [PATCH 11/13] docs: document logical operators (And, Or, Not) --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 9886c901..20a3385c 100644 --- a/README.md +++ b/README.md @@ -437,6 +437,7 @@ Supported **comparison operators**: - Like: `.like` - ContainsAll: `.containsAll` - ContainsAny: `.containsAny` +- ContainsNone: `.containsNone` - WithinGeoRange: `.withinGeoRange` Comparison operators can be grouped using **logical operators** with arbitrarily deep nesting. @@ -456,6 +457,12 @@ Comparison operators can be grouped using **logical operators** with arbitrarily ) ``` +Supported **logical operators**: + +- And: `.and` +- Or: `.or` +- Not: `.not` + Operators passed in subsequent calls to `.where` are concatenated with the `.and` operartor. These 3 calls are equivalent: @@ -465,6 +472,13 @@ These 3 calls are equivalent: .where(cond1).where(cond2) ``` +To negate an operator, wrap it in `Where.not(...)` or use the negation shorthand. + +```java +Where.not(Where.property("title").like("summer")); +Where.property("title").like("summer").not(); +``` + Passing `null` and and empty `Where[]` to any of the logical operators as well as to the `.where()` method is safe -- the empty operators will simply be ignored. #### Grouping results From 6346026326418cdce17f4820967938775bb322ca Mon Sep 17 00:00:00 2001 From: dyma solovei Date: Fri, 26 Sep 2025 16:26:49 +0200 Subject: [PATCH 12/13] chore: add new logo --- assets/duke-client6.png | Bin 0 -> 243567 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/duke-client6.png diff --git a/assets/duke-client6.png b/assets/duke-client6.png new file mode 100644 index 0000000000000000000000000000000000000000..f6974dfd3091816dfa83111d6737a53360c403f9 GIT binary patch literal 243567 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%0A=`ZeB90Nx3hnd0yy7)WmY5WmGYd>hvY*v+ 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 Am%UcdSeO4T{Nkfo==9M!RykpA|?2Nk!JFA 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�gP!A6sW6{U9)PW{58r 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 Wz}PnJ+q`cWfWXt$&t;ucLK6VU%YyCz literal 0 HcmV?d00001 From bb09b02ab1c69603346d9c0eae4c87a557cac257 Mon Sep 17 00:00:00 2001 From: dyma solovei <53943884+bevzzz@users.noreply.github.com> Date: Fri, 26 Sep 2025 16:30:07 +0200 Subject: [PATCH 13/13] docs: add temp new logo Credits to ChatGPT --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20a3385c..c613ba6b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Weaviate Java client Weaviate logo +# Weaviate Java client Weaviate logo [![Build Status](https://github.com/weaviate/java-client/actions/workflows/.github/workflows/test.yaml/badge.svg?branch=main)](https://github.com/weaviate/java-client/actions/workflows/.github/workflows/test.yaml)