<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi,</p>
    <p>An expression `attribute = 'major_road' AND $id IN (1,2,3)`
      should have the same result on the number of features in the
      iterator. Or I am missing something.<br>
    </p>
    <p>Matthias<br>
    </p>
    <div class="moz-cite-prefix">On 4/30/19 12:13 PM, Alexis R.L. wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAOM0XWCSgeSy4=L5yXRxD-4h8cE6sEnyBpxN40UZOMDoKJtL3Q@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">Greetings Mr.Kuhn,
        <div><br>
        </div>
        <div>Well in my case the fact that each symbol node is evaluated
          add some lenght to the computation, if I can make something
          that would only iterate over a given list of Fids, (and at the
          same time prevent having to iterate over each feature to check
          if that feature is within the given list of feature) we would
          move from something that takes x by n loops to something that
          would only take around x loop ( where x is the number of
          features and n is the number of symbol).</div>
        <div><br>
        </div>
        <div>For other use case the gain might be minimal. Other similar
          behaviour could be used with selected features (though I'm not
          sure if this is a perfect match for this also.) </div>
        <div><br>
        </div>
        <div>This gain in efficiency is why I want to alter the iterator
          itself rather than fiddling with expressions, despite the fact
          that this is also a possibility but far less optimal for the
          reason mentioned above.</div>
        <div><br>
        </div>
        <div>I just want to know what would be the best way to alter the
          iteration process without breaking and in a way that could be
          leveraged.</div>
        <div><br>
        </div>
        <div>Thanks.</div>
        <div><br>
        </div>
        <div>
          <div>
            <div dir="ltr" class="gmail_signature"
              data-smartmail="gmail_signature">
              <div dir="ltr">Alexis Roy-Lizotte</div>
            </div>
          </div>
          <br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">Le mar. 30 avr. 2019 à 02:31,
          Matthias Kuhn <<a href="mailto:matthias@opengis.ch"
            moz-do-not-send="true">matthias@opengis.ch</a>> a écrit :<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px
          0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div bgcolor="#FFFFFF">
            <p>Hi,</p>
            <p>I like the idea of a nicer API to combine several filter
              conditions. Currently the only possibility to perform this
              operation is to write a filter expression as a string or
              by combining expression nodes.</p>
            <p>I am not convinced however that this should be done
              directly on QgsFilterRequest level. It feels a bit like
              reimplementing the expression engine on another level
              again.</p>
            <p>Some questions that come to my mind:</p>
            <p> * Are these filters always combined with AND or also OR?</p>
            <p> * Can these filters eventually be nested?<br>
            </p>
            <p> * How should we deal with compiling expressions, should
              that be implemented again?</p>
            <p>An alternative approach would be to work on a nicer API
              for an expression builder to require 1) less string
              manipulation when building an expression and 2) have more
              introspection capabilities when manipulating an
              expression.</p>
            <p>Regards</p>
            <p>Matthias<br>
            </p>
            <div class="gmail-m_-619512251185950833moz-cite-prefix">On
              4/29/19 9:02 PM, Alexis R.L. wrote:<br>
            </div>
            <blockquote type="cite">
              <div dir="ltr">Greetings Mr. Dawson,
                <div><br>
                </div>
                <div>Thanks for the reply,</div>
                <div><br>
                </div>
                <div>The tests that I did with the method in my PR was
                  provider agnostic but still entailed looping over
                  every feature to do the check. Could you provide idea
                  or methods that could enable this behaviour in an API
                  friendly way?</div>
                <div><br>
                </div>
                <div>Should I make a new iterator entirely or should I
                  modify existing methods and add a trigger like I
                  tested in my PR?</div>
                <div><br>
                </div>
                <div>Thanks!<br clear="all">
                  <div>
                    <div dir="ltr"
                      class="gmail-m_-619512251185950833gmail_signature">
                      <div dir="ltr">Alexis Roy-Lizotte</div>
                    </div>
                  </div>
                  <br>
                </div>
              </div>
              <br>
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">Le dim. 28 avr. 2019
                  à 19:46, Nyall Dawson <<a
                    href="mailto:nyall.dawson@gmail.com" target="_blank"
                    moz-do-not-send="true">nyall.dawson@gmail.com</a>>
                  a écrit :<br>
                </div>
                <blockquote class="gmail_quote" style="margin:0px 0px
                  0px 0.8ex;border-left:1px solid
                  rgb(204,204,204);padding-left:1ex">On Sun, 28 Apr 2019
                  at 07:18, Alexis R.L. <<a
                    href="mailto:alroyliz0@gmail.com" target="_blank"
                    moz-do-not-send="true">alroyliz0@gmail.com</a>>
                  wrote:<br>
                  ><br>
                  > Greetings Everyone,<br>
                  ><br>
                  > While working on my PR (9648) I noticed that
                  expression filter and a list of feature IDs are both
                  considered the same thing cannot be used as two
                  filtering criteria.<br>
                  ><br>
                  > I am aware that the intent was to only have one
                  element active to filter out features other than the
                  rectangle(? might be wrong on that one).<br>
                  ><br>
                  > What I am wondering if it would be a good thing
                  to have both co exist (mostly for my PR as of now). A
                  simply way to do so would be to use the give feature
                  ids as the list to iterate over and check for the
                  expression if there is one.<br>
                  <br>
                  I also think this would be desirable. The tricky part
                  (well, one<br>
                  tricky part -- feature iterators are low level stuff,
                  lots of<br>
                  complexity there!) is avoiding any API breakage while
                  adding new<br>
                  methods to handle your use case.<br>
                  <br>
                  The other (SUPER) tricky bit is that any change to
                  feature requests<br>
                  usually requires accompanying changes to every vector
                  data provider in<br>
                  order to keep consistent behaviour across all these
                  providers. The<br>
                  same request should always give the same result,
                  regardless of the<br>
                  actual underlying data provider. The consequence of
                  this is that<br>
                  you'll need to be update the postgres, mssql, oracle,
                  OGR, memory,<br>
                  spatialite, wfs, arcgis feature server, db2, and
                  vector layer feature<br>
                  iterator code. You'll also need to add many new unit
                  tests to cover<br>
                  all the changes to the different providers.<br>
                  <br>
                  Definitely not a trivial change! Don't let this put
                  you off making it,<br>
                  but just be aware that this change would take even a
                  QGIS core<br>
                  developer a week or more of work to implement.<br>
                  <br>
                  Nyall<br>
                  <br>
                  <br>
                  <br>
                  ><br>
                  > I assume that such a thing might be implemented
                  without touching the current behaviour, otherwise one
                  would have to remove either the expression or the IDs
                  in some case when we want to override the current
                  filtering method.<br>
                  ><br>
                  > Using multiple filtering method might be better
                  than only forcing one and would provide more
                  flexibility.<br>
                  ><br>
                  > As I have a PR that is related to this (<a
                    href="https://github.com/qgis/QGIS/pull/9816"
                    rel="noreferrer" target="_blank"
                    moz-do-not-send="true">https://github.com/qgis/QGIS/pull/9816</a>
                  ) I would like to address this point in it and would
                  like to have the discussion occur there as to the best
                  way to implement such a thing without any breakage if
                  people are not opposed to having only one filtering
                  method in qgsfeaturerequest.<br>
                  ><br>
                  > Thanks and have a nice day!<br>
                  ><br>
                  > Alex<br>
                  > _______________________________________________<br>
                  > QGIS-Developer mailing list<br>
                  > <a href="mailto:QGIS-Developer@lists.osgeo.org"
                    target="_blank" moz-do-not-send="true">QGIS-Developer@lists.osgeo.org</a><br>
                  > List info: <a
                    href="https://lists.osgeo.org/mailman/listinfo/qgis-developer"
                    rel="noreferrer" target="_blank"
                    moz-do-not-send="true">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
                  > Unsubscribe: <a
                    href="https://lists.osgeo.org/mailman/listinfo/qgis-developer"
                    rel="noreferrer" target="_blank"
                    moz-do-not-send="true">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
                </blockquote>
              </div>
              <br>
              <fieldset
                class="gmail-m_-619512251185950833mimeAttachmentHeader"></fieldset>
              <pre class="gmail-m_-619512251185950833moz-quote-pre">_______________________________________________
QGIS-Developer mailing list
<a class="gmail-m_-619512251185950833moz-txt-link-abbreviated" href="mailto:QGIS-Developer@lists.osgeo.org" target="_blank" moz-do-not-send="true">QGIS-Developer@lists.osgeo.org</a>
List info: <a class="gmail-m_-619512251185950833moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-developer" target="_blank" moz-do-not-send="true">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a>
Unsubscribe: <a class="gmail-m_-619512251185950833moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-developer" target="_blank" moz-do-not-send="true">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a></pre>
            </blockquote>
            <div class="gmail-m_-619512251185950833moz-signature">-- <br>
              <div class="gmail-m_-619512251185950833moz-signature">
                <div class="gmail-m_-619512251185950833moz-signature"> <span
style="text-align:left;color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:10pt">Matthias
                    Kuhn</span><br>
                  <a href="mailto:matthias@opengis.ch" target="_blank"
                    moz-do-not-send="true"> <span
style="text-align:left;color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:8pt">matthias@opengis.ch</span>
                  </a><br>
                  <span
style="text-align:left;color:rgb(0,0,0);font-family:Verdana,sans-serif;font-size:8pt"><a
                      href="tel:+41764356763" target="_blank"
                      moz-do-not-send="true">+41 (0)76 435 67 63</a></span><br>
                  <div> <a href="http://www.opengis.ch" target="_blank"
                      moz-do-not-send="true"> <img
                        src="cid:part13.FF8A0334.45582A9B@opengis.ch"
                        alt="OPENGIS.ch Logo" class="" width="200"
                        height="80"></a> </div>
                </div>
              </div>
            </div>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <div class="moz-signature">-- <br>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div class="moz-signature">
        <title></title>
        <div class="moz-signature"> <span style="text-align: left;
            color: #000000; font-family: 'Verdana', sans-serif;
            font-size: 10pt">Matthias Kuhn</span><br>
          <a href="mailto:matthias@opengis.ch" target="_blank"> <span
              style="text-align: left; color: #000000; font-family:
              'Verdana', sans-serif; font-size: 8pt">matthias@opengis.ch</span>
          </a><br>
          <span style="text-align: left; color: #000000; font-family:
            'Verdana', sans-serif; font-size: 8pt"><a
              href="tel:+41764356763">+41 (0)76 435 67 63</a></span><br>
          <div> <a href="http://www.opengis.ch"> <img
                moz-do-not-send="false"
                src="cid:part13.FF8A0334.45582A9B@opengis.ch"
                alt="OPENGIS.ch Logo" width="200" height="80"></a> </div>
        </div>
      </div>
    </div>
  </body>
</html>