[erlang-questions] QLC cursor with QLC query using nested QLC.
Daniel Kwiecinski
daniel.kwiecinski@REDACTED
Mon May 11 13:06:06 CEST 2009
The same results with:
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.7.1
stdlib-1.16.1
mnesia-4.4.9
2009/5/11 Daniel Kwiecinski <daniel.kwiecinski@REDACTED>
> 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 <dgud@REDACTED>
>
> 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
>>> erlang-questions@REDACTED
>>> http://www.erlang.org/mailman/listinfo/erlang-questions
>>>
>>
>
>
> --
> Kind Regards,
> Daniel Kwiecinski
>
> m: 07952028105
> e: daniel.kwiecinski@REDACTED
>
--
Kind Regards,
Daniel Kwiecinski
m: 07952028105
e: daniel.kwiecinski@REDACTED
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20090511/ed9c1694/attachment.htm>
More information about the erlang-questions
mailing list