Subversion Repositories SmartDukaan

Rev

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 searches
                searchObject.setTotalSearches(searchObject.getTotalSearches()+1);
        
                //setting number of search results
                List<Long> numSearchResults =searchObject.getSearchResults();
                numSearchResults.add((Long)result.getProperty("totalResults"));
                searchObject.setSearchResults(numSearchResults);
                
                //Setting frequency by category
                String 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 query
                if(!searchObject.getSessionIds().contains(result.getProperty("sessionId"))){
                        searchObject.getSessionIds().add(result.getProperty("sessionId"));
                }
                
                productSearchFreq.put(searchString, searchObject);
        }else{
                SearchMetadata searchObject = new SearchMetadata();
                
                //Setting frequency by category
                String 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 searches
                searchObject.setTotalSearches(Long.parseLong("1"));
                
                //setting number of search results
                List<Long> numSearchResults = new ArrayList<Long>();
                numSearchResults.add((Long)result.getProperty("totalResults"));
                searchObject.setSearchResults(numSearchResults);
                
                //Storing session Id of query
                List<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 ProductSearch
                        searchClickMap = 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>