package pl.allegro.tech.search.elasticsearch.tools.reindex; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticDataPointer; import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticSearchQuery; import pl.allegro.tech.search.elasticsearch.tools.reindex.embeded.EmbeddedElasticsearchCluster; import pl.allegro.tech.search.elasticsearch.tools.reindex.embeded.IndexDocument; import pl.allegro.tech.search.elasticsearch.tools.reindex.query.DoubleFieldSegmentation; import pl.allegro.tech.search.elasticsearch.tools.reindex.query.EmptySegmentation; import pl.allegro.tech.search.elasticsearch.tools.reindex.query.StringPrefixSegmentation; import pl.allegro.tech.search.elasticsearch.tools.reindex.statistics.ReindexingSummary; import java.util.stream.IntStream; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static pl.allegro.tech.search.elasticsearch.tools.reindex.statistics.ReindexingSummaryAssert.assertThat; public class ReindexInvokerTest { private static final String SOURCE_INDEX = "sourceindex"; private static final String TARGET_INDEX = "targetindex"; public static final String DATA_TYPE = "type"; private static EmbeddedElasticsearchCluster embeddedElasticsearchCluster; @BeforeClass public static void setUp() throws Exception { embeddedElasticsearchCluster = EmbeddedElasticsearchCluster.createDataNode(); } @AfterClass public static void tearDown() throws Exception { embeddedElasticsearchCluster.close(); } @Before public void clearTargetIndex() { embeddedElasticsearchCluster.deleteIndex(SOURCE_INDEX); embeddedElasticsearchCluster.deleteIndex(TARGET_INDEX); } @Test public void indexingWithoutSegmentingEmpty() throws Exception { //given embeddedElasticsearchCluster.recreateIndex(SOURCE_INDEX); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery(""); //when ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, EmptySegmentation.createEmptySegmentation(elasticSearchQuery)); //then assertFalse(embeddedElasticsearchCluster.indexExist(TARGET_INDEX)); } @Test public void indexingWithSegmentingEmpty() throws Exception { //given embeddedElasticsearchCluster.recreateIndex(SOURCE_INDEX); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery(""); //when ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, DoubleFieldSegmentation.create("fieldName", Lists.newArrayList(1.0, 3.0), elasticSearchQuery)); //then assertFalse(embeddedElasticsearchCluster.indexExist(TARGET_INDEX)); } @Test public void indexingWithoutSegmenting() throws Exception { //given indexWithSampleData(); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery(""); //when ReindexingSummary reindexingSummary = ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, EmptySegmentation.createEmptySegmentation(elasticSearchQuery)); //then assertEquals(9L, embeddedElasticsearchCluster.count(TARGET_INDEX)); assertThat(reindexingSummary) .hasIndexedCount(9L) .hasQueriedCount(9L) .hasFailedIndexedCount(0L); } @Test public void indexingWithSegmentingByDoubleField() throws Exception { //given indexWithSampleData(); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery(""); //when ReindexingSummary reindexingSummary = ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, DoubleFieldSegmentation.create("fieldName", Lists.newArrayList(1.0, 3.0, 7.0), elasticSearchQuery)); //then assertEquals(6L, embeddedElasticsearchCluster.count(TARGET_INDEX)); assertThat(reindexingSummary) .hasIndexedCount(6L) .hasQueriedCount(6L) .hasFailedIndexedCount(0L); } @Test public void indexingWithSegmentingByPrefixOnStringField() throws Exception { //given indexWithSampleData(); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery(""); //when ReindexingSummary reindexingSummary = ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, StringPrefixSegmentation.create("fieldName", Lists.newArrayList("1", "2", "3", "4"), elasticSearchQuery)); //then assertEquals(4L, embeddedElasticsearchCluster.count(TARGET_INDEX)); assertThat(reindexingSummary) .hasIndexedCount(4L) .hasQueriedCount(4L) .hasFailedIndexedCount(0L); } @Test public void indexingWithStartQuery() throws Exception { //given indexWithSampleData(); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery("" + "{\"range\": {\"fieldName\" : { \"gte\" : \"5\"}}}", "fieldName"); //when ReindexingSummary reindexingSummary = ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, EmptySegmentation.createEmptySegmentation(elasticSearchQuery) ); //then assertEquals(5L, embeddedElasticsearchCluster.count(TARGET_INDEX)); assertThat(reindexingSummary) .hasIndexedCount(5L) .hasQueriedCount(5L) .hasFailedIndexedCount(0L); } private void indexWithSampleData() { Stream<IndexDocument> streamToBeIndexed = IntStream .range(1, 10) .mapToObj( i -> new IndexDocument(Integer.toString(i), ImmutableMap.of("fieldName", i)) ); embeddedElasticsearchCluster.indexWithSampleData(SOURCE_INDEX, DATA_TYPE, streamToBeIndexed); } @Test public void tryingReindexNotExistingIndex() throws Exception { //given embeddedElasticsearchCluster.deleteIndex(SOURCE_INDEX); ElasticDataPointer sourceDataPointer = embeddedElasticsearchCluster.createDataPointer(SOURCE_INDEX); ElasticDataPointer targetDataPointer = embeddedElasticsearchCluster.createDataPointer(TARGET_INDEX); ElasticSearchQuery elasticSearchQuery = embeddedElasticsearchCluster.createInitialQuery(""); //when ReindexInvoker.invokeReindexing(sourceDataPointer, targetDataPointer, EmptySegmentation.createEmptySegmentation(elasticSearchQuery)); //then assertFalse(embeddedElasticsearchCluster.indexExist(TARGET_INDEX)); } }