package org.basex.query.expr;
import static org.basex.query.QueryText.*;
import java.io.IOException;
import org.basex.io.serial.Serializer;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.item.Item;
import org.basex.query.item.SeqType;
import org.basex.util.InputInfo;
import org.basex.util.Token;
/**
* Arithmetic expression.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class Arith extends Arr {
/** Calculation operator. */
private final Calc calc;
/**
* Constructor.
* @param ii input info
* @param e1 first expression
* @param e2 second expression
* @param c calculation operator
*/
public Arith(final InputInfo ii, final Expr e1, final Expr e2, final Calc c) {
super(ii, e1, e2);
calc = c;
}
@Override
public Expr comp(final QueryContext ctx) throws QueryException {
super.comp(ctx);
final SeqType s0 = expr[0].type();
final SeqType s1 = expr[1].type();
type = s0.isNum() && s1.isNum() ? SeqType.ITR :
s0.one() && s1.one() ? SeqType.ITEM : SeqType.ITEM_ZO;
return optPre(oneIsEmpty() ? null : allAreValues() ?
item(ctx, input) : this, ctx);
}
@Override
public Item item(final QueryContext ctx, final InputInfo ii)
throws QueryException {
final Item a = expr[0].item(ctx, input);
if(a == null) return null;
final Item b = expr[1].item(ctx, input);
if(b == null) return null;
return calc.ev(input, a, b);
}
@Override
public void plan(final Serializer ser) throws IOException {
ser.openElement(this, OP, Token.token(calc.name));
for(final Expr e : expr) e.plan(ser);
ser.closeElement();
}
@Override
public String description() {
return '\'' + calc.name + "' expression";
}
@Override
public String toString() {
return toString(' ' + calc.name + ' ');
}
}