[erlang-questions] newbie question

Andreas Hillqvist <>
Thu Nov 29 10:53:20 CET 2007


Like Andreas(the other Andreas ;-) ) proposed fold fits the purpose.

Here is an complete example:

-module(aggregate).
-export([start/0]).
-record(item, {count, item, user}).
-include_lib("stdlib/include/qlc.hrl").

start() ->
    mnesia:start(),
    mnesia:create_schema([]),

    TabDef = [{ram_copies, [node()]},
              {index, [item]},
              {attributes, record_info(fields, item)}],
    mnesia:create_table(item, TabDef),

    {atomic,ok} = mnesia:transaction(fun insert_query/0),

    mnesia:transaction(fun select_query/0).

insert_query() ->
    Items = [#item{count = 4,
                   item  = apple,
                   user  = john},
             #item{count = 7,
                   item  = apple,
                   user  = mary},
             #item{count = 3,
                   item  = oranges,
                   user  = jane},
             #item{count = 2,
                   item  = oranges,
                   user  = john},
             #item{count = 2,
                   item  = bananas,
                   user  = mary},
             #item{count = 5,
                   item  = bananas,
                   user  = jane},
             #item{count = 2,
                   item  = bananas,
                   user  = john}],

    lists:foreach(fun mnesia:write/1, Items).

select_query() ->
    Q = qlc:keysort(#item.item, mnesia:table(item)),
    qlc:fold(fun aggregate/2, [], Q).

aggregate(#item{count = Count, item = Item}, [{Item, Sum} | Acc]) ->
    [{Item, Count + Sum} | Acc];
aggregate(#item{count = Count, item = Item}, Acc) ->
    [{Item, Count} | Acc].


I am uncertain if the index for item, gives keysort any performance gain.
Maybe some one else can answer this?

As always I appreciate any comments and critic. :-D


Regards
Andreas Hillqvist

2007/11/28, Ukyo Virgden <>:
> Hi,
>
> I've just jumped into Erlang. Almost finished reading Joe Armstrong's
> book. While testing with mnesia, I've come across a problem I hope
> you guys can shed a light.
>
> Consider I have records like (count, item, user)
>
> {4, apple, john}
> {7, apple, mary}
> {3, oranges, jane}
> {2, oranges, john}
> {2, bananas, mary}
> {5, bananas, jane}
> {2, bananas, john}
>
> I can store in mnesia and retrieve with qlc. But I could not "group"
> them. I figured out how inappropriate it'd be to ask is qlc has a
> facility like SQL GROUP BY. :)
>
> Can anybody help me how can I group returned list? Or in other words,
> how can I apply an aggregate function to get sum of items, count of
> items etc.? I've already figured out I can send my process some
> messages and collect data but I believe that'd be slower than being
> able to write a recursive function.
>
> I'd appreciate if you could provide some pointers to resources for
> functional programming techniques in Erlang.
>
> Thanks in advance
> Ukyo Virgden
>
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list