diff --git a/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java b/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java index b8ed7a5c83002..31062f3e5c39f 100644 --- a/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java +++ b/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java @@ -654,7 +654,6 @@ public String getControllerUrl() return controllerUrls.get(ThreadLocalRandom.current().nextInt(controllerUrls.size())); } - @NotNull public String getQueryOptions() { return queryOptions; diff --git a/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/query/PinotFilterExpressionConverter.java b/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/query/PinotFilterExpressionConverter.java index 7007abf9a4fc3..81633dfdb030e 100644 --- a/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/query/PinotFilterExpressionConverter.java +++ b/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/query/PinotFilterExpressionConverter.java @@ -340,24 +340,40 @@ private PinotExpression handleFunction( Function context) { String functionName = function.getDisplayName().toLowerCase(ENGLISH); + List arguments = function.getArguments(); switch (functionName) { case "lower": case "trim": return derived(String.format( "%s(%s)", functionName, - function.getArguments().get(0).accept(this, context).getDefinition())); + arguments.get(0).accept(this, context).getDefinition())); case "concat": // Pinot's concat function is a bit different from Presto's, taking only two arguments (and a separator) at a time. // We nest and repeat concat function calls to handle additional arguments. - int numArguments = function.getArguments().size(); + int numArguments = arguments.size(); return derived(String.format( "%s%s%s", Strings.repeat(String.format("%s(", functionName), numArguments - 1), getExpressionOrConstantString(function.getArguments().get(0), context), - function.getArguments().subList(1, numArguments).stream() + arguments.subList(1, numArguments).stream() .map(argument -> String.format(", %s, '')", getExpressionOrConstantString(argument, context))) .collect(Collectors.joining("")))); + case "strpos": + // Pinot strings are 0-indexed, while Presto strings are 1-indexed. + if (arguments.size() == 2) { + return derived(String.format( + "%s(%s,%s) + 1", + functionName, + arguments.get(0).accept(this, context).getDefinition(), + arguments.get(1).accept(this, context).getDefinition())); + } + return derived(String.format( + "%s(%s,%s,%s) + 1", + functionName, + arguments.get(0).accept(this, context).getDefinition(), + arguments.get(1).accept(this, context).getDefinition(), + arguments.get(2).accept(this, context).getDefinition())); default: throw new PinotException(PINOT_UNSUPPORTED_EXPRESSION, Optional.empty(), format("function %s not supported in filter yet", function.getDisplayName())); } diff --git a/presto-pinot-toolkit/src/test/java/com/facebook/presto/pinot/query/TestPinotExpressionConverters.java b/presto-pinot-toolkit/src/test/java/com/facebook/presto/pinot/query/TestPinotExpressionConverters.java index 4ff55045fcb28..c540cfaafdf08 100644 --- a/presto-pinot-toolkit/src/test/java/com/facebook/presto/pinot/query/TestPinotExpressionConverters.java +++ b/presto-pinot-toolkit/src/test/java/com/facebook/presto/pinot/query/TestPinotExpressionConverters.java @@ -135,6 +135,9 @@ public void testFilterExpressionConverter() testFilter("CONCAT(city, ', CA', city) IN ('San Jose', 'Campbell')", "(concat(concat(\"city\", ', CA', ''), \"city\", '') IN ('San Jose', 'Campbell'))", sessionHolder); + // strpos + testFilter("STRPOS(\"city\", 'Seattle') = 1", "(strpos(\"city\",'Seattle') + 1 = 1)", sessionHolder); + // case, coalesce, if testFilter("CASE WHEN city = 'Campbell' THEN regionid ELSE 0 END", "CASE true WHEN (\"city\" = 'Campbell') THEN \"regionId\" ELSE 0 END", sessionHolder);