Search in sources :

Example 11 with Axis

use of org.sirix.api.Axis in project sirix by sirixdb.

the class PipelineBuilder method addInstanceOfExpr.

/**
 * Adds a instance of expression to the pipeline.
 *
 * @param mTransaction Transaction to operate with.
 * @param mSequenceType sequence type the context item should match.
 */
public void addInstanceOfExpr(final XdmNodeReadTrx mTransaction, final SequenceType mSequenceType) {
    assert getPipeStack().size() >= 1;
    final Axis candidate = getPipeStack().pop().getExpr();
    final Axis axis = new InstanceOfExpr(mTransaction, candidate, mSequenceType);
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    getExpression().add(axis);
}
Also used : InstanceOfExpr(org.sirix.service.xml.xpath.expr.InstanceOfExpr) ModOpAxis(org.sirix.service.xml.xpath.operators.ModOpAxis) RangeAxis(org.sirix.service.xml.xpath.expr.RangeAxis) AddOpAxis(org.sirix.service.xml.xpath.operators.AddOpAxis) ExceptAxis(org.sirix.service.xml.xpath.expr.ExceptAxis) Axis(org.sirix.api.Axis) MulOpAxis(org.sirix.service.xml.xpath.operators.MulOpAxis) UnionAxis(org.sirix.service.xml.xpath.expr.UnionAxis) IfAxis(org.sirix.service.xml.xpath.expr.IfAxis) IntersectAxis(org.sirix.service.xml.xpath.expr.IntersectAxis) IDivOpAxis(org.sirix.service.xml.xpath.operators.IDivOpAxis) DupFilterAxis(org.sirix.service.xml.xpath.filter.DupFilterAxis) PredicateFilterAxis(org.sirix.axis.filter.PredicateFilterAxis) VariableAxis(org.sirix.service.xml.xpath.expr.VariableAxis) ForAxis(org.sirix.axis.ForAxis) SequenceAxis(org.sirix.service.xml.xpath.expr.SequenceAxis) FilterAxis(org.sirix.axis.filter.FilterAxis) SubOpAxis(org.sirix.service.xml.xpath.operators.SubOpAxis) DivOpAxis(org.sirix.service.xml.xpath.operators.DivOpAxis)

Example 12 with Axis

use of org.sirix.api.Axis in project sirix by sirixdb.

the class PipelineBuilder method addForExpression.

/**
 * Adds a for expression to the pipeline. In case the for expression has more then one for
 * condition, the for expression is converted to a nested for expression with only one for
 * condition each, see the following example: for $a in /a, $b in /b, $c in /c return /d is
 * converted to for $a in /a return for $b in /b return for $c in /c return /d
 *
 * @param mForConditionNum Number of all for conditions of the expression
 */
public void addForExpression(final int mForConditionNum) {
    assert getPipeStack().size() >= (mForConditionNum + 1);
    Axis forAxis = (getPipeStack().pop().getExpr());
    int num = mForConditionNum;
    while (num-- > 0) {
        forAxis = new ForAxis(getPipeStack().pop().getExpr(), forAxis);
    }
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    getExpression().add(forAxis);
}
Also used : ForAxis(org.sirix.axis.ForAxis) ModOpAxis(org.sirix.service.xml.xpath.operators.ModOpAxis) RangeAxis(org.sirix.service.xml.xpath.expr.RangeAxis) AddOpAxis(org.sirix.service.xml.xpath.operators.AddOpAxis) ExceptAxis(org.sirix.service.xml.xpath.expr.ExceptAxis) Axis(org.sirix.api.Axis) MulOpAxis(org.sirix.service.xml.xpath.operators.MulOpAxis) UnionAxis(org.sirix.service.xml.xpath.expr.UnionAxis) IfAxis(org.sirix.service.xml.xpath.expr.IfAxis) IntersectAxis(org.sirix.service.xml.xpath.expr.IntersectAxis) IDivOpAxis(org.sirix.service.xml.xpath.operators.IDivOpAxis) DupFilterAxis(org.sirix.service.xml.xpath.filter.DupFilterAxis) PredicateFilterAxis(org.sirix.axis.filter.PredicateFilterAxis) VariableAxis(org.sirix.service.xml.xpath.expr.VariableAxis) ForAxis(org.sirix.axis.ForAxis) SequenceAxis(org.sirix.service.xml.xpath.expr.SequenceAxis) FilterAxis(org.sirix.axis.filter.FilterAxis) SubOpAxis(org.sirix.service.xml.xpath.operators.SubOpAxis) DivOpAxis(org.sirix.service.xml.xpath.operators.DivOpAxis)

Example 13 with Axis

use of org.sirix.api.Axis in project sirix by sirixdb.

the class PipelineBuilder method addQuantifierExpr.

/**
 * Adds a SomeExpression or an EveryExpression to the pipeline, depending on the parameter isSome.
 *
 * @param mTransaction Transaction to operate with.
 * @param mIsSome defines whether a some- or an EveryExpression is used.
 * @param mVarNum number of binding variables
 */
public void addQuantifierExpr(final XdmNodeReadTrx mTransaction, final boolean mIsSome, final int mVarNum) {
    assert getPipeStack().size() >= (mVarNum + 1);
    final Axis satisfy = getPipeStack().pop().getExpr();
    final List<Axis> vars = new ArrayList<Axis>();
    int num = mVarNum;
    while (num-- > 0) {
        // invert current order of variables to get original variable order
        vars.add(num, getPipeStack().pop().getExpr());
    }
    final Axis mAxis = mIsSome ? new SomeExpr(mTransaction, vars, satisfy) : new EveryExpr(mTransaction, vars, satisfy);
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    getExpression().add(mAxis);
}
Also used : EveryExpr(org.sirix.service.xml.xpath.expr.EveryExpr) ArrayList(java.util.ArrayList) SomeExpr(org.sirix.service.xml.xpath.expr.SomeExpr) ModOpAxis(org.sirix.service.xml.xpath.operators.ModOpAxis) RangeAxis(org.sirix.service.xml.xpath.expr.RangeAxis) AddOpAxis(org.sirix.service.xml.xpath.operators.AddOpAxis) ExceptAxis(org.sirix.service.xml.xpath.expr.ExceptAxis) Axis(org.sirix.api.Axis) MulOpAxis(org.sirix.service.xml.xpath.operators.MulOpAxis) UnionAxis(org.sirix.service.xml.xpath.expr.UnionAxis) IfAxis(org.sirix.service.xml.xpath.expr.IfAxis) IntersectAxis(org.sirix.service.xml.xpath.expr.IntersectAxis) IDivOpAxis(org.sirix.service.xml.xpath.operators.IDivOpAxis) DupFilterAxis(org.sirix.service.xml.xpath.filter.DupFilterAxis) PredicateFilterAxis(org.sirix.axis.filter.PredicateFilterAxis) VariableAxis(org.sirix.service.xml.xpath.expr.VariableAxis) ForAxis(org.sirix.axis.ForAxis) SequenceAxis(org.sirix.service.xml.xpath.expr.SequenceAxis) FilterAxis(org.sirix.axis.filter.FilterAxis) SubOpAxis(org.sirix.service.xml.xpath.operators.SubOpAxis) DivOpAxis(org.sirix.service.xml.xpath.operators.DivOpAxis)

Example 14 with Axis

use of org.sirix.api.Axis in project sirix by sirixdb.

the class PipelineBuilder method addRangeExpr.

/**
 * Adds a range expression to the pipeline.
 *
 * @param mTransaction Transaction to operate with.
 */
public void addRangeExpr(final XdmNodeReadTrx mTransaction) {
    assert getPipeStack().size() >= 2;
    final Axis mOperand2 = getPipeStack().pop().getExpr();
    final Axis mOperand1 = getPipeStack().pop().getExpr();
    final Axis axis = new RangeAxis(mTransaction, mOperand1, mOperand2);
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    getExpression().add(axis);
}
Also used : RangeAxis(org.sirix.service.xml.xpath.expr.RangeAxis) ModOpAxis(org.sirix.service.xml.xpath.operators.ModOpAxis) RangeAxis(org.sirix.service.xml.xpath.expr.RangeAxis) AddOpAxis(org.sirix.service.xml.xpath.operators.AddOpAxis) ExceptAxis(org.sirix.service.xml.xpath.expr.ExceptAxis) Axis(org.sirix.api.Axis) MulOpAxis(org.sirix.service.xml.xpath.operators.MulOpAxis) UnionAxis(org.sirix.service.xml.xpath.expr.UnionAxis) IfAxis(org.sirix.service.xml.xpath.expr.IfAxis) IntersectAxis(org.sirix.service.xml.xpath.expr.IntersectAxis) IDivOpAxis(org.sirix.service.xml.xpath.operators.IDivOpAxis) DupFilterAxis(org.sirix.service.xml.xpath.filter.DupFilterAxis) PredicateFilterAxis(org.sirix.axis.filter.PredicateFilterAxis) VariableAxis(org.sirix.service.xml.xpath.expr.VariableAxis) ForAxis(org.sirix.axis.ForAxis) SequenceAxis(org.sirix.service.xml.xpath.expr.SequenceAxis) FilterAxis(org.sirix.axis.filter.FilterAxis) SubOpAxis(org.sirix.service.xml.xpath.operators.SubOpAxis) DivOpAxis(org.sirix.service.xml.xpath.operators.DivOpAxis)

Example 15 with Axis

use of org.sirix.api.Axis in project sirix by sirixdb.

the class AbstractDiff method checkReplace.

/**
 * Check for a replace of a node.
 *
 * @param newRtx first {@link XdmNodeReadTrx} instance
 * @param oldRtx second {@link XdmNodeReadTrx} instance
 * @return true if node has been replaced, false otherwise
 */
boolean checkReplace(final XdmNodeReadTrx newRtx, final XdmNodeReadTrx oldRtx) {
    boolean replaced = false;
    if (newRtx.getNodeKey() != oldRtx.getNodeKey()) {
        final long newKey = newRtx.getNodeKey();
        boolean movedNewRtx = newRtx.moveToRightSibling().hasMoved();
        final long oldKey = oldRtx.getNodeKey();
        boolean movedOldRtx = oldRtx.moveToRightSibling().hasMoved();
        if (movedNewRtx && movedOldRtx) {
            if (newRtx.getNodeKey() == oldRtx.getNodeKey()) {
                replaced = true;
            } else {
                while (newRtx.hasRightSibling() && oldRtx.hasRightSibling()) {
                    newRtx.moveToRightSibling();
                    oldRtx.moveToRightSibling();
                    if (newRtx.getNodeKey() == oldRtx.getNodeKey()) {
                        replaced = true;
                        break;
                    }
                }
            }
        } else if (!movedNewRtx && !movedOldRtx && (mDiff == DiffType.SAME || mDiff == DiffType.SAMEHASH)) {
            movedNewRtx = newRtx.moveToParent().hasMoved();
            movedOldRtx = oldRtx.moveToParent().hasMoved();
            if (movedNewRtx && movedOldRtx && newRtx.getNodeKey() == oldRtx.getNodeKey()) {
                replaced = true;
            }
        }
        newRtx.moveTo(newKey);
        oldRtx.moveTo(oldKey);
        if (replaced) {
            final long newNodeKey = newRtx.getNodeKey();
            final long oldNodeKey = oldRtx.getNodeKey();
            final Axis oldAxis = new DescendantAxis(oldRtx, IncludeSelf.YES);
            final Axis newAxis = new DescendantAxis(newRtx, IncludeSelf.YES);
            while (oldAxis.hasNext()) {
                oldAxis.next();
                fireDiff(DiffType.REPLACEDOLD, newRtx.getNodeKey(), oldRtx.getNodeKey(), new DiffDepth(mDepth.getNewDepth(), mDepth.getOldDepth()));
                adjustDepth(oldRtx, oldNodeKey, Revision.OLD);
            }
            while (newAxis.hasNext()) {
                newAxis.next();
                fireDiff(DiffType.REPLACEDNEW, newRtx.getNodeKey(), oldRtx.getNodeKey(), new DiffDepth(mDepth.getNewDepth(), mDepth.getOldDepth()));
                adjustDepth(newRtx, newNodeKey, Revision.NEW);
            }
            newRtx.moveTo(newNodeKey);
            oldRtx.moveTo(oldNodeKey);
            mDiff = DiffType.REPLACED;
            // final IAxis oldAxis = new DescendantAxis(pOldRtx, EIncludeSelf.YES);
            // final IAxis newAxis = new DescendantAxis(pNewRtx, EIncludeSelf.YES);
            // if (pNewRtx.getDescendantCount() >= pOldRtx
            // .getDescendantCount()) {
            // while (newAxis.hasNext()) {
            // newAxis.next();
            // boolean moved = false;
            // if (oldAxis.hasNext()) {
            // oldAxis.next();
            // moved = true;
            // }
            // fireDiff(EDiff.REPLACEDNEW, pNewRtx, pOldRtx,
            // new DiffDepth(mDepth.getNewDepth(), mDepth.getOldDepth()));
            // adjustDepth(newAxis.getTransaction(), newNodeKey, ERevision.NEW);
            // if (moved) {
            // adjustDepth(oldAxis.getTransaction(), oldNodeKey, ERevision.OLD);
            // }
            // }
            // 
            // } else {
            // while (oldAxis.hasNext()) {
            // oldAxis.next();
            // boolean moved = false;
            // if (newAxis.hasNext()) {
            // newAxis.next();
            // moved = true;
            // }
            // fireDiff(EDiff.REPLACEDOLD, pNewRtx, pOldRtx,
            // new DiffDepth(mDepth.getNewDepth(), mDepth.getOldDepth()));
            // adjustDepth(oldAxis.getTransaction(), oldNodeKey, ERevision.OLD);
            // if (moved) {
            // adjustDepth(newAxis.getTransaction(), newNodeKey, ERevision.NEW);
            // }
            // }
            // }
            newRtx.moveTo(newNodeKey);
            oldRtx.moveTo(oldNodeKey);
        }
    }
    return replaced;
}
Also used : DescendantAxis(org.sirix.axis.DescendantAxis) Axis(org.sirix.api.Axis) DescendantAxis(org.sirix.axis.DescendantAxis)

Aggregations

Axis (org.sirix.api.Axis)73 DescendantAxis (org.sirix.axis.DescendantAxis)39 FilterAxis (org.sirix.axis.filter.FilterAxis)38 ChildAxis (org.sirix.axis.ChildAxis)23 UnionAxis (org.sirix.service.xml.xpath.expr.UnionAxis)19 DupFilterAxis (org.sirix.service.xml.xpath.filter.DupFilterAxis)19 ForAxis (org.sirix.axis.ForAxis)17 PredicateFilterAxis (org.sirix.axis.filter.PredicateFilterAxis)17 ExceptAxis (org.sirix.service.xml.xpath.expr.ExceptAxis)17 IfAxis (org.sirix.service.xml.xpath.expr.IfAxis)17 IntersectAxis (org.sirix.service.xml.xpath.expr.IntersectAxis)17 RangeAxis (org.sirix.service.xml.xpath.expr.RangeAxis)17 SequenceAxis (org.sirix.service.xml.xpath.expr.SequenceAxis)17 VariableAxis (org.sirix.service.xml.xpath.expr.VariableAxis)17 AddOpAxis (org.sirix.service.xml.xpath.operators.AddOpAxis)17 DivOpAxis (org.sirix.service.xml.xpath.operators.DivOpAxis)17 IDivOpAxis (org.sirix.service.xml.xpath.operators.IDivOpAxis)17 ModOpAxis (org.sirix.service.xml.xpath.operators.ModOpAxis)17 MulOpAxis (org.sirix.service.xml.xpath.operators.MulOpAxis)17 SubOpAxis (org.sirix.service.xml.xpath.operators.SubOpAxis)17