2016-05-30 69 views
0

所以即时尝试在我的simpleDB数据库中实现加法运算符。我做了大部分工作,但我不知道如何添加2个部分。所以这将用于查询数据库,我想能够添加左侧和右侧。什么java方法可以用来做到这一点?因为在simpleDB中没有添加运算符。Java运算符是如何工作的?

这是我是如何实现的<运营商像现在我有

Constant lhsval = lhs.evaluate(s); 
     Constant rhsval = rhs.evaluate(s); 
    if (operator.equals("+")) { 
      // return ; 
      } 

我有左侧和右侧 所以当查询看到的+号

if (operator.equals("<") && lhsval.compareTo(rhsval) < 0) { 
     return true; 
     } 

,它会添加并返回答案。但我不知道如何。当我实现了少于运算符时,我使用了comprateTo方法,并且当我使用等于运算符时使用了equals方法。我不知道我可以用加法operator.btw这是用java

不断类

package simpledb.query; 

/** 
* The interface that denotes values stored in the database. 
* @author Edward Sciore 
*/ 
public interface Constant extends Comparable<Constant> { 

    /** 
    * Returns the Java object corresponding to this constant. 
    * @return the Java value of the constant 
    */ 
    public Object asJavaVal(); 
} 
+0

不是很清楚,你想串联,将被发送到一个数据库中获取记录查询的各个组成部分? –

+0

你有没有试过'lhsval.concat(rhsval)' – Billydan

+0

无法使用concat,它没有实现。多数民众赞成什么使这个硬大声笑 – henryzo

回答

1

关系运算,例如比B下已经实现,因为类型常量工具相媲美。

如果你想实现一个关系运算符,如A + B,则常数的类型必须实现这样的类型可添加?我想是的,它必须。

Constant lhsval = lhs.evaluate(s); 
    Constant rhsval = rhs.evaluate(s); 
    if (operator.equals("+")) { 
     return lhsval.add(rhsval); 
    } 

可添加接口具有本合同:

interface Addable extends RelationalOperator { 
     Constant add(Constant lhs, Constant rhs);  
    } 

你必须决定附加运营商如何有工作(连击,总之,依赖于恒亚型,...)

关于问题更新后编辑

一个简单的实现是使用方法Object asJavaVal();如下:

Constant lhsval = lhs.evaluate(s); 
    Constant rhsval = rhs.evaluate(s); 
    if (operator.equals("+")) { 
     Object lhsObj = lhs.asJavaVal(); 
     Object rhsObj = lhs.asJavaVal(); 
     // here check for null and same type of lhs, rhs 
     ... 
     // now use typed implementation of + 
     if (lhsObj instanceof BigDecimal) 
      return new ConstantImpl(lhsval.add(rhsval)); 
     else if (lhsObj instanceof String) 
      return new ConstantImpl(lhsval + rhsval); 
     else if (lhsObj instanceof ...) 
      return new ConstantImpl(...); 
     else 
      throw new IllegalArgumentException("Not a valid type for + :"+ lhsObj.getClass()); 
    } 
+0

是的,这东西我有点难以遵循,除非我把你链接到有SimpleDB软件包的站点,所以你可以在eclipse上运行它并查看所有代码。但我怀疑任何人都想这样做,大声笑。感谢帮助 。生病看看你说什么可以帮助我 – henryzo

+0

@henryzo我不保证我可以看到所有的代码,但如果你想链接完整的实现simpleDB我会看看它。 – Aris2World

+0

http://csns.calstatela.edu/wiki/content/cysun/course_materials/cs422/simpledb你应该看看解析代码和术语代码 – henryzo

0

我认为,这是更好地检查lhsvalrhsval类型。之后,你可以通过asJavaVal获取已知类型的值:

Constant lhsval = lhs.evaluate(s); 
Constant rhsval = rhs.evaluate(s); 
Constant res = null; 
if (operator.equals("+")) { 
    if (lhsval instanceof IntConstant) { 
     int sum = (Integer) lhsval.asJavaVal() + (Integer) rhsval.asJavaVal(); 
     res = new IntConstant(sum); 
    } else if (lhsval instanceof StringConstant) { 
     String sum = ((String) lhsval.asJavaVal()).concat((String) rhsval.asJavaVal()); 
     res = new StringConstant(sum); 
    } else { 
     throw new IllegalArgumentException("Unknown constant type"); 
    } 
}