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..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; @@ -179,6 +184,37 @@ 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 Drill STRPOS function + 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; + } + //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; + } + + } + return false; } @@ -221,6 +257,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) { 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..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 @@ -195,6 +195,13 @@ private MongoScanSpec createMongoScanSpec(String functionName, case "is not null": compareOp = MongoCompareOp.IFNOTNULL; break; + case "strpos": + compareOp = MongoCompareOp.REGEX; + break; + case "position": + compareOp = MongoCompareOp.IN; + break; + } if (compareOp != null) {