/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.hibernate.search.test.shards;
import junit.framework.Assert;
import org.apache.lucene.index.IndexReader;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.SearchException;
import org.hibernate.search.indexes.IndexReaderAccessor;
import org.hibernate.search.test.SearchTestCase;
/**
* Test to retrieve specific IndexReader instances by index name.
*
* @author Sanne Grinovero <sanne@hibernate.org> (C) 2011 Red Hat Inc.
*/
public class DirectorySelectionTest extends SearchTestCase {
private IndexReaderAccessor indexReaderAccessor;
public void setUp() throws Exception {
super.setUp();
FullTextSession fts = indexData();
indexReaderAccessor = fts.getSearchFactory().getIndexReaderAccessor();
}
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 );
}
}
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() );
}
}
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() );
}
}
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() );
}
}
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()
);
}
}
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() );
}
}
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;
}
protected void configure(Configuration cfg) {
super.configure( cfg );
cfg.setProperty(
"hibernate.search.Products.sharding_strategy",
ProductsAvailabilityShardingStrategy.class.getCanonicalName()
);
cfg.setProperty( "hibernate.search.Products.sharding_strategy.nbr_of_shards", "2" );
}
@SuppressWarnings("unchecked")
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {
Product.class
};
}
}