fix: keyset + before results must be reversed

This commit is contained in:
Zach Daniel 2022-05-31 10:34:16 -04:00
parent 021d859990
commit 669c98b379
2 changed files with 37 additions and 4 deletions

View file

@ -15,6 +15,13 @@ defmodule Ash.Page.Keyset do
@type t :: %__MODULE__{}
def new(results, count, sort, original_query, more?, opts) do
# results =
# if opts[:page][:before] do
# Enum.reverse(results)
# else
# results
# end
%__MODULE__{
results: data_with_keyset(results, original_query.resource, sort),
count: count,

View file

@ -250,11 +250,12 @@ defmodule Ash.Actions.PaginationTest do
describe "keyset pagination" do
setup do
for i <- 0..9 do
Api.create!(Ash.Changeset.new(User, %{name: "#{i}"}))
end
users =
for i <- 0..9 do
Api.create!(Ash.Changeset.new(User, %{name: "#{i}"}))
end
:ok
[users: users]
end
test "can be limited" do
@ -314,6 +315,31 @@ defmodule Ash.Actions.PaginationTest do
assert id == before_id
end
test "can ask for records before a specific keyset, with the sort order honored" do
%{results: users} =
User |> Ash.Query.sort(:name) |> Api.read!(action: :keyset, page: [limit: 100])
users = Enum.sort_by(users, & &1.name)
last_user = List.last(users)
%{results: results} =
User
|> Ash.Query.sort(:name)
|> Api.read!(action: :keyset, page: [limit: 10, before: last_user.__metadata__.keyset])
assert Enum.sort(Enum.map(results, & &1.name)) == [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8"
]
end
test "pagination works with a sort applied" do
page =
User