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

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


The following commit(s) were added to refs/heads/main by this push:
     new 1f15d98852 [CALCITE-5593] Elasticsearch adapter should support aliases
1f15d98852 is described below

commit 1f15d988527f93ccdd87216f07fc812010fea979
Author: Lei Zhang <[email protected]>
AuthorDate: Sat Mar 18 23:20:34 2023 +0800

    [CALCITE-5593] Elasticsearch adapter should support aliases
    
    Close apache/calcite#3120
---
 .../adapter/elasticsearch/ElasticsearchSchema.java | 11 +++++++
 .../elasticsearch/ElasticSearchAdapterTest.java    | 10 ++++++-
 .../elasticsearch/EmbeddedElasticsearchPolicy.java | 35 ++++++++++++++++++++++
 3 files changed, 55 insertions(+), 1 deletion(-)

diff --git 
a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java
 
b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java
index da6059794f..02a6bf20fb 100644
--- 
a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java
+++ 
b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java
@@ -38,6 +38,10 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 
 /**
  * Each table in the schema is an ELASTICSEARCH index.
@@ -121,6 +125,13 @@ public class ElasticsearchSchema extends AbstractSchema {
       }
 
       Set<String> indices = Sets.newHashSet(root.fieldNames());
+      Set<String> aliases = root.findValues("aliases").stream()
+          .map(JsonNode::fieldNames)
+          .flatMap(
+              it -> StreamSupport.stream(
+                  Spliterators.spliteratorUnknownSize(it, 
Spliterator.ORDERED), false))
+          .collect(Collectors.toSet());
+      indices.addAll(aliases);
       return indices;
     }
   }
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 47353a2a0c..28ebcbb2eb 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
@@ -63,6 +63,7 @@ class ElasticSearchAdapterTest {
 
   /** Default index/type name. */
   private static final String ZIPS = "zips";
+  private static final String ZIPS_ALIAS = "zips_alias";
   private static final int ZIPS_SIZE = 149;
 
   /**
@@ -75,6 +76,7 @@ class ElasticSearchAdapterTest {
         ImmutableMap.of("city", "keyword", "state", "keyword", "pop", "long");
 
     NODE.createIndex(ZIPS, mapping);
+    NODE.createAlias(ZIPS, ZIPS_ALIAS);
 
     // load records from file
     final List<ObjectNode> bulk = new ArrayList<>();
@@ -105,7 +107,7 @@ class ElasticSearchAdapterTest {
         connection.unwrap(CalciteConnection.class).getRootSchema();
 
     root.add("elastic",
-        new ElasticsearchSchema(NODE.restClient(), NODE.mapper(), ZIPS));
+        new ElasticsearchSchema(NODE.restClient(), NODE.mapper(), null));
 
     // add calcite view programmatically
     final String viewSql = "select cast(_MAP['city'] AS varchar(20)) AS 
\"city\", "
@@ -189,6 +191,12 @@ class ElasticSearchAdapterTest {
         .returnsCount(0);
   }
 
+  @Test void testAlias() {
+    calciteAssert()
+        .query("select * from elastic.zips_alias")
+        .returnsCount(ZIPS_SIZE);
+  }
+
   @Test void testSort() {
     final String explain = "PLAN=ElasticsearchToEnumerableConverter\n"
         + "  ElasticsearchSort(sort0=[$4], dir0=[ASC])\n"
diff --git 
a/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/EmbeddedElasticsearchPolicy.java
 
b/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/EmbeddedElasticsearchPolicy.java
index 06aa35f743..c1fca5a7db 100644
--- 
a/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/EmbeddedElasticsearchPolicy.java
+++ 
b/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/EmbeddedElasticsearchPolicy.java
@@ -129,6 +129,41 @@ class EmbeddedElasticsearchPolicy {
     restClient().performRequest(r);
   }
 
+  /**
+   * Creates alias in elastic search given an index.
+   * as dots({@code .}).
+   *
+   * <p>Example
+   * <pre>
+   *  {@code
+   *     b.a: long
+   *     b.b: keyword
+   *  }
+   * </pre>
+   *
+   * @param index index of the index
+   * @param alias alias of the index
+   * @throws IOException if there is an error
+   */
+  void createAlias(String index, String alias) throws IOException {
+    Objects.requireNonNull(index, "index");
+    Objects.requireNonNull(alias, "alias");
+
+    ObjectNode actions = mapper().createObjectNode();
+
+    ObjectNode properties = actions.withObject("/actions").withObject("/add");
+    properties.put("index", index);
+    properties.put("alias", alias);
+
+    // create alias
+    final HttpEntity entity =
+        new StringEntity(mapper().writeValueAsString(actions),
+            ContentType.APPLICATION_JSON);
+    final Request r = new Request("POST", "/_aliases");
+    r.setEntity(entity);
+    restClient().performRequest(r);
+  }
+
   /**
    * Creates nested mappings for an index. This function is called recursively 
for each level.
    *

Reply via email to