[erlang-questions] Iterating (Page scrolling) over Mnesia database

David King <>
Fri Sep 21 19:10:35 CEST 2007


> I am looking for a way to iterate over the results in the Mnesia  
> that are ordered by some element, in other words equivalent of
> SELECT * FROM TABLE ORDER BY MYFIELD -- that can return results in  
> cursor like fashion

The idea is to combine query handles, like this:

mnesia:transaction(fun() ->
   % give me all of the authors from the author table with an ID over 10
   Q1=qlc:q([ X || X <- mnesia:table(author), X#author.id > 10 ]),

   % sort them by name
   Q2=qlc:sort(Q1,
               {order, % I'm using the OrderFun form here. See  
file_sorter
                fun(Author1,Author2) ->
                  Author1#author.name < Author2#author.name
                end}),

   % and run the query
   qlc:eval(Q2)
end)

Note that these query handles aren't evaluated until you ask them to  
be (with fold, cursor, eval, etc), so it's not as inefficient as  
sorting them all in memory if, for instance, indexes are available..  
To iterate over them, use qlc:fold or qlc:cursor instead of qlc:eval:

qlc:fold(fun(Author,AccIn) ->
            Author#author.id+AccIn
          end, 0, Q2).

That would give me the sum of all of the IDs in the results (which is  
a bit contrived, but you get the idea)

More information at http://www.erlang.org/doc/man/qlc.html


> Or page scrolling like
> SELECT * FROM TABLE ORDER BY MYFIELD where rownum > 100 and rownum  
> < 200;
> I see foldl and foldr methods can iterate, and qlc can query, but  
> can someone point me how to implement Cursor or page scrolling  
> behavior.
>
> Thanks in advance.
> -Shahzad Bhatti
>
> Moody friends. Drama queens. Your life? Nope! - their life, your  
> story.
> Play Sims Stories at Yahoo! Games.
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list