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.
*