Skip to content

Commit 98fe65b

Browse files
committed
feat: add collection aliasing
1 parent 170a7fe commit 98fe65b

File tree

5 files changed

+106
-0
lines changed

5 files changed

+106
-0
lines changed

src/alias/index.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ConnectionREST } from "../index.js";
2+
import { WeaviateAlias, WeaviateAliasResponse } from "../openapi/types.js";
3+
import { Alias, CreateAliasInput, UpdateAliasInput } from "./types.js";
4+
5+
export interface Aliases {
6+
create: (opt: CreateAliasInput) => Promise<void>;
7+
listAll: (collection?: string) => Promise<Alias[] | undefined>
8+
get: (alias: string) => Promise<Alias>;
9+
update: (opt: UpdateAliasInput) => Promise<void>;
10+
delete: (alias: string) => Promise<void>;
11+
}
12+
13+
const alias = (connection: ConnectionREST): Aliases => {
14+
return {
15+
create: (opt: CreateAliasInput) => connection.postReturn<WeaviateAlias, void>(
16+
`/aliases/`, { ...opt, class: opt.collection }),
17+
listAll: (collection?: string) => connection.get<WeaviateAliasResponse>(
18+
`/aliases${collection !== undefined ? "/?class=" + collection : ""}`)
19+
.then(aliases => aliases.aliases !== undefined
20+
? aliases.aliases.map(alias => ({ alias: alias.alias, collection: alias.class }))
21+
: []),
22+
get: (alias: string) => connection.get<WeaviateAlias>(`/aliases/${alias}`)
23+
.then(alias => ({ alias: alias.alias!, collection: alias.class! })),
24+
update: (opt: UpdateAliasInput) => connection.put(
25+
`/aliases/${opt.alias}`, { class: opt.newTargetCollection }),
26+
delete: (alias: string) => connection.delete(
27+
`/aliases/${alias}`, null),
28+
}
29+
}
30+
31+
export default alias;

src/alias/journey.test.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { assert } from 'console';
2+
import weaviate, {
3+
WeaviateClient,
4+
} from '..';
5+
import { requireAtLeast } from '../../test/version';
6+
import { Alias } from './types';
7+
8+
requireAtLeast(1, 32, 0).describe("manages collection aliases", () => {
9+
let client: WeaviateClient;
10+
const collectionsWithAliases = ["PaulHewson", "GeorgeBarnes", "ColsonBaker"];
11+
12+
beforeAll(async () => {
13+
client = await weaviate.connectToLocal();
14+
await Promise.all(collectionsWithAliases.map(client.collections.delete));
15+
await Promise.all(collectionsWithAliases.map(name => client.collections.create({ name })));
16+
});
17+
18+
it("should create alias", () => {
19+
return Promise.all([
20+
client.alias.create({ collection: "PaulHewson", alias: "Bono" }),
21+
client.alias.create({ collection: "GeorgeBarnes", alias: "MachineGunKelly" }),
22+
])
23+
.then(() => client.alias.listAll())
24+
.then(aliases => {
25+
expect(aliases).not.toBeUndefined();
26+
expect(aliases).toHaveLength(2);
27+
expect(aliases).toEqual<Alias[]>([
28+
{ collection: "PaulHewson", alias: "Bono" },
29+
{ collection: "GeorgeBarnes", alias: "MachineGunKelly" },
30+
]);
31+
});
32+
})
33+
34+
it("should update alias", () => {
35+
return client.alias.update({ alias: "MachineGunKelly", newTargetCollection: "ColsonBaker" })
36+
.then(() => client.alias.get("MachineGunKelly"))
37+
.then(alias => {
38+
expect(alias.collection).toEqual("ColsonBaker");
39+
})
40+
})
41+
42+
it("should delete alias Bono", () => {
43+
return client.alias.delete("Bono")
44+
.then(() => client.alias.listAll("PaulHewson"))
45+
.then(aliases => expect(aliases).toEqual([]));
46+
})
47+
48+
it("should delete alias MachineGunKelly", () => {
49+
return client.alias.delete("MachineGunKelly")
50+
.then(() => client.alias.listAll("ColsonBaker"))
51+
.then(aliases => expect(aliases).toEqual([]));
52+
})
53+
})

src/alias/types.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export type Alias = {
2+
collection: string;
3+
alias: string;
4+
}
5+
6+
export type CreateAliasInput = {
7+
collection: string;
8+
alias: string;
9+
};
10+
11+
export type UpdateAliasInput = {
12+
newTargetCollection: string;
13+
alias: string;
14+
};

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import weaviateV2 from './v2/index.js';
4141
import filter from './collections/filters/index.js';
4242
import { ConsistencyLevel } from './data/replication.js';
4343
import users, { Users } from './users/index.js';
44+
import alias, { Aliases } from './alias/index.js';
4445

4546
export type ProtocolParams = {
4647
/**
@@ -102,6 +103,7 @@ export type ClientParams = {
102103
};
103104

104105
export interface WeaviateClient {
106+
alias: Aliases;
105107
backup: Backup;
106108
cluster: Cluster;
107109
collections: Collections;
@@ -224,6 +226,7 @@ async function client(params: ClientParams): Promise<WeaviateClient> {
224226
});
225227

226228
const ifc: WeaviateClient = {
229+
alias: alias(connection),
227230
backup: backup(connection),
228231
cluster: cluster(connection),
229232
collections: collections(connection, dbVersionSupport),

src/openapi/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,8 @@ export type WeaviateUserType = definitions['UserTypeOutput'];
7474
export type WeaviateUserTypeInternal = definitions['UserTypeInput'];
7575
export type WeaviateUserTypeDB = definitions['DBUserInfo']['dbUserType'];
7676
export type WeaviateAssignedUser = operations['getUsersForRole']['responses']['200']['schema'][0];
77+
// Alias
78+
export type WeaviateAlias = definitions['Alias'];
79+
export type WeaviateAliasResponse = {
80+
aliases?: Required<Exclude<definitions['AliasResponse']['aliases'], undefined>[0]>[] | undefined;
81+
};

0 commit comments

Comments
 (0)