You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/10/25 20:18:16 UTC

[27/28] TAJO-1125: Separate logical plan and optimizer into a maven module.

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java
index 9e45e7d..611d815 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java
@@ -19,12 +19,12 @@
 package org.apache.tajo.engine.codegen;
 
 import com.google.common.base.Preconditions;
-import org.apache.tajo.engine.eval.BinaryEval;
-import org.apache.tajo.engine.eval.CaseWhenEval;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.eval.EvalType;
 import org.apache.tajo.org.objectweb.asm.Label;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
+import org.apache.tajo.plan.expr.BinaryEval;
+import org.apache.tajo.plan.expr.CaseWhenEval;
+import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.expr.EvalType;
 
 import java.util.List;
 import java.util.Stack;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java
index 6f928ac..c63ccde 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java
@@ -19,8 +19,8 @@
 package org.apache.tajo.engine.codegen;
 
 import com.google.common.collect.Maps;
-import org.apache.tajo.engine.eval.EvalNode;
 import org.apache.tajo.org.objectweb.asm.Label;
+import org.apache.tajo.plan.expr.EvalNode;
 
 import java.util.NavigableMap;
 import java.util.Stack;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java
index 27054de..db6f51f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java
@@ -18,7 +18,7 @@
 
 package org.apache.tajo.engine.codegen;
 
-import org.apache.tajo.engine.eval.EvalNode;
+import org.apache.tajo.plan.expr.EvalNode;
 
 public class CompilationError extends RuntimeException {
   public CompilationError(String message) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java
index d94c907..8067519 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java
@@ -18,7 +18,7 @@
 
 package org.apache.tajo.engine.codegen;
 
-import org.apache.tajo.engine.eval.EvalNode;
+import org.apache.tajo.plan.expr.EvalNode;
 
 import java.util.Stack;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java
index 03c0402..8384de7 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java
@@ -23,11 +23,11 @@ import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.IntervalDatum;
-import org.apache.tajo.engine.eval.*;
 import org.apache.tajo.org.objectweb.asm.ClassWriter;
 import org.apache.tajo.org.objectweb.asm.MethodVisitor;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
 import org.apache.tajo.org.objectweb.asm.commons.GeneratorAdapter;
+import org.apache.tajo.plan.expr.*;
 import org.apache.tajo.storage.Tuple;
 
 import java.util.Map;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenerator.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenerator.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenerator.java
index 147b149..69252c4 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenerator.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenerator.java
@@ -24,12 +24,12 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.IntervalDatum;
 import org.apache.tajo.datum.ProtobufDatum;
-import org.apache.tajo.engine.eval.*;
 import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.org.objectweb.asm.ClassWriter;
 import org.apache.tajo.org.objectweb.asm.Label;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
 import org.apache.tajo.org.objectweb.asm.Type;
+import org.apache.tajo.plan.expr.*;
 import org.apache.tajo.storage.Tuple;
 
 import java.io.PrintStream;
@@ -38,7 +38,7 @@ import java.util.Stack;
 
 import static org.apache.tajo.common.TajoDataTypes.DataType;
 import static org.apache.tajo.engine.codegen.TajoGeneratorAdapter.getDescription;
-import static org.apache.tajo.engine.eval.FunctionEval.ParamType;
+import static org.apache.tajo.plan.expr.FunctionEval.ParamType;
 
 public class EvalCodeGenerator extends SimpleEvalNodeVisitor<EvalCodeGenContext> {
 
@@ -701,7 +701,7 @@ public class EvalCodeGenerator extends SimpleEvalNodeVisitor<EvalCodeGenContext>
     return constEval;
   }
 
-  public static ParamType [] getParamTypes(EvalNode [] arguments) {
+  public static ParamType[] getParamTypes(EvalNode [] arguments) {
     ParamType[] paramTypes = new ParamType[arguments.length];
     for (int i = 0; i < arguments.length; i++) {
       if (arguments[i].getType() == EvalType.CONST) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java
index 54d857b..d588e7f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java
@@ -22,9 +22,13 @@ import com.google.common.collect.Maps;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.planner.*;
-import org.apache.tajo.engine.planner.logical.*;
+import org.apache.tajo.plan.LogicalPlan;
+import org.apache.tajo.plan.util.PlannerUtil;
+import org.apache.tajo.plan.PlanningException;
+import org.apache.tajo.plan.Target;
+import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.logical.*;
+import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor;
 import org.apache.tajo.util.Pair;
 
 import java.util.Collections;
@@ -87,7 +91,7 @@ public class ExecutorPreCompiler extends BasicLogicalPlanVisitor<ExecutorPreComp
   }
 
   private static void compileProjectableNode(CompilationContext context, Schema schema, Projectable node) {
-    Target [] targets;
+    Target[] targets;
     if (node.hasTargets()) {
       targets = node.getTargets();
     } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/LegacyFunctionBindingEmitter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/LegacyFunctionBindingEmitter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/LegacyFunctionBindingEmitter.java
index 944a01c..36dfe4f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/LegacyFunctionBindingEmitter.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/LegacyFunctionBindingEmitter.java
@@ -20,9 +20,9 @@ package org.apache.tajo.engine.codegen;
 
 import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
+import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.expr.FunctionEval;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ScalarFunctionBindingEmitter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ScalarFunctionBindingEmitter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ScalarFunctionBindingEmitter.java
index 350aee1..b33a7c4 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ScalarFunctionBindingEmitter.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ScalarFunctionBindingEmitter.java
@@ -20,12 +20,12 @@ package org.apache.tajo.engine.codegen;
 
 import com.google.common.base.Preconditions;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.function.FunctionUtil;
 import org.apache.tajo.function.StaticMethodInvocationDesc;
 import org.apache.tajo.org.objectweb.asm.Label;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
+import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.expr.FunctionEval;
 
 import java.util.Stack;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/TajoGeneratorAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/TajoGeneratorAdapter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/TajoGeneratorAdapter.java
index 57dc904..9cc1dc3 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/TajoGeneratorAdapter.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/TajoGeneratorAdapter.java
@@ -22,18 +22,18 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.*;
-import org.apache.tajo.engine.eval.EvalNode;
-import org.apache.tajo.engine.eval.EvalType;
 import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.exception.UnsupportedException;
-import org.apache.tajo.util.TUtil;
-import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.org.objectweb.asm.Label;
 import org.apache.tajo.org.objectweb.asm.MethodVisitor;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
 import org.apache.tajo.org.objectweb.asm.Type;
 import org.apache.tajo.org.objectweb.asm.commons.GeneratorAdapter;
 import org.apache.tajo.org.objectweb.asm.commons.TableSwitchGenerator;
+import org.apache.tajo.plan.expr.EvalNode;
+import org.apache.tajo.plan.expr.EvalType;
+import org.apache.tajo.util.TUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
 
 import java.util.HashMap;
 import java.util.Map;

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/codegen/VariablesPreBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/VariablesPreBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/VariablesPreBuilder.java
index c81f242..a055b04 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/VariablesPreBuilder.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/VariablesPreBuilder.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.codegen;
 
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.IntervalDatum;
-import org.apache.tajo.engine.eval.*;
 import org.apache.tajo.org.objectweb.asm.Opcodes;
+import org.apache.tajo.plan.expr.*;
 
 import java.util.Stack;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java
deleted file mode 100644
index 3216519..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/AggregationFunctionCallEval.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.FunctionDesc;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
-import org.apache.tajo.storage.Tuple;
-import org.apache.tajo.storage.VTuple;
-
-public class AggregationFunctionCallEval extends FunctionEval implements Cloneable {
-  @Expose protected AggFunction instance;
-  @Expose boolean intermediatePhase = false;
-  @Expose boolean finalPhase = true;
-  @Expose String alias;
-
-  private Tuple params;
-
-  protected AggregationFunctionCallEval(EvalType type, FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs) {
-    super(type, desc, givenArgs);
-    this.instance = instance;
-  }
-
-  public AggregationFunctionCallEval(FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs) {
-    super(EvalType.AGG_FUNCTION, desc, givenArgs);
-    this.instance = instance;
-  }
-
-  public FunctionContext newContext() {
-    return instance.newContext();
-  }
-
-  public void merge(FunctionContext context, Schema schema, Tuple tuple) {
-    if (params == null) {
-      this.params = new VTuple(argEvals.length);
-    }
-
-    if (argEvals != null) {
-      for (int i = 0; i < argEvals.length; i++) {
-        params.put(i, argEvals[i].eval(schema, tuple));
-      }
-    }
-
-    if (!intermediatePhase && !finalPhase) {
-      // firstPhase
-      instance.eval(context, params);
-    } else {
-      instance.merge(context, params);
-    }
-  }
-
-  @Override
-  public Datum eval(Schema schema, Tuple tuple) {
-    throw new UnsupportedOperationException("Cannot execute eval() of aggregation function");
-  }
-
-  public Datum terminate(FunctionContext context) {
-    if (!finalPhase) {
-      return instance.getPartialResult(context);
-    } else {
-      return instance.terminate(context);
-    }
-  }
-
-  @Override
-  public DataType getValueType() {
-    if (!finalPhase) {
-      return instance.getPartialResultType();
-    } else {
-      return funcDesc.getReturnType();
-    }
-  }
-
-  public void setAlias(String alias) { this.alias = alias; }
-
-  public String getAlias() { return  this.alias; }
-
-  public Object clone() throws CloneNotSupportedException {
-    AggregationFunctionCallEval clone = (AggregationFunctionCallEval)super.clone();
-
-    clone.finalPhase = finalPhase;
-    clone.intermediatePhase = intermediatePhase;
-    clone.alias = alias;
-    clone.instance = (AggFunction)instance.clone();
-
-    return clone;
-  }
-
-  public void setFirstPhase() {
-    this.finalPhase = false;
-    this.intermediatePhase = false;
-  }
-
-  public void setFinalPhase() {
-    this.finalPhase = true;
-    this.intermediatePhase = false;
-  }
-
-  public void setIntermediatePhase() {
-    this.finalPhase = false;
-    this.intermediatePhase = true;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicException.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicException.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicException.java
deleted file mode 100644
index 9dba6df..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * 
- */
-package org.apache.tajo.engine.eval;
-
-public class AlgebraicException extends RuntimeException {
-  private static final long serialVersionUID = -1813125460274622006L;
-  
-  public AlgebraicException() {
-  }
-
-  public AlgebraicException(String message) {
-    super(message);
-  }
-
-  public AlgebraicException(Throwable cause) {
-    super(cause);
-  }
-
-  public AlgebraicException(String message, Throwable cause) {
-    super(message, cause);
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
deleted file mode 100644
index 0b4ba19..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import org.apache.tajo.catalog.Column;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-public class AlgebraicUtil {
-  
-  /**
-   * Transpose a given comparison expression into the expression 
-   * where the variable corresponding to the target is placed 
-   * on the left-hand side.
-   * 
-   * @param evalNode
-   * @param target
-   * @return Transposed expression
-   */
-  public static EvalNode transpose(EvalNode evalNode, Column target) {
-    BinaryEval commutated;
-
-    if (evalNode instanceof BinaryEval) { // if it is binary
-      BinaryEval binaryEval = (BinaryEval) evalNode;
-      // If the variable is in the right term, inverse the expr.
-      if (!EvalTreeUtil.containColumnRef(binaryEval.getLeftExpr(), target)) {
-        // the commutate method works with a copy of the expr
-        commutated = commutate(binaryEval);
-      } else {
-        try {
-          commutated = (BinaryEval) evalNode.clone();
-        } catch (CloneNotSupportedException e) {
-          throw new AlgebraicException(e);
-        }
-      }
-
-      return _transpose(commutated, target);
-    } else {
-      return evalNode;
-    }
-  }
-  
-  private static EvalNode _transpose(BinaryEval _expr, Column target) {
-     EvalNode expr = eliminateConstantExprs(_expr);
-
-    if (expr instanceof BinaryEval) { // only if expr is a binary operator
-      BinaryEval binaryEval = (BinaryEval) expr;
-      if (isSingleVar(binaryEval.getLeftExpr())) {
-        return expr;
-      }
-
-      EvalNode left = binaryEval.getLeftExpr();
-      EvalNode lTerm = null;
-      EvalNode rTerm = null;
-
-      if (EvalType.isArithmeticOperator(left.getType())) { // we can ensure that left is binary.
-
-        // If the left-left term is a variable, the left-right term is transposed.
-        if (EvalTreeUtil.containColumnRef(((BinaryEval)left).getLeftExpr(), target)) {
-          PartialBinaryExpr tmpTerm = splitRightTerm((BinaryEval) left);
-          tmpTerm.type = inverseOperator(tmpTerm.type);
-          tmpTerm.setLeftExpr(((BinaryEval)expr).getRightExpr());
-          lTerm = ((BinaryEval)left).getLeftExpr();
-          rTerm = new BinaryEval(tmpTerm);
-        } else {
-          // Otherwise, the left-right term is transposed into the left-left term.
-          PartialBinaryExpr tmpTerm = splitLeftTerm((BinaryEval) left);
-          tmpTerm.type = inverseOperator(tmpTerm.type);
-          tmpTerm.setLeftExpr(((BinaryEval)expr).getRightExpr());
-          lTerm = ((BinaryEval)left).getRightExpr();
-          rTerm = new BinaryEval(tmpTerm);
-        }
-      }
-
-      return _transpose(new BinaryEval(expr.getType(), lTerm, rTerm), target);
-    } else {
-      return _expr;
-    }
-  }
-  
-  /**
-   * Inverse a given operator (+, -, *, /)
-   * 
-   * @param type
-   * @return inversed operator type
-   */
-  public static EvalType inverseOperator(EvalType type) {
-    switch (type) {
-    case PLUS:
-      return EvalType.MINUS;
-    case MINUS:
-      return EvalType.PLUS;
-    case MULTIPLY:
-      return EvalType.DIVIDE;
-    case DIVIDE:
-      return EvalType.MULTIPLY;
-    default : throw new AlgebraicException("ERROR: cannot inverse the operator: " 
-      + type);
-    }
-  }
-  
-  /**
-   * Examine if a given expr is a variable.
-   * 
-   * @param node
-   * @return true if a given expr is a variable.
-   */
-  private static boolean isSingleVar(EvalNode node) {
-    if (node.getType() == EvalType.FIELD) {
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  private static class AlgebraicOptimizer extends SimpleEvalNodeVisitor<Object> {
-
-    @Override
-    public EvalNode visitBinaryEval(Object context, Stack<EvalNode> stack, BinaryEval binaryEval) {
-      stack.push(binaryEval);
-      EvalNode lhs = visit(context, binaryEval.getLeftExpr(), stack);
-      EvalNode rhs = visit(context, binaryEval.getRightExpr(), stack);
-      stack.pop();
-
-      if (!binaryEval.getLeftExpr().equals(lhs)) {
-        binaryEval.setLeftExpr(lhs);
-      }
-      if (!binaryEval.getRightExpr().equals(rhs)) {
-        binaryEval.setRightExpr(rhs);
-      }
-
-      if (lhs.getType() == EvalType.CONST && rhs.getType() == EvalType.CONST) {
-        return new ConstEval(binaryEval.eval(null, null));
-      }
-
-      return binaryEval;
-    }
-
-    @Override
-    public EvalNode visitUnaryEval(Object context, Stack<EvalNode> stack, UnaryEval unaryEval) {
-      stack.push(unaryEval);
-      EvalNode child = visit(context, unaryEval.getChild(), stack);
-      stack.pop();
-
-      if (child.getType() == EvalType.CONST) {
-        return new ConstEval(unaryEval.eval(null, null));
-      }
-
-      return unaryEval;
-    }
-
-    @Override
-    public EvalNode visitFuncCall(Object context, FunctionEval evalNode, Stack<EvalNode> stack) {
-      boolean constantOfAllDescendents = true;
-
-      if ("sleep".equals(evalNode.funcDesc.getFunctionName())) {
-        constantOfAllDescendents = false;
-      } else {
-        if (evalNode.getArgs() != null) {
-          for (EvalNode arg : evalNode.getArgs()) {
-            arg = visit(context, arg, stack);
-            constantOfAllDescendents &= (arg.getType() == EvalType.CONST);
-          }
-        }
-      }
-
-      if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) {
-        return new ConstEval(evalNode.eval(null, null));
-      } else {
-        return evalNode;
-      }
-    }
-  }
-
-  private final static AlgebraicOptimizer algebraicOptimizer = new AlgebraicOptimizer();
-  
-  /**
-   * Simplify the given expr. That is, all subexprs consisting of only constants
-   * are calculated immediately.
-   * 
-   * @param expr to be simplified
-   * @return the simplified expr
-   */
-  public static EvalNode eliminateConstantExprs(EvalNode expr) {
-    return algebraicOptimizer.visit(null, expr, new Stack<EvalNode>());
-  }
-  
-  /** 
-   * @param expr to be evaluated if the expr includes one variable
-   * @return true if expr has only one field
-   */
-  public static boolean containSingleVar(EvalNode expr) {
-    Map<EvalType, Integer> counter = EvalTreeUtil.getExprCounters(expr);
-    
-    int sum = 0;
-    for (Integer cnt : counter.values()) {      
-      sum += cnt;
-    }
-    
-    if (sum == 1 && counter.get(EvalType.FIELD) == 1) {
-      return true;
-    } else {
-      return false;
-    }
-  }
-  
-  /**
-   * Split the left term and transform it into the right deep expression.
-   * 
-   * @param binary - notice the left term of this expr will be eliminated
-   * after done.
-   * @return the separated expression changed into the right deep expression.  
-   * For example, the expr 'x * y' is transformed into '* x'.  
-   *
-   */
-  public static PartialBinaryExpr splitLeftTerm(BinaryEval binary) {
-    
-    if (!(EvalType.isArithmeticOperator(binary.getType()))) {
-      throw new AlgebraicException("Invalid algebraic operation: " + binary);
-    }
-    
-    if (binary.getLeftExpr() instanceof BinaryEval) {
-      return splitLeftTerm((BinaryEval) binary.getLeftExpr());
-    }
-    
-    PartialBinaryExpr splitted = 
-        new PartialBinaryExpr(binary.getType(), null, binary.getLeftExpr());
-    binary.setLeftExpr(null);
-    return splitted;
-  }
-  
-  /**
-   * Split the left term and transform it into the right deep expression.
-   * 
-   * @param binary - to be splited
-   * @return the separated expression changed into the right deep expression.
-   * For example, the expr 'x * y' is transformed into '* y'. 
-   *
-   * @throws CloneNotSupportedException
-   */
-  public static PartialBinaryExpr splitRightTerm(BinaryEval binary) {
-    
-    if (!(EvalType.isArithmeticOperator(binary.getType()))) {
-      throw new AlgebraicException("Invalid algebraic operation: " + binary);
-    }
-    
-    if (binary.getRightExpr() instanceof BinaryEval) {
-      return splitRightTerm((BinaryEval) binary.getRightExpr());
-    }
-    
-    PartialBinaryExpr splitted = 
-        new PartialBinaryExpr(binary.getType(), null, binary.getRightExpr());
-    binary.setRightExpr(null);
-    return splitted;
-  }
-  
-  /**
-   * Commutate two terms which are added, subtracted and multiplied.
-   * 
-   * @param inputExpr
-   * @return
-   */
-  public static BinaryEval commutate(BinaryEval inputExpr) {
-    BinaryEval rewritten;
-    switch (inputExpr.getType()) {
-    case AND:
-    case OR:
-    case EQUAL:
-    case PLUS:
-    case MINUS:
-    case MULTIPLY: // these types can be commutated w/o any change
-      rewritten = EvalTreeFactory.create(inputExpr.getType(),
-          inputExpr.getRightExpr(), inputExpr.getLeftExpr());
-      break;
-      
-    case GTH:
-      rewritten = EvalTreeFactory.create(EvalType.LTH,
-          inputExpr.getRightExpr(), inputExpr.getLeftExpr());
-      break;
-    case GEQ:
-      rewritten = EvalTreeFactory.create(EvalType.LEQ,
-          inputExpr.getRightExpr(), inputExpr.getLeftExpr());
-      break;
-    case LTH:
-      rewritten = EvalTreeFactory.create(EvalType.GTH,
-          inputExpr.getRightExpr(), inputExpr.getLeftExpr());
-      break;
-    case LEQ:
-      rewritten = EvalTreeFactory.create(EvalType.GEQ,
-          inputExpr.getRightExpr(), inputExpr.getLeftExpr());
-      break;
-      
-    default :
-      throw new AlgebraicException("Cannot commutate the expr: " + inputExpr);
-    }
-    
-    return rewritten;
-  }
-
-  public static boolean isIndexableOperator(EvalNode expr) {
-    return expr.getType() == EvalType.EQUAL ||
-        expr.getType() == EvalType.LEQ ||
-        expr.getType() == EvalType.LTH ||
-        expr.getType() == EvalType.GEQ ||
-        expr.getType() == EvalType.GTH ||
-        expr.getType() == EvalType.BETWEEN ||
-        expr.getType() == EvalType.IN ||
-        (expr.getType() == EvalType.LIKE && !((LikePredicateEval)expr).isLeadingWildCard());
-  }
-
-  /**
-   * Convert a list of conjunctive normal forms into a singleton expression.
-   *
-   * @param cnfExprs
-   * @return The EvalNode object that merges all CNF-formed expressions.
-   */
-  public static EvalNode createSingletonExprFromCNF(EvalNode... cnfExprs) {
-    if (cnfExprs.length == 1) {
-      return cnfExprs[0];
-    }
-
-    return createSingletonExprFromCNFRecursive(cnfExprs, 0);
-  }
-
-  private static EvalNode createSingletonExprFromCNFRecursive(EvalNode[] evalNode, int idx) {
-    if (idx == evalNode.length - 2) {
-      return new BinaryEval(EvalType.AND, evalNode[idx], evalNode[idx + 1]);
-    } else {
-      return new BinaryEval(EvalType.AND, evalNode[idx], createSingletonExprFromCNFRecursive(evalNode, idx + 1));
-    }
-  }
-
-  /**
-   * Transforms a expression to an array of conjunctive normal formed expressions.
-   *
-   * @param expr The expression to be transformed to an array of CNF-formed expressions.
-   * @return An array of CNF-formed expressions
-   */
-  public static EvalNode [] toConjunctiveNormalFormArray(EvalNode expr) {
-    List<EvalNode> list = new ArrayList<EvalNode>();
-    toConjunctiveNormalFormArrayRecursive(expr, list);
-    return list.toArray(new EvalNode[list.size()]);
-  }
-
-  private static void toConjunctiveNormalFormArrayRecursive(EvalNode node, List<EvalNode> found) {
-    if (node.getType() == EvalType.AND) {
-      toConjunctiveNormalFormArrayRecursive(((BinaryEval)node).getLeftExpr(), found);
-      toConjunctiveNormalFormArrayRecursive(((BinaryEval)node).getRightExpr(), found);
-    } else {
-      found.add(node);
-    }
-  }
-
-  /**
-   * Convert a list of conjunctive normal forms into a singleton expression.
-   *
-   * @param cnfExprs
-   * @return The EvalNode object that merges all CNF-formed expressions.
-   */
-  public static EvalNode createSingletonExprFromDNF(EvalNode... cnfExprs) {
-    if (cnfExprs.length == 1) {
-      return cnfExprs[0];
-    }
-
-    return createSingletonExprFromDNFRecursive(cnfExprs, 0);
-  }
-
-  private static EvalNode createSingletonExprFromDNFRecursive(EvalNode[] evalNode, int idx) {
-    if (idx == evalNode.length - 2) {
-      return new BinaryEval(EvalType.OR, evalNode[idx], evalNode[idx + 1]);
-    } else {
-      return new BinaryEval(EvalType.OR, evalNode[idx], createSingletonExprFromDNFRecursive(evalNode, idx + 1));
-    }
-  }
-
-  /**
-   * Transforms a expression to an array of disjunctive normal formed expressions.
-   *
-   * @param exprs The expressions to be transformed to an array of CNF-formed expressions.
-   * @return An array of CNF-formed expressions
-   */
-  public static EvalNode [] toDisjunctiveNormalFormArray(EvalNode...exprs) {
-    List<EvalNode> list = new ArrayList<EvalNode>();
-    for (EvalNode expr : exprs) {
-      toDisjunctiveNormalFormArrayRecursive(expr, list);
-    }
-    return list.toArray(new EvalNode[list.size()]);
-  }
-
-  private static void toDisjunctiveNormalFormArrayRecursive(EvalNode node, List<EvalNode> found) {
-    if (node.getType() == EvalType.OR) {
-      toDisjunctiveNormalFormArrayRecursive(((BinaryEval)node).getLeftExpr(), found);
-      toDisjunctiveNormalFormArrayRecursive(((BinaryEval)node).getRightExpr(), found);
-    } else {
-      found.add(node);
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
deleted file mode 100644
index 3b94cc9..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/BasicEvalNodeVisitor.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import org.apache.tajo.exception.UnsupportedException;
-
-import java.util.Stack;
-
-public class BasicEvalNodeVisitor<CONTEXT, RESULT> implements EvalNodeVisitor2<CONTEXT, RESULT> {
-
-  @Override
-  public RESULT visitChild(CONTEXT context, EvalNode evalNode, Stack<EvalNode> stack) {
-    RESULT result;
-    switch (evalNode.getType()) {
-      // Column and Value reference expressions
-      case CONST:
-        result = visitConst(context, (ConstEval) evalNode, stack);
-        break;
-      case ROW_CONSTANT:
-        result = visitRowConstant(context, (RowConstantEval) evalNode, stack);
-        break;
-      case FIELD:
-        result = visitField(context, stack, (FieldEval) evalNode);
-        break;
-
-      // Arithmetic expression
-      case PLUS:
-        result = visitPlus(context, (BinaryEval) evalNode, stack);
-        break;
-      case MINUS:
-        result = visitMinus(context, (BinaryEval) evalNode, stack);
-        break;
-      case MULTIPLY:
-        result = visitMultiply(context, (BinaryEval) evalNode, stack);
-        break;
-      case DIVIDE:
-        result = visitDivide(context, (BinaryEval) evalNode, stack);
-        break;
-      case MODULAR:
-        result = visitModular(context, (BinaryEval) evalNode, stack);
-        break;
-
-      // Logical Predicates
-      case AND:
-        result = visitAnd(context, (BinaryEval) evalNode, stack);
-        break;
-      case OR:
-        result = visitOr(context, (BinaryEval) evalNode, stack);
-        break;
-      case NOT:
-        result = visitNot(context, (NotEval) evalNode, stack);
-        break;
-
-      // Comparison Predicates
-      case EQUAL:
-        result = visitEqual(context, (BinaryEval) evalNode, stack);
-        break;
-      case NOT_EQUAL:
-        result = visitNotEqual(context, (BinaryEval) evalNode, stack);
-        break;
-      case LTH:
-        result = visitLessThan(context, (BinaryEval) evalNode, stack);
-        break;
-      case LEQ:
-        result = visitLessThanOrEqual(context, (BinaryEval) evalNode, stack);
-        break;
-      case GTH:
-        result = visitGreaterThan(context, (BinaryEval) evalNode, stack);
-        break;
-      case GEQ:
-        result = visitGreaterThanOrEqual(context, (BinaryEval) evalNode, stack);
-        break;
-
-      // SQL standard predicates
-      case IS_NULL:
-        result = visitIsNull(context, (IsNullEval) evalNode, stack);
-        break;
-      case BETWEEN:
-        result = visitBetween(context, (BetweenPredicateEval) evalNode, stack);
-        break;
-      case CASE:
-        result = visitCaseWhen(context, (CaseWhenEval) evalNode, stack);
-        break;
-      case IF_THEN:
-        result = visitIfThen(context, (CaseWhenEval.IfThenEval) evalNode, stack);
-        break;
-      case IN:
-        result = visitInPredicate(context, (InEval) evalNode, stack);
-        break;
-
-      // String operators and Pattern match predicates
-      case LIKE:
-        result = visitLike(context, (LikePredicateEval) evalNode, stack);
-        break;
-      case SIMILAR_TO:
-        result = visitSimilarTo(context, (SimilarToPredicateEval) evalNode, stack);
-        break;
-      case REGEX:
-        result = visitRegex(context, (RegexPredicateEval) evalNode, stack);
-        break;
-      case CONCATENATE:
-        result = visitConcatenate(context, (BinaryEval) evalNode, stack);
-        break;
-
-      // Functions
-      case FUNCTION:
-        result = visitFuncCall(context, (GeneralFunctionEval) evalNode, stack);
-        break;
-      case AGG_FUNCTION:
-        result = visitAggrFuncCall(context, (AggregationFunctionCallEval) evalNode, stack);
-        break;
-      case WINDOW_FUNCTION:
-        result = visitWindowFunc(context, (WindowFunctionEval) evalNode, stack);
-      break;
-
-      case SIGNED:
-        result = visitSigned(context, (SignedEval) evalNode, stack);
-        break;
-      case CAST:
-        result = visitCast(context, (CastEval) evalNode, stack);
-        break;
-
-      default:
-        throw new UnsupportedException("Unknown EvalType: " + evalNode);
-    }
-
-    return result;
-  }
-
-  private RESULT visitDefaultUnaryEval(CONTEXT context, UnaryEval unaryEval, Stack<EvalNode> stack) {
-    stack.push(unaryEval);
-    RESULT result = visitChild(context, unaryEval.getChild(), stack);
-    stack.pop();
-    return result;
-  }
-
-  private RESULT visitDefaultBinaryEval(CONTEXT context, BinaryEval binaryEval, Stack<EvalNode> stack) {
-    stack.push(binaryEval);
-    RESULT result = visitChild(context, binaryEval.getLeftExpr(), stack);
-    visitChild(context, binaryEval.getRightExpr(), stack);
-    stack.pop();
-    return result;
-  }
-
-  private RESULT visitDefaultFunctionEval(CONTEXT context, FunctionEval functionEval, Stack<EvalNode> stack) {
-    RESULT result = null;
-    stack.push(functionEval);
-    if (functionEval.getArgs() != null) {
-      for (EvalNode arg : functionEval.getArgs()) {
-        result = visitChild(context, arg, stack);
-      }
-    }
-    stack.pop();
-    return result;
-  }
-
-  @Override
-  public RESULT visitConst(CONTEXT context, ConstEval evalNode, Stack<EvalNode> stack) {
-    return null;
-  }
-
-  @Override
-  public RESULT visitRowConstant(CONTEXT context, RowConstantEval evalNode, Stack<EvalNode> stack) {
-    return null;
-  }
-
-  @Override
-  public RESULT visitField(CONTEXT context, Stack<EvalNode> stack, FieldEval evalNode) {
-    return null;
-  }
-
-  @Override
-  public RESULT visitPlus(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitMinus(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitMultiply(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitDivide(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitModular(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitAnd(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitOr(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitNot(CONTEXT context, NotEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultUnaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitNotEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitLessThan(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitLessThanOrEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitGreaterThan(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitGreaterThanOrEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitIsNull(CONTEXT context, IsNullEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultUnaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitBetween(CONTEXT context, BetweenPredicateEval evalNode, Stack<EvalNode> stack) {
-    stack.push(evalNode);
-    RESULT result = visitChild(context, evalNode.getPredicand(), stack);
-    visitChild(context, evalNode.getBegin(), stack);
-    visitChild(context, evalNode.getEnd(), stack);
-    return result;
-  }
-
-  @Override
-  public RESULT visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) {
-    RESULT result = null;
-    stack.push(evalNode);
-    for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) {
-      result = visitIfThen(context, ifThenEval, stack);
-    }
-    if (evalNode.hasElse()) {
-      result = visitChild(context, evalNode.getElse(), stack);
-    }
-    stack.pop();
-    return result;
-  }
-
-  @Override
-  public RESULT visitIfThen(CONTEXT context, CaseWhenEval.IfThenEval evalNode, Stack<EvalNode> stack) {
-    RESULT result;
-    stack.push(evalNode);
-    result = visitChild(context, evalNode.getCondition(), stack);
-    visitChild(context, evalNode.getResult(), stack);
-    stack.pop();
-    return result;
-  }
-
-  @Override
-  public RESULT visitInPredicate(CONTEXT context, InEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitLike(CONTEXT context, LikePredicateEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitSimilarTo(CONTEXT context, SimilarToPredicateEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitRegex(CONTEXT context, RegexPredicateEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitConcatenate(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultBinaryEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitFuncCall(CONTEXT context, GeneralFunctionEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultFunctionEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitAggrFuncCall(CONTEXT context, AggregationFunctionCallEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultFunctionEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitWindowFunc(CONTEXT context, WindowFunctionEval evalNode, Stack<EvalNode> stack) {
-    return visitDefaultFunctionEval(context, evalNode, stack);
-  }
-
-  @Override
-  public RESULT visitSigned(CONTEXT context, SignedEval signedEval, Stack<EvalNode> stack) {
-    return visitDefaultUnaryEval(context, signedEval, stack);
-  }
-
-  @Override
-  public RESULT visitCast(CONTEXT context, CastEval castEval, Stack<EvalNode> stack) {
-    return visitDefaultUnaryEval(context, castEval, stack);
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/BetweenPredicateEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/BetweenPredicateEval.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/BetweenPredicateEval.java
deleted file mode 100644
index 07f9a6f..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/BetweenPredicateEval.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.storage.Tuple;
-
-public class BetweenPredicateEval extends EvalNode implements Cloneable {
-  private static final TajoDataTypes.DataType RES_TYPE = CatalogUtil.newSimpleDataType(TajoDataTypes.Type.BOOLEAN);
-  @Expose private boolean not;
-  @Expose private boolean symmetric;
-  @Expose private EvalNode predicand;
-  @Expose private EvalNode begin;
-  @Expose private EvalNode end;
-
-  private Checker checker;
-
-  public BetweenPredicateEval(boolean not, boolean symmetric, EvalNode predicand, EvalNode begin, EvalNode end) {
-    super(EvalType.BETWEEN);
-    this.not = not;
-    this.symmetric = symmetric;
-    this.predicand = predicand;
-    this.begin = begin;
-    this.end = end;
-  }
-
-  public boolean isNot() {
-    return not;
-  }
-
-  public boolean isSymmetric() {
-    return symmetric;
-  }
-
-  public void setPredicand(EvalNode predicand) {
-    this.predicand = predicand;
-  }
-
-  public EvalNode getPredicand() {
-    return predicand;
-  }
-
-  public void setBegin(EvalNode begin) {
-    this.begin = begin;
-  }
-
-  public EvalNode getBegin() {
-    return begin;
-  }
-
-  public void setEnd(EvalNode end) {
-    this.end = end;
-  }
-
-  public EvalNode getEnd() {
-    return end;
-  }
-
-  private static interface Checker {
-    Datum eval(Schema schema, Tuple param);
-  }
-
-  private static class ConstantChecker implements Checker {
-    EvalNode predicand;
-    Datum begin;
-    Datum end;
-    private boolean not;
-
-    private ConstantChecker(boolean not, EvalNode predicand, Datum begin, Datum end) {
-      this.predicand = predicand;
-      this.not = not;
-      if (begin.compareTo(end) > 0) {
-        this.begin = end;
-        this.end = begin;
-      } else {
-        this.begin = begin;
-        this.end = end;
-      }
-    }
-
-    @Override
-    public Datum eval(Schema schema, Tuple param) {
-      Datum predicandValue = predicand.eval(schema, param);
-
-      if (!predicandValue.isNull()) {
-        return DatumFactory.createBool(not ^ (predicandValue.greaterThanEqual(begin).asBool()
-                && predicandValue.lessThanEqual(end).asBool()));
-      } else {
-        return NullDatum.get();
-      }
-    }
-  }
-
-  private static class AsymmetricChecker implements Checker {
-    EvalNode predicand;
-    EvalNode begin;
-    EvalNode end;
-    private boolean not;
-
-    private AsymmetricChecker(boolean not, EvalNode predicand, EvalNode begin, EvalNode end) {
-      this.not = not;
-      this.predicand = predicand;
-      this.begin = begin;
-      this.end = end;
-    }
-
-    @Override
-    public Datum eval(Schema schema, Tuple param) {
-      Datum predicandValue = predicand.eval(schema, param);
-      Datum beginValue = begin.eval(schema, param);
-      Datum endValue = end.eval(schema, param);
-
-      if (!(predicandValue.isNull() || beginValue.isNull() || endValue.isNull())) {
-        return
-            DatumFactory.createBool(not ^ (predicandValue.greaterThanEqual(beginValue).asBool()
-                && predicandValue.lessThanEqual(endValue).asBool()));
-      } else {
-        return NullDatum.get();
-      }
-    }
-  }
-
-  private static class SymmetricChecker implements Checker {
-    boolean not;
-    EvalNode predicand;
-    EvalNode begin;
-    EvalNode end;
-
-    SymmetricChecker(boolean not, EvalNode predicand, EvalNode begin, EvalNode end) {
-      this.not = not;
-      this.predicand = predicand;
-      this.begin = begin;
-      this.end = end;
-    }
-
-    @Override
-    public Datum eval(Schema schema, Tuple param) {
-      Datum predicandValue = predicand.eval(schema, param);
-      Datum beginValue = begin.eval(schema, param);
-      Datum endValue = end.eval(schema, param);
-
-      if (!(predicandValue.isNull()|| beginValue.isNull() || endValue.isNull())) {
-        return DatumFactory.createBool( not ^
-            (predicandValue.greaterThanEqual(beginValue).asBool() && predicandValue.lessThanEqual(endValue).asBool()) ||
-            (predicandValue.lessThanEqual(beginValue).asBool() && predicandValue.greaterThanEqual(endValue).asBool())
-        );
-      } else {
-        return NullDatum.get();
-      }
-    }
-  }
-
-  @Override
-  public TajoDataTypes.DataType getValueType() {
-    return RES_TYPE;
-  }
-
-  @Override
-  public int childNum() {
-    return 3;
-  }
-
-  @Override
-  public EvalNode getChild(int idx) {
-    if (idx == 0) {
-      return predicand;
-    } else if (idx == 1) {
-      return begin;
-    } else if (idx == 2) {
-      return end;
-    } else {
-      throw new ArrayIndexOutOfBoundsException(idx);
-    }
-  }
-
-  @Override
-  public String getName() {
-    return "between";
-  }
-
-  @Override
-  public String toString() {
-    return predicand + " BETWEEN " + (symmetric ? "SYMMETRIC" : "ASYMMETRIC") + " " + begin + " AND " + end;
-  }
-
-  @Override
-  public Datum eval(Schema schema, Tuple tuple) {
-    if (checker == null) {
-      if (begin.getType() == EvalType.CONST && end.getType() == EvalType.CONST) {
-        Datum beginValue = ((ConstEval)begin).getValue();
-        Datum endValue = ((ConstEval)end).getValue();
-
-        if (symmetric || beginValue.compareTo(endValue) <= 0) {
-          checker = new ConstantChecker(not, predicand, beginValue, endValue);
-        } else {
-          checker = new AsymmetricChecker(not, predicand, begin, end);
-        }
-      } else {
-        if (symmetric) {
-          checker = new SymmetricChecker(not, predicand, begin, end);
-        } else {
-          checker = new AsymmetricChecker(not, predicand, begin, end);
-        }
-      }
-    }
-
-    return checker.eval(schema, tuple);
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof BetweenPredicateEval) {
-      BetweenPredicateEval another = (BetweenPredicateEval) obj;
-      return not == another.not && symmetric == another.symmetric && predicand.equals(another.predicand) &&
-          begin.equals(another.begin) && end.equals(another.end);
-    }
-    return false;
-  }
-
-  @Deprecated
-  public void preOrder(EvalNodeVisitor visitor) {
-    visitor.visit(this);
-    predicand.preOrder(visitor);
-    begin.preOrder(visitor);
-    end.preOrder(visitor);
-  }
-
-  @Deprecated
-  public void postOrder(EvalNodeVisitor visitor) {
-    predicand.postOrder(visitor);
-    begin.postOrder(visitor);
-    end.postOrder(visitor);
-    visitor.visit(this);
-  }
-
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    BetweenPredicateEval newBetween = (BetweenPredicateEval) super.clone();
-    newBetween.not = not;
-    newBetween.symmetric = symmetric;
-    newBetween.predicand = predicand;
-    newBetween.begin = begin;
-    newBetween.end = end;
-    return newBetween;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
deleted file mode 100644
index 85a0d7c..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/BinaryEval.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.common.base.Objects;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.DataTypeUtil;
-import org.apache.tajo.exception.InvalidOperationException;
-import org.apache.tajo.storage.Tuple;
-
-import static org.apache.tajo.common.TajoDataTypes.Type;
-
-public class BinaryEval extends EvalNode implements Cloneable {
-  @Expose protected EvalNode leftExpr;
-  @Expose protected EvalNode rightExpr;
-  @Expose protected DataType returnType;
-
-  protected BinaryEval(EvalType type) {
-    super(type);
-  }
-
-  public BinaryEval(EvalType type, EvalNode left, EvalNode right) {
-    super(type);
-    this.leftExpr = left;
-    this.rightExpr = right;
-
-    if(
-        type == EvalType.AND ||
-            type == EvalType.OR ||
-            type == EvalType.EQUAL ||
-            type == EvalType.NOT_EQUAL ||
-            type == EvalType.LTH ||
-            type == EvalType.GTH ||
-            type == EvalType.LEQ ||
-            type == EvalType.GEQ ) {
-      this.returnType = CatalogUtil.newSimpleDataType(Type.BOOLEAN);
-    } else if (
-        type == EvalType.PLUS ||
-            type == EvalType.MINUS ||
-            type == EvalType.MULTIPLY ||
-            type == EvalType.DIVIDE ||
-            type == EvalType.MODULAR ) {
-      this.returnType = DataTypeUtil.determineType(left.getValueType(), right.getValueType());
-
-    } else if (type == EvalType.CONCATENATE) {
-      this.returnType = CatalogUtil.newSimpleDataType(Type.TEXT);
-    }
-  }
-
-  public BinaryEval(PartialBinaryExpr expr) {
-    this(expr.type, expr.leftExpr, expr.rightExpr);
-  }
-
-  public void setLeftExpr(EvalNode expr) {
-    this.leftExpr = expr;
-  }
-
-  public <T extends EvalNode> T getLeftExpr() {
-    return (T) this.leftExpr;
-  }
-
-  public void setRightExpr(EvalNode expr) {
-    this.rightExpr = expr;
-  }
-
-  public <T extends EvalNode> T getRightExpr() {
-    return (T) this.rightExpr;
-  }
-
-  @Override
-  public int childNum() {
-    return 2;
-  }
-
-  @Override
-  public EvalNode getChild(int id) {
-    if (id == 0) {
-      return this.leftExpr;
-    } else if (id == 1) {
-      return this.rightExpr;
-    } else {
-      throw new ArrayIndexOutOfBoundsException("only 0 or 1 is available, but (" + id + ") is not available)");
-    }
-  }
-
-  public void setChild(int id, EvalNode child) {
-    if (id == 0) {
-      this.leftExpr = child;
-    } else if (id == 1) {
-      this.rightExpr = child;
-    } else {
-      throw new ArrayIndexOutOfBoundsException("only 0 or 1 is available, but (" + id + ") is not available)");
-    }
-  }
-
-  @Override
-  public Datum eval(Schema schema, Tuple tuple) {
-    Datum lhs = leftExpr.eval(schema, tuple);
-    Datum rhs = rightExpr.eval(schema, tuple);
-
-    switch(type) {
-    case AND:
-      return lhs.and(rhs);
-    case OR:
-      return lhs.or(rhs);
-
-    case EQUAL:
-      return lhs.equalsTo(rhs);
-    case NOT_EQUAL:
-      return lhs.notEqualsTo(rhs);
-    case LTH:
-      return lhs.lessThan(rhs);
-    case LEQ:
-      return lhs.lessThanEqual(rhs);
-    case GTH:
-      return lhs.greaterThan(rhs);
-    case GEQ:
-      return lhs.greaterThanEqual(rhs);
-
-    case PLUS:
-      return lhs.plus(rhs);
-    case MINUS:
-      return lhs.minus(rhs);
-    case MULTIPLY:
-      return lhs.multiply(rhs);
-    case DIVIDE:
-      return lhs.divide(rhs);
-    case MODULAR:
-      return lhs.modular(rhs);
-
-    case CONCATENATE:
-      if (lhs.type() == Type.NULL_TYPE || rhs.type() == Type.NULL_TYPE) {
-        return NullDatum.get();
-      }
-      return DatumFactory.createText(lhs.asChars() + rhs.asChars());
-    default:
-      throw new InvalidOperationException("Unknown binary operation: " + type);
-    }
-  }
-
-  @Override
-	public String getName() {
-		return type.name();
-	}
-
-	@Override
-	public DataType getValueType() {
-	  return returnType;
-	}
-
-  @Deprecated
-  public void preOrder(EvalNodeVisitor visitor) {
-    visitor.visit(this);
-    leftExpr.preOrder(visitor);
-    rightExpr.preOrder(visitor);
-  }
-
-  @Deprecated
-  public void postOrder(EvalNodeVisitor visitor) {
-    leftExpr.postOrder(visitor);
-    rightExpr.postOrder(visitor);
-    visitor.visit(this);
-  }
-
-	public String toString() {
-		return leftExpr +" " + type.getOperatorName() + " "+ rightExpr;
-	}
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof BinaryEval) {
-      BinaryEval other = (BinaryEval) obj;
-
-      boolean b1 = this.type == other.type;
-      boolean b2 = leftExpr.equals(other.leftExpr);
-      boolean b3 = rightExpr.equals(other.rightExpr);
-      return b1 && b2 && b3;
-    }
-    return false;
-  }
-
-  public int hashCode() {
-    return Objects.hashCode(this.type, leftExpr, rightExpr);
-  }
-
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    BinaryEval node = (BinaryEval) super.clone();
-    node.type = type;
-    node.leftExpr = leftExpr != null ? (EvalNode) leftExpr.clone() : null;
-    node.rightExpr = rightExpr != null ? (EvalNode) rightExpr.clone() : null;
-
-    return node;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
deleted file mode 100644
index 3eb3a69..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/CaseWhenEval.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.common.collect.Lists;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.engine.json.CoreGsonHelper;
-import org.apache.tajo.json.GsonObject;
-import org.apache.tajo.storage.Tuple;
-import org.apache.tajo.util.TUtil;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CaseWhenEval extends EvalNode implements GsonObject {
-  @Expose private List<IfThenEval> whens = Lists.newArrayList();
-  @Expose private EvalNode elseResult;
-
-  public CaseWhenEval() {
-    super(EvalType.CASE);
-  }
-
-  public void addIfCond(IfThenEval ifCond) {
-    whens.add(ifCond);
-  }
-
-  public void addIfCond(EvalNode condition, EvalNode result) {
-    whens.add(new IfThenEval(condition, result));
-  }
-
-  public List<IfThenEval> getIfThenEvals() {
-    return whens;
-  }
-
-  public boolean hasElse() {
-    return this.elseResult != null;
-  }
-
-  public EvalNode getElse() {
-    return elseResult;
-  }
-
-  public void setElseResult(EvalNode elseResult) {
-    this.elseResult = elseResult;
-  }
-
-  @Override
-  public DataType getValueType() {
-    // Find not null type
-    for (IfThenEval eachWhen: whens) {
-      if (eachWhen.getResult().getValueType().getType() != Type.NULL_TYPE) {
-        return eachWhen.getResult().getValueType();
-      }
-    }
-
-    if (elseResult != null) { // without else clause
-      return elseResult.getValueType();
-    }
-
-    return NullDatum.getDataType();
-  }
-
-  @Override
-  public int childNum() {
-    return whens.size() + (elseResult != null ? 1 : 0);
-  }
-
-  @Override
-  public EvalNode getChild(int idx) {
-    if (idx < whens.size()) {
-      return whens.get(idx);
-    } else if (idx == whens.size()) {
-      return elseResult;
-    } else {
-      throw new ArrayIndexOutOfBoundsException(idx);
-    }
-  }
-
-  @Override
-  public String getName() {
-    return "?";
-  }
-
-  public Datum eval(Schema schema, Tuple tuple) {
-    for (int i = 0; i < whens.size(); i++) {
-      if (whens.get(i).checkIfCondition(schema, tuple)) {
-        return whens.get(i).eval(schema, tuple);
-      }
-    }
-
-    if (elseResult != null) { // without else clause
-      return elseResult.eval(schema, tuple);
-    }
-
-    return NullDatum.get();
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder("CASE ");
-    for (IfThenEval when : whens) {
-     sb.append(when).append(" ");
-    }
-
-    sb.append("ELSE ").append(elseResult).append(" END");
-
-    return sb.toString();
-  }
-
-  @Override
-  public void preOrder(EvalNodeVisitor visitor) {
-    visitor.visit(this);
-    for (IfThenEval when : whens) {
-      when.preOrder(visitor);
-    }
-    if (elseResult != null) { // without else clause
-      elseResult.preOrder(visitor);
-    }
-  }
-
-  @Override
-  public void postOrder(EvalNodeVisitor visitor) {
-    for (IfThenEval when : whens) {
-      when.postOrder(visitor);
-    }
-    if (elseResult != null) { // without else clause
-      elseResult.postOrder(visitor);
-    }
-    visitor.visit(this);
-  }
-
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    CaseWhenEval caseWhenEval = (CaseWhenEval) super.clone();
-    caseWhenEval.whens = new ArrayList<IfThenEval>();
-    for (IfThenEval ifThenEval : whens) {
-      caseWhenEval.whens.add((IfThenEval) ifThenEval.clone());
-    }
-    caseWhenEval.elseResult = elseResult;
-    return caseWhenEval;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof CaseWhenEval) {
-      CaseWhenEval other = (CaseWhenEval) obj;
-
-      for (int i = 0; i < other.whens.size(); i++) {
-        if (!whens.get(i).equals(other.whens.get(i))) {
-          return false;
-        }
-      }
-      return TUtil.checkEquals(elseResult, other.elseResult);
-    } else {
-      return false;
-    }
-  }
-
-  public static class IfThenEval extends EvalNode implements GsonObject {
-    @Expose private EvalNode condition;
-    @Expose private EvalNode result;
-
-    public IfThenEval(EvalNode condition, EvalNode result) {
-      super(EvalType.IF_THEN);
-      this.condition = condition;
-      this.result = result;
-    }
-
-    @Override
-    public DataType getValueType() {
-      return CatalogUtil.newSimpleDataType(TajoDataTypes.Type.BOOLEAN);
-    }
-
-    @Override
-    public int childNum() {
-      return 2;
-    }
-
-    @Override
-    public EvalNode getChild(int idx) {
-      if (idx == 0) {
-        return condition;
-      } else if (idx == 1) {
-        return result;
-      } else {
-        throw new ArrayIndexOutOfBoundsException(idx);
-      }
-    }
-
-    @Override
-    public String getName() {
-      return "when?";
-    }
-
-    public boolean checkIfCondition(Schema schema, Tuple tuple) {
-      return condition.eval(schema, tuple).isTrue();
-    }
-
-    public Datum eval(Schema schema, Tuple tuple) {
-      return result.eval(schema, tuple);
-    }
-
-    public void setCondition(EvalNode condition) {
-      this.condition = condition;
-    }
-
-    public EvalNode getCondition() {
-      return this.condition;
-    }
-
-    public void setResult(EvalNode result) {
-      this.result = result;
-    }
-
-    public EvalNode getResult() {
-      return this.result;
-    }
-
-    @Override
-    public boolean equals(Object object) {
-      if (object instanceof IfThenEval) {
-        IfThenEval other = (IfThenEval) object;
-        return condition.equals(other.condition) && result.equals(other.result);
-      } else {
-        return false;
-      }
-    }
-
-    @Override
-    public String toString() {
-      return "WHEN " + condition + " THEN " + result;
-    }
-
-    @Override
-    public String toJson() {
-      return CoreGsonHelper.toJson(IfThenEval.this, IfThenEval.class);
-    }
-
-    @Override
-    public void preOrder(EvalNodeVisitor visitor) {
-      visitor.visit(this);
-      condition.preOrder(visitor);
-      result.preOrder(visitor);
-    }
-
-    @Override
-    public void postOrder(EvalNodeVisitor visitor) {
-      condition.postOrder(visitor);
-      result.postOrder(visitor);
-      visitor.visit(this);
-    }
-
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-      IfThenEval ifThenEval = (IfThenEval) super.clone();
-      ifThenEval.condition = (EvalNode)condition.clone();
-      ifThenEval.result = (EvalNode)result.clone();
-      return ifThenEval;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/CastEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/CastEval.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/CastEval.java
deleted file mode 100644
index d996385..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/CastEval.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.storage.Tuple;
-
-import static org.apache.tajo.common.TajoDataTypes.DataType;
-
-public class CastEval extends UnaryEval {
-  @Expose private DataType target;
-
-  public CastEval(EvalNode operand, DataType target) {
-    super(EvalType.CAST, operand);
-    this.target = target;
-  }
-
-  public EvalNode getOperand() {
-    return child;
-  }
-
-  @Override
-  public DataType getValueType() {
-    return target;
-  }
-
-  @Override
-  public String getName() {
-    return target.getType().name();
-  }
-
-  public Datum eval(Schema schema, Tuple tuple) {
-    Datum operandDatum = child.eval(schema, tuple);
-    if (operandDatum.isNull()) {
-      return operandDatum;
-    }
-
-    return DatumFactory.cast(operandDatum, target);
-  }
-
-  public String toString() {
-    return "CAST (" + child + " AS " + target.getType() + ")";
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    boolean valid = obj != null && obj instanceof CastEval;
-    if (valid) {
-      CastEval another = (CastEval) obj;
-      return child.equals(another.child) && target.equals(another.target);
-    } else {
-      return false;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/ConstEval.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
deleted file mode 100644
index 323a4e9..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/ConstEval.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.common.base.Objects;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.storage.Tuple;
-
-public class ConstEval extends EvalNode implements Comparable<ConstEval>, Cloneable {
-	@Expose Datum datum = null;
-	
-	public ConstEval(Datum datum) {
-		super(EvalType.CONST);
-		this.datum = datum;
-	}
-
-  public Datum getValue() {
-    return this.datum;
-  }
-	
-	public String toString() {
-		return datum.toString();
-	}
-
-  @Override
-  public Datum eval(Schema schema, Tuple tuple) {
-    return datum;
-  }
-
-  @Override
-	public DataType getValueType() {
-    return CatalogUtil.newSimpleDataType(datum.type());
-	}
-
-  @Override
-  public int childNum() {
-    return 0;
-  }
-
-  @Override
-  public EvalNode getChild(int idx) {
-    return null;
-  }
-
-  @Override
-	public String getName() {
-		return this.datum.toString();
-	}
-	
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof ConstEval) {
-      ConstEval other = (ConstEval) obj;
-
-      if (this.type == other.type && this.datum.equals(other.datum)) {
-        return true;
-      }
-    }
-    return false;
-  }
-  
-  @Override
-  public int hashCode() {
-    return Objects.hashCode(type, datum.type(), datum);
-  }
-  
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    ConstEval eval = (ConstEval) super.clone();
-    eval.datum = datum;
-    
-    return eval;
-  }
-
-  @Override
-  public int compareTo(ConstEval other) {    
-    return datum.compareTo(other.datum);
-  }
-  
-  @Override
-  public void preOrder(EvalNodeVisitor visitor) {
-    visitor.visit(this);
-  }
-  
-  @Override
-  public void postOrder(EvalNodeVisitor visitor) {
-    visitor.visit(this);
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNode.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
deleted file mode 100644
index 754f888..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNode.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.engine.json.CoreGsonHelper;
-import org.apache.tajo.json.GsonObject;
-import org.apache.tajo.storage.Tuple;
-
-/**
- * An annotated expression which includes actual data domains.
- * It is also used for evaluation.
- */
-public abstract class EvalNode implements Cloneable, GsonObject {
-	@Expose protected EvalType type;
-
-  public EvalNode() {
-  }
-
-	public EvalNode(EvalType type) {
-		this.type = type;
-	}
-	
-	public EvalType getType() {
-		return this.type;
-	}
-	
-	public abstract DataType getValueType();
-
-  public abstract int childNum();
-
-  public abstract EvalNode getChild(int idx);
-	
-	public abstract String getName();
-
-  @Override
-	public String toJson() {
-    return CoreGsonHelper.toJson(this, EvalNode.class);
-	}
-	
-	public abstract <T extends Datum> T eval(Schema schema, Tuple tuple);
-
-  @Deprecated
-  public abstract  void preOrder(EvalNodeVisitor visitor);
-
-  @Deprecated
-  public abstract void postOrder(EvalNodeVisitor visitor);
-
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    EvalNode evalNode = (EvalNode) super.clone();
-    evalNode.type = type;
-    return evalNode;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor.java
deleted file mode 100644
index 1680b31..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-@Deprecated
-public interface EvalNodeVisitor {
-  public void visit(EvalNode node);
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
deleted file mode 100644
index e85984e..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalNodeVisitor2.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import java.util.Stack;
-
-public interface EvalNodeVisitor2<CONTEXT, RESULT> {
-  RESULT visitChild(CONTEXT context, EvalNode evalNode, Stack<EvalNode> stack);
-
-  // Column and Value reference expressions
-  RESULT visitConst(CONTEXT context, ConstEval evalNode, Stack<EvalNode> stack);
-  RESULT visitRowConstant(CONTEXT context, RowConstantEval evalNode, Stack<EvalNode> stack);
-  RESULT visitField(CONTEXT context, Stack<EvalNode> stack, FieldEval evalNode);
-
-  // Arithmetic expression
-  RESULT visitPlus(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitMinus(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitMultiply(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitDivide(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitModular(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-
-  // Logical Predicates
-  RESULT visitAnd(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitOr(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitNot(CONTEXT context, NotEval evalNode, Stack<EvalNode> stack);
-
-  // Comparison Predicates
-  RESULT visitEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitNotEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitLessThan(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitLessThanOrEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitGreaterThan(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-  RESULT visitGreaterThanOrEqual(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-
-  // Other Predicates
-  RESULT visitIsNull(CONTEXT context, IsNullEval evalNode, Stack<EvalNode> stack);
-  RESULT visitBetween(CONTEXT context, BetweenPredicateEval evalNode, Stack<EvalNode> stack);
-  RESULT visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack);
-  RESULT visitIfThen(CONTEXT context, CaseWhenEval.IfThenEval evalNode, Stack<EvalNode> stack);
-  RESULT visitInPredicate(CONTEXT context, InEval evalNode, Stack<EvalNode> stack);
-
-  // String operator and Pattern matching predicates
-  RESULT visitLike(CONTEXT context, LikePredicateEval evalNode, Stack<EvalNode> stack);
-  RESULT visitSimilarTo(CONTEXT context, SimilarToPredicateEval evalNode, Stack<EvalNode> stack);
-  RESULT visitRegex(CONTEXT context, RegexPredicateEval evalNode, Stack<EvalNode> stack);
-  RESULT visitConcatenate(CONTEXT context, BinaryEval evalNode, Stack<EvalNode> stack);
-
-  // Functions
-  RESULT visitFuncCall(CONTEXT context, GeneralFunctionEval evalNode, Stack<EvalNode> stack);
-  RESULT visitAggrFuncCall(CONTEXT context, AggregationFunctionCallEval evalNode, Stack<EvalNode> stack);
-  RESULT visitWindowFunc(CONTEXT context, WindowFunctionEval evalNode, Stack<EvalNode> stack);
-
-  RESULT visitSigned(CONTEXT context, SignedEval signedEval, Stack<EvalNode> stack);
-
-  RESULT visitCast(CONTEXT context, CastEval signedEval, Stack<EvalNode> stack);
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/b143f991/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
deleted file mode 100644
index aa72f25..0000000
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeFactory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.engine.eval;
-
-import org.apache.tajo.datum.Datum;
-
-public class EvalTreeFactory {
-	public static ConstEval newConst(Datum datum) {
-		return new ConstEval(datum);
-	}
-	
-	public static BinaryEval create(EvalType type, EvalNode e1,
-	    EvalNode e2) {
-		return new BinaryEval(type, e1, e2);
-	}
-}