Skip to content

Commit 8859b3a

Browse files
committed
Add implementation for multi-tenancy config update with test
1 parent 8caff77 commit 8859b3a

File tree

4 files changed

+72
-18
lines changed

4 files changed

+72
-18
lines changed

src/collections/config/classes.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ export class MergeWithExisting {
3232
current.invertedIndexConfig,
3333
update.invertedIndex
3434
);
35+
if (update.multiTenancy !== undefined)
36+
current.multiTenancyConfig = MergeWithExisting.multiTenancy(
37+
current.multiTenancyConfig,
38+
update.multiTenancy
39+
);
3540
if (update.replication !== undefined)
3641
current.replicationConfig = MergeWithExisting.replication(
3742
current.replicationConfig!,
@@ -58,7 +63,7 @@ export class MergeWithExisting {
5863

5964
static invertedIndex(
6065
current: WeaviateInvertedIndexConfig,
61-
update?: InvertedIndexConfigUpdate
66+
update: InvertedIndexConfigUpdate
6267
): WeaviateInvertedIndexConfig {
6368
if (current === undefined) throw Error('Inverted index config is missing from the class schema.');
6469
if (update === undefined) return current;
@@ -71,28 +76,25 @@ export class MergeWithExisting {
7176

7277
static multiTenancy(
7378
current: WeaviateMultiTenancyConfig,
74-
update?: MultiTenancyConfigUpdate
79+
update: MultiTenancyConfigUpdate
7580
): MultiTenancyConfigUpdate {
7681
if (current === undefined) throw Error('Multi-tenancy config is missing from the class schema.');
77-
if (update === undefined) return current;
7882
return { ...current, ...update };
7983
}
8084

8185
static replication(
8286
current: WeaviateReplicationConfig,
83-
update?: ReplicationConfigUpdate
87+
update: ReplicationConfigUpdate
8488
): WeaviateReplicationConfig {
8589
if (current === undefined) throw Error('Replication config is missing from the class schema.');
86-
if (update === undefined) return current;
8790
return { ...current, ...update };
8891
}
8992

9093
static vectors(
9194
current: WeaviateVectorsConfig,
92-
update?: VectorConfigUpdate<string, VectorIndexType>[]
95+
update: VectorConfigUpdate<string, VectorIndexType>[]
9396
): WeaviateVectorsConfig {
9497
if (current === undefined) throw Error('Vector index config is missing from the class schema.');
95-
if (update === undefined) return current;
9698
update.forEach((v) => {
9799
const existing = current[v.name];
98100
if (existing !== undefined) {
@@ -107,9 +109,8 @@ export class MergeWithExisting {
107109

108110
static flat(
109111
current: WeaviateVectorIndexConfig,
110-
update?: VectorIndexConfigFlatUpdate
112+
update: VectorIndexConfigFlatUpdate
111113
): WeaviateVectorIndexConfig {
112-
if (update === undefined) return current;
113114
if (
114115
(QuantizerGuards.isPQUpdate(update.quantizer) && (current?.bq as any).enabled) ||
115116
(QuantizerGuards.isBQUpdate(update.quantizer) && (current?.pq as any).enabled)
@@ -126,9 +127,8 @@ export class MergeWithExisting {
126127

127128
static hnsw(
128129
current: WeaviateVectorIndexConfig,
129-
update?: VectorIndexConfigHNSWUpdate
130+
update: VectorIndexConfigHNSWUpdate
130131
): WeaviateVectorIndexConfig {
131-
if (update === undefined) return current;
132132
if (
133133
(QuantizerGuards.isBQUpdate(update.quantizer) &&
134134
(((current?.pq as any) || {}).enabled || ((current?.sq as any) || {}).enabled)) ||

src/collections/config/integration.test.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
/* eslint-disable @typescript-eslint/no-non-null-assertion */
22
import { WeaviateUnsupportedFeatureError } from '../../errors.js';
33
import weaviate, { WeaviateClient, weaviateV2 } from '../../index.js';
4-
import { PropertyConfig, VectorIndexConfigDynamic, VectorIndexConfigHNSW } from './types/index.js';
4+
import {
5+
MultiTenancyConfig,
6+
PropertyConfig,
7+
VectorIndexConfigDynamic,
8+
VectorIndexConfigHNSW,
9+
} from './types/index.js';
510

611
const fail = (msg: string) => {
712
throw new Error(msg);
@@ -509,7 +514,7 @@ describe('Testing of the collection.config namespace', () => {
509514
});
510515

511516
it('should be able to create and get a collection with multi-tenancy enabled', async () => {
512-
const collectionName = 'TestCollectionConfigMultiTenancy';
517+
const collectionName = 'TestCollectionConfigCreateGetMultiTenancy';
513518
const collection = await client.collections.create({
514519
name: collectionName,
515520
multiTenancy: weaviate.configure.multiTenancy({
@@ -529,6 +534,37 @@ describe('Testing of the collection.config namespace', () => {
529534
expect(config.multiTenancy.enabled).toEqual(true);
530535
});
531536

537+
it('should be able to create and update a collection with multi-tenancy enabled', async () => {
538+
const collectionName = 'TestCollectionConfigCreateUpdateMultiTenancy';
539+
const collection = await client.collections.create({
540+
name: collectionName,
541+
multiTenancy: weaviate.configure.multiTenancy(),
542+
});
543+
let config = await collection.config.get();
544+
expect(config.multiTenancy).toEqual<MultiTenancyConfig>({
545+
enabled: true,
546+
autoTenantActivation: false,
547+
autoTenantCreation: false,
548+
});
549+
550+
await collection.config.update({
551+
multiTenancy: weaviate.reconfigure.multiTenancy({
552+
autoTenantActivation: true,
553+
autoTenantCreation: true,
554+
}),
555+
});
556+
config = await collection.config.get();
557+
558+
expect(config.name).toEqual(collectionName);
559+
expect(config.multiTenancy.autoTenantActivation).toEqual(
560+
await client.getWeaviateVersion().then((ver) => !ver.isLowerThan(1, 25, 2))
561+
);
562+
expect(config.multiTenancy.autoTenantCreation).toEqual(
563+
await client.getWeaviateVersion().then((ver) => !ver.isLowerThan(1, 25, 0))
564+
);
565+
expect(config.multiTenancy.enabled).toEqual(true);
566+
});
567+
532568
it('should be able update the config of a collection with legacy vectors', async () => {
533569
const clientV2 = weaviateV2.client({
534570
host: 'http://localhost:8080',

src/collections/configure/index.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
InvertedIndexConfigCreate,
33
InvertedIndexConfigUpdate,
44
MultiTenancyConfigCreate,
5+
MultiTenancyConfigUpdate,
56
ReplicationConfigCreate,
67
ReplicationConfigUpdate,
78
ReplicationDeletionStrategy,
@@ -223,13 +224,13 @@ const reconfigure = {
223224
},
224225
},
225226
/**
226-
* Create a `ReplicationConfigUpdate` object to be used when defining the replication configuration of Weaviate.
227+
* Create a `ReplicationConfigUpdate` object to be used when updating the replication configuration of Weaviate.
227228
*
228229
* See [the docs](https://weaviate.io/developers/weaviate/concepts/replication-architecture#replication-vs-sharding) for more details.
229230
*
230-
* @param {boolean} [options.asyncEnabled] Whether asynchronous replication is enabled.
231-
* @param {ReplicationDeletionStrategy} [options.deletionStrategy] The deletion strategy when replication conflicts are detected between deletes and reads.
232-
* @param {number} [options.factor] The replication factor.
231+
* @param {boolean} [options.asyncEnabled] Whether to enable asynchronous replication.
232+
* @param {ReplicationDeletionStrategy} [options.deletionStrategy] The deletion strategy to update when replication conflicts are detected between deletes and reads.
233+
* @param {number} [options.factor] The replication factor to update.
233234
*/
234235
replication: (options: {
235236
asyncEnabled?: boolean;
@@ -242,6 +243,24 @@ const reconfigure = {
242243
factor: options.factor,
243244
};
244245
},
246+
/**
247+
* Create a `MultiTenancyConfigUpdate` object to be used when updating the multi-tenancy configuration of Weaviate.
248+
*
249+
* Note: You cannot update a single-tenant collection to become a multi-tenant collection. You must instead create a new multi-tenant collection and migrate the data over manually.
250+
*
251+
* @param {boolean} [options.autoTenantActivation] Whether to enable auto-tenant activation.
252+
* @param {boolean} [options.autoTenantCreation] Whether to enable auto-tenant creation.
253+
*
254+
*/
255+
multiTenancy: (options: {
256+
autoTenantActivation?: boolean;
257+
autoTenantCreation?: boolean;
258+
}): MultiTenancyConfigUpdate => {
259+
return {
260+
autoTenantActivation: options.autoTenantActivation,
261+
autoTenantCreation: options.autoTenantCreation,
262+
};
263+
},
245264
};
246265

247266
export {

src/collections/configure/types/base.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export type MultiTenancyConfigCreate = RecursivePartial<MultiTenancyConfig>;
3434
export type MultiTenancyConfigUpdate = {
3535
autoTenantActivation?: boolean;
3636
autoTenantCreation?: boolean;
37-
enabled?: boolean;
3837
};
3938

4039
export type NestedPropertyCreate<T = undefined> = T extends undefined

0 commit comments

Comments
 (0)