Search in sources :

Example 1 with AncestorAxis

use of org.sirix.axis.AncestorAxis in project sirix by sirixdb.

the class ExpressionSingle method isDupOrd.

/**
 * Determines for a given string representation of an axis, whether this axis leads to duplicates
 * in the result sequence or not. Furthermore it determines the new state for the order state that
 * specifies, if the result sequence is in document order. This method is implemented according to
 * the automata in [Hidders, J., Michiels, P., "Avoiding Unnecessary Ordering Operations in
 * XPath", 2003]
 *
 * @param ax name of the current axis
 * @return true, if expression is still duplicate free
 */
public boolean isDupOrd(final Axis ax) {
    Axis axis = ax;
    while (axis instanceof FilterAxis) {
        axis = ((FilterAxis) axis).getAxis();
    }
    if (axis instanceof UnionAxis) {
        mOrd = mOrd.updateOrdUnion();
        mDup = mDup.updateUnion();
    } else if (axis instanceof ChildAxis) {
        mOrd = mOrd.updateOrdChild();
        mDup = mDup.updateDupChild();
    } else if (axis instanceof ParentAxis) {
        mOrd = mOrd.updateOrdParent();
        mDup = mDup.updateDupParent();
    } else if (axis instanceof DescendantAxis) {
        mOrd = mOrd.updateOrdDesc();
        mDup = mDup.updateDupDesc();
    } else if (axis instanceof AncestorAxis) {
        mOrd = mOrd.updateOrdAncestor();
        mDup = mDup.updateDupAncestor();
    } else if (axis instanceof FollowingAxis || axis instanceof PrecedingAxis) {
        mOrd = mOrd.updateOrdFollPre();
        mDup = mDup.updateDupFollPre();
    } else if (axis instanceof FollowingSiblingAxis || axis instanceof PrecedingSiblingAxis) {
        mOrd = mOrd.updateOrdFollPreSib();
        mDup = mDup.updateDupFollPreSib();
    }
    return !DupState.nodup;
}
Also used : ChildAxis(org.sirix.axis.ChildAxis) AncestorAxis(org.sirix.axis.AncestorAxis) FollowingSiblingAxis(org.sirix.axis.FollowingSiblingAxis) FollowingAxis(org.sirix.axis.FollowingAxis) PrecedingAxis(org.sirix.axis.PrecedingAxis) PrecedingSiblingAxis(org.sirix.axis.PrecedingSiblingAxis) ParentAxis(org.sirix.axis.ParentAxis) DescendantAxis(org.sirix.axis.DescendantAxis) AncestorAxis(org.sirix.axis.AncestorAxis) PrecedingAxis(org.sirix.axis.PrecedingAxis) Axis(org.sirix.api.Axis) NestedAxis(org.sirix.axis.NestedAxis) ChildAxis(org.sirix.axis.ChildAxis) FollowingSiblingAxis(org.sirix.axis.FollowingSiblingAxis) UnionAxis(org.sirix.service.xml.xpath.expr.UnionAxis) FollowingAxis(org.sirix.axis.FollowingAxis) FilterAxis(org.sirix.axis.filter.FilterAxis) DescendantAxis(org.sirix.axis.DescendantAxis) ParentAxis(org.sirix.axis.ParentAxis) DupFilterAxis(org.sirix.service.xml.xpath.filter.DupFilterAxis) PrecedingSiblingAxis(org.sirix.axis.PrecedingSiblingAxis) FilterAxis(org.sirix.axis.filter.FilterAxis) DupFilterAxis(org.sirix.service.xml.xpath.filter.DupFilterAxis) UnionAxis(org.sirix.service.xml.xpath.expr.UnionAxis)

Example 2 with AncestorAxis

use of org.sirix.axis.AncestorAxis in project sirix by sirixdb.

the class DBNode method isDescendantOf.

@Override
public boolean isDescendantOf(final Node<?> other) {
    moveRtx();
    boolean retVal = false;
    if (other instanceof DBNode) {
        final DBNode node = (DBNode) other;
        assert node.getNodeClassID() == this.getNodeClassID();
        moveRtx();
        if (mKind != org.sirix.node.Kind.ATTRIBUTE && mKind != org.sirix.node.Kind.NAMESPACE) {
            if (mDeweyID.isPresent()) {
                return mDeweyID.get().isDescendantOf(node.mDeweyID.get());
            } else {
                for (final Axis axis = new AncestorAxis(mRtx); axis.hasNext(); ) {
                    axis.next();
                    if (node.getUnderlyingNode().getNodeKey() == mRtx.getNodeKey()) {
                        retVal = true;
                    }
                }
            }
        }
    }
    return retVal;
}
Also used : AncestorAxis(org.sirix.axis.AncestorAxis) AllTimeAxis(org.sirix.axis.temporal.AllTimeAxis) PrecedingAxis(org.sirix.axis.PrecedingAxis) Axis(org.sirix.api.Axis) FirstAxis(org.sirix.axis.temporal.FirstAxis) AbstractTemporalAxis(org.sirix.axis.AbstractTemporalAxis) ChildAxis(org.sirix.axis.ChildAxis) LastAxis(org.sirix.axis.temporal.LastAxis) AttributeAxis(org.sirix.axis.AttributeAxis) PastAxis(org.sirix.axis.temporal.PastAxis) FollowingAxis(org.sirix.axis.FollowingAxis) AncestorAxis(org.sirix.axis.AncestorAxis) FutureAxis(org.sirix.axis.temporal.FutureAxis) NonStructuralWrapperAxis(org.sirix.axis.NonStructuralWrapperAxis) NextAxis(org.sirix.axis.temporal.NextAxis) PreviousAxis(org.sirix.axis.temporal.PreviousAxis) DescendantAxis(org.sirix.axis.DescendantAxis)

Example 3 with AncestorAxis

use of org.sirix.axis.AncestorAxis in project sirix by sirixdb.

the class XPathParser method parseReverceAxis.

/**
 * Parses the the rule ReverceAxis according to the following production rule: [33] ReverseAxis
 * ::= <"parent" "::"> | <"ancestor" "::"> | <"preceding-sibling" "::">|<"preceding"
 * "::">|<"ancestor-or-self" "::"> .
 *
 * @return axis
 */
private AbstractAxis parseReverceAxis() {
    AbstractAxis axis;
    if (is("parent", true)) {
        axis = new ParentAxis(getTransaction());
    } else if (is("ancestor", true)) {
        axis = new AncestorAxis(getTransaction());
    } else if (is("ancestor-or-self", true)) {
        axis = new AncestorAxis(getTransaction(), IncludeSelf.YES);
    } else if (is("preceding", true)) {
        axis = new PrecedingAxis(getTransaction());
    } else {
        consume("preceding-sibling", true);
        axis = new PrecedingSiblingAxis(getTransaction());
    }
    consume(TokenType.COLON, true);
    consume(TokenType.COLON, true);
    return axis;
}
Also used : AncestorAxis(org.sirix.axis.AncestorAxis) PrecedingAxis(org.sirix.axis.PrecedingAxis) PrecedingSiblingAxis(org.sirix.axis.PrecedingSiblingAxis) AbstractAxis(org.sirix.axis.AbstractAxis) ParentAxis(org.sirix.axis.ParentAxis)

Aggregations

AncestorAxis (org.sirix.axis.AncestorAxis)3 PrecedingAxis (org.sirix.axis.PrecedingAxis)3 Axis (org.sirix.api.Axis)2 ChildAxis (org.sirix.axis.ChildAxis)2 DescendantAxis (org.sirix.axis.DescendantAxis)2 FollowingAxis (org.sirix.axis.FollowingAxis)2 ParentAxis (org.sirix.axis.ParentAxis)2 PrecedingSiblingAxis (org.sirix.axis.PrecedingSiblingAxis)2 AbstractAxis (org.sirix.axis.AbstractAxis)1 AbstractTemporalAxis (org.sirix.axis.AbstractTemporalAxis)1 AttributeAxis (org.sirix.axis.AttributeAxis)1 FollowingSiblingAxis (org.sirix.axis.FollowingSiblingAxis)1 NestedAxis (org.sirix.axis.NestedAxis)1 NonStructuralWrapperAxis (org.sirix.axis.NonStructuralWrapperAxis)1 FilterAxis (org.sirix.axis.filter.FilterAxis)1 AllTimeAxis (org.sirix.axis.temporal.AllTimeAxis)1 FirstAxis (org.sirix.axis.temporal.FirstAxis)1 FutureAxis (org.sirix.axis.temporal.FutureAxis)1 LastAxis (org.sirix.axis.temporal.LastAxis)1 NextAxis (org.sirix.axis.temporal.NextAxis)1