<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Xalan" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation and was
 * originally based on software copyright (c) 2001, Sun
 * Microsystems., http://www.sun.com.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 -->

<s1 title="XSLTC Predicate Handling">

  <s2 title="Definition">

  <p>According to Michael Kay's &quot;XSLT Programmer's Reference&quot; page
  736, a predicate is &quot;An expression used to filter which nodes are
  selected by a particular step in a path expression, or to select a subset of
  the nodes in a node-set. A Boolean expression selects the nodes for which the
  predicate is true; a numeric expression selects the node at the position
  given by the value of the expression, for example '[1]' selects the first
  node.&quot;. Note that a predicate containing a boolean expression can
  return zero, one or more nodes, while a predicate containing a numeric
  expression can return only zero or one node.</p>

  </s2>

  <s2 title="Examples">

  <p>I'll list a few examples that I can refer back to later on in this
  document. All examples will use this XML document:</p><source>
    &lt;?xml version="1.0"?>
    &lt;doc>
      &lt;foo location="Drumcondra">
        &lt;bar name="Cat and Cage"/>
        &lt;bar name="Fagan's"/>
        &lt;bar name="Gravedigger's"/>
        &lt;bar name="Ivy House"/>
      &lt;foo>
      &lt;foo location="Town">
        &lt;bar name="Peter's Pub"/>
        &lt;bar name="Grogan's"/>
        &lt;bar name="Hogans's"/>
        &lt;bar name="Brogan's"/>
      &lt;/foo>
    &lt;/doc></source>

  <p>Here are some examples of a predicate with boolean expressions:</p><source>
    &lt;xsl:for-each select="//bar[contains(@name,'ogan')]">
    &lt;xsl:for-each select="//bar[parent::*/@location = 'Drumcondra']">
    &lt;xsl:for-each select="//bar[@name = 'Cat and Cage']"></source>

  <p>The first two select more than one node, while the last selects only one.
  The last expression could select more nodes if the input document was
  different. Now, here are a few examples of predicates with numeric
  expressions:</p><source>
    &lt;xsl:value-of select="//bar[1]">
    &lt;xsl:value-of select="/doc/foo[2]/bar[1]">
    &lt;xsl:value-of select="/doc/foo[2]/bar"></source>
  <p>The last expression will return more than one node, but the step that
  contains the predicate returns only one (the second <code>&lt;foo&gt;</code>
  element).</p>

  <p>The above are the basic types of predicates. These can be grouped to create
  a predicate pipeline, where the first predicate reduces the node-set that the
  second predicate filters, and so on. Here are some examples:</p><source>
    A: &lt;for-each select="//bar[contains(@name,'ogan')][2]">
    C: &lt;for-each select="//bar[2][contains(@name,'ogan')]">
    B: &lt;for-each select="//bar[position() > 3][2]"></source>

  <p>It is easier to figure out which nodes these expressions should return if
  one goes through the steps and predicates one by one. In expression
  <code>A:</code> we first get all <code>&lt;bar&gt;</code> elements from the
  whole document. Then the first predicate selects from that node-set only
  those elements that have a <code>@name</code> attribute that contains
  &quot;ogan&quot;, and we're left with these elements:</p><source>
        &lt;bar name="Grogan's">
        &lt;bar name="Hogans's">
        &lt;bar name="Brogan's"></source>
  <p>And finally, the last predicate then selects the second of those
  elements:</p><source>
        &lt;bar name="Hogans's"></source>

  <p>Expression <code>B:</code> contains the same predicates as <code>A:</code>,
  but the resulting node set if completely different. We start off with the same
  set of <code>&lt;bar&gt;</code> elements, but we apply the
  <code>&quot;[2]&quot;</code> predicate first, and end up with this
  element:</p><source>
        &lt;bar name="Fagan's"></source>

  <p>Fagan's is the bar where the Irish Taoiseach (prime minister) drinks his
  pints, but its name does not contain the string &quot;<code>ogan</code>&quot;,
  so the resulting node-set is empty.</p>

  <p>The third expressions also starts off with all <code>&lt;bar&gt;</code>
  elements, applies the predicate &quot;<code>[position() > 3]</code>&quot;,
  and reduces the node set to these:</p><source>
        &lt;bar name="Ivy House">
        &lt;bar name="Peter's Pub">
        &lt;bar name="Grogan's">
        &lt;bar name="Hogans's">
        &lt;bar name="Brogan's"></source>
  <p>The last predicate &quot;<code>[2]</code>&quot; is applied to this node-set
  and set is further reduced to:</p><source>
        &lt;bar name="Peter's Pub"></source>

  </s2>

  <s2 title="Categories">

  <p>From the examples in the last chapter we can try to categorize predicate
  chains/pipelines to simplify our implementation. We can speed up processing
  significantly if we can avoid using a data-structure (iterator) to represent
  the intermediate step between predicates. The goal of setting up these
  categories is to pinpoint those cases where an intermediate iterator has
  to be used and when it can be avoided.</p>

    <s3 title="Single predicate expressions">

    <p>Expressions containing just a single predicate have no intermediate step
    and there is no need for any extra iterator. The expression inside the
    predicate can be applied directly to the original iterator. We call this
    category <em>SIMPLE_CONTEXT</em>.</p>

    </s3>

    <s3 title="Expressions containing only non-position predicates">
    
    <p>Predicate-order is significant when the predicate-chain contains one or
    more predicate with an expression similar to
    &quot;<code>position() > 3</code>&quot; or &quot;<code>2</code>&quot;. This
    is because the <code>position()</code> and <code>last()</code> explicitly
    refer to the intermediate step between applying each predicate. The
    expression:</p><source>
    &lt;xsl:for-each select="//bar[contains(@name,'ogan')][parent::*/@location = 'Town']"></source>
    <p>has two predicates that can be applied in any order and still produce the
    desired node-set. Such predicates can be merged to:</p><source>
    &lt;xsl:for-each select="//bar[contains(@name,'ogan') &amp; (parent::*/@location = 'Town')]"></source>
    <p>We call this category NO_CONTEXT.</p>

    </s3>

    <s3 title="Expressions containing position predicates">

    <p>A predicate-chain, whose predicates' expressions contain any use of the
    <code>position()</code> or <code>last()</code> functions require some way
    of representing the intermediate step in an iterator. The first predicate
    is applied to the original node-set, and the resulting node-set must then
    be stored in some other iterator, from which the second predicate can get
    the current position from the iterator's <code>getPosition()</code> and
    <code>getLast()</code> methods. We call this category
    GENERAL_CONTEXT</p>

    </s3>

    <anchor name="exception"/>
    <s3 title="Expressions containing one position predicate">

    <p>There is one expection from the GENERAL_CONTEXT category. If the
    predicate-chain contains only one position-predicate, and that predicate is
    the very first one, then that predicate can call the iterator that contains
    the first node-set directly. Just look:</p><source>
    &lt;xsl:for-each select="//bar[2][parent::*/@location = 'Drumcondra']"></source>
    <p>The <code>[2]</code> predicate can be applied to the original iterator
    for the <code>//bar</code> step. And so can the
    <code>[parent::*/@location = 'Drumcondra']</code> predicate as well. This
    is only the case when the position predicate is first in the predicate
    chain. These types of predicate chains belong in the
     NO_CONTEXT  category.</p>

    </s3>

  </s2>

  <s2 title="Design details">

    <p>Predicates are handled quite differently in step expressions and step
    patterns. Step expressions are not implemented with the various contexts in
    mind and use a specialised iterator to wrap the code for each predicate.
    Step patterns are more complicated and CPU (or should I say JVM?)
    exhaustive. Step patterns containing predicates are analysed to determine
    context type and compiled accordingly.</p>

    <s3 title="Predicates and Step expressions">

    <p>The basic behaviour for a predicate is to compile a <em>filter</em>. This
    filter is an auxiliary class that implements the
    <code>org.apache.xalan.xsltc.dom.CurrentNodeListFilter</code> interface. The
    <code>Step</code> or <code>StepPattern</code> that uses the predicate will
    create a <code>org.apache.xalan.xsltc.dom.CurrentNodeListFilter</code>. This
    iterator contains the nodes that pass through the predicate. The compiled
    filter is used by the iterator to determine which nodes that should be
    included. The <code>org.apache.xalan.xsltc.dom.CurrentNodeListFilter</code>
    interface contains only a single method:</p><source>
    public interface CurrentNodeListFilter {
    public abstract boolean test(int node, int position, int last, int current,
                                 AbstractTranslet translet, NodeIterator iter);
    }</source>

    <p>The code that is compiled into the <code>test()</code> method is the
    code for the predicate's expression. The <code>Predicate</code> class
    compiles the filter class and a <code>test()</code> method skeleton, while
    some sub-class of the <code>Expression</code> class compiles the actual
    code that goes into this method.</p>

    <p>The iterator is initialised with a filter that implements this interface:
    </p><source>
    public CurrentNodeListIterator(NodeIterator source, 
				   CurrentNodeListFilter filter,
				   int currentNode,
				   AbstractTranslet translet) {
	this(source, !source.isReverse(), filter, currentNode, translet);
    }</source>

    <p>The iterator will use its source iterator to provide it with the initial
    node-set. Each node that is returned from this set is passed through the
    filter before returned by the <code>next()</code> method. Note that the
    source iterator can also be a current node-list iterator (if two or more
    predicates are chained together).</p>

    </s3>

    <s3 title="Optimisations in Step expressions">

    <s4 title="Node-value iterators">

    <p>Some simple predicates that test for node values are handled by the
    <code>NodeValueIterator</code> class at runtime. These are:</p><source>
    A: foo[@attr = &lt;value&gt;]
    B: foo[bar = &lt;value&gt;]
    C: foo/bar[. = &lt;value&gt;]</source>

    <p>The first case is handled by creating an iterator that represents
    <code>foo/@attr</code>, then passing this iterator and a test-value to
    a <code>NodeValueIterator</code>. The <em>&lt;value&gt;</em> is an
    expression that is compiled and passed to the iterator as a string. It
    does <em>not</em> have to be a literal string as the string value is
    found at runtime. The last two cases are similarly handled by creating an
    iterator for <code>foo/bar</code> and passing that and the test-value to
    a <code>NodeValueIterator</code>.</p>

    </s4>

    <s4 title="Nth descendant iterators">

    <p>The <code>Step</code> class is also optimised for position-predicates
    that are applied to descendant iterators:</p><source>
    &lt;xsl:for-each select="//bar[3]"></source>

    <p>Such step/predicate combinations are handled by the internal DOM's
    inner class <code>NthDescendantIterator</code>.</p>

    </s4>

    <s4 title="Nth position iterators">

    <p>Similarly, the <code>Step</code> class is optimised for
    position-predicates that are applied to basic steps:</p><source>
    &lt;xsl:for-each select="bar[3]"></source>

    <p>Such step/predicate combinations are handled by the internal DOM's
    inner class <code>NthPositionIterator</code>.</p>

    </s4>

    <s4 title="Node test">

    <p>The predicate class contains a method that tells you if it is a boolean
    test:</p><source>
    public boolean isBooleanTest();</source>

    <p>This can be, but it currently is not, used by the <code>Step</code> class
    to compile in optimised code. Some work to be done here!</p>

    </s4>

    </s3>

    <anchor name="step-patterns"/>
    <s3 title="Predicates and StepPatterns">

    <p>Using predicates in patterns is slow on any XSLT processor, and XSLTC
    is no exception. This is why the predicate context is carefully analysed
    by the <code>StepPattern</code> class, so that the compiled code is
    specialised to handle the specific predicate(s) in use. First we should
    consider the basic step pattern.</p>

    <s4 title="Basic pattern handling">

    <p>All patterns are grouped (by the <code>Mode</code> class) according to
    their <ref>kernel</ref>-node type. The kernel node-type is node-type of the
    <em>last</em> step in a pattern:</p><source>
    &lt;xsl:template match="foo/bar/baz"&gt;  ...  &lt;xsl:template&gt;</source>

    <p>In this case the type for elements <code>&lt;baz&gt;</code> is the
    kernel type. This step is <em>not</em> compiled as a step pattern. The node
    type is passed to the <code>Mode</code> class and is used to place the
    remainder of the pattern code inside the big <code>switch()</code> statement
    in the translet's <code>applyTemplates()</code> method. The whole pattern
    is then <em>reduced</em> to:</p><source>
    match="foo/bar"</source>

    <p>The <code>StepPattern</code> representing the <code>&lt;bar&gt;</code>
    element test is compiled under the appropriate <code>case:</code> section
    of the <code>switch()</code> statement. The code compiled for the step
    pattern is basically just a call to the DOM's <code>getType()</code>
    method and a test for the desired node type. There are two special cases
    for:</p><source>
    &lt;xsl:template match="foo/*/baz"&gt;  ...  &lt;xsl:template&gt;
    &lt;xsl:template match="foo/*@[2]"&gt;  ...  &lt;xsl:template&gt;</source>

    <p>In the first case we call <code>isElement()</code> and in the second case
    we call <code>isAttribute()</code>, instead of <code>getType()</code>.</p>

    </s4>

    <s4 title="Patterns with predicates">

    <p>The <code>typeCheck()</code> method of the <code>StepPattern</code>
    invokes a method that analyses the predicates of the step pattern and
    determines their context. (Note that this method needs to be updated to
    handle the exception to the GENERAL_CONTEXT metioned in the section
    <link anchor="exception">Expressions containing one position predicate</link> earlier in this document.) The <code>translate()</code> method of the
    <code>StepPattern</code> class contains a <code>switch()</code> statement
    that calls methods that are tailored for compiling code for the various
    predicate contexts.</p>

    </s4>

    </s3>

  </s2>

</s1>
