You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by vo...@apache.org on 2019/12/22 11:40:45 UTC
[drill] 01/02: DRILL-7490: LIMIT is not pushed to JDBC storage
plugin
This is an automated email from the ASF dual-hosted git repository.
volodymyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
commit f258eb54a8181d8a375317f60b8b96d6a356358c
Author: Volodymyr Vysotskyi <vv...@gmail.com>
AuthorDate: Wed Dec 18 19:16:08 2019 +0200
DRILL-7490: LIMIT is not pushed to JDBC storage plugin
closes #1936
---
.../exec/store/jdbc/TestJdbcPluginWithMySQLIT.java | 36 +++++++++++++---------
.../exec/planner/cost/DrillRelMdRowCount.java | 20 +-----------
2 files changed, 23 insertions(+), 33 deletions(-)
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 org.junit.experimental.categories.Category;
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 @@ public class TestJdbcPluginWithMySQLIT extends ClusterTest {
@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 @@ public class TestJdbcPluginWithMySQLIT extends ClusterTest {
"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 @@ public class TestJdbcPluginWithMySQLIT extends ClusterTest {
.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 @@ public class DrillRelMdRowCount extends RelMdRowCount{
((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 @@ public class DrillRelMdRowCount extends RelMdRowCount{
}
@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);
}