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/08/19 11:23:54 UTC

[3/4] TAJO-123: Clean up the logical plan's json format. (hyunsik)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/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 b8cfb70..4fa4a10 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
@@ -32,7 +32,7 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.engine.eval.*;
-import org.apache.tajo.engine.eval.EvalNode.Type;
+import org.apache.tajo.engine.eval.EvalType;
 import org.apache.tajo.engine.planner.LogicalPlan.QueryBlock;
 import org.apache.tajo.engine.planner.logical.*;
 import org.apache.tajo.engine.query.exception.InvalidQueryException;
@@ -100,7 +100,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     LogicalRootNode root = new LogicalRootNode();
     root.setInSchema(subroot.getOutSchema());
     root.setOutSchema(subroot.getOutSchema());
-    root.setSubNode(subroot);
+    root.setChild(subroot);
     plan.getRootBlock().setRoot(root);
 
     return plan;
@@ -209,8 +209,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
 
     // Determine join conditions
     if (join.isNatural()) { // if natural join, it should have the equi-join conditions by common column names
-      Schema leftSchema = joinNode.getOuterNode().getInSchema();
-      Schema rightSchema = joinNode.getInnerNode().getInSchema();
+      Schema leftSchema = joinNode.getLeftChild().getInSchema();
+      Schema rightSchema = joinNode.getRightChild().getInSchema();
       Schema commons = SchemaUtil.getCommons(leftSchema, rightSchema);
       EvalNode njCond = getNaturalJoinCondition(leftSchema, rightSchema, commons);
       joinNode.setJoinQual(njCond);
@@ -230,12 +230,12 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     for (Column common : commons.getColumns()) {
       leftJoinKey = outer.getColumnByName(common.getColumnName());
       rightJoinKey = inner.getColumnByName(common.getColumnName());
-      equiQual = new BinaryEval(EvalNode.Type.EQUAL,
+      equiQual = new BinaryEval(EvalType.EQUAL,
           new FieldEval(leftJoinKey), new FieldEval(rightJoinKey));
       if (njQual == null) {
         njQual = equiQual;
       } else {
-        njQual = new BinaryEval(EvalNode.Type.AND,
+        njQual = new BinaryEval(EvalType.AND,
             njQual, equiQual);
       }
     }
@@ -246,8 +246,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
   private static LogicalNode createCatasianProduct(LogicalNode left, LogicalNode right) {
     JoinNode join = new JoinNode(JoinType.CROSS_JOIN, left, right);
     Schema joinSchema = SchemaUtil.merge(
-        join.getOuterNode().getOutSchema(),
-        join.getInnerNode().getOutSchema());
+        join.getLeftChild().getOutSchema(),
+        join.getRightChild().getOutSchema());
     join.setInSchema(joinSchema);
     join.setOutSchema(joinSchema);
 
@@ -335,8 +335,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     Schema outSchema = PlannerUtil.targetToSchema(leftStrippedTargets);
     setOp.setInSchema(left.getOutSchema());
     setOp.setOutSchema(outSchema);
-    setOp.setOuter(left);
-    setOp.setInner(right);
+    setOp.setLeftChild(left);
+    setOp.setRightChild(right);
 
     if (isNoUpperProjection(stack)) {
       block.targetListManager = new TargetListManager(plan, leftStrippedTargets);
@@ -385,7 +385,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     SelectionNode selectionNode = new SelectionNode(searchCondition);
 
     // 4. set child plan, update input/output schemas:
-    selectionNode.setSubNode(child);
+    selectionNode.setChild(child);
     selectionNode.setInSchema(child.getOutSchema());
     selectionNode.setOutSchema(child.getOutSchema());
 
@@ -429,7 +429,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       }
 
       // 4. Set Child Plan and Update Input Schemes Phase
-      groupingNode.setSubNode(child);
+      groupingNode.setChild(child);
       block.setGroupingNode(groupingNode);
       groupingNode.setInSchema(child.getInSchema());
 
@@ -462,8 +462,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         Target[] clone = cloneTargets(block.getCurrentTargets());
 
         g1.setTargets(clone);
-        g1.setSubNode((LogicalNode) subNode.clone());
-        g1.setInSchema(g1.getSubNode().getOutSchema());
+        g1.setChild((LogicalNode) subNode.clone());
+        g1.setInSchema(g1.getChild().getOutSchema());
         Schema outSchema = getProjectedSchema(plan, block.getCurrentTargets());
         g1.setOutSchema(outSchema);
 
@@ -477,16 +477,16 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         GroupbyNode g1 = new GroupbyNode(cuboids.get(idx));
         Target[] clone = cloneTargets(block.getCurrentTargets());
         g1.setTargets(clone);
-        g1.setSubNode((LogicalNode) subNode.clone());
-        g1.setInSchema(g1.getSubNode().getOutSchema());
+        g1.setChild((LogicalNode) subNode.clone());
+        g1.setInSchema(g1.getChild().getOutSchema());
         Schema outSchema = getProjectedSchema(plan, clone);
         g1.setOutSchema(outSchema);
 
         GroupbyNode g2 = new GroupbyNode(cuboids.get(idx+1));
         clone = cloneTargets(block.getCurrentTargets());
         g2.setTargets(clone);
-        g2.setSubNode((LogicalNode) subNode.clone());
-        g2.setInSchema(g1.getSubNode().getOutSchema());
+        g2.setChild((LogicalNode) subNode.clone());
+        g2.setInSchema(g1.getChild().getOutSchema());
         outSchema = getProjectedSchema(plan, clone);
         g2.setOutSchema(outSchema);
         union = new UnionNode(g1, g2);
@@ -577,7 +577,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     SortNode sortNode = new SortNode(annotatedSortSpecs);
 
     // 4. Set Child Plan, Update Input/Output Schemas:
-    sortNode.setSubNode(child);
+    sortNode.setChild(child);
     sortNode.setInSchema(child.getOutSchema());
     sortNode.setOutSchema(child.getOutSchema());
 
@@ -601,7 +601,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     LimitNode limitNode = new LimitNode(firstFetchNum.terminate(null).asInt8());
 
     // set child plan and update input/output schemas.
-    limitNode.setSubNode(child);
+    limitNode.setChild(child);
     limitNode.setInSchema(child.getOutSchema());
     limitNode.setOutSchema(child.getOutSchema());
     return limitNode;
@@ -655,7 +655,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     block.setProjectionNode(projectionNode);
     projectionNode.setOutSchema(getProjectedSchema(plan, projectionNode.getTargets()));
     projectionNode.setInSchema(child.getOutSchema());
-    projectionNode.setSubNode(child);
+    projectionNode.setChild(child);
 
     if (projection.isDistinct() && block.hasGrouping()) {
       throw new VerifyException("Cannot support grouping and distinct at the same time");
@@ -666,8 +666,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         dupRemoval.setTargets(block.getTargetListManager().getTargets());
         dupRemoval.setInSchema(child.getOutSchema());
         dupRemoval.setOutSchema(outSchema);
-        dupRemoval.setSubNode(child);
-        projectionNode.setSubNode(dupRemoval);
+        dupRemoval.setChild(child);
+        projectionNode.setChild(dupRemoval);
       }
     }
 
@@ -684,7 +684,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     if (!block.isGroupingResolved()) {
       GroupbyNode groupbyNode = new GroupbyNode(new Column[] {});
       groupbyNode.setTargets(block.getCurrentTargets());
-      groupbyNode.setSubNode(child);
+      groupbyNode.setChild(child);
       groupbyNode.setInSchema(child.getOutSchema());
 
       plan.postVisit(blockName, groupbyNode, stack);
@@ -720,7 +720,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       LogicalNode subQuery = visitChild(context, stack, expr.getSubQuery());
       stack.pop();
       StoreTableNode storeNode = new StoreTableNode(tableName);
-      storeNode.setSubNode(subQuery);
+      storeNode.setChild(subQuery);
 
       if (expr.hasTableElements()) {
         Schema schema = convertTableElementsSchema(expr.getTableElements());
@@ -939,23 +939,23 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     return new FieldEval(column);
   }
 
-  private static Type exprTypeToEvalType(OpType type) {
+  private static EvalType exprTypeToEvalType(OpType type) {
     switch (type) {
-      case And: return Type.AND;
-      case Or: return Type.OR;
-      case Equals: return Type.EQUAL;
-      case NotEquals: return Type.NOT_EQUAL;
-      case LessThan: return Type.LTH;
-      case LessThanOrEquals: return Type.LEQ;
-      case GreaterThan: return Type.GTH;
-      case GreaterThanOrEquals: return Type.GEQ;
-      case Plus: return Type.PLUS;
-      case Minus: return Type.MINUS;
-      case Multiply: return Type.MULTIPLY;
-      case Divide: return Type.DIVIDE;
-      case Modular: return Type.MODULAR;
-      case Column: return Type.FIELD;
-      case Function: return Type.FUNCTION;
+      case And: return EvalType.AND;
+      case Or: return EvalType.OR;
+      case Equals: return EvalType.EQUAL;
+      case NotEquals: return EvalType.NOT_EQUAL;
+      case LessThan: return EvalType.LTH;
+      case LessThanOrEquals: return EvalType.LEQ;
+      case GreaterThan: return EvalType.GTH;
+      case GreaterThanOrEquals: return EvalType.GEQ;
+      case Plus: return EvalType.PLUS;
+      case Minus: return EvalType.MINUS;
+      case Multiply: return EvalType.MULTIPLY;
+      case Divide: return EvalType.DIVIDE;
+      case Modular: return EvalType.MODULAR;
+      case Column: return EvalType.FIELD;
+      case Function: return EvalType.FUNCTION;
       default: throw new RuntimeException("Unsupported type: " + type);
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
index 9671066..a2e38b1 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
@@ -72,7 +72,7 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
 
       case ROOT:
         LogicalRootNode rootNode = (LogicalRootNode) logicalNode;
-        return createPlanRecursive(ctx, rootNode.getSubNode());
+        return createPlanRecursive(ctx, rootNode.getChild());
 
       case EXPRS:
         EvalExprNode evalExpr = (EvalExprNode) logicalNode;
@@ -80,17 +80,17 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
 
       case STORE:
         StoreTableNode storeNode = (StoreTableNode) logicalNode;
-        outer = createPlanRecursive(ctx, storeNode.getSubNode());
+        outer = createPlanRecursive(ctx, storeNode.getChild());
         return createStorePlan(ctx, storeNode, outer);
 
       case SELECTION:
         SelectionNode selNode = (SelectionNode) logicalNode;
-        outer = createPlanRecursive(ctx, selNode.getSubNode());
+        outer = createPlanRecursive(ctx, selNode.getChild());
         return new SelectionExec(ctx, selNode, outer);
 
       case PROJECTION:
         ProjectionNode prjNode = (ProjectionNode) logicalNode;
-        outer = createPlanRecursive(ctx, prjNode.getSubNode());
+        outer = createPlanRecursive(ctx, prjNode.getChild());
         return new ProjectionExec(ctx, prjNode, outer);
 
       case SCAN:
@@ -99,29 +99,29 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
 
       case GROUP_BY:
         GroupbyNode grpNode = (GroupbyNode) logicalNode;
-        outer = createPlanRecursive(ctx, grpNode.getSubNode());
+        outer = createPlanRecursive(ctx, grpNode.getChild());
         return createGroupByPlan(ctx, grpNode, outer);
 
       case SORT:
         SortNode sortNode = (SortNode) logicalNode;
-        outer = createPlanRecursive(ctx, sortNode.getSubNode());
+        outer = createPlanRecursive(ctx, sortNode.getChild());
         return createSortPlan(ctx, sortNode, outer);
 
       case JOIN:
         JoinNode joinNode = (JoinNode) logicalNode;
-        outer = createPlanRecursive(ctx, joinNode.getOuterNode());
-        inner = createPlanRecursive(ctx, joinNode.getInnerNode());
+        outer = createPlanRecursive(ctx, joinNode.getLeftChild());
+        inner = createPlanRecursive(ctx, joinNode.getRightChild());
         return createJoinPlan(ctx, joinNode, outer, inner);
 
       case UNION:
         UnionNode unionNode = (UnionNode) logicalNode;
-        outer = createPlanRecursive(ctx, unionNode.getOuterNode());
-        inner = createPlanRecursive(ctx, unionNode.getInnerNode());
+        outer = createPlanRecursive(ctx, unionNode.getLeftChild());
+        inner = createPlanRecursive(ctx, unionNode.getRightChild());
         return new UnionExec(ctx, outer, inner);
 
       case LIMIT:
         LimitNode limitNode = (LimitNode) logicalNode;
-        outer = createPlanRecursive(ctx, limitNode.getSubNode());
+        outer = createPlanRecursive(ctx, limitNode.getChild());
         return new LimitExec(ctx, limitNode.getInSchema(),
             limitNode.getOutSchema(), outer, limitNode);
 
@@ -130,14 +130,6 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
         outer = createIndexScanExec(ctx, indexScanNode);
         return outer;
 
-      case RENAME:
-      case SET_UNION:
-      case SET_DIFF:
-      case SET_INTERSECT:
-      case INSERT_INTO:
-      case SHOW_TABLE:
-      case DESC_TABLE:
-      case SHOW_FUNCTION:
       default:
         return null;
     }
@@ -163,8 +155,8 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
         return new NLJoinExec(ctx, joinNode, outer, inner);
 
       case INNER:
-        String [] outerLineage = PlannerUtil.getLineage(joinNode.getOuterNode());
-        String [] innerLineage = PlannerUtil.getLineage(joinNode.getInnerNode());
+        String [] outerLineage = PlannerUtil.getLineage(joinNode.getLeftChild());
+        String [] innerLineage = PlannerUtil.getLineage(joinNode.getRightChild());
         long outerSize = estimateSizeRecursive(ctx, outerLineage);
         long innerSize = estimateSizeRecursive(ctx, innerLineage);
 
@@ -254,7 +246,7 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
       LOG.info("The planner chooses HashAggregationExec");
       return new HashAggregateExec(ctx, groupbyNode, subOp);
     } else {
-      String [] outerLineage = PlannerUtil.getLineage(groupbyNode.getSubNode());
+      String [] outerLineage = PlannerUtil.getLineage(groupbyNode.getChild());
       long estimatedSize = estimateSizeRecursive(ctx, outerLineage);
       final long threshold = 1048576 * 256;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
index dc647a9..755d4cb 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
@@ -45,14 +45,14 @@ public class PlannerUtil {
   public static boolean checkIfDDLPlan(LogicalNode node) {
     LogicalNode baseNode = node;
     if (node instanceof LogicalRootNode) {
-      baseNode = ((LogicalRootNode) node).getSubNode();
+      baseNode = ((LogicalRootNode) node).getChild();
     }
 
-    return baseNode.getType() == ExprType.CREATE_TABLE || baseNode.getType() == ExprType.DROP_TABLE;
+    return baseNode.getType() == NodeType.CREATE_TABLE || baseNode.getType() == NodeType.DROP_TABLE;
   }
   
   public static String [] getLineage(LogicalNode node) {
-    LogicalNode [] scans =  PlannerUtil.findAllNodes(node, ExprType.SCAN);
+    LogicalNode [] scans =  PlannerUtil.findAllNodes(node, NodeType.SCAN);
     String [] tableNames = new String[scans.length];
     ScanNode scan;
     for (int i = 0; i < scans.length; i++) {
@@ -67,12 +67,12 @@ public class PlannerUtil {
     Preconditions.checkArgument(newNode instanceof UnaryNode);
     
     UnaryNode p = (UnaryNode) parent;
-    LogicalNode c = p.getSubNode();
+    LogicalNode c = p.getChild();
     UnaryNode m = (UnaryNode) newNode;
     m.setInSchema(c.getOutSchema());
     m.setOutSchema(c.getOutSchema());
-    m.setSubNode(c);
-    p.setSubNode(m);
+    m.setChild(c);
+    p.setChild(m);
     
     return p;
   }
@@ -88,20 +88,20 @@ public class PlannerUtil {
         "ERROR: the logical node to be removed must be unary node.");
 
     UnaryNode child = (UnaryNode) tobeRemoved;
-    LogicalNode grandChild = child.getSubNode();
+    LogicalNode grandChild = child.getChild();
     if (parent instanceof UnaryNode) {
       UnaryNode unaryParent = (UnaryNode) parent;
 
-      Preconditions.checkArgument(unaryParent.getSubNode() == child,
+      Preconditions.checkArgument(unaryParent.getChild() == child,
           "ERROR: both logical node must be parent and child nodes");
-      unaryParent.setSubNode(grandChild);
+      unaryParent.setChild(grandChild);
 
     } else if (parent instanceof BinaryNode) {
       BinaryNode binaryParent = (BinaryNode) parent;
-      if (binaryParent.getOuterNode().equals(child)) {
-        binaryParent.setOuter(grandChild);
-      } else if (binaryParent.getInnerNode().equals(child)) {
-        binaryParent.setInner(grandChild);
+      if (binaryParent.getLeftChild().equals(child)) {
+        binaryParent.setLeftChild(grandChild);
+      } else if (binaryParent.getRightChild().equals(child)) {
+        binaryParent.setRightChild(grandChild);
       } else {
         throw new IllegalStateException("ERROR: both logical node must be parent and child nodes");
       }
@@ -111,16 +111,16 @@ public class PlannerUtil {
     return child;
   }
   
-  public static void replaceNode(LogicalNode plan, LogicalNode newNode, ExprType type) {
+  public static void replaceNode(LogicalNode plan, LogicalNode newNode, NodeType type) {
     LogicalNode parent = findTopParentNode(plan, type);
     Preconditions.checkArgument(parent instanceof UnaryNode);
     Preconditions.checkArgument(!(newNode instanceof BinaryNode));
     UnaryNode parentNode = (UnaryNode) parent;
-    LogicalNode child = parentNode.getSubNode();
+    LogicalNode child = parentNode.getChild();
     if (child instanceof UnaryNode) {
-      ((UnaryNode) newNode).setSubNode(((UnaryNode)child).getSubNode());
+      ((UnaryNode) newNode).setChild(((UnaryNode) child).getChild());
     }
-    parentNode.setSubNode(newNode);
+    parentNode.setChild(newNode);
   }
   
   public static LogicalNode insertOuterNode(LogicalNode parent, LogicalNode outer) {
@@ -128,12 +128,12 @@ public class PlannerUtil {
     Preconditions.checkArgument(outer instanceof UnaryNode);
     
     BinaryNode p = (BinaryNode) parent;
-    LogicalNode c = p.getOuterNode();
+    LogicalNode c = p.getLeftChild();
     UnaryNode m = (UnaryNode) outer;
     m.setInSchema(c.getOutSchema());
     m.setOutSchema(c.getOutSchema());
-    m.setSubNode(c);
-    p.setOuter(m);
+    m.setChild(c);
+    p.setLeftChild(m);
     return p;
   }
   
@@ -142,12 +142,12 @@ public class PlannerUtil {
     Preconditions.checkArgument(inner instanceof UnaryNode);
     
     BinaryNode p = (BinaryNode) parent;
-    LogicalNode c = p.getInnerNode();
+    LogicalNode c = p.getRightChild();
     UnaryNode m = (UnaryNode) inner;
     m.setInSchema(c.getOutSchema());
     m.setOutSchema(c.getOutSchema());
-    m.setSubNode(c);
-    p.setInner(m);
+    m.setChild(c);
+    p.setRightChild(m);
     return p;
   }
   
@@ -158,18 +158,18 @@ public class PlannerUtil {
     Preconditions.checkArgument(right instanceof UnaryNode);
     
     BinaryNode p = (BinaryNode)parent;
-    LogicalNode lc = p.getOuterNode();
-    LogicalNode rc = p.getInnerNode();
+    LogicalNode lc = p.getLeftChild();
+    LogicalNode rc = p.getRightChild();
     UnaryNode lm = (UnaryNode)left;
     UnaryNode rm = (UnaryNode)right;
     lm.setInSchema(lc.getOutSchema());
     lm.setOutSchema(lc.getOutSchema());
-    lm.setSubNode(lc);
+    lm.setChild(lc);
     rm.setInSchema(rc.getOutSchema());
     rm.setOutSchema(rc.getOutSchema());
-    rm.setSubNode(rc);
-    p.setOuter(lm);
-    p.setInner(rm);
+    rm.setChild(rc);
+    p.setLeftChild(lm);
+    p.setRightChild(rm);
     return p;
   }
   
@@ -227,7 +227,7 @@ public class PlannerUtil {
       child.setTargets(targetArray);
       child.setOutSchema(PlannerUtil.targetToSchema(targetArray));
       // set the groupby chaining
-      gp.setSubNode(child);
+      gp.setChild(child);
       gp.setInSchema(child.getOutSchema());
     } catch (CloneNotSupportedException e) {
       LOG.error(e);
@@ -241,7 +241,7 @@ public class PlannerUtil {
     
     try {
       SortNode child = (SortNode) sort.clone();
-      sort.setSubNode(child);
+      sort.setChild(child);
       sort.setInSchema(child.getOutSchema());
       sort.setOutSchema(child.getOutSchema());
     } catch (CloneNotSupportedException e) {
@@ -278,7 +278,7 @@ public class PlannerUtil {
    * @param type to find
    * @return a found logical node
    */
-  public static LogicalNode findTopNode(LogicalNode node, ExprType type) {
+  public static LogicalNode findTopNode(LogicalNode node, NodeType type) {
     Preconditions.checkNotNull(node);
     Preconditions.checkNotNull(type);
     
@@ -298,7 +298,7 @@ public class PlannerUtil {
    * @param type to find
    * @return a found logical node
    */
-  public static LogicalNode [] findAllNodes(LogicalNode node, ExprType type) {
+  public static LogicalNode [] findAllNodes(LogicalNode node, NodeType type) {
     Preconditions.checkNotNull(node);
     Preconditions.checkNotNull(type);
 
@@ -319,7 +319,7 @@ public class PlannerUtil {
    * @param type to find
    * @return the parent node of a found logical node
    */
-  public static LogicalNode findTopParentNode(LogicalNode node, ExprType type) {
+  public static LogicalNode findTopParentNode(LogicalNode node, NodeType type) {
     Preconditions.checkNotNull(node);
     Preconditions.checkNotNull(type);
     
@@ -335,7 +335,7 @@ public class PlannerUtil {
   public static boolean canBeEvaluated(EvalNode eval, LogicalNode node) {
     Set<Column> columnRefs = EvalTreeUtil.findDistinctRefColumns(eval);
 
-    if (node.getType() == ExprType.JOIN) {
+    if (node.getType() == NodeType.JOIN) {
       JoinNode joinNode = (JoinNode) node;
       Set<String> tableIds = Sets.newHashSet();
       // getting distinct table references
@@ -351,8 +351,8 @@ public class PlannerUtil {
         return false;
       }
 
-      String [] outer = getLineage(joinNode.getOuterNode());
-      String [] inner = getLineage(joinNode.getInnerNode());
+      String [] outer = getLineage(joinNode.getLeftChild());
+      String [] inner = getLineage(joinNode.getRightChild());
 
       Set<String> o = Sets.newHashSet(outer);
       Set<String> i = Sets.newHashSet(inner);
@@ -396,15 +396,15 @@ public class PlannerUtil {
 
   private static class LogicalNodeFinder implements LogicalNodeVisitor {
     private List<LogicalNode> list = new ArrayList<LogicalNode>();
-    private final ExprType [] tofind;
+    private final NodeType[] tofind;
     private boolean topmost = false;
     private boolean finished = false;
 
-    public LogicalNodeFinder(ExprType...type) {
+    public LogicalNodeFinder(NodeType...type) {
       this.tofind = type;
     }
 
-    public LogicalNodeFinder(ExprType [] type, boolean topmost) {
+    public LogicalNodeFinder(NodeType[] type, boolean topmost) {
       this(type);
       this.topmost = topmost;
     }
@@ -412,7 +412,7 @@ public class PlannerUtil {
     @Override
     public void visit(LogicalNode node) {
       if (!finished) {
-        for (ExprType type : tofind) {
+        for (NodeType type : tofind) {
           if (node.getType() == type) {
             list.add(node);
           }
@@ -430,9 +430,9 @@ public class PlannerUtil {
   
   private static class ParentNodeFinder implements LogicalNodeVisitor {
     private List<LogicalNode> list = new ArrayList<LogicalNode>();
-    private ExprType tofind;
+    private NodeType tofind;
 
-    public ParentNodeFinder(ExprType type) {
+    public ParentNodeFinder(NodeType type) {
       this.tofind = type;
     }
 
@@ -440,13 +440,13 @@ public class PlannerUtil {
     public void visit(LogicalNode node) {
       if (node instanceof UnaryNode) {
         UnaryNode unary = (UnaryNode) node;
-        if (unary.getSubNode().getType() == tofind) {
+        if (unary.getChild().getType() == tofind) {
           list.add(node);
         }
       } else if (node instanceof BinaryNode){
         BinaryNode bin = (BinaryNode) node;
-        if (bin.getOuterNode().getType() == tofind ||
-            bin.getInnerNode().getType() == tofind) {
+        if (bin.getLeftChild().getType() == tofind ||
+            bin.getRightChild().getType() == tofind) {
           list.add(node);
         }
       }
@@ -711,7 +711,7 @@ public class PlannerUtil {
       } catch (CloneNotSupportedException e) {
         throw new InternalError(e.getMessage());
       }
-      if (copy[i].getEvalTree().getType() == EvalNode.Type.FIELD) {
+      if (copy[i].getEvalTree().getType() == EvalType.FIELD) {
         FieldEval fieldEval = (FieldEval) copy[i].getEvalTree();
         if (fieldEval.getColumnRef().isQualified()) {
           fieldEval.getColumnRef().setName(fieldEval.getColumnName());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
index 3db4d94..c14fe88 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/Target.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner;
 
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.engine.eval.EvalType;
 import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes.DataType;
@@ -37,7 +38,7 @@ public class Target implements Cloneable, GsonObject {
 
   public Target(EvalNode expr) {
     this.expr = expr;
-    if (expr.getType() == EvalNode.Type.AGG_FUNCTION &&
+    if (expr.getType() == EvalType.AGG_FUNCTION &&
         expr.getValueType().length > 1) { // hack for partial result
       this.column = new Column(expr.getName(), Type.ARRAY);
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/global/GlobalOptimizer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/global/GlobalOptimizer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/global/GlobalOptimizer.java
index c0e4017..36190ef 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/global/GlobalOptimizer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/global/GlobalOptimizer.java
@@ -20,8 +20,8 @@ package org.apache.tajo.engine.planner.global;
 
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.tajo.engine.planner.PlannerUtil;
-import org.apache.tajo.engine.planner.logical.ExprType;
 import org.apache.tajo.engine.planner.logical.LogicalNode;
+import org.apache.tajo.engine.planner.logical.NodeType;
 import org.apache.tajo.engine.planner.logical.ScanNode;
 import org.apache.tajo.engine.planner.logical.UnaryNode;
 import org.apache.tajo.master.ExecutionBlock;
@@ -55,7 +55,7 @@ public class GlobalOptimizer {
     }
 
     for (ExecutionBlock childBlock: cur.getChildBlocks()) {
-      if (childBlock.getStoreTableNode().getSubNode().getType() != ExprType.UNION &&
+      if (childBlock.getStoreTableNode().getChild().getType() != NodeType.UNION &&
           childBlock.getPartitionType() == PartitionType.LIST) {
         mergeLogicalUnits(cur, childBlock);
       }
@@ -63,15 +63,15 @@ public class GlobalOptimizer {
   }
   
   private ExecutionBlock mergeLogicalUnits(ExecutionBlock parent, ExecutionBlock child) {
-    LogicalNode p = PlannerUtil.findTopParentNode(parent.getPlan(), ExprType.SCAN);
+    LogicalNode p = PlannerUtil.findTopParentNode(parent.getPlan(), NodeType.SCAN);
 
     if (p instanceof UnaryNode) {
       UnaryNode u = (UnaryNode) p;
-      ScanNode scan = (ScanNode) u.getSubNode();
-      LogicalNode c = child.getStoreTableNode().getSubNode();
+      ScanNode scan = (ScanNode) u.getChild();
+      LogicalNode c = child.getStoreTableNode().getChild();
 
       parent.removeChildBlock(scan);
-      u.setSubNode(c);
+      u.setChild(c);
       parent.setPlan(parent.getPlan());
       parent.addChildBlocks(child.getChildBlockMap());
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
index 1adddf3..df4b046 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/BinaryNode.java
@@ -25,7 +25,7 @@ import com.google.gson.annotations.Expose;
 import org.apache.tajo.json.GsonObject;
 
 public abstract class BinaryNode extends LogicalNode implements Cloneable, GsonObject {
-	@Expose LogicalNode outer = null;
+	@Expose LogicalNode leftChild = null;
 	@Expose LogicalNode inner = null;
 	
 	public BinaryNode() {
@@ -35,30 +35,30 @@ public abstract class BinaryNode extends LogicalNode implements Cloneable, GsonO
 	/**
 	 * @param opType
 	 */
-	public BinaryNode(ExprType opType) {
+	public BinaryNode(NodeType opType) {
 		super(opType);
 	}
 	
-	public LogicalNode getOuterNode() {
-		return this.outer;
+	public LogicalNode getLeftChild() {
+		return this.leftChild;
 	}
 	
-	public void setOuter(LogicalNode op) {
-		this.outer = op;
+	public void setLeftChild(LogicalNode op) {
+		this.leftChild = op;
 	}
 
-	public LogicalNode getInnerNode() {
+	public LogicalNode getRightChild() {
 		return this.inner;
 	}
 
-	public void setInner(LogicalNode op) {
+	public void setRightChild(LogicalNode op) {
 		this.inner = op;
 	}
 	
 	@Override
   public Object clone() throws CloneNotSupportedException {
 	  BinaryNode binNode = (BinaryNode) super.clone();
-	  binNode.outer = (LogicalNode) outer.clone();
+	  binNode.leftChild = (LogicalNode) leftChild.clone();
 	  binNode.inner = (LogicalNode) inner.clone();
 	  
 	  return binNode;
@@ -66,12 +66,12 @@ public abstract class BinaryNode extends LogicalNode implements Cloneable, GsonO
 	
 	public void preOrder(LogicalNodeVisitor visitor) {
 	  visitor.visit(this);
-	  outer.postOrder(visitor);
+	  leftChild.postOrder(visitor);
     inner.postOrder(visitor);    
   }
 	
 	public void postOrder(LogicalNodeVisitor visitor) {
-    outer.postOrder(visitor);
+    leftChild.postOrder(visitor);
     inner.postOrder(visitor);
     visitor.visit(this);
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
index a4d335b..c06623b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
@@ -36,7 +36,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
   @Expose private boolean external;
 
   public CreateTableNode(String tableName, Schema schema) {
-    super(ExprType.CREATE_TABLE);
+    super(NodeType.CREATE_TABLE);
     this.tableName = tableName;
     this.schema = schema;
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
index d586bf9..7ddb5ef 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/DropTableNode.java
@@ -22,7 +22,7 @@ public class DropTableNode extends LogicalNode {
   private String tableName;
 
   public DropTableNode(String tableName) {
-    super(ExprType.DROP_TABLE);
+    super(NodeType.DROP_TABLE);
     this.tableName = tableName;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
index 2ac6b2b..286f1c9 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/EvalExprNode.java
@@ -29,7 +29,7 @@ public class EvalExprNode extends LogicalNode implements Projectable {
   @Expose private Target[] exprs;
 
   public EvalExprNode(Target[] exprs) {
-    super(ExprType.EXPRS);
+    super(NodeType.EXPRS);
     this.exprs = exprs;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
index 379a83b..e7c7271 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExceptNode.java
@@ -24,16 +24,16 @@ package org.apache.tajo.engine.planner.logical;
 public class ExceptNode extends BinaryNode {
 
   public ExceptNode() {
-    super(ExprType.EXCEPT);
+    super(NodeType.EXCEPT);
   }
 
   public ExceptNode(LogicalNode outer, LogicalNode inner) {
     this();
-    setOuter(outer);
-    setInner(inner);
+    setLeftChild(outer);
+    setRightChild(inner);
   }
 
   public String toString() {
-    return getOuterNode().toString() + "\n EXCEPT \n" + getInnerNode().toString();
+    return getLeftChild().toString() + "\n EXCEPT \n" + getRightChild().toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExprType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExprType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExprType.java
deleted file mode 100644
index 7255146..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ExprType.java
+++ /dev/null
@@ -1,52 +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.planner.logical;
-
-public enum ExprType {
-  BST_INDEX_SCAN,
-  CREATE_INDEX,
-  CREATE_TABLE,	
-	DROP_TABLE,
-  DESC_TABLE,
-	EXCEPT,
-	EXPRS,
-	GROUP_BY,
-	INSERT_INTO,
-	INTERSECT,
-  LIMIT,
-	JOIN,
-	PROJECTION,
-	RECEIVE,
-	RENAME,
-	ROOT,
-	SCAN,
-	SELECTION,
-	SEND,
-	SET_DIFF, 
-	SET_UNION,
-  SET_INTERSECT,
-	SHOW_TABLE,
-	SHOW_FUNCTION,
-	SORT,
-	STORE,
-	UNION
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
index b35a291..c6b9bc8 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/GroupbyNode.java
@@ -34,7 +34,7 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
 	}
 	
 	public GroupbyNode(final Column [] columns) {
-		super(ExprType.GROUP_BY);
+		super(NodeType.GROUP_BY);
 		this.columns = columns;
 	}
 	
@@ -75,8 +75,8 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
     return this.targets;
   }
   
-  public void setSubNode(LogicalNode subNode) {
-    super.setSubNode(subNode);
+  public void setChild(LogicalNode subNode) {
+    super.setChild(subNode);
   }
   
   public String toString() {
@@ -105,7 +105,7 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
     sb.append("}");
     
     return sb.toString() + "\n"
-        + getSubNode().toString();
+        + getChild().toString();
   }
   
   @Override
@@ -116,7 +116,7 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
       eq = eq && TUtil.checkEquals(columns, other.columns);
       eq = eq && TUtil.checkEquals(havingCondition, other.havingCondition);
       eq = eq && TUtil.checkEquals(targets, other.targets);
-      eq = eq && subExpr.equals(other.subExpr);
+      eq = eq && child.equals(other.child);
       return eq;
     } else {
       return false;  

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
index b14a54b..8a9ffe4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IndexScanNode.java
@@ -40,7 +40,7 @@ public class IndexScanNode extends ScanNode {
     setOutSchema(scanNode.getOutSchema());
     setLocal(scanNode.isLocal());
     setTargets(scanNode.getTargets());
-    setType(ExprType.BST_INDEX_SCAN);
+    setType(NodeType.BST_INDEX_SCAN);
     this.sortKeys = sortKeys;
     this.keySchema = keySchema;
     this.datum = datum;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
index 1d00a56..870d3bd 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/IntersectNode.java
@@ -24,16 +24,16 @@ package org.apache.tajo.engine.planner.logical;
 public class IntersectNode extends BinaryNode {
 
   public IntersectNode() {
-    super(ExprType.INTERSECT);
+    super(NodeType.INTERSECT);
   }
 
   public IntersectNode(LogicalNode outer, LogicalNode inner) {
     this();
-    setOuter(outer);
-    setInner(inner);
+    setLeftChild(outer);
+    setRightChild(inner);
   }
 
   public String toString() {
-    return getOuterNode().toString() + "\n INTERSECT \n" + getInnerNode().toString();
+    return getLeftChild().toString() + "\n INTERSECT \n" + getRightChild().toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
index cd79e4d..6132c90 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/JoinNode.java
@@ -32,16 +32,16 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
   @Expose private Target[] targets;
 
   public JoinNode(JoinType joinType, LogicalNode left) {
-    super(ExprType.JOIN);
+    super(NodeType.JOIN);
     this.joinType = joinType;
-    setOuter(left);
+    setLeftChild(left);
   }
 
   public JoinNode(JoinType joinType, LogicalNode left, LogicalNode right) {
-    super(ExprType.JOIN);
+    super(NodeType.JOIN);
     this.joinType = joinType;
-    setOuter(left);
-    setInner(right);
+    setLeftChild(left);
+    setRightChild(right);
   }
 
   public JoinType getJoinType() {
@@ -83,7 +83,7 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
   public boolean equals(Object obj) {
     if (obj instanceof JoinNode) {
       JoinNode other = (JoinNode) obj;
-      return super.equals(other) && outer.equals(other.outer)
+      return super.equals(other) && leftChild.equals(other.leftChild)
           && inner.equals(other.inner);
     } else {
       return false;
@@ -118,7 +118,7 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
 
     sb.append("\n\"out schema: ").append(getOutSchema());
     sb.append("\n\"in schema: ").append(getInSchema());
-    sb.append("\n" + getOuterNode().toString()).append(" and ").append(getInnerNode());
+    sb.append("\n" + getLeftChild().toString()).append(" and ").append(getRightChild());
     return sb.toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
index 1d24941..d5bc926 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LimitNode.java
@@ -28,7 +28,7 @@ public final class LimitNode extends UnaryNode implements Cloneable {
 	}
 
   public LimitNode(long fetchFirstNum) {
-    super(ExprType.LIMIT);
+    super(NodeType.LIMIT);
     this.fetchFirstNum = fetchFirstNum;
   }
   
@@ -42,7 +42,7 @@ public final class LimitNode extends UnaryNode implements Cloneable {
       LimitNode other = (LimitNode) obj;
       return super.equals(other)
           && fetchFirstNum == other.fetchFirstNum
-          && subExpr.equals(other.subExpr);
+          && child.equals(other.child);
     } else {
       return false;
     }
@@ -60,7 +60,7 @@ public final class LimitNode extends UnaryNode implements Cloneable {
 
     sb.append("\n\"out schema: ").append(getOutSchema())
         .append("\n\"in schema: " + getInSchema());
-    sb.append("\n").append(getSubNode().toString());
+    sb.append("\n").append(getChild().toString());
 
     return sb.toString();
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
index 4891d82..6daaa50 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalNode.java
@@ -28,7 +28,7 @@ import org.apache.tajo.engine.json.CoreGsonHelper;
 import org.apache.tajo.util.TUtil;
 
 public abstract class LogicalNode implements Cloneable, GsonObject {
-  @Expose private ExprType type;
+  @Expose private NodeType type;
 	@Expose private Schema inputSchema;
 	@Expose	private Schema outputSchema;
 
@@ -38,15 +38,15 @@ public abstract class LogicalNode implements Cloneable, GsonObject {
 		
 	}
 
-	public LogicalNode(ExprType type) {
+	public LogicalNode(NodeType type) {
 		this.type = type;
 	}
 	
-	public ExprType getType() {
+	public NodeType getType() {
 		return this.type;
 	}
 
-	public void setType(ExprType type) {
+	public void setType(NodeType type) {
 		this.type = type;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
index 8b2fa77..67c08a6 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/LogicalRootNode.java
@@ -20,11 +20,11 @@ package org.apache.tajo.engine.planner.logical;
 
 public class LogicalRootNode extends UnaryNode implements Cloneable {
   public LogicalRootNode() {
-    super(ExprType.ROOT);
+    super(NodeType.ROOT);
   }
   
   public String toString() {
-    return "Logical Plan Root\n\n" + getSubNode().toString();
+    return "Logical Plan Root\n\n" + getChild().toString();
   }
   
   @Override
@@ -32,7 +32,7 @@ public class LogicalRootNode extends UnaryNode implements Cloneable {
     if (obj instanceof LogicalRootNode) {
       LogicalRootNode other = (LogicalRootNode) obj;
       boolean b1 = super.equals(other);
-      boolean b2 = subExpr.equals(other.subExpr);
+      boolean b2 = child.equals(other.child);
       
       return b1 && b2;
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
new file mode 100644
index 0000000..7f1505c
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
@@ -0,0 +1,56 @@
+/**
+ * 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.planner.logical;
+
+/**
+ * This indicates a logical node type.
+ */
+public enum NodeType {
+  BST_INDEX_SCAN(IndexScanNode.class),
+  CREATE_TABLE(CreateTableNode.class),
+  DROP_TABLE(DropTableNode.class),
+  EXCEPT(ExceptNode.class),
+  EXPRS(EvalExprNode.class),
+  GROUP_BY(GroupbyNode.class),
+  INTERSECT(IntersectNode.class),
+  LIMIT(LimitNode.class),
+  JOIN(JoinNode.class),
+  PROJECTION(ProjectionNode.class),
+  RECEIVE(ReceiveNode.class),
+  ROOT(LogicalRootNode.class),
+  SEND(SendNode.class),
+  SCAN(ScanNode.class),
+  SELECTION(SelectionNode.class),
+  STORE(StoreTableNode.class),
+  SORT(SortNode.class),
+  UNION(UnionNode.class);
+
+  private final Class<? extends LogicalNode> baseClass;
+
+  NodeType(Class<? extends LogicalNode> baseClass) {
+    this.baseClass = baseClass;
+  }
+
+  public Class<? extends LogicalNode> getBaseClass() {
+    return this.baseClass;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/PipeType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/PipeType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/PipeType.java
new file mode 100644
index 0000000..0355b21
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/PipeType.java
@@ -0,0 +1,24 @@
+/**
+ * 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.planner.logical;
+
+public enum PipeType {
+  PULL,
+  PUSH
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
index 128bd43..90891bc 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ProjectionNode.java
@@ -42,7 +42,7 @@ public class ProjectionNode extends UnaryNode implements Projectable {
    * @param targets they should be all evaluated ones.
    */
 	public ProjectionNode(Target [] targets) {		
-		super(ExprType.PROJECTION);
+		super(NodeType.PROJECTION);
 		this.targets = targets;
 	}
 
@@ -60,8 +60,8 @@ public class ProjectionNode extends UnaryNode implements Projectable {
     return this.targets;
   }
 	
-	public void setSubNode(LogicalNode subNode) {
-	  super.setSubNode(subNode);
+	public void setChild(LogicalNode subNode) {
+	  super.setChild(subNode);
 	}
 	
 	public String toString() {
@@ -83,7 +83,7 @@ public class ProjectionNode extends UnaryNode implements Projectable {
 	  sb.append("\n  \"in schema\": ").append(getInSchema());
 	  sb.append("}");
 	  return sb.toString()+"\n"
-	      + getSubNode().toString();
+	      + getChild().toString();
 	}
 	
 	@Override
@@ -93,7 +93,7 @@ public class ProjectionNode extends UnaryNode implements Projectable {
 	    
 	    boolean b1 = super.equals(other);
 	    boolean b2 = Arrays.equals(targets, other.targets);
-	    boolean b3 = subExpr.equals(other.subExpr);
+	    boolean b3 = child.equals(other.child);
 	    
 	    return b1 && b2 && b3;
 	  } else {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ReceiveNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ReceiveNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ReceiveNode.java
new file mode 100644
index 0000000..1e566b0
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ReceiveNode.java
@@ -0,0 +1,122 @@
+/**
+ * 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.planner.logical;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.engine.json.CoreGsonHelper;
+import org.apache.tajo.engine.planner.logical.NodeType;
+import org.apache.tajo.engine.planner.logical.LogicalNode;
+import org.apache.tajo.engine.planner.logical.LogicalNodeVisitor;
+
+import java.net.URI;
+import java.util.*;
+import java.util.Map.Entry;
+
+public final class ReceiveNode extends LogicalNode implements Cloneable {
+  @Expose private PipeType pipeType;
+  @Expose private RepartitionType repaType;
+  @Expose private Map<String, List<URI>> fetchMap;
+
+  private ReceiveNode() {
+    super(NodeType.RECEIVE);
+  }
+  public ReceiveNode(PipeType pipeType, RepartitionType shuffleType) {
+    this();
+    this.pipeType = pipeType;
+    this.repaType = shuffleType;
+    this.fetchMap = Maps.newHashMap();
+  }
+
+  public PipeType getPipeType() {
+    return this.pipeType;
+  }
+
+  public RepartitionType getRepartitionType() {
+    return this.repaType;
+  }
+  
+  public void addData(String name, URI uri) {
+    if (fetchMap.containsKey(name)) {
+      fetchMap.get(name).add(uri);
+    } else {
+      fetchMap.put(name, Lists.newArrayList(uri));
+    }
+  }
+  
+  public Collection<URI> getSrcURIs(String name) {
+    return Collections.unmodifiableList(fetchMap.get(name));
+  }
+
+  public Collection<Entry<String, List<URI>>> getAllDataSet() {
+    return Collections.unmodifiableSet(fetchMap.entrySet());
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof ReceiveNode) {
+      ReceiveNode other = (ReceiveNode) obj;
+      return pipeType == other.pipeType && repaType == other.repaType;
+    } else {
+      return false;
+    }
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(pipeType, repaType);
+  }
+
+  @Override
+  public Object clone() throws CloneNotSupportedException {
+    ReceiveNode receive = (ReceiveNode) super.clone();
+    receive.pipeType = pipeType;
+    receive.repaType = repaType;
+    receive.fetchMap = Maps.newHashMap();
+    // Both String and URI are immutable, but a list is mutable.
+    for (Entry<String, List<URI>> entry : fetchMap.entrySet()) {
+      receive.fetchMap
+          .put(entry.getKey(), new ArrayList<URI>(entry.getValue()));
+    }
+
+    return receive;
+  }
+
+  @Override
+  public String toString() {
+    Gson gson = CoreGsonHelper.getPrettyInstance();
+    return gson.toJson(this);
+  }
+
+  @Override
+  public void preOrder(LogicalNodeVisitor visitor) {
+    visitor.visit(this);
+  }
+  
+  @Override
+  public void postOrder(LogicalNodeVisitor visitor) {
+    visitor.visit(this);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/RepartitionType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/RepartitionType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/RepartitionType.java
new file mode 100644
index 0000000..d317fb8
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/RepartitionType.java
@@ -0,0 +1,25 @@
+/**
+ * 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.planner.logical;
+
+public enum RepartitionType {
+  NONE,
+  HASH,
+  SORT
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
index 6b45e8a..584a697 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/ScanNode.java
@@ -39,7 +39,7 @@ public class ScanNode extends LogicalNode implements Projectable {
 	}
   
 	public ScanNode(FromTable table) {
-		super(ExprType.SCAN);
+		super(NodeType.SCAN);
 		this.table = table;
 		this.setInSchema(table.getSchema());
 		this.setOutSchema(table.getSchema());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
index 2bd1e81..2b2a0ac 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SelectionNode.java
@@ -29,7 +29,7 @@ public class SelectionNode extends UnaryNode implements Cloneable {
 	}
 	
 	public SelectionNode(EvalNode qual) {
-		super(ExprType.SELECTION);
+		super(NodeType.SELECTION);
 		setQual(qual);
 	}
 
@@ -48,7 +48,7 @@ public class SelectionNode extends UnaryNode implements Cloneable {
     sb.append("\n  \"in schema\": ").append(getInSchema()).append("}");
     
     return sb.toString()+"\n"
-    + getSubNode().toString();
+    + getChild().toString();
   }
   
   @Override
@@ -57,7 +57,7 @@ public class SelectionNode extends UnaryNode implements Cloneable {
       SelectionNode other = (SelectionNode) obj;
       return super.equals(other) 
           && this.qual.equals(other.qual)
-          && subExpr.equals(other.subExpr);
+          && child.equals(other.child);
     } else {
       return false;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SendNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SendNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SendNode.java
new file mode 100644
index 0000000..5456a77
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SendNode.java
@@ -0,0 +1,145 @@
+/**
+ * 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.planner.logical;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.catalog.Column;
+import org.apache.tajo.engine.json.CoreGsonHelper;
+import org.apache.tajo.engine.planner.logical.NodeType;
+import org.apache.tajo.engine.planner.logical.UnaryNode;
+import org.apache.tajo.util.TUtil;
+
+import java.net.URI;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * This logical node means that the worker sends intermediate data to 
+ * some destined one or more workers.
+ */
+public class SendNode extends UnaryNode {
+  @Expose private PipeType pipeType;
+  @Expose private RepartitionType repaType;
+  /** This will be used for pipeType == PUSH. */
+  @Expose private Map<Integer, URI> destURIs;
+  @Expose private Column[] partitionKeys;
+  @Expose private int numPartitions;
+
+  private SendNode() {
+    super(NodeType.SEND);
+  }
+  
+  public SendNode(PipeType pipeType, RepartitionType repaType) {
+    this();
+    this.pipeType = pipeType;
+    this.repaType = repaType;
+    this.destURIs = Maps.newHashMap();
+  }
+
+  public PipeType getPipeType() {
+    return this.pipeType;
+  }
+  
+  public RepartitionType getRepartitionType() {
+    return this.repaType;
+  }
+  
+  public URI getDestURI(int partition) {
+    return this.destURIs.get(partition);
+  }
+  
+  public void setPartitionKeys(Column [] keys, int numPartitions) {
+    Preconditions.checkState(repaType != RepartitionType.NONE,
+        "Hash or Sort repartition only requires the partition keys");
+    Preconditions.checkArgument(keys.length > 0, 
+        "At least one partition key must be specified.");
+    Preconditions.checkArgument(numPartitions > 0,
+        "The number of partitions must be positive: %s", numPartitions);
+    this.partitionKeys = keys;
+    this.numPartitions = numPartitions;
+  }
+  
+  public boolean hasPartitionKeys() {
+    return this.partitionKeys != null;
+  }
+  
+  public Column [] getPartitionKeys() {
+    return this.partitionKeys;
+  }
+  
+  public int getPartitionsNum() {
+    return this.numPartitions;
+  }
+  
+  public Iterator<Entry<Integer, URI>> getAllDestURIs() {
+    return this.destURIs.entrySet().iterator();
+  }
+  
+  public void putDestURI(int partition, URI uri) {
+    this.destURIs.put(partition, uri);
+  }
+  
+  public void setDestURIs(Map<Integer, URI> destURIs) {
+    this.destURIs = destURIs;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof SendNode) {
+      SendNode other = (SendNode) obj;
+      return pipeType == other.pipeType
+          && repaType == other.repaType
+          && TUtil.checkEquals(destURIs, other.destURIs);
+    } else {
+      return false;
+    }
+  }
+  
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(pipeType, repaType, destURIs);
+  }
+  
+  @Override
+  public Object clone() throws CloneNotSupportedException {
+    SendNode send = (SendNode) super.clone();
+    send.pipeType = pipeType;
+    send.repaType = repaType;
+    send.destURIs = Maps.newHashMap();
+    for (Entry<Integer, URI> entry : destURIs.entrySet()) {
+      send.destURIs.put(entry.getKey(), entry.getValue());
+    }
+    
+    return send;
+  }
+
+  @Override
+  public String toString() {
+    Gson gson = CoreGsonHelper.getPrettyInstance();
+    return gson.toJson(this);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
index 4efe842..e053c3c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/SortNode.java
@@ -33,7 +33,7 @@ public final class SortNode extends UnaryNode implements Cloneable {
 	}
 
   public SortNode(SortSpec[] sortKeys) {
-    super(ExprType.SORT);
+    super(NodeType.SORT);
     Preconditions.checkArgument(sortKeys.length > 0, 
         "At least one sort key must be specified");
     this.sortKeys = sortKeys;
@@ -55,7 +55,7 @@ public final class SortNode extends UnaryNode implements Cloneable {
       SortNode other = (SortNode) obj;
       boolean eq = super.equals(other);
       eq = eq && TUtil.checkEquals(sortKeys, other.sortKeys);
-      eq = eq && subExpr.equals(other.subExpr);
+      eq = eq && child.equals(other.child);
       return eq;
     } else {
       return false;
@@ -84,6 +84,6 @@ public final class SortNode extends UnaryNode implements Cloneable {
     sb.append("\n\"out schema: " + getOutSchema()
         + "\n\"in schema: " + getInSchema());
     return sb.toString()+"\n"
-        + getSubNode().toString();
+        + getChild().toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
index ec7b1b7..7bdb587 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
@@ -37,7 +37,7 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
   @Expose private Options options;
 
   public StoreTableNode(String tableName) {
-    super(ExprType.STORE);
+    super(NodeType.STORE);
     this.tableName = tableName;
     this.local = false;
   }
@@ -121,7 +121,7 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
       eq = eq && this.numPartitions == other.numPartitions;
       eq = eq && TUtil.checkEquals(partitionKeys, other.partitionKeys);
       eq = eq &&  TUtil.checkEquals(options, other.options);
-      eq = eq && subExpr.equals(other.subExpr);
+      eq = eq && child.equals(other.child);
       return eq;
     } else {
       return false;
@@ -162,6 +162,6 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
     .append("}");
     
     return sb.toString() + "\n"
-        + getSubNode().toString();
+        + getChild().toString();
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
index cd3aa1c..4380996 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnaryNode.java
@@ -25,7 +25,7 @@ import com.google.gson.annotations.Expose;
 
 
 public abstract class UnaryNode extends LogicalNode implements Cloneable {
-	@Expose LogicalNode subExpr;
+	@Expose LogicalNode child;
 	
 	public UnaryNode() {
 		super();
@@ -34,33 +34,33 @@ public abstract class UnaryNode extends LogicalNode implements Cloneable {
 	/**
 	 * @param type
 	 */
-	public UnaryNode(ExprType type) {
+	public UnaryNode(NodeType type) {
 		super(type);
 	}
 	
-	public void setSubNode(LogicalNode subNode) {
-		this.subExpr = subNode;
+	public void setChild(LogicalNode subNode) {
+		this.child = subNode;
 	}
 	
-	public LogicalNode getSubNode() {
-		return this.subExpr;
+	public LogicalNode getChild() {
+		return this.child;
 	}
 	
 	@Override
   public Object clone() throws CloneNotSupportedException {
 	  UnaryNode unary = (UnaryNode) super.clone();
-	  unary.subExpr = (LogicalNode) (subExpr == null ? null : subExpr.clone());
+	  unary.child = (LogicalNode) (child == null ? null : child.clone());
 	  
 	  return unary;
 	}
 	
 	public void preOrder(LogicalNodeVisitor visitor) {
 	  visitor.visit(this);
-	  subExpr.preOrder(visitor);
+	  child.preOrder(visitor);
   }
 	
 	public void postOrder(LogicalNodeVisitor visitor) {
-	  subExpr.postOrder(visitor);	  
+	  child.postOrder(visitor);
 	  visitor.visit(this);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
index d0ded08..c0aafbd 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/UnionNode.java
@@ -24,16 +24,16 @@ package org.apache.tajo.engine.planner.logical;
 public class UnionNode extends BinaryNode {
 
   public UnionNode() {
-    super(ExprType.UNION);
+    super(NodeType.UNION);
   }
 
   public UnionNode(LogicalNode outer, LogicalNode inner) {
     this();
-    setOuter(outer);
-    setInner(inner);
+    setLeftChild(outer);
+    setRightChild(inner);
   }
 
   public String toString() {
-    return getOuterNode().toString() + "\n UNION \n" + getInnerNode().toString();
+    return getLeftChild().toString() + "\n UNION \n" + getRightChild().toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/PipeType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/PipeType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/PipeType.java
deleted file mode 100644
index 849bd30..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/PipeType.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.planner.logical.extended;
-
-public enum PipeType {
-  PULL,
-  PUSH
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
deleted file mode 100644
index 94ecffe..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/ReceiveNode.java
+++ /dev/null
@@ -1,122 +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.planner.logical.extended;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gson.Gson;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.engine.json.CoreGsonHelper;
-import org.apache.tajo.engine.planner.logical.ExprType;
-import org.apache.tajo.engine.planner.logical.LogicalNode;
-import org.apache.tajo.engine.planner.logical.LogicalNodeVisitor;
-
-import java.net.URI;
-import java.util.*;
-import java.util.Map.Entry;
-
-public final class ReceiveNode extends LogicalNode implements Cloneable {
-  @Expose private PipeType pipeType;
-  @Expose private RepartitionType repaType;
-  @Expose private Map<String, List<URI>> fetchMap;
-
-  private ReceiveNode() {
-    super(ExprType.RECEIVE);
-  }
-  public ReceiveNode(PipeType pipeType, RepartitionType shuffleType) {
-    this();
-    this.pipeType = pipeType;
-    this.repaType = shuffleType;
-    this.fetchMap = Maps.newHashMap();
-  }
-
-  public PipeType getPipeType() {
-    return this.pipeType;
-  }
-
-  public RepartitionType getRepartitionType() {
-    return this.repaType;
-  }
-  
-  public void addData(String name, URI uri) {
-    if (fetchMap.containsKey(name)) {
-      fetchMap.get(name).add(uri);
-    } else {
-      fetchMap.put(name, Lists.newArrayList(uri));
-    }
-  }
-  
-  public Collection<URI> getSrcURIs(String name) {
-    return Collections.unmodifiableList(fetchMap.get(name));
-  }
-
-  public Collection<Entry<String, List<URI>>> getAllDataSet() {
-    return Collections.unmodifiableSet(fetchMap.entrySet());
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof ReceiveNode) {
-      ReceiveNode other = (ReceiveNode) obj;
-      return pipeType == other.pipeType && repaType == other.repaType;
-    } else {
-      return false;
-    }
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hashCode(pipeType, repaType);
-  }
-
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    ReceiveNode receive = (ReceiveNode) super.clone();
-    receive.pipeType = pipeType;
-    receive.repaType = repaType;
-    receive.fetchMap = Maps.newHashMap();
-    // Both String and URI are immutable, but a list is mutable.
-    for (Entry<String, List<URI>> entry : fetchMap.entrySet()) {
-      receive.fetchMap
-          .put(entry.getKey(), new ArrayList<URI>(entry.getValue()));
-    }
-
-    return receive;
-  }
-
-  @Override
-  public String toString() {
-    Gson gson = CoreGsonHelper.getPrettyInstance();
-    return gson.toJson(this);
-  }
-
-  @Override
-  public void preOrder(LogicalNodeVisitor visitor) {
-    visitor.visit(this);
-  }
-  
-  @Override
-  public void postOrder(LogicalNodeVisitor visitor) {
-    visitor.visit(this);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/RepartitionType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/RepartitionType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/RepartitionType.java
deleted file mode 100644
index e46c55e..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/RepartitionType.java
+++ /dev/null
@@ -1,25 +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.planner.logical.extended;
-
-public enum RepartitionType {
-  NONE,
-  HASH,
-  SORT
-}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/49607a54/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
deleted file mode 100644
index 8d9064e..0000000
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/extended/SendNode.java
+++ /dev/null
@@ -1,145 +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.planner.logical.extended;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Maps;
-import com.google.gson.Gson;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.json.CoreGsonHelper;
-import org.apache.tajo.engine.planner.logical.ExprType;
-import org.apache.tajo.engine.planner.logical.UnaryNode;
-import org.apache.tajo.util.TUtil;
-
-import java.net.URI;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * This logical node means that the worker sends intermediate data to 
- * some destined one or more workers.
- */
-public class SendNode extends UnaryNode {
-  @Expose private PipeType pipeType;
-  @Expose private RepartitionType repaType;
-  /** This will be used for pipeType == PUSH. */
-  @Expose private Map<Integer, URI> destURIs;
-  @Expose private Column[] partitionKeys;
-  @Expose private int numPartitions;
-
-  private SendNode() {
-    super(ExprType.SEND);
-  }
-  
-  public SendNode(PipeType pipeType, RepartitionType repaType) {
-    this();
-    this.pipeType = pipeType;
-    this.repaType = repaType;
-    this.destURIs = Maps.newHashMap();
-  }
-
-  public PipeType getPipeType() {
-    return this.pipeType;
-  }
-  
-  public RepartitionType getRepartitionType() {
-    return this.repaType;
-  }
-  
-  public URI getDestURI(int partition) {
-    return this.destURIs.get(partition);
-  }
-  
-  public void setPartitionKeys(Column [] keys, int numPartitions) {
-    Preconditions.checkState(repaType != RepartitionType.NONE,
-        "Hash or Sort repartition only requires the partition keys");
-    Preconditions.checkArgument(keys.length > 0, 
-        "At least one partition key must be specified.");
-    Preconditions.checkArgument(numPartitions > 0,
-        "The number of partitions must be positive: %s", numPartitions);
-    this.partitionKeys = keys;
-    this.numPartitions = numPartitions;
-  }
-  
-  public boolean hasPartitionKeys() {
-    return this.partitionKeys != null;
-  }
-  
-  public Column [] getPartitionKeys() {
-    return this.partitionKeys;
-  }
-  
-  public int getPartitionsNum() {
-    return this.numPartitions;
-  }
-  
-  public Iterator<Entry<Integer, URI>> getAllDestURIs() {
-    return this.destURIs.entrySet().iterator();
-  }
-  
-  public void putDestURI(int partition, URI uri) {
-    this.destURIs.put(partition, uri);
-  }
-  
-  public void setDestURIs(Map<Integer, URI> destURIs) {
-    this.destURIs = destURIs;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof SendNode) {
-      SendNode other = (SendNode) obj;
-      return pipeType == other.pipeType
-          && repaType == other.repaType
-          && TUtil.checkEquals(destURIs, other.destURIs);
-    } else {
-      return false;
-    }
-  }
-  
-  @Override
-  public int hashCode() {
-    return Objects.hashCode(pipeType, repaType, destURIs);
-  }
-  
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    SendNode send = (SendNode) super.clone();
-    send.pipeType = pipeType;
-    send.repaType = repaType;
-    send.destURIs = Maps.newHashMap();
-    for (Entry<Integer, URI> entry : destURIs.entrySet()) {
-      send.destURIs.put(entry.getKey(), entry.getValue());
-    }
-    
-    return send;
-  }
-
-  @Override
-  public String toString() {
-    Gson gson = CoreGsonHelper.getPrettyInstance();
-    return gson.toJson(this);
-  }
-}
\ No newline at end of file