package org.basex.query.item; import static org.basex.query.util.Err.*; import java.math.BigDecimal; import org.basex.query.QueryException; import org.basex.query.expr.Expr; import org.basex.util.InputInfo; import org.basex.util.Token; import org.basex.util.TokenBuilder; /** * Boolean item. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class Bln extends Item { /** Static boolean item without scoring. */ public static final Bln TRUE = new Bln(true); /** Static boolean item without scoring. */ public static final Bln FALSE = new Bln(false); /** Data. */ private final boolean val; /** * Constructor, adding a full-text score. * @param b boolean value */ private Bln(final boolean b) { super(AtomType.BLN); val = b; } /** * Constructor, adding a full-text score. * @param b boolean value * @param s score value */ private Bln(final boolean b, final double s) { this(b); score = s; } /** * Constructor, adding a full-text score. * @param s score value * @return item */ public static Bln get(final double s) { return s == 0 ? FALSE : new Bln(true, s); } /** * Returns a static item instance. * @param b boolean value * @return item */ public static Bln get(final boolean b) { return b ? TRUE : FALSE; } @Override public byte[] string(final InputInfo ii) { return Token.token(val); } /** * Returns the string value. * @return string value */ public byte[] string() { return Token.token(val); } @Override public boolean bool(final InputInfo ii) { return val; } @Override public long itr(final InputInfo ii) { return val ? 1 : 0; } @Override public float flt(final InputInfo ii) { return val ? 1 : 0; } @Override public double dbl(final InputInfo ii) { return val ? 1 : 0; } @Override public BigDecimal dec(final InputInfo ii) { return val ? BigDecimal.ONE : BigDecimal.ZERO; } @Override public boolean eq(final InputInfo ii, final Item it) throws QueryException { return val == (it.type == type ? it.bool(ii) : parse(it.string(ii), ii)); } @Override public int diff(final InputInfo ii, final Item it) throws QueryException { final boolean n = it.type == type ? it.bool(ii) : parse(it.string(ii), ii); return val ? !n ? 1 : 0 : n ? -1 : 0; } @Override public Boolean toJava() { return val; } @Override public boolean sameAs(final Expr cmp) { return cmp instanceof Bln && val == ((Bln) cmp).val; } /** * Converts the specified string to a boolean. * @param str string to be checked * @param ii input info * @return result of check * @throws QueryException query exception */ public static boolean parse(final byte[] str, final InputInfo ii) throws QueryException { final byte[] s = Token.trim(str); if(Token.eq(s, Token.TRUE) || Token.eq(s, Token.ONE)) return true; if(Token.eq(s, Token.FALSE) || Token.eq(s, Token.ZERO)) return false; throw FUNCAST.thrw(ii, AtomType.BLN, str); } @Override public String toString() { return new TokenBuilder(val ? Token.TRUE : Token.FALSE). add("()").toString(); } }