/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.elasticsearch.schema.impl; import java.util.Map; import org.hibernate.search.elasticsearch.cfg.ElasticsearchIndexStatus; import org.hibernate.search.elasticsearch.client.impl.URLEncodedString; import org.hibernate.search.elasticsearch.logging.impl.Log; import org.hibernate.search.elasticsearch.processor.impl.ElasticsearchWorkProcessor; import org.hibernate.search.elasticsearch.schema.impl.model.IndexMetadata; import org.hibernate.search.elasticsearch.schema.impl.model.TypeMapping; import org.hibernate.search.elasticsearch.settings.impl.model.IndexSettings; import org.hibernate.search.elasticsearch.work.impl.CreateIndexResult; import org.hibernate.search.elasticsearch.work.impl.ElasticsearchWork; import org.hibernate.search.elasticsearch.work.impl.factory.ElasticsearchWorkFactory; import org.hibernate.search.util.logging.impl.LoggerFactory; /** * A utility implementing primitives for the various {@code DefaultElasticsearchSchema*}. * @author Gunnar Morling * @author Yoann Rodiere */ public class ElasticsearchSchemaAccessor { private static final Log LOG = LoggerFactory.make( Log.class ); private final ElasticsearchWorkFactory workFactory; private final ElasticsearchWorkProcessor workProcessor; public ElasticsearchSchemaAccessor(ElasticsearchWorkFactory workFactory, ElasticsearchWorkProcessor workProcessor) { this.workFactory = workFactory; this.workProcessor = workProcessor; } public void createIndex(URLEncodedString indexName, IndexSettings settings, ExecutionOptions executionOptions) { ElasticsearchWork<?> work = workFactory.createIndex( indexName ).settings( settings ).build(); workProcessor.executeSyncUnsafe( work ); } /** * @param indexName The name of the index * @param settings The settings for the newly created index * @param executionOptions The execution options * @return {@code true} if the index was actually created, {@code false} if it already existed. */ public boolean createIndexIfAbsent(URLEncodedString indexName, IndexSettings settings, ExecutionOptions executionOptions) { ElasticsearchWork<CreateIndexResult> work = workFactory.createIndex( indexName ) .settings( settings ) .ignoreExisting() .build(); CreateIndexResult result = workProcessor.executeSyncUnsafe( work ); return CreateIndexResult.CREATED.equals( result ); } public boolean indexExists(URLEncodedString indexName) { ElasticsearchWork<Boolean> work = workFactory.indexExists( indexName ).build(); return workProcessor.executeSyncUnsafe( work ); } public IndexMetadata getCurrentIndexMetadata(URLEncodedString indexName) { IndexMetadata indexMetadata = new IndexMetadata(); indexMetadata.setName( indexName ); ElasticsearchWork<Map<String, TypeMapping>> getMappingWork = workFactory.getIndexTypeMappings( indexName ).build(); try { Map<String, TypeMapping> mappings = workProcessor.executeSyncUnsafe( getMappingWork ); indexMetadata.setMappings( mappings ); } catch (RuntimeException e) { throw LOG.elasticsearchMappingRetrievalForValidationFailed( e ); } ElasticsearchWork<IndexSettings> getSettingsWork = workFactory.getIndexSettings( indexName ).build(); try { IndexSettings indexSettings = workProcessor.executeSyncUnsafe( getSettingsWork ); indexMetadata.setSettings( indexSettings ); } catch (RuntimeException e) { throw LOG.elasticsearchIndexSettingsRetrievalForValidationFailed( e ); } return indexMetadata; } public void updateSettings(URLEncodedString indexName, IndexSettings settings) { ElasticsearchWork<?> work = workFactory.putIndexSettings( indexName, settings ).build(); try { workProcessor.executeSyncUnsafe( work ); } catch (RuntimeException e) { throw LOG.elasticsearchSettingsUpdateFailed( indexName, e ); } } public void putMapping(URLEncodedString indexName, URLEncodedString mappingName, TypeMapping mapping) { ElasticsearchWork<?> work = workFactory.putIndexTypeMapping( indexName, mappingName, mapping ).build(); try { workProcessor.executeSyncUnsafe( work ); } catch (RuntimeException e) { throw LOG.elasticsearchMappingCreationFailed( mappingName, e ); } } public void waitForIndexStatus(final URLEncodedString indexName, ExecutionOptions executionOptions) { ElasticsearchIndexStatus requiredIndexStatus = executionOptions.getRequiredIndexStatus(); String timeoutAndUnit = executionOptions.getIndexManagementTimeoutInMs() + "ms"; ElasticsearchWork<?> work = workFactory.waitForIndexStatusWork( indexName, requiredIndexStatus, timeoutAndUnit ) .build(); workProcessor.executeSyncUnsafe( work ); } public void dropIndex(URLEncodedString indexName, ExecutionOptions executionOptions) { ElasticsearchWork<?> work = workFactory.dropIndex( indexName ).build(); workProcessor.executeSyncUnsafe( work ); } public void closeIndex(URLEncodedString indexName) { ElasticsearchWork<?> work = workFactory.closeIndex( indexName ).build(); workProcessor.executeSyncUnsafe( work ); LOG.closedIndex( indexName ); } public void openIndex(URLEncodedString indexName) { try { ElasticsearchWork<?> work = workFactory.openIndex( indexName ).build(); workProcessor.executeSyncUnsafe( work ); } catch (RuntimeException e) { LOG.openedIndex( indexName ); throw e; } LOG.openedIndex( indexName ); } }