package com.manning.hsia.dvdstore.action.jpa;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.hibernate.search.engine.DocumentBuilder;
import org.hibernate.search.jpa.FullTextEntityManager;
import com.manning.hsia.dvdstore.action.ItemAction;
import com.manning.hsia.dvdstore.model.Item;
import com.manning.hsia.dvdstore.model.Pizza;
import com.manning.hsia.dvdstore.util.EntityManagerHolder;
import com.manning.hsia.dvdstore.util.SessionHolder;
public class ItemActionImpl implements ItemAction {
public Item loadItem(Integer id) {
FullTextEntityManager entityManager = EntityManagerHolder.getFullTextEntityManager();
//straight lookup
Item itemFromGet = entityManager.find(Item.class, id);
//full text query
TermQuery termQuery = new TermQuery(new Term("id", id.toString() ) );
Item itemFromFullText = (Item) entityManager.createFullTextQuery(termQuery, Item.class)
.getSingleResult();
assert itemFromGet != null;
assert itemFromGet == itemFromFullText : "Hibernate Core and Search unicity contract";
return itemFromFullText;
}
public List<?> findByTitle(String words) {
FullTextEntityManager ftEntityManager = EntityManagerHolder.getFullTextEntityManager(); //get FullTextEntityManager
org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words, null);
javax.persistence.Query query = ftEntityManager.createFullTextQuery(luceneQuery); //create full-text query
return query.getResultList();
}
/**
* Example 6.6
*/
public List<Item> findItemByTitle(String words) {
FullTextEntityManager ftEntityManager = EntityManagerHolder.getFullTextEntityManager(); //get FullTextEntityManager
org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words, Item.class);
javax.persistence.Query query = ftEntityManager.createFullTextQuery(
luceneQuery,
Item.class); //list entities to restrict by
@SuppressWarnings("unchecked")
final List<Item> results = query.getResultList(); //execute it
return results;
}
/**
* Example 6.5
*/
private org.apache.lucene.search.Query buildLuceneQuery(String words, Class<?> searchedEntity) {
Analyzer analyzer;
if (searchedEntity == null) { //get the most appropriate analyzer
analyzer = new StandardAnalyzer();
}
else {
analyzer = SessionHolder.getFullTextSession().getSearchFactory().getAnalyzer(searchedEntity);
}
QueryParser parser = new QueryParser( "title", analyzer );
org.apache.lucene.search.Query luceneQuery = null;
try {
luceneQuery = parser.parse(words);
}
catch (org.apache.lucene.queryParser.ParseException e) {
throw new IllegalArgumentException("Unable to parse search entry into a Lucene query", e);
}
return luceneQuery;
}
/**
* Example 6.7
*/
public org.apache.lucene.search.Query buildLuceneQueryExcludePizza(String words) {
QueryParser parser = new QueryParser( "title", new StandardAnalyzer() );
org.apache.lucene.search.Query userQuery = null;
try {
userQuery = parser.parse(words);
}
catch (org.apache.lucene.queryParser.ParseException e) {
throw new IllegalArgumentException("Unable to parse search entry into a Lucene query", e);
}
org.apache.lucene.search.BooleanQuery luceneQuery = addExclusionClause(userQuery);
return luceneQuery;
}
/**
* Example 6.7
*/
private org.apache.lucene.search.BooleanQuery addExclusionClause(
org.apache.lucene.search.Query userQuery) {
org.apache.lucene.search.Query filterQuery = new TermQuery(
new Term( DocumentBuilder.CLASS_FIELDNAME, Pizza.class.getName() ) //crate filtering term
);
org.apache.lucene.search.BooleanQuery luceneQuery = new BooleanQuery();
luceneQuery.add(userQuery, Occur.MUST); //join the user query
luceneQuery.add(filterQuery, Occur.MUST_NOT); //and exclude the filtering term
return luceneQuery;
}
}