Hey all, I’m trying to figure out why scrivener is not returning an empty list when page_number > total_pages
. To handle pagination I’m doing this
@google_news_table "google_news"
@google_news_dattrs %{
paginate: false,
page: 1,
page_size: 10
}
@list_google_news_dreturn %{
items: [],
page_number: 1,
page_size: 10,
paginate: false,
total_entries: 0,
total_pages: 0
}
def google_news_query(google_news_scope) do
from n in google_news_scope,
select: %{
title: n.title,
url: n.url
}
end
# ==================================================
# QUERY
# ==================================================
def list_google_news(viewer, attrs \\ []) do
%{
paginate: paginate,
page: page,
page_size: page_size,
start_date: start_date,
end_date: end_date
} = Enum.into(attrs, @google_news_dattrs)
query =
@google_news_table
|> google_news_query
query = unless (start_date && start_date !== "" && end_date && end_date !== ""), do: query, else: Scopes.scope_with_date(query, start_date, end_date)
if paginate do
page = Repo.paginate(query, page: page, page_size: page_size)
items = page.entries
Map.merge(@list_google_news_dreturn, %{
paginate: true,
items: items,
page_number: page.page_number,
page_size: page.page_size,
total_entries: page.total_entries,
total_pages: page.total_pages
})
else
items = Repo.all(query)
Map.merge(@list_google_news_dreturn, %{
items: items,
total_entries: Enum.count(items)
})
end
end
def scope_with_date(query, start_date, end_date) do
{:ok, s_date} = Date.from_iso8601(start_date)
{:ok, e_date} = Date.from_iso8601(end_date)
query
|> where([t], fragment("?::date", t.publish_date) >= ^s_date and fragment("?::date", t.publish_date) <= ^e_date)
end
Using the function in the REPL and after querying the db with
GoogleNews.list_google_news(viewer, %{start_date: "2021-05-04", end_date: "2021-05-06", paginate: true, page: 1})
I can see
%{
items: [
# items from the db
],
page_number: 13,
page_size: 10,
paginate: true,
total_entries: 128,
total_pages: 13
}
after I query for more data, instead of empty list I can see the same data from the 13th page. Looking at the scrivener_ecto I can see that they handled this but for me, it’s not working. I’m sorry I know it’s confusing I’m trying to explain it as much as I can, so can anyone helps me understand why is this happening?