package com.manning.hsia.dvdstore;
import com.manning.hsia.test.SearchTestCase;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
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.engine.DocumentBuilder;
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 IndexMergeTest extends SearchTestCase {
Transaction tx;
@Test(groups="ch11")
public void testTwoEntitiesNoShards() throws Exception {
FullTextSession session = Search.getFullTextSession( openSession() );
buildIndex( session );
tx = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession( session );
QueryParser parser = new QueryParser( "id", new StandardAnalyzer() );
List results = fullTextSession.createFullTextQuery( parser.parse( "id:1" ) ).list();
assert results.size() == 2 : "Either insert or query failed";
SearchFactory searchFactory = fullTextSession.getSearchFactory();
DirectoryProvider[] provider = searchFactory.getDirectoryProviders( MergedAnimal.class );
assert provider.length == 1 : "Wrong provider count";
org.apache.lucene.store.Directory directory = provider[0].getDirectory();
BooleanQuery classFilter = new BooleanQuery();
classFilter.setBoost( 0 );
Term t = new Term( DocumentBuilder.CLASS_FIELDNAME, Furniture.class.getName() );
TermQuery termQuery = new TermQuery( t );
classFilter.add( termQuery, BooleanClause.Occur.SHOULD );
Term luceneTerm = new Term( "id", "1" );
Query luceneQuery = new TermQuery( luceneTerm );
BooleanQuery filteredQuery = new BooleanQuery();
filteredQuery.add( luceneQuery, BooleanClause.Occur.MUST );
filteredQuery.add( classFilter, BooleanClause.Occur.MUST );
IndexSearcher searcher = null;
try {
searcher = new IndexSearcher( directory );
TopDocCollector collector = new TopDocCollector( 2 );
searcher.search( filteredQuery, collector );
ScoreDoc[] hits = collector.topDocs().scoreDocs;
int docId = hits[0].doc;
assert hits.length == 1 : "Wrong hit count";
Document doc = searcher.doc( docId );
assert doc.get( "color" ).equals( "dark blue" );
for (Object o : results) session.delete( o );
tx.commit();
}
finally {
if ( searcher != null )
searcher.close();
session.close();
}
}
private void buildIndex
( FullTextSession
session ) {
Transaction tx = session.beginTransaction();
MergedAnimal a = new MergedAnimal();
a.setId( 1 );
a.setName( "Elephant" );
session.save( a );
Furniture fur = new Furniture();
fur.setColor( "dark blue" );
session.save( fur );
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.com.manning.hsia.dvdstore.Furniture.indexName", "Animal" );
}
protected Class[] getMappings
() {
return new Class[]{
MergedAnimal.class,
Furniture.class
};
}
}