From 9e97dec2256ae294ce707f10e18ddba84a2ed294 Mon Sep 17 00:00:00 2001 From: Mohsin Husen Date: Thu, 3 Apr 2014 16:49:50 +0100 Subject: [PATCH] DATAES-70 - Alias creation with routing not supported added routing parameters --- .../core/ElasticsearchTemplate.java | 18 ++-- .../core/query/AliasBuilder.java | 23 +++- .../elasticsearch/core/query/AliasQuery.java | 29 ++++- .../core/ElasticsearchTemplateTests.java | 100 +++++++++++++++++- .../elasticsearch/entities/SampleEntity.java | 2 +- 5 files changed, 162 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 1eff8c7ae..6ef858251 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -19,6 +19,7 @@ import static org.apache.commons.collections.CollectionUtils.isNotEmpty; import static org.apache.commons.lang.StringUtils.*; import static org.elasticsearch.action.search.SearchType.*; import static org.elasticsearch.client.Requests.*; +import static org.elasticsearch.cluster.metadata.AliasAction.Type.ADD; import static org.elasticsearch.common.collect.Sets.*; import static org.elasticsearch.index.VersionType.*; import static org.springframework.data.elasticsearch.core.MappingBuilder.*; @@ -53,6 +54,7 @@ import org.elasticsearch.action.update.UpdateRequestBuilder; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; +import org.elasticsearch.cluster.metadata.AliasAction; import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.collect.MapBuilder; @@ -706,15 +708,19 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { public Boolean addAlias(AliasQuery query) { Assert.notNull(query.getIndexName(), "No index defined for Alias"); Assert.notNull(query.getAliasName(), "No alias defined"); - IndicesAliasesRequestBuilder indicesAliasesRequestBuilder = null; + AliasAction aliasAction = new AliasAction(ADD, query.getIndexName(), query.getAliasName()); if (query.getFilterBuilder() != null) { - indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilterBuilder()); + aliasAction.filter(query.getFilterBuilder()); } else if (query.getFilter() != null) { - indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilter()); - } else { - indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName()); + aliasAction.filter(query.getFilter()); + } else if (isNotBlank(query.getRouting())) { + aliasAction.routing(query.getRouting()); + } else if (isNotBlank(query.getSearchRouting())) { + aliasAction.searchRouting(query.getSearchRouting()); + } else if (isNotBlank(query.getIndexRouting())) { + aliasAction.indexRouting(query.getIndexRouting()); } - return indicesAliasesRequestBuilder.execute().actionGet().isAcknowledged(); + return client.admin().indices().prepareAliases().addAliasAction(aliasAction).execute().actionGet().isAcknowledged(); } @Override diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java index 6b1ccaef4..4270cd00b 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 the original author or authors. + * Copyright 2013-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,9 @@ public class AliasBuilder { private String aliasName; private FilterBuilder filterBuilder; private Map filter; + private String searchRouting; + private String indexRouting; + private String routing; public AliasBuilder withIndexName(String indexName) { this.indexName = indexName; @@ -49,12 +52,30 @@ public class AliasBuilder { return this; } + public AliasBuilder withSearchRouting(String searchRouting) { + this.searchRouting = searchRouting; + return this; + } + + public AliasBuilder withIndexRouting(String indexRouting) { + this.indexRouting = indexRouting; + return this; + } + + public AliasBuilder withRouting(String routing) { + this.routing = routing; + return this; + } + public AliasQuery build() { AliasQuery aliasQuery = new AliasQuery(); aliasQuery.setIndexName(indexName); aliasQuery.setAliasName(aliasName); aliasQuery.setFilterBuilder(filterBuilder); aliasQuery.setFilter(filter); + aliasQuery.setSearchRouting(searchRouting); + aliasQuery.setIndexRouting(indexRouting); + aliasQuery.setRouting(routing); return aliasQuery; } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java index 308b4ccf3..5e66b7bf5 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 the original author or authors. + * Copyright 2013-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,9 @@ public class AliasQuery { private String aliasName; private FilterBuilder filterBuilder; private Map filter; + private String searchRouting; + private String indexRouting; + private String routing; public String getIndexName() { return indexName; @@ -62,4 +65,28 @@ public class AliasQuery { public void setFilter(Map filter) { this.filter = filter; } + + public String getSearchRouting() { + return searchRouting; + } + + public void setSearchRouting(String searchRouting) { + this.searchRouting = searchRouting; + } + + public String getIndexRouting() { + return indexRouting; + } + + public void setIndexRouting(String indexRouting) { + this.indexRouting = indexRouting; + } + + public String getRouting() { + return routing; + } + + public void setRouting(String routing) { + this.routing = routing; + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 07a8a7d09..6992f67cd 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -927,6 +927,104 @@ public class ElasticsearchTemplateTests { assertThat(aliases.size(), is(0)); } + /* + DATAES-70 + */ + @Test + public void shouldAddAliasWithGivenRoutingValue() { + //given + String indexName = INDEX_NAME; + String alias = "test-alias"; + + AliasQuery aliasQuery = new AliasBuilder() + .withIndexName(indexName) + .withAliasName(alias) + .withRouting("0").build(); + + //when + elasticsearchTemplate.addAlias(aliasQuery); + + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + .message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = new IndexQueryBuilder() + .withIndexName(alias) + .withId(sampleEntity.getId()) + .withObject(sampleEntity).build(); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withIndices(alias).build(); + long count = elasticsearchTemplate.count(query, SampleEntity.class); + //then + Set aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME); + assertThat(aliases, is(notNullValue())); + assertThat(aliases.contains(alias), is(true)); + assertThat(count, is(1L)); + + //cleanup + elasticsearchTemplate.removeAlias(aliasQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + } + + /* + DATAES-70 + */ + @Test + public void shouldAddAliasForVariousRoutingValues() { + //given + String indexName = INDEX_NAME; + String alias1 = "test-alias-1"; + String alias2 = "test-alias-2"; + + AliasQuery aliasQuery1 = new AliasBuilder() + .withIndexName(indexName) + .withAliasName(alias1) + .withIndexRouting("0").build(); + + AliasQuery aliasQuery2 = new AliasBuilder() + .withIndexName(indexName) + .withAliasName(alias2) + .withSearchRouting("1").build(); + + //when + elasticsearchTemplate.addAlias(aliasQuery1); + elasticsearchTemplate.addAlias(aliasQuery2); + + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + .message("some message") + .version(System.currentTimeMillis()).build(); + + IndexQuery indexQuery = new IndexQueryBuilder() + .withIndexName(alias1) + .withId(sampleEntity.getId()) + .withObject(sampleEntity).build(); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withIndices(alias2).build(); + long count = elasticsearchTemplate.count(query, SampleEntity.class); + // then + Set aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME); + assertThat(aliases, is(notNullValue())); + assertThat(aliases.contains(alias1), is(true)); + assertThat(aliases.contains(alias2), is(true)); + assertThat(count, is(0L)); + + //cleanup + elasticsearchTemplate.removeAlias(aliasQuery1); + elasticsearchTemplate.removeAlias(aliasQuery2); + elasticsearchTemplate.refresh(SampleEntity.class, true); + } + + @Test public void shouldIndexDocumentForSpecifiedSource() { @@ -1402,7 +1500,7 @@ public class ElasticsearchTemplateTests { assertThat(map.containsKey("index.store.type"), is(true)); assertThat((String) map.get("index.refresh_interval"), is("-1")); assertThat((String) map.get("index.number_of_replicas"), is("0")); - assertThat((String) map.get("index.number_of_shards"), is("1")); + assertThat((String) map.get("index.number_of_shards"), is("2")); assertThat((String) map.get("index.store.type"), is("memory")); } diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java index 52325688f..72ef060df 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java @@ -25,7 +25,7 @@ import org.springframework.data.elasticsearch.annotations.Document; * @author Rizwan Idrees * @author Mohsin Husen */ -@Document(indexName = "test-index", type = "test-type", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") +@Document(indexName = "test-index", type = "test-type", indexStoreType = "memory", shards = 2, replicas = 0, refreshInterval = "-1") public class SampleEntity { @Id