Rev 4949 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<%@ page import="java.util.ArrayList"%><%@ page import="in.shop2020.server.SearchMetadata"%><%@ page import="java.util.Arrays"%><%@ page import="java.util.Set"%><%@ page import="java.util.Hashtable"%><%@ page import="java.util.Calendar"%><%@ page import="java.util.Map.Entry"%><%@ page import="java.util.Map"%><%@ page import="java.text.ParseException"%><%@ page import="java.util.TimeZone"%><%@ page import="java.text.SimpleDateFormat"%><%@ page import="java.util.Date"%><%@ page import="java.util.List" %><%@ page import="java.net.URLDecoder" %><%@ page import="com.google.appengine.api.datastore.Query.SortDirection"%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page import="com.google.appengine.api.datastore.DatastoreServiceFactory" %><%@ page import="com.google.appengine.api.datastore.DatastoreService" %><%@ page import="com.google.appengine.api.datastore.Query" %><%@ page import="com.google.appengine.api.datastore.Entity" %><%@ page import="com.google.appengine.api.datastore.PreparedQuery" %><%@ page import="in.shop2020.model.Category"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><link rel="stylesheet" href="/DataTables/media/css/demo_table.css" type="text/css" /><link rel="stylesheet" href="/DataTables/extras/TableTools/media/css/TableTools.css" type="text/css" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Product Search</title></head><%!public Map<String,SearchMetadata> populateSearchDataMap(Map<String,SearchMetadata> productSearchFreq, Entity result){String searchString = (String)result.getProperty("query");if(productSearchFreq.containsKey(searchString)){SearchMetadata searchObject = productSearchFreq.get(searchString);//Setting number of searchessearchObject.setTotalSearches(searchObject.getTotalSearches()+1);//setting number of search resultsList<Long> numSearchResults =searchObject.getSearchResults();numSearchResults.add((Long)result.getProperty("totalResults"));searchObject.setSearchResults(numSearchResults);//Setting frequency by categoryString categoryId = Category.findByValue(Integer.parseInt(result.getProperty("categoryId").toString())).toString();if(searchObject.getcategoryFrequency().containsKey(categoryId)) {searchObject.getcategoryFrequency().put(categoryId, (searchObject.getcategoryFrequency().get(categoryId))+1);}else {searchObject.getcategoryFrequency().put(categoryId,Long.parseLong("1"));}//Storing session Id of queryif(!searchObject.getSessionIds().contains(result.getProperty("sessionId"))){searchObject.getSessionIds().add(result.getProperty("sessionId"));}productSearchFreq.put(searchString, searchObject);}else{SearchMetadata searchObject = new SearchMetadata();//Setting frequency by categoryString categoryId = Category.findByValue(Integer.parseInt(result.getProperty("categoryId").toString())).toString();Map<String, Long> categoryFrequency = new Hashtable<String, Long>();categoryFrequency.put(categoryId,Long.parseLong("1"));searchObject.setcategoryFrequency(categoryFrequency);//Setting number of searchessearchObject.setTotalSearches(Long.parseLong("1"));//setting number of search resultsList<Long> numSearchResults = new ArrayList<Long>();numSearchResults.add((Long)result.getProperty("totalResults"));searchObject.setSearchResults(numSearchResults);//Storing session Id of queryList<Object> sessionList = new ArrayList<Object>();sessionList.add(result.getProperty("sessionId"));searchObject.setSessionIds(sessionList);productSearchFreq.put(searchString,searchObject);}return productSearchFreq;}public Map<String,Double> populateSearchClickMap(Map<String,Double> searchClickMap, Entity result){try{String refererUrl = (String)result.getProperty("refererUrl");if(refererUrl!=null){if(refererUrl.contains("search?")){String clickQuery = "";refererUrl = URLDecoder.decode(refererUrl);clickQuery = refererUrl.split("q=")[1].split("&")[0];if(searchClickMap.containsKey(clickQuery)){searchClickMap.put(clickQuery, searchClickMap.get(clickQuery)+1);}else{searchClickMap.put(clickQuery, Double.parseDouble("1"));}}}}catch(Exception e){e.printStackTrace();}return searchClickMap;}%><% Date toDate = new Date();Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));cal.add(Calendar.DAY_OF_MONTH, -1);Date fromDate = cal.getTime();SimpleDateFormat iSdf = new SimpleDateFormat("yyyyMMdd");String toDateStr = request.getParameter("toDate");String fromDateStr = request.getParameter("fromDate");if (fromDateStr == null || fromDateStr.isEmpty()) {fromDateStr = iSdf.format(fromDate);}if (toDateStr == null || toDateStr.isEmpty()) {toDateStr = iSdf.format(toDate);}%><body><form id="searchfilter" name="searchfilter" method="post" action="/jsp/productSearchFrequency.jsp"><label>From Date(YYYYMMDD) : </label> <input type="text" name="fromDate" id="fromDate" value="<%= fromDateStr %>"/><label>To Date(YYYYMMDD) : </label> <input type="text" name="toDate" id="toDate" value="<%= toDateStr %>"/><input type="Submit" id="Submit" name="Submit" value="Submit" /></form><%try {if (fromDateStr != null) {fromDate = iSdf.parse(fromDateStr);}if (toDateStr != null) {toDate = iSdf.parse(toDateStr);}}catch (ParseException pe) {%><span>Invalid Date Format</span><%}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");sdf.setTimeZone(TimeZone.getTimeZone("IST"));DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();Query query = new Query("DataLog");query.addFilter("eventType", Query.FilterOperator.IN,Arrays.asList("PRODUCT_SEARCH","PRODUCT_VIEW"));query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);query.addFilter("date", Query.FilterOperator.LESS_THAN_OR_EQUAL, toDate);PreparedQuery pq = datastore.prepare(query);Map<String,SearchMetadata> productSearchFreq = new Hashtable<String,SearchMetadata>();Map<String,Double> searchClickMap = new Hashtable<String,Double>();for (Entity result : pq.asIterable()) {if(result.getProperty("eventType").equals("PRODUCT_SEARCH")){productSearchFreq = populateSearchDataMap(productSearchFreq, result);}else{//Calculating the frequency of ProductViews originating from ProductSearchsearchClickMap = populateSearchClickMap(searchClickMap,result);}}%><table cellpadding="0" cellspacing="0" border="0" class="display" id="productSearch"><thead><tr><th>Query String</th><th>Total Search Count</th><th>No Category</th><th>Mobile Phones</th><th>Tablets</th><th>Laptops</th><th>Accessories</th><th>Session Count</th><th>Average No. of Results</th><th>Search Result Clicked</th><th>Search Conversion (%) </th></tr></thead><tbody><% Set<String> querySet= productSearchFreq.keySet();for (String productQuery:querySet){Double searchConversionRate = (((searchClickMap.get(productQuery))==null ? 0 : searchClickMap.get(productQuery))*100/(productSearchFreq.get(productQuery).getTotalSearches()));searchConversionRate = ((double)((long)(searchConversionRate*100)))/100; //Truncating to 2 decimal places%><tr><td><a href="/jsp/productSearch.jsp?productQuery=<%=productQuery.toString()%>&toDate=<%=toDateStr%>&fromDate=<%=fromDateStr%>"><%=productQuery%></a></td><td><%=productSearchFreq.get(productQuery).getTotalSearches()%></td><%Set<String> searchCategories = productSearchFreq.get(productQuery).getcategoryFrequency().keySet();List<String> categories = new ArrayList<String>();categories.add("NA");categories.add("Mobile_Phones");categories.add("Tablets");categories.add("Laptops");categories.add("Mobile_Accessories");for(String category : categories){Long searchinCategory = productSearchFreq.get(productQuery).getcategoryFrequency().get(category);%><td><%=searchinCategory==null ? 0 : searchinCategory %></td><% }%><%long tempSum = 0;for(Long numOfSearchResults : productSearchFreq.get(productQuery).getSearchResults()){tempSum+=numOfSearchResults;}%><td><%=(productSearchFreq.get(productQuery).getSessionIds()==null ? 0 : productSearchFreq.get(productQuery).getSessionIds().size()) %></td><td><%=((double)((tempSum*100)/productSearchFreq.get(productQuery).getTotalSearches())/100.0) %></td><td><%=(searchClickMap.get(productQuery))==null ? 0 : searchClickMap.get(productQuery).intValue() %></td><td><%=searchConversionRate%></td></tr><%}%></tbody></table><script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.js"></script><script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.dataTables.min.js"></script><script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/ZeroClipboard.js"></script><script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/TableTools.js"></script><script type="text/javascript" charset="utf-8">$(document).ready(function() {$('#productSearch').dataTable({"sPaginationType": "full_numbers","aaSorting" : [ [ 2, 'desc' ] ],"bProcessing": true,"bStateSave": true,"sDom": 'T<"clear">lfrtip',"oTableTools": {"sSwfPath": "/DataTables/extras/TableTools/media/swf/copy_cvs_xls_pdf.swf"},"aoColumns": [{ "bSearchable": true },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" },{ "sSortDataType": "dom-text", "sType": "numeric" }]});} );</script></body></html>