<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
<font class="Apple-style-span" face="Tahoma" size="2">Makes sense, I'll certainly be playing around with it a lot more, learning via failure and all that. I ended up figuring out how to what I was actually working towards but I'd like to open myself to criticism and see if there is anything about the QLC that could be improved. Here is the code:</font><div style="font-family: Tahoma; font-size: 10pt; "><br></div><div><font class="Apple-style-span" face="Tahoma" size="2">mnesia:activity(transaction, fun(Nickname) -> qlc:eval(qlc:q([Exists || {A, B, C, D} <- mnesia:table(emuf_accounts), Exists = ((emuf_crypt:decrypt(D))#account_data.nickname == Nickname)])) end, [N])</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">Now, the emuf_decrypt call is to my own module/function which handles the encrypting/decrypting of my data, so that I'm not storing any user account information in the open (except, of course, the Username but this should be plenty secure in my case). The data has to be decrypted each time it is read, of course.</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">Is this a naive solution? Is there anything about it that might slowdown the query or is there just a plain more efficient way of doing it?</font></div><div><font class="Apple-style-span" face="Tahoma" size="2"><br></font></div><div><font class="Apple-style-span" face="Tahoma" size="2">Chris Hicks.</font><br><div id="SkyDrivePlaceholder" style="font-family: Tahoma; font-size: 10pt; "></div><hr id="stopSpelling" style="font-family: Tahoma; font-size: 10pt; "><font class="Apple-style-span" face="Tahoma" size="2">Subject: Re: [erlang-questions] QLC question</font><br><font class="Apple-style-span" face="Tahoma" size="2">From: ulf.wiger@erlang-solutions.com</font><br><font class="Apple-style-span" face="Tahoma" size="2">Date: Mon, 2 May 2011 22:11:51 +0200</font><br><font class="Apple-style-span" face="Tahoma" size="2">CC: erlang-questions@erlang.org</font><br><font class="Apple-style-span" face="Tahoma" size="2">To: silent_vendetta@hotmail.com</font><br><br>
<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<meta name="Generator" content="Microsoft SafeHTML"><font class="Apple-style-span" face="Tahoma" size="2"><base></font><div style="font-family: Tahoma; font-size: 10pt; "><br></div><div style="font-family: Tahoma; font-size: 10pt; ">If you have a record within a record, you can simply use pattern matching:</div><div style="font-family: Tahoma; font-size: 10pt; "><br></div><div style="font-family: Tahoma; font-size: 10pt; "><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 style="font-family: Tahoma; font-size: 10pt; "><br></div><div style="font-family: Tahoma; font-size: 10pt; ">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 style="font-family: Tahoma; font-size: 10pt; "><br></div><div style="font-family: Tahoma; font-size: 10pt; ">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 style="font-family: Tahoma; font-size: 10pt; "><br></div><div style="font-family: Tahoma; font-size: 10pt; ">BR,</div><div style="font-family: Tahoma; font-size: 10pt; ">Ulf W</div><br><div style="font-family: Tahoma; font-size: 10pt; "><div>On 2 May 2011, at 21:50, Chris Hicks wrote:</div><br class="ecxApple-interchange-newline"><blockquote><div class="ecxhmmessage" 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" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br></div></blockquote></div><br><div style="font-family: Tahoma; font-size: 10pt; ">
<span class="ecxApple-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;text-align:auto;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium"><div>Ulf Wiger, CTO, Erlang Solutions, Ltd.</div><div><a href="http://erlang-solutions.com" target="_blank">http://erlang-solutions.com</a></div><div><br></div></span><br class="ecxApple-interchange-newline">
</div>
<br></div>                                    </body>
</html>