Fixed: Error fetching paged records from API without a sort key

(cherry picked from commit 53f1857e6349fc4c674dbaec50b0dda681f073ae)
This commit is contained in:
ta264 2020-09-01 21:26:36 +01:00
parent a9ee3d5bc5
commit 7f8ebf41d6
2 changed files with 26 additions and 5 deletions

View File

@ -291,16 +291,32 @@ namespace NzbDrone.Core.Test.Datastore
Subject.All().ToList().Should().BeEmpty();
}
[Test]
public void get_paged_should_work()
[TestCase(1, 2)]
[TestCase(2, 2)]
[TestCase(3, 1)]
public void get_paged_should_work(int page, int count)
{
Subject.InsertMany(_basicList);
var data = Subject.GetPaged(new PagingSpec<ScheduledTask>() { Page = 0, PageSize = 2, SortKey = "LastExecution", SortDirection = SortDirection.Descending });
var data = Subject.GetPaged(new PagingSpec<ScheduledTask>() { Page = page, PageSize = 2, SortKey = "LastExecution", SortDirection = SortDirection.Descending });
data.Page.Should().Be(0);
data.Page.Should().Be(page);
data.PageSize.Should().Be(2);
data.TotalRecords.Should().Be(_basicList.Count);
data.Records.Should().BeEquivalentTo(_basicList.OrderByDescending(x => x.LastExecution).Take(2));
data.Records.Should().BeEquivalentTo(_basicList.OrderByDescending(x => x.LastExecution).Skip((page - 1) * 2).Take(2));
}
[TestCase(1, 2)]
[TestCase(2, 2)]
[TestCase(3, 1)]
public void get_paged_should_work_with_null_sort_key(int page, int count)
{
Subject.InsertMany(_basicList);
var data = Subject.GetPaged(new PagingSpec<ScheduledTask>() { Page = page, PageSize = 2, SortDirection = SortDirection.Descending });
data.Page.Should().Be(page);
data.PageSize.Should().Be(2);
data.TotalRecords.Should().Be(_basicList.Count);
data.Records.Should().BeEquivalentTo(_basicList.OrderByDescending(x => x.Id).Skip((page - 1) * 2).Take(2));
}
}
}

View File

@ -407,6 +407,11 @@ namespace NzbDrone.Core.Datastore
{
AddFilters(builder, pagingSpec);
if (pagingSpec.SortKey == null)
{
pagingSpec.SortKey = $"{_table}.{_keyProperty.Name}";
}
var sortDirection = pagingSpec.SortDirection == SortDirection.Descending ? "DESC" : "ASC";
var pagingOffset = (pagingSpec.Page - 1) * pagingSpec.PageSize;
builder.OrderBy($"{pagingSpec.SortKey} {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}");