Skip to content

Commit 08106d4

Browse files
committed
feat: add data.update method
1 parent 78d4fe7 commit 08106d4

3 files changed

Lines changed: 139 additions & 1 deletion

File tree

src/it/java/io/weaviate/integration/DataITest.java

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.weaviate.client6.v1.api.collections.WeaviateObject;
1616
import io.weaviate.client6.v1.api.collections.data.Reference;
1717
import io.weaviate.client6.v1.api.collections.query.Metadata;
18+
import io.weaviate.client6.v1.api.collections.query.QueryMetadata;
1819
import io.weaviate.client6.v1.api.collections.query.QueryReference;
1920
import io.weaviate.client6.v1.api.collections.vectorindex.Hnsw;
2021
import io.weaviate.client6.v1.api.collections.vectorizers.NoneVectorizer;
@@ -180,9 +181,73 @@ public void testReferences_AddReplaceDelete() throws IOException {
180181

181182
@Test
182183
public void testReplace() {
184+
// Replace (PUT):
185+
// properties, reference, vectors
183186
}
184187

185188
@Test
186-
public void testUpdate() {
189+
public void testUpdate() throws IOException {
190+
// Arrange
191+
var nsBooks = ns("Books");
192+
var nsAuthors = ns("Authors");
193+
194+
client.collections.create(nsAuthors,
195+
collection -> collection
196+
.properties(Property.text("name")));
197+
198+
client.collections.create(nsBooks,
199+
collection -> collection
200+
.properties(Property.text("title"), Property.integer("year"))
201+
.references(Property.reference("writtenBy", nsAuthors))
202+
.vector(Hnsw.of(new NoneVectorizer())));
203+
204+
var authors = client.collections.use(nsAuthors);
205+
var walter = authors.data.insert(Map.of("name", "walter scott"));
206+
207+
var vector = new Float[] { 1f, 2f, 3f };
208+
209+
var books = client.collections.use(nsBooks);
210+
211+
// Add 1 book without mentioning its author, year published,
212+
// or supplying a vector.
213+
var ivanhoe = books.data.insert(Map.of("title", "ivanhoe"));
214+
215+
// Act
216+
books.data.update(ivanhoe.metadata().uuid(),
217+
update -> update
218+
.properties(Map.of("year", 1819))
219+
.reference("writtenBy", Reference.objects(walter))
220+
.vectors(Vectors.of(vector)));
221+
222+
// Assert
223+
var updIvanhoe = books.query.byId(
224+
ivanhoe.metadata().uuid(),
225+
query -> query
226+
.returnMetadata(Metadata.VECTOR)
227+
.returnReferences(
228+
QueryReference.single("writtenBy",
229+
writtenBy -> writtenBy.returnMetadata(Metadata.ID))));
230+
231+
Assertions.assertThat(updIvanhoe).get()
232+
.satisfies(book -> {
233+
Assertions.assertThat(book)
234+
.as("has year property")
235+
.extracting(WeaviateObject::properties, InstanceOfAssertFactories.MAP)
236+
.contains(Map.entry("year", 1819L));
237+
238+
Assertions.assertThat(book)
239+
.as("has reference to Authors")
240+
.extracting(WeaviateObject::references, InstanceOfAssertFactories.MAP)
241+
.extractingByKey("writtenBy", InstanceOfAssertFactories.list(WeaviateObject.class))
242+
.first()
243+
.extracting(WeaviateObject::properties, InstanceOfAssertFactories.MAP)
244+
.contains(Map.entry("name", "walter scott"));
245+
246+
Assertions.assertThat(book)
247+
.as("has a vector")
248+
.extracting(WeaviateObject::metadata)
249+
.extracting(QueryMetadata::vectors)
250+
.returns(vector, Vectors::getDefaultSingle);
251+
});
187252
}
188253
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.weaviate.client6.v1.api.collections.data;
2+
3+
import java.util.Collections;
4+
import java.util.function.Function;
5+
6+
import com.google.gson.reflect.TypeToken;
7+
8+
import io.weaviate.client6.v1.api.collections.ObjectMetadata;
9+
import io.weaviate.client6.v1.api.collections.Vectors;
10+
import io.weaviate.client6.v1.api.collections.WeaviateObject;
11+
import io.weaviate.client6.v1.internal.ObjectBuilder;
12+
import io.weaviate.client6.v1.internal.json.JSON;
13+
import io.weaviate.client6.v1.internal.orm.CollectionDescriptor;
14+
import io.weaviate.client6.v1.internal.rest.Endpoint;
15+
16+
public record UpdateObjectRequest<T>(WeaviateObject<T, Reference, ObjectMetadata> object) {
17+
18+
static final <T> Endpoint<UpdateObjectRequest<T>, Void> endpoint(CollectionDescriptor<T> collectionDescriptor) {
19+
return Endpoint.of(
20+
request -> "PATCH",
21+
request -> "/objects/" + collectionDescriptor.name() + "/" + request.object.metadata().uuid(),
22+
(gson, request) -> JSON.serialize(request.object, TypeToken.getParameterized(
23+
WeaviateObject.class, collectionDescriptor.typeToken().getType(), Reference.class, ObjectMetadata.class)),
24+
request -> Collections.emptyMap(),
25+
code -> code != 204,
26+
(gson, response) -> null);
27+
}
28+
29+
public static <T> UpdateObjectRequest<T> of(String uuid,
30+
Function<UpdateObjectRequest.Builder<T>, ObjectBuilder<UpdateObjectRequest<T>>> fn) {
31+
return fn.apply(new Builder<>(uuid)).build();
32+
}
33+
34+
public UpdateObjectRequest(Builder<T> builder) {
35+
this(builder.object.build());
36+
}
37+
38+
public static class Builder<T> implements ObjectBuilder<UpdateObjectRequest<T>> {
39+
private final WeaviateObject.Builder<T, Reference, ObjectMetadata> object = new WeaviateObject.Builder<>();
40+
private final ObjectMetadata.Builder metadata = new ObjectMetadata.Builder();
41+
42+
public Builder(String uuid) {
43+
this.metadata.uuid(uuid);
44+
}
45+
46+
public Builder<T> properties(T properties) {
47+
this.object.properties(properties);
48+
return this;
49+
}
50+
51+
public Builder<T> vectors(Vectors vectors) {
52+
this.metadata.vectors(vectors);
53+
return this;
54+
}
55+
56+
public Builder<T> reference(String property, Reference... references) {
57+
this.object.reference(property, references);
58+
return this;
59+
}
60+
61+
@Override
62+
public UpdateObjectRequest<T> build() {
63+
this.object.metadata(this.metadata.build());
64+
return new UpdateObjectRequest<>(this);
65+
}
66+
}
67+
}

src/main/java/io/weaviate/client6/v1/api/collections/data/WeaviateDataClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public boolean exists(String uuid) throws IOException {
4141
return this.query.byId(uuid).isPresent();
4242
}
4343

44+
public void update(String uuid, Function<UpdateObjectRequest.Builder<T>, ObjectBuilder<UpdateObjectRequest<T>>> fn)
45+
throws IOException {
46+
this.restTransport.performRequest(UpdateObjectRequest.of(uuid, fn),
47+
UpdateObjectRequest.endpoint(collectionDescriptor));
48+
}
49+
4450
public void delete(String uuid) throws IOException {
4551
this.restTransport.performRequest(new DeleteObjectRequest(collectionDescriptor.name(), uuid),
4652
DeleteObjectRequest._ENDPOINT);

0 commit comments

Comments
 (0)