@@ -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