Repository: tajo
Updated Branches:
  refs/heads/master d3697d763 -> 35c24927b


TAJO-1011: EvalTreeUtil::isJoinQual need to handle other join conditions. 
(jaehwa)


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

Branch: refs/heads/master
Commit: 35c24927b9edc19c91ceb3a0264188435195cde7
Parents: d3697d7
Author: Jaehwa Jung <[email protected]>
Authored: Tue Aug 19 22:36:29 2014 +0900
Committer: Jaehwa Jung <[email protected]>
Committed: Tue Aug 19 22:36:29 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  2 ++
 .../apache/tajo/engine/eval/EvalTreeUtil.java   | 34 ++++++++++++++++----
 2 files changed, 30 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/35c24927/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index f77b19b..841eb49 100644
--- a/CHANGES
+++ b/CHANGES
@@ -115,6 +115,8 @@ Release 0.9.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1011: EvalTreeUtil::isJoinQual need to handle other join conditions. 
(jaehwa)
+
     TAJO-1009: A binary eval for column references of the same tables 
     should not be recognized as a join condition. (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/35c24927/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java 
b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
index e6c27e1..607383f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java
@@ -262,14 +262,36 @@ public class EvalTreeUtil {
       BinaryEval binaryEval = (BinaryEval) expr;
       boolean isBothTermFields = isSingleColumn(binaryEval.getLeftExpr()) && 
isSingleColumn(binaryEval.getRightExpr());
 
+      // If there is a filter using constants, we can't find unique column 
name as follows:
+      // ex) select * from lineitem where l_orderkey = 2;
+      // In this case, we may find NoSuchElementException because iterator has 
not any elements.
+      // Thus, we should find whether iterator has one more elements.
+      String leftQualifier = "", rightQualifier = "";
+      if 
(EvalTreeUtil.findUniqueColumns(binaryEval.getLeftExpr()).iterator().hasNext()) 
{
+        Column leftColumn = 
EvalTreeUtil.findUniqueColumns(binaryEval.getLeftExpr()).iterator().next();
+        leftQualifier = leftColumn.getQualifiedName();
+      }
 
-      String leftQualifier =
-          
EvalTreeUtil.findUniqueColumns(binaryEval.getLeftExpr()).iterator().next().getQualifiedName();
-      String rightQualifier =
-          
EvalTreeUtil.findUniqueColumns(binaryEval.getRightExpr()).iterator().next().getQualifiedName();
+      if 
(EvalTreeUtil.findUniqueColumns(binaryEval.getRightExpr()).iterator().hasNext())
 {
+        Column rightColumn = 
EvalTreeUtil.findUniqueColumns(binaryEval.getRightExpr()).iterator().next();
+        rightQualifier = rightColumn.getQualifiedName();
+      }
 
-      boolean isDifferentTables =
-          
!(CatalogUtil.extractQualifier(leftQualifier).equals(CatalogUtil.extractQualifier(rightQualifier)));
+      String extractLeftQualifier = 
CatalogUtil.extractQualifier(leftQualifier);
+      String extractRightQualifier = 
CatalogUtil.extractQualifier(rightQualifier);
+      boolean isDifferentTables = false;
+
+      // If there are column alias and some functions, extracted qualifier 
will be empty data as follows:
+      // ex) select   n1.n_nationkey,   substr(n1.n_name, 1, 4) name1,   
substr(n2.n_name, 1, 4) name2
+      //     from nation n1 join nation n2 on substr(n1.n_name, 1, 4) = 
substr(n2.n_name, 1, 4)
+      //     order by n1.n_nationkey;
+      // Thus, we can't check whether join tables used different tables.
+      if (extractLeftQualifier.equals("") && extractRightQualifier.equals("")) 
{
+        isDifferentTables = true;
+      } else {
+        isDifferentTables = !(CatalogUtil.extractQualifier(leftQualifier).
+            equals(CatalogUtil.extractQualifier(rightQualifier)));
+      }
 
       return joinComparator && isBothTermFields && isDifferentTables;
     } else {

Reply via email to