FileDocCategorySizeDatePackage
WalkingIteratorSorted.javaAPI DocJava SE 5 API6576Fri Aug 26 14:56:06 BST 2005com.sun.org.apache.xpath.internal.axes

WalkingIteratorSorted

public class WalkingIteratorSorted extends WalkingIterator
This class iterates over set of nodes that needs to be sorted.
xsl.usage
internal

Fields Summary
protected boolean
m_inNaturalOrderStatic
True if the nodes will be found in document order, and this can be determined statically.
Constructors Summary
public WalkingIteratorSorted(PrefixResolver nscontext)
Create a WalkingIteratorSorted object.

param
nscontext The namespace context for this iterator, should be OK if null.


                      
    
  
    super(nscontext);
  
WalkingIteratorSorted(Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
Create a WalkingIterator iterator, including creation of step walkers from the opcode list, and call back into the Compiler to create predicate expressions.

param
compiler The Compiler which is creating this expression.
param
opPos The position of this iterator in the opcode list from the compiler.
param
shouldLoadWalkers True if walkers should be loaded, or false if this is a derived iterator and it doesn't wish to load child walkers.
throws
javax.xml.transform.TransformerException

    super(compiler, opPos, analysis, shouldLoadWalkers);
  
Methods Summary
booleancanBeWalkedInNaturalDocOrderStatic()
Tell if the nodeset can be walked in doc order, via static analysis.

return
true if the nodeset can be walked in doc order, without sorting.


    if (null != m_firstWalker)
    {
      AxesWalker walker = m_firstWalker;
      int prevAxis = -1;
      boolean prevIsSimpleDownAxis = true;

      for(int i = 0; null != walker; i++)
      {
        int axis = walker.getAxis();
        
        if(walker.isDocOrdered())
        {
          boolean isSimpleDownAxis = ((axis == Axis.CHILD)
                                   || (axis == Axis.SELF)
                                   || (axis == Axis.ROOT));
          // Catching the filtered list here is only OK because
          // FilterExprWalker#isDocOrdered() did the right thing.
          if(isSimpleDownAxis || (axis == -1))
            walker = walker.getNextWalker();
          else
          {
            boolean isLastWalker = (null == walker.getNextWalker());
            if(isLastWalker)
            {
              if(walker.isDocOrdered() && (axis == Axis.DESCENDANT || 
                 axis == Axis.DESCENDANTORSELF || axis == Axis.DESCENDANTSFROMROOT
                 || axis == Axis.DESCENDANTSORSELFFROMROOT) || (axis == Axis.ATTRIBUTE))
                return true;
            }
            return false;
          }
        }
        else
          return false;
      }
      return true;
    }
    return false;
  
public voidfixupVariables(java.util.Vector vars, int globalsSize)
This function is used to perform some extra analysis of the iterator.

param
vars List of QNames that correspond to variables. This list should be searched backwards for the first qualified name that corresponds to the variable reference qname. The position of the QName in the vector from the start of the vector will be its position in the stack frame (but variables above the globalsTop value will need to be offset to the current stack frame).

    super.fixupVariables(vars, globalsSize);

    int analysis = getAnalysisBits();
    if(WalkerFactory.isNaturalDocOrder(analysis))
    {
    	m_inNaturalOrderStatic = true;
    }
    else
    {
    	m_inNaturalOrderStatic = false;
    	// System.out.println("Setting natural doc order to false: "+
    	//    WalkerFactory.getAnalysisString(analysis));
    }
    
  
public booleanisDocOrdered()
Returns true if all the nodes in the iteration well be returned in document order.

return
true as a default.

    return m_inNaturalOrderStatic;