<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2015-04-27 17:55 GMT+02:00 Matthias Kuhn <span dir="ltr"><<a href="mailto:matthias@opengis.ch" target="_blank">matthias@opengis.ch</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi all,<br>
<br>
I am currently working on an "expression compiler". This will allow to<br>
execute (some) expressions server side. Currently postgres is the main<br>
target but it can be adapted to others as well. This makes it very easy<br>
to write provider-independent code that is able to make use of database<br>
indexes, reduce network traffic and relocate CPU usage to a server. I<br>
will write more about this later.<br>
<br>
One thing that I am currently working on is to apply this to the<br>
rule-based renderer. Especially for small-scale situations where a lot<br>
of features are in the visible extent but only a small fraction meeting<br>
certain criteria shall be rendered this can improve rendering speed.<br>
<br>
The problem that I am currently facing is, that the feature request does<br>
not allow combining a filterRect (extent) and an expression, since you<br>
can either set the request to filter by extent OR by expression.<br></blockquote><div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I thought about removing the FilterRect type and instead always combine<br>
it with the active filter type. E.g. if the filterType is<br>
filterExpression "class = 2" and a rect is set the two clauses will be<br>
joined by an AND. This may change the behavior of existing code in some<br>
cases but probably not much. Worse is that all providers will need to be<br>
revised to change this behavior...<br>
Another option would be to set the filterType to Expression and append<br>
an "AND INTERSECTS ..." to the expression. Probably this has to be done<br>
conditionally only for providers that can compile expressions because<br>
such a solution would bypass spatial indexes that work with filterRect<br>
(but not with the INSERSECTS operator).<br>
<br>
I am trying not to overcomplicate this. Are there any opinions, ideas,<br>
caveats, etc. that others can think of?<br>
<br>
Thank you for any feedback,<br>
Matthias<br>
<br></blockquote><div><br><br></div><div>Hello Mathias, <br></div></div><br></div><div class="gmail_extra">Given the two options (and ignoring how much effort is required to change the providers accordingly), I would suggest the first one, this is the way most ORM work, you can add several filters and they are combined with AND  to create the final one. It might be worth ordering the filters by type, I would expect that the expression filter is applied after the spatial filter.<br></div><div class="gmail_extra">I don't know if it makes much sense in this context but most of the times, the filtering mechanism I'm talking about allows for multiple filters to be added in sequence, for example:<br><br>QgsFeatureRequest().setFilterRect(QgsRectangle(0,0,1,1))<br>QgsFeatureRequest().setFilterExpression("country = 'IT'")<br>QgsFeatureRequest().setFilterExpression("region = Piedmont'")<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">that would mean filtering first by bbox and then by "country = 'IT' and region = 'Piedmont'"<br></div><div class="gmail_extra"><br>BTW, is there any reason why the filter by expression is not listed in the details of the class documentation?<br><br><a href="http://qgis.org/api/classQgsFeatureRequest.html#details">http://qgis.org/api/classQgsFeatureRequest.html#details</a><br clear="all"><br>-- <br><div class="gmail_signature">Alessandro Pasotti<br>w3:   <a href="http://www.itopen.it" target="_blank">www.itopen.it</a></div>
</div></div>