package com.manning.hsia.dvdstore.action;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.queryParser.QueryParser;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import com.manning.hsia.dvdstore.model.Item;
import com.manning.hsia.dvdstore.util.SessionHolder;
public class SearchingActionImpl implements SearchingAction {
private static final int WINDOW = 20;
/**
* Exaplme 9.5, 9.6
*/
public List<Item> getMatchingItems(String words, int page) {
FullTextSession ftSession = SessionHolder.getFullTextSession();
org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words);
org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery, Item.class); //restrict query
@SuppressWarnings("unchecked")
List<Item> results = query
.setFirstResult( (page - 1) * WINDOW ) //first result
.setMaxResults( WINDOW ) //number of results
.list();
return results;
}
/**
* Example 9.7
*/
public List<Item> getMatchingItemsWithDistributor(String words, int page) {
FullTextSession ftSession = SessionHolder.getFullTextSession();
org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words);
FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class);
Criteria criteria = ftSession.createCriteria(Item.class) //Define fetching strategy
.setFetchMode("distributor", FetchMode.JOIN);
@SuppressWarnings("unchecked")
List<Item> results = query
.setFirstResult( (page - 1) * WINDOW )
.setMaxResults( WINDOW )
.setCriteriaQuery(criteria)
.list();
return results;
}
/**
* Example 9.8
*/
public List<String> getTitleFromMatchingItems(String words) {
FullTextSession ftSession = SessionHolder.getFullTextSession();
org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words);
FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class);
@SuppressWarnings("unchecked")
List<Object[]> results = query
.setProjection("title") //list projected properties
.list();
List<String> titles = new ArrayList<String>( results.size() );
for(Object[] objects : results) { //retrieve arrays of objects
titles.add( (String) objects[0] );
}
return titles;
}
private org.apache.lucene.search.Query buildLuceneQuery(String words) {
Analyzer analyzer = SessionHolder.getFullTextSession().getSearchFactory().getAnalyzer(Item.class);
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;
}
}