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 2013/12/16 18:58:37 UTC

git commit: TAJO-419: Add missing visitor methods of AlgebraVisitor and BaseAlgebraVisitor. (hyunsik)

Updated Branches:
  refs/heads/master d930a90d5 -> 775cfaaad


TAJO-419: Add missing visitor methods of AlgebraVisitor and BaseAlgebraVisitor. (hyunsik)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/775cfaaa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/775cfaaa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/775cfaaa

Branch: refs/heads/master
Commit: 775cfaaad49fee4e79b7cd582b381740461fa6b9
Parents: d930a90
Author: Hyunsik Choi <hy...@apache.org>
Authored: Tue Dec 17 02:58:17 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Tue Dec 17 02:58:17 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   3 +
 .../org/apache/tajo/algebra/Aggregation.java    |   6 +-
 .../java/org/apache/tajo/algebra/CastExpr.java  |   6 +-
 .../org/apache/tajo/algebra/CreateTable.java    |   4 +-
 .../java/org/apache/tajo/algebra/DataType.java  |  68 ---
 .../org/apache/tajo/algebra/DataTypeExpr.java   |  68 +++
 .../java/org/apache/tajo/algebra/OpType.java    |  49 +-
 .../org/apache/tajo/algebra/Projection.java     |   6 +-
 .../java/org/apache/tajo/algebra/Target.java    |  67 ---
 .../org/apache/tajo/algebra/TargetExpr.java     |  67 +++
 .../java/org/apache/tajo/algebra/TestExpr.java  |   8 +-
 .../tajo/engine/parser/HiveConverter.java       |  10 +-
 .../apache/tajo/engine/parser/SQLAnalyzer.java  |  66 +--
 .../tajo/engine/planner/AlgebraVisitor.java     |  61 +-
 .../tajo/engine/planner/BaseAlgebraVisitor.java | 587 +++++++++++++++----
 .../engine/planner/BasicLogicalPlanVisitor.java |   2 +-
 .../tajo/engine/planner/LogicalPlanner.java     |  60 +-
 17 files changed, 780 insertions(+), 358 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 96a3b77..341787c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -94,6 +94,9 @@ Release 0.8.0 - unreleased
 
   IMPROVEMENTS
 
+    TAJO-419: Add missing visitor methods of AlgebraVisitor and
+    BaseAlgebraVisitor. (hyunsik)
+
     TAJO-421: Improve split for compression file. (jinho)
 
     TAJO-327: Add testcase to verify TAJO-16. (jaehwa)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
index eccb873..72acaa9 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
@@ -21,7 +21,7 @@ package org.apache.tajo.algebra;
 import org.apache.tajo.util.TUtil;
 
 public class Aggregation extends UnaryOperator {
-  private Target[] targets;
+  private TargetExpr[] targets;
   private GroupElement [] groups;
   private Expr havingCondition;
 
@@ -29,11 +29,11 @@ public class Aggregation extends UnaryOperator {
     super(OpType.Aggregation);
   }
 
-  public Target[] getTargets() {
+  public TargetExpr[] getTargets() {
     return this.targets;
   }
 
-  public void setTargets(Target[] targets) {
+  public void setTargets(TargetExpr[] targets) {
     this.targets = targets;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
index 349617f..ad793cd 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
@@ -20,9 +20,9 @@ package org.apache.tajo.algebra;
 
 public class CastExpr extends Expr {
   private Expr operand;
-  private DataType target;
+  private DataTypeExpr target;
 
-  public CastExpr(Expr operand, DataType target) {
+  public CastExpr(Expr operand, DataTypeExpr target) {
     super(OpType.Cast);
     this.operand = operand;
     this.target = target;
@@ -32,7 +32,7 @@ public class CastExpr extends Expr {
     return operand;
   }
 
-  public DataType getTarget() {
+  public DataTypeExpr getTarget() {
     return target;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
index 41276ad..a6bc1e7 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
@@ -138,7 +138,7 @@ public class CreateTable extends Expr {
         TUtil.checkEquals(params, another.params);
   }
 
-  public static class ColumnDefinition extends DataType {
+  public static class ColumnDefinition extends DataTypeExpr {
     String col_name;
 
     public ColumnDefinition(String columnName, String dataType) {
@@ -146,7 +146,7 @@ public class CreateTable extends Expr {
       this.col_name = columnName;
     }
 
-    public ColumnDefinition(String columnName, DataType dataType) {
+    public ColumnDefinition(String columnName, DataTypeExpr dataType) {
       super(dataType.getTypeName());
       if (dataType.hasLengthOrPrecision()) {
         setLengthOrPrecision(dataType.lengthOrPrecision);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataType.java
deleted file mode 100644
index ed8a4a6..0000000
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataType.java
+++ /dev/null
@@ -1,68 +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.algebra;
-
-import org.apache.tajo.util.TUtil;
-
-public class DataType extends Expr {
-  String typeName;
-  Integer lengthOrPrecision;
-  Integer scale;
-
-  public DataType(String typeName) {
-    super(OpType.DataType);
-    this.typeName = typeName;
-  }
-
-  public String getTypeName() {
-    return this.typeName;
-  }
-
-  public boolean hasLengthOrPrecision() {
-    return lengthOrPrecision != null;
-  }
-
-  public void setLengthOrPrecision(int lengthOrPrecision) {
-    this.lengthOrPrecision = lengthOrPrecision;
-  }
-
-  public Integer getLengthOrPrecision() {
-    return this.lengthOrPrecision;
-  }
-
-  public boolean hasScale() {
-    return this.scale != null;
-  }
-
-  public void setScale(int scale) {
-    this.scale = scale;
-  }
-
-  public Integer getScale() {
-    return this.scale;
-  }
-
-  @Override
-  boolean equalsTo(Expr expr) {
-    DataType another = (DataType) expr;
-    return typeName.equals(another.typeName) &&
-        TUtil.checkEquals(lengthOrPrecision, another.lengthOrPrecision) &&
-        TUtil.checkEquals(scale, another.scale);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
new file mode 100644
index 0000000..7b2b903
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
@@ -0,0 +1,68 @@
+/**
+ * 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.algebra;
+
+import org.apache.tajo.util.TUtil;
+
+public class DataTypeExpr extends Expr {
+  String typeName;
+  Integer lengthOrPrecision;
+  Integer scale;
+
+  public DataTypeExpr(String typeName) {
+    super(OpType.DataType);
+    this.typeName = typeName;
+  }
+
+  public String getTypeName() {
+    return this.typeName;
+  }
+
+  public boolean hasLengthOrPrecision() {
+    return lengthOrPrecision != null;
+  }
+
+  public void setLengthOrPrecision(int lengthOrPrecision) {
+    this.lengthOrPrecision = lengthOrPrecision;
+  }
+
+  public Integer getLengthOrPrecision() {
+    return this.lengthOrPrecision;
+  }
+
+  public boolean hasScale() {
+    return this.scale != null;
+  }
+
+  public void setScale(int scale) {
+    this.scale = scale;
+  }
+
+  public Integer getScale() {
+    return this.scale;
+  }
+
+  @Override
+  boolean equalsTo(Expr expr) {
+    DataTypeExpr another = (DataTypeExpr) expr;
+    return typeName.equals(another.typeName) &&
+        TUtil.checkEquals(lengthOrPrecision, another.lengthOrPrecision) &&
+        TUtil.checkEquals(scale, another.scale);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
index 3f8868b..cddba5d 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
@@ -25,21 +25,20 @@ import java.lang.reflect.Type;
 public enum OpType {
 
   // relational operators
-  Relation(Relation.class),
-  RelationList(RelationList.class),
-  Rename,
-  SimpleTableSubQuery(SimpleTableSubQuery.class),
-  TablePrimaryTableSubQuery(TablePrimarySubQuery.class),
-  Except(SetOperation.class),
-  Having(Having.class),
-	Aggregation(Aggregation.class),
-  Intersect(SetOperation.class),
-  Join(Join.class),
-  Projection(Projection.class),
-  Filter(Selection.class),
-  Sort(Sort.class),
-  Union(SetOperation.class),
-  Limit(Limit.class),
+  Projection(Projection.class), // 0
+  Limit(Limit.class), // 1
+  Sort(Sort.class), // 2
+  Having(Having.class), // 3
+  Aggregation(Aggregation.class), // 4
+  Join(Join.class), // 5
+  Filter(Selection.class), // 6
+  Union(SetOperation.class), // 7
+  Except(SetOperation.class), // 8
+  Intersect(SetOperation.class), // 9
+  SimpleTableSubQuery(SimpleTableSubQuery.class), // 10
+  TablePrimaryTableSubQuery(TablePrimarySubQuery.class), // 11
+  RelationList(RelationList.class), // 12
+  Relation(Relation.class), // 13
 
   // Data definition language
   CreateTable(CreateTable.class),
@@ -48,12 +47,12 @@ public enum OpType {
   // Insert or Update
   Insert(Insert.class),
 
-  // logical operators
+  // Logical Operators
   And(BinaryOperator.class),
   Or(BinaryOperator.class),
   Not(NotExpr.class),
 
-  // comparison predicates
+  // Comparison Predicates
   Equals(BinaryOperator.class),
   NotEquals(BinaryOperator.class),
   LessThan(BinaryOperator.class),
@@ -61,43 +60,43 @@ public enum OpType {
   GreaterThan(BinaryOperator.class),
   GreaterThanOrEquals(BinaryOperator.class),
 
-  // other predicates
+  // Other predicates
   Between(BetweenPredicate.class),
   CaseWhen(CaseWhenPredicate.class),
   IsNullPredicate(IsNullPredicate.class),
   InPredicate(InPredicate.class),
   ValueList(ValueListExpr.class),
-  Is,
   ExistsPredicate(ExistsPredicate.class),
 
-  // string operator or pattern matching predicates
+  // String Operator or Pattern Matching Predicates
   LikePredicate(PatternMatchPredicate.class),
   SimilarToPredicate(PatternMatchPredicate.class),
   Regexp(PatternMatchPredicate.class),
   Concatenate(BinaryOperator.class),
 
-  // arithmetic operators
+  // Arithmetic Operators
   Plus(BinaryOperator.class),
   Minus(BinaryOperator.class),
   Multiply(BinaryOperator.class),
   Divide(BinaryOperator.class),
   Modular(BinaryOperator.class),
 
-  // other expressions
+  // Other Expressions
   Sign(SignedExpr.class),
   Column(ColumnReferenceExpr.class),
-  Target(Target.class),
+  Target(TargetExpr.class),
   Function(FunctionExpr.class),
 
-  // set functions
+  // Set Functions
   CountRowsFunction(CountRowsFunctionExpr.class),
   GeneralSetFunction(GeneralSetFunctionExpr.class),
 
+  // Literal
   Cast(CastExpr.class),
   ScalarSubQuery(ScalarSubQuery.class),
   Literal(LiteralValue.class),
   Null(NullValue.class),
-  DataType(org.apache.tajo.algebra.DataType.class);
+  DataType(DataTypeExpr.class);
 
   private Class baseClass;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
index 38520ae..958f20c 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
@@ -24,7 +24,7 @@ public class Projection extends UnaryOperator implements Cloneable {
   private boolean all;
   private boolean distinct = false;
 
-  private Target[] targets;
+  private TargetExpr [] targets;
 
   public Projection() {
     super(OpType.Projection);
@@ -50,11 +50,11 @@ public class Projection extends UnaryOperator implements Cloneable {
     return all;
   }
 	
-	public Target[] getTargets() {
+	public TargetExpr[] getTargets() {
 	  return this.targets;
 	}
 
-  public void setTargets(Target[] targets) {
+  public void setTargets(TargetExpr[] targets) {
     this.targets = targets;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/Target.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Target.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Target.java
deleted file mode 100644
index 9172d6c..0000000
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Target.java
+++ /dev/null
@@ -1,67 +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.algebra;
-
-import org.apache.tajo.util.TUtil;
-
-public class Target extends Expr {
-  private Expr expr;
-  private String alias;
-
-  public Target(Expr expr) {
-    super(OpType.Target);
-    this.expr = expr;
-  }
-
-  public Target(Expr expr, String alias) {
-    this(expr);
-    setAlias(alias);
-  }
-
-  public Expr getExpr() {
-    return expr;
-  }
-
-  public boolean hasAlias() {
-    return this.alias != null;
-  }
-
-  public String getAlias() {
-    return this.alias;
-  }
-
-  public void setAlias(String alias) {
-    this.alias = alias;
-  }
-
-  @Override
-  public boolean equalsTo(Expr obj) {
-    if (obj instanceof Target) {
-      Target another = (Target) obj;
-      return expr.equals(another.expr) && TUtil.checkEquals(alias, another.alias);
-    }
-
-    return false;
-  }
-
-  @Override
-  public String toJson() {
-    return JsonHelper.toJson(this);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
new file mode 100644
index 0000000..393790b
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
@@ -0,0 +1,67 @@
+/**
+ * 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.algebra;
+
+import org.apache.tajo.util.TUtil;
+
+public class TargetExpr extends Expr {
+  private Expr expr;
+  private String alias;
+
+  public TargetExpr(Expr expr) {
+    super(OpType.Target);
+    this.expr = expr;
+  }
+
+  public TargetExpr(Expr expr, String alias) {
+    this(expr);
+    setAlias(alias);
+  }
+
+  public Expr getExpr() {
+    return expr;
+  }
+
+  public boolean hasAlias() {
+    return this.alias != null;
+  }
+
+  public String getAlias() {
+    return this.alias;
+  }
+
+  public void setAlias(String alias) {
+    this.alias = alias;
+  }
+
+  @Override
+  public boolean equalsTo(Expr obj) {
+    if (obj instanceof TargetExpr) {
+      TargetExpr another = (TargetExpr) obj;
+      return expr.equals(another.expr) && TUtil.checkEquals(alias, another.alias);
+    }
+
+    return false;
+  }
+
+  @Override
+  public String toJson() {
+    return JsonHelper.toJson(this);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
index 24b535b..660176d 100644
--- a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
+++ b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
@@ -102,8 +102,8 @@ public class TestExpr {
     selection.setChild(relation);
 
     Aggregation aggregation = new Aggregation();
-    aggregation.setTargets(new Target[]{
-          new Target(new ColumnReferenceExpr("col1"))
+    aggregation.setTargets(new TargetExpr[]{
+          new TargetExpr(new ColumnReferenceExpr("col1"))
         }
     );
 
@@ -129,8 +129,8 @@ public class TestExpr {
     selection.setChild(relation);
 
     Aggregation aggregation = new Aggregation();
-    aggregation.setTargets(new Target[]{
-        new Target(new ColumnReferenceExpr("col1"))
+    aggregation.setTargets(new TargetExpr[]{
+        new TargetExpr(new ColumnReferenceExpr("col1"))
     });
 
     aggregation.setChild(selection);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/HiveConverter.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/HiveConverter.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/HiveConverter.java
index 120f828..6de1bff 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/HiveConverter.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/HiveConverter.java
@@ -542,7 +542,7 @@ public class HiveConverter extends HiveParserBaseVisitor<Expr> {
   public Expr visitSelectList(HiveParser.SelectListContext ctx) {
     Expr current = null;
     Projection projection = new Projection();
-    Target[] targets = new Target[ctx.selectItem().size()];
+    TargetExpr[] targets = new TargetExpr[ctx.selectItem().size()];
     for (int i = 0; i < targets.length; i++) {
       targets[i] = visitSelectItem(ctx.selectItem(i));
     }
@@ -564,9 +564,9 @@ public class HiveConverter extends HiveParserBaseVisitor<Expr> {
   }
 
   @Override
-  public Target visitSelectItem(HiveParser.SelectItemContext ctx) {
+  public TargetExpr visitSelectItem(HiveParser.SelectItemContext ctx) {
     ColumnReferenceExpr columnReference;
-    Target target = null;
+    TargetExpr target = null;
 
     String tableName = "", itemName = "", alias = "";
 
@@ -587,9 +587,9 @@ public class HiveConverter extends HiveParserBaseVisitor<Expr> {
 
     if (ctx.selectExpression() != null) {
       if (ctx.selectExpression().expression() != null) {
-        target = new Target(visitSelectExpression(ctx.selectExpression()));
+        target = new TargetExpr(visitSelectExpression(ctx.selectExpression()));
       } else {
-        target = new Target(columnReference);
+        target = new TargetExpr(columnReference);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
index 6d1ca3e..2cd91f9 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
@@ -226,7 +226,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     if (ctx.MULTIPLY() != null) {
       projection.setAll();
     } else {
-      Target [] targets = new Target[ctx.select_sublist().size()];
+      TargetExpr[] targets = new TargetExpr[ctx.select_sublist().size()];
       for (int i = 0; i < targets.length; i++) {
         targets[i] = visitSelect_sublist(ctx.select_sublist(i));
       }
@@ -247,9 +247,9 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
    * @return
    */
   @Override
-  public Target visitSelect_sublist(SQLParser.Select_sublistContext ctx) {
+  public TargetExpr visitSelect_sublist(SQLParser.Select_sublistContext ctx) {
     if (ctx.asterisked_qualifier != null) {
-      return new Target(new ColumnReferenceExpr(ctx.asterisked_qualifier.getText(), "*"));
+      return new TargetExpr(new ColumnReferenceExpr(ctx.asterisked_qualifier.getText(), "*"));
     } else {
       return visitDerived_column(ctx.derived_column());
     }
@@ -801,8 +801,8 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
   }
 
   @Override
-  public Target visitDerived_column(SQLParser.Derived_columnContext ctx) {
-    Target target = new Target(visitValue_expression(ctx.value_expression()));
+  public TargetExpr visitDerived_column(SQLParser.Derived_columnContext ctx) {
+    TargetExpr target = new TargetExpr(visitValue_expression(ctx.value_expression()));
     if (ctx.as_clause() != null) {
       target.setAlias(ctx.as_clause().Identifier().getText());
     }
@@ -918,7 +918,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     CreateTable.ColumnDefinition [] elements = new CreateTable.ColumnDefinition[size];
     for (int i = 0; i < size; i++) {
       String name = ctx.field_element(i).name.getText();
-      DataType typeDef = visitData_type(ctx.field_element(i).field_type().data_type());
+      DataTypeExpr typeDef = visitData_type(ctx.field_element(i).field_type().data_type());
       elements[i] = new CreateTable.ColumnDefinition(name, typeDef);
     }
 
@@ -985,10 +985,10 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
   }
 
   @Override
-  public DataType visitData_type(SQLParser.Data_typeContext ctx) {
+  public DataTypeExpr visitData_type(SQLParser.Data_typeContext ctx) {
     SQLParser.Predefined_typeContext predefined_type = ctx.predefined_type();
 
-    DataType typeDefinition = null;
+    DataTypeExpr typeDefinition = null;
     if (predefined_type.character_string_type() != null) {
       SQLParser.Character_string_typeContext character_string_type =
           predefined_type.character_string_type();
@@ -996,7 +996,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
       if ((character_string_type.CHARACTER() != null || character_string_type.CHAR() != null) &&
           character_string_type.VARYING() == null) {
 
-        typeDefinition = new DataType(Type.CHAR.name());
+        typeDefinition = new DataTypeExpr(Type.CHAR.name());
 
         if (character_string_type.type_length() != null) {
           typeDefinition.setLengthOrPrecision(
@@ -1006,7 +1006,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
       } else if (character_string_type.VARCHAR() != null
           || character_string_type.VARYING() != null) {
 
-        typeDefinition = new DataType(Type.VARCHAR.name());
+        typeDefinition = new DataTypeExpr(Type.VARCHAR.name());
 
         if (character_string_type.type_length() != null) {
           typeDefinition.setLengthOrPrecision(
@@ -1014,7 +1014,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
         }
 
       } else if (character_string_type.TEXT() != null) {
-        typeDefinition =  new DataType(Type.TEXT.name());
+        typeDefinition =  new DataTypeExpr(Type.TEXT.name());
       }
 
     } else if (predefined_type.national_character_string_type() != null) {
@@ -1022,9 +1022,9 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
           predefined_type.national_character_string_type();
       if ((nchar_type.CHAR() != null || nchar_type.CHARACTER() != null
           || nchar_type.NCHAR() != null) && nchar_type.VARYING() == null) {
-        typeDefinition = new DataType(Type.NCHAR.name());
+        typeDefinition = new DataTypeExpr(Type.NCHAR.name());
       } else if (nchar_type.NVARCHAR() != null || nchar_type.VARYING() != null) {
-        typeDefinition = new DataType(Type.NVARCHAR.name());
+        typeDefinition = new DataTypeExpr(Type.NVARCHAR.name());
       }
 
       if (nchar_type.type_length() != null) {
@@ -1035,7 +1035,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     } else if (predefined_type.binary_large_object_string_type() != null) {
       SQLParser.Binary_large_object_string_typeContext blob_type =
           predefined_type.binary_large_object_string_type();
-      typeDefinition = new DataType(Type.BLOB.name());
+      typeDefinition = new DataTypeExpr(Type.BLOB.name());
       if (blob_type.type_length() != null) {
         typeDefinition.setLengthOrPrecision(
             Integer.parseInt(blob_type.type_length().NUMBER().getText()));
@@ -1046,18 +1046,18 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
         SQLParser.Exact_numeric_typeContext exactType =
             predefined_type.numeric_type().exact_numeric_type();
         if (exactType.TINYINT() != null || exactType.INT1() != null) {
-          typeDefinition = new DataType(Type.INT1.name());
+          typeDefinition = new DataTypeExpr(Type.INT1.name());
         } else if (exactType.INT2() != null || exactType.SMALLINT() != null) {
-          typeDefinition = new DataType(Type.INT2.name());
+          typeDefinition = new DataTypeExpr(Type.INT2.name());
         } else if (exactType.INT4() != null || exactType.INTEGER() != null ||
             exactType.INT() != null) {
-          typeDefinition = new DataType(Type.INT4.name());
+          typeDefinition = new DataTypeExpr(Type.INT4.name());
         } else if (exactType.INT8() != null || exactType.BIGINT() != null) {
-          typeDefinition = new DataType(Type.INT8.name());
+          typeDefinition = new DataTypeExpr(Type.INT8.name());
         } else if (exactType.NUMERIC() != null) {
-          typeDefinition = new DataType(Type.NUMERIC.name());
+          typeDefinition = new DataTypeExpr(Type.NUMERIC.name());
         } else if (exactType.DECIMAL() != null || exactType.DEC() != null) {
-          typeDefinition = new DataType(Type.DECIMAL.name());
+          typeDefinition = new DataTypeExpr(Type.DECIMAL.name());
         }
 
         if (typeDefinition.getTypeName().equals(Type.NUMERIC.name()) ||
@@ -1076,34 +1076,34 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
             predefined_type.numeric_type().approximate_numeric_type();
         if (approximateType.FLOAT() != null || approximateType.FLOAT4() != null
             || approximateType.REAL() != null) {
-          typeDefinition = new DataType(Type.FLOAT4.name());
+          typeDefinition = new DataTypeExpr(Type.FLOAT4.name());
         } else if (approximateType.FLOAT8() != null || approximateType.DOUBLE() != null) {
-          typeDefinition = new DataType(Type.FLOAT8.name());
+          typeDefinition = new DataTypeExpr(Type.FLOAT8.name());
         }
       }
     } else if (predefined_type.boolean_type() != null)  {
-      typeDefinition = new DataType(Type.BOOLEAN.name());
+      typeDefinition = new DataTypeExpr(Type.BOOLEAN.name());
     } else if (predefined_type.datetime_type() != null) {
       SQLParser.Datetime_typeContext dateTimeType = predefined_type.datetime_type();
       if (dateTimeType.DATE() != null) {
-        typeDefinition = new DataType(Type.DATE.name());
+        typeDefinition = new DataTypeExpr(Type.DATE.name());
       } else if (dateTimeType.TIME(0) != null && dateTimeType.ZONE() == null) {
-        typeDefinition = new DataType(Type.TIME.name());
+        typeDefinition = new DataTypeExpr(Type.TIME.name());
       } else if ((dateTimeType.TIME(0) != null && dateTimeType.ZONE() != null) ||
           dateTimeType.TIMETZ() != null) {
-        typeDefinition = new DataType(Type.TIMEZ.name());
+        typeDefinition = new DataTypeExpr(Type.TIMEZ.name());
       } else if (dateTimeType.TIMESTAMP() != null && dateTimeType.ZONE() == null) {
-        typeDefinition = new DataType(Type.TIMESTAMP.name());
+        typeDefinition = new DataTypeExpr(Type.TIMESTAMP.name());
       } else if ((dateTimeType.TIMESTAMP() != null && dateTimeType.ZONE() != null) ||
           dateTimeType.TIMESTAMPTZ() != null) {
-        typeDefinition = new DataType(Type.TIMESTAMPZ.name());
+        typeDefinition = new DataTypeExpr(Type.TIMESTAMPZ.name());
       }
     } else if (predefined_type.bit_type() != null) {
       SQLParser.Bit_typeContext bitType = predefined_type.bit_type();
       if (bitType.VARBIT() != null || bitType.VARYING() != null) {
-        typeDefinition = new DataType(Type.VARBIT.name());
+        typeDefinition = new DataTypeExpr(Type.VARBIT.name());
       } else {
-        typeDefinition = new DataType(Type.BIT.name());
+        typeDefinition = new DataTypeExpr(Type.BIT.name());
       }
       if (bitType.type_length() != null) {
         typeDefinition.setLengthOrPrecision(
@@ -1112,9 +1112,9 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
     } else if (predefined_type.binary_type() != null) {
       SQLParser.Binary_typeContext binaryType = predefined_type.binary_type();
       if (binaryType.VARBINARY() != null || binaryType.VARYING() != null) {
-        typeDefinition = new DataType(Type.VARBINARY.name());
+        typeDefinition = new DataTypeExpr(Type.VARBINARY.name());
       } else {
-        typeDefinition = new DataType(Type.BINARY.name());
+        typeDefinition = new DataTypeExpr(Type.BINARY.name());
       }
 
       if (binaryType.type_length() != null) {
@@ -1211,7 +1211,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
 
   @Override public Expr visitCast_specification(SQLParser.Cast_specificationContext ctx) {
     Expr operand = visitChildren(ctx.cast_operand());
-    DataType castTarget = visitData_type(ctx.cast_target().data_type());
+    DataTypeExpr castTarget = visitData_type(ctx.cast_target().data_type());
     return new CastExpr(operand, castTarget);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
index 345320c..0bc957d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
@@ -23,6 +23,7 @@ import org.apache.tajo.algebra.*;
 import java.util.Stack;
 
 public interface AlgebraVisitor<CONTEXT, RESULT> {
+  // Relational Operators
   RESULT visitProjection(CONTEXT ctx, Stack<OpType> stack, Projection expr) throws PlanningException;
   RESULT visitLimit(CONTEXT ctx, Stack<OpType> stack, Limit expr) throws PlanningException;
   RESULT visitSort(CONTEXT ctx, Stack<OpType> stack, Sort expr) throws PlanningException;
@@ -33,9 +34,67 @@ public interface AlgebraVisitor<CONTEXT, RESULT> {
   RESULT visitUnion(CONTEXT ctx, Stack<OpType> stack, SetOperation expr) throws PlanningException;
   RESULT visitExcept(CONTEXT ctx, Stack<OpType> stack, SetOperation expr) throws PlanningException;
   RESULT visitIntersect(CONTEXT ctx, Stack<OpType> stack, SetOperation expr) throws PlanningException;
-  RESULT visitRelationList(CONTEXT ctx, Stack<OpType> stack, RelationList expr) throws PlanningException;
+  RESULT visitSimpleTableSubQuery(CONTEXT ctx, Stack<OpType> stack, SimpleTableSubQuery expr) throws PlanningException;
   RESULT visitTableSubQuery(CONTEXT ctx, Stack<OpType> stack, TablePrimarySubQuery expr) throws PlanningException;
+  RESULT visitRelationList(CONTEXT ctx, Stack<OpType> stack, RelationList expr) throws PlanningException;
   RESULT visitRelation(CONTEXT ctx, Stack<OpType> stack, Relation expr) throws PlanningException;
+
+  // Data definition language
   RESULT visitCreateTable(CONTEXT ctx, Stack<OpType> stack, CreateTable expr) throws PlanningException;
   RESULT visitDropTable(CONTEXT ctx, Stack<OpType> stack, DropTable expr) throws PlanningException;
+
+  // Insert or Update
+  RESULT visitInsert(CONTEXT ctx, Stack<OpType> stack, Insert expr) throws PlanningException;
+
+  // Logical operators
+  RESULT visitAnd(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitOr(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitNot(CONTEXT ctx, Stack<OpType> stack, NotExpr expr) throws PlanningException;
+
+  // comparison predicates
+  RESULT visitEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitNotEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitLessThan(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitLessThanOrEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitGreaterThan(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitGreaterThanOrEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+
+  // Other Predicates
+  RESULT visitBetween(CONTEXT ctx, Stack<OpType> stack, BetweenPredicate expr) throws PlanningException;
+  RESULT visitCaseWhen(CONTEXT ctx, Stack<OpType> stack, CaseWhenPredicate expr) throws PlanningException;
+  RESULT visitIsNullPredicate(CONTEXT ctx, Stack<OpType> stack, IsNullPredicate expr) throws PlanningException;
+  RESULT visitInPredicate(CONTEXT ctx, Stack<OpType> stack, InPredicate expr) throws PlanningException;
+  RESULT visitValueListExpr(CONTEXT ctx, Stack<OpType> stack, ValueListExpr expr) throws PlanningException;
+  RESULT visitExistsPredicate(CONTEXT ctx, Stack<OpType> stack, ExistsPredicate expr) throws PlanningException;
+
+  // String Operator or Pattern Matching Predicates
+  RESULT visitLikePredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr) throws PlanningException;
+  RESULT visitSimilarToPredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr) throws PlanningException;
+  RESULT visitRegexpPredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr) throws PlanningException;
+  RESULT visitConcatenate(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+
+  // arithmetic operators
+  RESULT visitPlus(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitMinus(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitMultiply(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitDivide(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+  RESULT visitModular(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException;
+
+  // other expressions
+  RESULT visitSign(CONTEXT ctx, Stack<OpType> stack, SignedExpr expr) throws PlanningException;
+  RESULT visitColumnReference(CONTEXT ctx, Stack<OpType> stack, ColumnReferenceExpr expr) throws PlanningException;
+  RESULT visitTargetExpr(CONTEXT ctx, Stack<OpType> stack, TargetExpr expr) throws PlanningException;
+  RESULT visitFunction(CONTEXT ctx, Stack<OpType> stack, FunctionExpr expr) throws PlanningException;
+
+  // set functions
+  RESULT visitCountRowsFunction(CONTEXT ctx, Stack<OpType> stack, CountRowsFunctionExpr expr) throws PlanningException;
+  RESULT visitGeneralSetFunction(CONTEXT ctx, Stack<OpType> stack, GeneralSetFunctionExpr expr)
+      throws PlanningException;
+
+  // Literal
+  RESULT visitCastExpr(CONTEXT ctx, Stack<OpType> stack, CastExpr expr) throws PlanningException;
+  RESULT visitScalarSubQuery(CONTEXT ctx, Stack<OpType> stack, ScalarSubQuery expr) throws PlanningException;
+  RESULT visitLiteral(CONTEXT ctx, Stack<OpType> stack, LiteralValue expr) throws PlanningException;
+  RESULT visitNullValue(CONTEXT ctx, Stack<OpType> stack, NullValue expr) throws PlanningException;
+  RESULT visitDataType(CONTEXT ctx, Stack<OpType> stack, DataTypeExpr expr) throws PlanningException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
index f974e1d..2195e9d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
@@ -22,7 +22,7 @@ import org.apache.tajo.algebra.*;
 
 import java.util.Stack;
 
-public abstract class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisitor<CONTEXT, RESULT> {
+public class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisitor<CONTEXT, RESULT> {
 
   /**
    * The prehook is called before each expression is visited.
@@ -39,66 +39,192 @@ public abstract class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisi
   }
 
   /**
-   * visitChild visits each relational operator expression recursively.
+   * visit visits each relational operator expression recursively.
    *
    * @param stack The stack contains the upper operators' type.
    * @param expr The visiting relational operator
    */
-  public RESULT visitChild(CONTEXT ctx, Stack<OpType> stack, Expr expr) throws PlanningException {
+  public RESULT visit(CONTEXT ctx, Stack<OpType> stack, Expr expr) throws PlanningException {
     preHook(ctx, stack, expr);
 
-    RESULT current;
+    RESULT current = null;
+
     switch (expr.getType()) {
-      case Projection:
-        current = visitProjection(ctx, stack, (Projection) expr);
-        break;
-      case Limit:
-        current = visitLimit(ctx, stack, (Limit) expr);
-        break;
-      case Sort:
-        current = visitSort(ctx, stack, (Sort) expr);
-        break;
-      case Having:
-        current = visitHaving(ctx, stack, (Having) expr);
-        break;
-      case Aggregation:
-        current = visitGroupBy(ctx, stack, (Aggregation) expr);
-        break;
-      case Join:
-        current = visitJoin(ctx, stack, (Join) expr);
-        break;
-      case Filter:
-        current = visitFilter(ctx, stack, (Selection) expr);
-        break;
-      case Union:
-        current = visitUnion(ctx, stack, (SetOperation) expr);
-        break;
-      case Except:
-        current = visitExcept(ctx, stack, (SetOperation) expr);
-        break;
-      case Intersect:
-        current = visitIntersect(ctx, stack, (SetOperation) expr);
-        break;
-      case RelationList:
-        current = visitRelationList(ctx, stack, (RelationList) expr);
-        break;
-      case TablePrimaryTableSubQuery:
-        current = visitTableSubQuery(ctx, stack, (TablePrimarySubQuery) expr);
-        break;
-      case Relation:
-        current = visitRelation(ctx, stack, (Relation) expr);
-        break;
-      case Insert:
-        current = visitInsert(ctx, stack, (Insert) expr);
-        break;
-      case CreateTable:
-        current = visitCreateTable(ctx, stack, (CreateTable) expr);
-        break;
-      case DropTable:
-        current = visitDropTable(ctx, stack, (DropTable) expr);
-        break;
-      default:
-        throw new PlanningException("Cannot support this type algebra \"" + expr.getType() + "\"");
+
+    case Projection:
+      current = visitProjection(ctx, stack, (Projection) expr);
+      break;
+    case Limit:
+      current = visitLimit(ctx, stack, (Limit) expr);
+      break;
+    case Sort:
+      current = visitSort(ctx, stack, (Sort) expr);
+      break;
+    case Having:
+      current = visitHaving(ctx, stack, (Having) expr);
+      break;
+    case Aggregation:
+      current = visitGroupBy(ctx, stack, (Aggregation) expr);
+      break;
+    case Join:
+      current = visitJoin(ctx, stack, (Join) expr);
+      break;
+    case Filter:
+      current = visitFilter(ctx, stack, (Selection) expr);
+      break;
+    case Union:
+      current = visitUnion(ctx, stack, (SetOperation) expr);
+      break;
+    case Except:
+      current = visitExcept(ctx, stack, (SetOperation) expr);
+      break;
+    case Intersect:
+      current = visitIntersect(ctx, stack, (SetOperation) expr);
+      break;
+    case SimpleTableSubQuery:
+      current = visitSimpleTableSubQuery(ctx, stack, (SimpleTableSubQuery) expr);
+      break;
+    case TablePrimaryTableSubQuery:
+      current = visitTableSubQuery(ctx, stack, (TablePrimarySubQuery) expr);
+      break;
+    case RelationList:
+      current = visitRelationList(ctx, stack, (RelationList) expr);
+      break;
+    case Relation:
+      current = visitRelation(ctx, stack, (Relation) expr);
+      break;
+
+    case CreateTable:
+      current = visitCreateTable(ctx, stack, (CreateTable) expr);
+      break;
+    case DropTable:
+      current = visitDropTable(ctx, stack, (DropTable) expr);
+      break;
+
+    case Insert:
+      current = visitInsert(ctx, stack, (Insert) expr);
+      break;
+
+    case And:
+      current = visitAnd(ctx, stack, (BinaryOperator) expr);
+      break;
+    case Or:
+      current = visitOr(ctx, stack, (BinaryOperator) expr);
+      break;
+    case Not:
+      current = visitNot(ctx, stack, (NotExpr) expr);
+      break;
+
+    case Equals:
+      current = visitEquals(ctx, stack, (BinaryOperator) expr);
+      break;
+    case NotEquals:
+      current = visitNotEquals(ctx, stack, (BinaryOperator) expr);
+      break;
+    case LessThan:
+      current = visitLessThan(ctx, stack, (BinaryOperator) expr);
+      break;
+    case LessThanOrEquals:
+      current = visitLessThanOrEquals(ctx, stack, (BinaryOperator) expr);
+      break;
+    case GreaterThan:
+      current = visitGreaterThan(ctx, stack, (BinaryOperator) expr);
+      break;
+    case GreaterThanOrEquals:
+      current = visitGreaterThanOrEquals(ctx, stack, (BinaryOperator) expr);
+      break;
+
+    // Other Predicates
+    case Between:
+      current = visitBetween(ctx, stack, (BetweenPredicate) expr);
+      break;
+    case CaseWhen:
+      current = visitCaseWhen(ctx, stack, (CaseWhenPredicate) expr);
+      break;
+    case IsNullPredicate:
+      current = visitIsNullPredicate(ctx, stack, (IsNullPredicate) expr);
+      break;
+    case InPredicate:
+      current = visitInPredicate(ctx, stack, (InPredicate) expr);
+      break;
+    case ValueList:
+      current = visitValueListExpr(ctx, stack, (ValueListExpr) expr);
+      break;
+    case ExistsPredicate:
+      current = visitExistsPredicate(ctx, stack, (ExistsPredicate) expr);
+      break;
+
+    // String Operator or Pattern Matching Predicates
+    case LikePredicate:
+      current = visitLikePredicate(ctx, stack, (PatternMatchPredicate) expr);
+      break;
+    case SimilarToPredicate:
+      current = visitSimilarToPredicate(ctx, stack, (PatternMatchPredicate) expr);
+      break;
+    case Regexp:
+      current = visitRegexpPredicate(ctx, stack, (PatternMatchPredicate) expr);
+      break;
+    case Concatenate:
+      current = visitConcatenate(ctx, stack, (BinaryOperator) expr);
+      break;
+
+    // Arithmetic Operators
+    case Plus:
+      current = visitPlus(ctx, stack, (BinaryOperator) expr);
+      break;
+    case Minus:
+      current = visitMinus(ctx, stack, (BinaryOperator) expr);
+      break;
+    case Multiply:
+      current = visitMultiply(ctx, stack, (BinaryOperator) expr);
+      break;
+    case Divide:
+      current = visitDivide(ctx, stack, (BinaryOperator) expr);
+      break;
+    case Modular:
+      current = visitModular(ctx, stack, (BinaryOperator) expr);
+      break;
+
+    // Other Expressions
+    case Sign:
+      current = visitSign(ctx, stack, (SignedExpr) expr);
+      break;
+    case Column:
+      current = visitColumnReference(ctx, stack, (ColumnReferenceExpr) expr);
+      break;
+    case Target:
+      current = visitTargetExpr(ctx, stack, (TargetExpr) expr);
+      break;
+    case Function:
+      current = visitFunction(ctx, stack, (FunctionExpr) expr);
+      break;
+
+
+    case CountRowsFunction:
+      current = visitCountRowsFunction(ctx, stack, (CountRowsFunctionExpr) expr);
+      break;
+    case GeneralSetFunction:
+      current = visitGeneralSetFunction(ctx, stack, (GeneralSetFunctionExpr) expr);
+      break;
+
+    case Cast:
+      current = visitCastExpr(ctx, stack, (CastExpr) expr);
+      break;
+    case ScalarSubQuery:
+      current = visitScalarSubQuery(ctx, stack, (ScalarSubQuery) expr);
+      break;
+    case Literal:
+      current = visitLiteral(ctx, stack, (LiteralValue) expr);
+      break;
+    case Null:
+      current = visitNullValue(ctx, stack, (NullValue) expr);
+      break;
+    case DataType:
+      current = visitDataType(ctx, stack, (DataTypeExpr) expr);
+      break;
+
+    default:
+      throw new PlanningException("Cannot support this type algebra \"" + expr.getType() + "\"");
     }
 
     postHook(ctx, stack, expr, current);
@@ -106,112 +232,97 @@ public abstract class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisi
     return current;
   }
 
-  protected RESULT visitInsert(CONTEXT ctx, Stack<OpType> stack, Insert expr) throws PlanningException {
+  private RESULT visitDefaultUnaryExpr(CONTEXT ctx, Stack<OpType> stack, UnaryOperator expr) throws PlanningException {
     stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getSubQuery());
+    RESULT child = visit(ctx, stack, expr.getChild());
     stack.pop();
     return child;
   }
 
-  @Override
-  public RESULT visitProjection(CONTEXT ctx, Stack<OpType> stack, Projection expr) throws PlanningException {
+  private RESULT visitDefaultBinaryExpr(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr)
+      throws PlanningException {
     stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getChild());
+    RESULT child = visit(ctx, stack, expr.getLeft());
+    visit(ctx, stack, expr.getRight());
     stack.pop();
     return child;
   }
 
   @Override
+  public RESULT visitProjection(CONTEXT ctx, Stack<OpType> stack, Projection expr) throws PlanningException {
+    return visitDefaultUnaryExpr(ctx, stack, expr);
+  }
+
+  @Override
   public RESULT visitLimit(CONTEXT ctx, Stack<OpType> stack, Limit expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getChild());
-    stack.pop();
-    return child;
+    return visitDefaultUnaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitSort(CONTEXT ctx, Stack<OpType> stack, Sort expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getChild());
-    stack.pop();
-    return child;
+    return visitDefaultUnaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitHaving(CONTEXT ctx, Stack<OpType> stack, Having expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getChild());
-    stack.pop();
-    return child;
+    return visitDefaultUnaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitGroupBy(CONTEXT ctx, Stack<OpType> stack, Aggregation expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getChild());
-    stack.pop();
-    return child;
+    return visitDefaultUnaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitJoin(CONTEXT ctx, Stack<OpType> stack, Join expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getLeft());
-    visitChild(ctx, stack, expr.getRight());
-    stack.pop();
-    return child;
+    return visitDefaultBinaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitFilter(CONTEXT ctx, Stack<OpType> stack, Selection expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getChild());
-    stack.pop();
-    return child;
+    return visitDefaultUnaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitUnion(CONTEXT ctx, Stack<OpType> stack, SetOperation expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getLeft());
-    visitChild(ctx, stack, expr.getRight());
-    stack.pop();
-    return child;
+    return visitDefaultBinaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitExcept(CONTEXT ctx, Stack<OpType> stack, SetOperation expr) throws PlanningException {
-    stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getLeft());
-    visitChild(ctx, stack, expr.getRight());
-    stack.pop();
-    return child;
+    return visitDefaultBinaryExpr(ctx, stack, expr);
   }
 
   @Override
   public RESULT visitIntersect(CONTEXT ctx, Stack<OpType> stack, SetOperation expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitSimpleTableSubQuery(CONTEXT ctx, Stack<OpType> stack, SimpleTableSubQuery expr)
+      throws PlanningException {
     stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getLeft());
-    visitChild(ctx, stack, expr.getRight());
+    RESULT child = visit(ctx, stack, expr.getSubQuery());
     stack.pop();
     return child;
   }
 
   @Override
-  public RESULT visitRelationList(CONTEXT ctx, Stack<OpType> stack, RelationList expr) throws PlanningException {
+  public RESULT visitTableSubQuery(CONTEXT ctx, Stack<OpType> stack, TablePrimarySubQuery expr)
+      throws PlanningException {
     stack.push(expr.getType());
-    RESULT child = null;
-    for (Expr e : expr.getRelations()) {
-      child = visitChild(ctx, stack, e);
-    }
+    RESULT child = visit(ctx, stack, expr.getSubQuery());
     stack.pop();
     return child;
   }
 
   @Override
-  public RESULT visitTableSubQuery(CONTEXT ctx, Stack<OpType> stack, TablePrimarySubQuery expr) throws PlanningException {
+  public RESULT visitRelationList(CONTEXT ctx, Stack<OpType> stack, RelationList expr) throws PlanningException {
     stack.push(expr.getType());
-    RESULT child = visitChild(ctx, stack, expr.getSubQuery());
+    RESULT child = null;
+    for (Expr e : expr.getRelations()) {
+      child = visit(ctx, stack, e);
+    }
     stack.pop();
     return child;
   }
@@ -221,12 +332,16 @@ public abstract class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisi
     return null;
   }
 
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // Data Definition Language Section
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
   @Override
   public RESULT visitCreateTable(CONTEXT ctx, Stack<OpType> stack, CreateTable expr) throws PlanningException {
     stack.push(expr.getType());
     RESULT child = null;
     if (expr.hasSubQuery()) {
-      child = visitChild(ctx, stack, expr.getSubQuery());
+      child = visit(ctx, stack, expr.getSubQuery());
     }
     stack.pop();
     return child;
@@ -236,4 +351,268 @@ public abstract class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisi
   public RESULT visitDropTable(CONTEXT ctx, Stack<OpType> stack, DropTable expr) throws PlanningException {
     return null;
   }
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // Insert or Update Section
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public RESULT visitInsert(CONTEXT ctx, Stack<OpType> stack, Insert expr) throws PlanningException {
+    stack.push(expr.getType());
+    RESULT child = visit(ctx, stack, expr.getSubQuery());
+    stack.pop();
+    return child;
+  }
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // Logical Operator Section
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public RESULT visitAnd(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitOr(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitNot(CONTEXT ctx, Stack<OpType> stack, NotExpr expr) throws PlanningException {
+    return visitDefaultUnaryExpr(ctx, stack, expr);
+  }
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // Comparison Predicates Section
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  @Override
+  public RESULT visitEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitNotEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitLessThan(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitLessThanOrEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitGreaterThan(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitGreaterThanOrEquals(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr)
+      throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // Other Predicates Section
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public RESULT visitBetween(CONTEXT ctx, Stack<OpType> stack, BetweenPredicate expr) throws PlanningException {
+    stack.push(OpType.Between);
+    RESULT result = visit(ctx, stack, expr.predicand());
+    visit(ctx, stack, expr.begin());
+    visit(ctx, stack, expr.end());
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitCaseWhen(CONTEXT ctx, Stack<OpType> stack, CaseWhenPredicate expr) throws PlanningException {
+    stack.push(OpType.CaseWhen);
+    RESULT result = null;
+    for (CaseWhenPredicate.WhenExpr when : expr.getWhens()) {
+      result = visit(ctx, stack, when.getCondition());
+      visit(ctx, stack, when.getResult());
+    }
+    if (expr.hasElseResult()) {
+      visit(ctx, stack, expr.getElseResult());
+    }
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitIsNullPredicate(CONTEXT ctx, Stack<OpType> stack, IsNullPredicate expr) throws PlanningException {
+    stack.push(OpType.IsNullPredicate);
+    RESULT result = visit(ctx, stack, expr.getPredicand());
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitInPredicate(CONTEXT ctx, Stack<OpType> stack, InPredicate expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitValueListExpr(CONTEXT ctx, Stack<OpType> stack, ValueListExpr expr) throws PlanningException {
+    stack.push(OpType.ValueList);
+    RESULT result = null;
+    for (Expr value : expr.getValues()) {
+      result = visit(ctx, stack, value);
+    }
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitExistsPredicate(CONTEXT ctx, Stack<OpType> stack, ExistsPredicate expr) throws PlanningException {
+    stack.push(OpType.ExistsPredicate);
+    RESULT result = visit(ctx, stack, expr.getSubQuery());
+    stack.pop();
+    return result;
+  }
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+  // String Operator or Pattern Matching Predicates Section
+  ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private RESULT visitPatternMatchPredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr)
+      throws PlanningException {
+    stack.push(expr.getType());
+    RESULT result = visit(ctx, stack, expr.getPredicand());
+    visit(ctx, stack, expr.getPattern());
+    stack.pop();
+    return result;
+  }
+  @Override
+  public RESULT visitLikePredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr)
+      throws PlanningException {
+    return visitPatternMatchPredicate(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitSimilarToPredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr)
+      throws PlanningException {
+    return visitPatternMatchPredicate(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitRegexpPredicate(CONTEXT ctx, Stack<OpType> stack, PatternMatchPredicate expr)
+      throws PlanningException {
+    return visitPatternMatchPredicate(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitConcatenate(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitPlus(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitMinus(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitMultiply(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitDivide(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitModular(CONTEXT ctx, Stack<OpType> stack, BinaryOperator expr) throws PlanningException {
+    return visitDefaultBinaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitSign(CONTEXT ctx, Stack<OpType> stack, SignedExpr expr) throws PlanningException {
+    return visitDefaultUnaryExpr(ctx, stack, expr);
+  }
+
+  @Override
+  public RESULT visitColumnReference(CONTEXT ctx, Stack<OpType> stack, ColumnReferenceExpr expr)
+      throws PlanningException {
+    return null;
+  }
+
+  @Override
+  public RESULT visitTargetExpr(CONTEXT ctx, Stack<OpType> stack, TargetExpr expr) throws PlanningException {
+    stack.push(OpType.Target);
+    RESULT result = visit(ctx, stack, expr.getExpr());
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitFunction(CONTEXT ctx, Stack<OpType> stack, FunctionExpr expr) throws PlanningException {
+    stack.push(OpType.Function);
+    RESULT result = null;
+    for (Expr param : expr.getParams()) {
+      result = visit(ctx, stack, param);
+    }
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitCountRowsFunction(CONTEXT ctx, Stack<OpType> stack, CountRowsFunctionExpr expr)
+      throws PlanningException {
+    return null;
+  }
+
+  @Override
+  public RESULT visitGeneralSetFunction(CONTEXT ctx, Stack<OpType> stack, GeneralSetFunctionExpr expr)
+      throws PlanningException {
+    stack.push(OpType.GeneralSetFunction);
+    RESULT result = null;
+    for (Expr param : expr.getParams()) {
+      result = visit(ctx, stack, param);
+    }
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitCastExpr(CONTEXT ctx, Stack<OpType> stack, CastExpr expr) throws PlanningException {
+    stack.push(OpType.Cast);
+    RESULT result = visit(ctx, stack, expr.getOperand());
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitScalarSubQuery(CONTEXT ctx, Stack<OpType> stack, ScalarSubQuery expr) throws PlanningException {
+    stack.push(OpType.ScalarSubQuery);
+    RESULT result = visit(ctx, stack, expr.getSubQuery());
+    stack.pop();
+    return result;
+  }
+
+  @Override
+  public RESULT visitLiteral(CONTEXT ctx, Stack<OpType> stack, LiteralValue expr) throws PlanningException {
+    return null;
+  }
+
+  @Override
+  public RESULT visitNullValue(CONTEXT ctx, Stack<OpType> stack, NullValue expr) throws PlanningException {
+    return null;
+  }
+
+  @Override
+  public RESULT visitDataType(CONTEXT ctx, Stack<OpType> stack, DataTypeExpr expr) throws PlanningException {
+    return null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
index 78c7c22..9478648 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
@@ -50,7 +50,7 @@ public class BasicLogicalPlanVisitor<CONTEXT, RESULT> implements LogicalPlanVisi
   }
 
   /**
-   * visitChild visits each logicalNode recursively.
+   * visit visits each logicalNode recursively.
    */
   public RESULT visitChild(CONTEXT context, LogicalPlan plan, LogicalNode node, Stack<LogicalNode> stack)
       throws PlanningException {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/775cfaaa/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index f43566d..63b7985 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@ -103,7 +103,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     QueryBlock rootBlock = plan.newAndGetBlock(LogicalPlan.ROOT_BLOCK);
     PlanContext context = new PlanContext(plan, rootBlock);
-    subroot = visitChild(context, stack, expr);
+    subroot = visit(context, stack, expr);
 
     LogicalRootNode root = new LogicalRootNode(plan.newPID());
     root.setInSchema(subroot.getOutSchema());
@@ -155,7 +155,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     QueryBlock newBlock = context.plan.newAndGetBlock(expr.getName());
     PlanContext newContext = new PlanContext(context.plan, newBlock);
     Stack<OpType> newStack = new Stack<OpType>();
-    LogicalNode child = visitChild(newContext, newStack, expr.getSubQuery());
+    LogicalNode child = visit(newContext, newStack, expr.getSubQuery());
     context.plan.connectBlocks(newContext.block, context.block, BlockType.TableSubQuery);
     return new TableSubQueryNode(context.plan.newPID(), expr.getName(), child);
   }
@@ -209,7 +209,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
   public LogicalNode visitRelationList(PlanContext context, Stack<OpType> stack, RelationList relations)
       throws PlanningException {
 
-    LogicalNode current = visitChild(context, stack, relations.getRelations()[0]);
+    LogicalNode current = visit(context, stack, relations.getRelations()[0]);
 
     LogicalNode left;
     LogicalNode right;
@@ -217,7 +217,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
       for (int i = 1; i < relations.size(); i++) {
         left = current;
-        right = visitChild(context, stack, relations.getRelations()[i]);
+        right = visit(context, stack, relations.getRelations()[i]);
         current = createCatasianProduct(context.plan, left, right);
       }
     }
@@ -234,8 +234,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     // Phase 2: build child plans
     stack.push(OpType.Join);
-    LogicalNode left = visitChild(context, stack, join.getLeft());
-    LogicalNode right = visitChild(context, stack, join.getRight());
+    LogicalNode left = visit(context, stack, join.getLeft());
+    LogicalNode right = visit(context, stack, join.getRight());
     stack.pop();
 
     // Phase 3: build this plan
@@ -353,13 +353,13 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     // 2. Build Child Plans
     PlanContext leftContext = new PlanContext(plan, plan.newNoNameBlock());
     Stack<OpType> leftStack = new Stack<OpType>();
-    LogicalNode left = visitChild(leftContext, leftStack, setOperation.getLeft());
+    LogicalNode left = visit(leftContext, leftStack, setOperation.getLeft());
     TableSubQueryNode leftSubQuery = new TableSubQueryNode(plan.newPID(), leftContext.block.getName(), left);
     context.plan.connectBlocks(leftContext.block, context.block, BlockType.TableSubQuery);
 
     PlanContext rightContext = new PlanContext(plan, plan.newNoNameBlock());
     Stack<OpType> rightStack = new Stack<OpType>();
-    LogicalNode right = visitChild(rightContext, rightStack, setOperation.getRight());
+    LogicalNode right = visit(rightContext, rightStack, setOperation.getRight());
     TableSubQueryNode rightSubQuery = new TableSubQueryNode(plan.newPID(), rightContext.block.getName(), right);
     context.plan.connectBlocks(rightContext.block, context.block, BlockType.TableSubQuery);
 
@@ -398,9 +398,11 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     LogicalPlan plan = context.plan;
     QueryBlock block = context.block;
 
+    // 1.1 finding pushable expressions from search condition
+
     // 2. build child plans:
     stack.push(OpType.Filter);
-    LogicalNode child = visitChild(context, stack, selection.getChild());
+    LogicalNode child = visit(context, stack, selection.getChild());
     stack.pop();
 
     // 3. build this plan:
@@ -432,7 +434,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     // 2. Build Child Plan Phase:
     stack.push(OpType.Aggregation);
-    LogicalNode child = visitChild(context, stack, aggregation.getChild());
+    LogicalNode child = visit(context, stack, aggregation.getChild());
     stack.pop();
 
     // 3. Build This Plan:
@@ -586,7 +588,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     // 2. Build Child Plans:
     stack.push(OpType.Sort);
-    LogicalNode child = visitChild(context, stack, sort.getChild());
+    LogicalNode child = visit(context, stack, sort.getChild());
     child = insertGroupbyNodeIfUnresolved(plan, block, child, stack);
     stack.pop();
 
@@ -617,7 +619,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     // build child plans
     stack.push(OpType.Limit);
-    LogicalNode child = visitChild(context, stack, limit.getChild());
+    LogicalNode child = visit(context, stack, limit.getChild());
     stack.pop();
 
     // build limit plan
@@ -661,7 +663,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     // 2: Build Child Plans
     stack.push(OpType.Projection);
-    LogicalNode child = visitChild(context, stack, projection.getChild());
+    LogicalNode child = visit(context, stack, projection.getChild());
     child = insertGroupbyNodeIfUnresolved(plan, block, child, stack);
     stack.pop();
 
@@ -741,7 +743,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     if (expr.hasSubQuery()) {
       stack.add(OpType.CreateTable);
-      LogicalNode subQuery = visitChild(context, stack, expr.getSubQuery());
+      LogicalNode subQuery = visit(context, stack, expr.getSubQuery());
       stack.pop();
       StoreTableNode storeNode = new StoreTableNode(context.plan.newPID(), tableName);
       storeNode.setCreateTable();
@@ -946,7 +948,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     return columnList;
   }
 
-  private DataType convertDataType(org.apache.tajo.algebra.DataType dataType) {
+  private DataType convertDataType(DataTypeExpr dataType) {
     TajoDataTypes.Type type = TajoDataTypes.Type.valueOf(dataType.getTypeName());
 
     DataType.Builder builder = DataType.newBuilder();
@@ -961,12 +963,12 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     return new Column(columnDefinition.getColumnName(), convertDataType(columnDefinition));
   }
 
-  protected LogicalNode visitInsert(PlanContext context, Stack<OpType> stack, Insert expr) throws PlanningException {
+  public LogicalNode visitInsert(PlanContext context, Stack<OpType> stack, Insert expr) throws PlanningException {
     stack.push(expr.getType());
     QueryBlock newQueryBlock = context.plan.newNoNameBlock();
     PlanContext newContext = new PlanContext(context.plan, newQueryBlock);
     Stack<OpType> subStack = new Stack<OpType>();
-    LogicalNode subQuery = visitChild(newContext, subStack, expr.getSubQuery());
+    LogicalNode subQuery = visit(newContext, subStack, expr.getSubQuery());
     context.plan.connectBlocks(newQueryBlock, context.block, BlockType.TableSubQuery);
     stack.pop();
 
@@ -1011,23 +1013,6 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     return insertNode;
   }
 
-  /**
-   * This ensures that corresponding columns in both tables are equivalent to each other.
-   */
-  private static void ensureDomains(Schema targetTableScheme, Schema schema)
-      throws PlanningException {
-    for (int i = 0; i < schema.getColumnNum(); i++) {
-      if (!schema.getColumn(i).getDataType().equals(targetTableScheme.getColumn(i).getDataType())) {
-        Column targetColumn = targetTableScheme.getColumn(i);
-        Column insertColumn = schema.getColumn(i);
-        throw new PlanningException("ERROR: " +
-            insertColumn.getColumnName() + " is of type " + insertColumn.getDataType().getType().name() +
-                ", but target column '" + targetColumn.getColumnName() + "' is of type " +
-                targetColumn.getDataType().getType().name());
-      }
-    }
-  }
-
   @Override
   public LogicalNode visitDropTable(PlanContext context, Stack<OpType> stack, DropTable dropTable) {
     DropTableNode dropTableNode = new DropTableNode(context.plan.newPID(), dropTable.getTableName(),
@@ -1131,9 +1116,6 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         return new InEval(predicand, rowConstantEval, inPredicate.isNot());
       }
 
-      case Is:
-        break;
-
       case And:
       case Or:
       case Equals:
@@ -1303,7 +1285,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     return caseEval;
   }
 
-  Target[] annotateTargets(LogicalPlan plan, QueryBlock block, org.apache.tajo.algebra.Target [] targets)
+  Target[] annotateTargets(LogicalPlan plan, QueryBlock block, TargetExpr[] targets)
       throws PlanningException {
     Target annotatedTargets [] = new Target[targets.length];
 
@@ -1314,7 +1296,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
   }
 
   Target createTarget(LogicalPlan plan, QueryBlock block,
-                             org.apache.tajo.algebra.Target target) throws PlanningException {
+                             TargetExpr target) throws PlanningException {
     if (target.hasAlias()) {
       return new Target(createEvalTree(plan, block, target.getExpr()),
           target.getAlias());