DRILL-7490: LIMIT is not pushed to JDBC storage plugin
closes #1936
diff --git a/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithMySQLIT.java b/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithMySQLIT.java
index bd065ca..6253d11 100644
--- a/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithMySQLIT.java
+++ b/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithMySQLIT.java
@@ -37,10 +37,7 @@
import java.math.BigDecimal;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
/**
* JDBC storage plugin tests against MySQL.
@@ -195,11 +192,12 @@
@Test
public void pushdownJoin() throws Exception {
String query = "select x.person_id from (select person_id from mysql.`drill_mysql_test`.person) x "
- + "join (select person_id from mysql.`drill_mysql_test`.person) y on x.person_id = y.person_id ";
- String plan = queryBuilder().sql(query).explainText();
-
- assertThat("Query plan shouldn't contain Join operator",
- plan, not(containsString("Join")));
+ + "join (select person_id from mysql.`drill_mysql_test`.person) y on x.person_id = y.person_id";
+ queryBuilder()
+ .sql(query)
+ .planMatcher()
+ .exclude("Join")
+ .match();
}
@Test
@@ -211,12 +209,11 @@
"ON e.first_name = s.first_name " +
"WHERE e.last_name > 'hello'";
- String plan = queryBuilder().sql(query).explainText();
-
- assertThat("Query plan shouldn't contain Join operator",
- plan, not(containsString("Join")));
- assertThat("Query plan shouldn't contain Filter operator",
- plan, not(containsString("Filter")));
+ queryBuilder()
+ .sql(query)
+ .planMatcher()
+ .exclude("Join", "Filter")
+ .match();
}
@Test
@@ -341,4 +338,15 @@
.baselineValuesForSingleColumn("SYSTEM VIEW", "TABLE", "VIEW")
.go();
}
+
+ @Test
+ public void testLimitPushDown() throws Exception {
+ String query = "select person_id from mysql.`drill_mysql_test`.person limit 10";
+ queryBuilder()
+ .sql(query)
+ .planMatcher()
+ .include("Jdbc\\(.*LIMIT 10")
+ .exclude("Limit\\(")
+ .match();
+ }
}
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java
index a24f5d1..0bfb70a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java
@@ -18,12 +18,9 @@
package org.apache.drill.exec.planner.cost;
import java.io.IOException;
-import org.apache.calcite.rel.SingleRel;
import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Join;
-import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.Sort;
import org.apache.calcite.rel.core.TableScan;
import org.apache.calcite.rel.core.Union;
import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider;
@@ -59,7 +56,7 @@
((AggPrelBase) rel).getOperatorPhase() == AggPrelBase.OperatorPhase.PHASE_1of2) {
// Phase 1 Aggregate would return rows in the range [NDV, input_rows]. Hence, use the
// existing estimate of 1/10 * input_rows
- Double rowCount = mq.getRowCount(rel.getInput()) / 10;
+ double rowCount = mq.getRowCount(rel.getInput()) / 10;
Double ndv = mq.getDistinctRowCount(rel.getInput(), groupKey, null);
// Use max of NDV and input_rows/10
if (ndv != null) {
@@ -83,21 +80,6 @@
}
@Override
- public Double getRowCount(Project rel, RelMetadataQuery mq) {
- return rel.estimateRowCount(mq);
- }
-
- @Override
- public Double getRowCount(Sort rel, RelMetadataQuery mq) {
- return rel.estimateRowCount(mq);
- }
-
- @Override
- public Double getRowCount(SingleRel rel, RelMetadataQuery mq) {
- return rel.estimateRowCount(mq);
- }
-
- @Override
public Double getRowCount(Join rel, RelMetadataQuery mq) {
return rel.estimateRowCount(mq);
}