//$Id: FullTextSearchAction.java 13977 2011-01-07 17:14:55Z sannegrinovero $
package com.jboss.dvd.seam;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.FullTextEntityManager;
/**
* Hibernate Search version of the store querying mechanism.
* (Old version: see FullTextSearchAction implementation in the
* jboss6 additional source folder to see usage of new Search API)
*
* @author Emmanuel Bernard
*/
@Deprecated
@Stateful
@Name("search")
public class FullTextSearchAction
implements FullTextSearch,
Serializable
{
static final long serialVersionUID = -6536629890251170098L;
@In(create=true)
ShoppingCart cart;
@PersistenceContext
EntityManager em;
//@RequestParameter
Long id;
int pageSize = 15;
int currentPage = 0;
boolean hasMore = false;
int numberOfResults;
String searchQuery;
@DataModel
List<Product> searchResults;
//@DataModelSelection
Product selectedProduct;
@Out(required = false)
Product dvd;
@Out(scope=ScopeType.CONVERSATION, required=false)
Map<Product, Boolean> searchSelections;
public String getSearchQuery() {
return searchQuery;
}
public void setSearchQuery(String searchQuery) {
this.searchQuery = searchQuery;
}
public int getNumberOfResults() {
return numberOfResults;
}
@Begin(join = true)
public String doSearch() {
currentPage = 0;
updateResults();
return "browse";
}
public void nextPage() {
if (!isLastPage()) {
currentPage++;
updateResults();
}
}
public void prevPage() {
if (!isFirstPage()) {
currentPage--;
updateResults();
}
}
@Begin(join = true)
public void selectFromRequest() {
if (id != null) {
dvd = em.find(Product.class, id);
} else if (selectedProduct != null) {
dvd = selectedProduct;
}
}
public boolean isLastPage() {
return ( searchResults != null ) && !hasMore;
}
public boolean isFirstPage() {
return ( searchResults != null ) && ( currentPage == 0 );
}
@SuppressWarnings("unchecked")
private void updateResults() {
FullTextQuery query;
try {
query = searchQuery(searchQuery);
} catch (ParseException pe) {
return;
}
List<Product> items = query
.setMaxResults(pageSize + 1)
.setFirstResult(pageSize * currentPage)
.getResultList();
numberOfResults = query.getResultSize();
if (items.size() > pageSize) {
searchResults = new ArrayList(items.subList(0, pageSize));
hasMore = true;
} else {
searchResults = items;
hasMore = false;
}
searchSelections = new HashMap<Product, Boolean>();
}
private FullTextQuery searchQuery(String searchQuery) throws ParseException
{
Map<String,Float> boostPerField = new HashMap<String,Float>();
boostPerField.put("title", 4f);
boostPerField.put("description", 2f);
boostPerField.put("actors.name", 2f);
boostPerField.put("categories.name", 0.5f);
String[] productFields = {"title", "description", "actors.name", "categories.name"};
QueryParser parser = new MultiFieldQueryParser(productFields, new StandardAnalyzer(), boostPerField);
parser.setAllowLeadingWildcard(true);
org.apache.lucene.search.Query luceneQuery;
luceneQuery = parser.parse(searchQuery);
return ( (FullTextEntityManager) em ).createFullTextQuery(luceneQuery, Product.class);
}
/**
* Add the selected DVD to the cart
*/
public void addToCart()
{
cart.addProduct(dvd, 1);
}
/**
* Add many items to cart
*/
public void addAllToCart()
{
for (Product item : searchResults) {
Boolean selected = searchSelections.get(item);
if (selected != null && selected) {
searchSelections.put(item, false);
cart.addProduct(item, 1);
}
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public Long getSelectedId() {
return id;
}
public void setSelectedId(Long id) {
this.id = id;
}
@End
public void reset() { }
@Destroy
@Remove
public void destroy() { }
}