DATAES-864 - Rework alias management.

Original PR: #486
This commit is contained in:
Peter-Josef Meisch
2020-06-25 21:57:47 +02:00
committed by GitHub
parent c6b2276029
commit 44a669d66c
24 changed files with 1211 additions and 222 deletions

View File

@@ -39,6 +39,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -75,6 +76,10 @@ import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.index.AliasAction;
import org.springframework.data.elasticsearch.core.index.AliasActionParameters;
import org.springframework.data.elasticsearch.core.index.AliasActions;
import org.springframework.data.elasticsearch.core.index.AliasData;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.data.util.StreamUtils;
@@ -215,7 +220,7 @@ public abstract class ElasticsearchTemplateTests {
assertThat(sampleEntity1).isEqualTo(sampleEntity);
}
@Test
@Test // DATAES-52
public void shouldReturnObjectsForGivenIdsUsingMultiGet() {
// given
@@ -277,7 +282,7 @@ public abstract class ElasticsearchTemplateTests {
assertThat(sampleEntities.get(2)).isEqualTo(sampleEntity2);
}
@Test
@Test // DATAES-52
public void shouldReturnObjectsForGivenIdsUsingMultiGetWithFields() {
// given
@@ -2739,6 +2744,54 @@ public abstract class ElasticsearchTemplateTests {
assertThat(aliases.get(0).alias()).isEqualTo(aliasName);
}
@Test // DATAES-864
void shouldAddAliasesWithAliasActions() {
AliasActions aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder()
.withIndices(indexOperations.getIndexCoordinates().getIndexNames()).withAliases("aliasA", "aliasB").build()));
indexOperations.alias(aliasActions);
List<AliasMetaData> aliases = indexOperations.queryForAlias();
assertThat(aliases).hasSize(2);
assertThat(aliases.stream().map(AliasMetaData::alias).collect(Collectors.toList())).contains("aliasA", "aliasB");
}
@Test // DATAES-864
void shouldRemoveAliasesWithAliasActions() {
AliasActions aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder()
.withIndices(indexOperations.getIndexCoordinates().getIndexNames()).withAliases("aliasA", "aliasB").build()));
indexOperations.alias(aliasActions);
aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Remove(AliasActionParameters.builder()
.withIndices(indexOperations.getIndexCoordinates().getIndexNames()).withAliases("aliasA", "aliasB").build()));
indexOperations.alias(aliasActions);
List<AliasMetaData> aliases = indexOperations.queryForAlias();
assertThat(aliases).hasSize(0);
}
@Test // DATAES-864
void shouldGetAliasData() {
AliasActions aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder()
.withIndices(indexOperations.getIndexCoordinates().getIndexNames()).withAliases("aliasA", "aliasB").build()));
indexOperations.alias(aliasActions);
Map<String, Set<AliasData>> aliasDatas = indexOperations.getAliases("aliasA");
Set<AliasData> aliasData = aliasDatas.get(indexOperations.getIndexCoordinates().getIndexName());
assertThat(aliasData.stream().map(AliasData::getAlias)).containsExactly("aliasA");
}
@Test // DATAES-70
public void shouldAddAliasForVariousRoutingValues() {

View File

@@ -19,9 +19,11 @@ import static org.assertj.core.api.Assertions.*;
import static org.skyscreamer.jsonassert.JSONAssert.*;
import lombok.Data;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.LocalDate;
import java.util.Set;
import org.json.JSONException;
import org.junit.jupiter.api.AfterEach;
@@ -38,6 +40,10 @@ import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.Setting;
import org.springframework.data.elasticsearch.core.index.AliasAction;
import org.springframework.data.elasticsearch.core.index.AliasActionParameters;
import org.springframework.data.elasticsearch.core.index.AliasActions;
import org.springframework.data.elasticsearch.core.index.AliasData;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration;
import org.springframework.data.elasticsearch.junit.jupiter.ReactiveElasticsearchRestTemplateConfiguration;
@@ -333,6 +339,45 @@ public class ReactiveIndexOperationsTest {
}).verifyComplete();
}
@Test // DATAES-864
void shouldCreateAlias() {
ReactiveIndexOperations indexOps = operations.indexOps(Entity.class);
AliasActions aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder()
.withIndices(indexOps.getIndexCoordinates().getIndexNames()).withAliases("aliasA", "aliasB").build()));
indexOps.create().flatMap(success -> {
if (success) {
return indexOps.alias(aliasActions);
} else {
return Mono.just(false);
}
}).as(StepVerifier::create).expectNext(true).verifyComplete();
}
@Test // DATAES-864
void shouldGetAliasData() {
ReactiveIndexOperations indexOps = operations.indexOps(Entity.class);
AliasActions aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder()
.withIndices(indexOps.getIndexCoordinates().getIndexNames()).withAliases("aliasA", "aliasB").build()));
assertThat(indexOps.create().block()).isTrue();
assertThat(indexOps.alias(aliasActions).block()).isTrue();
indexOps.getAliases("aliasA") //
.as(StepVerifier::create) //
.assertNext(aliasDatas -> { //
Set<AliasData> aliasData = aliasDatas.get(indexOps.getIndexCoordinates().getIndexName());
assertThat(aliasData.stream().map(AliasData::getAlias)).containsExactly("aliasA");
}) //
.verifyComplete();
}
@Data
@Document(indexName = TESTINDEX, shards = 3, replicas = 2, refreshInterval = "4s")
static class Entity {

View File

@@ -20,9 +20,11 @@ import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.mockito.Mockito.*;
import static org.skyscreamer.jsonassert.JSONAssert.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
import org.elasticsearch.action.index.IndexAction;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexRequestBuilder;
@@ -30,6 +32,9 @@ import org.elasticsearch.action.search.SearchAction;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentType;
import org.json.JSONException;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -43,6 +48,9 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.index.AliasAction;
import org.springframework.data.elasticsearch.core.index.AliasActionParameters;
import org.springframework.data.elasticsearch.core.index.AliasActions;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.data.elasticsearch.core.query.Criteria;
@@ -250,6 +258,123 @@ class RequestFactoryTests {
assertThat(builder.request().source().seqNoAndPrimaryTerm()).isNull();
}
@Test // DATAES-864
void shouldBuildIndicesAliasRequest() throws IOException, JSONException {
AliasActions aliasActions = new AliasActions();
aliasActions.add(new AliasAction.Add(
AliasActionParameters.builder().withIndices("index1", "index2").withAliases("alias1").build()));
aliasActions.add(
new AliasAction.Remove(AliasActionParameters.builder().withIndices("index3").withAliases("alias1").build()));
aliasActions.add(new AliasAction.RemoveIndex(AliasActionParameters.builder().withIndices("index3").build()));
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder().withIndices("index4").withAliases("alias4")
.withRouting("routing").withIndexRouting("indexRouting").withSearchRouting("searchRouting").withIsHidden(true)
.withIsWriteIndex(true).build()));
Query query = new CriteriaQuery(new Criteria("lastName").is("Smith"));
aliasActions.add(new AliasAction.Add(AliasActionParameters.builder().withIndices("index5").withAliases("alias5")
.withFilterQuery(query, Person.class).build()));
String expected = "{\n" + //
" \"actions\": [\n" + //
" {\n" + //
" \"add\": {\n" + //
" \"indices\": [\n" + //
" \"index1\",\n" + //
" \"index2\"\n" + //
" ],\n" + //
" \"aliases\": [\n" + //
" \"alias1\"\n" + //
" ]\n" + //
" }\n" + //
" },\n" + //
" {\n" + //
" \"remove\": {\n" + //
" \"indices\": [\n" + //
" \"index3\"\n" + //
" ],\n" + //
" \"aliases\": [\n" + //
" \"alias1\"\n" + //
" ]\n" + //
" }\n" + //
" },\n" + //
" {\n" + //
" \"remove_index\": {\n" + //
" \"indices\": [\n" + //
" \"index3\"\n" + //
" ]\n" + //
" }\n" + //
" },\n" + //
" {\n" + //
" \"add\": {\n" + //
" \"indices\": [\n" + //
" \"index4\"\n" + //
" ],\n" + //
" \"aliases\": [\n" + //
" \"alias4\"\n" + //
" ],\n" + //
" \"routing\": \"routing\",\n" + //
" \"index_routing\": \"indexRouting\",\n" + //
" \"search_routing\": \"searchRouting\",\n" + //
" \"is_write_index\": true,\n" + //
" \"is_hidden\": true\n" + //
" }\n" + //
" },\n" + //
" {\n" + //
" \"add\": {\n" + //
" \"indices\": [\n" + //
" \"index5\"\n" + //
" ],\n" + //
" \"aliases\": [\n" + //
" \"alias5\"\n" + //
" ],\n" + //
" \"filter\": {\n" + //
" \"bool\": {\n" + //
" \"must\": [\n" + //
" {\n" + //
" \"query_string\": {\n" + //
" \"query\": \"Smith\",\n" + //
" \"fields\": [\n" + //
" \"last-name^1.0\"\n" + //
" ],\n" + //
" \"type\": \"best_fields\",\n" + //
" \"default_operator\": \"and\",\n" + //
" \"max_determinized_states\": 10000,\n" + //
" \"enable_position_increments\": true,\n" + //
" \"fuzziness\": \"AUTO\",\n" + //
" \"fuzzy_prefix_length\": 0,\n" + //
" \"fuzzy_max_expansions\": 50,\n" + //
" \"phrase_slop\": 0,\n" + //
" \"escape\": false,\n" + //
" \"auto_generate_synonyms_phrase_query\": true,\n" + //
" \"fuzzy_transpositions\": true,\n" + //
" \"boost\": 1.0\n" + //
" }\n" + //
" }\n" + //
" ],\n" + //
" \"adjust_pure_negative\": true,\n" + //
" \"boost\": 1.0\n" + //
" }\n" + //
" }\n" + //
" }\n" + //
" }\n" + //
" ]\n" + //
"}"; //
IndicesAliasesRequest indicesAliasesRequest = requestFactory.indicesAliasesRequest(aliasActions);
String json = requestToString(indicesAliasesRequest);
assertEquals(expected, json, false);
}
private String requestToString(ToXContent request) throws IOException {
return XContentHelper.toXContent(request, XContentType.JSON, true).utf8ToString();
}
static class Person {
@Nullable @Id String id;
@Nullable @Field(name = "last-name") String lastName;