aboutsummaryrefslogtreecommitdiff
path: root/contrib/storage-hbase/src
diff options
context:
space:
mode:
authorArina Ielchiieva <arina.yelchiyeva@gmail.com>2018-06-12 14:46:34 +0000
committerArina Ielchiieva <arina.yelchiyeva@gmail.com>2018-06-13 12:50:43 +0300
commit63d0251502ac7a3af5a761b1a70a958ca0be1ae1 (patch)
treefc27111974869a0f95fc9fd0ace1fa21132335fc /contrib/storage-hbase/src
parentcbcb59df5ccc655e374ac6244c572088153aedc6 (diff)
DRILL-6489: Fix filter push down for Hbase & Mapr-DB binary tables when convert function is used in a view
Diffstat (limited to 'contrib/storage-hbase/src')
-rw-r--r--contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/CompareFunctionsProcessor.java17
-rw-r--r--contrib/storage-hbase/src/test/java/org/apache/drill/hbase/TestHBaseFilterPushDown.java16
2 files changed, 33 insertions, 0 deletions
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/CompareFunctionsProcessor.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/CompareFunctionsProcessor.java
index 0672b53c0..59df4e2cc 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/CompareFunctionsProcessor.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/CompareFunctionsProcessor.java
@@ -22,6 +22,8 @@ import io.netty.buffer.Unpooled;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.drill.common.expression.CastExpression;
import org.apache.drill.common.expression.ConvertExpression;
@@ -51,6 +53,10 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
public class CompareFunctionsProcessor extends AbstractExprVisitor<Boolean, LogicalExpression, RuntimeException> {
+
+ // to check that function name starts with convert_from disregarding the case and has encoding after
+ private static final Pattern convertFromPattern = Pattern.compile(String.format("^%s(.+)", ConvertExpression.CONVERT_FROM), Pattern.CASE_INSENSITIVE);
+
private byte[] value;
private boolean success;
private boolean isEqualityFn;
@@ -511,6 +517,17 @@ public class CompareFunctionsProcessor extends AbstractExprVisitor<Boolean, Logi
return false;
}
+ @Override
+ public Boolean visitFunctionCall(FunctionCall call, LogicalExpression valueArg) {
+ Matcher matcher = convertFromPattern.matcher(call.getName());
+ if (matcher.find()) {
+ // convert function call to ConvertExpression
+ ConvertExpression convert = new ConvertExpression(ConvertExpression.CONVERT_FROM, matcher.group(1), call.args.get(0), call.getPosition());
+ return visitConvertExpression(convert, valueArg);
+ }
+ return false;
+ }
+
protected static ByteBuf newByteBuf(int size, boolean bigEndian) {
return Unpooled.wrappedBuffer(new byte[size])
.order(bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN)
diff --git a/contrib/storage-hbase/src/test/java/org/apache/drill/hbase/TestHBaseFilterPushDown.java b/contrib/storage-hbase/src/test/java/org/apache/drill/hbase/TestHBaseFilterPushDown.java
index 0e14cb183..e6eff116f 100644
--- a/contrib/storage-hbase/src/test/java/org/apache/drill/hbase/TestHBaseFilterPushDown.java
+++ b/contrib/storage-hbase/src/test/java/org/apache/drill/hbase/TestHBaseFilterPushDown.java
@@ -780,5 +780,21 @@ public class TestHBaseFilterPushDown extends BaseHBaseTest {
runHBaseSQLVerifyCount(sql, 2);
}
+ @Test
+ public void testConvertFromPushDownWithView() throws Exception {
+ test("create view dfs.tmp.pd_view as\n" +
+ "select convert_from(byte_substr(row_key, 1, 8), 'date_epoch_be') as d\n" +
+ "from hbase.`TestTableCompositeDate`");
+
+ String query = "select d from dfs.tmp.pd_view where d > date '2015-06-13' and d < DATE '2015-06-18'";
+ String[] expectedPlan = {
+ "startRow=\\\\x00\\\\x00\\\\x01M\\\\xEF\\]\\\\xA0\\\\x00, " +
+ "stopRow=\\\\x00\\\\x00\\\\x01N\\\\x03\\\\xF7\\\\x10\\\\x00, " +
+ "filter=null"};
+ String[] excludedPlan ={"Filter\\("};
+ PlanTestBase.testPlanMatchingPatterns(query, expectedPlan, excludedPlan);
+
+ runHBaseSQLVerifyCount(query, 12);
+ }
}