From a71efa546a86284b22f77b3e56e50c2035e3e121 Mon Sep 17 00:00:00 2001 From: arshadhblackstraw Date: Thu, 16 Jul 2020 12:40:41 +0530 Subject: [PATCH 1/4] DRILL-7719 Adding Timestamp handler to visitSchemaPath --- .../exec/store/mongo/MongoCompareFunctionProcessor.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java index 33e5d008d00..4a3920f5f29 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java @@ -221,6 +221,14 @@ public Boolean visitSchemaPath(SchemaPath path, LogicalExpression valueArg) return true; } + //To support Drill Timestamp converter + if (valueArg instanceof TimeStampExpression) { + Long unixseconds = ((TimeStampExpression) valueArg).getTimeStamp(); + this.value = new Date(unixseconds); + this.path = path; + return true; + } + // Mongo does not support decimals, therefore double value is used. // See list of supported types in BsonValueCodecProvider. if (valueArg instanceof VarDecimalExpression) { From 633d8e227bcbf2899d903bcfc60f204607fa9d83 Mon Sep 17 00:00:00 2001 From: arshadhblackstraw Date: Thu, 16 Jul 2020 12:48:05 +0530 Subject: [PATCH 2/4] Add support to handle STRPOS function using mongo operator --- .../mongo/MongoCompareFunctionProcessor.java | 19 ++++++++++++++++++- .../exec/store/mongo/MongoFilterBuilder.java | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java index 4a3920f5f29..98627ea5198 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java @@ -179,6 +179,23 @@ public Boolean visitConvertExpression(ConvertExpression e, @Override public Boolean visitUnknown(LogicalExpression e, LogicalExpression valueArg) throws RuntimeException { + if (e instanceof FunctionCall){ + + String name = ((FunctionCall) e).getName(); + //handle strpos function in Drill + if (name.equals("strpos")){ + LogicalExpression arg_0 = ((FunctionCall) e).arg(0); + LogicalExpression arg_1 = ((FunctionCall) e).arg(1); + QuotedString arg_1qs = (QuotedString) arg_1; + + this.functionName = name; + this.path = (SchemaPath) arg_0; + this.value = arg_1qs.getString(); + return true; + } + + } + return false; } @@ -221,7 +238,7 @@ public Boolean visitSchemaPath(SchemaPath path, LogicalExpression valueArg) return true; } - //To support Drill Timestamp converter + //To support Drill Timestamp converter if (valueArg instanceof TimeStampExpression) { Long unixseconds = ((TimeStampExpression) valueArg).getTimeStamp(); this.value = new Date(unixseconds); diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java index 10720e4753a..64c5b30fbf3 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java @@ -195,6 +195,10 @@ private MongoScanSpec createMongoScanSpec(String functionName, case "is not null": compareOp = MongoCompareOp.IFNOTNULL; break; + case "strpos": + compareOp = MongoCompareOp.REGEX; + break; + } if (compareOp != null) { From d16500b3fb099a299237fede265ef42271a0a713 Mon Sep 17 00:00:00 2001 From: arshadhblackstraw Date: Thu, 16 Jul 2020 12:52:17 +0530 Subject: [PATCH 3/4] Add support to handle POSITION function using mongo operator --- .../mongo/MongoCompareFunctionProcessor.java | 16 +++++++++++++++- .../exec/store/mongo/MongoFilterBuilder.java | 5 ++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java index 98627ea5198..6c05c689d45 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java @@ -182,7 +182,7 @@ public Boolean visitUnknown(LogicalExpression e, LogicalExpression valueArg) if (e instanceof FunctionCall){ String name = ((FunctionCall) e).getName(); - //handle strpos function in Drill + //handle Drill STRPOS function if (name.equals("strpos")){ LogicalExpression arg_0 = ((FunctionCall) e).arg(0); LogicalExpression arg_1 = ((FunctionCall) e).arg(1); @@ -193,6 +193,20 @@ public Boolean visitUnknown(LogicalExpression e, LogicalExpression valueArg) this.value = arg_1qs.getString(); return true; } + //handle Drill POSITION function + if (name.equals("position")){ + + LogicalExpression arg_0 = ((FunctionCall) e).arg(0); + LogicalExpression arg_1 = ((FunctionCall) e).arg(1); + QuotedString arg_0qs = (QuotedString) arg_0; + String arg0_unsplit = arg_0qs.getString(); + List arg0_splitted = Arrays.asList(arg0_unsplit.split(",")); + + this.functionName = name; + this.path = (SchemaPath) arg_1; + this.value = arg0_splitted; + return true; + } } diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java index 64c5b30fbf3..a2e119e1e28 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoFilterBuilder.java @@ -198,7 +198,10 @@ private MongoScanSpec createMongoScanSpec(String functionName, case "strpos": compareOp = MongoCompareOp.REGEX; break; - + case "position": + compareOp = MongoCompareOp.IN; + break; + } if (compareOp != null) { From b1b4a972d9a98af3ea268d6d62da0029d58ff904 Mon Sep 17 00:00:00 2001 From: orcascope <30562546+orcascope@users.noreply.github.com> Date: Thu, 16 Jul 2020 13:41:32 +0530 Subject: [PATCH 4/4] Update MongoCompareFunctionProcessor.java --- .../exec/store/mongo/MongoCompareFunctionProcessor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java index 6c05c689d45..e1a2fb94cf2 100644 --- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java +++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoCompareFunctionProcessor.java @@ -31,9 +31,14 @@ import org.apache.drill.common.expression.ValueExpressions.LongExpression; import org.apache.drill.common.expression.ValueExpressions.QuotedString; import org.apache.drill.common.expression.ValueExpressions.TimeExpression; +import org.apache.drill.common.expression.ValueExpressions.TimeStampExpression; import org.apache.drill.common.expression.ValueExpressions.VarDecimalExpression; import org.apache.drill.common.expression.visitors.AbstractExprVisitor; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableMap; import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableSet;