Subversion Repositories SmartDukaan

Rev

Rev 3238 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3116 vikas 1
package in.shop2020.web;
2
 
3
import in.shop2020.model.Item;
4
import in.shop2020.model.ItemActivity;
5
import in.shop2020.server.ItemActivityRepository;
6
import in.shop2020.server.ItemRepository;
7
 
8
import java.text.ParseException;
9
import java.text.SimpleDateFormat;
3122 vikas 10
import java.util.ArrayList;
3116 vikas 11
import java.util.Calendar;
12
import java.util.Date;
13
import java.util.HashMap;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Map.Entry;
18
import java.util.Set;
19
import java.util.TimeZone;
20
 
21
import javax.servlet.http.HttpServlet;
22
import javax.servlet.http.HttpServletRequest;
23
import javax.servlet.http.HttpServletResponse;
24
 
25
import com.google.appengine.api.datastore.DatastoreService;
26
import com.google.appengine.api.datastore.DatastoreServiceFactory;
27
import com.google.appengine.api.datastore.Entity;
28
import com.google.appengine.api.datastore.PreparedQuery;
29
import com.google.appengine.api.datastore.Query;
30
 
31
public class DailyAggregatorServlet extends HttpServlet {
32
    private static final long serialVersionUID = -8236918415987438049L;
3238 vikas 33
    private static final String KIND = "DataLog";
34
    private static final String SESSION_ID_FILED = "sessionId";
35
    private static final String ITEMID_FILED = "itemId";
36
    private static final String ITEMIDS_FILED = "itemIds";
37
    private static final String PRODUCTNAME_FILED = "productName";
38
    private static final String EVENTTYPE_FILED = "eventType";
39
    private static final String DATE_FILED = "date";
40
 
41
    private static final String PRODUCT_VIEW_EVENT = "PRODUCT_VIEW";
42
    private static final String ADD_TO_CART_EVENT = "ADD_TO_CART";
43
    private static final String DELETE_FROM_CART_EVENT = "DELETE_FROM_CART";
44
    private static final String RESEARCH_ADD_EVENT = "RESEARCH_ADD";
45
    private static final String RESEARCH_DELETE_EVENT = "RESEARCH_DELETE";
46
    private static final String SHIPPING_ACCESS_EVENT = "SHIPPINIG_ACCESS";
47
    private static final String PAYMENT_SUCCESS_EVENT = "PAYMENT_SUCCESS";
48
    private static final String ORDER_CREATION_EVENT = "ORDER_CREATION";
49
    private static final String PAYMENT_FAILURE_EVENT = "PAYMENT_FAILURE";
50
    private static final String PROCEED_TO_PAY_EVENT = "PROCEED_TO_PAY";
51
 
52
    private static final String VIEW_COUNT_KEY = "ViewCount";
53
    private static final String UNIQUE_VIEW_COUNT_KEY = "UniqueViewCount";
54
    private static final String ADD_TO_CART_COUNT_KEY = "AddToCartCount";
55
    private static final String UNIQUE_ADD_TO_CART_COUNT_KEY = "UniqueAddToCartCount";
56
    private static final String DELETE_FROM_CART_COUNT_KEY = "DeleteFromCartCount";
57
    private static final String UNIQUE_DELETE_FROM_CART_COUNT_KEY = "UniqueDeleteFromCartCount";
58
    private static final String ADD_TO_RESEARCH_COUNT_KEY = "AddToResearchCount";
59
    private static final String UNIQUE_ADD_TO_RESEARCH_COUNT_KEY = "UniqueAddToResearchCount";
60
    private static final String DELETE_FROM_RESEARCH_COUNT_KEY = "DeleteFromResearchCount";
61
    private static final String UNIQUE_DELETE_FROM_RESEARCH_COUNT_KEY = "UniqueDeleteFromResearchCount";
62
    private static final String SHIPPING_ACCESS_COUNT_KEY = "ShippingAccessCount";
63
    private static final String UNIQUE_SHIPPING_ACCESS_COUNT_KEY = "UniqueShippingAccessCount";
64
    private static final String PAYMENT_SUCCESS_COUNT_KEY = "PaymentSuccessCount";
65
    private static final String UNIQUE_PAYMENT_SUCCESS_COUNT_KEY = "UniquePaymentSuccessCount";
66
    private static final String ORDER_CREATION_COUNT_KEY = "OrderCreationCount";
67
    private static final String UNIQUE_ORDER_CREATION_COUNT_KEY = "UniqueOrderCreationCount";
68
    private static final String PAYMENT_FAILURE_COUNT_KEY = "PaymentFailureCount";
69
    private static final String UNIQUE_PAYMENT_FAILURE_COUNT_KEY = "UniquePaymentFailureCount";
70
    private static final String PROCEED_TO_PAY_COUNT_KEY = "ProceedToPayCount";
71
    private static final String UNIQUE_PROCEED_TO_PAY_COUNT_KEY = "UniqueProceedToPayCount";
72
 
73
    private Map<Long, Item> itemsMap = new HashMap<Long, Item>();
74
    private Map<Long, Item> itemsCatalogIdMap = new HashMap<Long, Item>();
75
    private Map<String, Item> itemsNameMap = new HashMap<String, Item>();
76
    private Map<Long, Map<String, Long>> itemsResultMap = new HashMap<Long, Map<String, Long>>();
77
 
78
    private Date fromDate;
79
    private Date toDate;
80
    private DatastoreService datastore;
81
 
3116 vikas 82
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {
3238 vikas 83
        datastore = DatastoreServiceFactory.getDatastoreService();
3116 vikas 84
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
85
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
86
        String dateStr = req.getParameter("date");  
87
        if (dateStr != null && !dateStr.isEmpty()) {
88
            try {
89
                cal.setTime(sdf.parse(dateStr));
90
                cal.add(Calendar.DAY_OF_MONTH, 1);
91
            } catch (ParseException e) {
92
                e.printStackTrace();
93
            }
94
        }
95
        cal.set(Calendar.HOUR_OF_DAY, 0);  
96
        cal.set(Calendar.MINUTE, 0);  
97
        cal.set(Calendar.SECOND, 0);  
98
        cal.set(Calendar.MILLISECOND, 0);
3292 vikas 99
        toDate = cal.getTime();
100
        cal.add(Calendar.DAY_OF_MONTH, -1);
3238 vikas 101
        fromDate = cal.getTime();
3116 vikas 102
 
103
        ItemRepository itemRepository = new ItemRepository();
104
        List<Item> items = itemRepository.getAll();
105
        for (Item item : items) {
106
            itemsMap.put(item.getId(), item);
107
            itemsCatalogIdMap.put(item.getCatalogId(), item);
108
            itemsNameMap.put(item.getName().trim(), item);
109
        }
110
 
3238 vikas 111
        UpdateViewCount(PRODUCT_VIEW_EVENT, VIEW_COUNT_KEY, UNIQUE_VIEW_COUNT_KEY);
112
 
113
        UpdateItemIdEventCount(ADD_TO_CART_EVENT, ADD_TO_CART_COUNT_KEY, UNIQUE_ADD_TO_CART_COUNT_KEY, false);
114
        UpdateItemIdEventCount(DELETE_FROM_CART_EVENT, DELETE_FROM_CART_COUNT_KEY, UNIQUE_DELETE_FROM_CART_COUNT_KEY, false);
115
        UpdateItemIdEventCount(RESEARCH_ADD_EVENT, ADD_TO_RESEARCH_COUNT_KEY, UNIQUE_ADD_TO_RESEARCH_COUNT_KEY, true);
116
        UpdateItemIdEventCount(RESEARCH_DELETE_EVENT, DELETE_FROM_RESEARCH_COUNT_KEY, UNIQUE_DELETE_FROM_RESEARCH_COUNT_KEY, true);
117
 
118
        UpdateItemIdEventCount(SHIPPING_ACCESS_EVENT, SHIPPING_ACCESS_COUNT_KEY, UNIQUE_SHIPPING_ACCESS_COUNT_KEY, false);
119
        UpdateItemIdEventCount(PAYMENT_SUCCESS_EVENT, PAYMENT_SUCCESS_COUNT_KEY, UNIQUE_PAYMENT_SUCCESS_COUNT_KEY, false);
120
        UpdateItemIdEventCount(ORDER_CREATION_EVENT, ORDER_CREATION_COUNT_KEY, UNIQUE_ORDER_CREATION_COUNT_KEY, false);
121
        UpdateItemIdEventCount(PAYMENT_FAILURE_EVENT, PAYMENT_FAILURE_COUNT_KEY, UNIQUE_PAYMENT_FAILURE_COUNT_KEY, false);
122
        UpdateItemIdEventCount(PROCEED_TO_PAY_EVENT, PROCEED_TO_PAY_COUNT_KEY, UNIQUE_PROCEED_TO_PAY_COUNT_KEY, false);
123
 
124
        List<ItemActivity> itemActivities = new ArrayList<ItemActivity>();
125
        ItemActivityRepository itemActivityRepository = new ItemActivityRepository();
126
        for (Entry<Long, Map<String, Long>> entry : itemsResultMap.entrySet()) {
127
            Long catalogItemId = (Long)entry.getKey();
128
            Map<String, Long> itemMap = (Map<String, Long>)entry.getValue();
129
 
130
            ItemActivity itemActivity = new ItemActivity();
131
            itemActivity.setCatalogId(catalogItemId);
132
            itemActivity.setDate(fromDate);
133
 
134
            itemActivity.setView(itemMap.get(VIEW_COUNT_KEY));
135
            itemActivity.setAddToCart(itemMap.get(ADD_TO_CART_COUNT_KEY));
136
            itemActivity.setAddToResearch(itemMap.get(ADD_TO_RESEARCH_COUNT_KEY));
137
            itemActivity.setDeleteFromCart(itemMap.get(DELETE_FROM_CART_COUNT_KEY));
138
            itemActivity.setDeleteFromResearch(itemMap.get(DELETE_FROM_RESEARCH_COUNT_KEY));
139
            itemActivity.setShippingAccess(itemMap.get(SHIPPING_ACCESS_COUNT_KEY));
140
            itemActivity.setPaymentSuccess(itemMap.get(PAYMENT_SUCCESS_COUNT_KEY));
141
            itemActivity.setOrderCreation(itemMap.get(ORDER_CREATION_COUNT_KEY));
142
            itemActivity.setPaymentFailure(itemMap.get(PAYMENT_FAILURE_COUNT_KEY));
143
            itemActivity.setProceedToPay(itemMap.get(PROCEED_TO_PAY_COUNT_KEY));
144
 
145
            itemActivity.setUniqueView(itemMap.get(UNIQUE_VIEW_COUNT_KEY));
146
            itemActivity.setUniqueAddToCart(itemMap.get(UNIQUE_ADD_TO_CART_COUNT_KEY));
147
            itemActivity.setUniqueAddToResearch(itemMap.get(UNIQUE_ADD_TO_RESEARCH_COUNT_KEY));
148
            itemActivity.setUniqueDeleteFromCart(itemMap.get(UNIQUE_DELETE_FROM_CART_COUNT_KEY));
149
            itemActivity.setUniqueDeleteFromResearch(itemMap.get(UNIQUE_ADD_TO_RESEARCH_COUNT_KEY));
150
            itemActivity.setUniqueShippingAccess(itemMap.get(UNIQUE_SHIPPING_ACCESS_COUNT_KEY));
151
            itemActivity.setUniquePaymentSuccess(itemMap.get(UNIQUE_PAYMENT_SUCCESS_COUNT_KEY));
152
            itemActivity.setUniqueOrderCreation(itemMap.get(UNIQUE_ORDER_CREATION_COUNT_KEY));
153
            itemActivity.setUniquePaymentFailure(itemMap.get(UNIQUE_PAYMENT_FAILURE_COUNT_KEY));
154
            itemActivity.setUniqueProceedToPay(itemMap.get(UNIQUE_PROCEED_TO_PAY_COUNT_KEY));
155
 
156
            itemActivities.add(itemActivity);
157
        }
158
        itemActivityRepository.createAll(itemActivities);
159
    }
160
 
161
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
162
        doPost(req, resp);
163
    }
164
 
165
    private void UpdateViewCount(String event, String viewCountKey, String uniqueViewCountKey) {
166
        Query query = new Query(KIND);
167
        query.addFilter(EVENTTYPE_FILED, Query.FilterOperator.EQUAL, event);
168
        query.addFilter(DATE_FILED, Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
169
        query.addFilter(DATE_FILED, Query.FilterOperator.LESS_THAN, toDate);
3116 vikas 170
        PreparedQuery pq = datastore.prepare(query);
171
        Set<String> uniqueSet = new HashSet<String>();
172
        for (Entity result : pq.asIterable()) {
3238 vikas 173
            String sessionId = (String)result.getProperty(SESSION_ID_FILED);
174
            Long catalogItemId = (Long)result.getProperty(ITEMID_FILED);
3116 vikas 175
            if(catalogItemId == null) {
3238 vikas 176
                String name = (String)result.getProperty(PRODUCTNAME_FILED);
3116 vikas 177
                if (itemsNameMap.containsKey(name.trim())) {
178
                    catalogItemId = itemsNameMap.get(name.trim()).getCatalogId();
179
                }
180
            }
181
            if (itemsResultMap.containsKey(catalogItemId)) {
182
                Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
3238 vikas 183
                if (itemMap.containsKey(VIEW_COUNT_KEY)) {
184
                    Long count = itemMap.get(VIEW_COUNT_KEY);
185
                    itemMap.put(VIEW_COUNT_KEY, ++count);
3116 vikas 186
                }
187
                else {
3238 vikas 188
                    itemMap.put(VIEW_COUNT_KEY, 1l);
3116 vikas 189
                }
190
            }
191
            else {
192
                Map<String, Long> itemMap = new HashMap<String, Long>();
3238 vikas 193
                itemMap.put(VIEW_COUNT_KEY, 1l);
3116 vikas 194
                itemsResultMap.put(catalogItemId, itemMap);
195
            }
196
            String uniqueKey = sessionId + catalogItemId;
197
            if (!uniqueSet.contains(uniqueKey)) {
198
                Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
3238 vikas 199
                if (itemMap.containsKey(UNIQUE_VIEW_COUNT_KEY)) {
200
                    Long count = itemMap.get(UNIQUE_VIEW_COUNT_KEY);
201
                    itemMap.put(UNIQUE_VIEW_COUNT_KEY, ++count);
3116 vikas 202
                }
203
                else {
3238 vikas 204
                    itemMap.put(UNIQUE_VIEW_COUNT_KEY, 1l);
3116 vikas 205
                }
206
                uniqueSet.add(uniqueKey);
207
            }
208
        }
3238 vikas 209
    }
210
 
211
    private void UpdateItemIdEventCount(String event, String countKey, String uniqueCountKey, boolean isCatalogIdEvent) {
212
        Query query = new Query(KIND);
213
        query.addFilter(EVENTTYPE_FILED, Query.FilterOperator.EQUAL, event);
214
        query.addFilter(DATE_FILED, Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
215
        query.addFilter(DATE_FILED, Query.FilterOperator.LESS_THAN, toDate);
216
        PreparedQuery pq = datastore.prepare(query);
217
        Set<String> uniqueSet = new HashSet<String>();
3116 vikas 218
        for (Entity result : pq.asIterable()) {
3238 vikas 219
            String sessionId = (String)result.getProperty(SESSION_ID_FILED);
220
            List<Long> itemIds = null;
221
            if (!result.hasProperty(ITEMIDS_FILED)) {
222
                continue;
3116 vikas 223
            }
3238 vikas 224
            try {
225
                itemIds = (List<Long>)result.getProperty(ITEMIDS_FILED);
226
            } catch (ClassCastException e) {
227
                try {
228
                    itemIds = new ArrayList<Long>();
229
                    itemIds.add((Long)result.getProperty(ITEMIDS_FILED));
3116 vikas 230
                }
3238 vikas 231
                catch(Exception ex) {
232
                    log(e.getMessage());
3116 vikas 233
                }
234
            }
3238 vikas 235
 
236
            if (itemIds == null) {
237
                continue;
238
            }
239
            for (Long itemId : itemIds) {
240
                if (itemId == null) {
241
                    continue;
3116 vikas 242
                }
3238 vikas 243
                if (!isCatalogIdEvent) {
244
                    if (itemsMap.containsKey(itemId)) {
245
                        itemId = itemsMap.get(itemId).getCatalogId();
3116 vikas 246
                    }
247
                }
3238 vikas 248
                if (itemsResultMap.containsKey(itemId)) {
249
                    Map<String, Long> itemMap = itemsResultMap.get(itemId);
250
                    if (itemMap.containsKey(countKey)) {
251
                        Long count = itemMap.get(countKey);
252
                        itemMap.put(countKey, ++count);
3116 vikas 253
                    }
254
                    else {
3238 vikas 255
                        itemMap.put(countKey, 1l);
3116 vikas 256
                    }
257
                }
258
                else {
259
                    Map<String, Long> itemMap = new HashMap<String, Long>();
3238 vikas 260
                    itemMap.put(countKey, 1l);
261
                    itemsResultMap.put(itemId, itemMap);
3116 vikas 262
                }
3238 vikas 263
                String uniqueKey = sessionId + itemId;
3116 vikas 264
                if (!uniqueSet.contains(uniqueKey)) {
3238 vikas 265
                    Map<String, Long> itemMap = itemsResultMap.get(itemId);
266
                    if (itemMap.containsKey(uniqueCountKey)) {
267
                        Long count = itemMap.get(uniqueCountKey);
268
                        itemMap.put(uniqueCountKey, ++count);
3116 vikas 269
                    }
270
                    else {
3238 vikas 271
                        itemMap.put(uniqueCountKey, 1l);
3116 vikas 272
                    }
273
                    uniqueSet.add(uniqueKey);
274
                }
275
            }
276
        }
277
    }
278
}