private VisitizeReducer()
        {
            DateTime dt = DateTime.Parse(@"2016-09-02 06:00:00").AddMinutes(60);

            endOfDelta = dt.Ticks;
            sessionTimeoutThreshold = VisitizationUtils.GetTickesFromMinutes(sessionTimeoutThreshold.ToString());
        }
        private static SAEventConversionFacts BuildVisitEventGroupFromEventsList(long sessionTimeoutThreshold, long endOfDelta, List <UETEvent> uetEvents, int maxEventsPerVisit, int maxVisitsPerIPTag)
        {
            var factObject = new SAEventConversionFacts {
                Visits = new List <Visit>()
            };

            long   prevDateTime = 0;
            string prevReferrer = string.Empty;

            foreach (var uetEvent in uetEvents)
            {
                if (!VisitizationUtils.AreEventGroupsInTheSameVisit(uetEvent, prevDateTime, prevReferrer, sessionTimeoutThreshold))
                {
                    // Not the same group, Create a new Visit and add this event to be the first one.

                    if (factObject.Visits.Count == maxVisitsPerIPTag)
                    {
                        // Visits within the IPTag already reach the limit, we should break and stop adding new Visits.
                        break;
                    }

                    // Create a new Visit and add it to the Visits list
                    var visitId = VisitizationUtils.GenerateVisitId(
                        uetEvent.ANID == null ? null : (Guid?)uetEvent.ANID.ToSystemGuid(),
                        uetEvent.MUID == null ? null : (Guid?)uetEvent.MUID.ToSystemGuid(),
                        uetEvent.EventDateTime,
                        uetEvent.ReferrerURL);

                    var newVisit = InitializeNewVisit(visitId, uetEvent.EventDateTime, sessionTimeoutThreshold, endOfDelta);
                    newVisit.Events.Add(uetEvent);
                    factObject.Visits.Add(newVisit);
                }
                else
                {
                    // Add the event to the last Visit in the Visits list
                    var lastVisit = factObject.Visits[factObject.Visits.Count - 1];
                    if (lastVisit.Events.Count < maxEventsPerVisit)
                    {
                        lastVisit.Events.Add(uetEvent);
                    }
                }

                prevDateTime = uetEvent.EventDateTime;
                prevReferrer = uetEvent.ReferrerURL;
            }

            return(factObject);
        }
        public string GetData(string line)
        {
            if (string.IsNullOrEmpty(line))
            {
                return(null);
            }
            else
            {
                AppInstallVisitsSchema output = new AppInstallVisitsSchema();
                UETLogView             data   = UETLogView.Deserialize(line);
                output.AppInstallClickId = data.AppInstallClickId;

                var eventDataTime = data.EventDateTime;
                var anid          = data.ANID;
                var muid          = data.MUID;
                var referrerUrl   = data.ReferrerURL;

                var visit = new Visit();
                visit.VisitId = VisitizationUtils.GenerateVisitId(anid, muid, eventDataTime, referrerUrl);

                var uetEvent = new UETEvent();
                uetEvent.EventDateTime    = eventDataTime;
                uetEvent.ANID             = anid == null ? null : new GUID(anid.Value);
                uetEvent.MUID             = muid == null ? null : new GUID(muid.Value);
                uetEvent.ReferrerURL      = referrerUrl;
                uetEvent.PageTitle        = data.PageTitle;
                uetEvent.NavigatedFromURL = data.NavigatedFromURL;
                uetEvent.GoalValue        = data.GoalValue;
                uetEvent.PageLoad         = data.PageLoad;
                uetEvent.Version          = data.Version;
                uetEvent.LogServerName    = data.LogServerName;
                uetEvent.EventType        = data.EventType;

                visit.Events = new List <UETEvent> {
                    uetEvent
                };

                visit.Statistic = new VisitStatistic {
                    VisitStartDateTime = eventDataTime
                };
                output.Visit = visit;
                return(AppInstallVisitsSchema.Serialize(output));
            }
        }