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);
}
/**