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); }
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); }
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); }
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)); } }