[ 
https://issues.apache.org/jira/browse/CALCITE-2415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16603702#comment-16603702
 ] 

Vladimir Sitnikov commented on CALCITE-2415:
--------------------------------------------

The adapters are different though.
 I'm afraid the only "reusable" part could be
 1) Normalization of the expression (e.g. convert `5=x` to `x=5`). I think such 
the normalization should be added to RexSimplify though (
 2) that's it :-/

It looks like "pattern matching for RexNode" might be useful, however I'm not 
sure if that's much better than simple walking functions.
 By pattern matching I mean something like:
{code:java}
Matcher m = ..;
m.registerRule( rexOp(EQ, NE, GT, ...).withArguments(rexInput(), rexLiteral(),  
  (???) -> { ... convert to string/querybuilder/etc somehow ... } );

m.runRules(rexNode);
{code}

> Evaluation of predicate "(A or B) and C" fails for MongoDB adapter
> ------------------------------------------------------------------
>
>                 Key: CALCITE-2415
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2415
>             Project: Calcite
>          Issue Type: Bug
>          Components: mongodb
>            Reporter: Andrei Sereda
>            Assignee: Michael Mior
>            Priority: Critical
>
> h2. Queries that are working
> {code:java}
> select count(*) from "elastic" where _MAP['foo'] in ('1') and true;
> select count(*) from "elastic" where _MAP['foo'] ='1' and true;
> select count(*) from "elastic" where _MAP['foo'] in ('1', '2');
> {code}
> h2. Queries that are failing
> {code:java}
> select count(*) from "elastic" where _MAP['foo'] in ('1', '2') and true;
> select count(*) from "elastic" where true and _MAP['foo'] in ('1', '2');
> select count(*) from "elastic" where (_MAP['foo'] ='1' or _MAP['foo'] = '2') 
> and true;
> {code}
> h2. Mongo Adapter Exception
> {quote}select * from "mongo"."col"
>  where _MAP['foo'] in ('1', '2') and true;
> java.lang.AssertionError: cannot translate OR(=(ITEM($0, 'foo'), '1'),
>  =(ITEM($0, 'foo'), '2'))
>  at org.apache.calcite.adapter.mongodb.MongoFilter$
>  Translator.translateMatch2(MongoFilter.java:181)
>  at org.apache.calcite.adapter.mongodb.MongoFilter$
>  Translator.translateAnd(MongoFilter.java:116)
>  at org.apache.calcite.adapter.mongodb.MongoFilter$
>  Translator.translateOr(MongoFilter.java:98)
>  at org.apache.calcite.adapter.mongodb.MongoFilter$
>  Translator.translateMatch(MongoFilter.java:91)
>  at org.apache.calcite.adapter.mongodb.MongoFilter$
>  Translator.access$000(MongoFilter.java:77)
>  at org.apache.calcite.adapter.mongodb.MongoFilter.implement(
>  MongoFilter.java:72)
>  at org.apache.calcite.adapter.mongodb.MongoRel$Implementor.
>  visitChild(MongoRel.java:51)
>  at org.apache.calcite.adapter.mongodb.MongoToEnumerableConverter.
>  implement(MongoToEnumerableConverter.java:84)
>  at org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.
>  implementRoot(EnumerableRelImplementor.java:103)
>  at org.apache.calcite.adapter.enumerable.EnumerableInterpretable.
>  toBindable(EnumerableInterpretable.java:92)
> {quote}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to