<div dir="ltr">Hi, Tomislav!<br><br>In your first example<br><br><div>    q = select(<a href="http://p.name">p.name</a> for p in Person)</div><div>    q = q.filter(lambda p: p.age > 30)</div><div><br></div><div>The filter didn't work, because the argument "p" used in lambda refers to the entire result of the first query, that is, to "<a href="http://p.name">p.name</a>". Because of this, an error is occurred: attribute "<a href="http://p.name">p.name</a>" doesn't have sub-attribute "age".</div>

<div><br></div><div>To fix this, we should refer to the iterator names of the original select. It is possible if we write lambda without arguments as in the following example:</div><div><br></div><div><div>    q = select(<a href="http://p.name">p.name</a> for p in Person)</div>

<div>    q = q.filter(lambda: p.age > 30)</div></div><div><br></div><div>When lambda doesn't receive any arguments, it refers to the names used in the original select, so it is possible to refine query with any filtering criteria.</div>

<div><br>As per the second example:</div><div><br></div><div>    q2 = select(<a href="http://p.name">p.name</a> for p in q1)</div><div><br>Pony doesn't support such queries right now, but we plan to add them later.<br>

<br><br>> <span style="font-family:arial,sans-serif;font-size:13px">Is it possible to separate a projection part from the filtering part of the query?<br></span><span style="font-size:13px;font-family:arial,sans-serif">> </span><span style="font-size:13px;font-family:arial,sans-serif">The use for this is that I could have the same filtering logic (possibly complex, with quite a lot of predicates), but get different results (for example a list of key/value for a dropdown list and a larger set of attributes to show on some grid).</span><span style="font-family:arial,sans-serif;font-size:13px"><br>

</span></div><div><br>We can add a way to specify projection, but at first we should understand what is the right API to do such projection. There are two options:<br><br>1) A programmer can specify the desired attributes when they write a query. In this case a query returns entity objects, but internally they contains specified attributes only. Other attributes behave as if they are lazy - their values will be loaded by a separate query if you'll try to access them.<br>

<br>Here is a possible example of such API:<br><br>    q = select(p for p in Person)<br>    q = q.filter(lambda p: p.age > 30)<br>    q = q.load_only(Person.name, Person.age)  # also primary key Person.id is always loaded<br>

    for person in q:<br>        print <a href="http://person.id">person.id</a>, <a href="http://person.name">person.name</a>, person.age<br>        print <a href="http://person.tel">person.tel</a>   # oops, this attribute is not loaded - separate query will be sent to the database<br>

<br>2) Another option would be to have the map() query method which can transform query result:</div><div><br></div><div>    q = select(p for p in Person)<br>    q = q.filter(lambda p: p.age > 30)<br>    q = q.map(lambda p: (<a href="http://p.name">p.name</a>, p.age))<br>

    for name, age in q:<br>        print name, age<br><br></div><div>In this case, you don't receive partially-loaded object from the query, but instead you get attribute values. This way only the specified attributes will be loaded from the database.<br>

<br>What do you think, which API option solves your task better?<br><br><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 14, 2014 at 4:52 AM, Tomislav Tustonic <span dir="ltr"><<a href="mailto:ttustonic@outlook.com" target="_blank">ttustonic@outlook.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr"><p>Hello</p><p> </p><p>First, thanks for fixing a bug with the lambda expressions and closures. Also, to_dict method is quite handy.</p><p>I'm continuing with my exploration of the querying in Pony orm, and I have a following question/problem:</p>

<p>Is it possible to separate a projection part from the filtering part of the query?</p><p>For example I'd like to find only the names of the people older than 30 years, and have it all executed in the database query.</p>

<p>Something like this:</p><p> </p><p>q = select(<a href="http://p.name" target="_blank">p.name</a> for p in Person)   # <br>q = q.filter(lambda p: p.age > 30)</p><p> </p><p>or, even better:</p><p>q = select(p for p in Person)</p>

<p>q1 = q.filter(lambda p: p.age > 30)</p><p>q2= select(<a href="http://p.name" target="_blank">p.name</a> for p in q1)</p><p> </p><p>none of these, obviously, don't work, but you get the idea.</p><p>The closest I can get to this is to pick only the names from the q1, but in this case all the fields are retrieved from the database.</p>

<p>The use for this is that I could have the same filtering logic (possibly complex, with quite a lot of predicates), but get different results (for example a list of key/value for a dropdown list and a larger set of attributes to show on some grid).</p>

<p> </p><p>So, is something like this possible, and if not, are you planning to add this feature?</p><p> </p><p>Thanks in advance, </p><p>Tom<br></p><p> </p>                                    </div></div>
<br>_______________________________________________<br>
ponyorm-list mailing list<br>
<a href="mailto:ponyorm-list@ponyorm.org">ponyorm-list@ponyorm.org</a><br>
<a href="/ponyorm-list" target="_blank">/ponyorm-list</a><br>
<br></blockquote></div><br></div>