This is an automated email from the ASF dual-hosted git repository.

sereda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 83d8cf1  [CALCITE-2863] ElasticSearch Adapter. select * and predicates 
on _MAP fail
83d8cf1 is described below

commit 83d8cf1e9189d0098677751d928cc39ac188b5a9
Author: Andrei Sereda <[email protected]>
AuthorDate: Sat Feb 23 11:51:55 2019 -0500

    [CALCITE-2863] ElasticSearch Adapter. select * and predicates on _MAP fail
    
    Fix handling of `select *` in projections.
    
    Example of failing query:
    ```sql
    select * from elastic where _MAP['state'] = 'NY' order by _MAP['city']
    ```
---
 .../elasticsearch/ElasticsearchProject.java        |  9 ++++++++
 .../elasticsearch/ElasticSearchAdapterTest.java    | 24 ++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git 
a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
 
b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
index dee21cf..82aff25 100644
--- 
a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
+++ 
b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
@@ -64,6 +64,7 @@ public class ElasticsearchProject extends Project implements 
ElasticsearchRel {
 
     final List<String> fields = new ArrayList<>();
     final List<String> scriptFields = new ArrayList<>();
+    boolean hasSelectStar = false;
     for (Pair<RexNode, String> pair: getNamedProjects()) {
       final String name = pair.right;
       final String expr = pair.left.accept(translator);
@@ -72,6 +73,8 @@ public class ElasticsearchProject extends Project implements 
ElasticsearchRel {
         implementor.addExpressionItemMapping(name, 
ElasticsearchRules.stripQuotes(expr));
       }
 
+      hasSelectStar |= "_MAP".equals(name);
+
       if (expr.equals(name)) {
         fields.add(name);
       } else if (expr.matches("\"literal\":.+")) {
@@ -87,6 +90,12 @@ public class ElasticsearchProject extends Project implements 
ElasticsearchRel {
       }
     }
 
+    if (hasSelectStar) {
+      // means select * from elastic
+      // this does not yet cover select *, _MAP['foo'], _MAP['bar'][0] from 
elastic
+      return;
+    }
+
     StringBuilder query = new StringBuilder();
     if (scriptFields.isEmpty()) {
       List<String> newList = fields.stream().map(ElasticsearchRules::quote)
diff --git 
a/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/ElasticSearchAdapterTest.java
 
b/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/ElasticSearchAdapterTest.java
index c8c0b8e..794cbe0 100644
--- 
a/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/ElasticSearchAdapterTest.java
+++ 
b/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/ElasticSearchAdapterTest.java
@@ -275,11 +275,29 @@ public class ElasticSearchAdapterTest {
 
     CalciteAssert.that()
         .with(newConnectionFactory())
+        .query("select * from elastic.zips where _MAP['state'] = 'NY' order by 
_MAP['city']")
+        .queryContains(
+            ElasticsearchChecker.elasticsearchChecker(
+            "query:{'constant_score':{filter:{term:{state:'NY'}}}}",
+            "sort:[{city:'asc'}]",
+            String.format(Locale.ROOT, "size:%s", 
ElasticsearchTransport.DEFAULT_FETCH_SIZE)))
+        .returnsCount(3);
+
+    CalciteAssert.that()
+        .with(newConnectionFactory())
         .query("select _MAP['state'] from elastic.zips order by _MAP['city']")
         .returnsCount(ZIPS_SIZE);
 
     CalciteAssert.that()
         .with(newConnectionFactory())
+        .query("select _MAP['city'] from elastic.zips where _MAP['state'] = 
'NY' "
+            + "order by _MAP['city']")
+        .returnsOrdered("EXPR$0=BROOKLYN",
+            "EXPR$0=JACKSON HEIGHTS",
+            "EXPR$0=NEW YORK");
+
+    CalciteAssert.that()
+        .with(newConnectionFactory())
         .query("select _MAP['city'] as city, _MAP['state'] from elastic.zips "
             + "order by _MAP['city'] asc")
         .returns(sortedResultSetChecker("city", 
RelFieldCollation.Direction.ASCENDING))
@@ -299,6 +317,12 @@ public class ElasticSearchAdapterTest {
         .returnsOrdered("EXPR$0=32383.0; EXPR$1=23238.0; EXPR$2=AK",
              "EXPR$0=44165.0; EXPR$1=42124.0; EXPR$2=AL",
              "EXPR$0=53532.0; EXPR$1=37428.0; EXPR$2=AR");
+
+    CalciteAssert.that()
+        .with(newConnectionFactory())
+        .query("select max(_MAP['pop']), min(_MAP['pop']), _MAP['state'] from 
elastic.zips "
+            + "where _MAP['state'] = 'NY' group by _MAP['state'] order by 
_MAP['state'] limit 3")
+        .returnsCount(1);
   }
 
   /**

Reply via email to