Skip to content

Commit f824f4f

Browse files
committed
DATAES-38 : Add/Remove/Get Alias Support
1 parent 3fb28de commit f824f4f

File tree

6 files changed

+216
-1
lines changed

6 files changed

+216
-1
lines changed

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.data.elasticsearch.core.query.*;
2222

2323
import java.util.List;
24+
import java.util.Set;
2425

2526
/**
2627
* ElasticsearchOperations
@@ -319,4 +320,27 @@ public interface ElasticsearchOperations {
319320
*/
320321
<T> Page<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz);
321322

323+
/**
324+
* adding new alias
325+
*
326+
* @param query
327+
* @return
328+
*/
329+
Boolean addAlias(AliasQuery query);
330+
331+
/**
332+
* removing previously created alias
333+
*
334+
* @param query
335+
* @return
336+
*/
337+
Boolean removeAlias(AliasQuery query);
338+
339+
/**
340+
* get all the alias pointing to specified index
341+
*
342+
* @param indexName
343+
* @return
344+
*/
345+
Set<String> queryForAlias(String indexName);
322346
}

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package org.springframework.data.elasticsearch.core;
1717

1818
import org.apache.commons.collections.CollectionUtils;
19+
import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest;
20+
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder;
1921
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
2022
import org.elasticsearch.action.admin.indices.mapping.delete.DeleteMappingRequest;
2123
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
@@ -59,6 +61,7 @@
5961
import java.util.HashMap;
6062
import java.util.List;
6163
import java.util.Map;
64+
import java.util.Set;
6265

6366
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
6467
import static org.apache.commons.lang.StringUtils.isBlank;
@@ -544,6 +547,35 @@ public <T> void refresh(Class<T> clazz, boolean waitForOperation) {
544547
.refresh(refreshRequest(persistentEntity.getIndexName()).force(waitForOperation)).actionGet();
545548
}
546549

550+
public Boolean addAlias(AliasQuery query) {
551+
Assert.notNull(query.getIndexName(), "No index defined for Alias");
552+
Assert.notNull(query.getAliasName(), "No alias defined");
553+
IndicesAliasesRequestBuilder indicesAliasesRequestBuilder = null;
554+
if(query.getFilterBuilder() != null) {
555+
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilterBuilder());
556+
} else if(query.getFilter() != null) {
557+
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilter());
558+
} else {
559+
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName());
560+
}
561+
return indicesAliasesRequestBuilder.execute().actionGet().isAcknowledged();
562+
}
563+
564+
public Boolean removeAlias(AliasQuery query) {
565+
Assert.notNull(query.getIndexName(), "No index defined for Alias");
566+
Assert.notNull(query.getAliasName(), "No alias defined");
567+
return client.admin().indices().prepareAliases().removeAlias(query.getIndexName(), query.getAliasName())
568+
.execute().actionGet().isAcknowledged();
569+
}
570+
571+
public Set<String> queryForAlias(String indexName) {
572+
ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest()
573+
.filterRoutingTable(true)
574+
.filterNodes(true)
575+
.filteredIndices(indexName);
576+
return client.admin().cluster().state(clusterStateRequest).actionGet().getState().getMetaData().aliases().keySet();
577+
}
578+
547579
private ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) {
548580
Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName()
549581
+ " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")");
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright 2013 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.elasticsearch.core.query;
17+
18+
import org.elasticsearch.index.query.FilterBuilder;
19+
20+
import java.util.Map;
21+
/**
22+
*
23+
* @author Mohsin Husen
24+
*/
25+
public class AliasBuilder {
26+
27+
private String indexName;
28+
private String aliasName;
29+
private FilterBuilder filterBuilder;
30+
private Map<String, Object> filter;
31+
32+
public AliasBuilder withIndexName(String indexName){
33+
this.indexName = indexName;
34+
return this;
35+
}
36+
37+
public AliasBuilder withAliasName(String aliasName){
38+
this.aliasName = aliasName;
39+
return this;
40+
}
41+
42+
public AliasBuilder withFilterBuilder(FilterBuilder filterBuilder){
43+
this.filterBuilder = filterBuilder;
44+
return this;
45+
}
46+
47+
public AliasBuilder withFilter(Map<String, Object> filter){
48+
this.filter = filter;
49+
return this;
50+
}
51+
52+
public AliasQuery build(){
53+
AliasQuery aliasQuery = new AliasQuery();
54+
aliasQuery.setIndexName(indexName);
55+
aliasQuery.setAliasName(aliasName);
56+
aliasQuery.setFilterBuilder(filterBuilder);
57+
aliasQuery.setFilter(filter);
58+
return aliasQuery;
59+
}
60+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright 2013 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.elasticsearch.core.query;
17+
import org.elasticsearch.index.query.FilterBuilder;
18+
import java.util.Map;
19+
/**
20+
* AliasQuery is useful for creating new alias or deleting existing ones
21+
*
22+
* @author Mohsin Husen
23+
*/
24+
public class AliasQuery {
25+
26+
private String indexName;
27+
private String aliasName;
28+
private FilterBuilder filterBuilder;
29+
private Map<String, Object> filter;
30+
31+
public String getIndexName() {
32+
return indexName;
33+
}
34+
35+
public void setIndexName(String indexName) {
36+
this.indexName = indexName;
37+
}
38+
39+
public String getAliasName() {
40+
return aliasName;
41+
}
42+
43+
public void setAliasName(String aliasName) {
44+
this.aliasName = aliasName;
45+
}
46+
47+
public FilterBuilder getFilterBuilder() {
48+
return filterBuilder;
49+
}
50+
51+
public void setFilterBuilder(FilterBuilder filterBuilder) {
52+
this.filterBuilder = filterBuilder;
53+
}
54+
55+
public Map<String, Object> getFilter() {
56+
return filter;
57+
}
58+
59+
public void setFilter(Map<String, Object> filter) {
60+
this.filter = filter;
61+
}
62+
}

src/test/java/org/springframework/data/elasticsearch/config/EnableElasticsearchRepositoriesTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static class Config {
4646

4747
@Bean
4848
public ElasticsearchOperations elasticsearchTemplate() {
49-
return new ElasticsearchTemplate(nodeBuilder().local(true).clusterName("testCluster").node().client());
49+
return new ElasticsearchTemplate(nodeBuilder().local(true).clusterName("testCluster2").node().client());
5050
}
5151
}
5252

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
import java.util.ArrayList;
4141
import java.util.List;
42+
import java.util.Set;
4243

4344
import static org.apache.commons.lang.RandomStringUtils.randomNumeric;
4445
import static org.elasticsearch.index.query.FilterBuilders.boolFilter;
@@ -858,4 +859,40 @@ public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() {
858859
assertThat(sampleEntities.getTotalElements(), equalTo(0L));
859860
}
860861

862+
@Test
863+
public void shouldAddAlias(){
864+
// given
865+
elasticsearchTemplate.createIndex(SampleEntity.class);
866+
AliasQuery aliasQuery = new AliasBuilder()
867+
.withIndexName("test-index")
868+
.withAliasName("test-alias").build();
869+
// when
870+
elasticsearchTemplate.addAlias(aliasQuery);
871+
// then
872+
Set<String> aliases = elasticsearchTemplate.queryForAlias("test-index");
873+
assertThat(aliases, is(notNullValue()));
874+
assertThat(aliases.contains("test-alias"), is(true));
875+
}
876+
877+
@Test
878+
public void shouldRemoveAlias(){
879+
// given
880+
elasticsearchTemplate.createIndex(SampleEntity.class);
881+
String indexName = "test-index";
882+
String aliasName = "test-alias";
883+
AliasQuery aliasQuery = new AliasBuilder()
884+
.withIndexName(indexName)
885+
.withAliasName(aliasName).build();
886+
// when
887+
elasticsearchTemplate.addAlias(aliasQuery);
888+
Set<String> aliases = elasticsearchTemplate.queryForAlias(indexName);
889+
assertThat(aliases, is(notNullValue()));
890+
assertThat(aliases.contains(aliasName), is(true));
891+
// then
892+
elasticsearchTemplate.removeAlias(aliasQuery);
893+
aliases = elasticsearchTemplate.queryForAlias(indexName);
894+
assertThat(aliases, is(notNullValue()));
895+
assertThat(aliases.size(), is(0));
896+
}
897+
861898
}

0 commit comments

Comments
 (0)