<html><head><base href="x-msg://29/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>If you have a record within a record, you can simply use pattern matching:</div><div><br></div><div><div>1> rd(data, {id, nick}).</div><div>data</div><div>2> rd(wrapper, {id, data}).</div><div>wrapper</div><div><br></div><div>3> L = [#wrapper{id=1,data=#data{id=1}}, #wrapper{id=2,data=#data{id=2,nick=n}}].</div><div>[#wrapper{id = 1,data = #data{id = 1,nick = undefined}},</div><div> #wrapper{id = 2,data = #data{id = 2,nick = n}}]</div><div><br></div><div>4> qlc:e(qlc:q([W || #wrapper{data = #data{nick = N}} = W <- L, N =/= undefined])).</div><div>[#wrapper{id = 2,data = #data{id = 2,nick = n}}]</div></div><div><br></div><div>If this becomes to hairy, you can use a guard function which does deep inspection on the record. In LCs, a guard function can be any Erlang function.</div><div><br></div><div>A generator in QLC must either be a list, or a special QLC generator (e.g. what you get as a return value from qlc:q/1 or mnesia:table/1). In this particular case, QLC seems to complain already in the query analysis stage, as it doesn't like the fact that a dynamic variable is assumed to be a valid generator.</div><div><br></div><div>BR,</div><div>Ulf W</div><br><div><div>On 2 May 2011, at 21:50, Chris Hicks wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="hmmessage" style="font-size: 10pt; font-family: Tahoma; ">I've got a record nested within a record like this:<div><br></div><div>{account_wrapper, "Username", {account_data, ...}}</div><div><br></div><div>And what I want to do is use QLC to search that inner record and see if someone already has chosen a nickname for an account during registration. However, since I've never used QLC before I wanted to start out slow and just get a feel, creating more complex QLC's as I went along until I got where I wanted to go. First I tried this:</div><div><br></div><div>mnesia:activity(transaction, fun() -> qlc:eval(qlc:q([{A, B, C} || Wrapper <- mnesia:table(accounts), {A, B, C} <- Wrapper])) end, []).</div><div><br></div><div>I just wanted to make sure I understood how to unpack data structures...however I keep getting a qlc error:</div><div><br></div><div><div>** exception exit: {aborted,{badarg,[{qlc,eval,</div><div>                                          [{error,qlc,</div><div>                                                  {1,qlc,{used_generator_variable,'Wrapper'}}},</div><div>                                           []]},</div><div>                                     {mnesia_tm,apply_fun,3},</div><div>                                     {mnesia_tm,execute_transaction,5},</div><div>                                     {mnesia,wrap_trans,6},</div><div>                                     {erl_eval,do_apply,5},</div><div>                                     {shell,exprs,7},</div><div>                                     {shell,eval_exprs,7},</div><div>                                     {shell,eval_loop,3}]}}</div><div>     in function  mnesia:wrap_trans/6</div><div><br></div><div><br></div><div>Now from everything I've read...I thought I'd be able to use the Wrapper variable later on in the query as a generator...thus allowing me to unpack things. Why would this be giving me an error? If I change it to:</div></div><div><br></div><div>mnesia:activity(transaction, fun() -> qlc:eval(qlc:q([{A, B, C} || {A, B, C} <- mnesia:table(accounts)])) end, []).</div><div><br></div><div>It works just fine and returns the record...and I can successfully match the pattern {A, B, C} with the account_wrapper record elsewhere. So what am I missing?</div><div><br></div><div>Chris Hicks.</div><div><br></div>_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br><a href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a><br></div></blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div>Ulf Wiger, CTO, Erlang Solutions, Ltd.</div><div><a href="http://erlang-solutions.com">http://erlang-solutions.com</a></div><div><br></div></span><br class="Apple-interchange-newline">
</div>
<br></body></html>