Hi. I think you can use Expressions#callSql to convert the String to Expression. Then you can use ExpressionResolver to resolve the converted Expression.
Best, Shengkai Qing Lim <q....@mwam.com> 于2022年6月22日周三 23:58写道: > Hi Xuyang, > > > > Thanks for the pointer, however it does not seems to achieve what I want. > > > > I would like to provide the input in String, instead of Expression, and it > would be best if I can reuse how flink does it. > > > > For example, given a String: “col_a = 20 AND col_b < 10”, is there any > flink’s api that can convert it into ResolvedExpression? > > > > I manage to find a way to perform this conversion, but it is not exactly > the same as how Flink does it, I realize this because when I try to use > TO_TIMESTAMP function in my input string, it failed to resolve. > > > > *From:* Xuyang <xyzhong...@163.com> > *Sent:* 22 June 2022 16:16 > *To:* Qing Lim <q....@mwam.com> > *Cc:* User <user@flink.apache.org> > *Subject:* Re:How can I convert a SQL String to a ResolvedExpression? > > > > 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. > >