Hi Haisheng, Do you know what is the impact on Enumerable implementation? Will RexListCmp still be converted AND/OR something else in that layer or there will be new logic introduced to generate code for RexListCmp?
-Rui On Sun, Jul 19, 2020 at 10:13 PM Enrico Olivelli <[email protected]> wrote: > Il Lun 20 Lug 2020, 03:00 Haisheng Yuan <[email protected]> ha scritto: > > > Hi all, > > > > This is a rough idea, I'd like to see how the community think about it. > > > > RexListCmp extends RexNode / RexCall { > > public final SqlOperator op; > > public final RexNode left; > > public final ImmutableList<RexNode> list; > > public final RexQuantifier quantifier; > > public final RelDataType type; > > } > > > > Enum RexQuantifier { > > ALL, > > ANY > > } > > > > Background: > > > > It is not uncommon that the query contains large number of constant IN > > list, e.g. > > 1) SELECT * FROM foo WHERE a NOT IN (1, 2, 3, ...., 10000); > > 2) SELECT * FROM bar WHERE b IN (1, 2, 3, ...., 10000); > > > > Currently, Calcite either translates it into a Join, or expand to OR/AND, > > which is inefficient, and may cause problems. > > > > Yes. It is not efficient. > > I would love to see this new feature > > Thanks > Enrico > > > > > > With RexListCmp, the predicate in query 1) will be represented as: > > RexListCmp { > > op = "<>", > > left = "a" > > list = "1,2,3...10000" > > quantifier = "ALL" > > } > > > > The predicate in query 2) will be represented as: > > RexListCmp { > > op = "=", > > left = "b" > > list = "1,2,3...10000" > > quantifier = "ANY" > > } > > > > It may also be used to represent the predicate in the following query: > > > > SELECT * FROM bar WHERE (a,b) IN / NOT IN ((1,1), (2,2), (3,3), ... > (1000, > > 1000)); > > > > Further more, it is extensible. The op is not limited to be equals or not > > equals, it also be >, <, >=, <=, IDF, INDF or even customized sql > operator > > like geospatial operator intersect: > > boolean &&( geometry A , geometry B ) > > > > Thoughts? > > > > Thanks, > > Haisheng Yuan > > > > > > >
