📄 expressionarithmetic.java
字号:
long getMoney() throws java.lang.Exception {
if(isNull()) return 0;
int dataType = getDataType();
switch(dataType){
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
return getBoolean() ? 10000 : 0;
case SQLTokenizer.TINYINT:
case SQLTokenizer.SMALLINT:
case SQLTokenizer.INT:
return getIntImpl() * 10000;
case SQLTokenizer.BIGINT:
return getLongImpl() * 10000;
case SQLTokenizer.REAL:
return Utils.doubleToMoney( getFloatImpl() );
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return Utils.doubleToMoney( getDoubleImpl() );
case SQLTokenizer.MONEY:
case SQLTokenizer.SMALLMONEY:
return getMoneyImpl();
}
throw createUnspportedConversion( SQLTokenizer.DOUBLE);
}
private long getMoneyImpl() throws java.lang.Exception {
switch(operation){
case ADD: return left.getMoney() + right.getMoney();
case SUB: return left.getMoney() - right.getMoney();
case MUL: return left.getMoney() * right.getMoney() / 10000;
case DIV: return left.getMoney() * 10000 / right.getMoney();
case NEGATIVE: return - left.getMoney();
}
throw createUnspportedConversion( SQLTokenizer.MONEY );
}
MutableNumeric getNumeric() throws java.lang.Exception {
if(isNull()) return null;
int dataType = getDataType();
switch(dataType){
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
return new MutableNumeric(getBoolean() ? 1 : 0);
case SQLTokenizer.TINYINT:
case SQLTokenizer.SMALLINT:
case SQLTokenizer.INT:
return new MutableNumeric(getIntImpl());
case SQLTokenizer.BIGINT:
return new MutableNumeric(getLongImpl());
case SQLTokenizer.REAL:
return new MutableNumeric(getFloatImpl());
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
return new MutableNumeric( getDoubleImpl() );
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return getNumericImpl();
case SQLTokenizer.MONEY:
case SQLTokenizer.SMALLMONEY:
return new MutableNumeric(getMoneyImpl(),4);
}
throw createUnspportedConversion( SQLTokenizer.DOUBLE);
}
private MutableNumeric getNumericImpl() throws java.lang.Exception {
switch(operation){
case ADD:
{
MutableNumeric num = left.getNumeric();
num.add( right.getNumeric() );
return num;
}
case SUB:
{
MutableNumeric num = left.getNumeric();
num.sub( right.getNumeric() );
return num;
}
case MUL:
if(getDataType(right.getDataType(), SQLTokenizer.INT) == SQLTokenizer.INT){
MutableNumeric num = left.getNumeric();
num.mul(right.getInt());
return num;
}else
if(getDataType(left.getDataType(), SQLTokenizer.INT) == SQLTokenizer.INT){
MutableNumeric num = right.getNumeric();
num.mul(left.getInt());
return num;
}else{
MutableNumeric num = left.getNumeric();
num.mul( right.getNumeric() );
return num;
}
case DIV:
{
MutableNumeric num = left.getNumeric();
if(getDataType(right.getDataType(), SQLTokenizer.INT) == SQLTokenizer.INT)
num.div( right.getInt() );
else
num.div( right.getNumeric() );
return num;
}
case NEGATIVE:
{
MutableNumeric num = left.getNumeric();
num.setSignum(-num.getSignum());
return num;
}
case MOD:
{
if(getDataType(getDataType(), SQLTokenizer.INT) == SQLTokenizer.INT)
return new MutableNumeric(getInt());
MutableNumeric num = left.getNumeric();
num.mod( right.getNumeric() );
return num;
}
default: throw createUnspportedConversion( SQLTokenizer.NUMERIC );
}
}
Object getObject() throws java.lang.Exception {
if(isNull()) return null;
int dataType = getDataType();
switch(dataType){
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
return getBoolean() ? Boolean.TRUE : Boolean.FALSE;
case SQLTokenizer.BINARY:
case SQLTokenizer.VARBINARY:
return getBytes();
case SQLTokenizer.TINYINT:
case SQLTokenizer.SMALLINT:
case SQLTokenizer.INT:
return new Integer( getInt() );
case SQLTokenizer.BIGINT:
return new Long( getLong() );
case SQLTokenizer.REAL:
return new Float( getFloat() );
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
return new Double( getDouble() );
case SQLTokenizer.MONEY:
case SQLTokenizer.SMALLMONEY:
return Money.createFromUnscaledValue( getMoney() );
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return getNumeric();
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
return getString( left.getString(), right.getString() );
case SQLTokenizer.JAVA_OBJECT:
Object lObj = left.getObject();
//FIXME NullPointerException bei NEGATIVE
Object rObj = right.getObject();
if(lObj instanceof Number && rObj instanceof Number)
return new Double( getDoubleImpl( ((Number)lObj).doubleValue(), ((Number)rObj).doubleValue() ) );
else
return getString( lObj.toString(), rObj.toString() );
case SQLTokenizer.LONGVARBINARY:
return getBytes();
case SQLTokenizer.DATE:
case SQLTokenizer.TIME:
case SQLTokenizer.TIMESTAMP:
case SQLTokenizer.SMALLDATETIME:
return new DateTime( getLong(), dataType );
case SQLTokenizer.UNIQUEIDENTIFIER:
return getBytes();
default: throw createUnspportedDataType();
}
}
boolean getBoolean() throws java.lang.Exception {
switch(operation){
case OR: return left.getBoolean() || right.getBoolean();
case AND: return left.getBoolean() && right.getBoolean();
case NOT: return !left.getBoolean();
case LIKE: return Utils.like( left.getString(), right.getString());
case ISNULL:return left.isNull();
case ISNOTNULL: return !left.isNull();
case IN: if(right == null)
return isInList();
break;
}
final boolean leftIsNull = left.isNull();
int dataType;
if(operation == NEGATIVE || operation == BIT_NOT){
if(leftIsNull) return false;
dataType = left.getDataType();
}else{
final boolean rightIsNull = right.isNull();
if(operation == EQUALS_NULL && leftIsNull && rightIsNull) return true;
if(leftIsNull || rightIsNull) return false;
dataType = getDataType(left, right);
}
switch(dataType){
case SQLTokenizer.BOOLEAN:
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return left.getBoolean() == right.getBoolean();
case UNEQUALS: return left.getBoolean() != right.getBoolean();
}
//break; interpret it as BIT
case SQLTokenizer.TINYINT:
case SQLTokenizer.SMALLINT:
case SQLTokenizer.INT:
case SQLTokenizer.BIT:
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return left.getInt() == right.getInt();
case GREATER: return left.getInt() > right.getInt();
case GRE_EQU: return left.getInt() >= right.getInt();
case LESSER: return left.getInt() < right.getInt();
case LES_EQU: return left.getInt() <= right.getInt();
case UNEQUALS: return left.getInt() != right.getInt();
case BETWEEN:
int _left = left.getInt();
return _left >= right.getInt() && right2.getInt() >= _left;
default:
return getInt() != 0;
}
case SQLTokenizer.BIGINT:
case SQLTokenizer.TIMESTAMP:
case SQLTokenizer.TIME:
case SQLTokenizer.DATE:
case SQLTokenizer.SMALLDATETIME:
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return left.getLong() == right.getLong();
case GREATER: return left.getLong() > right.getLong();
case GRE_EQU: return left.getLong() >= right.getLong();
case LESSER: return left.getLong() < right.getLong();
case LES_EQU: return left.getLong() <= right.getLong();
case UNEQUALS: return left.getLong() != right.getLong();
case BETWEEN:
long _left = left.getLong();
return _left >= right.getLong() && right2.getLong() >= _left;
default:
return getLong() != 0;
}
case SQLTokenizer.REAL:
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return left.getFloat() == right.getFloat();
case GREATER: return left.getFloat() > right.getFloat();
case GRE_EQU: return left.getFloat() >= right.getFloat();
case LESSER: return left.getFloat() < right.getFloat();
case LES_EQU: return left.getFloat() <= right.getFloat();
case UNEQUALS: return left.getFloat() != right.getFloat();
case BETWEEN:
float _left = left.getFloat();
return _left >= right.getFloat() && right2.getFloat() >= _left;
default:
return getFloat() != 0;
}
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return left.getDouble() == right.getDouble();
case GREATER: return left.getDouble() > right.getDouble();
case GRE_EQU: return left.getDouble() >= right.getDouble();
case LESSER: return left.getDouble() < right.getDouble();
case LES_EQU: return left.getDouble() <= right.getDouble();
case UNEQUALS: return left.getDouble() != right.getDouble();
case BETWEEN:
double _left = left.getDouble();
return _left >= right.getDouble() && right2.getDouble() >= _left;
default:
return getDouble() != 0;
}
case SQLTokenizer.MONEY:
case SQLTokenizer.SMALLMONEY:
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return left.getMoney() == right.getMoney();
case GREATER: return left.getMoney() > right.getMoney();
case GRE_EQU: return left.getMoney() >= right.getMoney();
case LESSER: return left.getMoney() < right.getMoney();
case LES_EQU: return left.getMoney() <= right.getMoney();
case UNEQUALS: return left.getMoney() != right.getMoney();
case BETWEEN:
long _left = left.getMoney();
return _left >= right.getMoney() && right2.getMoney() >= _left;
default:
return getMoney() != 0;
}
case SQLTokenizer.DECIMAL:
case SQLTokenizer.NUMERIC:{
if(operation == NEGATIVE)
return left.getNumeric().getSignum() != 0;
int comp = left.getNumeric().compareTo( right.getNumeric() );
switch(operation){
case IN:
case EQUALS_NULL:
case EQUALS: return comp == 0;
case GREATER: return comp > 0;
case GRE_EQU: return comp >= 0;
case LESSER: return comp < 0;
case LES_EQU: return comp <= 0;
case UNEQUALS: return comp != 0;
case BETWEEN:
return comp >= 0 && 0 >= left.getNumeric().compareTo( right2.getNumeric() );
default:
return getNumeric().getSignum() != 0;
}
}
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.LONGVARCHAR:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.CLOB:{
final String leftStr = left.getString();
final String rightStr = right.getString();
int comp = String.CASE_INSENSITIVE_ORDER.compare( leftStr, rightStr );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -