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);
        }
        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);
        }
Exemple #3
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);
        }
Exemple #4
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);
        }
Exemple #5
0
        public List <T> GetTopX <T>(Webpage parent, int numberOfPages, int lastXHours = 24) where T : Webpage
        {
            var cacheKey = string.Format("get-most-read-articles.{0}.{1}.{2}", parent?.Id ?? -_site.Id, numberOfPages,
                                         lastXHours);

            using (MiniProfiler.Current.Step("Getting most read articles for key - " + cacheKey))
                lock (LockObject)
                {
                    return(_cacheManager.Get(
                               cacheKey,
                               () =>
                    {
                        var now = CurrentRequestData.Now;

                        var fromDate = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0).AddHours(-lastXHours);

                        var pageTypes =
                            TypeHelper.GetAllConcreteTypesAssignableFrom <T>().Select(x => x.FullName).ToList();

                        AnalyticsPageView pageView = null;
                        Webpage webpageAlias = null;

                        var queryOver = _statelessSession.QueryOver(() => pageView)
                                        .JoinAlias(() => pageView.Webpage, () => webpageAlias, JoinType.LeftOuterJoin);

                        // Filter by last x hours
                        queryOver = queryOver.Where(() => pageView.CreatedOn >= fromDate);

                        queryOver =
                            queryOver.Where(
                                () => webpageAlias.DocumentType.IsIn(pageTypes));

                        // Remove unpublished and deleted items
                        queryOver = queryOver.Where(() => webpageAlias.Published && !webpageAlias.IsDeleted);

                        if (parent != null)
                        {
                            queryOver =
                                queryOver.WithSubquery.WhereProperty(x => x.Webpage.Id)
                                .In(QueryOver.Of <AnalyticsHierarchyInfo>()
                                    .Where(x => x.Parent.Id == parent.Id)
                                    .Select(x => x.Page.Id));
                        }
                        else
                        {
                            queryOver.Where(() => webpageAlias.Site.Id == _site.Id);
                        }

                        // Get uniques - sort

                        var ids = queryOver
                                  .Select(Projections.Group <AnalyticsPageView>(view => view.Webpage.Id))
                                  .OrderBy(Projections.Count(() => pageView.Webpage.Id)).Desc
                                  .Take(numberOfPages)
                                  .Cacheable()
                                  .List <int>().ToList();

                        return _statelessSession.QueryOver <T>()
                        .Where(x => x.Id.IsIn(ids))
                        .Fetch(x => x.Parent).Eager
                        .Fetch(x => x.Site).Eager
                        .Cacheable()
                        .List()
                        .OrderBy(article => ids.IndexOf(article.Id))
                        .ToList();
                    }, TimeSpan.FromMinutes(1800), CacheExpiryType.Absolute));
                }
        }