/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.solr.service;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrRequest.METHOD;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.hibernate.Hibernate;
import org.hoteia.qalingo.core.domain.ProductBrand;
import org.hoteia.qalingo.core.domain.Store;
import org.hoteia.qalingo.core.domain.Tag;
import org.hoteia.qalingo.core.service.GeolocService;
import org.hoteia.qalingo.core.solr.bean.SortField;
import org.hoteia.qalingo.core.solr.bean.SolrParam;
import org.hoteia.qalingo.core.solr.bean.StoreSolr;
import org.hoteia.qalingo.core.solr.response.StoreResponseBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service("storeSolrService")
@Transactional
public class StoreSolrService extends AbstractSolrService {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
protected SolrServer storeSolrServer;
@Autowired
protected GeolocService geolocService;
public void addOrUpdateStore(final Store store, final List<ProductBrand> productBrands) throws SolrServerException, IOException {
StoreSolr storeSolr = populateStoreSolr(store);
for (ProductBrand productBrand : productBrands) {
storeSolr.addProductBrandCodes(productBrand.getCode());
}
storeSolrServer.addBean(storeSolr);
storeSolrServer.commit();
}
public void addOrUpdateStore(final Store store) throws SolrServerException, IOException {
StoreSolr storeSolr = populateStoreSolr(store);
storeSolrServer.addBean(storeSolr);
storeSolrServer.commit();
}
protected StoreSolr populateStoreSolr(Store store){
if (store.getId() == null) {
throw new IllegalArgumentException("Id cannot be blank or null.");
}
if (logger.isDebugEnabled()) {
logger.debug("Indexing store " + store.getId() + " : " + store.getName() + " : " + store.getCity());
}
StoreSolr storeSolr = new StoreSolr();
storeSolr.setId(store.getId());
storeSolr.setCode(store.getCode());
storeSolr.setName(store.getName());
if(store.getCompany() != null){
storeSolr.setCompanyName(store.getCompany().getName());
}
if(store.getTags() != null){
for (Tag tag : store.getTags()) {
storeSolr.addTagCodes(tag.getCode());
}
}
storeSolr.setActive(store.isActive());
storeSolr.setB2b(store.isB2b());
storeSolr.setB2c(store.isB2c());
storeSolr.setActive(store.isActive());
storeSolr.setAddress(store.getAddress1());
storeSolr.setPostalCode(store.getPostalCode());
storeSolr.setCity(store.getCity());
storeSolr.setCountryCode(store.getCountryCode());
storeSolr.setAddressUniqueKey(geolocService.encodeAddressWithPhoneAsUniqueKey(store.getAddress1(), store.getPostalCode(), store.getCity(), store.getCountryCode(), store.getPhone()));
storeSolr.setType(store.getType());
return storeSolr;
}
public void removeStore(final StoreSolr storeSolr) throws SolrServerException, IOException {
if (storeSolr.getId() == null) {
throw new IllegalArgumentException("Id cannot be blank or null.");
}
if (logger.isDebugEnabled()) {
logger.debug("Remove Index Store " + storeSolr.getId() + " : " + storeSolr.getName() + " : " + storeSolr.getCity());
}
storeSolrServer.deleteById(storeSolr.getId().toString());
storeSolrServer.commit();
}
public StoreResponseBean searchStore(final String searchQuery, final List<String> facetFields, final List<String> cities,
final List<String> countries, final SolrParam solrParam) throws SolrServerException, IOException {
SolrQuery solrQuery = new SolrQuery();
if(solrParam != null){
if(solrParam.get("rows") != null){
solrQuery.setParam("rows", (String)solrParam.get("rows"));
} else {
solrQuery.setParam("rows", getMaxResult());
}
if(solrParam.get("sortField") != null){
SortField sortField = (SortField) solrParam.get("sortField");
for (Iterator<String> iterator = sortField.keySet().iterator(); iterator.hasNext();) {
String field = (String) iterator.next();
solrQuery.addSortField(field, sortField.get(field));
}
}
}
if (StringUtils.isEmpty(searchQuery)) {
throw new IllegalArgumentException("SearchQuery field can not be Empty or Blank!");
}
solrQuery.setQuery(searchQuery);
if (facetFields != null && facetFields.size() > 0) {
solrQuery.setFacet(true);
solrQuery.setFacetMinCount(1);
for (String facetField : facetFields) {
solrQuery.addFacetField(facetField);
}
}
if (cities != null && cities.size() > 0) {
StringBuilder fq = new StringBuilder("city:(");
for (int i = 0; i < cities.size(); i++) {
String city = cities.get(i);
fq.append('"' + city + '"');
if (i < cities.size() - 1) {
fq.append(" OR ");
}
}
fq.append(")");
solrQuery.addFilterQuery(fq.toString());
}
if (countries != null && countries.size() > 0) {
StringBuilder fq = new StringBuilder("countryCode:(");
for (int i = 0; i < countries.size(); i++) {
String country = countries.get(i);
fq.append('"' + country + '"');
if (i < countries.size() - 1) {
fq.append(" OR ");
}
}
fq.append(")");
solrQuery.addFilterQuery(fq.toString());
}
logger.debug("QueryRequest solrQuery: " + solrQuery);
SolrRequest request = new QueryRequest(solrQuery, METHOD.POST);
QueryResponse response = new QueryResponse(storeSolrServer.request(request), storeSolrServer);
logger.debug("QueryResponse Obj: " + response.toString());
List<StoreSolr> solrList = response.getBeans(StoreSolr.class);
StoreResponseBean storeResponseBean = new StoreResponseBean();
storeResponseBean.setStoreSolrList(solrList);
if (facetFields != null && facetFields.size() > 0) {
List<FacetField> solrFacetFieldList = response.getFacetFields();
storeResponseBean.setStoreSolrFacetFieldList(solrFacetFieldList);
}
return storeResponseBean;
}
@Deprecated
public StoreResponseBean searchStore(String searchBy, String searchText, List<String> facetFields) throws SolrServerException, IOException {
return searchStore(searchBy, searchText, facetFields, null, null);
}
@Deprecated
public StoreResponseBean searchStore(String searchBy, String searchText, List<String> facetFields,
List<String> cities, List<String> countries) throws SolrServerException, IOException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setParam("rows", getMaxResult());
if (StringUtils.isEmpty(searchBy)) {
throw new IllegalArgumentException("SearchBy field can not be Empty or Blank!");
}
if (StringUtils.isEmpty(searchText)) {
solrQuery.setQuery(searchBy + ":*");
} else {
solrQuery.setQuery(searchBy + ":" + searchText + "*");
}
if (facetFields != null && facetFields.size() > 0) {
solrQuery.setFacet(true);
solrQuery.setFacetMinCount(1);
for( String facetField : facetFields){
solrQuery.addFacetField(facetField);
}
}
if(cities != null && cities.size() > 0){
StringBuilder fq = new StringBuilder("city:(");
for (int i = 0; i < cities.size(); i++) {
String city = cities.get(i);
fq.append('"'+city+'"');
if(i < cities.size() - 1){
fq.append(" OR ");
}
}
fq.append(")");
solrQuery.addFilterQuery(fq.toString());
}
if(countries != null && countries.size() > 0){
StringBuilder fq = new StringBuilder("countryCode:(");
for (int i = 0; i < countries.size(); i++) {
String country = countries.get(i);
fq.append('"'+country+'"');
if(i < countries.size() - 1){
fq.append(" OR ");
}
}
fq.append(")");
solrQuery.addFilterQuery(fq.toString());
}
logger.debug("QueryRequest solrQuery: " + solrQuery);
SolrRequest request = new QueryRequest(solrQuery, METHOD.POST);
QueryResponse response = new QueryResponse(storeSolrServer.request(request), storeSolrServer);
logger.debug("QueryResponse Obj: " + response.toString());
List<StoreSolr> solrList = response.getBeans(StoreSolr.class);
StoreResponseBean storeResponseBean = new StoreResponseBean();
storeResponseBean.setStoreSolrList(solrList);
if (facetFields != null && facetFields.size() > 0) {
List<FacetField> solrFacetFieldList = response.getFacetFields();
storeResponseBean.setStoreSolrFacetFieldList(solrFacetFieldList);
}
return storeResponseBean;
}
@Deprecated
public StoreResponseBean searchStore() throws SolrServerException, IOException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setParam("rows", getMaxResult());
solrQuery.setQuery("*");
solrQuery.setFacet(true);
solrQuery.setFacetMinCount(1);
solrQuery.addFacetField("name");
logger.debug("QueryRequest solrQuery: " + solrQuery);
SolrRequest request = new QueryRequest(solrQuery, METHOD.POST);
QueryResponse response = new QueryResponse(storeSolrServer.request(request), storeSolrServer);
logger.debug("QueryResponse Obj: " + response.toString());
List<StoreSolr> solrList = response.getBeans(StoreSolr.class);
List<FacetField> solrFacetFieldList = response.getFacetFields();
StoreResponseBean storeResponseBean = new StoreResponseBean();
storeResponseBean.setStoreSolrList(solrList);
storeResponseBean.setStoreSolrFacetFieldList(solrFacetFieldList);
return storeResponseBean;
}
}