[ 
https://issues.apache.org/jira/browse/CALCITE-4645?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Hyde updated CALCITE-4645:
---------------------------------
    Summary: In Elasticsearch adapter, a range predicate should be translated 
to a range query  (was: Search In Range is not supported in elastic search 
adapter)

> In Elasticsearch adapter, a range predicate should be translated to a range 
> query
> ---------------------------------------------------------------------------------
>
>                 Key: CALCITE-4645
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4645
>             Project: Calcite
>          Issue Type: Bug
>          Components: elasticsearch-adapter
>    Affects Versions: 1.27.0
>            Reporter: Jacky Yin
>            Priority: Critical
>
> SQL patterns like below will be converted to Search in range which is not 
> supported in elastic search adapter. 
> {code:java}
> select count(*) from view where (f1 > 10 and f1 < 20) or (f1 > 30 and f1 < 
> 40))
> select * from view where f1 > 10 and f1 < 20
> select * from view where f1 < 10 or f1 > 20 {code}
> Here is one example of the query plan change history for SQL
> {code:java}
>  select count(*) from view where val1 >= 10 and val1 <=20{code}
> *Original:*
> {noformat}
>  LogicalAggregate(group=[{}], EXPR$0=[COUNT()]): rowcount = 1.0, cumulative 
> cost = {136.125 rows, 810.1 cpu, 0.0 io}, id = 14
>   LogicalFilter(condition=[AND(>=($5, 10), <=($5, 20))]): rowcount = 25.0, 
> cumulative cost = {135.0 rows, 810.1 cpu, 0.0 io}, id = 12
>     LogicalProject(cat1=[ITEM($0, 'cat1')], cat2=[ITEM($0, 'cat2')], 
> cat3=[ITEM($0, 'cat3')], cat4=[ITEM($0, 'cat4')], cat5=[ITEM($0, 'cat5')], 
> val1=[ITEM($0, 'val1')], val2=[ITEM($0, 'val2')]): rowcount = 100.0, 
> cumulative cost = {110.0 rows, 710.1 cpu, 0.0 io}, id = 11
>       ElasticsearchTableScan(table=[[elastic, aggs]]): rowcount = 100.0, 
> cumulative cost = {10.0 rows, 10.100000000000001 cpu, 0.0 io}, id = 
> 10{noformat}
>  
> *Simplified*:
> {noformat}
> LogicalAggregate(group=[{}], EXPR$0=[COUNT()]): rowcount = 2.5, cumulative 
> cost = {2.8125 rows, 0.0 cpu, 0.0 io}, id = 32
>   LogicalFilter(subset=[rel#31:RelSubset#2.NONE.[]], condition=[SEARCH($0, 
> Sarg[[10..20]])]): rowcount = 25.0, cumulative cost = {25.0 rows, 100.0 cpu, 
> 0.0 io}, id = 30
>     LogicalProject(subset=[rel#29:RelSubset#1.NONE.[]], val1=[ITEM($0, 
> 'val1')]): rowcount = 100.0, cumulative cost = {100.0 rows, 100.0 cpu, 0.0 
> io}, id = 28
>       ElasticsearchTableScan(subset=[rel#27:RelSubset#0.ELASTICSEARCH.[]], 
> table=[[elastic, aggs]]): rowcount = 100.0, cumulative cost = {10.0 rows, 
> 10.100000000000001 cpu, 0.0 io}, id = 10
>  {noformat}
>  
> *Optimized by the rules in es adapter:*
> {noformat}
> ElasticsearchToEnumerableConverter: rowcount = 1.0, cumulative cost = 
> {12.7125 rows, 20.200000000000003 cpu, 0.0 io}, id = 84
>   ElasticsearchAggregate(group=[{}], EXPR$0=[COUNT()]): rowcount = 1.0, 
> cumulative cost = {12.6125 rows, 20.1 cpu, 0.0 io}, id = 83
>     ElasticsearchFilter(condition=[SEARCH(ITEM($0, 'val1'), 
> Sarg[[10..20]])]): rowcount = 25.0, cumulative cost = {12.5 rows, 20.1 cpu, 
> 0.0 io}, id = 82
>       ElasticsearchTableScan(table=[[elastic, aggs]]): rowcount = 100.0, 
> cumulative cost = {10.0 rows, 10.100000000000001 cpu, 0.0 io}, id = 10
>  {noformat}
>  
> The LogicalFilter(condition=*[AND(>=($5, 10), <=($5, 20))])* is converted to 
> LogicalFilter(subset=[rel#31:RelSubset#2.NONE.[]], condition=*[SEARCH($0, 
> Sarg[[10..20]])]*) which is not supported in the predicate analyzer of 
> elastic search adapter.
>  
> Below is the exception output
> {noformat}
>  
> org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer$PredicateAnalyzerException:
>  Unsupported call: [SEARCH(ITEM($0, 'val1'), 
> Sarg[[10..20]])]org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer$PredicateAnalyzerException:
>  Unsupported call: [SEARCH(ITEM($0, 'val1'), Sarg[[10..20]])] at 
> org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer$Visitor.visitCall(PredicateAnalyzer.java:238)
>  at 
> org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer$Visitor.visitCall(PredicateAnalyzer.java:127)
>  at org.apache.calcite.rex.RexCall.accept(RexCall.java:189) at 
> org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer.analyze(PredicateAnalyzer.java:112)
>  at 
> org.apache.calcite.adapter.elasticsearch.ElasticsearchFilter$PredicateAnalyzerTranslator.translateMatch(ElasticsearchFilter.java:102)
>  at 
> org.apache.calcite.adapter.elasticsearch.ElasticsearchFilter.implement(ElasticsearchFilter.java:67)
>  at 
> org.apache.calcite.adapter.elasticsearch.ElasticsearchRel$Implementor.visitChild(ElasticsearchRel.java:129)
>  at 
> org.apache.calcite.adapter.elasticsearch.ElasticsearchAggregate.implement(ElasticsearchAggregate.java:128)
>  at 
> org.apache.calcite.adapter.elasticsearch.ElasticsearchRel$Implementor.visitChild(ElasticsearchRel.java:129)
>  at 
> org.apache.calcite.adapter.elasticsearch.ElasticsearchToEnumerableConverter.implement(ElasticsearchToEnumerableConverter.java:67)
>  at 
> org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:111)
>  ... 77 more{noformat}
>  
> Based on the query types in elastic search, search in range should be 
> translated to range query of ES. 
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to