@@ -11,7 +11,8 @@ internal abstract class VectorSetSimilaritySearchMessage(
1111 double epsilon ,
1212 int searchExplorationFactor ,
1313 string ? filterExpression ,
14- int maxFilteringEffort ) : Message ( db , flags , RedisCommand . VSIM )
14+ int maxFilteringEffort ,
15+ bool useFp32 ) : Message ( db , flags , RedisCommand . VSIM )
1516{
1617 // For "FP32" and "VALUES" scenarios; in the future we might want other vector sizes / encodings - for
1718 // example, there could be some "FP16" or "FP8" transport that requires a ROM-short or ROM-sbyte from
@@ -27,15 +28,16 @@ internal sealed class VectorSetSimilaritySearchBySingleVectorMessage(
2728 double epsilon ,
2829 int searchExplorationFactor ,
2930 string ? filterExpression ,
30- int maxFilteringEffort ) : VectorSetSimilaritySearchMessage ( db , flags , vsimFlags , key , count , epsilon ,
31- searchExplorationFactor , filterExpression , maxFilteringEffort )
31+ int maxFilteringEffort ,
32+ bool useFp32 ) : VectorSetSimilaritySearchMessage ( db , flags , vsimFlags , key , count , epsilon ,
33+ searchExplorationFactor , filterExpression , maxFilteringEffort , useFp32 )
3234 {
33- internal override int GetSearchTargetArgCount ( bool packed ) =>
34- packed ? 2 : 2 + vector . Length ; // FP32 {vector} or VALUES {num} {vector}
35+ internal override int GetSearchTargetArgCount ( ) =>
36+ UseFp32 ? 2 : ( 2 + vector . Length ) ; // FP32 {vector} or VALUES {num} {vector}
3537
36- internal override void WriteSearchTarget ( bool packed , PhysicalConnection physical )
38+ internal override void WriteSearchTarget ( PhysicalConnection physical )
3739 {
38- if ( packed )
40+ if ( UseFp32 )
3941 {
4042 physical . WriteBulkString ( "FP32"u8 ) ;
4143 physical . WriteBulkString ( System . Runtime . InteropServices . MemoryMarshal . AsBytes ( vector . Span ) ) ;
@@ -63,20 +65,21 @@ internal sealed class VectorSetSimilaritySearchByMemberMessage(
6365 double epsilon ,
6466 int searchExplorationFactor ,
6567 string ? filterExpression ,
66- int maxFilteringEffort ) : VectorSetSimilaritySearchMessage ( db , flags , vsimFlags , key , count , epsilon ,
67- searchExplorationFactor , filterExpression , maxFilteringEffort )
68+ int maxFilteringEffort ,
69+ bool useFp32 ) : VectorSetSimilaritySearchMessage ( db , flags , vsimFlags , key , count , epsilon ,
70+ searchExplorationFactor , filterExpression , maxFilteringEffort , useFp32 )
6871 {
69- internal override int GetSearchTargetArgCount ( bool packed ) => 2 ; // ELE {member}
72+ internal override int GetSearchTargetArgCount ( ) => 2 ; // ELE {member}
7073
71- internal override void WriteSearchTarget ( bool packed , PhysicalConnection physical )
74+ internal override void WriteSearchTarget ( PhysicalConnection physical )
7275 {
7376 physical . WriteBulkString ( "ELE"u8 ) ;
7477 physical . WriteBulkString ( member ) ;
7578 }
7679 }
7780
78- internal abstract int GetSearchTargetArgCount ( bool packed ) ;
79- internal abstract void WriteSearchTarget ( bool packed , PhysicalConnection physical ) ;
81+ internal abstract int GetSearchTargetArgCount ( ) ;
82+ internal abstract void WriteSearchTarget ( PhysicalConnection physical ) ;
8083
8184 public ResultProcessor < Lease < VectorSetSimilaritySearchResult > ? > GetResultProcessor ( ) =>
8285 VectorSetSimilaritySearchProcessor . Instance ;
@@ -177,11 +180,11 @@ internal enum VsimFlags
177180
178181 private bool HasFlag ( VsimFlags flag ) => ( vsimFlags & flag ) != 0 ;
179182
180- public override int ArgCount => GetArgCount ( VectorSetAddMessage . UseFp32 ) ;
183+ public override int ArgCount => GetArgCount ( ) ;
181184
182- private int GetArgCount ( bool packed )
185+ private int GetArgCount ( )
183186 {
184- int argCount = 1 + GetSearchTargetArgCount ( packed ) ; // {key} and whatever we need for the vector/element portion
187+ int argCount = 1 + GetSearchTargetArgCount ( ) ; // {key} and whatever we need for the vector/element portion
185188 if ( HasFlag ( VsimFlags . WithScores ) ) argCount ++ ; // [WITHSCORES]
186189 if ( HasFlag ( VsimFlags . WithAttributes ) ) argCount ++ ; // [WITHATTRIBS]
187190 if ( HasFlag ( VsimFlags . Count ) ) argCount += 2 ; // [COUNT {count}]
@@ -194,17 +197,18 @@ private int GetArgCount(bool packed)
194197 return argCount ;
195198 }
196199
200+ internal bool UseFp32 { get ; } = useFp32 & VectorSetAddMessage . CanUseFp32 ; // evaluated during .ctor
201+
197202 protected override void WriteImpl ( PhysicalConnection physical )
198203 {
199204 // snapshot to avoid race in debug scenarios
200- bool packed = VectorSetAddMessage . UseFp32 ;
201- physical . WriteHeader ( Command , GetArgCount ( packed ) ) ;
205+ physical . WriteHeader ( Command , GetArgCount ( ) ) ;
202206
203207 // Write key
204208 physical . Write ( key ) ;
205209
206210 // Write search target: either "ELE {member}" or vector data
207- WriteSearchTarget ( packed , physical ) ;
211+ WriteSearchTarget ( physical ) ;
208212
209213 if ( HasFlag ( VsimFlags . WithScores ) )
210214 {
0 commit comments