Hi Christian,

Am 15.11.2012 um 20:00 schrieb Christian Grün:

for $i at $p in //entry[phraseme[text() = "Ad0194"] and selected[text() = "yes"]]

It’s often beneficial to avoid nested predicated. Does the following
version give you better results?

  //entry[phraseme/text() = "Ad0194" and selected/text() = "yes"]

It gives one or two seconds. But I will use this also for other queries, thanks!

Beside that, feel free to send us the query info (the output of the
Info View), as it often indicates potential for additional
optimizations.

OK, here is the query info. Most time is used for evaluation, also printing takes some time, but parsing and compiling looks pretty fast, I think.



Query: for $i at $p in //entry[phraseme[text() = "Ad0194"] and selected[text() = "yes"]] let $query := $i/query let $node := $i/node let $prefix := fn:in-scope-prefixes($i) let $title := db:open-id('TG-DTA-GerManC-stemming-ws', $node) /ancestor::*:TEI[1]//*:fileDesc[1]//*:titleStmt[1]//*:title[1] let $author := db:open-id('TG-DTA-GerManC-stemming-ws', $node) /ancestor::*:TEI[1]//*:sourceDesc[1]//*:bibl[1]//*:author[1] let $note := db:open-id('TG-DTA-GerManC-stemming-ws', $node) /ancestor::*:TEI[1]//*:notesStmt//*:note let $expr := concat("ft:mark(db:open-id('TG-DTA-GerManC-stemming-ws', ", $node, ") ", $query, ")") let $time := data($i/@time) return <div> <hit count="{ $p}"> <p><input type="checkbox" name="NODE" value="{$node}"/><b class="hitno">{$p} ({ if($prefix = "dta") then "DTA" else "TG"})</b>Knoten: {$i/node}</p> {xquery:eval($expr)} </hit> <bib> <p class="bibl"><b>{$time}</b><br/><b>Bibliographie</b> { data($author)}: { data($title)} <br/><b>Anmerkung</b>: { data ($note) }<br/> <b>Korpus</b>: { if($prefix = "dta") then "Deutsches Textarchiv" else "TextGrid Digitale Bibliothek"}</p> </bib> <p></p></div>

Compiling:
- rewriting And expression to predicate(s)
- rewriting fn:boolean(phraseme[text() = "Ad0194"])
- rewriting fn:boolean(selected[text() = "yes"])
- simplifying descendant-or-self step(s)
- simplifying descendant-or-self step(s)

Result: for $i at $p as xs:integer in document-node { "collect.xml" }/descendant::entry[phraseme[text() = "Ad0194"]][selected[text() = "yes"]] let $query := $i/query let $node := $i/node let $prefix := fn:in-scope-prefixes($i) let $title := db:open-id("TG-DTA-GerManC-stemming-ws", $node)/ancestor::*:TEI[1]/descendant-or-self::node()/*:fileDesc[1]/descendant-or-self::node()/*:titleStmt[1]/descendant-or-self::node()/*:title[1] let $author := db:open-id("TG-DTA-GerManC-stemming-ws", $node)/ancestor::*:TEI[1]/descendant-or-self::node()/*:sourceDesc[1]/descendant-or-self::node()/*:bibl[1]/descendant-or-self::node()/*:author[1] let $note := db:open-id("TG-DTA-GerManC-stemming-ws", $node)/ancestor::*:TEI[1]/descendant::*:notesStmt/descendant::*:note let $expr := fn:concat("ft:mark(db:open-id('TG-DTA-GerManC-stemming-ws', ", $node, ") ", $query, ")") let $time := fn:data($i/@time) return element div { element hit { attribute count { $p }, element p { element input { attribute type { "checkbox" }, attribute name { "NODE" }, attribute value { $node } }, element b { attribute class { "hitno" }, $p, " (", if($prefix = "dta") then "DTA" else "TG", ")" }, "Knoten: ", $i/node }, xquery:eval($expr) }, element bib { element p { attribute class { "bibl" }, element b { $time }, element br { () }, element b { "Bibliographie" }, fn:data($author), ": ", fn:data($title), element br { () }, element b { "Anmerkung" }, ": ", fn:data($note), element br { () }, element b { "Korpus" }, ": ", if($prefix = "dta") then "Deutsches Textarchiv" else "TextGrid Digitale Bibliothek" } }, element p { () } }

Timing:
 - Parsing:  14.63 ms
 - Compiling:  33.34 ms
 - Evaluating:  12216.87 ms
 - Printing:  449.52 ms
 - Total Time:  12714.37 ms

Result: 
- Hit(s): 676 Items
- Updated: 0 Items
- Printed: 2048 KB

Query plan: 
<QueryPlan>
  <FLWR>
    <For var="$i" pos="$p as xs:integer">
      <IterPath>
        <DBNode name="collect-ws" pre="0"/>
        <IterStep axis="descendant" test="entry">
          <AxisPath>
            <IterStep axis="child" test="phraseme">
              <CmpG op="=">
                <AxisPath>
                  <IterStep axis="child" test="text()"/>
                </AxisPath>
                <Str value="Ad0194" type="xs:string"/>
              </CmpG>
            </IterStep>
          </AxisPath>
          <AxisPath>
            <IterStep axis="child" test="selected">
              <CmpG op="=">
                <AxisPath>
                  <IterStep axis="child" test="text()"/>
                </AxisPath>
                <Str value="yes" type="xs:string"/>
              </CmpG>
            </IterStep>
          </AxisPath>
        </IterStep>
      </IterPath>
    </For>
    <Let var="$query">
      <AxisPath>
        <VarRef>
          <Var name="$i" id="0"/>
        </VarRef>
        <IterStep axis="child" test="query"/>
      </AxisPath>
    </Let>
    <Let var="$node">
      <AxisPath>
        <VarRef>
          <Var name="$i" id="0"/>
        </VarRef>
        <IterStep axis="child" test="node"/>
      </AxisPath>
    </Let>
    <Let var="$prefix">
      <FNQName name="in-scope-prefixes(elem)">
        <VarRef>
          <Var name="$i" id="0"/>
        </VarRef>
      </FNQName>
    </Let>
    <Let var="$title">
      <AxisPath>
        <FNDb name="open-id(database,id)">
          <Str value="TG-DTA-GerManC-stemming-ws" type="xs:string"/>
          <VarRef>
            <Var name="$node" id="3"/>
          </VarRef>
        </FNDb>
        <IterPosStep axis="ancestor" test="*:TEI">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant-or-self" test="node()"/>
        <IterPosStep axis="child" test="*:fileDesc">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant-or-self" test="node()"/>
        <IterPosStep axis="child" test="*:titleStmt">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant-or-self" test="node()"/>
        <IterPosStep axis="child" test="*:title">
          <Pos min="1" max="1"/>
        </IterPosStep>
      </AxisPath>
    </Let>
    <Let var="$author">
      <AxisPath>
        <FNDb name="open-id(database,id)">
          <Str value="TG-DTA-GerManC-stemming-ws" type="xs:string"/>
          <VarRef>
            <Var name="$node" id="3"/>
          </VarRef>
        </FNDb>
        <IterPosStep axis="ancestor" test="*:TEI">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant-or-self" test="node()"/>
        <IterPosStep axis="child" test="*:sourceDesc">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant-or-self" test="node()"/>
        <IterPosStep axis="child" test="*:bibl">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant-or-self" test="node()"/>
        <IterPosStep axis="child" test="*:author">
          <Pos min="1" max="1"/>
        </IterPosStep>
      </AxisPath>
    </Let>
    <Let var="$note">
      <AxisPath>
        <FNDb name="open-id(database,id)">
          <Str value="TG-DTA-GerManC-stemming-ws" type="xs:string"/>
          <VarRef>
            <Var name="$node" id="3"/>
          </VarRef>
        </FNDb>
        <IterPosStep axis="ancestor" test="*:TEI">
          <Pos min="1" max="1"/>
        </IterPosStep>
        <IterStep axis="descendant" test="*:notesStmt"/>
        <IterStep axis="descendant" test="*:note"/>
      </AxisPath>
    </Let>
    <Let var="$expr">
      <FNStr name="concat(atom,atom[,...])">
        <Str value="ft:mark(db:open-id('TG-DTA-GerManC-stemming-ws', " type="xs:string"/>
        <VarRef>
          <Var name="$node" id="3"/>
        </VarRef>
        <Str value=") " type="xs:string"/>
        <VarRef>
          <Var name="$query" id="2"/>
        </VarRef>
        <Str value=")" type="xs:string"/>
      </FNStr>
    </Let>
    <Let var="$time">
      <FNGen name="data([item])">
        <AxisPath>
          <VarRef>
            <Var name="$i" id="0"/>
          </VarRef>
          <IterStep axis="attribute" test="time"/>
        </AxisPath>
      </FNGen>
    </Let>
    <Return>
      <CElem>
        <QNm value="div" type="xs:QName"/>
        <CElem>
          <QNm value="hit" type="xs:QName"/>
          <CAttr>
            <QNm value="count" type="xs:QName"/>
            <VarRef>
              <Var name="$p as xs:integer" id="1"/>
            </VarRef>
          </CAttr>
          <CElem>
            <QNm value="p" type="xs:QName"/>
            <CElem>
              <QNm value="input" type="xs:QName"/>
              <CAttr>
                <QNm value="type" type="xs:QName"/>
                <Str value="checkbox" type="xs:string"/>
              </CAttr>
              <CAttr>
                <QNm value="name" type="xs:QName"/>
                <Str value="NODE" type="xs:string"/>
              </CAttr>
              <CAttr>
                <QNm value="value" type="xs:QName"/>
                <VarRef>
                  <Var name="$node" id="3"/>
                </VarRef>
              </CAttr>
            </CElem>
            <CElem>
              <QNm value="b" type="xs:QName"/>
              <CAttr>
                <QNm value="class" type="xs:QName"/>
                <Str value="hitno" type="xs:string"/>
              </CAttr>
              <VarRef>
                <Var name="$p as xs:integer" id="1"/>
              </VarRef>
              <Str value=" (" type="xs:string"/>
              <If>
                <CmpG op="=">
                  <VarRef>
                    <Var name="$prefix" id="4"/>
                  </VarRef>
                  <Str value="dta" type="xs:string"/>
                </CmpG>
                <Str value="DTA" type="xs:string"/>
                <Str value="TG" type="xs:string"/>
              </If>
              <Str value=")" type="xs:string"/>
            </CElem>
            <Str value="Knoten: " type="xs:string"/>
            <AxisPath>
              <VarRef>
                <Var name="$i" id="0"/>
              </VarRef>
              <IterStep axis="child" test="node"/>
            </AxisPath>
          </CElem>
          <FNXQuery name="eval(string[,bindings])">
            <VarRef>
              <Var name="$expr" id="8"/>
            </VarRef>
          </FNXQuery>
        </CElem>
        <CElem>
          <QNm value="bib" type="xs:QName"/>
          <CElem>
            <QNm value="p" type="xs:QName"/>
            <CAttr>
              <QNm value="class" type="xs:QName"/>
              <Str value="bibl" type="xs:string"/>
            </CAttr>
            <CElem>
              <QNm value="b" type="xs:QName"/>
              <VarRef>
                <Var name="$time" id="9"/>
              </VarRef>
            </CElem>
            <CElem>
              <QNm value="br" type="xs:QName"/>
            </CElem>
            <CElem>
              <QNm value="b" type="xs:QName"/>
              <Str value="Bibliographie" type="xs:string"/>
            </CElem>
            <FNGen name="data([item])">
              <VarRef>
                <Var name="$author" id="6"/>
              </VarRef>
            </FNGen>
            <Str value=": " type="xs:string"/>
            <FNGen name="data([item])">
              <VarRef>
                <Var name="$title" id="5"/>
              </VarRef>
            </FNGen>
            <CElem>
              <QNm value="br" type="xs:QName"/>
            </CElem>
            <CElem>
              <QNm value="b" type="xs:QName"/>
              <Str value="Anmerkung" type="xs:string"/>
            </CElem>
            <Str value=": " type="xs:string"/>
            <FNGen name="data([item])">
              <VarRef>
                <Var name="$note" id="7"/>
              </VarRef>
            </FNGen>
            <CElem>
              <QNm value="br" type="xs:QName"/>
            </CElem>
            <CElem>
              <QNm value="b" type="xs:QName"/>
              <Str value="Korpus" type="xs:string"/>
            </CElem>
            <Str value=": " type="xs:string"/>
            <If>
              <CmpG op="=">
                <VarRef>
                  <Var name="$prefix" id="4"/>
                </VarRef>
                <Str value="dta" type="xs:string"/>
              </CmpG>
              <Str value="Deutsches Textarchiv" type="xs:string"/>
              <Str value="TextGrid Digitale Bibliothek" type="xs:string"/>
            </If>
          </CElem>
        </CElem>
        <CElem>
          <QNm value="p" type="xs:QName"/>
        </CElem>
      </CElem>
    </Return>
  </FLWR>
</QueryPlan>


--
Dr. phil. Cerstin Mahlow

Universität Basel
Deutsches Seminar
Nadelberg 4
4051 Basel
Schweiz

Tel:  +41 61 267 07 65
Fax: +41 61 267 34 40
Mail: cerstin.mahlow@unibas.ch
Web: http://www.oldphras.net