/*
* 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.test.configuration;
import java.util.Map;
import org.hibernate.search.engine.spi.EntityIndexBinding;
import org.hibernate.search.indexes.spi.DirectoryBasedIndexManager;
import org.hibernate.search.indexes.spi.IndexManager;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.IndexShardingStrategy;
import org.hibernate.search.store.impl.FSDirectoryProvider;
import org.hibernate.search.store.impl.RAMDirectoryProvider;
import org.hibernate.search.test.Document;
import org.hibernate.search.test.query.Author;
import org.hibernate.search.test.query.Book;
import org.hibernate.search.testsupport.junit.SkipOnElasticsearch;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.hibernate.search.backend.configuration.impl.IndexWriterSetting.MAX_BUFFERED_DOCS;
import static org.hibernate.search.backend.configuration.impl.IndexWriterSetting.MAX_MERGE_DOCS;
import static org.hibernate.search.backend.configuration.impl.IndexWriterSetting.MERGE_FACTOR;
import static org.hibernate.search.backend.configuration.impl.IndexWriterSetting.RAM_BUFFER_SIZE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* @author Sanne Grinovero
*/
public class ShardsConfigurationTest extends ConfigurationReadTestCase {
@Override
public void configure(Map<String,Object> cfg) {
super.configure( cfg );
cfg.put( "hibernate.search.default.sharding_strategy.nbr_of_shards", "2" );// permit this?
cfg.put( "hibernate.search.default.directory_provider", "filesystem" );
cfg.put( "hibernate.search.default.2.directory_provider", "ram" );
cfg.put( "hibernate.search.Documents.indexwriter.max_buffered_docs", "4" );
cfg.put( "hibernate.search.Documents.indexwriter.max_merge_docs", "5" );
cfg.put( "hibernate.search.Documents.sharding_strategy.nbr_of_shards", "4" );
cfg.put( "hibernate.search.Documents.sharding_strategy", UselessShardingStrategy.class.getCanonicalName() );
cfg.put( "hibernate.search.Documents.sharding_strategy.test.system.default", "45" );
cfg.put( "hibernate.search.Documents.sharding_strategy.test.output", "70" );
cfg.put( "hibernate.search.Documents.0.indexwriter.max_merge_docs", "57" );
//use fqcn to make sure it still works even after the introduction of the shortcuts
cfg.put( "hibernate.search.Documents.0.directory_provider", RAMDirectoryProvider.class.getCanonicalName() );
cfg.put( "hibernate.search.Documents.0.indexwriter.max_buffered_docs", "58" );
cfg.put( "hibernate.search.Documents.1.indexwriter.max_merge_docs", "11" );
cfg.put( "hibernate.search.Documents.1.indexwriter.max_buffered_docs", "12" );
cfg.put( "hibernate.search.Documents.1.indexwriter.term_index_interval", "12" );
//super contains these:
//cfg.put( "hibernate.search.default.indexwriter.merge_factor", "100" );
//cfg.put( "hibernate.search.default.indexwriter.max_buffered_docs", "1000" );
}
@Test
public void testCorrectNumberOfShardsDetected() {
EntityIndexBinding indexBindingForDocument = getExtendedSearchIntegrator().getIndexBinding( Document.class );
IndexManager[] documentManagers = indexBindingForDocument.getIndexManagers();
assertNotNull( documentManagers );
assertEquals( 4, documentManagers.length );
EntityIndexBinding indexBindingForBooks = getExtendedSearchIntegrator().getIndexBinding( Book.class );
IndexManager[] bookManagers = indexBindingForBooks.getIndexManagers();
assertNotNull( bookManagers );
assertEquals( 2, bookManagers.length );
}
@Test
public void testSelectionOfShardingStrategy() {
IndexShardingStrategy shardingStrategy = getExtendedSearchIntegrator().getIndexBinding( Document.class ).getSelectionStrategy();
assertNotNull( shardingStrategy );
assertEquals( shardingStrategy.getClass(), UselessShardingStrategy.class );
}
@Test
@Category(SkipOnElasticsearch.class) // DirectoryProviders and IndexWriterSettings are specific to the Lucene backend
public void testShardingSettingsInherited() {
IndexManager[] indexManagers = getExtendedSearchIntegrator().getIndexBindings().get( Document.class ).getIndexManagers();
assertTrue( getDirectoryProvider( indexManagers[0] ) instanceof RAMDirectoryProvider );
assertTrue( getDirectoryProvider( indexManagers[1] ) instanceof FSDirectoryProvider );
assertTrue( getDirectoryProvider( indexManagers[2] ) instanceof RAMDirectoryProvider );
assertValueIsSet( Document.class, 0, MAX_BUFFERED_DOCS, 58 );
assertValueIsSet( Document.class, 1, MAX_BUFFERED_DOCS, 12 );
}
@Test
@Category(SkipOnElasticsearch.class) // IndexWriterSettings are specific to the Lucene backend
public void testShardN2UsesDefaults() {
assertValueIsSet( Document.class, 2, MAX_BUFFERED_DOCS, 4 );
assertValueIsSet( Document.class, 2, MERGE_FACTOR, 100 );
assertValueIsDefault( Document.class, 2, RAM_BUFFER_SIZE );
assertValueIsSet( Document.class, 2, MAX_BUFFERED_DOCS, 4 );
assertValueIsSet( Document.class, 2, MAX_MERGE_DOCS, 5 );
assertValueIsDefault( Document.class, 2, RAM_BUFFER_SIZE );
}
@Test
@Category(SkipOnElasticsearch.class) // IndexWriterSettings are specific to the Lucene backend
public void testShardN1_ExplicitParams() {
assertValueIsSet( Document.class, 1, MAX_BUFFERED_DOCS, 12 );
assertValueIsSet( Document.class, 1, MAX_MERGE_DOCS, 11 );
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] {
Book.class,
Author.class,
Document.class
};
}
private static DirectoryProvider getDirectoryProvider(IndexManager indexManager) {
DirectoryBasedIndexManager dpBasedManager = (DirectoryBasedIndexManager) indexManager;
return dpBasedManager.getDirectoryProvider();
}
}