public void LogPageView(PageViewInfo info)
        {
            User          user          = _getCurrentUser.Get();
            var           site          = _session.Get <Site>(_site.Id);
            DateTime      now           = CurrentRequestData.Now;
            AnalyticsUser analyticsUser = GetCurrentUser(user == null ? info.User : user.Guid);
            bool          userIsNew     = analyticsUser == null;

            if (userIsNew)
            {
                analyticsUser = new AnalyticsUser
                {
                    User      = user,
                    CreatedOn = now,
                    UpdatedOn = now,
                };
                analyticsUser.SetGuid(info.User);
                _session.Insert(analyticsUser);
            }
            AnalyticsSession analyticsSession = GetCurrentSession(info.Session);
            bool             sessionIsNew     = analyticsSession == null;

            if (sessionIsNew)
            {
                analyticsSession = new AnalyticsSession
                {
                    AnalyticsUser = analyticsUser,
                    IP            = _request.GetCurrentIP(),
                    UserAgent     = _request.UserAgent,
                    Site          = site,
                    CreatedOn     = now,
                    UpdatedOn     = now,
                };
                analyticsSession.SetGuid(info.Session);
                _session.Insert(analyticsSession);
            }

            var pageView = new AnalyticsPageView
            {
                Webpage          = GetWebpage(info.Url),
                Url              = info.Url,
                AnalyticsSession = analyticsSession,
                Site             = site,
                CreatedOn        = now,
                UpdatedOn        = now,
            };

            _session.Insert(pageView);
        }
Example #2
0
        private void CheckEmail(AnalyticsUser analyticsUser, DateTime now)
        {
            var result = _getEmailFromRequest.GetEmail(_context);

            if (!result.CouldLookup)
            {
                return;
            }

            if (!string.IsNullOrWhiteSpace(result.Email))
            {
                analyticsUser.Email = result.Email;
            }
            else
            {
                analyticsUser.DateLastChecked = now;
            }
            _session.Transact(session => session.Update(analyticsUser));
        }
        public static int TotalViewsFor(this HtmlHelper helper, Webpage webpage)
        {
            if (webpage == null)
            {
                return(0);
            }

            var session = helper.ViewContext.HttpContext.Get <ISession>();

            AnalyticsPageView pageView         = null;
            AnalyticsSession  analyticsSession = null;
            AnalyticsUser     analyticsUser    = null;
            IQueryOver <AnalyticsPageView, AnalyticsPageView> queryOver = session.QueryOver(() => pageView)
                                                                          .JoinAlias(() => pageView.AnalyticsSession, () => analyticsSession)
                                                                          .JoinAlias(() => analyticsSession.AnalyticsUser, () => analyticsUser)
                                                                          .Where(x => x.Webpage.Id == webpage.Id);


            PageViewResult result     = null;
            var            viewResult = queryOver
                                        .SelectList(builder =>
                                                    builder
                                                    .SelectGroup(() => pageView.Url)
                                                    .WithAlias(() => result.Url)
                                                    .SelectGroup(() => pageView.Webpage.Id)
                                                    .WithAlias(() => result.WebpageId)
                                                    .SelectCountDistinct(() => analyticsUser.Id)
                                                    .WithAlias(() => result.Unique)
                                                    .SelectCountDistinct(() => analyticsSession.Id)
                                                    .WithAlias(() => result.Sessions)
                                                    .SelectCountDistinct(() => pageView.Id)
                                                    .WithAlias(() => result.Total)
                                                    )
                                        .TransformUsing(Transformers.AliasToBean <PageViewResult>())
                                        .Take(1).SingleOrDefault <PageViewResult>();

            return(viewResult == null ? 0 : viewResult.Total);
        }
Example #4
0
        protected override void OnExecute()
        {
            AnalyticsUser analyticsUser = null;
            var           date          = CurrentRequestData.Now.AddDays(-_settings.DaysToKeep);
            var           sessions      = _session.QueryOver <AnalyticsSession>()
                                          .JoinAlias(x => x.AnalyticsUser, () => analyticsUser)
                                          .Where(() => analyticsUser.Email == null && analyticsUser.User == null)
                                          .And(x => x.CreatedOn < date)
                                          //.OrderBy(x => x.CreatedOn).Desc no need to order by + timing out over large dataset
                                          .Take(_settings.SessionsToClear)
                                          .List();

            var ids   = sessions.Select(x => x.Id).ToList();
            var views = _session.QueryOver <AnalyticsPageView>()
                        .Where(x => x.AnalyticsSession.Id.IsIn(ids))
                        .List();

            _session.Transact(session =>
            {
                views.ForEach(session.Delete);
                sessions.ForEach(session.Delete);
            });
        }
Example #5
0
        public IPagedList <PageViewResult> Search(PageViewSearchQuery query)
        {
            AnalyticsPageView pageView         = null;
            AnalyticsSession  analyticsSession = null;
            AnalyticsUser     analyticsUser    = null;
            IQueryOver <AnalyticsPageView, AnalyticsPageView> queryOver = _session.QueryOver(() => pageView)
                                                                          .JoinAlias(() => pageView.AnalyticsSession, () => analyticsSession)
                                                                          .JoinAlias(() => analyticsSession.AnalyticsUser, () => analyticsUser);

            if (!string.IsNullOrWhiteSpace(query.Url))
            {
                queryOver = queryOver.Where(view => view.Url.IsInsensitiveLike(query.Url, MatchMode.Anywhere));
            }

            queryOver = queryOver.Where(() => pageView.CreatedOn >= query.From && pageView.CreatedOn <= query.To);

            switch (query.SearchType)
            {
            case PageViewSearchType.UsersOnly:
                queryOver = queryOver.Where(() => analyticsUser.User != null);
                break;

            case PageViewSearchType.AnonymousOnly:
                queryOver = queryOver.Where(() => analyticsUser.User == null);
                break;
            }

            PageViewResult result = null;
            IPagedList <PageViewResult> pageViewResults = queryOver
                                                          .SelectList(builder =>
                                                                      builder
                                                                      .SelectGroup(() => pageView.Url)
                                                                      .WithAlias(() => result.Url)
                                                                      .SelectGroup(() => pageView.Webpage.Id)
                                                                      .WithAlias(() => result.WebpageId)
                                                                      .SelectCountDistinct(() => analyticsUser.Id)
                                                                      .WithAlias(() => result.Unique)
                                                                      .SelectCountDistinct(() => analyticsSession.Id)
                                                                      .WithAlias(() => result.Sessions)
                                                                      .SelectCountDistinct(() => pageView.Id)
                                                                      .WithAlias(() => result.Total)
                                                                      )
                                                          .TransformUsing(Transformers.AliasToBean <PageViewResult>())
                                                          .OrderBy(Projections.CountDistinct(() => analyticsUser.Id)).Desc
                                                          .ThenBy(Projections.CountDistinct(() => analyticsSession.Id)).Desc
                                                          .ThenBy(Projections.CountDistinct(() => pageView.Id)).Desc
                                                          .Paged <AnalyticsPageView, PageViewResult>(Projections.CountDistinct(() => pageView.Url), query.Page, enableCache: false); //todo enable cache when Nhibernate is updated to 4.1

            List <int?> ids = pageViewResults.Select(viewResult => viewResult.WebpageId).Where(i => i.HasValue).ToList();
            Dictionary <int, Webpage> webpages =
                _session.QueryOver <Webpage>()
                .Where(webpage => webpage.Id.IsIn(ids))
                .Cacheable()
                .List()
                .ToDictionary(webpage => webpage.Id, webpage => webpage);

            foreach (PageViewResult pageViewResult in pageViewResults)
            {
                if (!pageViewResult.WebpageId.HasValue)
                {
                    continue;
                }
                if (!webpages.ContainsKey(pageViewResult.WebpageId.Value))
                {
                    continue;
                }
                pageViewResult.WebpageName = webpages[pageViewResult.WebpageId.Value].Name;
            }

            return(pageViewResults);
        }
Example #6
0
        public void LogPageView(PageViewInfo info)
        {
            User          user          = _getCurrentUser.Get();
            var           site          = _session.Get <Site>(_site.Id);
            DateTime      now           = CurrentRequestData.Now;
            AnalyticsUser analyticsUser = GetUser(user == null ? info.User : user.Guid);
            bool          userIsNew     = analyticsUser == null;

            if (userIsNew)
            {
                analyticsUser = new AnalyticsUser
                {
                    User      = user,
                    CreatedOn = now,
                    UpdatedOn = now,
                };
                analyticsUser.SetGuid(info.User);
                _session.Insert(analyticsUser);
            }

            if (analyticsUser.RequiresEmailCheck && _getEmailFromRequest.CanCheck)
            {
                CheckEmail(analyticsUser, now);
            }

            AnalyticsSession analyticsSession = GetCurrentSession(info.Session);
            bool             sessionIsNew     = analyticsSession == null;
            var changedResult = _context.AnalyticsUserGuidHasChanged();

            if (sessionIsNew)
            {
                analyticsSession = new AnalyticsSession
                {
                    AnalyticsUser = analyticsUser,
                    IP            = _context.GetCurrentIP(),
                    UserAgent     = _context.Request.UserAgent,
                    Site          = site,
                    CreatedOn     = now,
                    UpdatedOn     = now,
                };
                analyticsSession.SetGuid(info.Session);
                _session.Insert(analyticsSession);
            }
            // only move it if it's going to a live user
            else if (changedResult.Changed && analyticsUser.User != null)
            {
                UpdateOldUsersSessions(changedResult, analyticsSession, analyticsUser);
            }

            var pageView = new AnalyticsPageView
            {
                Webpage          = GetWebpage(info.Url),
                Url              = info.Url,
                AnalyticsSession = analyticsSession,
                Site             = site,
                CreatedOn        = now,
                UpdatedOn        = now,
            };

            _session.Insert(pageView);
        }
Example #7
0
        private void UpdateOldUsersSessions(AnalyticsHttpContextExtensions.AnalyticsUserChangedResult changedResult, AnalyticsSession analyticsSession, AnalyticsUser analyticsUser)
        {
            if (!changedResult.OldGuid.HasValue || analyticsUser.Guid == changedResult.OldGuid.Value)
            {
                return;
            }

            _session.Transact(session =>
            {
                analyticsSession.AnalyticsUser = analyticsUser;
                _session.Update(analyticsSession);

                var oldUser = GetUser(changedResult.OldGuid.Value);
                if (oldUser != null && oldUser.Id != analyticsUser.Id)
                {
                    // this must have been the current user, so move over their sessions
                    var analyticsSessions =
                        _session.QueryOver <AnalyticsSession>().Where(x => x.AnalyticsUser.Id == oldUser.Id).List();
                    foreach (var entity in analyticsSessions)
                    {
                        entity.AnalyticsUser = analyticsUser;
                        _session.Update(entity);
                    }
                    _session.Delete(oldUser);
                }
            });
        }