Skip to content

Commit 430397d

Browse files
committed
refactor: use dedicated WriteWeaviateObject in .data operations
1 parent ce5d733 commit 430397d

12 files changed

Lines changed: 337 additions & 277 deletions

File tree

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void testBlobData() throws IOException {
9999
"breed", "ragdoll",
100100
"img", ragdollPng));
101101

102-
var got = cats.query.byId(ragdoll.metadata().uuid(),
102+
var got = cats.query.byId(ragdoll.uuid(),
103103
cat -> cat.returnProperties("img"));
104104

105105
Assertions.assertThat(got).get()
@@ -140,12 +140,12 @@ public void testReferences_AddReplaceDelete() throws IOException {
140140

141141
// Act: add reference
142142
persons.data.referenceAdd(
143-
john.metadata().uuid(),
143+
john.uuid(),
144144
"hasFriend",
145145
Reference.object(albie));
146146

147147
// Assert
148-
var johnWithFriends = persons.query.byId(john.metadata().uuid(),
148+
var johnWithFriends = persons.query.byId(john.uuid(),
149149
query -> query.returnReferences(
150150
QueryReference.single("hasFriend",
151151
friend -> friend.returnProperties("name"))));
@@ -161,11 +161,11 @@ public void testReferences_AddReplaceDelete() throws IOException {
161161
// Act: replace reference
162162
var barbara = persons.data.insert(Map.of("name", "barbara"));
163163
persons.data.referenceReplace(
164-
john.metadata().uuid(),
164+
john.uuid(),
165165
"hasFriend",
166166
Reference.object(barbara));
167167

168-
johnWithFriends = persons.query.byId(john.metadata().uuid(),
168+
johnWithFriends = persons.query.byId(john.uuid(),
169169
query -> query.returnReferences(
170170
QueryReference.single("hasFriend",
171171
friend -> friend.returnProperties("name"))));
@@ -180,12 +180,12 @@ public void testReferences_AddReplaceDelete() throws IOException {
180180

181181
// Act: delete reference
182182
persons.data.referenceDelete(
183-
john.metadata().uuid(),
183+
john.uuid(),
184184
"hasFriend",
185185
Reference.object(barbara));
186186

187187
// Assert
188-
johnWithFriends = persons.query.byId(john.metadata().uuid(),
188+
johnWithFriends = persons.query.byId(john.uuid(),
189189
query -> query.returnReferences(
190190
QueryReference.single("hasFriend")));
191191

@@ -210,11 +210,11 @@ public void testReplace() throws IOException {
210210
var ivanhoe = books.data.insert(Map.of("title", "ivanhoe"));
211211

212212
// Act
213-
books.data.replace(ivanhoe.metadata().uuid(),
213+
books.data.replace(ivanhoe.uuid(),
214214
replace -> replace.properties(Map.of("year", 1819)));
215215

216216
// Assert
217-
var replacedIvanhoe = books.query.byId(ivanhoe.metadata().uuid());
217+
var replacedIvanhoe = books.query.byId(ivanhoe.uuid());
218218

219219
Assertions.assertThat(replacedIvanhoe).get()
220220
.as("has ONLY year property")
@@ -251,15 +251,15 @@ public void testUpdate() throws IOException {
251251
var ivanhoe = books.data.insert(Map.of("title", "ivanhoe"));
252252

253253
// Act
254-
books.data.update(ivanhoe.metadata().uuid(),
254+
books.data.update(ivanhoe.uuid(),
255255
update -> update
256256
.properties(Map.of("year", 1819))
257257
.reference("writtenBy", Reference.objects(walter))
258258
.vectors(Vectors.of(vector)));
259259

260260
// Assert
261261
var updIvanhoe = books.query.byId(
262-
ivanhoe.metadata().uuid(),
262+
ivanhoe.uuid(),
263263
query -> query
264264
.includeVector()
265265
.returnReferences(QueryReference.single("writtenBy")));
@@ -298,8 +298,8 @@ public void testDeleteMany() throws IOException {
298298

299299
var things = client.collections.use(nsThings);
300300
things.data.insert(Map.of("last_used", 1));
301-
var delete_1 = things.data.insert(Map.of("last_used", 5)).metadata().uuid();
302-
var delete_2 = things.data.insert(Map.of("last_used", 9)).metadata().uuid();
301+
var delete_1 = things.data.insert(Map.of("last_used", 5)).uuid();
302+
var delete_2 = things.data.insert(Map.of("last_used", 9)).uuid();
303303

304304
// Act (dry run)
305305
things.data.deleteMany(
@@ -387,7 +387,7 @@ public void testReferenceAddMany() throws IOException {
387387
// Assert
388388
Assertions.assertThat(response.errors()).isEmpty();
389389

390-
var goodburgAirports = cities.query.byId(goodburg.metadata().uuid(),
390+
var goodburgAirports = cities.query.byId(goodburg.uuid(),
391391
city -> city.returnReferences(
392392
QueryReference.single("hasAirports")));
393393

src/main/java/io/weaviate/client6/v1/api/collections/ObjectMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public record ObjectMetadata(
1111
@SerializedName("id") String uuid,
1212
@SerializedName("vectors") Vectors vectors,
1313
@SerializedName("creationTimeUnix") Long createdAt,
14-
@SerializedName("lastUpdateTImeUnix") Long lastUpdatedAt) implements WeaviateMetadata {
14+
@SerializedName("lastUpdateTimeUnix") Long lastUpdatedAt) implements WeaviateMetadata {
1515

1616
public ObjectMetadata(Builder builder) {
1717
this(builder.uuid, builder.vectors, null, null);

src/main/java/io/weaviate/client6/v1/api/collections/Vectors.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ public Vectors(Vectors... vectors) {
8181
this.vectorsMap = namedVectors;
8282
}
8383

84+
/**
85+
* Add more vector objects.
86+
*
87+
* @param vectors Vector objects.
88+
* @return A new {@code Vectors} object containing all vectors.
89+
*/
90+
public Vectors withVectors(Vectors... vectors) {
91+
var combined = new HashMap<>(vectorsMap);
92+
for (var v : vectors) {
93+
combined.putAll(v.vectorsMap);
94+
}
95+
return new Vectors(combined);
96+
}
97+
8498
/**
8599
* Check if a vector exists in the query result.
86100
*
@@ -90,6 +104,11 @@ public boolean contains(String name) {
90104
return vectorsMap.containsKey(name);
91105
}
92106

107+
/** Returns the number of vectors contained. */
108+
public int size() {
109+
return vectorsMap.size();
110+
}
111+
93112
/**
94113
* Get 1-dimensional vector by name.
95114
*

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,24 @@
77
import com.google.gson.stream.JsonReader;
88
import com.google.gson.stream.JsonWriter;
99

10-
import io.weaviate.client6.v1.api.collections.WeaviateObject;
10+
import io.weaviate.client6.v1.api.collections.IWeaviateObject;
1111

1212
public record BatchReference(String fromCollection, String fromProperty, String fromUuid, Reference reference) {
1313

14-
public static BatchReference[] objects(WeaviateObject<?, ?, ?> fromObject, String fromProperty,
15-
WeaviateObject<?, ?, ?>... toObjects) {
14+
public static BatchReference[] objects(IWeaviateObject fromObject, String fromProperty,
15+
IWeaviateObject... toObjects) {
1616
return Arrays.stream(toObjects)
1717
.map(to -> new BatchReference(
18-
fromObject.collection(), fromProperty, fromObject.metadata().uuid(),
18+
fromObject.collection(), fromProperty, fromObject.uuid(),
1919
Reference.object(to)))
2020
.toArray(BatchReference[]::new);
2121
}
2222

23-
public static BatchReference[] uuids(WeaviateObject<?, ?, ?> fromObject, String fromProperty,
23+
public static BatchReference[] uuids(IWeaviateObject fromObject, String fromProperty,
2424
String... toUuids) {
2525
return Arrays.stream(toUuids)
2626
.map(to -> new BatchReference(
27-
fromObject.collection(), fromProperty, fromObject.metadata().uuid(),
27+
fromObject.collection(), fromProperty, fromObject.uuid(),
2828
Reference.uuids(to)))
2929
.toArray(BatchReference[]::new);
3030
}

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

Lines changed: 51 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99

1010
import io.weaviate.client6.v1.api.collections.CollectionHandleDefaults;
1111
import io.weaviate.client6.v1.api.collections.GeoCoordinates;
12-
import io.weaviate.client6.v1.api.collections.ObjectMetadata;
1312
import io.weaviate.client6.v1.api.collections.PhoneNumber;
14-
import io.weaviate.client6.v1.api.collections.WeaviateObject;
1513
import io.weaviate.client6.v1.internal.MapUtil;
1614
import io.weaviate.client6.v1.internal.grpc.ByteStringUtil;
1715
import io.weaviate.client6.v1.internal.grpc.Rpc;
@@ -22,25 +20,25 @@
2220
import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateProtoBatch;
2321
import io.weaviate.client6.v1.internal.orm.CollectionDescriptor;
2422

25-
public record InsertManyRequest<T>(List<WeaviateObject<T, Reference, ObjectMetadata>> objects) {
23+
public record InsertManyRequest<PropertiesT>(List<WriteWeaviateObject<PropertiesT>> objects) {
2624

2725
@SafeVarargs
28-
public InsertManyRequest(WeaviateObject<T, Reference, ObjectMetadata>... objects) {
26+
public InsertManyRequest(WriteWeaviateObject<PropertiesT>... objects) {
2927
this(Arrays.asList(objects));
3028
}
3129

30+
@SuppressWarnings("unchecked")
3231
@SafeVarargs
33-
public static final <T> InsertManyRequest<T> of(T... properties) {
32+
public static final <PropertiesT> InsertManyRequest<PropertiesT> of(PropertiesT... properties) {
3433
var objects = Arrays.stream(properties)
35-
.map(p -> WeaviateObject.<T, Reference, ObjectMetadata>of(
36-
obj -> obj.properties(p).metadata(ObjectMetadata.of())))
34+
.map(p -> (WriteWeaviateObject<PropertiesT>) WriteWeaviateObject.of(obj -> obj.properties(p)))
3735
.toList();
38-
return new InsertManyRequest<T>(objects);
36+
return new InsertManyRequest<>(objects);
3937
}
4038

41-
public static <T> Rpc<InsertManyRequest<T>, WeaviateProtoBatch.BatchObjectsRequest, InsertManyResponse, WeaviateProtoBatch.BatchObjectsReply> rpc(
42-
List<WeaviateObject<T, Reference, ObjectMetadata>> insertObjects,
43-
CollectionDescriptor<T> collection,
39+
public static <PropertiesT> Rpc<InsertManyRequest<PropertiesT>, WeaviateProtoBatch.BatchObjectsRequest, InsertManyResponse, WeaviateProtoBatch.BatchObjectsReply> rpc(
40+
List<WriteWeaviateObject<PropertiesT>> insertObjects,
41+
CollectionDescriptor<PropertiesT> collection,
4442
CollectionHandleDefaults defaults) {
4543
return Rpc.insert(
4644
request -> {
@@ -75,8 +73,8 @@ public static <T> Rpc<InsertManyRequest<T>, WeaviateProtoBatch.BatchObjectsReque
7573
while (iter.hasNext()) {
7674
var idx = iter.nextIndex();
7775
var next = iter.next();
78-
var uuid = next.metadata() != null ? next.metadata().uuid() : null;
7976

77+
var uuid = next.uuid();
8078
if (failed.containsKey(idx)) {
8179
var err = failed.get(idx);
8280
errors.add(err);
@@ -94,72 +92,62 @@ public static <T> Rpc<InsertManyRequest<T>, WeaviateProtoBatch.BatchObjectsReque
9492
}
9593

9694
public static <T> void buildObject(WeaviateProtoBatch.BatchObject.Builder object,
97-
WeaviateObject<T, Reference, ObjectMetadata> insert,
95+
WriteWeaviateObject<T> insert,
9896
CollectionDescriptor<T> collection,
9997
CollectionHandleDefaults defaults) {
10098
object.setCollection(collection.collectionName());
10199

102-
var metadata = insert.metadata();
103-
if (metadata != null) {
104-
object.setUuid(metadata.uuid());
105-
106-
if (metadata.vectors() != null) {
107-
var vectors = metadata.vectors().asMap()
108-
.entrySet().stream().map(entry -> {
109-
var value = entry.getValue();
110-
var vector = WeaviateProtoBase.Vectors.newBuilder()
111-
.setName(entry.getKey());
112-
113-
if (value instanceof float[] single) {
114-
vector.setType(VectorType.VECTOR_TYPE_SINGLE_FP32);
115-
vector.setVectorBytes(ByteStringUtil.encodeVectorSingle(single));
116-
} else if (value instanceof float[][] multi) {
117-
vector.setVectorBytes(ByteStringUtil.encodeVectorMulti(multi));
118-
vector.setType(VectorType.VECTOR_TYPE_MULTI_FP32);
119-
}
120-
121-
return vector.build();
122-
}).toList();
123-
object.addAllVectors(vectors);
124-
}
125-
if (defaults.tenant() != null) {
126-
object.setTenant(defaults.tenant());
127-
}
100+
object.setUuid(insert.uuid());
101+
102+
if (insert.vectors() != null) {
103+
var vectors = insert.vectors().asMap()
104+
.entrySet().stream().map(entry -> {
105+
var value = entry.getValue();
106+
var vector = WeaviateProtoBase.Vectors.newBuilder()
107+
.setName(entry.getKey());
108+
109+
if (value instanceof float[] single) {
110+
vector.setType(VectorType.VECTOR_TYPE_SINGLE_FP32);
111+
vector.setVectorBytes(ByteStringUtil.encodeVectorSingle(single));
112+
} else if (value instanceof float[][] multi) {
113+
vector.setVectorBytes(ByteStringUtil.encodeVectorMulti(multi));
114+
vector.setType(VectorType.VECTOR_TYPE_MULTI_FP32);
115+
}
116+
117+
return vector.build();
118+
}).toList();
119+
object.addAllVectors(vectors);
120+
}
121+
if (defaults.tenant() != null) {
122+
object.setTenant(defaults.tenant());
128123
}
129124

130125
var singleRef = new ArrayList<WeaviateProtoBatch.BatchObject.SingleTargetRefProps>();
131126
var multiRef = new ArrayList<WeaviateProtoBatch.BatchObject.MultiTargetRefProps>();
132127

133-
insert.references()
134-
.entrySet().stream().forEach(entry -> {
135-
var references = entry.getValue();
136-
137-
// dyma: How are we supposed to know if the reference
138-
// is single- or multi-target?
139-
for (var ref : references) {
140-
if (ref.collection() == null) {
141-
singleRef.add(
142-
WeaviateProtoBatch.BatchObject.SingleTargetRefProps.newBuilder()
143-
.addAllUuids(ref.uuids())
144-
.setPropName(entry.getKey())
145-
.build());
146-
} else {
147-
multiRef.add(
148-
WeaviateProtoBatch.BatchObject.MultiTargetRefProps.newBuilder()
149-
.setTargetCollection(ref.collection())
150-
.addAllUuids(ref.uuids())
151-
.setPropName(entry.getKey())
152-
.build());
153-
}
154-
}
155-
});
128+
insert.references().entrySet().stream().forEach(entry -> {
129+
var references = entry.getValue();
130+
131+
// dyma: How are we supposed to know if the reference
132+
// is single- or multi-target?
133+
for (var ref : references) {
134+
if (ref.collection() == null) {
135+
singleRef.add(WeaviateProtoBatch.BatchObject.SingleTargetRefProps.newBuilder().addAllUuids(ref.uuids())
136+
.setPropName(entry.getKey()).build());
137+
} else {
138+
multiRef.add(WeaviateProtoBatch.BatchObject.MultiTargetRefProps.newBuilder()
139+
.setTargetCollection(ref.collection()).addAllUuids(ref.uuids()).setPropName(entry.getKey()).build());
140+
}
141+
}
142+
});
156143

157144
var properties = WeaviateProtoBatch.BatchObject.Properties.newBuilder()
158145
.addAllSingleTargetRefProps(singleRef)
159146
.addAllMultiTargetRefProps(multiRef);
160147

161148
if (insert.properties() != null) {
162-
var nonRef = marshalStruct(collection.propertiesReader(insert.properties()).readProperties());
149+
var nonRef = marshalStruct(collection.propertiesReader(insert.properties())
150+
.readProperties());
163151
properties.setNonRefProperties(nonRef);
164152
}
165153
object.setProperties(properties);

0 commit comments

Comments
 (0)