shahryarjb

shahryarjb

How to create pagination for a list (get elements from a range of GenServer)

Hi, I have a big list in my GenServer which I want to load them as a pagination, for example I counted it and I have x records and I want to load it with a page size (like 20).

my user inputs: page 1 and this pagination should load (1 - 20) records and if my user inputs page 2 , it should loads (21 - 40).

I saw Stream.resource but I couldn’t use it

Please help me to understand this!!

Thanks

Most Liked

tomkonidas

tomkonidas

Not sure if this would be the best way

Stream.chunk_every(list_of_items, 20)
|> Enum.at(page - 1)
RudManusachi

RudManusachi

In BEAM lists are “linked” lists.. so any page > 1 would require somehow to traverse the list.. Either if you skip first N and take M elements.. or if you “chunk_every” M and take Nth chunk of it.

We need some sort an indexing.. What about storing in a map where key is the index? Then based on the request you quickly figure out the required keys and do Map.take/2?

Or maybe store somewhere that supports pagination? :ets and :mnesia support match specs.. But to rephrase a regex joke “if you decide to use a match spec you now have two problems” :grinning_face_with_smiling_eyes:

Depends on the task =)

trisolaran

trisolaran

If your elements are in memory, then you can just do:

page_size = 10
page_num = 3

list_of_elements
|> Enum.drop(page_size * (page_num - 1)) 
|> Enum.take(page_size)

This will give you the elements on the 3rd page (21 through 30).

However, keeping a large list in memory and implementing pagination in this way is potentially inefficient.
May ask you where your data is loaded from? It may be more efficient to offload pagination to the data source. For example, if the data source is an SQL database, you could fetch the elements for a given page with:

SELECT * FROM DATA
ORDER BY <SOMETHING>
OFFSET page_size * (page_num - 1)
LIMIT page_size

In this way only the elements of the desired page will be loaded every time, and with the proper indexes set up in your DB the query will be fast.

Where Next?

Popular in Questions Top

beno
I will often find my self writing things similar to: case some_value do nil -&gt; something() "" -&gt; something() _ -&gt; somethi...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New

Other popular topics Top

axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 48342 226
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 43757 214
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
klo
Got a question about when to concat vs. prepending items to list then reversing to achieve appending. So i know lists boil down to [1 | ...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement