Search in sources :

Example 1 with PrecedingAxis

use of org.sirix.axis.PrecedingAxis 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 PrecedingAxis

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

the class DBNode method isFollowingOf.

@Override
public boolean isFollowingOf(final Node<?> other) {
    if (other instanceof DBNode) {
        final DBNode node = (DBNode) other;
        moveRtx();
        if (mKind != org.sirix.node.Kind.ATTRIBUTE && mKind != org.sirix.node.Kind.NAMESPACE) {
            if (mDeweyID.isPresent()) {
                return mDeweyID.get().isFollowingOf(node.mDeweyID.get());
            } else {
                for (final Axis axis = new PrecedingAxis(mRtx); axis.hasNext(); ) {
                    axis.next();
                    if (mRtx.getNodeKey() == node.getNodeKey()) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}
Also used : PrecedingAxis(org.sirix.axis.PrecedingAxis) 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 PrecedingAxis

use of org.sirix.axis.PrecedingAxis 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