[
https://issues.apache.org/jira/browse/PHOENIX-3355?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15630696#comment-15630696
]
Eric Lomore commented on PHOENIX-3355:
--------------------------------------
[~maryannxue], I am running into a few more issues, would you mind taking a
look?
Functions with the expected constructor with parameter List.class now work as
expected. But those that do not cannot instantiate properly.
{code}
private void constructUDFFunction() throws IOException {
Constructor<?> constructor = clazz.getConstructor(List.class);
udfFunction =
(ScalarFunction)constructor.newInstance(this.children);
} {code}
For example, ToDateFunction stacktrace:
{code}Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException:
org.apache.phoenix.expression.function.ToDateFunction.<init>(java.util.List)
at
org.apache.phoenix.expression.function.UDFExpression.constructUDFFunction(UDFExpression.java:170)
at
org.apache.phoenix.expression.function.UDFExpression.<init>(UDFExpression.java:72)
at
org.apache.phoenix.calcite.CalciteUtils$19.newExpression(CalciteUtils.java:788)
at
org.apache.phoenix.calcite.CalciteUtils.convertChildren(CalciteUtils.java:1006)
at
org.apache.phoenix.calcite.CalciteUtils.access$000(CalciteUtils.java:138)
at
org.apache.phoenix.calcite.CalciteUtils$3.newExpression(CalciteUtils.java:324)
at
org.apache.phoenix.calcite.CalciteUtils.toExpression(CalciteUtils.java:1071)
at
org.apache.phoenix.calcite.rel.PhoenixTableScan.<init>(PhoenixTableScan.java:153)
at
org.apache.phoenix.calcite.rel.PhoenixTableScan.create(PhoenixTableScan.java:94)
at
org.apache.phoenix.calcite.rules.PhoenixFilterScanMergeRule.onMatch(PhoenixFilterScanMergeRule.java:46)
at
org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:213)
... 47 more
Caused by: java.lang.NoSuchMethodException:
org.apache.phoenix.expression.function.ToDateFunction.<init>(java.util.List)
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getConstructor(Class.java:1825)
at
org.apache.phoenix.expression.function.UDFExpression.constructUDFFunction(UDFExpression.java:165)
... 57 more
{code}
The only uniform way to instantiate on the phoenix side is through the parse
node create function (ex. ToDateParseNode.create()).
{code}
public FunctionExpression create(List<Expression> children, StatementContext
context) throws SQLException {
// creates ExampleFunction
} {code}
We would still have to register PhoenixScalarFunction using the class name of a
function, but in constructUDFFunction() it would need to refer to the
ParseNode. Unfortunately, I'm a bit stuck on where to go from here. We would be
using a parse node but not at parse time which introduces some complications.
See my latest commit here:
https://github.com/bloomberg/phoenix/commit/24652257e1f2c039b62288387d911c47e30399c6
You'll notice StatementContext is null which cannot be the case, but I don't
see a way around this.
> Register Phoenix built-in functions as Calcite functions
> --------------------------------------------------------
>
> Key: PHOENIX-3355
> URL: https://issues.apache.org/jira/browse/PHOENIX-3355
> Project: Phoenix
> Issue Type: Bug
> Reporter: James Taylor
> Assignee: Eric Lomore
> Labels: calcite
> Attachments: PHOENIX-3355.wip, PHOENIX-3355.wip2
>
>
> We should register all Phoenix built-in functions that don't exist in Calcite.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)