Skip to content

.Net: Rename VectorSearchOptions.NewFilter to Filter #10790

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public async Task IngestDataAndSearchAsync<TKey>(string collectionName, Func<TKe
// Search the collection using a vector search with pre-filtering.
searchString = "What is Retrieval Augmented Generation";
searchVector = await textEmbeddingGenerationService.GenerateEmbeddingAsync(searchString);
searchResult = await collection.VectorizedSearchAsync(searchVector, new() { Top = 3, NewFilter = g => g.Category == "External Definitions" });
searchResult = await collection.VectorizedSearchAsync(searchVector, new() { Top = 3, Filter = g => g.Category == "External Definitions" });
resultRecords = await searchResult.Results.ToListAsync();

output.WriteLine("Search string: " + searchString);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public async Task ExampleAsync()
// Search the collection using a vector search with pre-filtering.
searchString = "What is Retrieval Augmented Generation";
searchVector = await textEmbeddingGenerationService.GenerateEmbeddingAsync(searchString);
searchResult = await collection.VectorizedSearchAsync(searchVector, new() { Top = 3, NewFilter = g => g.Category == "External Definitions" });
searchResult = await collection.VectorizedSearchAsync(searchVector, new() { Top = 3, Filter = g => g.Category == "External Definitions" });
resultRecords = await searchResult.Results.ToListAsync();

Console.WriteLine("Search string: " + searchString);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public async Task SearchAnInMemoryVectorStoreWithFilteringAsync()
new()
{
Top = 1,
NewFilter = g => g.Category == "AI"
Filter = g => g.Category == "AI"
});
var searchResultItems = await searchResult.Results.ToListAsync();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ public async Task CanSearchWithVectorAndFilterAsync()
{
Top = 5,
Skip = 3,
Filter = filter,
OldFilter = filter,
VectorPropertyName = nameof(MultiPropsModel.Vector1)
},
this._testCancellationToken);
Expand Down Expand Up @@ -616,7 +616,7 @@ public async Task CanSearchWithTextAndFilterAsync()
{
Top = 5,
Skip = 3,
Filter = filter,
OldFilter = filter,
VectorPropertyName = nameof(MultiPropsModel.Vector1)
},
this._testCancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void BuildSearchQueryByDefaultReturnsValidQueryDefinition()
.EqualTo("TestProperty2", "test-value-2")
.AnyTagEqualTo("TestProperty3", "test-value-3");

var searchOptions = new VectorSearchOptions<DummyType> { Filter = filter, Skip = 5, Top = 10 };
var searchOptions = new VectorSearchOptions<DummyType> { OldFilter = filter, Skip = 5, Top = 10 };

// Act
var queryDefinition = AzureCosmosDBNoSQLVectorStoreCollectionQueryBuilder.BuildSearchQuery(
Expand Down Expand Up @@ -86,7 +86,7 @@ public void BuildSearchQueryWithoutOffsetReturnsQueryDefinitionWithTopParameter(
.EqualTo("TestProperty2", "test-value-2")
.AnyTagEqualTo("TestProperty3", "test-value-3");

var searchOptions = new VectorSearchOptions<DummyType> { Filter = filter, Top = 10 };
var searchOptions = new VectorSearchOptions<DummyType> { OldFilter = filter, Top = 10 };

// Act
var queryDefinition = AzureCosmosDBNoSQLVectorStoreCollectionQueryBuilder.BuildSearchQuery(
Expand Down Expand Up @@ -131,7 +131,7 @@ public void BuildSearchQueryWithInvalidFilterThrowsException()

var filter = new VectorSearchFilter().EqualTo("non-existent-property", "test-value-2");

var searchOptions = new VectorSearchOptions<DummyType> { Filter = filter, Skip = 5, Top = 10 };
var searchOptions = new VectorSearchOptions<DummyType> { OldFilter = filter, Skip = 5, Top = 10 };

// Act & Assert
Assert.Throws<InvalidOperationException>(() =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ public async Task CanSearchWithVectorAndFilterAsync<TKey>(bool useDefinition, TK
var filter = filterType == "Equality" ? new VectorSearchFilter().EqualTo("Data", $"data {testKey2}") : new VectorSearchFilter().AnyTagEqualTo("Tags", $"tag {testKey2}");
var actual = await sut.VectorizedSearchAsync(
new ReadOnlyMemory<float>(new float[] { 1, 1, 1, 1 }),
new() { IncludeVectors = true, Filter = filter, IncludeTotalCount = true },
new() { IncludeVectors = true, OldFilter = filter, IncludeTotalCount = true },
this._testCancellationToken);

// Assert
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,9 +340,9 @@ public virtual Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TVector>
// Build filter object.
var filter = internalOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => AzureAISearchVectorStoreCollectionSearchMapping.BuildLegacyFilterString(legacyFilter, this._propertyReader.JsonPropertyNamesMap),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new AzureAISearchFilterTranslator().Translate(newFilter, this._propertyReader.StoragePropertyNamesMap),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => AzureAISearchVectorStoreCollectionSearchMapping.BuildLegacyFilterString(legacyFilter, this._propertyReader.JsonPropertyNamesMap),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new AzureAISearchFilterTranslator().Translate(newFilter, this._propertyReader.StoragePropertyNamesMap),
_ => null
};
#pragma warning restore CS0618
Expand Down Expand Up @@ -395,9 +395,9 @@ public virtual Task<VectorSearchResults<TRecord>> VectorizableTextSearchAsync(st
// Build filter object.
var filter = internalOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => AzureAISearchVectorStoreCollectionSearchMapping.BuildLegacyFilterString(legacyFilter, this._propertyReader.JsonPropertyNamesMap),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new AzureAISearchFilterTranslator().Translate(newFilter, this._propertyReader.StoragePropertyNamesMap),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => AzureAISearchVectorStoreCollectionSearchMapping.BuildLegacyFilterString(legacyFilter, this._propertyReader.JsonPropertyNamesMap),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new AzureAISearchFilterTranslator().Translate(newFilter, this._propertyReader.StoragePropertyNamesMap),
_ => null
};
#pragma warning restore CS0618
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,11 +275,11 @@ public virtual async Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TV
#pragma warning disable CS0618 // VectorSearchFilter is obsolete
var filter = searchOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => AzureCosmosDBMongoDBVectorStoreCollectionSearchMapping.BuildFilter(
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => AzureCosmosDBMongoDBVectorStoreCollectionSearchMapping.BuildFilter(
legacyFilter,
this._storagePropertyNames),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new AzureCosmosDBMongoDBFilterTranslator().Translate(newFilter, this._storagePropertyNames),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new AzureCosmosDBMongoDBFilterTranslator().Translate(newFilter, this._storagePropertyNames),
_ => null
};
#pragma warning restore CS0618
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ public static QueryDefinition BuildSearchQuery<TVector, TRecord>(
// Build filter object.
var (whereClause, filterParameters) = searchOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => BuildSearchFilter(legacyFilter, storagePropertyNames),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new AzureCosmosDBNoSqlFilterTranslator().Translate(newFilter, storagePropertyNames),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => BuildSearchFilter(legacyFilter, storagePropertyNames),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new AzureCosmosDBNoSqlFilterTranslator().Translate(newFilter, storagePropertyNames),
_ => (null, [])
};
#pragma warning restore CS0618 // VectorSearchFilter is obsolete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,9 +240,9 @@ public async Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TVector>(T
var allValues = this.GetCollectionDictionary().Values.Cast<TRecord>();
var filteredRecords = internalOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => InMemoryVectorStoreCollectionSearchMapping.FilterRecords(legacyFilter, allValues),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => allValues.AsQueryable().Where(newFilter),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => InMemoryVectorStoreCollectionSearchMapping.FilterRecords(legacyFilter, allValues),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => allValues.AsQueryable().Where(newFilter),
_ => allValues
};
#pragma warning restore CS0618 // VectorSearchFilter is obsolete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,9 +278,9 @@ public virtual async Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TV
#pragma warning disable CS0618 // VectorSearchFilter is obsolete
var filter = searchOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => MongoDBVectorStoreCollectionSearchMapping.BuildLegacyFilter(legacyFilter, this._storagePropertyNames),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new MongoDBFilterTranslator().Translate(newFilter, this._storagePropertyNames),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => MongoDBVectorStoreCollectionSearchMapping.BuildLegacyFilter(legacyFilter, this._storagePropertyNames),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new MongoDBFilterTranslator().Translate(newFilter, this._storagePropertyNames),
_ => null
};
#pragma warning restore CS0618
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ public virtual async Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TV

#pragma warning disable CS0618 // FilterClause is obsolete
var filter = PineconeVectorStoreCollectionSearchMapping.BuildSearchFilter(
internalOptions.Filter?.FilterClauses,
internalOptions.OldFilter?.FilterClauses,
this._propertyReader.StoragePropertyNamesMap);
#pragma warning restore CS0618

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ public PostgresSqlCommandInfo BuildGetNearestMatchCommand<TRecord>(
#pragma warning disable CS0618 // VectorSearchFilter is obsolete
var (where, parameters) = (oldFilter: legacyFilter, newFilter) switch
{
(not null, not null) => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
(not null, not null) => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
(not null, null) => GenerateLegacyFilterWhereClause(schema, tableName, propertyReader.RecordDefinition.Properties, legacyFilter, startParamIndex: 2),
(null, not null) => new PostgresFilterTranslator().Translate(propertyReader.StoragePropertyNamesMap, newFilter, startParamIndex: 2),
_ => (Clause: string.Empty, Parameters: [])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,9 +290,9 @@ public virtual Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TVector>
pgVector,
searchOptions.Top,
#pragma warning disable CS0618 // VectorSearchFilter is obsolete
searchOptions.Filter,
searchOptions.OldFilter,
#pragma warning restore CS0618 // VectorSearchFilter is obsolete
searchOptions.NewFilter,
searchOptions.Filter,
searchOptions.Skip,
searchOptions.IncludeVectors,
cancellationToken)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -478,9 +478,9 @@ public virtual async Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TV
// Build filter object.
var filter = internalOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => QdrantVectorStoreCollectionSearchMapping.BuildFromLegacyFilter(legacyFilter, this._propertyReader.StoragePropertyNamesMap),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new QdrantFilterTranslator().Translate(newFilter, this._propertyReader.StoragePropertyNamesMap),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => QdrantVectorStoreCollectionSearchMapping.BuildFromLegacyFilter(legacyFilter, this._propertyReader.StoragePropertyNamesMap),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new QdrantFilterTranslator().Translate(newFilter, this._propertyReader.StoragePropertyNamesMap),
_ => new Filter()
};
#pragma warning restore CS0618 // Type or member is obsolete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ public static Query BuildQuery<TRecord>(byte[] vectorBytes, VectorSearchOptions<
#pragma warning disable CS0618 // Type or member is obsolete
var filter = options switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => BuildLegacyFilter(legacyFilter, storagePropertyNames),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new RedisFilterTranslator().Translate(newFilter, storagePropertyNames),
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => BuildLegacyFilter(legacyFilter, storagePropertyNames),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new RedisFilterTranslator().Translate(newFilter, storagePropertyNames),
_ => "*"
};
#pragma warning restore CS0618 // Type or member is obsolete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,22 +195,22 @@ public virtual Task<VectorSearchResults<TRecord>> VectorizedSearchAsync<TVector>

if (searchOptions.Filter is not null)
{
if (searchOptions.NewFilter is not null)
if (searchOptions.Filter is not null)
{
throw new ArgumentException("Either Filter or NewFilter can be specified, but not both");
throw new ArgumentException("Either Filter or OldFilter can be specified, but not both");
}

// Old filter, we translate it to a list of SqliteWhereCondition, and merge these into the conditions we already have
var filterConditions = this.GetFilterConditions(searchOptions.Filter, this._dataTableName);
var filterConditions = this.GetFilterConditions(searchOptions.OldFilter, this._dataTableName);

if (filterConditions is { Count: > 0 })
{
conditions.AddRange(filterConditions);
}
}
else if (searchOptions.NewFilter is not null)
else if (searchOptions.Filter is not null)
{
(extraWhereFilter, extraParameters) = new SqliteFilterTranslator().Translate(this._propertyReader.StoragePropertyNamesMap, searchOptions.NewFilter);
(extraWhereFilter, extraParameters) = new SqliteFilterTranslator().Translate(this._propertyReader.StoragePropertyNamesMap, searchOptions.Filter);
}
#pragma warning restore CS0618 // VectorSearchFilter is obsolete

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ public static string BuildSearchQuery<TRecord, TVector>(
#pragma warning disable CS0618 // VectorSearchFilter is obsolete
var filter = searchOptions switch
{
{ Filter: not null, NewFilter: not null } => throw new ArgumentException("Either Filter or NewFilter can be specified, but not both"),
{ Filter: VectorSearchFilter legacyFilter } => BuildLegacyFilter(
{ OldFilter: not null, Filter: not null } => throw new ArgumentException("Either Filter or OldFilter can be specified, but not both"),
{ OldFilter: VectorSearchFilter legacyFilter } => BuildLegacyFilter(
legacyFilter,
jsonSerializerOptions,
keyPropertyName,
storagePropertyNames),
{ NewFilter: Expression<Func<TRecord, bool>> newFilter } => new WeaviateFilterTranslator().Translate(newFilter, storagePropertyNames),
{ Filter: Expression<Func<TRecord, bool>> newFilter } => new WeaviateFilterTranslator().Translate(newFilter, storagePropertyNames),
_ => null
};
#pragma warning restore CS0618
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@ public async Task CanSearchWithVectorAndFilterAsync<TKey>(bool useDefinition, bo
// Act.
var actual = await sut.VectorizedSearchAsync(
new ReadOnlyMemory<float>(new[] { 1f, 2f, 3f, 4f }),
new() { IncludeVectors = true, Filter = filter, Top = 5, Skip = 2 },
new() { IncludeVectors = true, OldFilter = filter, Top = 5, Skip = 2 },
this._testCancellationToken);

// Assert.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ public async Task CanSearchWithVectorAndFilterAsync(bool useDefinition, bool inc
new()
{
IncludeVectors = includeVectors,
Filter = filter,
OldFilter = filter,
Top = 5,
Skip = 2
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ public async Task CanSearchWithVectorAndFilterAsync(bool useDefinition)
new()
{
IncludeVectors = true,
Filter = filter,
OldFilter = filter,
Top = 5,
Skip = 2
});
Expand Down
Loading
Loading