Subversion Repositories SmartDukaan

Rev

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