Skip to content

Commit 7091542

Browse files
authored
added support for decimal column sorting with SearchAfter & SearchBefore (#104)
1 parent c119f42 commit 7091542

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

src/Foundatio.Repositories.Elasticsearch/Extensions/FindHitExtensions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,24 @@ public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS
144144
{
145145
return reader.TokenType switch
146146
{
147-
JsonTokenType.Number => reader.GetInt64(),
147+
JsonTokenType.Number => GetNumber(reader),
148148
JsonTokenType.String => reader.GetString(),
149149
JsonTokenType.True => reader.GetBoolean(),
150150
JsonTokenType.False => reader.GetBoolean(),
151151
_ => null
152152
};
153153
}
154154

155+
private object GetNumber(Utf8JsonReader reader)
156+
{
157+
if (reader.TryGetInt64(out var l))
158+
return l;
159+
else if (reader.TryGetDecimal(out var d))
160+
return d;
161+
else
162+
throw new InvalidOperationException("Value is not a number");
163+
}
164+
155165
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
156166
{
157167
throw new NotImplementedException();

tests/Foundatio.Repositories.Elasticsearch.Tests/ReadOnlyRepositoryTests.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,8 +1201,10 @@ public async Task ShouldNotIncludeWhenDeletedAsync()
12011201
Assert.Single(employees.Documents);
12021202
}
12031203

1204-
[Fact]
1205-
public async Task CanSearchAfterAndBeforeWithMultipleSorts()
1204+
[Theory]
1205+
[InlineData("age")]
1206+
[InlineData("decimalAge")]
1207+
public async Task CanSearchAfterAndBeforeWithMultipleSorts(string secondarySort)
12061208
{
12071209
await _employeeRepository.AddAsync(EmployeeGenerator.GenerateEmployees(count: 100), o => o.ImmediateConsistency());
12081210
int pageSize = 10;
@@ -1214,7 +1216,7 @@ public async Task CanSearchAfterAndBeforeWithMultipleSorts()
12141216
do
12151217
{
12161218
page++;
1217-
var employees = await _employeeRepository.FindAsync(q => q.Sort(e => e.Name).Sort(e => e.CompanyName).SortDescending(e => e.Age), o => o.SearchAfterToken(searchAfterToken).PageLimit(pageSize).QueryLogLevel(LogLevel.Information));
1219+
var employees = await _employeeRepository.FindAsync(q => q.Sort(e => e.Name).Sort(e => e.CompanyName).SortDescending(secondarySort), o => o.SearchAfterToken(searchAfterToken).PageLimit(pageSize).QueryLogLevel(LogLevel.Information));
12181220
searchBeforeToken = employees.GetSearchBeforeToken();
12191221
searchAfterToken = employees.GetSearchAfterToken();
12201222
if (page == 1)

tests/Foundatio.Repositories.Elasticsearch.Tests/Repositories/Configuration/Indexes/EmployeeIndex.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public override TypeMappingDescriptor<Employee> ConfigureIndexMapping(TypeMappin
5050
.Text(f => f.Name(e => e.Name).AddKeywordAndSortFields().CopyTo(c => c.Field("_all")))
5151
.Scalar(f => f.Age, f => f.Name(e => e.Age))
5252
.FieldAlias(a => a.Name("aliasedage").Path(f => f.Age))
53+
.Scalar(f => f.DecimalAge, f => f.Name(e => e.DecimalAge))
5354
.Scalar(f => f.NextReview, f => f.Name(e => e.NextReview))
5455
.FieldAlias(a => a.Name("next").Path(f => f.NextReview))
5556
.GeoPoint(f => f.Name(e => e.Location))

tests/Foundatio.Repositories.Elasticsearch.Tests/Repositories/Models/Employee.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class Employee : IIdentity, IHaveDates, IVersioned, ISupportSoftDeletes
3131
public string UnmappedEmailAddress => EmailAddress;
3232
public int Age { get; set; }
3333
public int UnmappedAge => Age;
34+
public double DecimalAge => Age + .5;
3435
public string Location { get; set; }
3536
public int YearsEmployed { get; set; }
3637
public EmploymentType EmploymentType { get; set; } = EmploymentType.FullTime;

0 commit comments

Comments
 (0)