有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数据库java操作符是如何工作的?

因此,我试图在simpleDB数据库中实现加法运算符。我已经完成了大部分,但我不知道如何添加这两个部分。这将用于数据库的查询,我希望能够添加左侧和右侧。什么java方法可以用来实现这一点?因为在simpleDB中没有加法运算符

这就是我实施<;接线员

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

就像现在我有

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

我有左手边和右手边 因此,当查询看到+号时,它将把em加在一起并返回答案。但我不知道怎么做。当我实现小于运算符时,我使用comprateTo方法,当我实现相等运算符时,我使用相等方法。我不知道加法运算符可以使用什么。顺便说一句,这是使用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();
}

共 (2) 个答案

  1. # 1 楼答案

    我认为,最好检查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");
        }
    }
    
  2. # 2 楼答案

    由于类型常量实现了Comparable,因此实现了一个关系运算符,如A低于B

    如果您想要实现一个关系运算符,比如a+B,那么类型常量必须实现一个类型,比如Addable?我想是的,必须这样

        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);    
        }
    

    您必须决定add运算符的工作方式(连接、求和,取决于常量子类型,…)

    问题更新后编辑

    一个简单的实现是使用方法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());
        }