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/08/19 16:55:22 UTC

tajo git commit: TAJO-1781: Join condition is still not found when it exists in OR clause.

Repository: tajo
Updated Branches:
  refs/heads/master 9ddda1405 -> f057343ee


TAJO-1781: Join condition is still not found when it exists in OR clause.

Closes #698


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

Branch: refs/heads/master
Commit: f057343ee037d4f9ed51cd2b791fb0ce438c20a5
Parents: 9ddda14
Author: Jihoon Son <ji...@apache.org>
Authored: Wed Aug 19 23:54:50 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed Aug 19 23:54:50 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 .../tajo/engine/eval/TestEvalTreeUtil.java      |   4 +-
 .../engine/query/TestCommonConditionReduce.java | 110 +++++++++++++++++++
 .../tajo/engine/query/TestSelectQuery.java      |  27 -----
 .../TestCommonConditionReduce/test11.plan       |   7 ++
 .../TestCommonConditionReduce/test11.result     |  27 +++++
 .../TestCommonConditionReduce/test21.plan       |   7 ++
 .../TestCommonConditionReduce/test21.result     |  27 +++++
 .../TestCommonConditionReduce/test31.plan       |   7 ++
 .../TestCommonConditionReduce/test31.result     |   7 ++
 .../TestCommonConditionReduce/test41.plan       |   7 ++
 .../TestCommonConditionReduce/test41.result     |   3 +
 .../TestCommonConditionReduce/test51.plan       |   7 ++
 .../TestCommonConditionReduce/test51.result     |   3 +
 .../TestCommonConditionReduce/test61.plan       |   7 ++
 .../TestCommonConditionReduce/test61.result     |   4 +
 .../TestCommonConditionReduce/test71.plan       |   7 ++
 .../TestCommonConditionReduce/test71.result     |   3 +
 .../TestCommonConditionReduce/test81.plan       |   7 ++
 .../TestCommonConditionReduce/test81.result     |   6 +
 .../testSelectWithCommonQuals1.1.plan           |   7 --
 .../testSelectWithCommonQuals1.1.result         |  27 -----
 .../testSelectWithCommonQuals2.1.plan           |   7 --
 .../testSelectWithCommonQuals2.1.result         |  27 -----
 .../testSelectWithCommonQuals3.1.plan           |   7 --
 .../testSelectWithCommonQuals3.1.result         |   7 --
 .../results/TestTPCH/testQ2FourJoins.plan       |   4 +-
 .../resources/results/TestTPCH/testTPCHQ5.plan  |   8 +-
 .../apache/tajo/plan/expr/AlgebraicUtil.java    |  14 ++-
 .../org/apache/tajo/plan/expr/BinaryEval.java   |   8 +-
 .../rules/CommonConditionReduceRule.java        |  88 ++++++++-------
 31 files changed, 324 insertions(+), 160 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 7ae360a..3028bea 100644
--- a/CHANGES
+++ b/CHANGES
@@ -229,6 +229,9 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1781: Join condition is still not found when it exists in OR clause. i
+    (jihoon)
+
     TAJO-1777: JsonLineDeserializer returns invalid unicode text, 
     if contains control character. (jinho)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
index 5b6fda4..f5a6e3f 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
@@ -288,8 +288,8 @@ public class TestEvalTreeUtil {
     EvalNode [] cnf = AlgebraicUtil.toDisjunctiveNormalFormArray(node);
     assertEquals(2, cnf.length);
 
-    assertEquals("default.people.score (INT4) > 1 AND default.people.score (INT4) < 3", cnf[0].toString());
-    assertEquals("7 < default.people.score (INT4) AND default.people.score (INT4) < 10", cnf[1].toString());
+    assertEquals("(default.people.score (INT4) > 1 AND default.people.score (INT4) < 3)", cnf[0].toString());
+    assertEquals("(7 < default.people.score (INT4) AND default.people.score (INT4) < 10)", cnf[1].toString());
   }
   
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCommonConditionReduce.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCommonConditionReduce.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCommonConditionReduce.java
new file mode 100644
index 0000000..6972e1f
--- /dev/null
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCommonConditionReduce.java
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.engine.query;
+
+import org.apache.tajo.IntegrationTest;
+import org.apache.tajo.QueryTestCaseBase;
+import org.apache.tajo.TajoConstants;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.sql.ResultSet;
+
+@Category(IntegrationTest.class)
+public class TestCommonConditionReduce extends QueryTestCaseBase {
+
+  public TestCommonConditionReduce() {
+    super(TajoConstants.DEFAULT_DATABASE_NAME);
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest (
+      queries = @QuerySpec("select * from nation where (n_regionkey = 1 or n_name is not null) and (n_regionkey = 1 or n_comment is not null)")
+  )
+  public void test1() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from nation where (n_regionkey = 1 or n_name is not null) and (n_regionkey = 1 or n_name is not null)")
+  )
+  public void test2() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from nation where (n_regionkey = 1 and n_name is not null) or (n_regionkey = 1 and n_comment is not null)")
+  )
+  public void test3() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from lineitem where (l_orderkey = 1 and l_suppkey = 7706 and l_comment is not null) or (l_orderkey = 1 and l_suppkey = 7706 and l_linenumber = 17) or (l_orderkey = 1 and l_suppkey = 7706 and l_commitdate is not null)")
+  )
+  public void test4() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from lineitem where (l_orderkey = 1 and l_suppkey = 7706 and l_comment is not null) and (l_orderkey = 1 and l_suppkey = 7706 and l_linenumber = 1) and (l_orderkey = 1 and l_suppkey = 7706 and l_commitdate is not null)")
+  )
+  public void test5() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from lineitem \n" +
+          "where (l_orderkey = 1 and (l_suppkey = 7706 or l_comment is not null)) or (l_orderkey = 1 and (l_suppkey = 7706 or l_linenumber = 1)) or (l_orderkey = 1 and (l_suppkey = 7706 or l_commitdate is not null))")
+  )
+  public void test6() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from lineitem \n" +
+          "where l_orderkey = 1 and l_orderkey = 1 and l_orderkey = 1 and l_orderkey = 1 and l_linenumber = 1")
+  )
+  public void test7() throws Exception {
+    runSimpleTests();
+  }
+
+  @Test
+  @Option(withExplain = true)
+  @SimpleTest(
+      queries = @QuerySpec("select * from lineitem \n" +
+          "where l_orderkey = 1 and l_orderkey = 1 and l_orderkey = 1 and l_orderkey = 1 or l_linenumber = 1")
+  )
+  public void test8() throws Exception {
+    runSimpleTests();
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
index 0fd6fcf..1637c85 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
@@ -758,31 +758,4 @@ public class TestSelectQuery extends QueryTestCaseBase {
     assertResultSet(res);
     cleanupQuery(res);
   }
-
-  @Test
-  @Option(withExplain = true)
-  @SimpleTest (
-      queries = @QuerySpec("select * from nation where (n_regionkey = 1 or n_name is not null) and (n_regionkey = 1 or n_comment is not null)")
-  )
-  public void testSelectWithCommonQuals1() throws Exception {
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true)
-  @SimpleTest(
-      queries = @QuerySpec("select * from nation where (n_regionkey = 1 or n_name is not null) and (n_regionkey = 1 or n_name is not null)")
-  )
-  public void testSelectWithCommonQuals2() throws Exception {
-    runSimpleTests();
-  }
-
-  @Test
-  @Option(withExplain = true)
-  @SimpleTest(
-      queries = @QuerySpec("select * from nation where (n_regionkey = 1 and n_name is not null) or (n_regionkey = 1 and n_comment is not null)")
-  )
-  public void testSelectWithCommonQuals3() throws Exception {
-    runSimpleTests();
-  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.plan
new file mode 100644
index 0000000..a13817f
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.nation
+  => filter: (default.nation.n_regionkey (INT4) = 1 OR (default.nation.n_name (TEXT) IS NOT NULL AND default.nation.n_comment (TEXT) IS NOT NULL))
+  => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+  => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.result
new file mode 100644
index 0000000..91f0969
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test11.result
@@ -0,0 +1,27 @@
+n_nationkey,n_name,n_regionkey,n_comment
+-------------------------------
+0,ALGERIA,0, haggle. carefully final deposits detect slyly agai
+1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon
+2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special 
+3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
+4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d
+5,ETHIOPIA,0,ven packages wake quickly. regu
+6,FRANCE,3,refully final requests. regular, ironi
+7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco
+8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun
+9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull
+10,IRAN,4,efully alongside of the slyly final dependencies. 
+11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula
+12,JAPAN,2,ously. final, express gifts cajole a
+13,JORDAN,4,ic deposits are blithely about the carefully regular pa
+14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t
+15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?
+16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r
+17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
+18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos
+19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account
+20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely
+21,VIETNAM,2,hely enticingly express accounts. even, final 
+22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint
+23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull
+24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.plan
new file mode 100644
index 0000000..1470a88
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.nation
+  => filter: (default.nation.n_regionkey (INT4) = 1 OR default.nation.n_name (TEXT) IS NOT NULL)
+  => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+  => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.result
new file mode 100644
index 0000000..91f0969
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test21.result
@@ -0,0 +1,27 @@
+n_nationkey,n_name,n_regionkey,n_comment
+-------------------------------
+0,ALGERIA,0, haggle. carefully final deposits detect slyly agai
+1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon
+2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special 
+3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
+4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d
+5,ETHIOPIA,0,ven packages wake quickly. regu
+6,FRANCE,3,refully final requests. regular, ironi
+7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco
+8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun
+9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull
+10,IRAN,4,efully alongside of the slyly final dependencies. 
+11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula
+12,JAPAN,2,ously. final, express gifts cajole a
+13,JORDAN,4,ic deposits are blithely about the carefully regular pa
+14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t
+15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?
+16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r
+17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
+18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos
+19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account
+20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely
+21,VIETNAM,2,hely enticingly express accounts. even, final 
+22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint
+23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull
+24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.plan
new file mode 100644
index 0000000..1b40b09
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.nation
+  => filter: (default.nation.n_regionkey (INT4) = 1 AND (default.nation.n_name (TEXT) IS NOT NULL OR default.nation.n_comment (TEXT) IS NOT NULL))
+  => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
+  => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
+  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.result
new file mode 100644
index 0000000..85bf5bb
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test31.result
@@ -0,0 +1,7 @@
+n_nationkey,n_name,n_regionkey,n_comment
+-------------------------------
+1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon
+2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special 
+3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
+17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
+24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.plan
new file mode 100644
index 0000000..67c3700
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.lineitem
+  => filter: (default.lineitem.l_orderkey (INT4) = 1 AND (default.lineitem.l_suppkey (INT4) = 7706 AND (default.lineitem.l_comment (TEXT) IS NOT NULL OR (default.lineitem.l_linenumber (INT4) = 17 OR default.lineitem.l_commitdate (TEXT) IS NOT NULL))))
+  => target list: default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)
+  => out schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.result
new file mode 100644
index 0000000..05c4b30
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test41.result
@@ -0,0 +1,3 @@
+l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment
+-------------------------------
+1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.plan
new file mode 100644
index 0000000..5f1d6c0
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.lineitem
+  => filter: (default.lineitem.l_linenumber (INT4) = 1 AND (default.lineitem.l_orderkey (INT4) = 1 AND (default.lineitem.l_suppkey (INT4) = 7706 AND (default.lineitem.l_comment (TEXT) IS NOT NULL AND default.lineitem.l_commitdate (TEXT) IS NOT NULL))))
+  => target list: default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)
+  => out schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.result
new file mode 100644
index 0000000..05c4b30
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test51.result
@@ -0,0 +1,3 @@
+l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment
+-------------------------------
+1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.plan
new file mode 100644
index 0000000..fbde5b8
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.lineitem
+  => filter: (default.lineitem.l_orderkey (INT4) = 1 AND ((default.lineitem.l_suppkey (INT4) = 7706 OR default.lineitem.l_comment (TEXT) IS NOT NULL) OR ((default.lineitem.l_suppkey (INT4) = 7706 OR default.lineitem.l_linenumber (INT4) = 1) OR (default.lineitem.l_suppkey (INT4) = 7706 OR default.lineitem.l_commitdate (TEXT) IS NOT NULL))))
+  => target list: default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)
+  => out schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.result
new file mode 100644
index 0000000..627c635
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test61.result
@@ -0,0 +1,4 @@
+l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment
+-------------------------------
+1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the
+1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold 

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.plan
new file mode 100644
index 0000000..2d32965
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.lineitem
+  => filter: (default.lineitem.l_linenumber (INT4) = 1 AND default.lineitem.l_orderkey (INT4) = 1)
+  => target list: default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)
+  => out schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.result
new file mode 100644
index 0000000..05c4b30
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test71.result
@@ -0,0 +1,3 @@
+l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment
+-------------------------------
+1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.plan b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.plan
new file mode 100644
index 0000000..6390fb0
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.plan
@@ -0,0 +1,7 @@
+explain
+-------------------------------
+SCAN(0) on default.lineitem
+  => filter: (default.lineitem.l_orderkey (INT4) = 1 OR default.lineitem.l_linenumber (INT4) = 1)
+  => target list: default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)
+  => out schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}
+  => in schema: {(16) default.lineitem.l_comment (TEXT), default.lineitem.l_commitdate (TEXT), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_linenumber (INT4), default.lineitem.l_linestatus (TEXT), default.lineitem.l_orderkey (INT4), default.lineitem.l_partkey (INT4), default.lineitem.l_quantity (FLOAT8), default.lineitem.l_receiptdate (TEXT), default.lineitem.l_returnflag (TEXT), default.lineitem.l_shipdate (TEXT), default.lineitem.l_shipinstruct (TEXT), default.lineitem.l_shipmode (TEXT), default.lineitem.l_suppkey (INT4), default.lineitem.l_tax (FLOAT8)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.result b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.result
new file mode 100644
index 0000000..488e9e6
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestCommonConditionReduce/test81.result
@@ -0,0 +1,6 @@
+l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment
+-------------------------------
+1,1,7706,1,17.0,21168.23,0.04,0.02,N,O,1996-03-13,1996-02-12,1996-03-22,DELIVER IN PERSON,TRUCK,egular courts above the
+1,1,7311,2,36.0,45983.16,0.09,0.06,N,O,1996-04-12,1996-02-28,1996-04-20,TAKE BACK RETURN,MAIL,ly final dependencies: slyly bold 
+2,2,1191,1,38.0,44694.46,0.0,0.05,N,O,1997-01-28,1997-01-14,1997-02-02,TAKE BACK RETURN,RAIL,ven requests. deposits breach a
+3,2,1798,1,45.0,54058.05,0.06,0.0,R,F,1994-02-02,1994-01-04,1994-02-23,NONE,AIR,ongside of the furiously brave acco

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.plan b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.plan
deleted file mode 100644
index d49b01e..0000000
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.plan
+++ /dev/null
@@ -1,7 +0,0 @@
-explain
--------------------------------
-SCAN(0) on default.nation
-  => filter: default.nation.n_regionkey (INT4) = 1 OR default.nation.n_name (TEXT) IS NOT NULL AND default.nation.n_comment (TEXT) IS NOT NULL
-  => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-  => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.result b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.result
deleted file mode 100644
index 91f0969..0000000
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals1.1.result
+++ /dev/null
@@ -1,27 +0,0 @@
-n_nationkey,n_name,n_regionkey,n_comment
--------------------------------
-0,ALGERIA,0, haggle. carefully final deposits detect slyly agai
-1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon
-2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special 
-3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
-4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d
-5,ETHIOPIA,0,ven packages wake quickly. regu
-6,FRANCE,3,refully final requests. regular, ironi
-7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco
-8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun
-9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull
-10,IRAN,4,efully alongside of the slyly final dependencies. 
-11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula
-12,JAPAN,2,ously. final, express gifts cajole a
-13,JORDAN,4,ic deposits are blithely about the carefully regular pa
-14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t
-15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?
-16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r
-17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
-18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos
-19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account
-20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely
-21,VIETNAM,2,hely enticingly express accounts. even, final 
-22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint
-23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull
-24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.plan b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.plan
deleted file mode 100644
index fa47fda..0000000
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.plan
+++ /dev/null
@@ -1,7 +0,0 @@
-explain
--------------------------------
-SCAN(0) on default.nation
-  => filter: default.nation.n_regionkey (INT4) = 1 OR default.nation.n_name (TEXT) IS NOT NULL
-  => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-  => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.result b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.result
deleted file mode 100644
index 91f0969..0000000
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals2.1.result
+++ /dev/null
@@ -1,27 +0,0 @@
-n_nationkey,n_name,n_regionkey,n_comment
--------------------------------
-0,ALGERIA,0, haggle. carefully final deposits detect slyly agai
-1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon
-2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special 
-3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
-4,EGYPT,4,y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d
-5,ETHIOPIA,0,ven packages wake quickly. regu
-6,FRANCE,3,refully final requests. regular, ironi
-7,GERMANY,3,l platelets. regular accounts x-ray: unusual, regular acco
-8,INDIA,2,ss excuses cajole slyly across the packages. deposits print aroun
-9,INDONESIA,2, slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull
-10,IRAN,4,efully alongside of the slyly final dependencies. 
-11,IRAQ,4,nic deposits boost atop the quickly final requests? quickly regula
-12,JAPAN,2,ously. final, express gifts cajole a
-13,JORDAN,4,ic deposits are blithely about the carefully regular pa
-14,KENYA,0, pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t
-15,MOROCCO,0,rns. blithely bold courts among the closely regular packages use furiously bold platelets?
-16,MOZAMBIQUE,0,s. ironic, unusual asymptotes wake blithely r
-17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
-18,CHINA,2,c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos
-19,ROMANIA,3,ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account
-20,SAUDI ARABIA,4,ts. silent requests haggle. closely express packages sleep across the blithely
-21,VIETNAM,2,hely enticingly express accounts. even, final 
-22,RUSSIA,3, requests against the platelets use never according to the quickly regular pint
-23,UNITED KINGDOM,3,eans boost carefully special requests. accounts are. carefull
-24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.plan b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.plan
deleted file mode 100644
index 90adfc4..0000000
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.plan
+++ /dev/null
@@ -1,7 +0,0 @@
-explain
--------------------------------
-SCAN(0) on default.nation
-  => filter: default.nation.n_regionkey (INT4) = 1 AND default.nation.n_name (TEXT) IS NOT NULL OR default.nation.n_comment (TEXT) IS NOT NULL
-  => target list: default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)
-  => out schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
-  => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.result b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.result
deleted file mode 100644
index 85bf5bb..0000000
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testSelectWithCommonQuals3.1.result
+++ /dev/null
@@ -1,7 +0,0 @@
-n_nationkey,n_name,n_regionkey,n_comment
--------------------------------
-1,ARGENTINA,1,al foxes promise slyly according to the regular accounts. bold requests alon
-2,BRAZIL,1,y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special 
-3,CANADA,1,eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold
-17,PERU,1,platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun
-24,UNITED STATES,1,y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTPCH/testQ2FourJoins.plan b/tajo-core-tests/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
index 945b6e4..dbee0e3 100644
--- a/tajo-core-tests/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
+++ b/tajo-core-tests/src/test/resources/results/TestTPCH/testQ2FourJoins.plan
@@ -25,7 +25,7 @@ JOIN(14)(INNER)
      => out schema: {(11) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
      => in schema: {(12) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT), default.partsupp.ps_partkey (INT4), default.partsupp.ps_supplycost (FLOAT8), default.supplier.s_acctbal (FLOAT8), default.supplier.s_address (TEXT), default.supplier.s_comment (TEXT), default.supplier.s_name (TEXT), default.supplier.s_nationkey (INT4), default.supplier.s_phone (TEXT)}
       SCAN(7) on default.part
-        => filter: default.part.p_size (INT4) = 15 AND default.part.p_type (TEXT)LIKE'%BRASS'
+        => filter: (default.part.p_size (INT4) = 15 AND default.part.p_type (TEXT)LIKE'%BRASS')
         => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)
         => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
         => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}
@@ -127,7 +127,7 @@ Block Id: eb_0000000000000_0000_000004 [LEAF]
 [q_0000000000000_0000] 4 => 5 (type=HASH_SHUFFLE, key=default.part.p_partkey (INT4), num=32)
 
 SCAN(7) on default.part
-  => filter: default.part.p_size (INT4) = 15 AND default.part.p_type (TEXT)LIKE'%BRASS'
+  => filter: (default.part.p_size (INT4) = 15 AND default.part.p_type (TEXT)LIKE'%BRASS')
   => target list: default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)
   => out schema: {(4) default.part.p_mfgr (TEXT), default.part.p_partkey (INT4), default.part.p_size (INT4), default.part.p_type (TEXT)}
   => in schema: {(9) default.part.p_brand (TEXT), default.part.p_comment (TEXT), default.part.p_container (TEXT), default.part.p_mfgr (TEXT), default.part.p_name (TEXT), default.part.p_partkey (INT4), default.part.p_retailprice (FLOAT8), default.part.p_size (INT4), default.part.p_type (TEXT)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan b/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
index 77c3f59..594b540 100644
--- a/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
+++ b/tajo-core-tests/src/test/resources/results/TestTPCH/testTPCHQ5.plan
@@ -27,7 +27,7 @@ SORT(8)
               => out schema: {(3) default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
               => in schema: {(4) default.nation.n_comment (TEXT), default.nation.n_name (TEXT), default.nation.n_nationkey (INT4), default.nation.n_regionkey (INT4)}
          JOIN(18)(INNER)
-           => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_custkey (INT4) AND default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4)
+           => Join Cond: (default.customer.c_custkey (INT4) = default.orders.o_custkey (INT4) AND default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4))
            => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)
            => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
            => in schema: {(8) ?multiply (FLOAT8), default.customer.c_custkey (INT4), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.orders.o_custkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}
@@ -37,7 +37,7 @@ SORT(8)
               => out schema: {(5) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.orders.o_custkey (INT4)}
               => in schema: {(7) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_orderkey (INT4), default.lineitem.l_suppkey (INT4), default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
                SCAN(1) on default.orders
-                 => filter: default.orders.o_orderdate (TEXT) >= 1994-01-01 AND default.orders.o_orderdate (TEXT) < 1995-01-01
+                 => filter: (default.orders.o_orderdate (TEXT) >= 1994-01-01 AND default.orders.o_orderdate (TEXT) < 1995-01-01)
                  => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
                  => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
                  => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
@@ -140,7 +140,7 @@ Block Id: eb_0000000000000_0000_000005 [LEAF]
 [q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE, key=default.orders.o_orderkey (INT4), num=32)
 
 SCAN(1) on default.orders
-  => filter: default.orders.o_orderdate (TEXT) >= 1994-01-01 AND default.orders.o_orderdate (TEXT) < 1995-01-01
+  => filter: (default.orders.o_orderdate (TEXT) >= 1994-01-01 AND default.orders.o_orderdate (TEXT) < 1995-01-01)
   => target list: default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)
   => out schema: {(2) default.orders.o_custkey (INT4), default.orders.o_orderkey (INT4)}
   => in schema: {(9) default.orders.o_clerk (TEXT), default.orders.o_comment (TEXT), default.orders.o_custkey (INT4), default.orders.o_orderdate (TEXT), default.orders.o_orderkey (INT4), default.orders.o_orderpriority (TEXT), default.orders.o_orderstatus (TEXT), default.orders.o_shippriority (INT4), default.orders.o_totalprice (FLOAT8)}
@@ -228,7 +228,7 @@ Block Id: eb_0000000000000_0000_000007 [INTERMEDIATE]
 [q_0000000000000_0000] 7 => 11 (type=HASH_SHUFFLE, key=default.supplier.s_nationkey (INT4), num=32)
 
 JOIN(18)(INNER)
-  => Join Cond: default.customer.c_custkey (INT4) = default.orders.o_custkey (INT4) AND default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4)
+  => Join Cond: (default.customer.c_custkey (INT4) = default.orders.o_custkey (INT4) AND default.lineitem.l_suppkey (INT4) = default.supplier.s_suppkey (INT4))
   => target list: ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)
   => out schema: {(4) ?multiply (FLOAT8), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.supplier.s_nationkey (INT4)}
   => in schema: {(8) ?multiply (FLOAT8), default.customer.c_custkey (INT4), default.lineitem.l_discount (FLOAT8), default.lineitem.l_extendedprice (FLOAT8), default.lineitem.l_suppkey (INT4), default.orders.o_custkey (INT4), default.supplier.s_nationkey (INT4), default.supplier.s_suppkey (INT4)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/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 cba41c1..d953da1 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
@@ -384,18 +384,22 @@ public class AlgebraicUtil {
     }
   }
 
+  public static EvalNode createSingletonExprFromDNF(Collection<EvalNode> dnfExprs) {
+    return createSingletonExprFromDNF(dnfExprs.toArray(new EvalNode[dnfExprs.size()]));
+  }
+
   /**
    * Convert a list of conjunctive normal forms into a singleton expression.
    *
-   * @param cnfExprs
+   * @param dnfExprs
    * @return The EvalNode object that merges all CNF-formed expressions.
    */
-  public static EvalNode createSingletonExprFromDNF(EvalNode... cnfExprs) {
-    if (cnfExprs.length == 1) {
-      return cnfExprs[0];
+  public static EvalNode createSingletonExprFromDNF(EvalNode... dnfExprs) {
+    if (dnfExprs.length == 1) {
+      return dnfExprs[0];
     }
 
-    return createSingletonExprFromDNFRecursive(cnfExprs, 0);
+    return createSingletonExprFromDNFRecursive(dnfExprs, 0);
   }
 
   private static EvalNode createSingletonExprFromDNFRecursive(EvalNode[] evalNode, int idx) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java
index 531cb9f..e792c34 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java
@@ -188,7 +188,13 @@ public class BinaryEval extends EvalNode implements Cloneable {
   }
 
 	public String toString() {
-		return leftExpr +" " + type.getOperatorName() + " "+ rightExpr;
+    StringBuilder sb = new StringBuilder();
+    sb.append(leftExpr).append(" ").append(type.getOperatorName()).append(" ").append(rightExpr);
+    if (type == EvalType.AND || type == EvalType.OR) {
+      sb.insert(0, "(");
+      sb.append(")");
+    }
+    return sb.toString();
 	}
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/f057343e/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/CommonConditionReduceRule.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/CommonConditionReduceRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/CommonConditionReduceRule.java
index ac4ef81..f66350a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/CommonConditionReduceRule.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/CommonConditionReduceRule.java
@@ -160,60 +160,74 @@ public class CommonConditionReduceRule implements LogicalPlanRewriteRule {
     }
 
     private EvalNode rewrite(BinaryEval evalNode) {
-      // Example qual: ( a | b ) ^ ( a | c )
-      EvalType outerType = evalNode.getType(); // type of the outer operation. ex) ^
-      EvalType innerType = outerType == EvalType.AND ? EvalType.OR : EvalType.AND; // type of the inner operation. ex) |
+      // Example qual: ( a OR b ) AND ( a OR c )
+      EvalType outerType = evalNode.getType(); // type of the outer operation. ex) AND
 
-      EvalNode finalQual;
+      EvalNode finalQual = evalNode;
+      if ((evalNode.getLeftExpr().getType() == EvalType.AND || evalNode.getLeftExpr().getType() == EvalType.OR) &&
+          evalNode.getLeftExpr().getType() == evalNode.getRightExpr().getType()) {
+        EvalNode leftChild = evalNode.getLeftExpr();
+        EvalNode rightChild = evalNode.getRightExpr();
 
-      if (evalNode.getLeftExpr().getType() == innerType &&
-          evalNode.getRightExpr().getType() == innerType) {
-        BinaryEval leftChild = evalNode.getLeftExpr();
-        BinaryEval rightChild = evalNode.getRightExpr();
+        EvalType innerType = leftChild.getType();
 
         // Find common quals from the left and right children.
         Set<EvalNode> commonQuals = TUtil.newHashSet();
-        Set<EvalNode> childrenOfLeft = TUtil.newHashSet(leftChild.getLeftExpr(), leftChild.getRightExpr());
-        for (int i = 0; i < 2; i++) {
-          if (childrenOfLeft.contains(rightChild.getChild(i))) {
-            commonQuals.add(rightChild.getChild(i));
+        Set<EvalNode> leftChildSplits = innerType == EvalType.AND ?
+            TUtil.newHashSet(AlgebraicUtil.toConjunctiveNormalFormArray(leftChild)) :
+            TUtil.newHashSet(AlgebraicUtil.toDisjunctiveNormalFormArray(leftChild));
+        Set<EvalNode> rightChildSplits = innerType == EvalType.AND ?
+            TUtil.newHashSet(AlgebraicUtil.toConjunctiveNormalFormArray(rightChild)) :
+            TUtil.newHashSet(AlgebraicUtil.toDisjunctiveNormalFormArray(rightChild));
+
+        for (EvalNode eachLeftChildSplit : leftChildSplits) {
+          if (rightChildSplits.contains(eachLeftChildSplit)) {
+            commonQuals.add(eachLeftChildSplit);
           }
         }
 
-        if (commonQuals.size() == 2) {
-          // Ex) ( a | b ) ^ ( a | b )
+        if (leftChildSplits.size() == rightChildSplits.size() &&
+            commonQuals.size() == leftChildSplits.size()) {
+          // Ex) ( a OR b ) AND ( a OR b )
           // Current binary eval has the same left and right children, so it is useless.
           // Connect the parent of the current eval and one of the children directly.
           finalQual = leftChild;
-          plan.addHistory("Common condition is reduced.");
-
-        } else if (commonQuals.size() == 1) {
-          // A single common qual is found.
-          // ( a | b ) ^ ( a | c ) -> a | (b ^ c)
-          EvalNode commonQual = commonQuals.iterator().next();
-          EvalNode nonCommonQual;
-
-          if (leftChild.getLeftExpr().equals(commonQual)) {
-            nonCommonQual = leftChild.getRightExpr();
-          } else {
-            nonCommonQual = leftChild.getLeftExpr();
-          }
-
-          if (rightChild.getLeftExpr().equals(commonQual)) {
-            nonCommonQual = new BinaryEval(outerType, nonCommonQual, rightChild.getRightExpr());
+        } else if (commonQuals.size() == leftChildSplits.size()) {
+          // Ex) ( a OR b ) AND ( a OR b OR c )
+          finalQual = rightChild;
+        } else if (commonQuals.size() == rightChildSplits.size()) {
+          // Ex) ( a OR b OR c ) AND ( a OR b )
+          finalQual = leftChild;
+        } else if (commonQuals.size() > 0) {
+          // Common quals are found.
+          // ( a OR b ) AND ( a OR c ) -> a OR (b AND c)
+
+          // Find non-common quals.
+          leftChildSplits.removeAll(commonQuals);
+          rightChildSplits.removeAll(commonQuals);
+
+          // Recreate both children using non-common quals.
+          EvalNode commonQual;
+          if (innerType == EvalType.AND) {
+            leftChild = AlgebraicUtil.createSingletonExprFromCNF(leftChildSplits);
+            rightChild = AlgebraicUtil.createSingletonExprFromCNF(rightChildSplits);
+            commonQual = AlgebraicUtil.createSingletonExprFromCNF(commonQuals);
           } else {
-            nonCommonQual = new BinaryEval(outerType, nonCommonQual, rightChild.getLeftExpr());
+            leftChild = AlgebraicUtil.createSingletonExprFromDNF(leftChildSplits);
+            rightChild = AlgebraicUtil.createSingletonExprFromDNF(rightChildSplits);
+            commonQual = AlgebraicUtil.createSingletonExprFromDNF(commonQuals);
           }
 
-          finalQual = new BinaryEval(innerType, commonQual, nonCommonQual);
-          plan.addHistory("Common condition is reduced.");
-        } else {
-          finalQual = evalNode;
+          finalQual = new BinaryEval(innerType, commonQual, new BinaryEval(outerType, leftChild, rightChild));
         }
-      } else {
-        finalQual = evalNode;
+      } else if (evalNode.getLeftExpr().equals(evalNode.getRightExpr())) {
+        finalQual = evalNode.getLeftExpr();
       }
 
+      // Just compare that finalQual and evalNode is the same instance.
+      if (finalQual != evalNode) {
+        plan.addHistory("Common condition is reduced.");
+      }
       return finalQual;
     }