⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expressionarithmetic.java

📁 java 数据库 功能强大 效率高 SmallSQL Database is a free DBMS library for the Java(tm) platform. It runs on
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
    
    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 + -