You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/03/23 03:56:10 UTC

[1/9] tajo git commit: TAJO-1368: Exceptions during processing nested union queries

Repository: tajo
Updated Branches:
  refs/heads/index_support 60cbe9cac -> d09bd8ddc


TAJO-1368: Exceptions during processing nested union queries

Closes #402


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

Branch: refs/heads/index_support
Commit: 725448c5249cd8691ea167f595237ed7bcc22293
Parents: a9ae3ca
Author: Jihun Kang <ji...@apache.org>
Authored: Thu Mar 19 09:24:55 2015 +0900
Committer: Jihun Kang <ji...@apache.org>
Committed: Thu Mar 19 09:24:55 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  3 +
 .../engine/planner/global/GlobalPlanner.java    | 39 +++++++++---
 .../java/org/apache/tajo/querymaster/Stage.java |  3 +-
 .../apache/tajo/engine/query/TestCTASQuery.java | 28 +++++++++
 .../tajo/engine/query/TestUnionQuery.java       | 64 +++++++++++++++++++-
 .../TestCTASQuery/CtasWithMultipleUnions.sql    | 12 ++++
 .../testCtasWithMultipleUnions.sql              |  1 +
 7 files changed, 140 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 4875cab..56d77b3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -32,6 +32,9 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1368: Exceptions during processing nested union queries.
+    (jihun)
+
     TAJO-1405: Fix some illegal way of usages on connection pool. 
     (Contributed by navis, Committed by Keuntae Park)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
index 15d8034..d2ac6cc 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
@@ -23,6 +23,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.Path;
@@ -821,7 +822,7 @@ public class GlobalPlanner {
 
   public static boolean hasUnionChild(UnaryNode node) {
 
-    // there are two cases:
+    // there are three cases:
     //
     // The first case is:
     //
@@ -835,9 +836,15 @@ public class GlobalPlanner {
     // select avg(..) from (select ... UNION select ) T
     //
     // We can generalize this case as 'a shuffle required operator on the top of union'.
+    //
+    // The third case is:
+    //
+    // create table select * from ( select ... ) a union all select * from ( select ... ) b
 
-    if (node.getChild() instanceof UnaryNode) { // first case
-      UnaryNode child = node.getChild();
+    LogicalNode childNode = node.getChild();
+
+    if (childNode instanceof UnaryNode) { // first case
+      UnaryNode child = (UnaryNode) childNode;
 
       if (child.getChild().getType() == NodeType.PROJECTION) {
         child = child.getChild();
@@ -848,9 +855,11 @@ public class GlobalPlanner {
         return tableSubQuery.getSubQuery().getType() == NodeType.UNION;
       }
 
-    } else if (node.getChild().getType() == NodeType.TABLE_SUBQUERY) { // second case
+    } else if (childNode.getType() == NodeType.TABLE_SUBQUERY) { // second case
       TableSubQueryNode tableSubQuery = node.getChild();
       return tableSubQuery.getSubQuery().getType() == NodeType.UNION;
+    } else if (childNode.getType() == NodeType.UNION) { // third case
+      return true;
     }
 
     return false;
@@ -1156,6 +1165,9 @@ public class GlobalPlanner {
           ((TableSubQueryNode)child).getSubQuery().getType() == NodeType.UNION) {
         MasterPlan masterPlan = context.plan;
         for (DataChannel dataChannel : masterPlan.getIncomingChannels(execBlock.getId())) {
+          // This data channel will be stored in staging directory, but RawFile, default file type, does not support
+          // distributed file system. It needs to change the file format for distributed file system.
+          dataChannel.setStoreType(CatalogProtos.StoreType.CSV);
           ExecutionBlock subBlock = masterPlan.getExecBlock(dataChannel.getSrcId());
 
           ProjectionNode copy = PlannerUtil.clone(plan, node);
@@ -1371,18 +1383,28 @@ public class GlobalPlanner {
       LogicalPlan.QueryBlock rightQueryBlock = plan.getBlock(node.getRightChild());
       LogicalNode rightChild = visit(context, plan, rightQueryBlock, rightQueryBlock.getRoot(), stack);
       stack.pop();
+      
+      MasterPlan masterPlan = context.getPlan();
 
       List<ExecutionBlock> unionBlocks = Lists.newArrayList();
       List<ExecutionBlock> queryBlockBlocks = Lists.newArrayList();
 
       ExecutionBlock leftBlock = context.execBlockMap.remove(leftChild.getPID());
       ExecutionBlock rightBlock = context.execBlockMap.remove(rightChild.getPID());
-      if (leftChild.getType() == NodeType.UNION) {
+
+      // These union types need to eliminate unnecessary nodes between parent and child node of query tree.
+      boolean leftUnion = (leftChild.getType() == NodeType.UNION) ||
+          ((leftChild.getType() == NodeType.TABLE_SUBQUERY) &&
+          (((TableSubQueryNode)leftChild).getSubQuery().getType() == NodeType.UNION));
+      boolean rightUnion = (rightChild.getType() == NodeType.UNION) ||
+          (rightChild.getType() == NodeType.TABLE_SUBQUERY) &&
+          (((TableSubQueryNode)rightChild).getSubQuery().getType() == NodeType.UNION);
+      if (leftUnion) {
         unionBlocks.add(leftBlock);
       } else {
         queryBlockBlocks.add(leftBlock);
       }
-      if (rightChild.getType() == NodeType.UNION) {
+      if (rightUnion) {
         unionBlocks.add(rightBlock);
       } else {
         queryBlockBlocks.add(rightBlock);
@@ -1396,7 +1418,8 @@ public class GlobalPlanner {
       }
 
       for (ExecutionBlock childBlocks : unionBlocks) {
-        for (ExecutionBlock grandChildBlock : context.plan.getChilds(childBlocks)) {
+        for (ExecutionBlock grandChildBlock : masterPlan.getChilds(childBlocks)) {
+          masterPlan.disconnect(grandChildBlock, childBlocks);
           queryBlockBlocks.add(grandChildBlock);
         }
       }
@@ -1404,7 +1427,7 @@ public class GlobalPlanner {
       for (ExecutionBlock childBlocks : queryBlockBlocks) {
         DataChannel channel = new DataChannel(childBlocks, execBlock, NONE_SHUFFLE, 1);
         channel.setStoreType(storeType);
-        context.plan.addConnect(channel);
+        masterPlan.addConnect(channel);
       }
 
       context.execBlockMap.put(node.getPID(), execBlock);

http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
index 4e1f716..20add9f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
@@ -780,7 +780,8 @@ public class Stage implements EventHandler<StageEvent> {
       try {
         // Union operator does not require actual query processing. It is performed logically.
         if (execBlock.hasUnion()) {
-          stage.finalizeStats();
+          // Though union operator does not be processed at all, but it should handle the completion event.
+          stage.complete();
           state = StageState.SUCCEEDED;
         } else {
           ExecutionBlock parent = stage.getMasterPlan().getParent(stage.getBlock());

http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCTASQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCTASQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCTASQuery.java
index e93d214..18c9fbc 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCTASQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCTASQuery.java
@@ -182,6 +182,34 @@ public class TestCTASQuery extends QueryTestCaseBase {
   }
 
   @Test
+  public final void testCtasWithMultipleUnions() throws Exception {
+    ResultSet res = executeFile("CtasWithMultipleUnions.sql");
+    res.close();
+
+    ResultSet res2 = executeQuery();
+    String actual = resultSetToString(res2);
+    res2.close();
+
+    String expected = "c_custkey,c_nationkey\n" +
+        "-------------------------------\n" +
+        "1,15\n" +
+        "2,13\n" +
+        "3,1\n" +
+        "4,4\n" +
+        "5,3\n" +
+        "1,15\n" +
+        "2,13\n" +
+        "3,1\n" +
+        "4,4\n" +
+        "5,3\n";
+
+    assertEquals(expected, actual);
+
+    TableDesc desc = client.getTableDesc(CatalogUtil.normalizeIdentifier(res2.getMetaData().getTableName(1)));
+    assertNotNull(desc);
+  }
+
+  @Test
   public final void testCtasWithStoreType() throws Exception {
     ResultSet res = executeFile("CtasWithStoreType.sql");
     res.close();

http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
index d46d110..03a80d1 100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
@@ -450,4 +450,66 @@ public class TestUnionQuery extends QueryTestCaseBase {
     assertEquals(expected, resultSetToString(res));
     res.close();
   }
-}
\ No newline at end of file
+
+  @Test
+  public void testTajo1368Case1() throws Exception {
+    ResultSet res = executeString(
+        "select * from " +
+            "   (select c_custkey, c_nationkey from customer where c_nationkey < 0 " +
+            "   union all " +
+            "   select c_custkey, c_nationkey from customer where c_nationkey > 0 " +
+            ") a " +
+            "union all " +
+            "select * from " +
+            "   (select c_custkey, c_nationkey from customer where c_nationkey < 0 " +
+            "   union all " +
+            "   select c_custkey, c_nationkey from customer where c_nationkey > 0 " +
+            ") b ");
+
+    String expected = "c_custkey,c_nationkey\n" +
+        "-------------------------------\n" +
+        "1,15\n" +
+        "2,13\n" +
+        "3,1\n" +
+        "4,4\n" +
+        "5,3\n" +
+        "1,15\n" +
+        "2,13\n" +
+        "3,1\n" +
+        "4,4\n" +
+        "5,3\n";
+
+    assertEquals(expected, resultSetToString(res));
+    res.close();
+  }
+
+  @Test
+  public void testTajo1368Case2() throws Exception {
+    ResultSet res = executeString("select * from ( "+
+        "select c_custkey, c_nationkey from ( " +
+        "select c_custkey, c_nationkey from ( " +
+        "select c_custkey, c_nationkey from customer) a " +
+        "union all " +
+        "select c_custkey, c_nationkey from ( " +
+        "select c_custkey, c_nationkey from customer) a " +
+        " ) a " +
+        " ) a ");
+
+    String expected = "c_custkey,c_nationkey\n" +
+        "-------------------------------\n" +
+        "1,15\n" +
+        "2,13\n" +
+        "3,1\n" +
+        "4,4\n" +
+        "5,3\n" +
+        "1,15\n" +
+        "2,13\n" +
+        "3,1\n" +
+        "4,4\n" +
+        "5,3\n";
+
+    assertEquals(expected, resultSetToString(res));
+    res.close();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/tajo-core/src/test/resources/queries/TestCTASQuery/CtasWithMultipleUnions.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestCTASQuery/CtasWithMultipleUnions.sql b/tajo-core/src/test/resources/queries/TestCTASQuery/CtasWithMultipleUnions.sql
new file mode 100644
index 0000000..7176a2a
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestCTASQuery/CtasWithMultipleUnions.sql
@@ -0,0 +1,12 @@
+create table testCtasWithMultipleUnions as
+select * from
+   (select c_custkey, c_nationkey from customer where c_nationkey < 0
+   union all
+   select c_custkey, c_nationkey from customer where c_nationkey > 0
+) a
+union all
+select * from
+   (select c_custkey, c_nationkey from customer where c_nationkey < 0
+   union all
+   select c_custkey, c_nationkey from customer where c_nationkey > 0
+) b;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/725448c5/tajo-core/src/test/resources/queries/TestCTASQuery/testCtasWithMultipleUnions.sql
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/resources/queries/TestCTASQuery/testCtasWithMultipleUnions.sql b/tajo-core/src/test/resources/queries/TestCTASQuery/testCtasWithMultipleUnions.sql
new file mode 100644
index 0000000..71b7034
--- /dev/null
+++ b/tajo-core/src/test/resources/queries/TestCTASQuery/testCtasWithMultipleUnions.sql
@@ -0,0 +1 @@
+select * from testCtasWithMultipleUnions;
\ No newline at end of file


[6/9] tajo git commit: TAJO-1439: Some method name is written wrongly. (Contributed by Jongyoung Park. Committed by jihoon)

Posted by ji...@apache.org.
TAJO-1439: Some method name is written wrongly. (Contributed by Jongyoung Park. Committed by jihoon)

Closes #444


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

Branch: refs/heads/index_support
Commit: 3aaff387c29adf1949d0a6ac4f0d6d7c7388f238
Parents: 154f5b9
Author: Jihoon Son <ji...@apache.org>
Authored: Sat Mar 21 18:31:38 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Sat Mar 21 18:31:57 2015 +0900

----------------------------------------------------------------------
 CHANGES                                                           | 3 +++
 .../src/main/java/org/apache/tajo/master/QueryInProgress.java     | 2 +-
 tajo-core/src/main/java/org/apache/tajo/master/QueryManager.java  | 2 +-
 3 files changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/3aaff387/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 38bd330..e3636e6 100644
--- a/CHANGES
+++ b/CHANGES
@@ -71,6 +71,9 @@ Release 0.11.0 - unreleased
   
   TASKS
 
+    TAJO-1439: Some method name is written wrongly. 
+    (Contributed by Jongyoung Park. Committed by jihoon)
+
     TAJO-1398: Fix 'Getting Started' link error from 0.9.0 into 0.10.0. 
     (Contributed by Dongjoon Hyun, Committed by jihoon)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/3aaff387/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java b/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java
index bfc7b9f..c24dd90 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/QueryInProgress.java
@@ -156,7 +156,7 @@ public class QueryInProgress {
     queryMasterRpcClient = queryMasterRpc.getStub();
   }
 
-  public void submmitQueryToMaster() {
+  public void submitQueryToMaster() {
     if(querySubmitted.get()) {
       return;
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/3aaff387/tajo-core/src/main/java/org/apache/tajo/master/QueryManager.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/QueryManager.java b/tajo-core/src/main/java/org/apache/tajo/master/QueryManager.java
index 3c81540..b1fa17d 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/QueryManager.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/QueryManager.java
@@ -221,7 +221,7 @@ public class QueryManager extends CompositeService {
       }
 
       if (event.getType() == QueryJobEvent.Type.QUERY_MASTER_START) {
-        queryInProgress.submmitQueryToMaster();
+        queryInProgress.submitQueryToMaster();
 
       } else if (event.getType() == QueryJobEvent.Type.QUERY_JOB_KILL) {
         scheduler.removeQuery(queryInProgress.getQueryId());


[3/9] tajo git commit: TAJO-1418 Comment on TAJO_PULLSERVER_STANDALONE in tajo-env.sh is not consistent.

Posted by ji...@apache.org.
TAJO-1418 Comment on TAJO_PULLSERVER_STANDALONE in tajo-env.sh is not consistent.

Closes #438

Signed-off-by: Hyunsik Choi <hy...@apache.org>


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

Branch: refs/heads/index_support
Commit: 797138e61bf692de455f0a38580793cd190f46d5
Parents: e15ac7e
Author: navis.ryu <na...@apache.org>
Authored: Thu Mar 19 14:42:29 2015 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu Mar 19 18:52:28 2015 -0700

----------------------------------------------------------------------
 CHANGES                             | 3 +++
 tajo-dist/src/main/conf/tajo-env.sh | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/797138e6/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 6ae53f6..fc18306 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1418: Comment on TAJO_PULLSERVER_STANDALONE in tajo-env.sh 
+    is not consistent. (Contributed by navis, Committed by hyunsik)
+
     TAJO-1381: Support multi-bytes delimiter for Text file.
     (Contributed by navis, Committed by jinho)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/797138e6/tajo-dist/src/main/conf/tajo-env.sh
----------------------------------------------------------------------
diff --git a/tajo-dist/src/main/conf/tajo-env.sh b/tajo-dist/src/main/conf/tajo-env.sh
index 4a8e2b2..cbb881e 100755
--- a/tajo-dist/src/main/conf/tajo-env.sh
+++ b/tajo-dist/src/main/conf/tajo-env.sh
@@ -79,7 +79,7 @@ export TAJO_WORKER_STANDBY_MODE=true
 # export HIVE_HOME=
 # export HIVE_JDBC_DRIVER_DIR=
 
-# Tajo PullServer mode. the default mode is standalone mode
+# Tajo PullServer mode. the default is embedded mode (in worker)
 # export TAJO_PULLSERVER_STANDALONE=false
 
 # It must be required to use HBase


[8/9] tajo git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support

Posted by ji...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support


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

Branch: refs/heads/index_support
Commit: fd2f8281dd0efcf07322ae94086a1a72ad8b5f87
Parents: 63c8e1c 8d0146b
Author: Jihoon Son <ji...@apache.org>
Authored: Mon Mar 23 11:55:25 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Mon Mar 23 11:55:25 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  39 +++
 tajo-catalog/tajo-catalog-client/pom.xml        |   2 +-
 .../tajo-catalog-drivers/tajo-hcatalog/pom.xml  |   2 +-
 tajo-catalog/tajo-catalog-server/pom.xml        |   2 +-
 tajo-cli/pom.xml                                |   2 +-
 .../org/apache/tajo/cli/tools/TajoAdmin.java    |   1 -
 .../org/apache/tajo/cli/tools/TajoGetConf.java  |   5 -
 .../org/apache/tajo/cli/tools/TajoHAAdmin.java  |   5 -
 .../cli/tsql/DefaultTajoCliOutputFormatter.java |   2 +-
 .../org/apache/tajo/cli/tsql/SimpleParser.java  |   3 +-
 .../java/org/apache/tajo/cli/tsql/TajoCli.java  |  10 +-
 tajo-client/pom.xml                             |   2 +-
 .../apache/tajo/client/SessionConnection.java   |  20 +-
 .../java/org/apache/tajo/conf/TajoConf.java     |   2 +
 .../java/org/apache/tajo/util/BytesUtils.java   | 159 +++++----
 .../java/org/apache/tajo/util/StringUtils.java  |   6 +-
 .../org/apache/tajo/util/TestStringUtil.java    |   4 +-
 tajo-core/pom.xml                               |   2 +-
 .../engine/planner/global/GlobalPlanner.java    |  39 ++-
 .../engine/planner/physical/HashJoinExec.java   |  51 ++-
 .../planner/physical/HashLeftOuterJoinExec.java |  74 +++-
 .../physical/PartitionMergeScanExec.java        |  17 +-
 .../tajo/engine/planner/physical/ScanExec.java  |  72 ++++
 .../engine/planner/physical/SeqScanExec.java    | 105 +-----
 .../apache/tajo/engine/utils/CacheHolder.java   |  97 ++++++
 .../apache/tajo/engine/utils/TableCache.java    |  84 +++++
 .../apache/tajo/engine/utils/TableCacheKey.java |  57 +++
 .../apache/tajo/engine/utils/TupleCache.java    | 122 -------
 .../apache/tajo/engine/utils/TupleCacheKey.java |  57 ---
 .../org/apache/tajo/master/QueryInProgress.java |   2 +-
 .../org/apache/tajo/master/QueryManager.java    |   2 +-
 .../exec/NonForwardQueryResultFileScanner.java  |  37 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   5 +
 .../java/org/apache/tajo/querymaster/Stage.java |   3 +-
 .../tajo/worker/ExecutionBlockContext.java      |  43 ++-
 .../worker/ExecutionBlockSharedResource.java    |  26 ++
 .../main/java/org/apache/tajo/worker/Task.java  |  75 ++--
 .../apache/tajo/worker/TaskAttemptContext.java  |   2 +-
 .../java/org/apache/tajo/worker/TaskRunner.java |   9 +-
 .../apache/tajo/worker/TaskRunnerManager.java   |   4 +-
 .../apache/tajo/engine/eval/ExprTestBase.java   |   5 +-
 .../apache/tajo/engine/query/TestCTASQuery.java |  28 ++
 .../tajo/engine/query/TestSelectQuery.java      |  48 +++
 .../tajo/engine/query/TestUnionQuery.java       |  64 +++-
 .../apache/tajo/engine/util/TestTableCache.java | 109 ++++++
 .../apache/tajo/engine/util/TestTupleCache.java |  89 -----
 .../apache/tajo/master/TestGlobalPlanner.java   |   3 +-
 .../multibytes_delimiter1/table1.tbl            |   5 +
 .../multibytes_delimiter2/table2.tbl            |   5 +
 .../TestCTASQuery/CtasWithMultipleUnions.sql    |  12 +
 .../testCtasWithMultipleUnions.sql              |   1 +
 .../multibytes_delimiter_table1_ddl.sql         |   3 +
 .../multibytes_delimiter_table2_ddl.sql         |   3 +
 .../multibytes_delimiter_table3_ddl.sql         |   3 +
 .../multibytes_delimiter_table4_ddl.sql         |   3 +
 .../testMultiBytesDelimiter1.sql                |   1 +
 .../testMultiBytesDelimiter2.sql                |   1 +
 .../testMultiBytesDelimiter3.sql                |   1 +
 .../testMultiBytesDelimiter4.sql                |   1 +
 .../testMultiBytesDelimiter1.result             |   7 +
 .../testMultiBytesDelimiter2.result             |   7 +
 .../testMultiBytesDelimiter3.result             |   7 +
 .../testMultiBytesDelimiter4.result             |   7 +
 tajo-dist/pom.xml                               |   7 +-
 tajo-dist/src/main/conf/tajo-env.sh             |   2 +-
 .../org/apache/tajo/plan/ExprAnnotator.java     |   2 +-
 .../java/org/apache/tajo/plan/LogicalPlan.java  |   2 -
 .../plan/expr/AggregationFunctionCallEval.java  |  14 +
 .../apache/tajo/plan/expr/AlgebraicUtil.java    |   5 +
 .../tajo/plan/expr/BetweenPredicateEval.java    |  14 +
 .../org/apache/tajo/plan/expr/CaseWhenEval.java |  25 +-
 .../org/apache/tajo/plan/expr/CastEval.java     |  10 +
 .../org/apache/tajo/plan/expr/EvalTreeUtil.java |  66 +++-
 .../java/org/apache/tajo/plan/expr/InEval.java  |  10 +
 .../org/apache/tajo/plan/expr/IsNullEval.java   |   9 +
 .../tajo/plan/expr/PartialBinaryExpr.java       |   5 +-
 .../tajo/plan/expr/RegexPredicateEval.java      |  25 ++
 .../apache/tajo/plan/expr/RowConstantEval.java  |  11 +
 .../tajo/plan/expr/WindowFunctionEval.java      |  14 +
 .../GreedyHeuristicJoinOrderAlgorithm.java      |   4 +-
 .../tajo/plan/logical/AlterTableNode.java       |  14 +
 .../tajo/plan/logical/DistinctGroupbyNode.java  |  17 +-
 .../apache/tajo/plan/logical/EvalExprNode.java  |  18 +-
 .../apache/tajo/plan/logical/GroupbyNode.java   |  16 +-
 .../apache/tajo/plan/logical/HavingNode.java    |   9 +
 .../apache/tajo/plan/logical/IndexScanNode.java |  13 +
 .../apache/tajo/plan/logical/InsertNode.java    |  13 +
 .../org/apache/tajo/plan/logical/JoinNode.java  |  13 +
 .../org/apache/tajo/plan/logical/LimitNode.java |  11 +-
 .../apache/tajo/plan/logical/LogicalNode.java   |  27 +-
 .../tajo/plan/logical/PersistentStoreNode.java  |  10 +
 .../tajo/plan/logical/ProjectionNode.java       |  28 +-
 .../apache/tajo/plan/logical/SelectionNode.java |   9 +
 .../tajo/plan/logical/ShuffleFileWriteNode.java |  13 +
 .../org/apache/tajo/plan/logical/SortNode.java  |  14 +-
 .../tajo/plan/logical/StoreTableNode.java       |  10 +
 .../tajo/plan/nameresolver/NameResolver.java    |   4 +-
 .../plan/rewrite/rules/FilterPushDownRule.java  |  10 +-
 .../tajo/plan/serder/EvalNodeDeserializer.java  |  17 +-
 .../plan/serder/LogicalNodeDeserializer.java    |   3 +
 .../tajo/plan/serder/LogicalNodeSerializer.java |   2 +
 .../org/apache/tajo/plan/util/PlannerUtil.java  |  26 +-
 .../tajo/plan/verifier/LogicalPlanVerifier.java |   7 -
 .../plan/verifier/PreLogicalPlanVerifier.java   |  19 +-
 .../plan/visitor/BasicLogicalPlanVisitor.java   |   6 +-
 tajo-plan/src/main/proto/Plan.proto             |   1 +
 tajo-project/pom.xml                            |  31 ++
 tajo-project/src/site/site.xml                  |   2 +-
 tajo-pullserver/pom.xml                         |   2 +-
 tajo-rpc/pom.xml                                | 180 ++--------
 .../org/apache/tajo/rpc/AsyncRpcClient.java     | 267 --------------
 .../org/apache/tajo/rpc/AsyncRpcServer.java     | 148 --------
 .../org/apache/tajo/rpc/BlockingRpcClient.java  | 315 -----------------
 .../org/apache/tajo/rpc/BlockingRpcServer.java  | 147 --------
 .../java/org/apache/tajo/rpc/CallFuture.java    |  84 -----
 .../apache/tajo/rpc/DefaultRpcController.java   |  65 ----
 .../org/apache/tajo/rpc/NettyClientBase.java    | 173 ---------
 .../org/apache/tajo/rpc/NettyRpcController.java |  63 ----
 .../org/apache/tajo/rpc/NettyServerBase.java    | 205 -----------
 .../java/org/apache/tajo/rpc/NullCallback.java  |  38 --
 .../tajo/rpc/ProtoChannelInitializer.java       |  50 ---
 .../apache/tajo/rpc/RemoteCallException.java    |  69 ----
 .../org/apache/tajo/rpc/RemoteException.java    |  37 --
 .../tajo/rpc/RetriesExhaustedException.java     | 104 ------
 .../org/apache/tajo/rpc/RpcChannelFactory.java  | 182 ----------
 .../org/apache/tajo/rpc/RpcConnectionPool.java  | 194 -----------
 .../main/java/org/apache/tajo/rpc/RpcUtils.java |  68 ----
 .../org/apache/tajo/rpc/ServerCallable.java     | 162 ---------
 .../apache/tajo/rpc/TajoServiceException.java   |  58 ---
 tajo-rpc/src/main/proto/DummyProtos.proto       |  47 ---
 tajo-rpc/src/main/proto/RpcProtos.proto         |  32 --
 tajo-rpc/src/main/proto/TestProtocol.proto      |  31 --
 tajo-rpc/src/main/proto/TestProtos.proto        |  35 --
 tajo-rpc/src/test/java/log4j.properties         |  25 --
 .../java/org/apache/tajo/rpc/TestAsyncRpc.java  | 339 ------------------
 .../org/apache/tajo/rpc/TestBlockingRpc.java    | 341 ------------------
 .../rpc/test/impl/DummyProtocolAsyncImpl.java   |  86 -----
 .../test/impl/DummyProtocolBlockingImpl.java    |  83 -----
 tajo-rpc/tajo-rpc-common/pom.xml                | 216 ++++++++++++
 .../org/apache/tajo/rpc/NettyServerBase.java    | 243 +++++++++++++
 .../org/apache/tajo/rpc/RemoteException.java    |  37 ++
 .../tajo/rpc/RetriesExhaustedException.java     | 104 ++++++
 .../org/apache/tajo/rpc/RpcChannelFactory.java  | 182 ++++++++++
 .../org/apache/tajo/rpc/RpcEventListener.java   |  62 ++++
 .../main/java/org/apache/tajo/rpc/RpcUtils.java | 122 +++++++
 tajo-rpc/tajo-rpc-protobuf/pom.xml              | 274 +++++++++++++++
 .../org/apache/tajo/rpc/AsyncRpcClient.java     | 227 ++++++++++++
 .../org/apache/tajo/rpc/AsyncRpcServer.java     | 148 ++++++++
 .../org/apache/tajo/rpc/BlockingRpcClient.java  | 273 +++++++++++++++
 .../org/apache/tajo/rpc/BlockingRpcServer.java  | 147 ++++++++
 .../java/org/apache/tajo/rpc/CallFuture.java    |  84 +++++
 .../apache/tajo/rpc/DefaultRpcController.java   |  65 ++++
 .../org/apache/tajo/rpc/NettyClientBase.java    | 221 ++++++++++++
 .../org/apache/tajo/rpc/NettyRpcController.java |  63 ++++
 .../java/org/apache/tajo/rpc/NullCallback.java  |  38 ++
 .../tajo/rpc/ProtoChannelInitializer.java       |  50 +++
 .../apache/tajo/rpc/RemoteCallException.java    |  69 ++++
 .../tajo/rpc/RetriesExhaustedException.java     | 104 ++++++
 .../org/apache/tajo/rpc/RpcConnectionPool.java  | 190 ++++++++++
 .../org/apache/tajo/rpc/ServerCallable.java     | 162 +++++++++
 .../apache/tajo/rpc/TajoServiceException.java   |  58 +++
 .../src/main/proto/DummyProtos.proto            |  47 +++
 .../src/main/proto/RpcProtos.proto              |  32 ++
 .../src/main/proto/TestProtocol.proto           |  31 ++
 .../src/main/proto/TestProtos.proto             |  35 ++
 .../src/test/java/log4j.properties              |  25 ++
 .../java/org/apache/tajo/rpc/TestAsyncRpc.java  | 345 ++++++++++++++++++
 .../org/apache/tajo/rpc/TestBlockingRpc.java    | 349 +++++++++++++++++++
 .../rpc/test/impl/DummyProtocolAsyncImpl.java   |  86 +++++
 .../test/impl/DummyProtocolBlockingImpl.java    |  83 +++++
 tajo-rpc/tajo-ws-rs/pom.xml                     | 218 ++++++++++++
 .../rs/netty/NettyRestChannelInitializer.java   |  50 +++
 .../ws/rs/netty/NettyRestHandlerContainer.java  | 319 +++++++++++++++++
 .../NettyRestHandlerContainerProvider.java      |  42 +++
 .../tajo/ws/rs/netty/NettyRestServer.java       |  67 ++++
 .../ws/rs/netty/NettyRestServerFactory.java     |  89 +++++
 .../ws/rs/netty/NettyRestServerListener.java    |  72 ++++
 .../tajo/ws/rs/netty/gson/GsonFeature.java      |  34 ++
 .../tajo/ws/rs/netty/gson/GsonReader.java       |  52 +++
 .../apache/tajo/ws/rs/netty/gson/GsonUtil.java  |  32 ++
 .../tajo/ws/rs/netty/gson/GsonWriter.java       |  59 ++++
 .../NettyRestHandlerContainerProviderTest.java  |  66 ++++
 .../tajo/ws/rs/netty/NettyRestServerTest.java   | 137 ++++++++
 .../ws/rs/netty/testapp1/TestApplication1.java  |  38 ++
 .../ws/rs/netty/testapp1/TestResource1.java     |  36 ++
 .../ws/rs/netty/testapp2/DirectoriesDao.java    |  39 +++
 .../rs/netty/testapp2/DirectoriesResource.java  |  85 +++++
 .../tajo/ws/rs/netty/testapp2/Directory.java    |  52 +++
 .../testapp2/FileManagementApplication.java     |  35 ++
 .../org/apache/tajo/storage/TestLazyTuple.java  |   4 +-
 .../tajo/storage/hbase/ColumnMapping.java       |   6 +-
 .../apache/tajo/storage/hbase/HBaseScanner.java |   3 +-
 .../tajo/storage/hbase/HBaseStorageManager.java |   3 +-
 .../java/org/apache/tajo/storage/CSVFile.java   |  21 +-
 .../apache/tajo/storage/FileStorageManager.java |  27 +-
 .../sequencefile/SequenceFileScanner.java       |   3 +-
 .../tajo/storage/text/CSVLineDeserializer.java  |  14 +-
 .../apache/tajo/storage/text/CSVLineSerDe.java  |   5 +-
 .../tajo/storage/text/CSVLineSerializer.java    |   8 +-
 .../tajo/storage/text/DelimitedTextFile.java    |   2 +-
 .../tajo/storage/text/FieldSplitProcessor.java  |   8 +-
 .../text/MultiBytesFieldSplitProcessor.java     |  45 +++
 .../tajo/storage/text/TextLineDeserializer.java |   6 +-
 .../apache/tajo/storage/text/TextLineSerDe.java |   3 +-
 .../apache/tajo/storage/TestSplitProcessor.java |  38 +-
 205 files changed, 7516 insertions(+), 4256 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-core/src/main/java/org/apache/tajo/worker/Task.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-core/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
----------------------------------------------------------------------
diff --cc tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
index a36e982,8b73756..e320ce9
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
@@@ -18,28 -18,24 +18,31 @@@
  
  package org.apache.tajo.plan.logical;
  
+ import java.util.Arrays;
+ 
  import com.google.gson.Gson;
  import com.google.gson.annotations.Expose;
+ 
  import org.apache.tajo.catalog.Schema;
 -import org.apache.tajo.catalog.SortSpec;
 -import org.apache.tajo.datum.Datum;
 +import org.apache.tajo.plan.rewrite.rules.IndexScanInfo.SimplePredicate;
  import org.apache.tajo.plan.serder.PlanGsonHelper;
 +import org.apache.tajo.util.TUtil;
 +
 +import java.net.URI;
  
  public class IndexScanNode extends ScanNode {
 -  @Expose private SortSpec [] sortKeys;
    @Expose private Schema keySchema = null;
 -  @Expose private Datum[] datum = null;
 +  @Expose private URI indexPath = null;
 +  @Expose private SimplePredicate[] predicates = null;
 +
 +  public IndexScanNode(int pid) {
 +    super(pid);
 +    setType(NodeType.INDEX_SCAN);
 +  }
    
    public IndexScanNode(int pid, ScanNode scanNode ,
 -      Schema keySchema , Datum[] datum, SortSpec[] sortKeys ) {
 -    super(pid);
 +      Schema keySchema , SimplePredicate[] predicates, URI indexPath) {
 +    this(pid);
      init(scanNode.getTableDesc());
      setQual(scanNode.getQual());
      setInSchema(scanNode.getInSchema());

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
----------------------------------------------------------------------
diff --cc tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
index 1ce7019,4cd008a..a257296
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
@@@ -957,58 -918,17 +957,60 @@@ public class FilterPushDownRule extend
      return scanNode;
    }
  
 +  private static class Predicate {
 +    Column column;
 +    Datum value;
 +    EvalType evalType;
 +
 +    public Predicate(EvalType evalType, Column column, Datum value) {
 +      this.evalType = evalType;
 +      this.column = column;
 +      this.value = value;
 +    }
 +  }
 +
 +  private static SimplePredicate[] getSimplePredicates(IndexDesc desc, Set<Predicate> predicates) {
 +    SimplePredicate[] simplePredicates = new SimplePredicate[predicates.size()];
 +    Map<Column, Datum> colToValue = TUtil.newHashMap();
 +    for (Predicate predicate : predicates) {
 +      colToValue.put(predicate.column, predicate.value);
 +    }
 +    SortSpec [] keySortSpecs = desc.getKeySortSpecs();
 +    for (int i = 0; i < keySortSpecs.length; i++) {
 +      simplePredicates[i] = new SimplePredicate(keySortSpecs[i],
 +          colToValue.get(keySortSpecs[i].getSortKey()));
 +    }
 +    return simplePredicates;
 +  }
 +
 +  private static Datum[] extractPredicateValues(List<Predicate> predicates) {
 +    Datum[] values = new Datum[predicates.size()];
 +    for (int i = 0; i < values.length; i++) {
 +      values[i] = predicates.get(i).value;
 +    }
 +    return values;
 +  }
 +
 +  private static Column[] extractColumns(Set<Predicate> predicates) {
 +    Column[] columns = new Column[predicates.size()];
 +    int i = 0;
 +    for (Predicate p : predicates) {
 +      columns[i++] = p.column;
 +    }
 +    return columns;
 +  }
 +
    private void errorFilterPushDown(LogicalPlan plan, LogicalNode node,
                                     FilterPushDownContext context) throws PlanningException {
-     String notMatchedNodeStr = "";
      String prefix = "";
+     StringBuilder notMatchedNodeStrBuilder = new StringBuilder();
      for (EvalNode notMatchedNode: context.pushingDownFilters) {
-       notMatchedNodeStr += prefix + notMatchedNode;
-       prefix = ", ";
+       notMatchedNodeStrBuilder.append(prefix).append(notMatchedNode.toString());
+       if (prefix.isEmpty()) {
+         prefix = ", ";
+       }
      }
-     throw new PlanningException("FilterPushDown failed cause some filters not matched: " + notMatchedNodeStr + "\n" +
+     throw new PlanningException("FilterPushDown failed cause some filters not matched: " + notMatchedNodeStrBuilder.toString() + "\n" +
          "Error node: " + node.getPlanString() + "\n" +
          plan.toString());
    }

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeSerializer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/BasicLogicalPlanVisitor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd2f8281/tajo-plan/src/main/proto/Plan.proto
----------------------------------------------------------------------


[2/9] tajo git commit: TAJO-1393: Resolve findbug warnings on Tajo Cli Module

Posted by ji...@apache.org.
TAJO-1393: Resolve findbug warnings on Tajo Cli Module

Closes #417

Signed-off-by: Hyunsik Choi <hy...@apache.org>


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

Branch: refs/heads/index_support
Commit: e15ac7e5596ad03aedc1168e422099e1d0ee9a1d
Parents: 725448c
Author: Dongjoon Hyun <do...@apache.org>
Authored: Fri Mar 13 09:56:46 2015 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu Mar 19 18:39:28 2015 -0700

----------------------------------------------------------------------
 CHANGES                                                   |  3 +++
 .../main/java/org/apache/tajo/cli/tools/TajoAdmin.java    |  1 -
 .../main/java/org/apache/tajo/cli/tools/TajoGetConf.java  |  5 -----
 .../main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java  |  5 -----
 .../tajo/cli/tsql/DefaultTajoCliOutputFormatter.java      |  2 +-
 .../main/java/org/apache/tajo/cli/tsql/SimpleParser.java  |  3 ++-
 .../src/main/java/org/apache/tajo/cli/tsql/TajoCli.java   | 10 ++++------
 7 files changed, 10 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 56d77b3..6ae53f6 100644
--- a/CHANGES
+++ b/CHANGES
@@ -79,6 +79,9 @@ Release 0.11.0 - unreleased
 
   SUB TASKS
 
+    TAJO-1393: Resolve findbug warnings on Tajo Cli Module.
+    (Contributed by Dongjoon Hyun, Committed by hyunsik)
+
     TAJO-1337: Implements common modules to handle RESTful API. (jihun)
 
     TAJO-1329: Improve Schema class to support nested struct support.

http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java
index 5497435..98ccc5f 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoAdmin.java
@@ -71,7 +71,6 @@ public class TajoAdmin {
 
   private TajoConf tajoConf;
   private TajoClient tajoClient;
-  private ServiceTracker serviceTracker;
   private Writer writer;
 
   public TajoAdmin(TajoConf tajoConf, Writer writer) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java
index 756f2ee..0c4a42a 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoGetConf.java
@@ -40,7 +40,6 @@ public class TajoGetConf {
   }
 
   private TajoConf tajoConf;
-  private TajoClient tajoClient;
   private Writer writer;
 
   public final static String defaultLeftPad = " ";
@@ -53,7 +52,6 @@ public class TajoGetConf {
   public TajoGetConf(TajoConf tajoConf, Writer writer, TajoClient tajoClient) {
     this.tajoConf = tajoConf;
     this.writer = writer;
-    this.tajoClient = tajoClient;
   }
 
   private void printUsage(boolean tsqlMode) {
@@ -115,9 +113,6 @@ public class TajoGetConf {
       return;
     } else if (hostName != null && port != null) {
       tajoConf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName + ":" + port);
-      tajoClient = new TajoClientImpl(ServiceTrackerFactory.get(tajoConf));
-    } else if (hostName == null && port == null) {
-      tajoClient = new TajoClientImpl(ServiceTrackerFactory.get(tajoConf));
     }
 
     processConfKey(writer, param);

http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java
index 127ee8c..e25d7d4 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tools/TajoHAAdmin.java
@@ -44,7 +44,6 @@ public class TajoHAAdmin {
   }
 
   private TajoConf tajoConf;
-  private TajoClient tajoClient;
   private Writer writer;
 
   public TajoHAAdmin(TajoConf tajoConf, Writer writer) {
@@ -54,7 +53,6 @@ public class TajoHAAdmin {
   public TajoHAAdmin(TajoConf tajoConf, Writer writer, TajoClient tajoClient) {
     this.tajoConf = tajoConf;
     this.writer = writer;
-    this.tajoClient = tajoClient;
   }
 
   private void printUsage() {
@@ -127,9 +125,6 @@ public class TajoHAAdmin {
       return;
     } else if (hostName != null && port != null) {
       tajoConf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName + ":" + port);
-      tajoClient = new TajoClientImpl(ServiceTrackerFactory.get(tajoConf));
-    } else if (hostName == null && port == null) {
-      tajoClient = new TajoClientImpl(ServiceTrackerFactory.get(tajoConf));
     }
 
     if (!tajoConf.getBoolVar(TajoConf.ConfVars.TAJO_MASTER_HA_ENABLE)) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
index 5cbe77b..aaa411e 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
@@ -37,7 +37,7 @@ public class DefaultTajoCliOutputFormatter implements TajoCliOutputFormatter {
   private boolean printPause;
   private boolean printErrorTrace;
   private String nullChar;
-  public static char QUIT_COMMAND = 'q';
+  public static final char QUIT_COMMAND = 'q';
 
   @Override
   public void init(TajoCli.TajoCliContext context) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java
index cc772a3..b8c4c28 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/SimpleParser.java
@@ -180,7 +180,7 @@ public class SimpleParser {
             appendToBothStatements(chars, lineStartIdx, idx, 2); // omit two dash characters '--' from history statement
             int commentStartIdx = idx;
             idx = consumeInlineComment(chars, idx);
-            appendToRawStatement(str.subSequence(commentStartIdx, idx).toString(), true);
+            appendToRawStatement(str.subSequence(commentStartIdx, idx).toString(), false);
             lineStartIdx = idx;
           }
           ///////////////////////////////////////////////////////
@@ -281,6 +281,7 @@ public class SimpleParser {
   private void appendToRawStatement(String str, boolean addLF) {
     if (!str.isEmpty() && !"\n".equals(str) &&
         rawAppender.length() > 0 && addLF && rawAppender.charAt(rawAppender.length() - 1) != '\n') {
+      rawAppender.append("\n");
       rawAppender.append(str);
     } else {
       rawAppender.append(str);

http://git-wip-us.apache.org/repos/asf/tajo/blob/e15ac7e5/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
index 354f60d..86046c4 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
@@ -665,12 +665,10 @@ public class TajoCli {
     }
     if (reconnect && (t instanceof InvalidClientSessionException ||
         (message != null && message.startsWith("org.apache.tajo.session.InvalidSessionException")))) {
-      if (client instanceof SessionConnection) {
-        try {
-          ((SessionConnection)client).reconnect();
-        } catch (Exception e) {
-          // ignore
-        }
+      try {
+        ((SessionConnection)client).reconnect();
+      } catch (Exception e) {
+        // ignore
       }
     }
   }


[5/9] tajo git commit: TAJO-1392: Resolve findbug warnings on Tajo Plan Module

Posted by ji...@apache.org.
TAJO-1392: Resolve findbug warnings on Tajo Plan Module

Closes #424


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

Branch: refs/heads/index_support
Commit: 154f5b9e1c619ce4327aa055fb3ef02d6030fc0d
Parents: 5260c1e
Author: Jihun Kang <ji...@apache.org>
Authored: Fri Mar 20 12:03:19 2015 +0900
Committer: Jihun Kang <ji...@apache.org>
Committed: Fri Mar 20 12:03:19 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  2 ++
 .../org/apache/tajo/plan/ExprAnnotator.java     |  2 +-
 .../java/org/apache/tajo/plan/LogicalPlan.java  |  2 --
 .../plan/expr/AggregationFunctionCallEval.java  | 14 ++++++++++
 .../apache/tajo/plan/expr/AlgebraicUtil.java    |  5 ++++
 .../tajo/plan/expr/BetweenPredicateEval.java    | 14 ++++++++++
 .../org/apache/tajo/plan/expr/CaseWhenEval.java | 25 ++++++++++++++---
 .../org/apache/tajo/plan/expr/CastEval.java     | 10 +++++++
 .../org/apache/tajo/plan/expr/EvalTreeUtil.java |  5 +++-
 .../java/org/apache/tajo/plan/expr/InEval.java  | 10 +++++++
 .../org/apache/tajo/plan/expr/IsNullEval.java   |  9 +++++++
 .../tajo/plan/expr/PartialBinaryExpr.java       |  5 +---
 .../tajo/plan/expr/RegexPredicateEval.java      | 25 +++++++++++++++++
 .../apache/tajo/plan/expr/RowConstantEval.java  | 11 ++++++++
 .../tajo/plan/expr/WindowFunctionEval.java      | 14 ++++++++++
 .../GreedyHeuristicJoinOrderAlgorithm.java      |  4 ++-
 .../tajo/plan/logical/AlterTableNode.java       | 14 ++++++++++
 .../tajo/plan/logical/DistinctGroupbyNode.java  | 17 +++++++++++-
 .../apache/tajo/plan/logical/EvalExprNode.java  | 18 ++++++++++---
 .../apache/tajo/plan/logical/GroupbyNode.java   | 16 ++++++++++-
 .../apache/tajo/plan/logical/HavingNode.java    |  9 +++++++
 .../apache/tajo/plan/logical/IndexScanNode.java | 13 +++++++++
 .../apache/tajo/plan/logical/InsertNode.java    | 13 +++++++++
 .../org/apache/tajo/plan/logical/JoinNode.java  | 13 +++++++++
 .../org/apache/tajo/plan/logical/LimitNode.java | 11 +++++++-
 .../apache/tajo/plan/logical/LogicalNode.java   | 27 ++++++++++++++-----
 .../tajo/plan/logical/PersistentStoreNode.java  | 10 +++++++
 .../tajo/plan/logical/ProjectionNode.java       | 28 ++++++++++++++------
 .../apache/tajo/plan/logical/SelectionNode.java |  9 +++++++
 .../tajo/plan/logical/ShuffleFileWriteNode.java | 13 +++++++++
 .../org/apache/tajo/plan/logical/SortNode.java  | 14 +++++++++-
 .../tajo/plan/logical/StoreTableNode.java       | 10 +++++++
 .../tajo/plan/nameresolver/NameResolver.java    |  4 +--
 .../plan/rewrite/rules/FilterPushDownRule.java  | 10 ++++---
 .../tajo/plan/serder/EvalNodeDeserializer.java  | 17 +++++++++++-
 .../tajo/plan/verifier/LogicalPlanVerifier.java |  7 -----
 .../plan/verifier/PreLogicalPlanVerifier.java   | 19 +------------
 .../plan/visitor/BasicLogicalPlanVisitor.java   |  6 ++---
 38 files changed, 387 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index bac5461..38bd330 100644
--- a/CHANGES
+++ b/CHANGES
@@ -85,6 +85,8 @@ Release 0.11.0 - unreleased
 
   SUB TASKS
 
+    TAJO-1392: Resolve findbug warnings on Tajo Plan Module. (jihun)
+
     TAJO-1393: Resolve findbug warnings on Tajo Cli Module.
     (Contributed by Dongjoon Hyun, Committed by hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java b/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
index 5166e80..127d5bd 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
@@ -805,7 +805,7 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
   public EvalNode visitLiteral(Context ctx, Stack<Expr> stack, LiteralValue expr) throws PlanningException {
     switch (expr.getValueType()) {
     case Boolean:
-      return new ConstEval(DatumFactory.createBool(((BooleanLiteral) expr).isTrue()));
+      return new ConstEval(DatumFactory.createBool(Boolean.parseBoolean(expr.getValue())));
     case String:
       return new ConstEval(DatumFactory.createText(expr.getValue()));
     case Unsigned_Integer:

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java
index 3baf61d..0425f2e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlan.java
@@ -67,12 +67,10 @@ public class LogicalPlan {
 
   /** planning and optimization log */
   private List<String> planingHistory = Lists.newArrayList();
-  LogicalPlanner planner;
 
   private boolean isExplain;
 
   public LogicalPlan(LogicalPlanner planner) {
-    this.planner = planner;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
index ca8c110..3ffe20e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.expr;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes.DataType;
@@ -142,6 +143,19 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab
     this.intermediatePhase = true;
   }
 
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + ((alias == null) ? 0 : alias.hashCode());
+    result = prime * result + (finalPhase ? 1231 : 1237);
+    result = prime * result + ((instance == null) ? 0 : instance.hashCode());
+    result = prime * result + (intermediatePhase ? 1231 : 1237);
+    result = prime * result + ((params == null) ? 0 : params.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof AggregationFunctionCallEval) {
       AggregationFunctionCallEval other = (AggregationFunctionCallEval) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java
index 84352f0..9ecb93c 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java
@@ -342,6 +342,11 @@ public class AlgebraicUtil {
   }
 
   private static EvalNode createSingletonExprFromCNFRecursive(EvalNode[] evalNode, int idx) {
+    if (idx >= evalNode.length) {
+      throw new ArrayIndexOutOfBoundsException("index " + idx + " is exceeded the maximum length ("+
+          evalNode.length+") of EvalNode");
+    }
+
     if (idx == evalNode.length - 2) {
       return new BinaryEval(EvalType.AND, evalNode[idx], evalNode[idx + 1]);
     } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java
index 84197e8..b0fbd5e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.expr;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
@@ -230,6 +231,19 @@ public class BetweenPredicateEval extends EvalNode implements Cloneable {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((begin == null) ? 0 : begin.hashCode());
+    result = prime * result + ((checker == null) ? 0 : checker.hashCode());
+    result = prime * result + ((end == null) ? 0 : end.hashCode());
+    result = prime * result + (not ? 1231 : 1237);
+    result = prime * result + ((predicand == null) ? 0 : predicand.hashCode());
+    result = prime * result + (symmetric ? 1231 : 1237);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof BetweenPredicateEval) {
       BetweenPredicateEval another = (BetweenPredicateEval) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java
index 4321d02..4d42db5 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java
@@ -20,6 +20,7 @@ package org.apache.tajo.plan.expr;
 
 import com.google.common.collect.Lists;
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
@@ -164,6 +165,15 @@ public class CaseWhenEval extends EvalNode implements GsonObject {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((elseResult == null) ? 0 : elseResult.hashCode());
+    result = prime * result + ((whens == null) ? 0 : whens.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof CaseWhenEval) {
       CaseWhenEval other = (CaseWhenEval) obj;
@@ -240,9 +250,18 @@ public class CaseWhenEval extends EvalNode implements GsonObject {
     }
 
     @Override
-    public boolean equals(Object object) {
-      if (object instanceof IfThenEval) {
-        IfThenEval other = (IfThenEval) object;
+    public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((condition == null) ? 0 : condition.hashCode());
+      result = prime * result + ((this.result == null) ? 0 : this.result.hashCode());
+      return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj instanceof IfThenEval) {
+        IfThenEval other = (IfThenEval) obj;
         return condition.equals(other.condition) && result.equals(other.result);
       } else {
         return false;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
index 3cad842..9f7f69f 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.expr;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Schema;
@@ -81,6 +82,15 @@ public class CastEval extends UnaryEval {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + ((target == null) ? 0 : target.hashCode());
+    result = prime * result + ((timezone == null) ? 0 : timezone.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     boolean valid = obj != null && obj instanceof CastEval;
     if (valid) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
index f1d4498..23b4659 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
@@ -233,6 +233,9 @@ public class EvalTreeUtil {
       if (containColumnRef(expr, target)) {          
         exprSet.add(expr);
       }
+      break;
+    default:
+      break;
     }    
   }
   
@@ -318,7 +321,7 @@ public class EvalTreeUtil {
         } else if (leftSchema != null && rightSchema != null) {
           ensureColumnsOfDifferentTables = isJoinQualwithSchemas(leftSchema, rightSchema, leftColumn, rightColumn);
         } else {
-          ensureColumnsOfDifferentTables = isJoinQualWithOnlyColumns(block, leftColumn, rightColumn);
+          ensureColumnsOfDifferentTables = isJoinQualWithOnlyColumns(null, leftColumn, rightColumn);
         }
       }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java
index 4dcc7bf..e60b68a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java
@@ -21,6 +21,7 @@ package org.apache.tajo.plan.expr;
 
 import com.google.common.collect.Sets;
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
@@ -72,6 +73,15 @@ public class InEval extends BinaryEval {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + (not ? 1231 : 1237);
+    result = prime * result + ((values == null) ? 0 : values.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof InEval) {
       InEval other = (InEval) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java
index 6a17bf8..16fc4f0 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.expr;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
@@ -66,6 +67,14 @@ public class IsNullEval extends UnaryEval {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + (isNot ? 1231 : 1237);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof IsNullEval) {
       IsNullEval other = (IsNullEval) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java
index 3aded7b..9f6d6d6 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java
@@ -56,10 +56,7 @@ public class PartialBinaryExpr extends BinaryEval {
   @Override
   public boolean equals(Object obj) {
     if (obj instanceof PartialBinaryExpr) {
-      PartialBinaryExpr other = (PartialBinaryExpr) obj;
-      return type.equals(other.type) &&
-          leftExpr.equals(other.leftExpr) &&
-          rightExpr.equals(other.rightExpr);
+      return super.equals(obj);
     }
     return false;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RegexPredicateEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RegexPredicateEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RegexPredicateEval.java
index 7519e2d..9e9c748 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RegexPredicateEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RegexPredicateEval.java
@@ -47,6 +47,31 @@ public class RegexPredicateEval extends PatternMatchPredicateEval {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + ((operator == null) ? 0 : operator.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj)
+      return true;
+    if (!super.equals(obj))
+      return false;
+    if (getClass() != obj.getClass())
+      return false;
+    RegexPredicateEval other = (RegexPredicateEval) obj;
+    if (operator == null) {
+      if (other.operator != null)
+        return false;
+    } else if (!operator.equals(other.operator))
+      return false;
+    return true;
+  }
+
+  @Override
   public String toString() {
     return leftExpr.toString() + operator + "'" + pattern +"'";
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java
index 4a97e67..a581700 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java
@@ -18,7 +18,10 @@
 
 package org.apache.tajo.plan.expr;
 
+import java.util.Arrays;
+
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.datum.Datum;
@@ -66,6 +69,14 @@ public class RowConstantEval extends EvalNode {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(values);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof RowConstantEval) {
       RowConstantEval other = (RowConstantEval) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java
index 0ff5927..1a1f138 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java
@@ -18,7 +18,10 @@
 
 package org.apache.tajo.plan.expr;
 
+import java.util.Arrays;
+
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SortSpec;
@@ -86,6 +89,17 @@ public class WindowFunctionEval extends AggregationFunctionCallEval implements C
     return funcDesc.getReturnType();
   }
 
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + ((params == null) ? 0 : params.hashCode());
+    result = prime * result + Arrays.hashCode(sortSpecs);
+    result = prime * result + ((windowFrame == null) ? 0 : windowFrame.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof WindowFunctionEval) {
       WindowFunctionEval other = (WindowFunctionEval) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java
index 4231484..e4d6122 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/joinorder/GreedyHeuristicJoinOrderAlgorithm.java
@@ -36,7 +36,7 @@ import java.util.*;
  * all join operators.
  */
 public class GreedyHeuristicJoinOrderAlgorithm implements JoinOrderAlgorithm {
-  public static double DEFAULT_SELECTION_FACTOR = 0.1;
+  public static final double DEFAULT_SELECTION_FACTOR = 0.1;
 
   @Override
   public FoundJoinOrder findBestOrder(LogicalPlan plan, LogicalPlan.QueryBlock block, JoinGraph joinGraph,
@@ -89,6 +89,8 @@ public class GreedyHeuristicJoinOrderAlgorithm implements JoinOrderAlgorithm {
                 checkingRelations.add(relation);
               }
               break;
+            default:
+              break;
           }
         }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/AlterTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/AlterTableNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/AlterTableNode.java
index e926dce..69cff54 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/AlterTableNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/AlterTableNode.java
@@ -20,6 +20,7 @@ package org.apache.tajo.plan.logical;
 
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.algebra.AlterTableOpType;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.plan.PlanString;
@@ -107,6 +108,19 @@ public class AlterTableNode extends LogicalNode {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((addNewColumn == null) ? 0 : addNewColumn.hashCode());
+    result = prime * result + ((alterTableOpType == null) ? 0 : alterTableOpType.hashCode());
+    result = prime * result + ((columnName == null) ? 0 : columnName.hashCode());
+    result = prime * result + ((newColumnName == null) ? 0 : newColumnName.hashCode());
+    result = prime * result + ((newTableName == null) ? 0 : newTableName.hashCode());
+    result = prime * result + ((tableName == null) ? 0 : tableName.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof AlterTableNode) {
       AlterTableNode other = (AlterTableNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java
index a40ad59..61ce789 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/DistinctGroupbyNode.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.util.PlannerUtil;
@@ -27,6 +28,7 @@ import org.apache.tajo.plan.expr.AggregationFunctionCallEval;
 import org.apache.tajo.util.TUtil;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public class DistinctGroupbyNode extends UnaryNode implements Projectable, Cloneable {
@@ -147,7 +149,7 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
 
   public String toString() {
     StringBuilder sb = new StringBuilder("Distinct GroupBy (");
-    if (groupingColumns != null || groupingColumns.length > 0) {
+    if (groupingColumns != null && groupingColumns.length > 0) {
       sb.append("grouping set=").append(TUtil.arrayToString(groupingColumns));
       sb.append(", ");
     }
@@ -159,6 +161,19 @@ public class DistinctGroupbyNode extends UnaryNode implements Projectable, Clone
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(aggrFunctions);
+    result = prime * result + ((groupbyPlan == null) ? 0 : groupbyPlan.hashCode());
+    result = prime * result + Arrays.hashCode(groupingColumns);
+    result = prime * result + Arrays.hashCode(resultColumnIds);
+    result = prime * result + ((subGroupbyPlan == null) ? 0 : subGroupbyPlan.hashCode());
+    result = prime * result + Arrays.hashCode(targets);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof DistinctGroupbyNode) {
       DistinctGroupbyNode other = (DistinctGroupbyNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java
index 0f96575..3aaf5d0 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/EvalExprNode.java
@@ -21,7 +21,10 @@
  */
 package org.apache.tajo.plan.logical;
 
+import java.util.Arrays;
+
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.plan.Target;
@@ -69,9 +72,18 @@ public class EvalExprNode extends LogicalNode implements Projectable {
     return "EvalExprNode (" + TUtil.arrayToString(exprs) + ")";
   }
 
-  public boolean equals(Object object) {
-    if (object instanceof EvalExprNode) {
-      EvalExprNode other = (EvalExprNode) object;
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(exprs);
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof EvalExprNode) {
+      EvalExprNode other = (EvalExprNode) obj;
       return TUtil.checkEquals(this.exprs, other.exprs);
     } else {
       return false;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java
index 4a18cb4..730f705 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/GroupbyNode.java
@@ -18,8 +18,11 @@
 
 package org.apache.tajo.plan.logical;
 
+import java.util.Arrays;
+
 import com.google.common.base.Preconditions;
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.util.PlannerUtil;
@@ -106,7 +109,7 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
   
   public String toString() {
     StringBuilder sb = new StringBuilder("GroupBy (");
-    if (groupingKeys != null || groupingKeys.length > 0) {
+    if (groupingKeys != null && groupingKeys.length > 0) {
       sb.append("grouping set=").append(TUtil.arrayToString(groupingKeys));
       sb.append(", ");
     }
@@ -118,6 +121,17 @@ public class GroupbyNode extends UnaryNode implements Projectable, Cloneable {
   }
   
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(aggrFunctions);
+    result = prime * result + Arrays.hashCode(groupingKeys);
+    result = prime * result + (hasDistinct ? 1231 : 1237);
+    result = prime * result + Arrays.hashCode(targets);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof GroupbyNode) {
       GroupbyNode other = (GroupbyNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/HavingNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/HavingNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/HavingNode.java
index a3371c7..a45fbe4 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/HavingNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/HavingNode.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.expr.EvalNode;
 
@@ -43,6 +44,14 @@ public class HavingNode extends UnaryNode implements SelectableNode, Cloneable {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((qual == null) ? 0 : qual.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof HavingNode) {
       HavingNode other = (HavingNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
index 0d59733..8b73756 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/IndexScanNode.java
@@ -18,8 +18,11 @@
 
 package org.apache.tajo.plan.logical;
 
+import java.util.Arrays;
+
 import com.google.gson.Gson;
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.datum.Datum;
@@ -78,6 +81,16 @@ public class IndexScanNode extends ScanNode {
   }
   
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + Arrays.hashCode(datum);
+    result = prime * result + ((keySchema == null) ? 0 : keySchema.hashCode());
+    result = prime * result + Arrays.hashCode(sortKeys);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof IndexScanNode) {
       IndexScanNode other = (IndexScanNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
index 769cb59..ee15951 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
@@ -124,6 +125,18 @@ public class InsertNode extends StoreTableNode implements Cloneable {
   }
   
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + (overwrite ? 1231 : 1237);
+    result = prime * result + ((path == null) ? 0 : path.hashCode());
+    result = prime * result + ((projectedSchema == null) ? 0 : projectedSchema.hashCode());
+    result = prime * result + ((tableSchema == null) ? 0 : tableSchema.hashCode());
+    result = prime * result + ((targetSchema == null) ? 0 : targetSchema.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof InsertNode) {
       InsertNode other = (InsertNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
index 58dfac2..bad8704 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java
@@ -22,6 +22,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.algebra.JoinType;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.util.PlannerUtil;
@@ -31,6 +32,7 @@ import org.apache.tajo.plan.expr.EvalNode;
 import org.apache.tajo.util.TUtil;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public class JoinNode extends BinaryNode implements Projectable, Cloneable {
@@ -126,6 +128,17 @@ public class JoinNode extends BinaryNode implements Projectable, Cloneable {
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + (candidateBroadcast ? 1231 : 1237);
+    result = prime * result + ((joinQual == null) ? 0 : joinQual.hashCode());
+    result = prime * result + ((joinType == null) ? 0 : joinType.hashCode());
+    result = prime * result + Arrays.hashCode(targets);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof JoinNode) {
       JoinNode other = (JoinNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LimitNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LimitNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LimitNode.java
index 7a3431e..96230a1 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LimitNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LimitNode.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.plan.PlanString;
 
 public final class LimitNode extends UnaryNode implements Cloneable {
@@ -41,7 +42,15 @@ public final class LimitNode extends UnaryNode implements Cloneable {
     return new PlanString(this).appendTitle(" " + fetchFirstNum);
   }
   
-  @Override 
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + (int) (fetchFirstNum ^ (fetchFirstNum >>> 32));
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof LimitNode) {
       LimitNode other = (LimitNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LogicalNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LogicalNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LogicalNode.java
index 200977b..450d3e0 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LogicalNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/LogicalNode.java
@@ -22,6 +22,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.plan.PlanString;
@@ -87,9 +88,23 @@ public abstract class LogicalNode implements Cloneable, GsonObject {
 	}
 	
 	@Override
-	public boolean equals(Object obj) {
-	  if (obj instanceof LogicalNode) {
-	    LogicalNode other = (LogicalNode) obj;
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    long temp;
+    temp = Double.doubleToLongBits(cost);
+    result = prime * result + (int) (temp ^ (temp >>> 32));
+    result = prime * result + ((inputSchema == null) ? 0 : inputSchema.hashCode());
+    result = prime * result + nodeId;
+    result = prime * result + ((outputSchema == null) ? 0 : outputSchema.hashCode());
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof LogicalNode) {
+      LogicalNode other = (LogicalNode) obj;
 
       boolean eq = this.type == other.type;
       eq = eq && TUtil.checkEquals(this.inputSchema, other.inputSchema);
@@ -97,9 +112,9 @@ public abstract class LogicalNode implements Cloneable, GsonObject {
       eq = eq && this.cost == other.cost;
 
       return eq;
-	  } else {
-	    return false;
-	  }
+    } else {
+      return false;
+    }
   }
 
   public boolean deepEquals(Object o) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PersistentStoreNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PersistentStoreNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PersistentStoreNode.java
index 420ed7c..556ae7a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PersistentStoreNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/PersistentStoreNode.java
@@ -20,6 +20,7 @@ package org.apache.tajo.plan.logical;
 
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.TUtil;
@@ -68,6 +69,15 @@ public abstract class PersistentStoreNode extends UnaryNode implements Cloneable
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = super.hashCode();
+    result = prime * result + ((options == null) ? 0 : options.hashCode());
+    result = prime * result + ((storageType == null) ? 0 : storageType.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof PersistentStoreNode) {
       PersistentStoreNode other = (PersistentStoreNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java
index c0b5953..3c9d497 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ProjectionNode.java
@@ -18,7 +18,10 @@
 
 package org.apache.tajo.plan.logical;
 
+import java.util.Arrays;
+
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.plan.Target;
@@ -73,17 +76,26 @@ public class ProjectionNode extends UnaryNode implements Projectable {
 	}
 	
 	@Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + (distinct ? 1231 : 1237);
+    result = prime * result + Arrays.hashCode(targets);
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
-	  if (obj instanceof ProjectionNode) {
-	    ProjectionNode other = (ProjectionNode) obj;
-	    
-	    boolean b1 = super.equals(other);
+    if (obj instanceof ProjectionNode) {
+      ProjectionNode other = (ProjectionNode) obj;
+      
+      boolean b1 = super.equals(other);
       boolean b2 = TUtil.checkEquals(targets, other.targets);
       return b1 && b2;
-	  } else {
-	    return false;
-	  }
-	}
+    } else {
+      return false;
+    }
+  }
 
 	@Override
   public Object clone() throws CloneNotSupportedException {

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SelectionNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SelectionNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SelectionNode.java
index 4c4d5ee..3897ee2 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SelectionNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SelectionNode.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.expr.EvalNode;
 
@@ -50,6 +51,14 @@ public class SelectionNode extends UnaryNode implements SelectableNode, Cloneabl
   }
 
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((qual == null) ? 0 : qual.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof SelectionNode) {
       SelectionNode other = (SelectionNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ShuffleFileWriteNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ShuffleFileWriteNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ShuffleFileWriteNode.java
index 29aefc9..8215f51 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ShuffleFileWriteNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ShuffleFileWriteNode.java
@@ -18,8 +18,11 @@
 
 package org.apache.tajo.plan.logical;
 
+import java.util.Arrays;
+
 import com.google.common.base.Preconditions;
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.util.TUtil;
 
@@ -67,6 +70,16 @@ public class ShuffleFileWriteNode extends PersistentStoreNode implements Cloneab
   }
   
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + numOutputs;
+    result = prime * result + Arrays.hashCode(shuffleKeys);
+    result = prime * result + ((shuffleType == null) ? 0 : shuffleType.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof ShuffleFileWriteNode) {
       ShuffleFileWriteNode other = (ShuffleFileWriteNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SortNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SortNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SortNode.java
index 2e5e159..5157d45 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SortNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/SortNode.java
@@ -18,8 +18,11 @@
 
 package org.apache.tajo.plan.logical;
 
+import java.util.Arrays;
+
 import com.google.common.base.Preconditions;
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.util.TUtil;
@@ -46,7 +49,16 @@ public final class SortNode extends UnaryNode implements Cloneable {
     return this.sortKeys;
   }
   
-  @Override 
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(sortKeys);
+    result = prime * result + ((sortPurpose == null) ? 0 : sortPurpose.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof SortNode) {
       SortNode other = (SortNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/StoreTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/StoreTableNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/StoreTableNode.java
index 730eb35..62f7db4 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/StoreTableNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/StoreTableNode.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan.logical;
 
 import com.google.gson.annotations.Expose;
+
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.util.TUtil;
@@ -78,6 +79,15 @@ public class StoreTableNode extends PersistentStoreNode implements Cloneable {
   }
   
   @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((partitionDesc == null) ? 0 : partitionDesc.hashCode());
+    result = prime * result + ((tableName == null) ? 0 : tableName.hashCode());
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (obj instanceof StoreTableNode) {
       StoreTableNode other = (StoreTableNode) obj;

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java b/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java
index 44d3263..2c55c81 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/nameresolver/NameResolver.java
@@ -42,7 +42,7 @@ import java.util.Map;
  */
 public abstract class NameResolver {
 
-  public static Map<NameResolvingMode, NameResolver> resolverMap = Maps.newHashMap();
+  public static final Map<NameResolvingMode, NameResolver> resolverMap = Maps.newHashMap();
 
   static {
     resolverMap.put(NameResolvingMode.RELS_ONLY, new ResolverByRels());
@@ -115,7 +115,7 @@ public abstract class NameResolver {
 
       // If we cannot find any relation against a qualified column name
       if (relationOp == null) {
-        throw null;
+        throw new PlanningException("Cannot find any relation for " + qualifier);
       }
 
       // Please consider a query case:

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
index d7cd82e..4cd008a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
@@ -920,13 +920,15 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo
 
   private void errorFilterPushDown(LogicalPlan plan, LogicalNode node,
                                    FilterPushDownContext context) throws PlanningException {
-    String notMatchedNodeStr = "";
     String prefix = "";
+    StringBuilder notMatchedNodeStrBuilder = new StringBuilder();
     for (EvalNode notMatchedNode: context.pushingDownFilters) {
-      notMatchedNodeStr += prefix + notMatchedNode;
-      prefix = ", ";
+      notMatchedNodeStrBuilder.append(prefix).append(notMatchedNode.toString());
+      if (prefix.isEmpty()) {
+        prefix = ", ";
+      }
     }
-    throw new PlanningException("FilterPushDown failed cause some filters not matched: " + notMatchedNodeStr + "\n" +
+    throw new PlanningException("FilterPushDown failed cause some filters not matched: " + notMatchedNodeStrBuilder.toString() + "\n" +
         "Error node: " + node.getPlanString() + "\n" +
         plan.toString());
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
index 322c8db..5a96054 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeDeserializer.java
@@ -20,6 +20,7 @@ package org.apache.tajo.plan.serder;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.algebra.WindowSpec.WindowFrameEndBoundType;
 import org.apache.tajo.algebra.WindowSpec.WindowFrameStartBoundType;
@@ -28,6 +29,8 @@ import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.catalog.exception.NoSuchFunctionException;
 import org.apache.tajo.catalog.proto.CatalogProtos;
+import org.apache.tajo.catalog.proto.CatalogProtos.FunctionSignatureProto;
+import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.*;
 import org.apache.tajo.exception.InternalException;
 import org.apache.tajo.plan.expr.*;
@@ -210,7 +213,19 @@ public class EvalNodeDeserializer {
             }
           }
         } catch (ClassNotFoundException cnfe) {
-          throw new NoSuchFunctionException(funcDesc.getFunctionName(), funcDesc.getParamTypes());
+          String functionName = "Unknown";
+          DataType[] parameterTypes = new DataType[0];
+          if (funcProto.getFuncion() != null && funcProto.getFuncion().getSignature() != null) {
+            FunctionSignatureProto funcSignatureProto = funcProto.getFuncion().getSignature();
+            
+            if (funcSignatureProto.hasName()) {
+              functionName = funcSignatureProto.getName();
+            }
+            
+            parameterTypes = funcSignatureProto.getParameterTypesList().toArray(
+                new DataType[funcSignatureProto.getParameterTypesCount()]);
+          }
+          throw new NoSuchFunctionException(functionName, parameterTypes);
         } catch (InternalException ie) {
           throw new NoSuchFunctionException(funcDesc.getFunctionName(), funcDesc.getParamTypes());
         }

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java
index b6912a7..22b3351 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/LogicalPlanVerifier.java
@@ -34,20 +34,13 @@ import org.apache.tajo.plan.visitor.BasicLogicalPlanVisitor;
 import java.util.Stack;
 
 public class LogicalPlanVerifier extends BasicLogicalPlanVisitor<LogicalPlanVerifier.Context, LogicalNode> {
-  private TajoConf conf;
-  private CatalogService catalog;
-
   public LogicalPlanVerifier(TajoConf conf, CatalogService catalog) {
-    this.conf = conf;
-    this.catalog = catalog;
   }
 
   public static class Context {
-    OverridableConf queryContext;
     VerificationState state;
 
     public Context(OverridableConf queryContext, VerificationState state) {
-      this.queryContext = this.queryContext;
       this.state = state;
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
index 25452de..275ab3a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/PreLogicalPlanVerifier.java
@@ -83,8 +83,7 @@ public class PreLogicalPlanVerifier extends BaseAlgebraVisitor<PreLogicalPlanVer
     super.visitProjection(context, stack, expr);
 
     Set<String> names = TUtil.newHashSet();
-    Expr [] distinctValues = null;
-
+    
     for (NamedExpr namedExpr : expr.getNamedExprs()) {
 
       if (namedExpr.hasAlias()) {
@@ -95,22 +94,6 @@ public class PreLogicalPlanVerifier extends BaseAlgebraVisitor<PreLogicalPlanVer
           names.add(namedExpr.getAlias());
         }
       }
-
-      Set<GeneralSetFunctionExpr> exprs = ExprFinder.finds(namedExpr.getExpr(), OpType.GeneralSetFunction);
-
-      // Currently, avg functions with distinct aggregation are not supported.
-      // This code does not allow users to use avg functions with distinct aggregation.
-      if (distinctValues != null) {
-        for (GeneralSetFunctionExpr setFunction : exprs) {
-          if (setFunction.getSignature().equalsIgnoreCase("avg")) {
-            if (setFunction.isDistinct()) {
-              throw new PlanningException("avg(distinct) function is not supported yet.");
-            } else {
-              throw new PlanningException("avg() function with distinct aggregation functions is not supported yet.");
-            }
-          }
-        }
-      }
     }
     return expr;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/154f5b9e/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/BasicLogicalPlanVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/BasicLogicalPlanVisitor.java b/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/BasicLogicalPlanVisitor.java
index 23c834d..ecf9050 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/BasicLogicalPlanVisitor.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/visitor/BasicLogicalPlanVisitor.java
@@ -258,8 +258,8 @@ public class BasicLogicalPlanVisitor<CONTEXT, RESULT> implements LogicalPlanVisi
       LogicalPlan.QueryBlock rightBlock = plan.getBlock(node.getRightChild());
       visit(context, plan, rightBlock, rightBlock.getRoot(), stack);
     } else {
-      result = visit(context, plan, null, node.getLeftChild(), stack);
-      visit(context, plan, null, node.getRightChild(), stack);
+      result = visit(context, null, null, node.getLeftChild(), stack);
+      visit(context, null, null, node.getRightChild(), stack);
     }
 
     stack.pop();
@@ -295,7 +295,7 @@ public class BasicLogicalPlanVisitor<CONTEXT, RESULT> implements LogicalPlanVisi
       LogicalPlan.QueryBlock childBlock = plan.getBlock(node.getSubQuery());
       result = visit(context, plan, childBlock, childBlock.getRoot(), stack);
     } else {
-      result = visit(context, plan, null, node.getSubQuery(), stack);
+      result = visit(context, null, null, node.getSubQuery(), stack);
     }
     stack.pop();
     return result;


[4/9] tajo git commit: TAJO-1414: Two RemoteException in rpc module

Posted by ji...@apache.org.
TAJO-1414: Two RemoteException in rpc module

Closes #435

Signed-off-by: Jihun Kang <ji...@apache.org>


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

Branch: refs/heads/index_support
Commit: 5260c1e064e09f14b686144bdfc136fe76e01f4d
Parents: 797138e
Author: navis.ryu <na...@apache.org>
Authored: Fri Mar 20 11:57:42 2015 +0900
Committer: Jihun Kang <ji...@apache.org>
Committed: Fri Mar 20 11:57:42 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  3 ++
 .../org/apache/tajo/rpc/RemoteException.java    | 37 --------------------
 2 files changed, 3 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/5260c1e0/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index fc18306..bac5461 100644
--- a/CHANGES
+++ b/CHANGES
@@ -35,6 +35,9 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1414: Two RemoteException in rpc module. 
+    (Contributed by navis. Committed by jihun)
+
     TAJO-1368: Exceptions during processing nested union queries.
     (jihun)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5260c1e0/tajo-rpc/tajo-rpc-protobuf/src/main/java/org/apache/tajo/rpc/RemoteException.java
----------------------------------------------------------------------
diff --git a/tajo-rpc/tajo-rpc-protobuf/src/main/java/org/apache/tajo/rpc/RemoteException.java b/tajo-rpc/tajo-rpc-protobuf/src/main/java/org/apache/tajo/rpc/RemoteException.java
deleted file mode 100644
index 30c110d..0000000
--- a/tajo-rpc/tajo-rpc-protobuf/src/main/java/org/apache/tajo/rpc/RemoteException.java
+++ /dev/null
@@ -1,37 +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.rpc;
-
-public class RemoteException extends RuntimeException {
-  public RemoteException() {
-    super();
-  }
-
-  public RemoteException(String message) {
-    super(message);
-  }
-
-  public RemoteException(Throwable t) {
-    super(t);
-  }
-
-  public RemoteException(String message, Throwable t) {
-    super(message, t);
-  }
-}


[7/9] tajo git commit: TAJO-1403: Improve 'Simple Query' with only partition columns and constant values.

Posted by ji...@apache.org.
TAJO-1403: Improve 'Simple Query' with only partition columns and constant values.

Closes #434

Signed-off-by: Jihoon Son <ji...@apache.org>


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

Branch: refs/heads/index_support
Commit: 8d0146b8d8f5eeac37fe3f531ce1362af3b20c2f
Parents: 3aaff38
Author: Jihoon Son <ji...@apache.org>
Authored: Mon Mar 23 11:48:18 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Mon Mar 23 11:48:18 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  3 +
 .../exec/NonForwardQueryResultFileScanner.java  | 37 +++++++++++-
 .../apache/tajo/master/exec/QueryExecutor.java  |  5 ++
 .../apache/tajo/master/TestGlobalPlanner.java   |  3 +-
 .../org/apache/tajo/plan/expr/EvalTreeUtil.java | 61 ++++++++++++++++++++
 .../org/apache/tajo/plan/util/PlannerUtil.java  | 26 ++++++++-
 .../apache/tajo/storage/FileStorageManager.java | 27 ++++++++-
 7 files changed, 155 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index e3636e6..ad3a6bd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1403: Improve 'Simple Query' with only partition columns and constant 
+    values. (Contributed by Dongjoon Hyun, Committed by jihoon)
+
     TAJO-1418: Comment on TAJO_PULLSERVER_STANDALONE in tajo-env.sh 
     is not consistent. (Contributed by navis, Committed by hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
index dc0c44a..6c02aa9 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
@@ -24,19 +24,23 @@ import org.apache.tajo.ExecutionBlockId;
 import org.apache.tajo.QueryId;
 import org.apache.tajo.TaskAttemptId;
 import org.apache.tajo.TaskId;
+import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos.FragmentProto;
 import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.plan.expr.EvalTreeUtil;
 import org.apache.tajo.plan.logical.ScanNode;
 import org.apache.tajo.engine.planner.physical.SeqScanExec;
 import org.apache.tajo.engine.query.QueryContext;
+import org.apache.tajo.storage.FileStorageManager;
 import org.apache.tajo.storage.RowStoreUtil;
 import org.apache.tajo.storage.RowStoreUtil.RowStoreEncoder;
 import org.apache.tajo.storage.StorageManager;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.fragment.Fragment;
 import org.apache.tajo.storage.fragment.FragmentConvertor;
+import org.apache.tajo.util.StringUtils;
 import org.apache.tajo.worker.TaskAttemptContext;
 
 import java.io.IOException;
@@ -74,10 +78,37 @@ public class NonForwardQueryResultFileScanner implements NonForwardQueryResultSc
     initSeqScanExec();
   }
 
+  /**
+   * Set partition path and depth if ScanNode's qualification exists
+   *
+   * @param storageManager target storage manager to be set with partition info
+   */
+  private void setPartition(StorageManager storageManager) {
+    if (tableDesc.isExternal() && tableDesc.hasPartition() && scanNode.getQual() != null &&
+        storageManager instanceof FileStorageManager) {
+      StringBuffer path = new StringBuffer();
+      int depth = 0;
+      if (tableDesc.hasPartition()) {
+        for (Column c : tableDesc.getPartitionMethod().getExpressionSchema().getColumns()) {
+          String partitionValue = EvalTreeUtil.getPartitionValue(scanNode.getQual(), c.getSimpleName());
+          if (partitionValue == null)
+            break;
+          path.append(String.format("/%s=%s", c.getSimpleName(), StringUtils.escapePathName(partitionValue)));
+          depth++;
+        }
+      }
+      ((FileStorageManager)storageManager).setPartitionPath(path.toString());
+      ((FileStorageManager)storageManager).setCurrentDepth(depth);
+      scanNode.setQual(null);
+    }
+  }
+
   private void initSeqScanExec() throws IOException {
-    List<Fragment> fragments = StorageManager.getStorageManager(tajoConf, tableDesc.getMeta().getStoreType())
-        .getNonForwardSplit(tableDesc, currentFragmentIndex, MAX_FRAGMENT_NUM_PER_SCAN);
-    
+    StorageManager storageManager = StorageManager.getStorageManager(tajoConf, tableDesc.getMeta().getStoreType());
+    List<Fragment> fragments = null;
+    setPartition(storageManager);
+    fragments = storageManager.getNonForwardSplit(tableDesc, currentFragmentIndex, MAX_FRAGMENT_NUM_PER_SCAN);
+
     if (fragments != null && !fragments.isEmpty()) {
       FragmentProto[] fragmentProtos = FragmentConvertor.toFragmentProtoArray(fragments.toArray(new Fragment[] {}));
       this.taskContext = new TaskAttemptContext(

http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index db82fca..aa8b228 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -212,6 +212,11 @@ public class QueryExecutor {
       scanNode = plan.getRootBlock().getNode(NodeType.PARTITIONS_SCAN);
     }
     TableDesc desc = scanNode.getTableDesc();
+    // Keep info for partition-column-only queries
+    SelectionNode selectionNode = plan.getRootBlock().getNode(NodeType.SELECTION);
+    if (desc.isExternal() && desc.hasPartition() && selectionNode != null) {
+      scanNode.setQual(selectionNode.getQual());
+    }
     int maxRow = Integer.MAX_VALUE;
     if (plan.getRootBlock().hasNode(NodeType.LIMIT)) {
       LimitNode limitNode = plan.getRootBlock().getNode(NodeType.LIMIT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java b/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
index d0f7cf4..45c94a3 100644
--- a/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
+++ b/tajo-core/src/test/java/org/apache/tajo/master/TestGlobalPlanner.java
@@ -317,8 +317,9 @@ public class TestGlobalPlanner {
     plan = buildPlan("select * from customer where c_nationkey = 1");
     assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
 
+    // c_nationkey is partition column
     plan = buildPlan("select * from customer_parts where c_nationkey = 1");
-    assertFalse(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
+    assertTrue(PlannerUtil.checkIfSimpleQuery(plan.getLogicalPlan()));
 
     // same column order
     plan = buildPlan("select c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_mktsegment, c_comment" +

http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
index 23b4659..0d0ea88 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
@@ -573,4 +573,65 @@ public class EvalTreeUtil {
   public static Datum evaluateImmediately(EvalNode evalNode) {
     return evalNode.eval(null, null);
   }
+
+  /**
+   * Checks whether EvalNode consists of only partition columns and const values.
+   * The partition based simple query can be defined as 'select * from tb_name where col_name1="X" and col_name2="Y" [LIMIT Z]',
+   * whose WHERE clause consists of only partition-columns with constant values.
+   * Partition columns must be able to form a prefix of HDFS path like '/tb_name1/col_name1=X/col_name2=Y'.
+   *
+   * @param node The qualification node of a SELECTION node
+   * @param partSchema Partition expression schema
+   * @return True if the query is partition-column based simple query.
+   */
+  public static boolean checkIfPartitionSelection(EvalNode node, Schema partSchema) {
+    if (node != null && node instanceof BinaryEval) {
+      BinaryEval eval = (BinaryEval)node;
+      EvalNode left = eval.getLeftExpr();
+      EvalNode right = eval.getRightExpr();
+      EvalType type = eval.getType();
+
+      if (type == EvalType.EQUAL) {
+        if (left instanceof FieldEval && right instanceof ConstEval && partSchema.contains(((FieldEval) left).getColumnName())) {
+          return true;
+        } else if (left instanceof ConstEval && right instanceof FieldEval && partSchema.contains(((FieldEval) right).getColumnName())) {
+          return true;
+        }
+      } else if (type == EvalType.AND && left instanceof BinaryEval && right instanceof BinaryEval) {
+        return checkIfPartitionSelection(left, partSchema) && checkIfPartitionSelection(right, partSchema);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Get partition constant value associated with `columnName`.
+   *
+   * @param node EvalNode having query predicates
+   * @param columnName Column name to be looked up
+   * @return String The value associated with `columnName` in the predicates
+   */
+  public static String getPartitionValue(EvalNode node, String columnName) {
+    if (node != null && node instanceof BinaryEval) {
+      BinaryEval eval = (BinaryEval)node;
+      EvalNode left = eval.getLeftExpr();
+      EvalNode right = eval.getRightExpr();
+      EvalType type = eval.getType();
+
+      if (type == EvalType.EQUAL) {
+        if (left instanceof FieldEval && right instanceof ConstEval && columnName.equals(((FieldEval) left).getColumnName())) {
+          return ((ConstEval)right).getValue().toString();
+        } else if (left instanceof ConstEval && right instanceof FieldEval && columnName.equals(((FieldEval) right).getColumnName())) {
+          return ((ConstEval)left).getValue().toString();
+        }
+      } else if (type == EvalType.AND && left instanceof BinaryEval && right instanceof BinaryEval) {
+        String value = getPartitionValue(left, columnName);
+        if (value == null) {
+          value = getPartitionValue(right, columnName);
+        }
+        return value;
+      }
+    }
+    return null;
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
index 0fbd359..b09fc9e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
@@ -100,6 +100,7 @@ public class PlannerUtil {
         PlannerUtil.getRelationLineage(plan.getRootBlock().getRoot()).length == 1;
 
     boolean noComplexComputation = false;
+    boolean prefixPartitionWhere = false;
     if (singleRelation) {
       ScanNode scanNode = plan.getRootBlock().getNode(NodeType.SCAN);
       if (scanNode == null) {
@@ -133,11 +134,34 @@ public class PlannerUtil {
           }
         }
       }
+
+      /**
+       * TODO: Remove isExternal check after resolving the following issues
+       * - TAJO-1416: INSERT INTO EXTERNAL PARTITIONED TABLE
+       * - TAJO-1441: INSERT INTO MANAGED PARTITIONED TABLE
+       */
+      if (!noWhere && scanNode.getTableDesc().isExternal() && scanNode.getTableDesc().getPartitionMethod() != null) {
+        EvalNode node = ((SelectionNode) plan.getRootBlock().getNode(NodeType.SELECTION)).getQual();
+        Schema partSchema = scanNode.getTableDesc().getPartitionMethod().getExpressionSchema();
+        if (EvalTreeUtil.checkIfPartitionSelection(node, partSchema)) {
+          prefixPartitionWhere = true;
+          boolean isPrefix = true;
+          for (Column c : partSchema.getColumns()) {
+            String value = EvalTreeUtil.getPartitionValue(node, c.getSimpleName());
+            if (isPrefix && value == null)
+              isPrefix = false;
+            else if (!isPrefix && value != null) {
+              prefixPartitionWhere = false;
+              break;
+            }
+          }
+        }
+      }
     }
 
     return !checkIfDDLPlan(rootNode) &&
         (simpleOperator && noComplexComputation && isOneQueryBlock &&
-            noOrderBy && noGroupBy && noWhere && noJoin && singleRelation);
+            noOrderBy && noGroupBy && (noWhere || prefixPartitionWhere) && noJoin && singleRelation);
   }
   
   /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/8d0146b8/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileStorageManager.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileStorageManager.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileStorageManager.java
index c427940..8d425b4 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileStorageManager.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileStorageManager.java
@@ -149,6 +149,21 @@ public class FileStorageManager extends StorageManager {
     return new Path(tableBaseDir, tableName);
   }
 
+  private String partitionPath = "";
+  private int currentDepth = 0;
+
+  /**
+   * Set a specific partition path for partition-column only queries
+   * @param path The partition prefix path
+   */
+  public void setPartitionPath(String path) { partitionPath = path; }
+
+  /**
+   * Set a depth of partition path for partition-column only queries
+   * @param depth Depth of partitions
+   */
+  public void setCurrentDepth(int depth) { currentDepth = depth; }
+
   @VisibleForTesting
   public Appender getAppender(TableMeta meta, Schema schema, Path filePath)
       throws IOException {
@@ -722,8 +737,16 @@ public class FileStorageManager extends StorageManager {
 
     List<FileStatus> nonZeroLengthFiles = new ArrayList<FileStatus>();
     if (fs.exists(tablePath)) {
-      getNonZeroLengthDataFiles(fs, tablePath, nonZeroLengthFiles, currentPage, numResultFragments,
-          new AtomicInteger(0), tableDesc.hasPartition(), 0, partitionDepth);
+      if (!partitionPath.isEmpty()) {
+        Path partPath = new Path(tableDesc.getPath() + partitionPath);
+        if (fs.exists(partPath)) {
+          getNonZeroLengthDataFiles(fs, partPath, nonZeroLengthFiles, currentPage, numResultFragments,
+                  new AtomicInteger(0), tableDesc.hasPartition(), this.currentDepth, partitionDepth);
+        }
+      } else {
+        getNonZeroLengthDataFiles(fs, tablePath, nonZeroLengthFiles, currentPage, numResultFragments,
+                new AtomicInteger(0), tableDesc.hasPartition(), 0, partitionDepth);
+      }
     }
 
     List<Fragment> fragments = new ArrayList<Fragment>();


[9/9] tajo git commit: Merge branch 'index_support' of https://git-wip-us.apache.org/repos/asf/tajo into index_support

Posted by ji...@apache.org.
Merge branch 'index_support' of https://git-wip-us.apache.org/repos/asf/tajo into index_support


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

Branch: refs/heads/index_support
Commit: d09bd8ddc048fb1475d0192f1e06101a2876c72d
Parents: fd2f828 60cbe9c
Author: Jihoon Son <ji...@apache.org>
Authored: Mon Mar 23 11:56:05 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Mon Mar 23 11:56:05 2015 +0900

----------------------------------------------------------------------

----------------------------------------------------------------------