From b08f5b100e38175464dace321d3747014afa78d9 Mon Sep 17 00:00:00 2001 From: nirinchev Date: Tue, 11 Nov 2025 13:55:08 +0100 Subject: [PATCH 1/2] fix: don't extract fields from lexical search indexes --- ...ssertVectorSearchFilterFieldsAreIndexed.ts | 15 +-- src/tools/mongodb/read/aggregate.ts | 8 +- ...VectorSearchFilterFieldsAreIndexed.test.ts | 93 ++++++++++++++----- 3 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts b/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts index a7db5912..20a3f592 100644 --- a/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts +++ b/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts @@ -21,19 +21,22 @@ export type VectorSearchIndex = { } >; }; + type: "vectorSearch"; }; export function assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger, }: { - searchIndexes: VectorSearchIndex[]; + vectorSearchIndexes: VectorSearchIndex[]; pipeline: Record[]; logger: CompositeLogger; }): void { - const searchIndexesWithFilterFields = searchIndexes.reduce>( - (indexFieldMap, searchIndex) => { + const searchIndexesWithFilterFields = vectorSearchIndexes + // Ensure we only process vector search indexes and not lexical search ones + .filter((index) => index.type === "vectorSearch") + .reduce>((indexFieldMap, searchIndex) => { const filterFields = searchIndex.latestDefinition.fields .map((field) => { return field.type === "filter" ? field.path : undefined; @@ -42,9 +45,7 @@ export function assertVectorSearchFilterFieldsAreIndexed({ indexFieldMap[searchIndex.name] = filterFields; return indexFieldMap; - }, - {} - ); + }, {}); for (const stage of pipeline) { if ("$vectorSearch" in stage) { const { $vectorSearch: vectorSearchStage } = stage as z.infer; diff --git a/src/tools/mongodb/read/aggregate.ts b/src/tools/mongodb/read/aggregate.ts index d6a624cf..56e7fad5 100644 --- a/src/tools/mongodb/read/aggregate.ts +++ b/src/tools/mongodb/read/aggregate.ts @@ -20,10 +20,10 @@ import { export const AggregateArgs = { pipeline: z.array(z.union([AnyVectorSearchStage, VectorSearchStage])).describe( - `An array of aggregation stages to execute. + `An array of aggregation stages to execute. \`$vectorSearch\` **MUST** be the first stage of the pipeline, or the first stage of a \`$unionWith\` subpipeline. ### Usage Rules for \`$vectorSearch\` -- **Unset embeddings:** +- **Unset embeddings:** Unless the user explicitly requests the embeddings, add an \`$unset\` stage **at the end of the pipeline** to remove the embedding field and avoid context limits. **The $unset stage in this situation is mandatory**. - **Pre-filtering:** If the user requests additional filtering, include filters in \`$vectorSearch.filter\` only for pre-filter fields in the vector index. @@ -59,7 +59,9 @@ export class AggregateTool extends MongoDBToolBase { await this.assertOnlyUsesPermittedStages(pipeline); if (await this.session.isSearchSupported()) { assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes: (await provider.getSearchIndexes(database, collection)) as VectorSearchIndex[], + vectorSearchIndexes: (await provider.getSearchIndexes(database, collection)).filter( + (index) => index.type === "vectorSearch" + ) as VectorSearchIndex[], pipeline, logger: this.session.logger, }); diff --git a/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts b/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts index a437a916..150b20e9 100644 --- a/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts +++ b/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts @@ -196,11 +196,12 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { })), ], }, + type: "vectorSearch", }, ]; it("should not throw when all filter fields are indexed", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); const pipeline = [ { $vectorSearch: { @@ -219,7 +220,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -227,7 +228,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should not throw when filter is empty", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -243,7 +244,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -251,7 +252,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should not throw when filter is not provided", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -266,7 +267,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -274,12 +275,12 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should not throw when pipeline has no $vectorSearch stage", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [{ $match: { status: "active" } }, { $limit: 10 }]; expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -287,7 +288,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw MongoDBError when filter field is not indexed", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); const pipeline = [ { $vectorSearch: { @@ -306,7 +307,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -314,7 +315,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -327,7 +328,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw MongoDBError with all unindexed fields listed", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -347,7 +348,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -360,7 +361,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should handle nested $and and $or operators", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); const pipeline = [ { $vectorSearch: { @@ -383,7 +384,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -391,7 +392,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw when nested filter contains unindexed field", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); const pipeline = [ { $vectorSearch: { @@ -414,7 +415,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -427,7 +428,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should log warning when index is not found in searchIndexes", () => { - const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -444,7 +445,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { ]; assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }); @@ -459,7 +460,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should handle multiple $vectorSearch stages in pipeline", () => { - const searchIndexes = [ + const vectorSearchIndexes = [ ...createMockSearchIndexes("index1", ["field1", "field2"]), ...createMockSearchIndexes("index2", ["field3", "field4"]), ]; @@ -493,7 +494,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -501,7 +502,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw on second $vectorSearch stage if it has unindexed field", () => { - const searchIndexes = [ + const vectorSearchIndexes = [ ...createMockSearchIndexes("index1", ["field1", "field2"]), ...createMockSearchIndexes("index2", ["field3"]), ]; @@ -534,7 +535,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -547,12 +548,13 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should handle search index with no filter fields", () => { - const searchIndexes: VectorSearchIndex[] = [ + const vectorSearchIndexes: VectorSearchIndex[] = [ { name: "myIndex", latestDefinition: { fields: [{ type: "vector" }], }, + type: "vectorSearch", }, ]; const pipeline = [ @@ -572,7 +574,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - searchIndexes, + vectorSearchIndexes, pipeline, logger: mockLogger, }) @@ -583,4 +585,45 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { ) ); }); + + it("should ignore atlas search indexes", () => { + const vectorSearchIndexes: VectorSearchIndex[] = [ + ...createMockSearchIndexes("index1", ["field1", "field2"]), + // Atlas search index - it should be ignored by the validation + // and not cause any errors + { + name: "atlasSearchIndex", + latestDefinition: { + analyzer: "lucene.standard", + mappings: { + dynamic: false, + }, + }, + type: "search", + } as unknown as VectorSearchIndex, + ]; + + const pipeline = [ + { + $vectorSearch: { + index: "index1", + path: "embedding", + queryVector: [1, 2, 3], + numCandidates: 100, + limit: 10, + filter: { + field1: "value", + }, + }, + }, + ]; + + expect(() => + assertVectorSearchFilterFieldsAreIndexed({ + vectorSearchIndexes, + pipeline, + logger: mockLogger, + }) + ).not.toThrow(); + }); }); From 6dc2dd82931af193b6259ba265febabcf0cee58a Mon Sep 17 00:00:00 2001 From: nirinchev Date: Tue, 11 Nov 2025 21:14:38 +0100 Subject: [PATCH 2/2] clean up type definitions --- ...ssertVectorSearchFilterFieldsAreIndexed.ts | 16 +++-- src/tools/mongodb/read/aggregate.ts | 6 +- ...VectorSearchFilterFieldsAreIndexed.test.ts | 60 +++++++++---------- 3 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts b/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts index 20a3f592..3ef762b7 100644 --- a/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts +++ b/src/helpers/assertVectorSearchFilterFieldsAreIndexed.ts @@ -8,7 +8,9 @@ import { type CompositeLogger, LogId } from "../common/logger.js"; // https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-stage/#mongodb-vector-search-pre-filter const ALLOWED_LOGICAL_OPERATORS = ["$not", "$nor", "$and", "$or"]; -export type VectorSearchIndex = { +export type SearchIndex = VectorSearchIndex | AtlasSearchIndex; + +type VectorSearchIndex = { name: string; latestDefinition: { fields: Array< @@ -24,16 +26,22 @@ export type VectorSearchIndex = { type: "vectorSearch"; }; +type AtlasSearchIndex = { + name: string; + latestDefinition: unknown; + type: "search"; +}; + export function assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger, }: { - vectorSearchIndexes: VectorSearchIndex[]; + searchIndexes: SearchIndex[]; pipeline: Record[]; logger: CompositeLogger; }): void { - const searchIndexesWithFilterFields = vectorSearchIndexes + const searchIndexesWithFilterFields = searchIndexes // Ensure we only process vector search indexes and not lexical search ones .filter((index) => index.type === "vectorSearch") .reduce>((indexFieldMap, searchIndex) => { diff --git a/src/tools/mongodb/read/aggregate.ts b/src/tools/mongodb/read/aggregate.ts index 56e7fad5..142bf317 100644 --- a/src/tools/mongodb/read/aggregate.ts +++ b/src/tools/mongodb/read/aggregate.ts @@ -15,7 +15,7 @@ import { LogId } from "../../../common/logger.js"; import { AnyVectorSearchStage, VectorSearchStage } from "../mongodbSchemas.js"; import { assertVectorSearchFilterFieldsAreIndexed, - type VectorSearchIndex, + type SearchIndex, } from "../../../helpers/assertVectorSearchFilterFieldsAreIndexed.js"; export const AggregateArgs = { @@ -59,9 +59,7 @@ export class AggregateTool extends MongoDBToolBase { await this.assertOnlyUsesPermittedStages(pipeline); if (await this.session.isSearchSupported()) { assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes: (await provider.getSearchIndexes(database, collection)).filter( - (index) => index.type === "vectorSearch" - ) as VectorSearchIndex[], + searchIndexes: (await provider.getSearchIndexes(database, collection)) as SearchIndex[], pipeline, logger: this.session.logger, }); diff --git a/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts b/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts index 150b20e9..422c983c 100644 --- a/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts +++ b/tests/unit/helpers/assertVectorSearchFilterFieldsAreIndexed.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it, vi } from "vitest"; import { assertVectorSearchFilterFieldsAreIndexed, collectFieldsFromVectorSearchFilter, - type VectorSearchIndex, + type SearchIndex, } from "../../../src/helpers/assertVectorSearchFilterFieldsAreIndexed.js"; import { ErrorCodes, MongoDBError } from "../../../src/common/errors.js"; import { type CompositeLogger, LogId } from "../../../src/common/logger.js"; @@ -184,7 +184,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { error: vi.fn(), } as unknown as CompositeLogger; - const createMockSearchIndexes = (indexName: string, filterFields: string[]): VectorSearchIndex[] => [ + const createMockSearchIndexes = (indexName: string, filterFields: string[]): SearchIndex[] => [ { name: indexName, latestDefinition: { @@ -201,7 +201,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { ]; it("should not throw when all filter fields are indexed", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); const pipeline = [ { $vectorSearch: { @@ -220,7 +220,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -228,7 +228,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should not throw when filter is empty", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -244,7 +244,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -252,7 +252,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should not throw when filter is not provided", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -267,7 +267,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -275,12 +275,12 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should not throw when pipeline has no $vectorSearch stage", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [{ $match: { status: "active" } }, { $limit: 10 }]; expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -288,7 +288,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw MongoDBError when filter field is not indexed", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); const pipeline = [ { $vectorSearch: { @@ -307,7 +307,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -315,7 +315,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -328,7 +328,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw MongoDBError with all unindexed fields listed", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -348,7 +348,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -361,7 +361,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should handle nested $and and $or operators", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2", "field3"]); const pipeline = [ { $vectorSearch: { @@ -384,7 +384,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -392,7 +392,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw when nested filter contains unindexed field", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1", "field2"]); const pipeline = [ { $vectorSearch: { @@ -415,7 +415,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -428,7 +428,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should log warning when index is not found in searchIndexes", () => { - const vectorSearchIndexes = createMockSearchIndexes("myIndex", ["field1"]); + const searchIndexes = createMockSearchIndexes("myIndex", ["field1"]); const pipeline = [ { $vectorSearch: { @@ -445,7 +445,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { ]; assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }); @@ -460,7 +460,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should handle multiple $vectorSearch stages in pipeline", () => { - const vectorSearchIndexes = [ + const searchIndexes = [ ...createMockSearchIndexes("index1", ["field1", "field2"]), ...createMockSearchIndexes("index2", ["field3", "field4"]), ]; @@ -494,7 +494,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -502,7 +502,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should throw on second $vectorSearch stage if it has unindexed field", () => { - const vectorSearchIndexes = [ + const searchIndexes = [ ...createMockSearchIndexes("index1", ["field1", "field2"]), ...createMockSearchIndexes("index2", ["field3"]), ]; @@ -535,7 +535,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -548,7 +548,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should handle search index with no filter fields", () => { - const vectorSearchIndexes: VectorSearchIndex[] = [ + const searchIndexes: SearchIndex[] = [ { name: "myIndex", latestDefinition: { @@ -574,7 +574,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes, pipeline, logger: mockLogger, }) @@ -587,7 +587,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }); it("should ignore atlas search indexes", () => { - const vectorSearchIndexes: VectorSearchIndex[] = [ + const searchIndexes: SearchIndex[] = [ ...createMockSearchIndexes("index1", ["field1", "field2"]), // Atlas search index - it should be ignored by the validation // and not cause any errors @@ -600,7 +600,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { }, }, type: "search", - } as unknown as VectorSearchIndex, + }, ]; const pipeline = [ @@ -620,7 +620,7 @@ describe("#assertVectorSearchFilterFieldsAreIndexed", () => { expect(() => assertVectorSearchFilterFieldsAreIndexed({ - vectorSearchIndexes, + searchIndexes: searchIndexes, pipeline, logger: mockLogger, })