Skip to content

Commit e5b9516

Browse files
authored
Merge pull request #449 from weaviate/v6-alias
v6: Support aliases
2 parents df406cb + 855b2ba commit e5b9516

12 files changed

Lines changed: 443 additions & 0 deletions
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.weaviate.integration;
2+
3+
import java.io.IOException;
4+
import java.util.List;
5+
6+
import org.assertj.core.api.Assertions;
7+
import org.junit.Test;
8+
9+
import io.weaviate.ConcurrentTest;
10+
import io.weaviate.client6.v1.api.WeaviateClient;
11+
import io.weaviate.client6.v1.api.alias.Alias;
12+
import io.weaviate.containers.Container;
13+
14+
public class AliasITest extends ConcurrentTest {
15+
private static WeaviateClient client = Container.WEAVIATE.getClient();
16+
17+
@Test
18+
public void test_aliasLifecycle() throws IOException {
19+
// Arrange
20+
var nsPaulHewson = ns("PaulHewson");
21+
var nsGeorgeBarnes = ns("GeorgeBarnes");
22+
var nsColsonBaker = ns("ColsonBaker");
23+
24+
for (var collection : List.of(nsPaulHewson, nsGeorgeBarnes, nsColsonBaker)) {
25+
client.collections.create(collection);
26+
}
27+
28+
// Act: create aliases
29+
client.alias.create(nsPaulHewson, "Bono");
30+
client.alias.create(nsGeorgeBarnes, "MachineGunKelly");
31+
32+
// Assert: list all
33+
var aliases = client.alias.list();
34+
Assertions.assertThat(aliases).hasSize(2);
35+
Assertions.assertThat(aliases)
36+
.as("created Bono and MachineGunKelly aliases")
37+
.contains(
38+
new Alias(nsPaulHewson, "Bono"),
39+
new Alias(nsGeorgeBarnes, "MachineGunKelly"));
40+
41+
// Act: update aliases
42+
client.alias.update("MachineGunKelly", nsColsonBaker);
43+
44+
// Assert: check MGK points to another collection
45+
var mgk = client.alias.get("MachineGunKelly");
46+
Assertions.assertThat(mgk).get()
47+
.as("updated MachineGunKelly alias")
48+
.returns(nsColsonBaker, Alias::collection);
49+
50+
// Act: delete Bono alias
51+
client.alias.delete("Bono");
52+
53+
// Assert
54+
var paulHewsonAliases = client.alias.list(all -> all.collection(nsPaulHewson));
55+
Assertions.assertThat(paulHewsonAliases)
56+
.as("no aliases once Bono is deleted")
57+
.isEmpty();
58+
}
59+
}

src/main/java/io/weaviate/client6/v1/api/WeaviateClient.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44
import java.util.function.Function;
55

6+
import io.weaviate.client6.v1.api.alias.WeaviateAliasClient;
67
import io.weaviate.client6.v1.api.collections.WeaviateCollectionsClient;
78
import io.weaviate.client6.v1.internal.ObjectBuilder;
89
import io.weaviate.client6.v1.internal.TokenProvider;
@@ -20,8 +21,16 @@ public class WeaviateClient implements AutoCloseable {
2021
private final RestTransport restTransport;
2122
private final GrpcTransport grpcTransport;
2223

24+
/**
25+
* Client for {@code /schema} endpoints for managing Weaviate collections.
26+
* See {@link WeaviateCollectionsClient#use} for populating and querying
27+
* collections.
28+
*/
2329
public final WeaviateCollectionsClient collections;
2430

31+
/** Client for {@code /aliases} endpoints for managing collection aliases. */
32+
public final WeaviateAliasClient alias;
33+
2534
public WeaviateClient(Config config) {
2635
this.config = config;
2736

@@ -46,6 +55,7 @@ public WeaviateClient(Config config) {
4655
this.restTransport = new DefaultRestTransport(restOpt);
4756
this.grpcTransport = new DefaultGrpcTransport(grpcOpt);
4857

58+
this.alias = new WeaviateAliasClient(restTransport);
4959
this.collections = new WeaviateCollectionsClient(restTransport, grpcTransport);
5060
}
5161

src/main/java/io/weaviate/client6/v1/api/WeaviateClientAsync.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import java.util.concurrent.CompletableFuture;
55
import java.util.function.Function;
66

7+
import io.weaviate.client6.v1.api.alias.WeaviateAliasClientAsync;
8+
import io.weaviate.client6.v1.api.collections.WeaviateCollectionsClient;
79
import io.weaviate.client6.v1.api.collections.WeaviateCollectionsClientAsync;
810
import io.weaviate.client6.v1.internal.ObjectBuilder;
911
import io.weaviate.client6.v1.internal.TokenProvider;
@@ -18,8 +20,16 @@ public class WeaviateClientAsync implements AutoCloseable {
1820
private final RestTransport restTransport;
1921
private final GrpcTransport grpcTransport;
2022

23+
/**
24+
* Client for {@code /schema} endpoints for managing Weaviate collections.
25+
* See {@link WeaviateCollectionsClient#use} for populating and querying
26+
* collections.
27+
*/
2128
public final WeaviateCollectionsClientAsync collections;
2229

30+
/** Client for {@code /aliases} endpoints for managing collection aliases. */
31+
public final WeaviateAliasClientAsync alias;
32+
2333
/**
2434
* This constructor is blocking if {@link Authentication} configured,
2535
* as the client will need to do the initial token exchange.
@@ -46,6 +56,7 @@ public WeaviateClientAsync(Config config) {
4656
this.restTransport = new DefaultRestTransport(restOpt);
4757
this.grpcTransport = new DefaultGrpcTransport(grpcOpt);
4858

59+
this.alias = new WeaviateAliasClientAsync(restTransport);
4960
this.collections = new WeaviateCollectionsClientAsync(restTransport, grpcTransport);
5061
}
5162

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
public record Alias(
6+
/** Original collection name. */
7+
@SerializedName("class") String collection,
8+
/** Collection alias. */
9+
@SerializedName("alias") String alias) {
10+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import java.util.Collections;
4+
5+
import io.weaviate.client6.v1.internal.json.JSON;
6+
import io.weaviate.client6.v1.internal.rest.Endpoint;
7+
import io.weaviate.client6.v1.internal.rest.SimpleEndpoint;
8+
9+
public record CreateAliasRequest(Alias alias) {
10+
public final static Endpoint<CreateAliasRequest, Void> _ENDPOINT = SimpleEndpoint.sideEffect(
11+
__ -> "POST",
12+
__ -> "/aliases/",
13+
__ -> Collections.emptyMap(),
14+
request -> JSON.serialize(request.alias));
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import java.util.Collections;
4+
5+
import io.weaviate.client6.v1.internal.rest.Endpoint;
6+
import io.weaviate.client6.v1.internal.rest.SimpleEndpoint;
7+
8+
public record DeleteAliasRequest(String alias) {
9+
public final static Endpoint<DeleteAliasRequest, Void> _ENDPOINT = SimpleEndpoint.sideEffect(
10+
__ -> "DELETE",
11+
request -> "/aliases/" + request.alias,
12+
__ -> Collections.emptyMap());
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import java.util.Collections;
4+
import java.util.Optional;
5+
6+
import io.weaviate.client6.v1.internal.json.JSON;
7+
import io.weaviate.client6.v1.internal.rest.Endpoint;
8+
import io.weaviate.client6.v1.internal.rest.OptionalEndpoint;
9+
10+
public record GetAliasRequest(String alias) {
11+
public final static Endpoint<GetAliasRequest, Optional<Alias>> _ENDPOINT = OptionalEndpoint.noBodyOptional(
12+
__ -> "GET",
13+
request -> "/aliases/" + request.alias,
14+
__ -> Collections.emptyMap(),
15+
(statusCode, response) -> JSON.deserialize(response, Alias.class));
16+
17+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import java.util.Collections;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.function.Function;
7+
8+
import io.weaviate.client6.v1.internal.ObjectBuilder;
9+
import io.weaviate.client6.v1.internal.json.JSON;
10+
import io.weaviate.client6.v1.internal.rest.Endpoint;
11+
import io.weaviate.client6.v1.internal.rest.SimpleEndpoint;
12+
13+
public record ListAliasRequest(String collection) {
14+
public final static Endpoint<ListAliasRequest, List<Alias>> _ENDPOINT = SimpleEndpoint.noBody(
15+
__ -> "GET",
16+
__ -> "/aliases",
17+
request -> request.collection != null
18+
? Map.of("class", request.collection)
19+
: Collections.emptyMap(),
20+
(statusCode, response) -> JSON.deserialize(response, ListAliasResponse.class).aliases());
21+
22+
/** Create default ListAliasRequest. */
23+
public static ListAliasRequest of() {
24+
return of(ObjectBuilder.identity());
25+
}
26+
27+
/** Create ListAliasRequest with optional parameters. */
28+
public static ListAliasRequest of(Function<Builder, ObjectBuilder<ListAliasRequest>> fn) {
29+
return fn.apply(new Builder()).build();
30+
}
31+
32+
public ListAliasRequest(Builder builder) {
33+
this(builder.collection);
34+
}
35+
36+
public static class Builder implements ObjectBuilder<ListAliasRequest> {
37+
private String collection;
38+
39+
/** Return only aliases which reference this collection. */
40+
public Builder collection(String collection) {
41+
this.collection = collection;
42+
return this;
43+
}
44+
45+
@Override
46+
public ListAliasRequest build() {
47+
return new ListAliasRequest(this);
48+
}
49+
}
50+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import java.util.List;
4+
5+
import com.google.gson.annotations.SerializedName;
6+
7+
public record ListAliasResponse(@SerializedName("aliases") List<Alias> aliases) {
8+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.weaviate.client6.v1.api.alias;
2+
3+
import java.util.Collections;
4+
5+
import com.google.gson.annotations.SerializedName;
6+
7+
import io.weaviate.client6.v1.internal.json.JSON;
8+
import io.weaviate.client6.v1.internal.rest.Endpoint;
9+
import io.weaviate.client6.v1.internal.rest.SimpleEndpoint;
10+
11+
public record UpdateAliasRequest(String alias, String newTargetCollection) {
12+
public final static Endpoint<UpdateAliasRequest, Void> _ENDPOINT = SimpleEndpoint.sideEffect(
13+
__ -> "PUT",
14+
request -> "/aliases/" + request.alias,
15+
__ -> Collections.emptyMap(),
16+
request -> JSON.serialize(request.toRequestBody()));
17+
18+
private RequestBody toRequestBody() {
19+
return new RequestBody();
20+
}
21+
22+
private class RequestBody {
23+
@SerializedName("class")
24+
private final String collection = UpdateAliasRequest.this.newTargetCollection;
25+
}
26+
}

0 commit comments

Comments
 (0)