Subversion Repositories SmartDukaan

Rev

Rev 536 | Blame | Last modification | View Log | RSS feed

/**
 * 
 */
package in.shop2020.serving.controllers;

import in.shop2020.serving.pages.PageContentKeys;
import in.shop2020.serving.pages.PageEnum;
import in.shop2020.serving.pages.PageManager;
import in.shop2020.serving.services.PageLoaderHandler;
import in.shop2020.serving.services.SolrSearchService;
import in.shop2020.serving.utils.FileUtils;
import in.shop2020.util.Utils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.rest.DefaultHttpHeaders;
import org.apache.struts2.rest.HttpHeaders;

/**
 * @author rajveer
 *
 */
public class SearchController extends BaseController {

        /**
         * 
         */
        private static Log log = LogFactory.getLog(SearchController.class);
        
        private Map<String,String> htmlSnippets = new HashMap<String, String>();
        /**
         * 
         */
        private Map<String, String[]> results;

        /**
         * 
         */
        private Map<String, String> snippets;
        
        /**
         * 
         */
        private Map<String, List<String[]>> facets = null;
        
        /**
         * 
         */
        private List<String[]> crumbs;
        
        private String  query;
        
        private Double minPrice = null;
        private Double maxPrice = null;

        private long windowSize = 10;
        private long page = 1;
        private long totalResults;
        private long beginIndex = 0;
        private String url;
        private String priceUrl;
        /**
         * 
         * @return
         * @throws UnsupportedEncodingException
         */
    // GET /query
    public HttpHeaders index() throws UnsupportedEncodingException {
        
        // Something we need to figure out
        PageLoaderHandler pageLoader = new PageLoaderHandler();
                htmlSnippets.put("HEADER", pageLoader.getHeaderHtml(userinfo.getUserId(), userinfo.isSessionId(), userinfo.getNameOfUser()));
                htmlSnippets.put("MAIN_MENU", pageLoader.getMainMenuHtml());
                htmlSnippets.put("SEARCH_BAR", pageLoader.getSearchBarHtml(userinfo.getTotalItems(), 10000));
                htmlSnippets.put("CUSTOMER_SERVICE", pageLoader.getCustomerServiceHtml());
                htmlSnippets.put("MY_RESEARCH", pageLoader.getMyResearchHtml(userinfo.getUserId(), userinfo.isSessionId()));
                htmlSnippets.put("FOOTER",pageLoader.getFooterHtml());
                htmlSnippets.put("FOOTER",pageLoader.getFooterHtml());
                htmlSnippets.put("SEARCH_HEADER","");
                htmlSnippets.put("SEARCH_DETAILS","");
                

                log.info("this.request=" + this.request);
        
        //url = this.request.getRequestURL();
                query = this.request.getParameter("q");
                url = "q="+ URLEncoder.encode(query, "UTF-8");
                priceUrl = url;
        if(this.request.getParameter("page") != null){
                this.page = Long.parseLong(this.request.getParameter("page"));
                this.beginIndex = this.windowSize * (this.page-1);
        }
        if(this.request.getParameter("min-price") != null){
                this.minPrice = (new Double(this.request.getParameter("min-price")));
                url= url + "&min-price=" + this.request.getParameter("min-price");
        }
        if(this.request.getParameter("max-price") != null){
                this.maxPrice = (new Double(this.request.getParameter("max-price")));
                url= url + "&max-price=" + this.request.getParameter("max-price");
        }       
        
        String[] fqrys = this.request.getParameterValues("fq");
        
        this.crumbs = new ArrayList<String[]>();
        
        String strCrumb = "";
        String urlCrumb = "";
        if(query != null) {
                strCrumb = query;
                urlCrumb = url; 
                this.crumbs.add(new String[] { strCrumb, urlCrumb } );
                        log.info("acrumb=" + 
                                        Arrays.toString(new String[] { strCrumb, urlCrumb }));
        }else {
                
        }
        
        if(fqrys != null) {
                log.info("fqrys=" + Arrays.toString(fqrys));
        
                for(int i=0; i<fqrys.length; i++) {
                        String facetName = StringUtils.split(fqrys[i], ":")[0];
                        String facetValue = StringUtils.split(fqrys[i], ":")[1];
        //              facetqueries.put(StringUtils.split(fqrys[i], ":")[0], StringUtils.split(fqrys[i], ":")[1]);
                        //strCrumb += " " + facetValue;
                        strCrumb =  facetValue;
                        urlCrumb += "&fq=" + URLEncoder.encode(fqrys[i], "UTF-8");
                        priceUrl += "&fq=" + URLEncoder.encode(fqrys[i], "UTF-8");
                        String[] acrumb = new String[] { strCrumb, urlCrumb };
                        log.info("acrumb=" + Arrays.toString(acrumb));
                        this.crumbs.add(acrumb);
                }
        }
        url = urlCrumb;
        /**
                 * FIXME facet definition ids
                 */
        // Hard coded for now
//      long[] facetDefIDs = new long[] {50001, 50003, 50004, 50005, 50006, 
//                      50007, 50008, 50009};
        
        String[] facetDefIDs = new String[] {"Category","F_50002","F_50001",  "F_50006", "F_50007" };
        
        /* All facets. Removing 5 of them
        String[] facetDefIDs = new String[] {"Category","F_50002","F_50001", "F_50003", "F_50004", "F_50005", "F_50006", 
                        "F_50007", "F_50008", "F_50009"};
        */              

        
        /**
                 * FIXME facet labels
                 */
        // Hard-coded for now
        /*
        String[] facetLabels = new String[] {"Category","Price",
                "Brand", "Form Factor", "Carry In Pocket", "Cellular Technologies", 
                "Data Connectivity", "Camera Resolution", "Built-in Memory", 
                "Talk time"
                };
        */
        
        String[] facetLabels = new String[] {"Category","Price",
                "Brand", "Data Connectivity", "Camera Resolution"
                };
        
        SolrSearchService search = new SolrSearchService(query, fqrys, facetDefIDs, (page-1)*windowSize, windowSize, minPrice, maxPrice);
        this.results = new LinkedHashMap<String, String[]>();
        this.results =  search.getResultMap(); 
        
        // Facets
        
        String qryString = this.request.getQueryString();
        log.info("qryString=" + qryString);
        
                this.facets = new LinkedHashMap<String, List<String[]>>();
        for (int i=0; i<facetDefIDs.length; i++) {
                String facetDefID = facetDefIDs[i];
                String facetLabel = facetLabels[i];
                HashMap<String, Integer> facetDetailMap = search.getFacetDetails(facetDefID);
                if(facetDetailMap==null)
                        continue;
                List<String[]> values = new ArrayList<String[]>();
                for(String facet: facetDetailMap.keySet()){
                        String drilldownURL = url;  
                        drilldownURL += "&fq=" + facetDefID + ":" + 
                                URLEncoder.encode(facet, "UTF-8"); 
                        String[] afacet = new String[] { facet, 
                                        facetDetailMap.get(facet).toString(), drilldownURL  };
                        values.add(afacet);    
                  
                }
                
                this.facets.put(facetLabel, values);
        }
        
        Map<String, Double> priceMap = search.getPriceStatsMap();
        if(priceMap != null){
                this.minPrice = priceMap.get("min");
                this.maxPrice = priceMap.get("max");
        }else{
                this.minPrice = 0.0;
                this.maxPrice = 0.0;
        }
        
        this.totalResults = search.getTotalResults();
        return new DefaultHttpHeaders("index")
            .disableCaching();
    }


    public Map<String, String> getSnippets() throws Exception {
        if(results != null){
                snippets = new HashMap<String, String>();       
                for(String docId: results.keySet()){
                                snippets.put(docId, FileUtils.read( Utils.EXPORT_ENTITIES_PATH + docId + File.separator +"SearchSnippet.html"));
                        }
        }
                return snippets;
    }
        
    /**
     * 
     * @return
     */
    public String getQuery() {
        return this.query;
    }
    
    
    /**
     * 
     * @return
     */
    public Map<String, String[]> getResults() {
        return this.results;
    }
    
    /**
     * 
     * @return
     */
    public Map<String, List<String[]>> getFacets() {
        return this.facets;
    }
    
    public long getTotalResults(){
        return totalResults;
    }
    
    public String getUrl(){
        return this.url;
    }

    public String getPriceUrl(){
        return this.priceUrl;
    }
    
        public long getBeginIndex(){
                if(totalResults>0)
                        return beginIndex+1;
                return beginIndex;
        }

        public long getTotalPages() {
                return 1 + totalResults/windowSize;
        }

        public long getCurrentPage() {
                return this.page;
        }

    public Double getMinPrice() {
        return this.minPrice;
    }
    
    public Double getMaxPrice() {
        return this.maxPrice;
    }
    
    /**
     * 
     * @return
     */
    public List<String[]> getCrumbs() {
        return this.crumbs;
    }
    
    /**
     * 
     */
    
    public String getHeaderSnippet(){
                return htmlSnippets.get("HEADER");
        }
        
        public String getMainMenuSnippet(){
                return htmlSnippets.get("MAIN_MENU");
        }
        
        public String getSearchBarSnippet(){
                return htmlSnippets.get("SEARCH_BAR");
        }
                        
        public String getCustomerServiceSnippet(){
                return htmlSnippets.get("CUSTOMER_SERVICE");
        }
        
        public String getSearchHeaderSnippet(){
                return htmlSnippets.get("SEARCH_HEADER");
        }
        
        public String getSearchDetailsSnippet(){
                return htmlSnippets.get("SEARCH_DETAILS");
        }
        
        public String getMyResearchSnippet(){
                return htmlSnippets.get("MY_RESEARCH");
        }
                                
        public String getFooterSnippet(){
                return htmlSnippets.get("FOOTER");
        }
        
        public String getJsFileSnippet(){
                return htmlSnippets.get("JS_FILES");
        }
        
        public String getCssFileSnippet(){
                return htmlSnippets.get("CSS_FILES");
        }
}