Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4744 amar.kumar 1
<%@ page import="java.util.ArrayList"%>
2
<%@ page import="in.shop2020.server.SearchMetadata"%>
3
<%@ page import="java.util.Arrays"%>
4
<%@ page import="java.util.Set"%>
5
<%@ page import="java.util.Hashtable"%>
4638 amar.kumar 6
<%@ page import="java.util.Calendar"%>
7
<%@ page import="java.util.Map.Entry"%>
8
<%@ page import="java.util.Map"%>
9
<%@ page import="java.text.ParseException"%>
10
<%@ page import="java.util.TimeZone"%>
11
<%@ page import="java.text.SimpleDateFormat"%>
12
<%@ page import="java.util.Date"%>
13
<%@ page import="java.util.List" %>
4744 amar.kumar 14
<%@ page import="java.net.URLDecoder" %>
4638 amar.kumar 15
<%@ page import="com.google.appengine.api.datastore.Query.SortDirection"%>
16
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
17
<%@ page import="com.google.appengine.api.datastore.DatastoreServiceFactory" %>
18
<%@ page import="com.google.appengine.api.datastore.DatastoreService" %>
19
<%@ page import="com.google.appengine.api.datastore.Query" %>
20
<%@ page import="com.google.appengine.api.datastore.Entity" %>
21
<%@ page import="com.google.appengine.api.datastore.PreparedQuery" %>
4744 amar.kumar 22
<%@	page import="in.shop2020.model.Category"%>
23
 
4638 amar.kumar 24
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
25
<html>
26
<head>
27
<link rel="stylesheet" href="/DataTables/media/css/demo_table.css" type="text/css" />
28
<link rel="stylesheet" href="/DataTables/extras/TableTools/media/css/TableTools.css" type="text/css" />
29
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
30
<title>Product Search</title>
31
</head>
32
 
4744 amar.kumar 33
 
34
 
35
<%! 
36
public Map<String,SearchMetadata> populateSearchDataMap(Map<String,SearchMetadata> productSearchFreq, Entity result){
37
	String searchString = (String)result.getProperty("query");
38
 
39
	if(productSearchFreq.containsKey(searchString)){
40
		SearchMetadata searchObject = productSearchFreq.get(searchString);
41
 
42
		//Setting number of searches
43
		searchObject.setTotalSearches(searchObject.getTotalSearches()+1);
44
 
45
		//setting number of search results
46
		List<Long> numSearchResults =searchObject.getSearchResults();
47
		numSearchResults.add((Long)result.getProperty("totalResults"));
48
		searchObject.setSearchResults(numSearchResults);
49
 
50
		//Setting frequency by category
51
		String categoryId = Category.findByValue(Integer.parseInt(result.getProperty("categoryId").toString())).toString();
52
		if(searchObject.getcategoryFrequency().containsKey(categoryId)) {
53
			searchObject.getcategoryFrequency().put(categoryId, (searchObject.getcategoryFrequency().get(categoryId))+1);
54
		}else {
55
			searchObject.getcategoryFrequency().put(categoryId,Long.parseLong("1"));
56
		}
57
 
58
		//Storing session Id of query
59
		if(!searchObject.getSessionIds().contains(result.getProperty("sessionId"))){
60
			searchObject.getSessionIds().add(result.getProperty("sessionId"));
61
		}
62
 
63
		productSearchFreq.put(searchString, searchObject);
64
	}else{
65
		SearchMetadata searchObject = new SearchMetadata();
66
 
67
		//Setting frequency by category
68
		String categoryId = Category.findByValue(Integer.parseInt(result.getProperty("categoryId").toString())).toString();
69
		Map<String, Long> categoryFrequency = new Hashtable<String, Long>();
70
		categoryFrequency.put(categoryId,Long.parseLong("1"));
71
		searchObject.setcategoryFrequency(categoryFrequency);
72
 
73
		//Setting number of searches
74
		searchObject.setTotalSearches(Long.parseLong("1"));
75
 
76
		//setting number of search results
77
		List<Long> numSearchResults = new ArrayList<Long>();
78
		numSearchResults.add((Long)result.getProperty("totalResults"));
79
		searchObject.setSearchResults(numSearchResults);
80
 
81
		//Storing session Id of query
82
		List<Object> sessionList = new ArrayList<Object>();
83
		sessionList.add(result.getProperty("sessionId"));
84
		searchObject.setSessionIds(sessionList);
85
 
86
		productSearchFreq.put(searchString,searchObject);
87
	}
88
	return productSearchFreq;
89
}
90
 
91
public Map<String,Double> populateSearchClickMap(Map<String,Double> searchClickMap, Entity result){
4785 amar.kumar 92
	try{
93
		String refererUrl = (String)result.getProperty("refererUrl");
94
		if(refererUrl!=null){
95
			if(refererUrl.contains("search?")){
96
				String clickQuery = "";
97
				refererUrl = URLDecoder.decode(refererUrl);
98
				clickQuery = refererUrl.split("q=")[1].split("&")[0];
99
				if(searchClickMap.containsKey(clickQuery)){
100
					searchClickMap.put(clickQuery, searchClickMap.get(clickQuery)+1);
101
				}else{
102
					searchClickMap.put(clickQuery, Double.parseDouble("1"));
103
				}
4744 amar.kumar 104
			}
105
		}
4785 amar.kumar 106
	}catch(Exception e){
107
		e.printStackTrace();
4744 amar.kumar 108
	}
109
	return searchClickMap;
110
}
111
 
112
%>
113
 
114
<% Date toDate = new Date();
4638 amar.kumar 115
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
116
cal.add(Calendar.DAY_OF_MONTH, -2);
117
Date fromDate = cal.getTime();
118
SimpleDateFormat iSdf = new SimpleDateFormat("yyyyMMdd");
119
String toDateStr  = request.getParameter("toDate");
120
String fromDateStr = request.getParameter("fromDate");
121
if (fromDateStr == null || fromDateStr.isEmpty()) {
122
    fromDateStr = iSdf.format(fromDate);
123
}
124
if (toDateStr == null || toDateStr.isEmpty()) {
125
    toDateStr = iSdf.format(toDate);
126
}
127
%>
128
<body>
129
<form id="searchfilter" name="searchfilter" method="post" action="/jsp/productSearchFrequency.jsp">
130
<label>From Date(YYYYMMDD) : </label> <input type="text" name="fromDate" id="fromDate" value="<%= fromDateStr %>"/>
131
<label>To Date(YYYYMMDD) : </label> <input type="text" name="toDate" id="toDate" value="<%= toDateStr %>"/>
132
<input type="Submit" id="Submit" name="Submit" value="Submit" />
133
</form>
134
 
135
<%
136
    try {
137
        if (fromDateStr != null) {
138
            fromDate = iSdf.parse(fromDateStr);
139
        }
140
        if (toDateStr != null) {
141
            toDate = iSdf.parse(toDateStr);
142
        }
143
    }
144
    catch (ParseException pe) {
145
%>
146
        <span>Invalid Date Format</span>
147
<%
148
    }
149
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
150
    sdf.setTimeZone(TimeZone.getTimeZone("IST"));
4744 amar.kumar 151
 
4638 amar.kumar 152
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
153
    Query query = new Query("DataLog");
154
    query.addFilter("eventType", Query.FilterOperator.IN,Arrays.asList("PRODUCT_SEARCH","PRODUCT_VIEW"));
155
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
156
    query.addFilter("date", Query.FilterOperator.LESS_THAN_OR_EQUAL, toDate);
157
    PreparedQuery pq = datastore.prepare(query);
4744 amar.kumar 158
 
159
 
160
	Map<String,SearchMetadata> productSearchFreq = new Hashtable<String,SearchMetadata>();
4638 amar.kumar 161
	Map<String,Double> searchClickMap = new Hashtable<String,Double>();
162
 
163
	for (Entity result : pq.asIterable()) {
164
		if(result.getProperty("eventType").equals("PRODUCT_SEARCH")){
4744 amar.kumar 165
			productSearchFreq = populateSearchDataMap(productSearchFreq, result);
4638 amar.kumar 166
 
167
		}else{
4744 amar.kumar 168
			//Calculating the frequency of ProductViews originating from ProductSearch
169
			searchClickMap = populateSearchClickMap(searchClickMap,result);
4638 amar.kumar 170
		}
171
	}
4744 amar.kumar 172
 
4638 amar.kumar 173
%>
174
 
175
<table cellpadding="0" cellspacing="0" border="0" class="display" id="productSearch">
176
	<thead>
177
		<tr>
178
			<th>Query String</th>
4744 amar.kumar 179
			<th>Total Search Count</th>
180
			<th>No Category</th>
181
			<th>Mobile Phones</th>
182
			<th>Tablets</th>
183
			<th>Laptops</th>
184
			<th>Accessories</th>
185
			<th>Session Count</th>
186
			<th>Average No. of Results</th>
4638 amar.kumar 187
			<th>Search Result Clicked</th>
4744 amar.kumar 188
			<th>Search Conversion (%) </th>
4638 amar.kumar 189
		</tr>
190
	</thead>
191
	<tbody>
192
	<% 	Set<String> querySet= productSearchFreq.keySet();
193
				for (String productQuery:querySet){
4744 amar.kumar 194
					Double searchConversionRate = (((searchClickMap.get(productQuery))==null ? 0 : searchClickMap.get(productQuery))*100/(productSearchFreq.get(productQuery).getTotalSearches()));
195
					searchConversionRate = ((double)((long)(searchConversionRate*100)))/100; //Truncating to 2 decimal places
4638 amar.kumar 196
	%>
197
		<tr>
198
			<td><a href="/jsp/productSearch.jsp?productQuery=<%=productQuery.toString()%>&toDate=<%=toDateStr%>&fromDate=<%=fromDateStr%>"><%=productQuery%></a></td>
4744 amar.kumar 199
			<td><%=productSearchFreq.get(productQuery).getTotalSearches()%></td>
200
 
201
			<%	
202
				Set<String> searchCategories = productSearchFreq.get(productQuery).getcategoryFrequency().keySet();
203
				List<String> categories = new ArrayList<String>();
204
				categories.add("NA");
205
				categories.add("Mobile_Phones");
206
				categories.add("Tablets");
207
				categories.add("Laptops");
208
				categories.add("Mobile_Accessories");
209
				for(String category : categories){
210
					Long searchinCategory = productSearchFreq.get(productQuery).getcategoryFrequency().get(category);
211
			%>
212
			<td>
213
				<%=searchinCategory==null ? 0 : searchinCategory %>
214
			</td>
215
			<% }%>
216
			<%
217
			long tempSum = 0;
218
			for(Long numOfSearchResults : productSearchFreq.get(productQuery).getSearchResults()){
219
				tempSum+=numOfSearchResults;
220
			}%>
221
			<td><%=(productSearchFreq.get(productQuery).getSessionIds()==null ? 0 : productSearchFreq.get(productQuery).getSessionIds().size()) %></td>
222
			<td><%=tempSum/productSearchFreq.get(productQuery).getTotalSearches() %></td>	
4638 amar.kumar 223
			<td><%=(searchClickMap.get(productQuery))==null ? 0 : searchClickMap.get(productQuery).intValue() %></td>	
4744 amar.kumar 224
			<td><%=searchConversionRate%></td>	
4638 amar.kumar 225
        </tr>
226
    <%}%> 
227
	</tbody>
228
</table>
229
<script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.js"></script>
230
    <script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.dataTables.min.js"></script>
231
    <script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/ZeroClipboard.js"></script>
232
    <script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/TableTools.js"></script>
233
    <script type="text/javascript" charset="utf-8">
234
        $(document).ready(function() {
235
            $('#productSearch').dataTable({
236
            	"sPaginationType": "full_numbers",
4744 amar.kumar 237
            	"aaSorting" : [ [ 2, 'desc' ] ],
4638 amar.kumar 238
            	"bProcessing": true,
239
                "bStateSave": true,
240
            	"sDom": 'T<"clear">lfrtip',
241
                "oTableTools": {
242
                    "sSwfPath": "/DataTables/extras/TableTools/media/swf/copy_cvs_xls_pdf.swf"
243
                },
244
                "aoColumns": [ 
245
                          { "bSearchable": true },
4744 amar.kumar 246
                          { "sSortDataType": "dom-text", "sType": "numeric" },
247
                          { "sSortDataType": "dom-text", "sType": "numeric" },
248
                          { "sSortDataType": "dom-text", "sType": "numeric" },
249
                          { "sSortDataType": "dom-text", "sType": "numeric" },
250
                          { "sSortDataType": "dom-text", "sType": "numeric" },
251
                          { "sSortDataType": "dom-text", "sType": "numeric" },
252
                          { "sSortDataType": "dom-text", "sType": "numeric" },
253
                          { "sSortDataType": "dom-text", "sType": "numeric" },
254
                          { "sSortDataType": "dom-text", "sType": "numeric" },
255
                          { "sSortDataType": "dom-text", "sType": "numeric" }
4638 amar.kumar 256
                ] 
257
            });
258
        } );
259
    </script>
260
</body>
261
</html>