Skip to content

Commit f262659

Browse files
committed
implement NOSORT
1 parent 83a2547 commit f262659

File tree

4 files changed

+113
-57
lines changed

4 files changed

+113
-57
lines changed

src/NRedisStack/PublicAPI/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
[NRS001]NRedisStack.Search.HybridSearchQuery.GroupBy(string! field) -> NRedisStack.Search.HybridSearchQuery!
1818
[NRS001]NRedisStack.Search.HybridSearchQuery.HybridSearchQuery() -> void
1919
[NRS001]NRedisStack.Search.HybridSearchQuery.Limit(int offset, int count) -> NRedisStack.Search.HybridSearchQuery!
20+
[NRS001]NRedisStack.Search.HybridSearchQuery.NoSort() -> NRedisStack.Search.HybridSearchQuery!
2021
[NRS001]NRedisStack.Search.HybridSearchQuery.Parameters(System.Collections.Generic.IReadOnlyDictionary<string!, object!>! parameters) -> NRedisStack.Search.HybridSearchQuery!
2122
[NRS001]NRedisStack.Search.HybridSearchQuery.Reduce(NRedisStack.Search.Aggregation.Reducer! reducer) -> NRedisStack.Search.HybridSearchQuery!
2223
[NRS001]NRedisStack.Search.HybridSearchQuery.Reduce(params NRedisStack.Search.Aggregation.Reducer![]! reducers) -> NRedisStack.Search.HybridSearchQuery!

src/NRedisStack/Search/HybridSearchQuery.Command.cs

Lines changed: 71 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -90,29 +90,36 @@ internal int GetOwnArgsCount()
9090

9191
if (_sortByFieldOrFields is not null)
9292
{
93-
count += 2;
94-
switch (_sortByFieldOrFields)
93+
if (ReferenceEquals(_sortByFieldOrFields, s_NoSortSentinel))
9594
{
96-
case string:
97-
count += 1;
98-
break;
99-
case string[] strings:
100-
count += strings.Length;
101-
break;
102-
case SortedField { Order: SortedField.SortOrder.ASC }:
103-
count += 1;
104-
break;
105-
case SortedField:
106-
count += 2;
107-
break;
108-
case SortedField[] fields:
109-
foreach (var field in fields)
110-
{
111-
if (field.Order == SortedField.SortOrder.DESC) count++;
112-
}
113-
114-
count += fields.Length;
115-
break;
95+
count++;
96+
}
97+
else
98+
{
99+
count += 2;
100+
switch (_sortByFieldOrFields)
101+
{
102+
case string:
103+
count += 1;
104+
break;
105+
case string[] strings:
106+
count += strings.Length;
107+
break;
108+
case SortedField { Order: SortedField.SortOrder.ASC }:
109+
count += 1;
110+
break;
111+
case SortedField:
112+
count += 2;
113+
break;
114+
case SortedField[] fields:
115+
foreach (var field in fields)
116+
{
117+
if (field.Order == SortedField.SortOrder.DESC) count++;
118+
}
119+
120+
count += fields.Length;
121+
break;
122+
}
116123
}
117124
}
118125

@@ -241,43 +248,50 @@ static void AddApply(in ApplyExpression expr, List<object> args)
241248

242249
if (_sortByFieldOrFields is not null)
243250
{
244-
args.Add("SORTBY");
245-
switch (_sortByFieldOrFields)
251+
if (ReferenceEquals(_sortByFieldOrFields, s_NoSortSentinel))
246252
{
247-
case string field:
248-
args.Add(1);
249-
args.Add(field);
250-
break;
251-
case string[] fields:
252-
args.Add(fields.Length);
253-
args.AddRange(fields);
254-
break;
255-
case SortedField { Order: SortedField.SortOrder.ASC } field:
256-
args.Add(1);
257-
args.Add(field.FieldName);
258-
break;
259-
case SortedField field:
260-
args.Add(2);
261-
args.Add(field.FieldName);
262-
args.Add("DESC");
263-
break;
264-
case SortedField[] fields:
265-
var descCount = 0;
266-
foreach (var field in fields)
267-
{
268-
if (field.Order == SortedField.SortOrder.DESC) descCount++;
269-
}
270-
271-
args.Add(fields.Length + descCount);
272-
foreach (var field in fields)
273-
{
253+
args.Add("NOSORT");
254+
}
255+
else
256+
{
257+
args.Add("SORTBY");
258+
switch (_sortByFieldOrFields)
259+
{
260+
case string field:
261+
args.Add(1);
262+
args.Add(field);
263+
break;
264+
case string[] fields:
265+
args.Add(fields.Length);
266+
args.AddRange(fields);
267+
break;
268+
case SortedField { Order: SortedField.SortOrder.ASC } field:
269+
args.Add(1);
274270
args.Add(field.FieldName);
275-
if (field.Order == SortedField.SortOrder.DESC) args.Add("DESC");
276-
}
277-
278-
break;
279-
default:
280-
throw new ArgumentException("Invalid sort by field or fields");
271+
break;
272+
case SortedField field:
273+
args.Add(2);
274+
args.Add(field.FieldName);
275+
args.Add("DESC");
276+
break;
277+
case SortedField[] fields:
278+
var descCount = 0;
279+
foreach (var field in fields)
280+
{
281+
if (field.Order == SortedField.SortOrder.DESC) descCount++;
282+
}
283+
284+
args.Add(fields.Length + descCount);
285+
foreach (var field in fields)
286+
{
287+
args.Add(field.FieldName);
288+
if (field.Order == SortedField.SortOrder.DESC) args.Add("DESC");
289+
}
290+
291+
break;
292+
default:
293+
throw new ArgumentException("Invalid sort by field or fields");
294+
}
281295
}
282296
}
283297

src/NRedisStack/Search/HybridSearchQuery.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,24 @@ public HybridSearchQuery Apply(params ApplyExpression[] applyExpression)
142142
/// <summary>
143143
/// Sort the final results by the specified fields.
144144
/// </summary>
145+
/// <remarks>The default sort order is by score, unless overridden or disabled.</remarks>
145146
public HybridSearchQuery SortBy(params SortedField[] fields)
146147
{
147148
_sortByFieldOrFields = NullIfEmpty(fields);
148149
return this;
149150
}
150151

152+
/// <summary>
153+
/// Do not sort the final results. This disables the default sort by score.
154+
/// </summary>
155+
public HybridSearchQuery NoSort()
156+
{
157+
_sortByFieldOrFields = s_NoSortSentinel;
158+
return this;
159+
}
160+
161+
private static readonly object s_NoSortSentinel = new();
162+
151163
/// <summary>
152164
/// Sort the final results by the specified fields.
153165
/// </summary>

tests/NRedisStack.Tests/Search/HybridSearchUnitTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,35 @@ public void Apply_Multi()
440440
Assert.Equivalent(expected, GetArgs(query));
441441
}
442442

443+
[Fact]
444+
public void SortBy_EmptyStrings()
445+
{
446+
HybridSearchQuery query = new();
447+
string[] sortBy = [];
448+
query.SortBy(sortBy);
449+
object[] expected = [Index];
450+
Assert.Equivalent(expected, GetArgs(query));
451+
}
452+
453+
[Fact]
454+
public void SortBy_EmptySortedFields()
455+
{
456+
HybridSearchQuery query = new();
457+
SortedField[] sortBy = [];
458+
query.SortBy(sortBy);
459+
object[] expected = [Index];
460+
Assert.Equivalent(expected, GetArgs(query));
461+
}
462+
463+
[Fact]
464+
public void NoSort()
465+
{
466+
HybridSearchQuery query = new();
467+
query.NoSort();
468+
object[] expected = [Index, "NOSORT"];
469+
Assert.Equivalent(expected, GetArgs(query));
470+
}
471+
443472
[Fact]
444473
public void SortBy_SingleString()
445474
{

0 commit comments

Comments
 (0)