package org.basex.query.item; import static org.basex.query.util.Err.*; import java.io.IOException; import org.basex.io.serial.Serializer; import org.basex.query.QueryContext; import org.basex.query.QueryException; import org.basex.query.iter.Iter; import org.basex.util.InputInfo; import org.basex.util.Util; /** * Abstract super class for function items. * * @author BaseX Team 2005-12, BSD License * @author Leo Woerteler */ public abstract class FItem extends Item { /** * Constructor. * @param t type */ protected FItem(final Type t) { super(t); } /** * Number of arguments this function item takes. * @return function arity */ public abstract int arity(); /** * Name of this function, {@code null} means anonymous function. * @return name or {@code null} */ public abstract QNm fName(); /** * Invokes this function item with the given arguments. * @param ctx query context * @param ii input info * @param args arguments * @return resulting iterator * @throws QueryException query exception */ public abstract Value invValue(final QueryContext ctx, final InputInfo ii, final Value... args) throws QueryException; /** * Invokes this function item with the given arguments. * @param ctx query context * @param ii input info * @param args arguments * @return resulting iterator * @throws QueryException query exception */ public Iter invIter(final QueryContext ctx, final InputInfo ii, final Value... args) throws QueryException { return invValue(ctx, ii, args).iter(); } /** * Invokes this function item with the given arguments. * @param ctx query context * @param ii input info * @param args arguments * @return resulting item * @throws QueryException query exception */ public Item invItem(final QueryContext ctx, final InputInfo ii, final Value... args) throws QueryException { return invValue(ctx, ii, args).item(ctx, ii); } /** * Coerces this function item to the given function type. * @param ft function type * @param ctx query context * @param ii input info * @return coerced item * @throws QueryException query exception */ public abstract FItem coerceTo(final FuncType ft, final QueryContext ctx, final InputInfo ii) throws QueryException; @Override public final byte[] string(final InputInfo ii) throws QueryException { throw NOTYP.thrw(ii, description()); } @Override public final boolean eq(final InputInfo ii, final Item it) throws QueryException { throw FNEQ.thrw(ii, description()); } @Override public Object toJava() throws QueryException { throw Util.notexpected(); } @Override public abstract void plan(Serializer ser) throws IOException; }