phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Eric Lomore (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (PHOENIX-3355) Register Phoenix built-in functions as Calcite functions
Date Wed, 02 Nov 2016 22:09:58 GMT

    [ 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)

Mime
View raw message