Skip to content

Commit b89e990

Browse files
committed
attr
1 parent 876adfb commit b89e990

File tree

1 file changed

+75
-30
lines changed

1 file changed

+75
-30
lines changed

tests/NRedisStack.Tests/Search/HybridSearchIntegrationTests.cs

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,17 @@ private async Task<Api> CreateIndexAsync(string endpointId, [CallerMemberName] s
6464
{
6565
halves[j] = (Half)rand.NextDouble();
6666
}
67-
HashEntry[] entry = [
67+
68+
HashEntry[] entry =
69+
[
6870
new("text1", $"Search entry {i}"),
6971
new("tag1", tags[rand.Next(tags.Length)]),
7072
new("numeric1", rand.Next(0, 32)),
71-
new("vector1", vec)];
73+
new("vector1", vec)
74+
];
7275
last = db.HashSetAsync($"{index}_entry{i}", entry);
7376
}
77+
7478
await last;
7579
#else
7680
throw new PlatformNotSupportedException("FP16");
@@ -134,13 +138,13 @@ public enum Scenario
134138
{
135139
Simple,
136140
NoSort,
137-
[Obsolete] ExplainScore,
141+
[Broken] ExplainScore,
138142
Apply,
139143
LinearNoScore,
140-
[Obsolete]LinearWithScore,
144+
LinearWithScore,
141145
RrfNoScore,
142-
[Obsolete]RrfWithScore,
143-
[Obsolete]PostFilterByTag,
146+
RrfWithScore,
147+
[Broken] PostFilterByTag,
144148
PostFilterByNumber,
145149
LimitFirstPage,
146150
LimitSecondPage,
@@ -155,26 +159,36 @@ public enum Scenario
155159
GroupByNoReduce,
156160
SearchWithAlias,
157161
SearchWithSimpleScorer,
158-
[Obsolete]SearchWithComplexScorer,
159-
[Obsolete]VectorWithAlias,
162+
[Broken] SearchWithComplexScorer,
163+
VectorWithAlias,
160164
VectorWithRange,
161-
[Obsolete]VectorWithRangeAndDistanceAlias,
162-
[Obsolete]VectorWithRangeAndEpsilon,
165+
[Broken] VectorWithRangeAndDistanceAlias,
166+
VectorWithRangeAndEpsilon,
163167
VectorWithTagFilter,
164168
VectorWithNumericFilter,
165169
VectorWithNearest,
166170
VectorWithNearestCount,
167-
[Obsolete]VectorWithNearestDistAlias,
168-
[Obsolete]VectorWithNearestMaxCandidates,
171+
[Broken] VectorWithNearestDistAlias,
172+
VectorWithNearestMaxCandidates,
169173
PreFilterByTag,
170-
PreFilterByNumeric
174+
PreFilterByNumeric,
175+
[Broken] ParamPostFilter,
176+
ParamSearch,
177+
ParamVsim,
178+
[Broken] ParamMultiPostFilter,
179+
ParamPreFilter,
180+
ParamMultiPreFilter
181+
}
182+
183+
private sealed class BrokenAttribute : Attribute
184+
{
171185
}
172186

173187
private static class EnumCache<T>
174188
{
175189
public static IEnumerable<T> Values { get; } = (
176190
from field in typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static)
177-
where !Attribute.IsDefined(field, typeof(ObsoleteAttribute))
191+
where !Attribute.IsDefined(field, typeof(BrokenAttribute))
178192
let val = field.GetRawConstantValue()
179193
where val is not null
180194
select (T)val).ToArray();
@@ -217,16 +231,26 @@ public async Task TestSearchScenarios(string endpointId, Scenario scenario)
217231
Scenario.SearchWithAlias => query.Search(new(text, scoreAlias: "score_alias")),
218232
Scenario.SearchWithSimpleScorer => query.Search(new(text, scorer: Scorer.TfIdf)),
219233
Scenario.SearchWithComplexScorer => query.Search(new(text, scorer: Scorer.BM25StdTanh(7))),
220-
Scenario.VectorWithAlias => query.VectorSearch(new("@vector1", VectorData.Raw(vec), scoreAlias: "score_alias" )),
221-
Scenario.VectorWithRange => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.Range(42))),
222-
Scenario.VectorWithRangeAndDistanceAlias => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.Range(42, distanceAlias: "dist_alias"))),
223-
Scenario.VectorWithRangeAndEpsilon => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.Range(42, epsilon: 0.1))),
224-
Scenario.VectorWithNearest => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.NearestNeighbour())),
225-
Scenario.VectorWithNearestCount => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.NearestNeighbour(20))),
226-
Scenario.VectorWithNearestDistAlias => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.NearestNeighbour(distanceAlias: "dist_alias"))),
227-
Scenario.VectorWithNearestMaxCandidates => query.VectorSearch(new("@vector1", VectorData.Raw(vec), method: VectorSearchMethod.NearestNeighbour(maxTopCandidates: 10))),
228-
Scenario.VectorWithTagFilter => query.VectorSearch(new("@vector1", VectorData.Raw(vec), filter: "@tag1:{foo}")),
229-
Scenario.VectorWithNumericFilter => query.VectorSearch(new("@vector1", VectorData.Raw(vec), filter: "@numeric1!=0")),
234+
Scenario.VectorWithAlias => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
235+
scoreAlias: "score_alias")),
236+
Scenario.VectorWithRange => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
237+
method: VectorSearchMethod.Range(42))),
238+
Scenario.VectorWithRangeAndDistanceAlias => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
239+
method: VectorSearchMethod.Range(42, distanceAlias: "dist_alias"))),
240+
Scenario.VectorWithRangeAndEpsilon => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
241+
method: VectorSearchMethod.Range(42, epsilon: 0.1))),
242+
Scenario.VectorWithNearest => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
243+
method: VectorSearchMethod.NearestNeighbour())),
244+
Scenario.VectorWithNearestCount => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
245+
method: VectorSearchMethod.NearestNeighbour(20))),
246+
Scenario.VectorWithNearestDistAlias => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
247+
method: VectorSearchMethod.NearestNeighbour(distanceAlias: "dist_alias"))),
248+
Scenario.VectorWithNearestMaxCandidates => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
249+
method: VectorSearchMethod.NearestNeighbour(maxTopCandidates: 10))),
250+
Scenario.VectorWithTagFilter => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
251+
filter: "@tag1:{foo}")),
252+
Scenario.VectorWithNumericFilter => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
253+
filter: "@numeric1!=0")),
230254
Scenario.NoSort => query.NoSort(),
231255
Scenario.ExplainScore => query.ExplainScore(),
232256
Scenario.Apply => query.ReturnFields([..fields, "@numeric1"])
@@ -236,7 +260,8 @@ public async Task TestSearchScenarios(string endpointId, Scenario scenario)
236260
Scenario.RrfNoScore => query.Combine(HybridSearchQuery.Combiner.ReciprocalRankFusion(10, 1.2)),
237261
Scenario.RrfWithScore => query.Combine(HybridSearchQuery.Combiner.ReciprocalRankFusion(), "rrf_score"),
238262
Scenario.PreFilterByTag => query.VectorSearch(new("@vector1", VectorData.Raw(vec), filter: "@tag1:{foo}")),
239-
Scenario.PreFilterByNumeric => query.VectorSearch(new("@vector1", VectorData.Raw(vec), filter: "@numeric1!=0")),
263+
Scenario.PreFilterByNumeric => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
264+
filter: "@numeric1!=0")),
240265
Scenario.PostFilterByTag => query.Filter("@tag1:{foo}"),
241266
Scenario.PostFilterByNumber => query.ReturnFields([..fields, "@numeric1"]).Filter("@numeric1!=0"),
242267
Scenario.LimitFirstPage => query.Limit(0, 2),
@@ -248,14 +273,34 @@ public async Task TestSearchScenarios(string endpointId, Scenario scenario)
248273
Scenario.GroupByNoReduce => query.GroupBy("@tag1"),
249274
Scenario.ReduceSingleSimpleWithAlias => query.GroupBy("@tag1").Reduce(Reducers.Avg("@numeric1").As("avg")),
250275
Scenario.ReduceSingleSimpleWithoutAlias => query.GroupBy("@tag1").Reduce(Reducers.Sum("@numeric1")),
251-
Scenario.ReduceSingleComplexWithAlias => query.GroupBy("@tag1").Reduce(Reducers.Quantile("@numeric1", 0.5).As("qt")),
252-
Scenario.ReduceMulti => query.GroupBy("@tag1").Reduce(Reducers.Count().As("count"), Reducers.Min("@numeric1").As("min"), Reducers.Max("@numeric1").As("max")),
276+
Scenario.ReduceSingleComplexWithAlias => query.GroupBy("@tag1")
277+
.Reduce(Reducers.Quantile("@numeric1", 0.5).As("qt")),
278+
Scenario.ReduceMulti => query.GroupBy("@tag1").Reduce(Reducers.Count().As("count"),
279+
Reducers.Min("@numeric1").As("min"), Reducers.Max("@numeric1").As("max")),
280+
Scenario.ParamVsim => query.VectorSearch("@vector1", VectorData.Parameter("$v")),
281+
Scenario.ParamSearch => query.Search("$q"),
282+
Scenario.ParamPreFilter =>
283+
query.VectorSearch(new("@vector1", VectorData.Raw(vec), filter: "@numeric1!=$n")),
284+
Scenario.ParamPostFilter => query.ReturnFields([..fields, "@numeric1"]).Filter("@numeric1!=$n"),
285+
Scenario.ParamMultiPreFilter => query.VectorSearch(new("@vector1", VectorData.Raw(vec),
286+
filter: "@numeric1!=$n | @tag1:{$t}")),
287+
Scenario.ParamMultiPostFilter => query.ReturnFields([..fields, "@numeric1"])
288+
.Filter("@numeric1!=$n | @tag1:{$t}"),
253289
_ => throw new ArgumentOutOfRangeException(scenario.ToString()),
254290
};
255291
#pragma warning restore CS0612
256-
WriteArgs(api.Index, query);
292+
Dictionary<string, object>? args = scenario switch
293+
{
294+
Scenario.ParamPostFilter or Scenario.ParamPreFilter => new Dictionary<string, object>() { ["n"] = 42 },
295+
Scenario.ParamMultiPostFilter or Scenario.ParamMultiPreFilter => new Dictionary<string, object>()
296+
{ ["n"] = 42, ["t"] = "foo" },
297+
Scenario.ParamSearch => new Dictionary<string, object>() { ["q"] = text },
298+
Scenario.ParamVsim => new Dictionary<string, object>() { ["v"] = VectorData.Raw(vec) },
299+
_ => null,
300+
};
301+
WriteArgs(api.Index, query, args);
257302

258-
var result = api.FT.HybridSearch(api.Index, query);
303+
var result = api.FT.HybridSearch(api.Index, query, args);
259304
Assert.True(result.TotalResults > 0);
260305
Assert.NotEqual(TimeSpan.Zero, result.ExecutionTime);
261306
Assert.Empty(result.Warnings);
@@ -265,7 +310,7 @@ public async Task TestSearchScenarios(string endpointId, Scenario scenario)
265310
{
266311
Log($"{row.Id}, {row.Score}");
267312
if (!(scenario is Scenario.ReduceSingleSimpleWithAlias or Scenario.ReduceSingleComplexWithAlias
268-
or Scenario.ReduceMulti or Scenario.ReduceSingleSimpleWithoutAlias or Scenario.GroupByNoReduce))
313+
or Scenario.ReduceMulti or Scenario.ReduceSingleSimpleWithoutAlias or Scenario.GroupByNoReduce))
269314
{
270315
Assert.NotNull(row.Id);
271316
Assert.NotEqual("", row.Id);

0 commit comments

Comments
 (0)