DATAES-70 - Alias creation with routing not supported

added routing parameters
This commit is contained in:
Mohsin Husen 2014-04-03 16:49:50 +01:00
parent 3453f30a26
commit 9e97dec225
5 changed files with 162 additions and 10 deletions

View File

@ -19,6 +19,7 @@ import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static org.apache.commons.lang.StringUtils.*; import static org.apache.commons.lang.StringUtils.*;
import static org.elasticsearch.action.search.SearchType.*; import static org.elasticsearch.action.search.SearchType.*;
import static org.elasticsearch.client.Requests.*; 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.common.collect.Sets.*;
import static org.elasticsearch.index.VersionType.*; import static org.elasticsearch.index.VersionType.*;
import static org.springframework.data.elasticsearch.core.MappingBuilder.*; 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.action.update.UpdateResponse;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests; import org.elasticsearch.client.Requests;
import org.elasticsearch.cluster.metadata.AliasAction;
import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.collect.MapBuilder;
@ -706,15 +708,19 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
public Boolean addAlias(AliasQuery query) { public Boolean addAlias(AliasQuery query) {
Assert.notNull(query.getIndexName(), "No index defined for Alias"); Assert.notNull(query.getIndexName(), "No index defined for Alias");
Assert.notNull(query.getAliasName(), "No alias defined"); Assert.notNull(query.getAliasName(), "No alias defined");
IndicesAliasesRequestBuilder indicesAliasesRequestBuilder = null; AliasAction aliasAction = new AliasAction(ADD, query.getIndexName(), query.getAliasName());
if (query.getFilterBuilder() != null) { 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) { } else if (query.getFilter() != null) {
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilter()); aliasAction.filter(query.getFilter());
} else { } else if (isNotBlank(query.getRouting())) {
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName()); 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 @Override

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 String aliasName;
private FilterBuilder filterBuilder; private FilterBuilder filterBuilder;
private Map<String, Object> filter; private Map<String, Object> filter;
private String searchRouting;
private String indexRouting;
private String routing;
public AliasBuilder withIndexName(String indexName) { public AliasBuilder withIndexName(String indexName) {
this.indexName = indexName; this.indexName = indexName;
@ -49,12 +52,30 @@ public class AliasBuilder {
return this; 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() { public AliasQuery build() {
AliasQuery aliasQuery = new AliasQuery(); AliasQuery aliasQuery = new AliasQuery();
aliasQuery.setIndexName(indexName); aliasQuery.setIndexName(indexName);
aliasQuery.setAliasName(aliasName); aliasQuery.setAliasName(aliasName);
aliasQuery.setFilterBuilder(filterBuilder); aliasQuery.setFilterBuilder(filterBuilder);
aliasQuery.setFilter(filter); aliasQuery.setFilter(filter);
aliasQuery.setSearchRouting(searchRouting);
aliasQuery.setIndexRouting(indexRouting);
aliasQuery.setRouting(routing);
return aliasQuery; return aliasQuery;
} }
} }

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 String aliasName;
private FilterBuilder filterBuilder; private FilterBuilder filterBuilder;
private Map<String, Object> filter; private Map<String, Object> filter;
private String searchRouting;
private String indexRouting;
private String routing;
public String getIndexName() { public String getIndexName() {
return indexName; return indexName;
@ -62,4 +65,28 @@ public class AliasQuery {
public void setFilter(Map<String, Object> filter) { public void setFilter(Map<String, Object> filter) {
this.filter = 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;
}
} }

View File

@ -927,6 +927,104 @@ public class ElasticsearchTemplateTests {
assertThat(aliases.size(), is(0)); 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<String> 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<String> 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 @Test
public void shouldIndexDocumentForSpecifiedSource() { public void shouldIndexDocumentForSpecifiedSource() {
@ -1402,7 +1500,7 @@ public class ElasticsearchTemplateTests {
assertThat(map.containsKey("index.store.type"), is(true)); assertThat(map.containsKey("index.store.type"), is(true));
assertThat((String) map.get("index.refresh_interval"), is("-1")); 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_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")); assertThat((String) map.get("index.store.type"), is("memory"));
} }

View File

@ -25,7 +25,7 @@ import org.springframework.data.elasticsearch.annotations.Document;
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @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 { public class SampleEntity {
@Id @Id