package com.manning.hsia.dvdstore;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.TermQuery;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.SearchFactory;
import com.manning.hsia.test.SearchTestCase;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
public class TestAnalyzerWrapper extends SearchTestCase {
@Test(groups="ch07")
public void testScopedAnalyzer() throws Exception {
FullTextSession session = Search.getFullTextSession( openSession() );
Transaction tx = session.beginTransaction();
buildIndex( session, tx );
try {
tx = session.beginTransaction();
SearchFactory searchFactory = session.getSearchFactory();
FullTextQuery hibQuery =
buildQuery( searchFactory, "field2", session );
List<ScopedEntity> results = hibQuery.list();
assert results.size() == 0 : "incorrect result count";
assert hibQuery.toString().equals( "FullTextQueryImpl(+field2:TEST)" ) : "incorrect query";
hibQuery = buildQuery( searchFactory, "field1", session );
results = hibQuery.list();
assert results.size() == 2 : "incorrect result count";
assert hibQuery.toString().equals( "FullTextQueryImpl(+field1:test)" ) : "incorrect query";
for (Object element :
session.createQuery( "from "
+ ScopedEntity.class.getName() ).list())
session.delete( element );
tx.commit();
}
finally {
session.close();
}
}
private FullTextQuery buildQuery( SearchFactory factory, String field, FullTextSession session )
throws IOException {
Reader reader = new StringReader( "TEST" );
TokenStream stream =
factory.getAnalyzer( ScopedEntity.class )
.tokenStream( field, reader );
BooleanQuery bq = new BooleanQuery();
Token token = new Token();
token = stream.next( token ); //this method reuse Token and is faster than next()
while (token != null) {
if ( token.termLength() != 0 ) {
//create the string out of the token.
// String(char[]) copy the char so we are safe to reuse Token
String term =
new String( token.termBuffer(),
0,
token.termLength() );
//add it to the query somehow
bq.add( new TermQuery( new Term( field, term ) ),
BooleanClause.Occur.MUST );
}
token = stream.next( token );
}
return session.createFullTextQuery( bq, ScopedEntity.class );
}
private void buildIndex( FullTextSession session, Transaction tx ) {
tx = session.beginTransaction();
ScopedEntity entity = new ScopedEntity();
entity.setField1( "test field1" );
entity.setField2( "test field2" );
session.save( entity );
entity = new ScopedEntity();
entity.setField1( "test field3" );
entity.setField2( "test field4" );
session.save( entity );
tx.commit();
}
protected Class[] getMappings() {
return new Class[]{ScopedEntity.class};
}
}