/*
* 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.shards;
import java.util.Map;
import org.apache.lucene.index.IndexReader;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.indexes.IndexReaderAccessor;
import org.hibernate.search.test.SearchTestBase;
import org.hibernate.search.testsupport.junit.SkipOnElasticsearch;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Test to retrieve specific IndexReader instances by index name.
*
* @author Sanne Grinovero (C) 2011 Red Hat Inc.
*/
@Category(SkipOnElasticsearch.class) // Directories are specific to the Lucene backend
public class DirectorySelectionTest extends SearchTestBase {
private IndexReaderAccessor indexReaderAccessor;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
FullTextSession fts = indexData();
indexReaderAccessor = fts.getSearchFactory().getIndexReaderAccessor();
}
@Test
public void testDirectoryProviderForQuery() throws Exception {
IndexReader indexReader = indexReaderAccessor.open( Product.class );
try {
Assert.assertEquals( 2, indexReader.numDocs() );
}
finally {
indexReaderAccessor.close( indexReader );
}
indexReader = indexReaderAccessor.open( "Products.0" );
try {
Assert.assertEquals( 1, indexReader.numDocs() );
}
finally {
indexReaderAccessor.close( indexReader );
}
indexReader = indexReaderAccessor.open( "Products.1" );
try {
Assert.assertEquals( 1, indexReader.numDocs() );
}
finally {
indexReaderAccessor.close( indexReader );
}
}
@Test
public void testOpeningIndexReaderByUnknownNameThrowsException() throws Exception {
try {
indexReaderAccessor.open( "Products.1", "hoa?" );
Assert.fail( "should have failed" );
}
catch (SearchException se) {
Assert.assertEquals( "HSEARCH000107: Index names hoa? is not defined", se.getMessage() );
}
}
@Test
public void testOpeningIndexReaderUsingEmptyStringArrayThrowsException() throws Exception {
try {
indexReaderAccessor.open( new String[]{} );
Assert.fail( "should have failed" );
}
catch (IllegalArgumentException e) {
Assert.assertEquals( "HSEARCH000111: At least one index name must be provided: can't open an IndexReader on nothing", e.getMessage() );
}
}
@Test
public void testOpeningIndexReaderUsingNullAsNameThrowsException() throws Exception {
try {
indexReaderAccessor.open( (String) null );
Assert.fail( "should have failed" );
}
catch (IllegalArgumentException e) {
Assert.assertEquals( "HSEARCH000111: At least one index name must be provided: can't open an IndexReader on nothing", e.getMessage() );
}
}
@Test
public void testOpeningIndexReaderByUnknownEntityThrowsException() throws Exception {
try {
indexReaderAccessor.open( this.getClass() );
Assert.fail( "should have failed" );
}
catch (IllegalArgumentException e) {
Assert.assertEquals(
"HSEARCH000109: org.hibernate.search.test.shards.DirectorySelectionTest is not an indexed type",
e.getMessage()
);
}
}
@Test
public void testOpeningIndexReaderUsingEmptyClassArrayThrowsException() throws Exception {
try {
indexReaderAccessor.open( new Class<?>[]{} );
Assert.fail( "should have failed" );
}
catch (IllegalArgumentException e) {
Assert.assertEquals( "HSEARCH000112: At least one entity type must be provided: can't open an IndexReader on nothing", e.getMessage() );
}
}
@Test
public void testOpeningIndexReaderUsingNullAsClassThrowsException() throws Exception {
try {
indexReaderAccessor.open( (Class<?>) null );
Assert.fail( "should have failed" );
}
catch (IllegalArgumentException e) {
Assert.assertEquals( "HSEARCH000110: 'null' is not a valid indexed type", e.getMessage() );
}
}
private FullTextSession indexData() {
Session s = openSession();
Transaction tx = s.beginTransaction();
Product p1 = new Product();
p1.setName( "The Definitive ANTLR Reference: Building Domain-Specific Languages" );
p1.setAvailable( true );
s.persist( p1 );
Product p2 = new Product();
p2.setName( "Recipes for distributed cloud applications using Infinispan" );
p2.setAvailable( false );
s.persist( p2 );
tx.commit();
s.clear();
FullTextSession fts = Search.getFullTextSession( s );
fts.close();
return fts;
}
@Override
public void configure(Map<String,Object> cfg) {
cfg.put(
"hibernate.search.Products.sharding_strategy",
ProductsAvailabilityShardingStrategy.class.getCanonicalName()
);
cfg.put( "hibernate.search.Products.sharding_strategy.nbr_of_shards", "2" );
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] {
Product.class
};
}
}