Skip to content

Commit 2a4065a

Browse files
authored
Merge pull request #409 from weaviate/feat/collection-alias
feat: Support collection aliases
2 parents 221277d + 70733c7 commit 2a4065a

24 files changed

+768
-20
lines changed

src/main/java/io/weaviate/client/WeaviateClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.weaviate.client.base.util.DbVersionProvider;
99
import io.weaviate.client.base.util.DbVersionSupport;
1010
import io.weaviate.client.base.util.GrpcVersionSupport;
11+
import io.weaviate.client.v1.aliases.Aliases;
1112
import io.weaviate.client.v1.async.WeaviateAsyncClient;
1213
import io.weaviate.client.v1.auth.provider.AccessTokenProvider;
1314
import io.weaviate.client.v1.backup.Backup;
@@ -111,6 +112,10 @@ public Users users() {
111112
return new Users(httpClient, config);
112113
}
113114

115+
public Aliases alias() {
116+
return new Aliases(httpClient, config);
117+
}
118+
114119
private DbVersionProvider initDbVersionProvider() {
115120
MetaGetter metaGetter = new Misc(httpClient, config, null).metaGetter();
116121
DbVersionProvider.VersionGetter getter = () -> Optional.ofNullable(metaGetter.run())

src/main/java/io/weaviate/client/base/AsyncBaseClient.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package io.weaviate.client.base;
22

3-
import io.weaviate.client.Config;
4-
import io.weaviate.client.base.http.async.ResponseParser;
5-
import io.weaviate.client.base.http.async.WeaviateResponseConsumer;
6-
import io.weaviate.client.v1.auth.provider.AccessTokenProvider;
73
import java.util.Map;
84
import java.util.concurrent.Future;
5+
96
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
107
import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
118
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
129
import org.apache.hc.core5.concurrent.FutureCallback;
1310
import org.apache.hc.core5.http.ContentType;
1411
import org.apache.hc.core5.http.HttpHeaders;
1512

13+
import io.weaviate.client.Config;
14+
import io.weaviate.client.base.http.async.ResponseParser;
15+
import io.weaviate.client.base.http.async.WeaviateResponseConsumer;
16+
import io.weaviate.client.v1.auth.provider.AccessTokenProvider;
17+
1618
public abstract class AsyncBaseClient<T> {
1719
protected final CloseableHttpAsyncClient client;
1820
private final Config config;
@@ -30,52 +32,64 @@ protected Future<Result<T>> sendGetRequest(String endpoint, Class<T> classOfT, F
3032
return sendRequest(endpoint, null, "GET", classOfT, callback, null);
3133
}
3234

33-
protected Future<Result<T>> sendGetRequest(String endpoint, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
35+
protected Future<Result<T>> sendGetRequest(String endpoint, FutureCallback<Result<T>> callback,
36+
ResponseParser<T> parser) {
3437
return sendRequest(endpoint, null, "GET", null, callback, parser);
3538
}
3639

37-
protected Future<Result<T>> sendPostRequest(String endpoint, Object payload, Class<T> classOfT, FutureCallback<Result<T>> callback) {
40+
protected Future<Result<T>> sendPostRequest(String endpoint, Object payload, Class<T> classOfT,
41+
FutureCallback<Result<T>> callback) {
3842
return sendRequest(endpoint, payload, "POST", classOfT, callback, null);
3943
}
4044

41-
protected Future<Result<T>> sendPostRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
45+
protected Future<Result<T>> sendPostRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback,
46+
ResponseParser<T> parser) {
4247
return sendRequest(endpoint, payload, "POST", null, callback, parser);
4348
}
4449

45-
protected Future<Result<T>> sendPutRequest(String endpoint, Object payload, Class<T> classOfT, FutureCallback<Result<T>> callback) {
50+
protected Future<Result<T>> sendPutRequest(String endpoint, Object payload, Class<T> classOfT,
51+
FutureCallback<Result<T>> callback) {
4652
return sendRequest(endpoint, payload, "PUT", classOfT, callback, null);
4753
}
4854

49-
protected Future<Result<T>> sendPutRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
55+
protected Future<Result<T>> sendPutRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback,
56+
ResponseParser<T> parser) {
5057
return sendRequest(endpoint, payload, "PUT", null, callback, parser);
5158
}
5259

53-
protected Future<Result<T>> sendPatchRequest(String endpoint, Object payload, Class<T> classOfT, FutureCallback<Result<T>> callback) {
60+
protected Future<Result<T>> sendPatchRequest(String endpoint, Object payload, Class<T> classOfT,
61+
FutureCallback<Result<T>> callback) {
5462
return sendRequest(endpoint, payload, "PATCH", classOfT, callback, null);
5563
}
5664

57-
protected Future<Result<T>> sendPatchRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
65+
protected Future<Result<T>> sendPatchRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback,
66+
ResponseParser<T> parser) {
5867
return sendRequest(endpoint, payload, "PATCH", null, callback, parser);
5968
}
6069

61-
protected Future<Result<T>> sendDeleteRequest(String endpoint, Object payload, Class<T> classOfT, FutureCallback<Result<T>> callback) {
70+
protected Future<Result<T>> sendDeleteRequest(String endpoint, Object payload, Class<T> classOfT,
71+
FutureCallback<Result<T>> callback) {
6272
return sendRequest(endpoint, payload, "DELETE", classOfT, callback, null);
6373
}
6474

65-
protected Future<Result<T>> sendDeleteRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
75+
protected Future<Result<T>> sendDeleteRequest(String endpoint, Object payload, FutureCallback<Result<T>> callback,
76+
ResponseParser<T> parser) {
6677
return sendRequest(endpoint, payload, "DELETE", null, callback, parser);
6778
}
6879

6980
protected Future<Result<T>> sendHeadRequest(String endpoint, Class<T> classOfT, FutureCallback<Result<T>> callback) {
7081
return sendRequest(endpoint, null, "HEAD", classOfT, callback, null);
7182
}
7283

73-
protected Future<Result<T>> sendHeadRequest(String endpoint, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
84+
protected Future<Result<T>> sendHeadRequest(String endpoint, FutureCallback<Result<T>> callback,
85+
ResponseParser<T> parser) {
7486
return sendRequest(endpoint, null, "HEAD", null, callback, parser);
7587
}
7688

77-
private Future<Result<T>> sendRequest(String endpoint, Object payload, String method, Class<T> classOfT, FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
78-
return client.execute(SimpleRequestProducer.create(getRequest(endpoint, payload, method)), new WeaviateResponseConsumer<>(classOfT, parser), callback);
89+
private Future<Result<T>> sendRequest(String endpoint, Object payload, String method, Class<T> classOfT,
90+
FutureCallback<Result<T>> callback, ResponseParser<T> parser) {
91+
return client.execute(SimpleRequestProducer.create(getRequest(endpoint, payload, method)),
92+
new WeaviateResponseConsumer<>(classOfT, parser), callback);
7993
}
8094

8195
protected SimpleHttpRequest getRequest(String endpoint, Object payload, String method) {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.weaviate.client.v1.aliases;
2+
3+
import io.weaviate.client.Config;
4+
import io.weaviate.client.base.http.HttpClient;
5+
import io.weaviate.client.v1.aliases.api.AliasAllGetter;
6+
import io.weaviate.client.v1.aliases.api.AliasCreator;
7+
import io.weaviate.client.v1.aliases.api.AliasDeleter;
8+
import io.weaviate.client.v1.aliases.api.AliasGetter;
9+
import io.weaviate.client.v1.aliases.api.AliasUpdater;
10+
11+
public class Aliases {
12+
private final Config config;
13+
private final HttpClient httpClient;
14+
15+
public Aliases(HttpClient httpClient, Config config) {
16+
this.config = config;
17+
this.httpClient = httpClient;
18+
}
19+
20+
public AliasCreator creator() {
21+
return new AliasCreator(httpClient, config);
22+
}
23+
24+
public AliasGetter getter() {
25+
return new AliasGetter(httpClient, config);
26+
}
27+
28+
public AliasAllGetter allGetter() {
29+
return new AliasAllGetter(httpClient, config);
30+
}
31+
32+
public AliasDeleter deleter() {
33+
return new AliasDeleter(httpClient, config);
34+
}
35+
36+
public AliasUpdater updater() {
37+
return new AliasUpdater(httpClient, config);
38+
}
39+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.weaviate.client.v1.aliases.api;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.function.Function;
6+
import java.util.stream.Collectors;
7+
8+
import io.weaviate.client.Config;
9+
import io.weaviate.client.base.BaseClient;
10+
import io.weaviate.client.base.ClientResult;
11+
import io.weaviate.client.base.Response;
12+
import io.weaviate.client.base.Result;
13+
import io.weaviate.client.base.http.HttpClient;
14+
import io.weaviate.client.v1.aliases.api.AliasAllGetter.ResponseBody;
15+
import io.weaviate.client.v1.aliases.model.Alias;
16+
17+
public class AliasAllGetter extends BaseClient<ResponseBody> implements ClientResult<Map<String, Alias>> {
18+
private String className;
19+
20+
public AliasAllGetter(HttpClient httpClient, Config config) {
21+
super(httpClient, config);
22+
}
23+
24+
/** List aliases defined for this class. */
25+
public AliasAllGetter withClassName(String className) {
26+
this.className = className;
27+
return this;
28+
}
29+
30+
static class ResponseBody {
31+
List<Alias> aliases;
32+
}
33+
34+
@Override
35+
public Result<Map<String, Alias>> run() {
36+
String path = "/aliases" + (className != null ? "?class=" + className : "");
37+
Response<ResponseBody> resp = sendGetRequest(path, ResponseBody.class);
38+
if (resp.getErrors() != null) {
39+
return new Result<>(resp, null);
40+
}
41+
Map<String, Alias> aliases = resp.getBody().aliases.stream()
42+
.collect(Collectors.toMap(Alias::getAlias, Function.identity()));
43+
return new Result<>(resp, aliases);
44+
}
45+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.weaviate.client.v1.aliases.api;
2+
3+
import io.weaviate.client.Config;
4+
import io.weaviate.client.base.BaseClient;
5+
import io.weaviate.client.base.ClientResult;
6+
import io.weaviate.client.base.Response;
7+
import io.weaviate.client.base.Result;
8+
import io.weaviate.client.base.http.HttpClient;
9+
import io.weaviate.client.v1.aliases.model.Alias;
10+
11+
public class AliasCreator extends BaseClient<Void> implements ClientResult<Boolean> {
12+
private String className;
13+
private String alias;
14+
15+
public AliasCreator(HttpClient httpClient, Config config) {
16+
super(httpClient, config);
17+
}
18+
19+
public AliasCreator withClassName(String className) {
20+
this.className = className;
21+
return this;
22+
}
23+
24+
public AliasCreator withAlias(String alias) {
25+
this.alias = alias;
26+
return this;
27+
}
28+
29+
@Override
30+
public Result<Boolean> run() {
31+
Response<Void> resp = sendPostRequest("/aliases", new Alias(className, alias), Void.class);
32+
return Result.voidToBoolean(resp);
33+
}
34+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.weaviate.client.v1.aliases.api;
2+
3+
import io.weaviate.client.Config;
4+
import io.weaviate.client.base.BaseClient;
5+
import io.weaviate.client.base.ClientResult;
6+
import io.weaviate.client.base.Response;
7+
import io.weaviate.client.base.Result;
8+
import io.weaviate.client.base.http.HttpClient;
9+
10+
public class AliasDeleter extends BaseClient<Void> implements ClientResult<Boolean> {
11+
private String alias;
12+
13+
public AliasDeleter(HttpClient httpClient, Config config) {
14+
super(httpClient, config);
15+
}
16+
17+
public AliasDeleter withAlias(String alias) {
18+
this.alias = alias;
19+
return this;
20+
}
21+
22+
@Override
23+
public Result<Boolean> run() {
24+
Response<Void> resp = sendDeleteRequest("/aliases/" + alias, null, Void.class);
25+
return Result.voidToBoolean(resp);
26+
}
27+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.weaviate.client.v1.aliases.api;
2+
3+
import io.weaviate.client.Config;
4+
import io.weaviate.client.base.BaseClient;
5+
import io.weaviate.client.base.ClientResult;
6+
import io.weaviate.client.base.Result;
7+
import io.weaviate.client.base.http.HttpClient;
8+
import io.weaviate.client.v1.aliases.model.Alias;
9+
10+
public class AliasGetter extends BaseClient<Alias> implements ClientResult<Alias> {
11+
private String alias;
12+
13+
public AliasGetter(HttpClient httpClient, Config config) {
14+
super(httpClient, config);
15+
}
16+
17+
public AliasGetter withAlias(String alias) {
18+
this.alias = alias;
19+
return this;
20+
}
21+
22+
@Override
23+
public Result<Alias> run() {
24+
return new Result<>(sendGetRequest("/aliases/" + alias, Alias.class));
25+
}
26+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.weaviate.client.v1.aliases.api;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
import io.weaviate.client.Config;
6+
import io.weaviate.client.base.BaseClient;
7+
import io.weaviate.client.base.ClientResult;
8+
import io.weaviate.client.base.Response;
9+
import io.weaviate.client.base.Result;
10+
import io.weaviate.client.base.http.HttpClient;
11+
12+
public class AliasUpdater extends BaseClient<Void> implements ClientResult<Boolean> {
13+
private String className;
14+
private String alias;
15+
16+
public AliasUpdater(HttpClient httpClient, Config config) {
17+
super(httpClient, config);
18+
}
19+
20+
public AliasUpdater withAlias(String alias) {
21+
this.alias = alias;
22+
return this;
23+
}
24+
25+
public AliasUpdater withNewClassName(String className) {
26+
this.className = className;
27+
return this;
28+
}
29+
30+
class Body {
31+
@SerializedName("class")
32+
String className = AliasUpdater.this.className;
33+
}
34+
35+
@Override
36+
public Result<Boolean> run() {
37+
Response<Void> resp = sendPutRequest("/aliases/" + alias, new Body(), Void.class);
38+
return Result.voidToBoolean(resp);
39+
}
40+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.weaviate.client.v1.aliases.model;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
import lombok.EqualsAndHashCode;
6+
import lombok.Getter;
7+
import lombok.RequiredArgsConstructor;
8+
9+
@Getter
10+
@RequiredArgsConstructor
11+
@EqualsAndHashCode
12+
public class Alias {
13+
@SerializedName("class")
14+
private final String className;
15+
@SerializedName("alias")
16+
private final String alias;
17+
}

src/main/java/io/weaviate/client/v1/async/WeaviateAsyncClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.weaviate.client.base.util.DbVersionProvider;
1313
import io.weaviate.client.base.util.DbVersionSupport;
1414
import io.weaviate.client.base.util.GrpcVersionSupport;
15+
import io.weaviate.client.v1.async.aliases.Aliases;
1516
import io.weaviate.client.v1.async.backup.Backup;
1617
import io.weaviate.client.v1.async.batch.Batch;
1718
import io.weaviate.client.v1.async.classifications.Classifications;
@@ -84,6 +85,10 @@ public Users users() {
8485
return new Users(client, config, tokenProvider);
8586
}
8687

88+
public Aliases alias() {
89+
return new Aliases(client, config, tokenProvider);
90+
}
91+
8792
private DbVersionProvider initDbVersionProvider() {
8893
DbVersionProvider.VersionGetter getter = () -> Optional.ofNullable(this.getMeta())
8994
.filter(result -> !result.hasErrors())

0 commit comments

Comments
 (0)