Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
3444 vikas 1
package in.shop2020.web;
2
 
3
import in.shop2020.model.Item;
4
import in.shop2020.model.ItemActivityWithSource;
5
import in.shop2020.server.ItemActivityWithSourceRepository;
6
import in.shop2020.server.ItemRepository;
7
 
8
import java.text.ParseException;
9
import java.text.SimpleDateFormat;
10
import java.util.ArrayList;
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;
3488 vikas 20
import java.util.logging.Logger;
3444 vikas 21
 
22
import javax.servlet.http.HttpServlet;
23
import javax.servlet.http.HttpServletRequest;
24
import javax.servlet.http.HttpServletResponse;
25
 
26
import com.google.appengine.api.datastore.DatastoreService;
27
import com.google.appengine.api.datastore.DatastoreServiceFactory;
28
import com.google.appengine.api.datastore.Entity;
3488 vikas 29
import com.google.appengine.api.datastore.FetchOptions;
3444 vikas 30
import com.google.appengine.api.datastore.PreparedQuery;
31
import com.google.appengine.api.datastore.Query;
32
 
33
public class DailyProductWithSourceAggregatorServlet extends HttpServlet {
34
    private static final long serialVersionUID = -8236918415987438049L;
3488 vikas 35
    private static Logger logger = Logger.getLogger(DailyProductWithSourceAggregatorServlet.class.getName());
36
 
3444 vikas 37
    private static final String KIND = "DataLog";
3488 vikas 38
    private static final String SESSION_ID_FIELD = "sessionId";
39
    private static final String ITEMID_FIELD = "itemId";
40
    private static final String ITEMIDS_FIELD = "itemIds";
41
    private static final String PRODUCTNAME_FIELD = "productName";
42
    private static final String EVENTTYPE_FIELD = "eventType";
43
    private static final String DATE_FIELD = "date";
44
    private static final String FIRST_SOURCE_FIELD = "firstSource";
45
    private static final String SESSION_SOURCE_FIELD = "source";
3444 vikas 46
 
47
 
48
    private static final String PRODUCT_VIEW_EVENT = "PRODUCT_VIEW";
49
    private static final String ADD_TO_CART_EVENT = "ADD_TO_CART";
50
    private static final String DELETE_FROM_CART_EVENT = "DELETE_FROM_CART";
51
    private static final String RESEARCH_ADD_EVENT = "RESEARCH_ADD";
52
    private static final String RESEARCH_DELETE_EVENT = "RESEARCH_DELETE";
53
    private static final String SHIPPING_ACCESS_EVENT = "SHIPPINIG_ACCESS";
54
    private static final String PAYMENT_SUCCESS_EVENT = "PAYMENT_SUCCESS";
55
    private static final String ORDER_CREATION_EVENT = "ORDER_CREATION";
56
    private static final String PAYMENT_FAILURE_EVENT = "PAYMENT_FAILURE";
57
    private static final String PROCEED_TO_PAY_EVENT = "PROCEED_TO_PAY";
58
    private static final String NEW_SESSION_EVENT = "NEW_SESSION";
59
 
60
    private static final String VIEW_COUNT_KEY = "ViewCount";
61
    private static final String UNIQUE_VIEW_COUNT_KEY = "UniqueViewCount";
62
    private static final String ADD_TO_CART_COUNT_KEY = "AddToCartCount";
63
    private static final String UNIQUE_ADD_TO_CART_COUNT_KEY = "UniqueAddToCartCount";
64
    private static final String DELETE_FROM_CART_COUNT_KEY = "DeleteFromCartCount";
65
    private static final String UNIQUE_DELETE_FROM_CART_COUNT_KEY = "UniqueDeleteFromCartCount";
66
    private static final String ADD_TO_RESEARCH_COUNT_KEY = "AddToResearchCount";
67
    private static final String UNIQUE_ADD_TO_RESEARCH_COUNT_KEY = "UniqueAddToResearchCount";
68
    private static final String DELETE_FROM_RESEARCH_COUNT_KEY = "DeleteFromResearchCount";
69
    private static final String UNIQUE_DELETE_FROM_RESEARCH_COUNT_KEY = "UniqueDeleteFromResearchCount";
70
    private static final String SHIPPING_ACCESS_COUNT_KEY = "ShippingAccessCount";
71
    private static final String UNIQUE_SHIPPING_ACCESS_COUNT_KEY = "UniqueShippingAccessCount";
72
    private static final String PAYMENT_SUCCESS_COUNT_KEY = "PaymentSuccessCount";
73
    private static final String UNIQUE_PAYMENT_SUCCESS_COUNT_KEY = "UniquePaymentSuccessCount";
74
    private static final String ORDER_CREATION_COUNT_KEY = "OrderCreationCount";
75
    private static final String UNIQUE_ORDER_CREATION_COUNT_KEY = "UniqueOrderCreationCount";
76
    private static final String PAYMENT_FAILURE_COUNT_KEY = "PaymentFailureCount";
77
    private static final String UNIQUE_PAYMENT_FAILURE_COUNT_KEY = "UniquePaymentFailureCount";
78
    private static final String PROCEED_TO_PAY_COUNT_KEY = "ProceedToPayCount";
79
    private static final String UNIQUE_PROCEED_TO_PAY_COUNT_KEY = "UniqueProceedToPayCount";
80
 
81
    private static final String FIRST_SOURCE_KEY = "FirstSource";
82
    private static final String SESSION_SOURCE_KEY = "SessionSource";
83
 
3488 vikas 84
    private Map<Long, Item> itemsMap;
85
    private Map<Long, Item> itemsCatalogIdMap;
86
    private Map<String, Item> itemsNameMap;
87
    private Map<String, Map<String, Long>> itemsResultMap;
3444 vikas 88
 
3488 vikas 89
    private Map<String, Map<String, String>> sessionIdSourceMap;
3444 vikas 90
 
91
    private Date fromDate;
92
    private Date toDate;
93
    private DatastoreService datastore;
94
 
95
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {
3488 vikas 96
        logger.warning("Running DailyProductWithSourceAggregator");
97
        sessionIdSourceMap = new HashMap<String, Map<String,String>>();
98
        itemsMap = new HashMap<Long, Item>();
99
        itemsCatalogIdMap = new HashMap<Long, Item>();
100
        itemsNameMap = new HashMap<String, Item>();
101
        itemsResultMap = new HashMap<String, Map<String, Long>>();
102
 
3444 vikas 103
        datastore = DatastoreServiceFactory.getDatastoreService();
104
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
105
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
106
        String dateStr = req.getParameter("date");  
107
        if (dateStr != null && !dateStr.isEmpty()) {
108
            try {
109
                cal.setTime(sdf.parse(dateStr));
110
                cal.add(Calendar.DAY_OF_MONTH, 1);
111
            } catch (ParseException e) {
112
                e.printStackTrace();
113
            }
114
        }
115
        cal.set(Calendar.HOUR_OF_DAY, 0);  
116
        cal.set(Calendar.MINUTE, 0);  
117
        cal.set(Calendar.SECOND, 0);  
118
        cal.set(Calendar.MILLISECOND, 0);
119
        toDate = cal.getTime();
120
        cal.add(Calendar.DAY_OF_MONTH, -1);
121
        fromDate = cal.getTime();
122
 
123
        ItemRepository itemRepository = new ItemRepository();
124
        List<Item> items = itemRepository.getAll();
125
        for (Item item : items) {
126
            itemsMap.put(item.getId(), item);
127
            itemsCatalogIdMap.put(item.getCatalogId(), item);
128
            itemsNameMap.put(item.getName().trim(), item);
129
        }
130
 
3488 vikas 131
        logger.warning("DailyProductWithSourceAggregator : Updating View Count Map");
3444 vikas 132
        UpdateViewCount(PRODUCT_VIEW_EVENT, VIEW_COUNT_KEY, UNIQUE_VIEW_COUNT_KEY);
3488 vikas 133
        logger.warning("DailyProductWithSourceAggregator : itemsResultMap size : " + itemsResultMap.size());
134
        logger.warning("DailyProductWithSourceAggregator : sessionIdSourceMap size : " + sessionIdSourceMap.size());
3444 vikas 135
 
3488 vikas 136
        logger.warning("DailyProductWithSourceAggregator : Updating Add To Cart Count Map");
3444 vikas 137
        UpdateItemIdEventCount(ADD_TO_CART_EVENT, ADD_TO_CART_COUNT_KEY, UNIQUE_ADD_TO_CART_COUNT_KEY, false);
3488 vikas 138
        logger.warning("DailyProductWithSourceAggregator : Updating Delete From Cart Count Map");
3444 vikas 139
        UpdateItemIdEventCount(DELETE_FROM_CART_EVENT, DELETE_FROM_CART_COUNT_KEY, UNIQUE_DELETE_FROM_CART_COUNT_KEY, false);
3488 vikas 140
        logger.warning("DailyProductWithSourceAggregator : Updating Add To Research Count Map");
3444 vikas 141
        UpdateItemIdEventCount(RESEARCH_ADD_EVENT, ADD_TO_RESEARCH_COUNT_KEY, UNIQUE_ADD_TO_RESEARCH_COUNT_KEY, true);
3488 vikas 142
        logger.warning("DailyProductWithSourceAggregator : Updating Delete From Research Count Map");
3444 vikas 143
        UpdateItemIdEventCount(RESEARCH_DELETE_EVENT, DELETE_FROM_RESEARCH_COUNT_KEY, UNIQUE_DELETE_FROM_RESEARCH_COUNT_KEY, true);
144
 
3488 vikas 145
        logger.warning("DailyProductWithSourceAggregator : Updating ShippingAccessCount Count Map");
3444 vikas 146
        UpdateItemIdEventCount(SHIPPING_ACCESS_EVENT, SHIPPING_ACCESS_COUNT_KEY, UNIQUE_SHIPPING_ACCESS_COUNT_KEY, false);
3488 vikas 147
        logger.warning("DailyProductWithSourceAggregator : Updating Payment Success Count Map");
3444 vikas 148
        UpdateItemIdEventCount(PAYMENT_SUCCESS_EVENT, PAYMENT_SUCCESS_COUNT_KEY, UNIQUE_PAYMENT_SUCCESS_COUNT_KEY, false);
3488 vikas 149
        logger.warning("DailyProductWithSourceAggregator : Updating Order Creation Count Map");
3444 vikas 150
        UpdateItemIdEventCount(ORDER_CREATION_EVENT, ORDER_CREATION_COUNT_KEY, UNIQUE_ORDER_CREATION_COUNT_KEY, false);
3488 vikas 151
        logger.warning("DailyProductWithSourceAggregator : Updating Payment Failure Count Map");
3444 vikas 152
        UpdateItemIdEventCount(PAYMENT_FAILURE_EVENT, PAYMENT_FAILURE_COUNT_KEY, UNIQUE_PAYMENT_FAILURE_COUNT_KEY, false);
3488 vikas 153
        logger.warning("DailyProductWithSourceAggregator : Updating Proceed To Pay Count Map");
3444 vikas 154
        UpdateItemIdEventCount(PROCEED_TO_PAY_EVENT, PROCEED_TO_PAY_COUNT_KEY, UNIQUE_PROCEED_TO_PAY_COUNT_KEY, false);
155
 
156
        List<ItemActivityWithSource> itemActivities = new ArrayList<ItemActivityWithSource>();
157
        ItemActivityWithSourceRepository itemActivityRepository = new ItemActivityWithSourceRepository();
158
        for (Entry<String, Map<String, Long>> entry : itemsResultMap.entrySet()) {
159
            String key = (String)entry.getKey();
160
            Map<String, Long> itemMap = (Map<String, Long>)entry.getValue();
161
 
162
            String [] keyItems = key.split("_");
163
 
164
            Boolean isPaidFirstSource = keyItems[0].equals("0")? false : true;
165
            String firstSource = keyItems[1];
166
            Boolean isPaidSessionSource = keyItems[2].equals("0")? false : true;
167
            String sessionSource = keyItems[3];
168
            Long catalogItemId = Long.parseLong(keyItems[4]);
169
 
170
            ItemActivityWithSource itemActivity = new ItemActivityWithSource();
171
            itemActivity.setIsPaidFirstSource(isPaidFirstSource);
172
            itemActivity.setFirstSource(firstSource);
173
            itemActivity.setIsPaidSessionSource(isPaidSessionSource);
174
            itemActivity.setSessionSource(sessionSource);
175
            itemActivity.setCatalogId(catalogItemId);
176
            itemActivity.setDate(fromDate);
177
 
178
            itemActivity.setView(itemMap.get(VIEW_COUNT_KEY));
179
            itemActivity.setAddToCart(itemMap.get(ADD_TO_CART_COUNT_KEY));
180
            itemActivity.setAddToResearch(itemMap.get(ADD_TO_RESEARCH_COUNT_KEY));
181
            itemActivity.setDeleteFromCart(itemMap.get(DELETE_FROM_CART_COUNT_KEY));
182
            itemActivity.setDeleteFromResearch(itemMap.get(DELETE_FROM_RESEARCH_COUNT_KEY));
183
            itemActivity.setShippingAccess(itemMap.get(SHIPPING_ACCESS_COUNT_KEY));
184
            itemActivity.setPaymentSuccess(itemMap.get(PAYMENT_SUCCESS_COUNT_KEY));
185
            itemActivity.setOrderCreation(itemMap.get(ORDER_CREATION_COUNT_KEY));
186
            itemActivity.setPaymentFailure(itemMap.get(PAYMENT_FAILURE_COUNT_KEY));
187
            itemActivity.setProceedToPay(itemMap.get(PROCEED_TO_PAY_COUNT_KEY));
188
 
189
            itemActivity.setUniqueView(itemMap.get(UNIQUE_VIEW_COUNT_KEY));
190
            itemActivity.setUniqueAddToCart(itemMap.get(UNIQUE_ADD_TO_CART_COUNT_KEY));
191
            itemActivity.setUniqueAddToResearch(itemMap.get(UNIQUE_ADD_TO_RESEARCH_COUNT_KEY));
192
            itemActivity.setUniqueDeleteFromCart(itemMap.get(UNIQUE_DELETE_FROM_CART_COUNT_KEY));
193
            itemActivity.setUniqueDeleteFromResearch(itemMap.get(UNIQUE_ADD_TO_RESEARCH_COUNT_KEY));
194
            itemActivity.setUniqueShippingAccess(itemMap.get(UNIQUE_SHIPPING_ACCESS_COUNT_KEY));
195
            itemActivity.setUniquePaymentSuccess(itemMap.get(UNIQUE_PAYMENT_SUCCESS_COUNT_KEY));
196
            itemActivity.setUniqueOrderCreation(itemMap.get(UNIQUE_ORDER_CREATION_COUNT_KEY));
197
            itemActivity.setUniquePaymentFailure(itemMap.get(UNIQUE_PAYMENT_FAILURE_COUNT_KEY));
198
            itemActivity.setUniqueProceedToPay(itemMap.get(UNIQUE_PROCEED_TO_PAY_COUNT_KEY));
199
 
200
            itemActivities.add(itemActivity);
3488 vikas 201
 
202
            if (itemActivities.size()>500) {
203
                logger.warning("DailyProductWithSourceAggregator : persisting itemactivities : " + itemActivities.size());
204
                itemActivityRepository.createAll(itemActivities);
205
                itemActivities.clear();
206
            }
3444 vikas 207
        }
3488 vikas 208
        logger.warning("DailyProductWithSourceAggregator : persisting itemactivities : " + itemActivities.size());
209
        logger.warning("DailyProductWithSourceAggregator : itemactivities : " + itemActivities);
3444 vikas 210
        itemActivityRepository.createAll(itemActivities);
211
    }
212
 
213
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
214
        doPost(req, resp);
215
    }
216
 
217
    private void UpdateViewCount(String event, String viewCountKey, String uniqueViewCountKey) {
218
        Query query = new Query(KIND);
3488 vikas 219
        query.addFilter(EVENTTYPE_FIELD, Query.FilterOperator.EQUAL, event);
220
        query.addFilter(DATE_FIELD, Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
221
        query.addFilter(DATE_FIELD, Query.FilterOperator.LESS_THAN, toDate);
3444 vikas 222
        PreparedQuery pq = datastore.prepare(query);
223
        Set<String> uniqueSet = new HashSet<String>();
3488 vikas 224
        List<Entity> entityResults = new ArrayList<Entity>();
225
 
3523 vikas 226
        Set<String> sessionIds = new HashSet<String>();
3488 vikas 227
        logger.warning("DailyProductWithSourceAggregator : Getting View Events in list");
228
        for (Entity e : pq.asList(FetchOptions.Builder.withChunkSize(500))) {
229
            entityResults.add(e);
3523 vikas 230
            String sessionId = (String)e.getProperty(SESSION_ID_FIELD);
231
            if (sessionId != null && !sessionId.isEmpty()) {
232
                sessionIds.add(sessionId);
233
            }
3488 vikas 234
        }
3523 vikas 235
        populateSessionIdSourceMap(sessionIds);
236
        sessionIds = null;
3488 vikas 237
        logger.warning("DailyProductWithSourceAggregator : Done Getting View Events in list");
238
        for (Entity result : entityResults) {
239
            String sessionId = (String)result.getProperty(SESSION_ID_FIELD);
3444 vikas 240
            String firstSource = getSource(sessionId, FIRST_SOURCE_KEY);
241
            String sessionSource = getSource(sessionId, SESSION_SOURCE_KEY);
242
            String paidFirstSource = "0";
243
            String paidSessionSource = "0";
244
            if (firstSource.startsWith("PAID :")) {
245
                paidFirstSource = "1";
246
            }
247
            if (sessionSource.startsWith("PAID :")) {
248
                paidSessionSource = "1";
249
            }
3488 vikas 250
            firstSource = firstSource.replaceAll(".*http[s]?://", "").replaceAll("/.*", "").replaceAll("www.", "");
251
            sessionSource = sessionSource.replaceAll(".*http[s]?://", "").replaceAll("/.*", "").replaceAll("www.", "");
252
            Long catalogItemId = (Long)result.getProperty(ITEMID_FIELD);
3444 vikas 253
            if(catalogItemId == null) {
3488 vikas 254
                String name = (String)result.getProperty(PRODUCTNAME_FIELD);
3444 vikas 255
                if (itemsNameMap.containsKey(name.trim())) {
256
                    catalogItemId = itemsNameMap.get(name.trim()).getCatalogId();
257
                }
258
            }
259
            String key = paidFirstSource + "_" + firstSource + "_"
260
                    + paidSessionSource + "_" + sessionSource + "_"
261
                    + catalogItemId;
262
            if (itemsResultMap.containsKey(key)) {
263
                Map<String, Long> itemMap = itemsResultMap.get(key);
264
                if (itemMap.containsKey(VIEW_COUNT_KEY)) {
265
                    Long count = itemMap.get(VIEW_COUNT_KEY);
266
                    itemMap.put(VIEW_COUNT_KEY, ++count);
267
                }
268
                else {
269
                    itemMap.put(VIEW_COUNT_KEY, 1l);
270
                }
271
            }
272
            else {
273
                Map<String, Long> itemMap = new HashMap<String, Long>();
274
                itemMap.put(VIEW_COUNT_KEY, 1l);
275
                itemsResultMap.put(key, itemMap);
276
            }
277
            String uniqueKey = sessionId + "_" + catalogItemId;
278
            if (!uniqueSet.contains(uniqueKey)) {
279
                Map<String, Long> itemMap = itemsResultMap.get(key);
280
                if (itemMap.containsKey(UNIQUE_VIEW_COUNT_KEY)) {
281
                    Long count = itemMap.get(UNIQUE_VIEW_COUNT_KEY);
282
                    itemMap.put(UNIQUE_VIEW_COUNT_KEY, ++count);
283
                }
284
                else {
285
                    itemMap.put(UNIQUE_VIEW_COUNT_KEY, 1l);
286
                }
287
                uniqueSet.add(uniqueKey);
288
            }
289
        }
290
    }
291
 
3523 vikas 292
    private void populateSessionIdSourceMap(Set<String> sessionIds) {
293
 
294
        Query sessionQuery = new Query(KIND);
295
        sessionQuery.addFilter(EVENTTYPE_FIELD, Query.FilterOperator.EQUAL,
296
                NEW_SESSION_EVENT);
297
        sessionQuery.addFilter(DATE_FIELD, Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
298
        sessionQuery.addFilter(DATE_FIELD, Query.FilterOperator.LESS_THAN, toDate);
299
 
300
        PreparedQuery sessionPq = datastore.prepare(sessionQuery);
301
        for (Entity sessionResult : sessionPq.asIterable()) {
302
            String sessionId = (String)sessionResult.getProperty(SESSION_ID_FIELD);
303
            if (sessionIds.contains(sessionId)) {
304
                String firstSource = "";
305
                String sessionSource = "";
306
                if (sessionResult != null) {
307
                    if (sessionResult.hasProperty(FIRST_SOURCE_FIELD)) {
308
                        firstSource = sessionResult.getProperty(
309
                                FIRST_SOURCE_FIELD).toString();
310
                    }
311
                    if (sessionResult.hasProperty(SESSION_SOURCE_FIELD)) {
312
                        sessionSource = sessionResult.getProperty(
313
                                SESSION_SOURCE_FIELD).toString();
314
                    }
315
                }
316
                Map<String, String> sessionSourcesMap = new HashMap<String, String>();
317
                sessionSourcesMap.put(FIRST_SOURCE_KEY, firstSource);
318
                sessionSourcesMap.put(SESSION_SOURCE_KEY, sessionSource);
319
                sessionIdSourceMap.put(sessionId, sessionSourcesMap);
320
            }
321
        }
322
        logger.warning("DailyProductWithSourceAggregator : polpulateSessionIds : "
323
                + sessionIdSourceMap.size());
324
    }
325
 
3444 vikas 326
    private String getSource(String sessionId, String sourceKey) {
3488 vikas 327
        if (sessionIdSourceMap.containsKey(sessionId)) {
328
            return sessionIdSourceMap.get(sessionId).get(sourceKey);
329
        }
3523 vikas 330
        logger.warning("DailyProductWithSourceAggregator : sessionIdSourceMap miss : "
331
                + sessionId);
3488 vikas 332
        if (sessionId != null && !sessionId.isEmpty()) {
3444 vikas 333
            Query sessionQuery = new Query(KIND);
3488 vikas 334
            sessionQuery.addFilter(EVENTTYPE_FIELD, Query.FilterOperator.EQUAL,
3444 vikas 335
                    NEW_SESSION_EVENT);
3488 vikas 336
            sessionQuery.addFilter(SESSION_ID_FIELD,
337
                    Query.FilterOperator.EQUAL, sessionId);
338
 
3444 vikas 339
            PreparedQuery sessionPq = datastore.prepare(sessionQuery);
340
            for (Entity sessionResult : sessionPq.asIterable()) {
341
                String firstSource = "";
342
                String sessionSource = "";
343
                if (sessionResult != null) {
3488 vikas 344
                    if (sessionResult.hasProperty(FIRST_SOURCE_FIELD)) {
345
                        firstSource = sessionResult.getProperty(
346
                                FIRST_SOURCE_FIELD).toString();
3444 vikas 347
                    }
3488 vikas 348
                    if (sessionResult.hasProperty(SESSION_SOURCE_FIELD)) {
349
                        sessionSource = sessionResult.getProperty(
350
                                SESSION_SOURCE_FIELD).toString();
3444 vikas 351
                    }
352
                }
353
                Map<String, String> sessionSourcesMap = new HashMap<String, String>();
354
                sessionSourcesMap.put(FIRST_SOURCE_KEY, firstSource);
355
                sessionSourcesMap.put(SESSION_SOURCE_KEY, sessionSource);
356
                sessionIdSourceMap.put(sessionId, sessionSourcesMap);
357
            }
358
        }
359
        if (sessionIdSourceMap.containsKey(sessionId)) {
360
            return sessionIdSourceMap.get(sessionId).get(sourceKey);
361
        }
3523 vikas 362
        logger.warning("DailyProductWithSourceAggregator : sessionIdSourceMap not found : "
363
                + sessionId);
3444 vikas 364
        return "";
365
    }
366
 
367
    private void UpdateItemIdEventCount(String event, String countKey, String uniqueCountKey, boolean isCatalogIdEvent) {
368
        Query query = new Query(KIND);
3488 vikas 369
        query.addFilter(EVENTTYPE_FIELD, Query.FilterOperator.EQUAL, event);
370
        query.addFilter(DATE_FIELD, Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
371
        query.addFilter(DATE_FIELD, Query.FilterOperator.LESS_THAN, toDate);
3444 vikas 372
        PreparedQuery pq = datastore.prepare(query);
373
        Set<String> uniqueSet = new HashSet<String>();
3488 vikas 374
        List<Entity> results = new ArrayList<Entity>();
375
        for (Entity e : pq.asList(FetchOptions.Builder.withChunkSize(500))) {
376
            results.add(e);
377
        }
378
        for (Entity result : results) {
379
            String sessionId = (String)result.getProperty(SESSION_ID_FIELD);
3444 vikas 380
            String firstSource = getSource(sessionId, FIRST_SOURCE_KEY);
381
            String sessionSource = getSource(sessionId, SESSION_SOURCE_KEY);
382
            String paidFirstSource = "0";
383
            String paidSessionSource = "0";
384
            if (firstSource.startsWith("PAID :")) {
385
                paidFirstSource = "1";
386
            }
387
            if (sessionSource.startsWith("PAID :")) {
388
                paidSessionSource = "1";
389
            }
3488 vikas 390
            firstSource = firstSource.replaceAll(".*http[s]?://", "").replaceAll("/.*", "").replaceAll("www.", "");
391
            sessionSource = sessionSource.replaceAll(".*http[s]?://", "").replaceAll("/.*", "").replaceAll("www.", "");
3444 vikas 392
            List<Long> itemIds = null;
3488 vikas 393
            if (!result.hasProperty(ITEMIDS_FIELD)) {
3444 vikas 394
                continue;
395
            }
396
            try {
3488 vikas 397
                itemIds = (List<Long>)result.getProperty(ITEMIDS_FIELD);
3444 vikas 398
            } catch (ClassCastException e) {
399
                try {
400
                    itemIds = new ArrayList<Long>();
3488 vikas 401
                    itemIds.add((Long)result.getProperty(ITEMIDS_FIELD));
3444 vikas 402
                }
403
                catch(Exception ex) {
404
                    log(e.getMessage());
405
                }
406
            }
407
 
408
            if (itemIds == null) {
409
                continue;
410
            }
411
            for (Long itemId : itemIds) {
412
                if (itemId == null) {
413
                    continue;
414
                }
415
                if (!isCatalogIdEvent) {
416
                    if (itemsMap.containsKey(itemId)) {
417
                        itemId = itemsMap.get(itemId).getCatalogId();
418
                    }
419
                }
420
                String key = paidFirstSource + "_" + firstSource + "_"
421
                    + paidSessionSource + "_" + sessionSource + "_"
422
                    + itemId;
423
                if (itemsResultMap.containsKey(key)) {
424
                    Map<String, Long> itemMap = itemsResultMap.get(key);
425
                    if (itemMap.containsKey(countKey)) {
426
                        Long count = itemMap.get(countKey);
427
                        itemMap.put(countKey, ++count);
428
                    }
429
                    else {
430
                        itemMap.put(countKey, 1l);
431
                    }
432
                }
433
                else {
434
                    Map<String, Long> itemMap = new HashMap<String, Long>();
435
                    itemMap.put(countKey, 1l);
436
                    itemsResultMap.put(key, itemMap);
437
                }
438
                String uniqueKey = sessionId + itemId;
439
                if (!uniqueSet.contains(uniqueKey)) {
440
                    Map<String, Long> itemMap = itemsResultMap.get(key);
441
                    if (itemMap.containsKey(uniqueCountKey)) {
442
                        Long count = itemMap.get(uniqueCountKey);
443
                        itemMap.put(uniqueCountKey, ++count);
444
                    }
445
                    else {
446
                        itemMap.put(uniqueCountKey, 1l);
447
                    }
448
                    uniqueSet.add(uniqueKey);
449
                }
450
            }
451
        }
452
    }
453
}