package pl.allegro.tech.search.elasticsearch.tools.reindex.embeded;
import static org.elasticsearch.node.NodeBuilder.nodeBuilder;
import java.util.stream.Stream;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.node.Node;
import org.elasticsearch.node.NodeBuilder;
import pl.allegro.tech.search.elasticsearch.tools.reindex.ReindexInvokerTest;
import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticDataPointer;
import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticDataPointerBuilder;
import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticSearchQuery;
import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticSearchQueryBuilder;
public final class EmbeddedElasticsearchCluster {
public static final String CLUSTER_NAME = "ReindexInvoker_cluster";
public static final int ELS_PORT = 9211;
public static final int ELS_TCP_PORT = 9311;
private final Node dataNode;
private EmbeddedElasticsearchCluster(String clusterName, int apiPort) {
NodeBuilder nodeBuilder = nodeBuilder()
.clusterName(clusterName)
.data(true);
Settings.Builder settings = nodeBuilder.settings()
.put("http.port", ELS_PORT)
//.put("index.store.type", "memory")
.put("path.home", ".")
.put("transport.tcp.port", apiPort);
dataNode = nodeBuilder.settings(settings).node();
dataNode.client().admin().cluster().prepareHealth().setWaitForGreenStatus().get();
}
public static EmbeddedElasticsearchCluster createDataNode() {
return new EmbeddedElasticsearchCluster(CLUSTER_NAME, ELS_TCP_PORT);
}
public void recreateIndex(final String sourceIndex) {
IndicesAdminClient indices = dataNode.client().admin().indices();
if (indices.prepareExists(sourceIndex).get().isExists()) {
indices.prepareDelete(sourceIndex).get();
}
indices.prepareCreate(sourceIndex).get();
}
public void close() {
dataNode.close();
}
public Client client() {
return dataNode.client();
}
public void deleteIndex(String targetIndex) {
IndicesAdminClient indices = dataNode.client().admin().indices();
if (indices.prepareExists(targetIndex).get().isExists()) {
indices.prepareDelete(targetIndex).get();
}
}
public void indexDocument(String index, String type, IndexDocument indexDocument) {
IndexRequestBuilder requestBuilder = dataNode.client().prepareIndex(index, type, indexDocument.getId()).setSource(indexDocument.getDoc());
if (indexDocument.getTTL() != null) {
requestBuilder.setTTL(indexDocument.getTTL());
}
requestBuilder.get();
}
public boolean indexExist(String index) {
return dataNode.client().admin().indices().prepareExists(index).get().isExists();
}
public long count(String index) {
return dataNode.client().prepareCount(index).get().getCount();
}
public ElasticDataPointer createDataPointer(String indexName) {
return ElasticDataPointerBuilder.builder()
.setAddress("http://127.0.0.1:" + ELS_TCP_PORT + "/" + indexName + "/" + ReindexInvokerTest.DATA_TYPE)
.setClusterName(CLUSTER_NAME)
.build();
}
public void indexWithSampleData(String sourceIndex, String type, Stream<IndexDocument> indexDocumentStream) {
recreateIndex(sourceIndex);
indexDocumentStream.forEach(
indexDocument -> indexDocument(sourceIndex, type, indexDocument)
);
refreshIndex();
}
public void refreshIndex() {
dataNode.client().admin().indices().prepareRefresh().get();
}
public void createIndex(String index, String type, XContentBuilder mappingDef) {
dataNode.client().admin().indices()
.prepareCreate(index)
.addMapping(type, mappingDef)
.get();
}
public ElasticSearchQuery createInitialQuery(String query) {
return ElasticSearchQueryBuilder.builder().setQuery(query).build();
}
public ElasticSearchQuery createInitialQuery(String query, String orderByField) {
return ElasticSearchQueryBuilder.builder().setQuery(query).setSortByField(orderByField).build();
}
}