Subversion Repositories SmartDukaan

Rev

Rev 6942 | Rev 6998 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
339 rajveer 1
package in.shop2020.serving.controllers;
1044 chandransh 2
 
2263 vikas 3
import in.shop2020.datalogger.EventType;
6866 amit.gupta 4
import in.shop2020.model.v1.catalog.Category;
3561 rajveer 5
import in.shop2020.serving.cache.EhcacheWrapper.CacheKeys;
6
import in.shop2020.serving.cache.SnippetCacheWrapper;
339 rajveer 7
import in.shop2020.serving.services.SolrSearchService;
637 rajveer 8
import in.shop2020.serving.utils.Utils;
6866 amit.gupta 9
import in.shop2020.utils.CategoryManager;
2511 vikas 10
import in.shop2020.utils.DataLogger;
339 rajveer 11
 
12
import java.io.UnsupportedEncodingException;
13
import java.net.URLEncoder;
14
import java.util.ArrayList;
15
import java.util.Arrays;
354 rajveer 16
import java.util.HashMap;
339 rajveer 17
import java.util.LinkedHashMap;
18
import java.util.List;
19
import java.util.Map;
2948 chandransh 20
import java.util.Map.Entry;
339 rajveer 21
 
22
import org.apache.commons.lang.StringUtils;
832 rajveer 23
import org.apache.log4j.Logger;
820 rajveer 24
import org.apache.struts2.convention.annotation.Result;
339 rajveer 25
 
6931 amit.gupta 26
import com.google.gson.Gson;
1044 chandransh 27
 
6931 amit.gupta 28
 
339 rajveer 29
/**
545 rajveer 30
 * @author rajveer
339 rajveer 31
 *
32
 */
820 rajveer 33
@Result(name="redirect", location="${location}", type="redirect")
517 rajveer 34
public class SearchController extends BaseController {
339 rajveer 35
 
1044 chandransh 36
	private static final long serialVersionUID = -8392433517042806559L;
1999 vikas 37
	private static Logger log = Logger.getLogger(Class.class);
1044 chandransh 38
 
790 vikas 39
	private List<String> results;
6931 amit.gupta 40
	private Map<String, Double> dynamicSearchMap;
517 rajveer 41
 
339 rajveer 42
	/**
43
	 * 
44
	 */
517 rajveer 45
	private Map<String, String> snippets;
339 rajveer 46
 
47
	/**
48
	 * 
49
	 */
545 rajveer 50
	private Map<String, List<String[]>> facets = null;
339 rajveer 51
 
52
	/**
53
	 * 
54
	 */
6866 amit.gupta 55
	private Map<String, List<List<String>>> crumbs;
339 rajveer 56
 
517 rajveer 57
	private String  query;
569 rajveer 58
	private String sortOrder = null;
545 rajveer 59
	private Double minPrice = null;
60
	private Double maxPrice = null;
354 rajveer 61
 
6942 amit.gupta 62
	private long windowSize = 20;
545 rajveer 63
	private long page = 1;
64
	private long totalResults;
65
	private long beginIndex = 0;
66
	private String url;
1921 vikas 67
	private String priceUrl = "?";
569 rajveer 68
	private String sortUrl;
820 rajveer 69
	private String location;
6866 amit.gupta 70
	private static HashMap<String, List<String>> categoriesChildren = null;
4137 varun.gupt 71
 
339 rajveer 72
	/**
73
	 * 
74
	 * @return
75
	 * @throws UnsupportedEncodingException
76
	 */
77
    // GET /query
820 rajveer 78
 
6866 amit.gupta 79
    public String index() throws Exception {
517 rajveer 80
 
650 rajveer 81
    	log.info("this.request=" + this.request);
637 rajveer 82
 
545 rajveer 83
    	//url = this.request.getRequestURL();
84
		query = this.request.getParameter("q");
85
		url = "q="+ URLEncoder.encode(query, "UTF-8");
569 rajveer 86
 
87
 
820 rajveer 88
		if(query.trim().isEmpty()){
6866 amit.gupta 89
				location = "/";
820 rajveer 90
				return "redirect";
91
		}
569 rajveer 92
		sortUrl = url;
93
		if(this.request.getParameter("sort") != null){
94
    		url= url + "&sort=" + this.request.getParameter("sort");
95
    		sortOrder = this.request.getParameter("sort");
96
    	}
1921 vikas 97
		priceUrl += url;
545 rajveer 98
    	if(this.request.getParameter("page") != null){
99
    		this.page = Long.parseLong(this.request.getParameter("page"));
100
    		this.beginIndex = this.windowSize * (this.page-1);
536 rajveer 101
    	}
3173 rajveer 102
    	if(this.request.getParameter("minPrice") != null){
103
    		this.minPrice = (new Double(this.request.getParameter("minPrice")));
104
    		url= url + "&minPrice=" + this.request.getParameter("minPrice");
545 rajveer 105
    	}
3173 rajveer 106
    	if(this.request.getParameter("maxPrice") != null){
107
    		this.maxPrice = (new Double(this.request.getParameter("maxPrice")));
108
    		url= url + "&maxPrice=" + this.request.getParameter("maxPrice");
545 rajveer 109
    	}    	
339 rajveer 110
 
569 rajveer 111
 
339 rajveer 112
    	String[] fqrys = this.request.getParameterValues("fq");
545 rajveer 113
 
6866 amit.gupta 114
    	this.crumbs = new HashMap<String, List<List<String>>>();
339 rajveer 115
 
4137 varun.gupt 116
    	String[] facetDefIDs = Utils.facetDefIDs;
117
    	String[] facetLabels = Utils.facetLabels;
569 rajveer 118
 
119
    	String urlCrumb = "";
120
    	if(query != null) {
121
	    	urlCrumb = url; 
122
	    }else {
123
 
124
    	}
125
 
339 rajveer 126
    	if(fqrys != null) {
127
	    	log.info("fqrys=" + Arrays.toString(fqrys));
569 rajveer 128
	    	List<String> arrList = Arrays.asList(facetDefIDs);
6866 amit.gupta 129
	    	String filterUrl = "";
569 rajveer 130
	    	for(int i=0; i<fqrys.length; i++){
131
	    		urlCrumb += "&fq=" + URLEncoder.encode(fqrys[i], "UTF-8");
132
	    		priceUrl += "&fq=" + URLEncoder.encode(fqrys[i], "UTF-8");
133
	    		sortUrl += "&fq=" + URLEncoder.encode(fqrys[i], "UTF-8");
545 rajveer 134
	    		String facetName = StringUtils.split(fqrys[i], ":")[0];
339 rajveer 135
	    		String facetValue = StringUtils.split(fqrys[i], ":")[1];
6866 amit.gupta 136
	    		String facetLabel = facetLabels[arrList.indexOf(facetName)];
137
	    		filterUrl = "&fq=" + URLEncoder.encode(fqrys[i], "UTF-8"); 
138
	    		List<String> acrumb = Arrays.asList(facetValue, filterUrl);
139
	    		if(!crumbs.containsKey(facetLabel)) {
140
	    			crumbs.put(facetLabel, new ArrayList<List<String>>());
141
	    		}
142
 
143
	    		this.crumbs.get(facetLabel).add(acrumb);
569 rajveer 144
	    	}
145
    	}
146
    	url = urlCrumb;
517 rajveer 147
 
148
 
339 rajveer 149
 
6866 amit.gupta 150
    	SolrSearchService search = new SolrSearchService(query, fqrys, facetDefIDs, (page-1)*windowSize, windowSize, minPrice, maxPrice, Utils.ROOT_CATEGORY, sortOrder, sourceId);
790 vikas 151
 
354 rajveer 152
    	this.results =  search.getResultMap(); 
6931 amit.gupta 153
    	this.dynamicSearchMap = search.getDynamicPriceMap();
545 rajveer 154
    	// Facets
6866 amit.gupta 155
    	List<String> fqs = null;
156
    	if (fqrys != null) {
157
    		fqs = Arrays.asList(fqrys);
158
    	}else {
159
    		fqs = new ArrayList<String>();
160
    	}
339 rajveer 161
 
6866 amit.gupta 162
		setFacet(fqs, search);
339 rajveer 163
 
6931 amit.gupta 164
		//If 
6866 amit.gupta 165
    	Map<String, Double> priceMap = search.getPriceStatsMap();
166
    	if(priceMap != null){
6931 amit.gupta 167
    		if (this.minPrice == null){
168
    			this.minPrice = priceMap.get("min");
169
    		}
170
    		if(this.maxPrice == null) {
171
    			this.maxPrice = priceMap.get("max");
172
    		}
173
    	} else{
6866 amit.gupta 174
    		this.minPrice = 0.0;
175
    		this.maxPrice = 0.0;
176
    	}
177
 
178
    	this.totalResults = search.getTotalResults();
179
        DataLogger.logData(EventType.PRODUCT_SEARCH, getSessionId(), userinfo.getUserId(), userinfo.getEmail(),
180
                query, Long.toString(Utils.ROOT_CATEGORY), Long.toString(totalResults));
181
    	return "index";
182
    }
183
 
184
 
185
    private void setFacet(List<String> fqs, SolrSearchService search) throws Exception{
5525 phani.kuma 186
    	String[] toshowfacetDefIDs;
187
    	String[] toshowfacetLabels;
188
 
6866 amit.gupta 189
		if (fqs.contains("F_50010:Mobile Phones") || fqs.contains("F_50010:Cameras") || fqs.contains("F_50010:Tablets")){
190
    		toshowfacetDefIDs = Utils.facetDefIDs;
191
    		toshowfacetLabels = Utils.facetLabels;
5525 phani.kuma 192
    	}
193
    	else {
6866 amit.gupta 194
    		toshowfacetDefIDs = Utils.rootfacetDefIDs;
195
    		toshowfacetLabels = Utils.rootfacetLabels;
5525 phani.kuma 196
    	}
6866 amit.gupta 197
 
198
    	this.facets = new LinkedHashMap<String, List<String[]>>();
5525 phani.kuma 199
    	for (int i=0; i<toshowfacetDefIDs.length; i++) {
200
    		String facetDefID = toshowfacetDefIDs[i];
201
    		String facetLabel = toshowfacetLabels[i];
6866 amit.gupta 202
 
5729 amit.gupta 203
    		Map<String, Integer> facetDetailMap = search.getFacetDetails(facetDefID);
354 rajveer 204
    		if(facetDetailMap==null)
205
    			continue;
206
    		List<String[]> values = new ArrayList<String[]>();
2948 chandransh 207
    		for(Entry<String, Integer> facetEntry : facetDetailMap.entrySet()){
6866 amit.gupta 208
    			String selected = "";
209
    			if(fqs.contains(facetDefID + ":" + facetEntry.getKey())) {
210
    				selected = "checked=\"checked\"";
211
    			}
2948 chandransh 212
    		    String facet = facetEntry.getKey();
6866 amit.gupta 213
      			String drilldownURL = "&fq=" +  
214
    				URLEncoder.encode( facetDefID + ":" + facet, "UTF-8"); 
354 rajveer 215
      			String[] afacet = new String[] { facet, 
6866 amit.gupta 216
      			      facetEntry.getValue().toString(), drilldownURL,  selected};
354 rajveer 217
      			values.add(afacet);    
218
    		}
219
 
220
    		this.facets.put(facetLabel, values);
221
    	}
6866 amit.gupta 222
	}
517 rajveer 223
 
224
 
6866 amit.gupta 225
	public Map<String, String> getSnippets() throws Exception {
3273 vikas 226
        if(results != null){
227
            snippets = new HashMap<String, String>();   
228
            for(String docId: results){
6949 amit.gupta 229
                String snippet = (String)SnippetCacheWrapper.getSnippet(CacheKeys.CATEGORY_SNIPPET_CACHE_KEY, docId, sourceId);
3273 vikas 230
                if (snippet != null) {
231
                    snippets.put(docId, snippet);
232
                }
233
            }
234
        }
235
        return snippets;
517 rajveer 236
    }
237
 
238
    /**
239
     * 
240
     * @return
241
     */
242
    public String getQuery() {
243
    	return this.query;
244
    }
339 rajveer 245
 
517 rajveer 246
 
339 rajveer 247
    /**
248
     * 
249
     * @return
250
     */
790 vikas 251
    public List<String> getResults() {
339 rajveer 252
    	return this.results;
253
    }
254
 
255
    /**
256
     * 
257
     * @return
258
     */
259
    public Map<String, List<String[]>> getFacets() {
260
    	return this.facets;
261
    }
262
 
545 rajveer 263
    public long getTotalResults(){
264
    	return totalResults;
265
    }
266
 
267
    public String getUrl(){
268
    	return this.url;
269
    }
270
 
271
    public String getPriceUrl(){
272
    	return this.priceUrl;
273
    }
274
 
569 rajveer 275
    public String getSortUrl(){
276
    	return this.sortUrl;
277
    }
278
 
545 rajveer 279
	public long getBeginIndex(){
280
		if(totalResults>0)
281
			return beginIndex+1;
282
		return beginIndex;
283
	}
284
 
285
	public long getTotalPages() {
1376 rajveer 286
		return 1 + (totalResults-1)/windowSize;
545 rajveer 287
	}
288
 
289
	public long getCurrentPage() {
290
		return this.page;
291
	}
292
 
354 rajveer 293
    public Double getMinPrice() {
294
    	return this.minPrice;
295
    }
296
 
297
    public Double getMaxPrice() {
298
    	return this.maxPrice;
299
    }
300
 
6866 amit.gupta 301
    public Map<String, List<List<String>>> getCrumbs() {
339 rajveer 302
    	return this.crumbs;
303
    }
569 rajveer 304
 
786 rajveer 305
    public String getSortOrder(){
306
    	return this.sortOrder;
307
    }
820 rajveer 308
 
309
    public String getLocation(){
310
    	return this.location;
311
    }
6866 amit.gupta 312
 
313
    public List<String> getChildren(String categoryLabel) {
314
    	return getCategoriesChildren().get(categoryLabel);
315
    }
316
 
317
    public static Map<String, List<String>> getCategoriesChildren(){
318
    	Map<Long,String> idLabelMap = new HashMap<Long, String>(); 
319
    	if (categoriesChildren == null) {
320
    		categoriesChildren = new HashMap<String, List<String>>();
321
    		for (Category category: CategoryManager.getCategoryManager().getCategories().values()){
322
    			idLabelMap.put(category.getId(), category.getLabel());
323
    		}
324
    		for (Category category: CategoryManager.getCategoryManager().getCategories().values()){
325
    			if(category.getParent_category_id() != 10000 && category.getParent_category_id() != 0 &&
326
    					category.getParent_category_id() != Utils.MOBILE_PHONES_CATEGORY){
327
    				String parentLabel = idLabelMap.get(category.getParent_category_id());
328
    				if(!categoriesChildren.containsKey(parentLabel)){
329
    					categoriesChildren.put(parentLabel, new ArrayList<String>());
330
    				}
331
    				categoriesChildren.get(parentLabel).add(category.getLabel());
332
    			}
333
    		}
334
    	}
335
 
336
    	return categoriesChildren;
337
    }
6931 amit.gupta 338
 
339
	public String getDynamicSearchMap(){
340
    	if (this.dynamicSearchMap == null) {
341
    		return "{}";
342
    	} else {
343
    		return new Gson().toJson(this.dynamicSearchMap);
344
    	}
345
    }
339 rajveer 346
}