Search in sources :

Example 51 with Axis

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

the class PipelineBuilder method addOperatorExpression.

/**
 * Adds an operator expression to the pipeline.
 *
 * @param mTransaction Transaction to operate with.
 * @param mOperator Operator type.
 */
public void addOperatorExpression(final XdmNodeReadTrx mTransaction, final String mOperator) {
    assert getPipeStack().size() >= 1;
    final XdmNodeReadTrx rtx = mTransaction;
    final Axis mOperand2 = getPipeStack().pop().getExpr();
    // the unary operation only has one operator
    final Axis mOperand1 = getPipeStack().pop().getExpr();
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    final Axis axis;
    // TODO: use typeswitch of JAVA 7
    if (mOperator.equals("+")) {
        axis = new AddOpAxis(rtx, mOperand1, mOperand2);
    } else if (mOperator.equals("-")) {
        axis = new SubOpAxis(rtx, mOperand1, mOperand2);
    } else if (mOperator.equals("*")) {
        axis = new MulOpAxis(rtx, mOperand1, mOperand2);
    } else if (mOperator.equals("div")) {
        axis = new DivOpAxis(rtx, mOperand1, mOperand2);
    } else if (mOperator.equals("idiv")) {
        axis = new IDivOpAxis(rtx, mOperand1, mOperand2);
    } else if (mOperator.equals("mod")) {
        axis = new ModOpAxis(rtx, mOperand1, mOperand2);
    } else {
        // TODO: unary operator
        throw new IllegalStateException(mOperator + " is not a valid operator.");
    }
    getExpression().add(axis);
}
Also used : IDivOpAxis(org.sirix.service.xml.xpath.operators.IDivOpAxis) DivOpAxis(org.sirix.service.xml.xpath.operators.DivOpAxis) XdmNodeReadTrx(org.sirix.api.XdmNodeReadTrx) SubOpAxis(org.sirix.service.xml.xpath.operators.SubOpAxis) IDivOpAxis(org.sirix.service.xml.xpath.operators.IDivOpAxis) ModOpAxis(org.sirix.service.xml.xpath.operators.ModOpAxis) 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) AddOpAxis(org.sirix.service.xml.xpath.operators.AddOpAxis) MulOpAxis(org.sirix.service.xml.xpath.operators.MulOpAxis)

Example 52 with Axis

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

the class PipelineBuilder method addCastableExpr.

/**
 * Adds a castable expression to the pipeline.
 *
 * @param mTransaction Transaction to operate with.
 * @param mSingleType single type the context item will be casted to.
 */
public void addCastableExpr(final XdmNodeReadTrx mTransaction, final SingleType mSingleType) {
    assert getPipeStack().size() >= 1;
    final Axis candidate = getPipeStack().pop().getExpr();
    final Axis axis = new CastableExpr(mTransaction, candidate, mSingleType);
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    getExpression().add(axis);
}
Also used : CastableExpr(org.sirix.service.xml.xpath.expr.CastableExpr) 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 53 with Axis

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

the class PipelineBuilder method addAndExpression.

/**
 * Adds a and expression to the pipeline.
 *
 * @param mTransaction Transaction to operate with.
 */
public void addAndExpression(final XdmNodeReadTrx mTransaction) {
    assert getPipeStack().size() >= 2;
    final Axis mOperand2 = getPipeStack().pop().getExpr();
    final Axis operand1 = getPipeStack().pop().getExpr();
    if (getPipeStack().empty() || getExpression().getSize() != 0) {
        addExpressionSingle();
    }
    getExpression().add(new AndExpr(mTransaction, operand1, mOperand2));
}
Also used : AndExpr(org.sirix.service.xml.xpath.expr.AndExpr) 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 54 with Axis

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

the class PipelineBuilder method addFunction.

/**
 * Adds a function to the pipeline.
 *
 * @param mTransaction Transaction to operate with.
 * @param mFuncName The name of the function
 * @param mNum The number of arguments that are passed to the function
 * @throws SirixXPathException if function can't be added
 */
public void addFunction(final XdmNodeReadTrx mTransaction, final String mFuncName, final int mNum) throws SirixXPathException {
    assert getPipeStack().size() >= mNum;
    final List<Axis> args = new ArrayList<Axis>(mNum);
    // order
    for (int i = 0; i < mNum; i++) {
        args.add(getPipeStack().pop().getExpr());
    }
    // get right function type
    final FuncDef func;
    try {
        func = FuncDef.fromString(mFuncName);
    } catch (final NullPointerException e) {
        throw EXPathError.XPST0017.getEncapsulatedException();
    }
    // get function class
    final Class<? extends AbstractFunction> function = func.getFunc();
    final Integer min = func.getMin();
    final Integer max = func.getMax();
    final Integer returnType = mTransaction.keyForName(func.getReturnType());
    // parameter types of the function's constructor
    final Class<?>[] paramTypes = { XdmNodeReadTrx.class, List.class, Integer.TYPE, Integer.TYPE, Integer.TYPE };
    try {
        // instantiate function class with right constructor
        final Constructor<?> cons = function.getConstructor(paramTypes);
        final Axis axis = (Axis) cons.newInstance(mTransaction, args, min, max, returnType);
        if (getPipeStack().empty() || getExpression().getSize() != 0) {
            addExpressionSingle();
        }
        getExpression().add(axis);
    } catch (final NoSuchMethodException e) {
        throw EXPathError.XPST0017.getEncapsulatedException();
    } catch (final IllegalArgumentException e) {
        throw EXPathError.XPST0017.getEncapsulatedException();
    } catch (final InstantiationException e) {
        throw new IllegalStateException("Function not implemented yet.");
    } catch (final IllegalAccessException e) {
        throw EXPathError.XPST0017.getEncapsulatedException();
    } catch (final InvocationTargetException e) {
        throw EXPathError.XPST0017.getEncapsulatedException();
    }
}
Also used : ArrayList(java.util.ArrayList) InvocationTargetException(java.lang.reflect.InvocationTargetException) FuncDef(org.sirix.service.xml.xpath.functions.FuncDef) 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 55 with Axis

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

the class AbstractSerializer method call.

/**
 * Serialize the storage.
 *
 * @return null.
 * @throws SirixException if can't call serailzer
 */
@Override
public Void call() throws SirixException {
    emitStartDocument();
    final int nrOfRevisions = mRevisions.length;
    final int length = (nrOfRevisions == 1 && mRevisions[0] < 0) ? (int) mSession.getMostRecentRevisionNumber() : nrOfRevisions;
    if (length > 1) {
        emitStartManualRootElement();
    }
    for (int i = 1; i <= length; i++) {
        try (final XdmNodeReadTrx rtx = mSession.beginNodeReadTrx((nrOfRevisions == 1 && mRevisions[0] < 0) ? i : mRevisions[i - 1])) {
            if (length > 1) {
                emitStartManualElement(i);
            }
            rtx.moveTo(mNodeKey);
            final Axis descAxis = new DescendantAxis(rtx, IncludeSelf.YES);
            // Setup primitives.
            boolean closeElements = false;
            long key = rtx.getNodeKey();
            // Iterate over all nodes of the subtree including self.
            while (descAxis.hasNext()) {
                key = descAxis.next();
                // Emit all pending end elements.
                if (closeElements) {
                    while (!mStack.isEmpty() && mStack.peek() != rtx.getLeftSiblingKey()) {
                        rtx.moveTo(mStack.pop());
                        emitEndElement(rtx);
                        rtx.moveTo(key);
                    }
                    if (!mStack.isEmpty()) {
                        rtx.moveTo(mStack.pop());
                        emitEndElement(rtx);
                    }
                    rtx.moveTo(key);
                    closeElements = false;
                }
                // Emit node.
                emitStartElement(rtx);
                // children.
                if (rtx.getKind() == Kind.ELEMENT && rtx.hasFirstChild()) {
                    mStack.push(rtx.getNodeKey());
                }
                // required.
                if (!rtx.hasFirstChild() && !rtx.hasRightSibling()) {
                    closeElements = true;
                }
            }
            // Finally emit all pending end elements.
            while (!mStack.isEmpty()) {
                rtx.moveTo(mStack.pop());
                emitEndElement(rtx);
            }
            if (length > 1) {
                emitEndManualElement(i);
            }
        }
    }
    if (length > 1) {
        emitEndManualRootElement();
    }
    emitEndDocument();
    return null;
}
Also used : XdmNodeReadTrx(org.sirix.api.XdmNodeReadTrx) 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