package com.manning.hsia.dvdstore;
import com.manning.hsia.test.SearchTestCase;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.SearchFactory;
import org.hibernate.search.reader.ReaderProvider;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.FSDirectoryProvider;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.File;
import java.util.List;
public class TestShards extends SearchTestCase {
Transaction tx;
@Test(groups="ch11", alwaysRun=true)
public void testShards() throws Exception {
FullTextSession session = Search.getFullTextSession( openSession() );
buildIndex( session );
ReaderProvider readerProvider = null;
IndexReader reader0 = null;
IndexReader reader1 = null;
List results;
try {
tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
QueryParser parser = new QueryParser( "id", new StandardAnalyzer() );
results = fullTextSession.createFullTextQuery( parser.parse( "name:bear OR name:elephant" ) ).list();
assert results.size() == 2 : "Either insert or query failed";
SearchFactory searchFactory = fullTextSession.getSearchFactory();
DirectoryProvider[] providers =
searchFactory.getDirectoryProviders( MergedAnimal.class );
assert providers.length == 2 : "Wrong provider count";
readerProvider = searchFactory.getReaderProvider();
reader0 = readerProvider.openReader( providers[0] );
reader1 = readerProvider.openReader( providers[1] );
assert reader0.document( 0 ).get( "name" ).equals( "Bear" ) : "Incorrect document name";
assert reader1.document( 0 ).get( "name" ).equals( "Elephant" ) : "Incorrect document name";
for (Object o : results) session.delete( o );
tx.commit();
}
finally {
if ( reader0 != null )
readerProvider.closeReader( reader0 );
if ( reader1 != null )
readerProvider.closeReader( reader1 );
session.close();
}
}
private void buildIndex( FullTextSession session ) {
tx = session.beginTransaction();
MergedAnimal a = new MergedAnimal();
a.setId( 1 );
a.setName( "Elephant" );
session.save( a );
a = new MergedAnimal();
a.setId( 2 );
a.setName( "Bear" );
session.save( a );
tx.commit();
session.clear();
}
@BeforeClass(groups="ch11", alwaysRun=true)
protected void setUp() throws Exception {
File sub = locateBaseDir();
File[] files = sub.listFiles();
if ( files != null ) {
for (File file : files) {
if ( file.isDirectory() ) {
delete( file );
}
}
}
buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
}
@Override
protected void configure( Configuration cfg ) {
super.configure( cfg );
cfg.setProperty( "hibernate.search.default.directory_provider", FSDirectoryProvider.class.getName() );
File sub = locateBaseDir();
cfg.setProperty( "hibernate.search.default.indexBase", sub.getAbsolutePath() );
cfg.setProperty( "hibernate.search.Animal.sharding_strategy.nbr_of_shards", "2" );
cfg.setProperty( "hibernate.search.Animal.0.indexName", "Animal00" );
}
protected Class[] getMappings() {
return new Class[]{
MergedAnimal.class,
};
}
}