Skip to content

Commit 65c634e

Browse files
authored
Merge pull request #387 from weaviate/v6-async-rest
- Refactored HTTP-based endpoints to encapsulate request data in separate records and logic for building requests in Endpoint. - Created type adapters for classes that require custom serialization (CustomTypeAdapterFactory.INSTANCE) - Use a single static Gson instance under JSON.java -- it is thread-safe and keeps all configuration in one place. - Added Async counterparts for each client: WeaviateClient -> WeaviateDataClient, WeaviateClientAsync -> WeaviateDataClientAsync - Declare 3 generic parameters in WeaviateObject: P - properties, R - references, M - metadata. - Fixed missing default argument in Aggregation.Builder which prevented running aggregation queries without requesting any metrics.
2 parents 931dd73 + e469e87 commit 65c634e

108 files changed

Lines changed: 2789 additions & 2733 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/it/java/io/weaviate/containers/Container.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import org.testcontainers.containers.Network;
1111
import org.testcontainers.lifecycle.Startable;
1212

13-
import io.weaviate.client6.WeaviateClient;
13+
import io.weaviate.client6.v1.api.WeaviateClient;
1414
import lombok.RequiredArgsConstructor;
1515

1616
public class Container {

src/it/java/io/weaviate/containers/Weaviate.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
import org.testcontainers.weaviate.WeaviateContainer;
1111

12-
import io.weaviate.client6.Config;
13-
import io.weaviate.client6.WeaviateClient;
12+
import io.weaviate.client6.v1.api.Config;
13+
import io.weaviate.client6.v1.api.WeaviateClient;
1414

1515
public class Weaviate extends WeaviateContainer {
1616
private WeaviateClient clientInstance;

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@
1212
import org.junit.Test;
1313

1414
import io.weaviate.ConcurrentTest;
15-
import io.weaviate.client6.WeaviateClient;
15+
import io.weaviate.client6.v1.api.WeaviateClient;
16+
import io.weaviate.client6.v1.api.collections.Property;
1617
import io.weaviate.client6.v1.api.collections.Vectors;
1718
import io.weaviate.client6.v1.api.collections.aggregate.AggregateResponseGroup;
1819
import io.weaviate.client6.v1.api.collections.aggregate.AggregateResponseGrouped;
1920
import io.weaviate.client6.v1.api.collections.aggregate.Aggregation;
2021
import io.weaviate.client6.v1.api.collections.aggregate.GroupBy;
2122
import io.weaviate.client6.v1.api.collections.aggregate.GroupedBy;
2223
import io.weaviate.client6.v1.api.collections.aggregate.IntegerAggregation;
23-
import io.weaviate.client6.v1.collections.Property;
24-
import io.weaviate.client6.v1.collections.VectorIndex;
25-
import io.weaviate.client6.v1.collections.Vectorizer;
24+
import io.weaviate.client6.v1.api.collections.vectorindex.Hnsw;
25+
import io.weaviate.client6.v1.api.collections.vectorizers.NoneVectorizer;
2626
import io.weaviate.containers.Container;
2727

2828
public class AggregationITest extends ConcurrentTest {
@@ -36,7 +36,7 @@ public static void beforeAll() throws IOException {
3636
.properties(
3737
Property.text("category"),
3838
Property.integer("price"))
39-
.vectors(io.weaviate.client6.v1.collections.Vectors.of(new VectorIndex<>(Vectorizer.none()))));
39+
.vector(Hnsw.of(new NoneVectorizer())));
4040

4141
var things = client.collections.use(COLLECTION);
4242
for (var category : List.of("Shoes", "Hat", "Jacket")) {

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,12 @@
77
import org.junit.Test;
88

99
import io.weaviate.ConcurrentTest;
10-
import io.weaviate.client6.WeaviateClient;
11-
import io.weaviate.client6.v1.collections.Collection;
12-
import io.weaviate.client6.v1.collections.NoneVectorizer;
13-
import io.weaviate.client6.v1.collections.Property;
14-
import io.weaviate.client6.v1.collections.VectorIndex;
15-
import io.weaviate.client6.v1.collections.VectorIndex.IndexType;
16-
import io.weaviate.client6.v1.collections.VectorIndex.IndexingStrategy;
17-
import io.weaviate.client6.v1.collections.Vectorizer;
18-
import io.weaviate.client6.v1.collections.Vectors;
10+
import io.weaviate.client6.v1.api.WeaviateClient;
11+
import io.weaviate.client6.v1.api.collections.Property;
12+
import io.weaviate.client6.v1.api.collections.VectorIndex;
13+
import io.weaviate.client6.v1.api.collections.WeaviateCollection;
14+
import io.weaviate.client6.v1.api.collections.vectorindex.Hnsw;
15+
import io.weaviate.client6.v1.api.collections.vectorizers.NoneVectorizer;
1916
import io.weaviate.containers.Container;
2017

2118
public class CollectionsITest extends ConcurrentTest {
@@ -27,18 +24,19 @@ public void testCreateGetDelete() throws IOException {
2724
client.collections.create(collectionName,
2825
col -> col
2926
.properties(Property.text("username"), Property.integer("age"))
30-
.vector(new VectorIndex<>(IndexingStrategy.hnsw(), Vectorizer.none())));
27+
.vector(Hnsw.of(new NoneVectorizer())));
3128

3229
var thingsCollection = client.collections.getConfig(collectionName);
3330

3431
Assertions.assertThat(thingsCollection).get()
3532
.hasFieldOrPropertyWithValue("name", collectionName)
36-
.extracting(Collection::vectors).extracting(Vectors::getDefault)
37-
.as("default vector").satisfies(defaultVector -> {
33+
.extracting(WeaviateCollection::vectors, InstanceOfAssertFactories.map(String.class, VectorIndex.class))
34+
.as("default vector").extractingByKey("default")
35+
.satisfies(defaultVector -> {
3836
Assertions.assertThat(defaultVector).extracting(VectorIndex::vectorizer)
3937
.as("has none vectorizer").isInstanceOf(NoneVectorizer.class);
40-
Assertions.assertThat(defaultVector).extracting(VectorIndex::configuration)
41-
.as("has hnsw index").returns(IndexType.HNSW, IndexingStrategy::type);
38+
Assertions.assertThat(defaultVector).extracting(VectorIndex::config)
39+
.isInstanceOf(Hnsw.class);
4240
});
4341

4442
client.collections.delete(collectionName);

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

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@
99
import org.junit.Test;
1010

1111
import io.weaviate.ConcurrentTest;
12-
import io.weaviate.client6.WeaviateClient;
12+
import io.weaviate.client6.v1.api.WeaviateClient;
13+
import io.weaviate.client6.v1.api.collections.Property;
1314
import io.weaviate.client6.v1.api.collections.Vectors;
14-
import io.weaviate.client6.v1.collections.Property;
15-
import io.weaviate.client6.v1.collections.VectorIndex;
16-
import io.weaviate.client6.v1.collections.VectorIndex.IndexingStrategy;
17-
import io.weaviate.client6.v1.collections.Vectorizer;
15+
import io.weaviate.client6.v1.api.collections.WeaviateObject;
16+
import io.weaviate.client6.v1.api.collections.vectorindex.Hnsw;
17+
import io.weaviate.client6.v1.api.collections.vectorizers.NoneVectorizer;
1818
import io.weaviate.containers.Container;
1919

2020
public class DataITest extends ConcurrentTest {
21-
2221
private static WeaviateClient client = Container.WEAVIATE.getClient();
2322
private static final String COLLECTION = unique("Artists");
2423
private static final String VECTOR_INDEX = "bring_your_own";
@@ -34,9 +33,10 @@ public void testCreateGetDelete() throws IOException {
3433
var id = randomUUID();
3534
Float[] vector = { 1f, 2f, 3f };
3635

37-
artists.data.insert(Map.of("name", "john doe"), metadata -> metadata
38-
.id(id)
39-
.vectors(Vectors.of(VECTOR_INDEX, vector)));
36+
artists.data.insert(Map.of("name", "john doe"),
37+
metadata -> metadata
38+
.uuid(id)
39+
.vectors(Vectors.of(VECTOR_INDEX, vector)));
4040

4141
var object = artists.query.byId(id, query -> query
4242
.returnProperties("name")
@@ -45,11 +45,10 @@ public void testCreateGetDelete() throws IOException {
4545
Assertions.assertThat(object)
4646
.as("object exists after insert").get()
4747
.satisfies(obj -> {
48-
Assertions.assertThat(obj.metadata().id())
48+
Assertions.assertThat(obj.metadata().uuid())
4949
.as("object id").isEqualTo(id);
5050

51-
Assertions.assertThat(obj.metadata().vectors()).extracting(Vectors::getSingle)
52-
.asInstanceOf(InstanceOfAssertFactories.OPTIONAL).as("has single vector").get()
51+
Assertions.assertThat(obj.metadata().vectors()).extracting(v -> v.getSingle(VECTOR_INDEX))
5352
.asInstanceOf(InstanceOfAssertFactories.array(Float[].class)).containsExactly(vector);
5453

5554
Assertions.assertThat(obj.properties())
@@ -77,11 +76,11 @@ public void testBlobData() throws IOException {
7776
"breed", "ragdoll",
7877
"img", ragdollPng));
7978

80-
var got = cats.query.byId(ragdoll.metadata().id(),
79+
var got = cats.query.byId(ragdoll.metadata().uuid(),
8180
cat -> cat.returnProperties("img"));
8281

8382
Assertions.assertThat(got).get()
84-
.extracting(io.weaviate.client6.v1.api.collections.WeaviateObject::properties, InstanceOfAssertFactories.MAP)
83+
.extracting(WeaviateObject::properties, InstanceOfAssertFactories.MAP)
8584
.extractingByKey("img").isEqualTo(ragdollPng);
8685
}
8786

@@ -99,6 +98,6 @@ private static void createTestCollections() throws IOException {
9998
Property.integer("age"))
10099
.references(
101100
Property.reference("hasAwards", awardsGrammy, awardsOscar))
102-
.vector(VECTOR_INDEX, new VectorIndex<>(IndexingStrategy.hnsw(), Vectorizer.none())));
101+
.vectors(named -> named.vector(VECTOR_INDEX, Hnsw.of(new NoneVectorizer()))));
103102
}
104103
}

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

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.weaviate.integration;
22

33
import java.io.IOException;
4+
import java.util.List;
45
import java.util.Map;
56
import java.util.Optional;
67

@@ -9,15 +10,14 @@
910
import org.junit.Test;
1011

1112
import io.weaviate.ConcurrentTest;
12-
import io.weaviate.client6.WeaviateClient;
13-
import io.weaviate.client6.v1.api.collections.ObjectReference;
13+
import io.weaviate.client6.v1.api.WeaviateClient;
14+
import io.weaviate.client6.v1.api.collections.ObjectMetadata;
15+
import io.weaviate.client6.v1.api.collections.Property;
16+
import io.weaviate.client6.v1.api.collections.ReferenceProperty;
1417
import io.weaviate.client6.v1.api.collections.WeaviateObject;
18+
import io.weaviate.client6.v1.api.collections.data.Reference;
1519
import io.weaviate.client6.v1.api.collections.query.MetadataField;
16-
import io.weaviate.client6.v1.api.collections.query.QueryMetadata;
1720
import io.weaviate.client6.v1.api.collections.query.QueryReference;
18-
import io.weaviate.client6.v1.collections.Property;
19-
import io.weaviate.client6.v1.collections.Reference;
20-
import io.weaviate.client6.v1.collections.ReferenceProperty;
2121
import io.weaviate.containers.Container;
2222

2323
/**
@@ -75,7 +75,7 @@ public void testReferences() throws IOException {
7575
Map.of("name", "Alex"),
7676
opt -> opt
7777
.reference("hasAwards", Reference.uuids(
78-
grammy_1.metadata().id(), oscar_1.metadata().id()))
78+
grammy_1.metadata().uuid(), oscar_1.metadata().uuid()))
7979
.reference("hasAwards", Reference.objects(grammy_2, oscar_2)));
8080

8181
// Act: add one more reference
@@ -92,7 +92,7 @@ public void testReferences() throws IOException {
9292
.extracting(ReferenceProperty::dataTypes, InstanceOfAssertFactories.list(String.class))
9393
.containsOnly(nsMovies);
9494

95-
var gotAlex = artists.query.byId(alex.metadata().id(),
95+
var gotAlex = artists.query.byId(alex.metadata().uuid(),
9696
opt -> opt.returnReferences(
9797
QueryReference.multi("hasAwards", nsOscar,
9898
ref -> ref.returnMetadata(MetadataField.ID)),
@@ -101,18 +101,21 @@ public void testReferences() throws IOException {
101101

102102
Assertions.assertThat(gotAlex).get()
103103
.as("Artists: fetch by id including hasAwards references")
104-
.extracting(WeaviateObject::references, InstanceOfAssertFactories.map(String.class, ObjectReference.class))
104+
105+
// Cast references to Map<String, List<WeaviateObject>>
106+
.extracting(WeaviateObject::references, InstanceOfAssertFactories.map(String.class, List.class))
105107
.as("hasAwards object reference").extractingByKey("hasAwards")
106-
.extracting(ObjectReference::objects, InstanceOfAssertFactories.list(WeaviateObject.class))
107-
.extracting(object -> ((QueryMetadata) object.metadata()).id())
108+
.asInstanceOf(InstanceOfAssertFactories.list(WeaviateObject.class))
109+
110+
.extracting(object -> ((ObjectMetadata) object.metadata()).uuid())
108111
.containsOnly(
109112
// INVESTIGATE: When references to 2+ collections are requested,
110113
// seems to Weaviate only return references to the first one in the list.
111114
// In this case we request { "hasAwards": Oscars } and { "hasAwards": Grammys }
112115
// so the latter will not be in the response.
113116
//
114117
// grammy_1.metadata().id(), grammy_2.metadata().id(),
115-
oscar_1.metadata().id(), oscar_2.metadata().id());
118+
oscar_1.metadata().uuid(), oscar_2.metadata().uuid());
116119
}
117120

118121
@Test
@@ -155,7 +158,7 @@ public void testNestedReferences() throws IOException {
155158
.reference("hasAwards", Reference.objects(grammy_1)));
156159

157160
// Assert: fetch nested references
158-
var gotAlex = artists.query.byId(alex.metadata().id(),
161+
var gotAlex = artists.query.byId(alex.metadata().uuid(),
159162
opt -> opt.returnReferences(
160163
QueryReference.single("hasAwards",
161164
ref -> ref
@@ -167,15 +170,20 @@ public void testNestedReferences() throws IOException {
167170

168171
Assertions.assertThat(gotAlex).get()
169172
.as("Artists: fetch by id including nested references")
170-
.extracting(WeaviateObject::references, InstanceOfAssertFactories.map(String.class, ObjectReference.class))
173+
174+
// Cast references to Map<String, List<WeaviateObject>>
175+
.extracting(WeaviateObject::references, InstanceOfAssertFactories.map(String.class, List.class))
171176
.as("hasAwards object reference").extractingByKey("hasAwards")
172-
.extracting(ObjectReference::objects, InstanceOfAssertFactories.list(WeaviateObject.class))
177+
.asInstanceOf(InstanceOfAssertFactories.list(WeaviateObject.class))
178+
173179
.hasSize(1).allSatisfy(award -> Assertions.assertThat(award)
174-
.returns(grammy_1.metadata().id(), grammy -> ((QueryMetadata) grammy.metadata()).id())
175-
.extracting(WeaviateObject::references,
176-
InstanceOfAssertFactories.map(String.class, ObjectReference.class))
177-
.extractingByKey("presentedBy")
178-
.extracting(ObjectReference::objects, InstanceOfAssertFactories.list(WeaviateObject.class))
180+
.returns(grammy_1.metadata().uuid(), grammy -> ((ObjectMetadata) grammy.metadata()).uuid())
181+
182+
// Cast references to Map<String, List<WeaviateObject>>
183+
.extracting(WeaviateObject::references, InstanceOfAssertFactories.map(String.class, List.class))
184+
.as("presentedBy object reference").extractingByKey("presentedBy")
185+
.asInstanceOf(InstanceOfAssertFactories.list(WeaviateObject.class))
186+
179187
.hasSize(1).extracting(WeaviateObject::properties)
180188
.allSatisfy(properties -> Assertions.assertThat(properties)
181189
.asInstanceOf(InstanceOfAssertFactories.map(String.class, Object.class))

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

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,18 @@
1515
import org.junit.rules.TestRule;
1616

1717
import io.weaviate.ConcurrentTest;
18-
import io.weaviate.client6.WeaviateClient;
18+
import io.weaviate.client6.v1.api.WeaviateClient;
19+
import io.weaviate.client6.v1.api.collections.Property;
1920
import io.weaviate.client6.v1.api.collections.Vectors;
2021
import io.weaviate.client6.v1.api.collections.WeaviateObject;
22+
import io.weaviate.client6.v1.api.collections.data.Reference;
2123
import io.weaviate.client6.v1.api.collections.query.GroupBy;
2224
import io.weaviate.client6.v1.api.collections.query.MetadataField;
2325
import io.weaviate.client6.v1.api.collections.query.QueryResponseGroup;
24-
import io.weaviate.client6.v1.collections.Property;
25-
import io.weaviate.client6.v1.collections.Reference;
26-
import io.weaviate.client6.v1.collections.VectorIndex;
27-
import io.weaviate.client6.v1.collections.VectorIndex.IndexingStrategy;
28-
import io.weaviate.client6.v1.collections.Vectorizer;
26+
import io.weaviate.client6.v1.api.collections.vectorindex.Hnsw;
27+
import io.weaviate.client6.v1.api.collections.vectorizers.Img2VecNeuralVectorizer;
28+
import io.weaviate.client6.v1.api.collections.vectorizers.NoneVectorizer;
29+
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecContextionaryVectorizer;
2930
import io.weaviate.containers.Container;
3031
import io.weaviate.containers.Container.ContainerGroup;
3132
import io.weaviate.containers.Contextionary;
@@ -111,10 +112,10 @@ private static Map<String, Float[]> populateTest(int n) throws IOException {
111112
var object = things.data.insert(
112113
Map.of("category", CATEGORIES.get(i % CATEGORIES.size())),
113114
metadata -> metadata
114-
.id(randomUUID())
115+
.uuid(randomUUID())
115116
.vectors(Vectors.of(VECTOR_INDEX, vector)));
116117

117-
created.put(object.metadata().id(), vector);
118+
created.put(object.metadata().uuid(), vector);
118119
}
119120

120121
return created;
@@ -128,7 +129,7 @@ private static Map<String, Float[]> populateTest(int n) throws IOException {
128129
private static void createTestCollection() throws IOException {
129130
client.collections.create(COLLECTION, cfg -> cfg
130131
.properties(Property.text("category"))
131-
.vector(VECTOR_INDEX, new VectorIndex<>(IndexingStrategy.hnsw(), Vectorizer.none())));
132+
.vector(VECTOR_INDEX, Hnsw.of(new NoneVectorizer())));
132133
}
133134

134135
@Test
@@ -137,7 +138,7 @@ public void testNearText() throws IOException {
137138
client.collections.create(nsSongs,
138139
col -> col
139140
.properties(Property.text("title"))
140-
.vector(new VectorIndex<>(IndexingStrategy.hnsw(), Vectorizer.text2vecContextionary())));
141+
.vector(Hnsw.of(Text2VecContextionaryVectorizer.of())));
141142

142143
var songs = client.collections.use(nsSongs);
143144
var submarine = songs.data.insert(Map.of("title", "Yellow Submarine"));
@@ -148,7 +149,7 @@ public void testNearText() throws IOException {
148149
opt -> opt
149150
.distance(0.5f)
150151
.moveTo(.98f, to -> to.concepts("tropical"))
151-
.moveAway(.4f, away -> away.uuids(submarine.metadata().id()))
152+
.moveAway(.4f, away -> away.uuids(submarine.metadata().uuid()))
152153
.returnProperties("title"));
153154

154155
Assertions.assertThat(result.objects()).hasSize(2)
@@ -159,7 +160,7 @@ public void testNearText() throws IOException {
159160

160161
@Test
161162
public void testNearText_groupBy() throws IOException {
162-
var vectorIndex = new VectorIndex<>(IndexingStrategy.hnsw(), Vectorizer.text2vecContextionary());
163+
var vectorIndex = Hnsw.of(Text2VecContextionaryVectorizer.of());
163164

164165
var nsArtists = ns("Artists");
165166
client.collections.create(nsArtists,
@@ -190,8 +191,8 @@ public void testNearText_groupBy() throws IOException {
190191

191192
Assertions.assertThat(result.groups()).hasSize(2)
192193
.containsOnlyKeys(
193-
"weaviate://localhost/%s/%s".formatted(nsArtists, beatles.metadata().id()),
194-
"weaviate://localhost/%s/%s".formatted(nsArtists, ccr.metadata().id()));
194+
"weaviate://localhost/%s/%s".formatted(nsArtists, beatles.metadata().uuid()),
195+
"weaviate://localhost/%s/%s".formatted(nsArtists, ccr.metadata().uuid()));
195196
}
196197

197198
@Test
@@ -203,9 +204,8 @@ public void testNearImage() throws IOException {
203204
.properties(
204205
Property.text("breed"),
205206
Property.blob("img"))
206-
.vector(new VectorIndex<>(
207-
IndexingStrategy.hnsw(),
208-
Vectorizer.img2VecNeuralVectorizer(
207+
.vector(Hnsw.of(
208+
Img2VecNeuralVectorizer.of(
209209
i2v -> i2v.imageFields("img")))));
210210

211211
var cats = client.collections.use(nsCats);

0 commit comments

Comments
 (0)