Hi, what about use `FieldReferenceExpression`[1] in test just like here[2] ?

[1] 
https://github.com/apache/flink/blob/5bcef81356f965ee9e6a8ab54b5faca1e3979873/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/FieldReferenceExpression.java#L39
[2] 
https://github.com/apache/flink/blob/5bcef81356f965ee9e6a8ab54b5faca1e3979873/flink-table/flink-table-api-java/src/test/java/org/apache/flink/table/expressions/resolver/ExpressionResolverTest.java#L87



At 2022-06-22 17:11:21, "Qing Lim" <q....@mwam.com> wrote:

Hi Flink User Group,

 

Is there a way to convert SQL String to a 
org.apache.flink.table.expressions.ResolvedExpression easily? I wish use this 
in test. I manage to reverse engineer part of it but I don’t think it matches 
what Flink is really doing, below is my ugly code.

 

private List<ResolvedExpression> resolveSQLFilterToExpression(

            String sqlExp, ResolvedSchema schema) {

        StreamTableEnvironmentImpl tbImpl = (StreamTableEnvironmentImpl) tEnv;

        CatalogManager catMan = ((StreamTableEnvironmentImpl) 
tEnv).getCatalogManager();

        FunctionCatalog funCat = new FunctionCatalog(tEnv.getConfig(), catMan, 
new ModuleManager());

        RowType sourceType = (RowType) 
schema.toSourceRowDataType().getLogicalType();

        RexNodeToExpressionConverter converter =

                new RexNodeToExpressionConverter(

                        new RexBuilder(FlinkTypeFactory.INSTANCE()),

                        sourceType.getFieldNames().toArray(new String[0]),

                        funCat,

                        catMan,

                        
TimeZone.getTimeZone(tEnv.getConfig().getLocalTimeZone()));

 

        RexNodeExpression rexExp =

                (RexNodeExpression) 
tbImpl.getParser().parseSqlExpression(sqlExp, sourceType, null);

 

        if (rexExp.getRexNode().accept(converter).isEmpty()) {

            System.out.println(rexExp);

        }

        ResolvedExpression resolvedExp = 
rexExp.getRexNode().accept(converter).get();

        ExpressionResolver resolver =

                ExpressionResolver.resolverFor(

                                tEnv.getConfig(),

                                name -> Optional.empty(),

                                new FunctionCatalog(tEnv.getConfig(), catMan, 
new ModuleManager())

                                        .asLookup(

                                                str -> {

                                                    throw new TableException(

                                                            "We should not need 
to lookup any expressions at this point");

                                                }),

                                catMan.getDataTypeFactory(),

                                (sqlExpression, inputRowType, outputType) -> {

                                    throw new TableException(

                                            "SQL expression parsing is not 
supported at this location.");

                                })

                        .build();

 

        return resolver.resolve(List.of(resolvedExp));

    }

 

I wonder if there’s some hooks available to achieve this?

 

Thanks

 

This e-mail and any attachments are confidential to the addressee(s) and may 
contain information that is legally privileged and/or confidential. If you are 
not the intended recipient of this e-mail you are hereby notified that any 
dissemination, distribution, or copying of its content is strictly prohibited. 
If you have received this message in error, please notify the sender by return 
e-mail and destroy the message and all copies in your possession.


To find out more details about how we may collect, use and share your personal 
information, please see https://www.mwam.com/privacy-policy. This includes 
details of how calls you make to us may be recorded in order for us to comply 
with our legal and regulatory obligations.


To the extent that the contents of this email constitutes a financial 
promotion, please note that it is issued only to and/or directed only at 
persons who are professional clients or eligible counterparties as defined in 
the FCA Rules. Any investment products or services described in this email are 
available only to professional clients and eligible counterparties. Persons who 
are not professional clients or eligible counterparties should not rely or act 
on the contents of this email.


Marshall Wace LLP is authorised and regulated by the Financial Conduct 
Authority. Marshall Wace LLP is a limited liability partnership registered in 
England and Wales with registered number OC302228 and registered office at 
George House, 131 Sloane Street, London, SW1X 9AT. If you are receiving this 
e-mail as a client, or an investor in an investment vehicle, managed or advised 
by Marshall Wace North America L.P., the sender of this e-mail is communicating 
with you in the sender's capacity as an associated or related person of 
Marshall Wace North America L.P. ("MWNA"), which is registered with the US 
Securities and Exchange Commission ("SEC") as an investment adviser.  
Registration with the SEC does not imply that MWNA or its employees possess a 
certain level of skill or training.

Reply via email to