Skip to content

Commit d3dd935

Browse files
committed
Fix parsing and checking logic for old Weaviate versions with vector deprs
1 parent f0920fd commit d3dd935

File tree

4 files changed

+93
-34
lines changed

4 files changed

+93
-34
lines changed

src/collections/query/check.ts

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,23 @@ export class Check<T> {
6666
return check.supports;
6767
};
6868

69-
private checkSupportForMultiTargetSearchMultiWeights = async (opts?: BaseNearOptions<T>) => {
70-
if (!Serialize.isMultiTargetMultiWeights(opts)) return false;
71-
const check = await this.dbVersionSupport.supportsMultiTargetVectorSearchMultiWeights();
69+
private checkSupportForMultiVectorSearch = async (vec?: NearVectorInputType) => {
70+
if (!Serialize.isMultiVector(vec)) return false;
71+
const check = await this.dbVersionSupport.supportsMultiVectorSearch();
7272
if (!check.supports) throw new WeaviateUnsupportedFeatureError(check.message);
7373
return check.supports;
7474
};
7575

76-
private checkSupportForMultiVectorSearch = async (vec?: BaseHybridOptions<T>['vector']) => {
77-
if (!Serialize.isHybridVectorSearch(vec) || !Serialize.isMultiVector(vec)) return false;
78-
const check = await this.dbVersionSupport.supportsMultiVectorSearch();
76+
private checkSupportForMultiWeightPerTargetSearch = async (opts?: BaseNearOptions<T>) => {
77+
if (!Serialize.isMultiWeightPerTarget(opts)) return false;
78+
const check = await this.dbVersionSupport.supportsMultiWeightsPerTargetSearch();
79+
if (!check.supports) throw new WeaviateUnsupportedFeatureError(check.message);
80+
return check.supports;
81+
};
82+
83+
private checkSupportForMultiVectorPerTargetSearch = async (vec?: NearVectorInputType) => {
84+
if (!Serialize.isMultiVectorPerTarget(vec)) return false;
85+
const check = await this.dbVersionSupport.supportsMultiVectorPerTargetSearch();
7986
if (!check.supports) throw new WeaviateUnsupportedFeatureError(check.message);
8087
return check.supports;
8188
};
@@ -84,7 +91,7 @@ export class Check<T> {
8491
return Promise.all([
8592
this.getSearcher(),
8693
this.checkSupportForMultiTargetSearch(opts),
87-
this.checkSupportForMultiTargetSearchMultiWeights(opts),
94+
this.checkSupportForMultiWeightPerTargetSearch(opts),
8895
this.checkSupportForNamedVectors(opts),
8996
]).then(([search, supportsTargets, supportsWeightsForTargets]) => {
9097
return { search, supportsTargets, supportsWeightsForTargets };
@@ -95,26 +102,58 @@ export class Check<T> {
95102
return Promise.all([
96103
this.getSearcher(),
97104
this.checkSupportForMultiTargetSearch(opts),
98-
this.checkSupportForMultiTargetSearchMultiWeights(opts),
99105
this.checkSupportForMultiVectorSearch(vec),
106+
this.checkSupportForMultiVectorPerTargetSearch(vec),
107+
this.checkSupportForMultiWeightPerTargetSearch(opts),
100108
this.checkSupportForNamedVectors(opts),
101-
]).then(([search, supportsTargets, supportsWeightsForTargets, supportsVectorsForTargets]) => {
102-
return { search, supportsTargets, supportsVectorsForTargets, supportsWeightsForTargets };
103-
});
109+
]).then(
110+
([
111+
search,
112+
supportsMultiTarget,
113+
supportMultiVector,
114+
supportsVectorsForTargets,
115+
supportsWeightsForTargets,
116+
]) => {
117+
return {
118+
search,
119+
supportsTargets: supportsMultiTarget || supportMultiVector,
120+
supportsVectorsForTargets,
121+
supportsWeightsForTargets,
122+
};
123+
}
124+
);
104125
};
105126

106127
public hybridSearch = (opts?: BaseHybridOptions<T>) => {
107128
return Promise.all([
108129
this.getSearcher(),
109130
this.checkSupportForMultiTargetSearch(opts),
110-
this.checkSupportForMultiTargetSearchMultiWeights(opts),
111-
this.checkSupportForMultiVectorSearch(opts?.vector),
131+
this.checkSupportForMultiVectorSearch(
132+
Serialize.isHybridVectorSearch(opts?.vector) ? opts?.vector : undefined
133+
),
134+
this.checkSupportForMultiVectorPerTargetSearch(
135+
Serialize.isHybridVectorSearch(opts?.vector) ? opts?.vector : undefined
136+
),
137+
this.checkSupportForMultiWeightPerTargetSearch(opts),
112138
this.checkSupportForNamedVectors(opts),
113139
this.checkSupportForBm25AndHybridGroupByQueries('Hybrid', opts),
114140
this.checkSupportForHybridNearTextAndNearVectorSubSearches(opts),
115-
]).then(([search, supportsTargets, supportsWeightsForTargets, supportsVectorsForTargets]) => {
116-
return { search, supportsTargets, supportsWeightsForTargets, supportsVectorsForTargets };
117-
});
141+
]).then(
142+
([
143+
search,
144+
supportsMultiTarget,
145+
supportMultiVector,
146+
supportsWeightsForTargets,
147+
supportsVectorsForTargets,
148+
]) => {
149+
return {
150+
search,
151+
supportsTargets: supportsMultiTarget || supportMultiVector,
152+
supportsWeightsForTargets,
153+
supportsVectorsForTargets,
154+
};
155+
}
156+
);
118157
};
119158

120159
public fetchObjects = (opts?: FetchObjectsOptions<T>) => {

src/collections/query/integration.test.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -860,9 +860,8 @@ describe('Testing of the collection.query methods with a collection with a multi
860860
expect(ret.objects[1].properties.title).toEqual('test');
861861
});
862862

863-
it.only('should perform a nearVector vector search over two named vector spaces', async () => {
863+
it('should perform a nearVector vector search over two named vector spaces', async () => {
864864
const one = await collection.query.fetchObjectById(id1, { includeVector: true });
865-
const two = await collection.query.fetchObjectById(id2, { includeVector: true });
866865

867866
const query = () =>
868867
collection.query.nearVector(
@@ -875,7 +874,7 @@ describe('Testing of the collection.query methods with a collection with a multi
875874
}
876875
);
877876

878-
if (await client.getWeaviateVersion().then((ver) => ver.isLowerThan(1, 27, 0))) {
877+
if (await client.getWeaviateVersion().then((ver) => ver.isLowerThan(1, 26, 0))) {
879878
await expect(query()).rejects.toThrow(WeaviateUnsupportedFeatureError);
880879
return;
881880
}
@@ -886,7 +885,7 @@ describe('Testing of the collection.query methods with a collection with a multi
886885
expect(ret.objects[1].properties.title).toEqual('other');
887886
});
888887

889-
it('should perform a multi nearVector vector search over one named vector space', async () => {
888+
it('should perform a multi-per-target nearVector vector search over one named vector space', async () => {
890889
const one = await collection.query.fetchObjectById(id1, { includeVector: true });
891890
const two = await collection.query.fetchObjectById(id2, { includeVector: true });
892891

@@ -926,7 +925,7 @@ describe('Testing of the collection.query methods with a collection with a multi
926925
}
927926
);
928927

929-
if (await client.getWeaviateVersion().then((ver) => ver.isLowerThan(1, 27, 0))) {
928+
if (await client.getWeaviateVersion().then((ver) => ver.isLowerThan(1, 26, 0))) {
930929
await expect(query()).rejects.toThrow(WeaviateUnsupportedFeatureError);
931930
return;
932931
}

src/collections/serialize/index.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ export class Serialize {
328328
return opts?.targetVector !== undefined && !TargetVectorInputGuards.isSingle(opts.targetVector);
329329
};
330330

331-
public static isMultiTargetMultiWeights = <T>(opts?: BaseNearOptions<T>): boolean => {
331+
public static isMultiWeightPerTarget = <T>(opts?: BaseNearOptions<T>): boolean => {
332332
return (
333333
opts?.targetVector !== undefined &&
334334
TargetVectorInputGuards.isMultiJoin(opts.targetVector) &&
@@ -338,6 +338,10 @@ export class Serialize {
338338
};
339339

340340
public static isMultiVector = (vec?: NearVectorInputType): boolean => {
341+
return vec !== undefined && !Array.isArray(vec) && Object.values(vec).every(ArrayInputGuards.is1DArray);
342+
};
343+
344+
public static isMultiVectorPerTarget = (vec?: NearVectorInputType): boolean => {
341345
return vec !== undefined && !Array.isArray(vec) && Object.values(vec).some(ArrayInputGuards.is2DArray);
342346
};
343347

@@ -781,6 +785,11 @@ export class Serialize {
781785
vectorForTargets,
782786
};
783787
} else {
788+
if (!args.supportsTargets) {
789+
throw new WeaviateUnsupportedFeatureError(
790+
'Multi-vector search is not supported in this Weaviate version. Please upgrade to at least Weaviate 1.26.0'
791+
);
792+
}
784793
const vectorPerTarget: Record<string, Uint8Array> = {};
785794
Object.entries(args.vector).forEach(([k, v]) => {
786795
if (ArrayInputGuards.is2DArray(v)) {
@@ -798,13 +807,17 @@ export class Serialize {
798807
vectorPerTarget,
799808
};
800809
} else {
801-
const targets = Targets.fromPartial({
802-
targetVectors: Object.keys(vectorPerTarget),
803-
});
804-
return {
805-
targets,
806-
vectorPerTarget,
807-
};
810+
return args.supportsTargets
811+
? {
812+
targets: Targets.fromPartial({
813+
targetVectors: Object.keys(vectorPerTarget),
814+
}),
815+
vectorPerTarget,
816+
}
817+
: {
818+
targetVectors: Object.keys(vectorPerTarget),
819+
vectorPerTarget,
820+
};
808821
}
809822
}
810823
} else {
@@ -902,13 +915,11 @@ export class Serialize {
902915
supportsWeightsForTargets: boolean;
903916
} & NearOptions<T>
904917
): SearchNearVectorArgs => {
905-
const o = {
918+
return {
906919
...Serialize.common(args),
907920
nearVector: Serialize.nearVectorSearch(args),
908921
autocut: args.autoLimit,
909922
};
910-
console.log(o.nearVector);
911-
return o;
912923
};
913924

914925
public static nearVideo = <T>(

src/utils/dbVersion.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,16 +159,26 @@ export class DbVersionSupport {
159159
};
160160

161161
supportsMultiVectorSearch = () => {
162+
return this.dbVersionProvider.getVersion().then((version) => {
163+
return {
164+
version: version,
165+
supports: version.isAtLeast(1, 26, 0),
166+
message: this.errorMessage('Multi-vector search', version.show(), '1.26.0'),
167+
};
168+
});
169+
};
170+
171+
supportsMultiVectorPerTargetSearch = () => {
162172
return this.dbVersionProvider.getVersion().then((version) => {
163173
return {
164174
version: version,
165175
supports: version.isAtLeast(1, 27, 0),
166-
message: this.errorMessage('Multi-vector search', version.show(), '1.27.0'),
176+
message: this.errorMessage('Multi-vector-per-target search', version.show(), '1.27.0'),
167177
};
168178
});
169179
};
170180

171-
supportsMultiTargetVectorSearchMultiWeights = () => {
181+
supportsMultiWeightsPerTargetSearch = () => {
172182
return this.dbVersionProvider.getVersion().then((version) => {
173183
return {
174184
version: version,

0 commit comments

Comments
 (0)