GitHub user NickolayVasilishin opened a pull request:
https://github.com/apache/flink/pull/2868
[FLINK-4565] Support for SQL IN operator
This PR is a part of work on SQL IN operator in Table API, which implements
IN for literals.
Two cases are covered: less and great then 20 literals.
Also I have some questions:
- converting all numeric types to BigDecimal isn't ok? I decided to make so
to simplify use of hashset.
- validation isn't really good. It forces to use operator with same type
literals. Should I rework it or maybe just add more cases?
expressionDsl.scala:
entry point for IN operator in scala API
ScalarOperators.scala:
1) All numeric types are upcasting to BigDecimal for using in hashset,
other types are unchanged in castNumeric
2) valuesInitialization used for 2 cases: when we have more then 20
operands (then we use hashset, initialized in constructor, descibed below)
and less then 20 operands (then we initialize operands in method's body and
use them in conjunction)
3) comparison also covers described above cases. In first case we use
callback to declare and initialize hashset with all operands. Otherwise
we just put all operands in conjunction.
4) Final code is built up with these code snippets.
CodeGenerator.scala:
passes arguments and callback to declare and init hashet
FunctionCatalog.scala:
registers "in" as method
InITCase:
some use cases
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/NickolayVasilishin/flink FLINK-4565
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/flink/pull/2868.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #2868
----
commit 7699c37a840dcb62c4984e0d63f87813d355d1f8
Author: nikolay_vasilishin <[email protected]>
Date: 2016-11-25T12:44:53Z
[FLINK-4565] Support for SQL IN operator
expressionDsl.scala:
entry point for IN operator in scala API
ScalarOperators.scala:
1) All numeric types are upcasting to BigDecimal for using in hashset,
other types are unchanged in castNumeric
2) valuesInitialization used for 2 cases: when we have more then 20
operands (then we use hashset, initialized in constructor, descibed below)
and less then 20 operands (then we initialize operands in method's body and
use them in conjunction)
3) comparison also covers described above cases. In first case we use
callback to declare and initialize hashset with all operands. Otherwise
we just put all operands in conjunction.
4) Final code is built up with these code snippets.
CodeGenerator.scala:
passes arguments and callback to declare and init hashet
FunctionCatalog.scala:
registers "in" as method
InITCase:
some use cases
----
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---