[erlang-questions] QLC cursor with QLC query using nested QLC.

Daniel Kwiecinski <>
Mon May 11 12:46:02 CEST 2009


Just some additional info:

$ erl -version
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.6.5
mnesia-4.4.7
stdlib-1.15.5


2009/5/11 Dan Gudmundsson <>

> That sounds like a bug in mnesia, I will have looka at it.
>
> /Dan
>
> Daniel Kwiecinski wrote:
>
>> Hi,
>>
>>   I'm trying to implement kind of SELECT COUNT(B.ID <http://B.ID>) C, A.*
>> FROM A, B WHERE A.ID <http://A.ID> = B.F_ID GROUP BY A.ID <http://A.ID>
>> HAVING C > 0
>>
>> So I need to make join with count on details. The thing is, I want also to
>> involve sorting and limiting with is but it seams qlc cursor don't like my
>> approach. *as_with_bs() *works fine but* **top_as_with_some_bs(10)
>> *returns*:**
>>
>> {aborted,{badarg,[{ets,first,[106291236]},
>>                  {mnesia_tm,arrange,3},
>>                  {mnesia_tm,t_commit,1},
>>                  {mnesia_tm,apply_fun,3},
>>                  {mnesia_tm,execute_transaction,5},
>>                  {erl_eval,do_apply,5},
>>                  {shell,exprs,6},
>>                  {shell,eval_exprs,6}]}}*
>>
>> QLC with nested QLC queries works fine as long not used with cursors.
>> Could anyone help me with it?
>>
>> Here is what I wrote: (http://gist.github.com/109936)
>>
>> *
>> bs_by_a_id(A_id) ->
>>  find(qlc:q([ B || B=#b{f_id=F_id} <- mnesia:table(b), F_id == A_id])).
>>
>> as_with_bs() ->
>>  find(
>>    qlc:q([ {A,bs_by_a_id(A#a.id <http://a.id>)} || A <- mnesia:table(a)])
>>  ).
>>
>> top_as_with_some_bs(Limit) ->
>>  top(
>>    qlc:q([ {A,bs_by_a_id(A#a.id <http://a.id>)} || A <-
>> mnesia:table(a)]),
>>    Limit,
>>    fun(A1,A2) -> A1 < A2  end
>>  ).
>>  % --- utils
>>
>> find(Q) ->
>>  F = fun() -> qlc:e(Q) end,
>>  transaction(F).
>>
>> % --- it returns top Limit results from query Q ordered by Order sort
>> function
>> top(Q, Limit, Order) ->
>>  {atomic, Res} = mnesia:transaction(fun() ->
>>    OQ = qlc:sort(Q, [{order,Order}]),
>>    QC = qlc:cursor(OQ),
>>    Res = qlc:next_answers(QC, Limit),
>>    qlc:delete_cursor(QC),
>>    Res
>>  end),
>>  Res.*
>>
>> Regards,
>> Daniel
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://www.erlang.org/mailman/listinfo/erlang-questions
>>
>


-- 
Kind Regards,
Daniel Kwiecinski

m: 07952028105
e:  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20090511/cc90d612/attachment.html>


More information about the erlang-questions mailing list