Search in sources :

Example 1 with FuncDef

use of org.sirix.service.xml.xpath.functions.FuncDef 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)

Aggregations

InvocationTargetException (java.lang.reflect.InvocationTargetException)1 ArrayList (java.util.ArrayList)1 Axis (org.sirix.api.Axis)1 ForAxis (org.sirix.axis.ForAxis)1 FilterAxis (org.sirix.axis.filter.FilterAxis)1 PredicateFilterAxis (org.sirix.axis.filter.PredicateFilterAxis)1 ExceptAxis (org.sirix.service.xml.xpath.expr.ExceptAxis)1 IfAxis (org.sirix.service.xml.xpath.expr.IfAxis)1 IntersectAxis (org.sirix.service.xml.xpath.expr.IntersectAxis)1 RangeAxis (org.sirix.service.xml.xpath.expr.RangeAxis)1 SequenceAxis (org.sirix.service.xml.xpath.expr.SequenceAxis)1 UnionAxis (org.sirix.service.xml.xpath.expr.UnionAxis)1 VariableAxis (org.sirix.service.xml.xpath.expr.VariableAxis)1 DupFilterAxis (org.sirix.service.xml.xpath.filter.DupFilterAxis)1 FuncDef (org.sirix.service.xml.xpath.functions.FuncDef)1 AddOpAxis (org.sirix.service.xml.xpath.operators.AddOpAxis)1 DivOpAxis (org.sirix.service.xml.xpath.operators.DivOpAxis)1 IDivOpAxis (org.sirix.service.xml.xpath.operators.IDivOpAxis)1 ModOpAxis (org.sirix.service.xml.xpath.operators.ModOpAxis)1 MulOpAxis (org.sirix.service.xml.xpath.operators.MulOpAxis)1