public List <FeedResultItem> GetFeeds(FeedApiFilter filter) { var filterOffset = filter.Offset; var filterLimit = filter.Max > 0 && filter.Max < 1000 ? filter.Max : 1000; var feeds = new Dictionary <string, List <FeedResultItem> >(); var tryCount = 0; List <FeedResultItem> feedsIteration; do { feedsIteration = GetFeedsInternal(filter); foreach (var feed in feedsIteration) { if (feeds.ContainsKey(feed.GroupId)) { feeds[feed.GroupId].Add(feed); } else { feeds[feed.GroupId] = new List <FeedResultItem> { feed }; } } filter.Offset += feedsIteration.Count; } while (feeds.Count < filterLimit && feedsIteration.Count == filterLimit && tryCount++ < 5); filter.Offset = filterOffset; return(feeds.Take(filterLimit).SelectMany(group => group.Value).ToList()); }
public object GetFeed( string product, ApiDateTime from, ApiDateTime to, Guid?author, bool?onlyNew, ApiDateTime timeReaded) { var filter = new FeedApiFilter { Product = product, From = from != null ? from.UtcTime : DateTime.MinValue, To = to != null ? to.UtcTime : DateTime.MaxValue, Offset = (int)context.StartIndex, Max = (int)context.Count - 1, Author = author ?? Guid.Empty, SearchKeys = context.FilterValues, OnlyNew = onlyNew.HasValue && onlyNew.Value }; var feedReadedProvider = new FeedReadedDataProvider(); var lastTimeReaded = feedReadedProvider.GetTimeReaded(); var readedDate = timeReaded != null ? (ApiDateTime)timeReaded.UtcTime : (ApiDateTime)lastTimeReaded; var commentReadedDate = (ApiDateTime)feedReadedProvider.GetTimeReaded("comments"); if (filter.OnlyNew) { filter.From = (ApiDateTime)lastTimeReaded; filter.Max = 100; } else if (timeReaded == null) { feedReadedProvider.SetTimeReaded(); feedReadedProvider.SetTimeReaded("comments"); } var feeds = FeedAggregateDataProvider .GetFeeds(filter) .GroupBy(n => n.GroupId, n => new FeedWrapper(n), (n, group) => { var firstFeed = group.First(); firstFeed.GroupedFeeds = group.Skip(1); return(firstFeed); }) .ToList(); context.SetDataPaginated(); return(new { feeds, readedDate, commentReadedDate }); }
public object GetFeed( string product, ApiDateTime from, ApiDateTime to, Guid?author, bool?onlyNew, ApiDateTime timeReaded) { var filter = new FeedApiFilter { Product = product, Offset = (int)context.StartIndex, Max = (int)context.Count - 1, Author = author ?? Guid.Empty, SearchKeys = context.FilterValues, OnlyNew = onlyNew.HasValue && onlyNew.Value }; if (from != null && to != null) { var f = TenantUtil.DateTimeFromUtc(from.UtcTime); filter.From = new DateTime(f.Year, f.Month, f.Day, 0, 0, 0); var t = TenantUtil.DateTimeFromUtc(to.UtcTime); filter.To = new DateTime(t.Year, t.Month, t.Day, 23, 59, 59); } else { filter.From = from != null ? from.UtcTime : DateTime.MinValue; filter.To = to != null ? to.UtcTime : DateTime.MaxValue; } var feedReadedProvider = new FeedReadedDataProvider(); var lastTimeReaded = feedReadedProvider.GetTimeReaded(); var readedDate = timeReaded != null ? (ApiDateTime)timeReaded.UtcTime : (ApiDateTime)lastTimeReaded; if (filter.OnlyNew) { filter.From = (ApiDateTime)lastTimeReaded; filter.Max = 100; } else if (timeReaded == null) { feedReadedProvider.SetTimeReaded(); newFeedsCountCache.Remove(GetNewFeedsCountKey()); } var feeds = FeedAggregateDataProvider .GetFeeds(filter) .GroupBy(n => n.GroupId, n => new FeedWrapper(n), (n, group) => { var firstFeed = group.First(); firstFeed.GroupedFeeds = group.Skip(1); return(firstFeed); }) .ToList(); context.SetDataPaginated(); return(new { feeds, readedDate }); }
private List <FeedResultItem> GetFeedsInternal(FeedApiFilter filter) { var q = FeedDbContext.FeedAggregates .Where(r => r.Tenant == TenantManager.GetCurrentTenant().TenantId) .Where(r => r.ModifiedBy != AuthContext.CurrentAccount.ID) .Join(FeedDbContext.FeedUsers, a => a.Id, b => b.FeedId, (aggregates, users) => new { aggregates, users }) .Where(r => r.users.UserId == AuthContext.CurrentAccount.ID) .OrderByDescending(r => r.aggregates.ModifiedDate) .Skip(filter.Offset) .Take(filter.Max); if (filter.OnlyNew) { q = q.Where(r => r.aggregates.AggregateDate >= filter.From); } else { if (1 < filter.From.Year) { q = q.Where(r => r.aggregates.ModifiedDate >= filter.From); } if (filter.To.Year < 9999) { q = q.Where(r => r.aggregates.ModifiedDate <= filter.To); } } if (!string.IsNullOrEmpty(filter.Product)) { q = q.Where(r => r.aggregates.Product == filter.Product); } if (filter.Author != Guid.Empty) { q = q.Where(r => r.aggregates.ModifiedBy == filter.Author); } if (filter.SearchKeys != null && filter.SearchKeys.Length > 0) { var keys = filter.SearchKeys .Where(s => !string.IsNullOrEmpty(s)) .Select(s => s.Replace("\\", "\\\\").Replace("%", "\\%").Replace("_", "\\_")) .ToList(); q = q.Where(r => keys.Any(k => r.aggregates.Keywords.StartsWith(k))); } var news = q.Select(r => r.aggregates).ToList(); return(news.Select(r => new FeedResultItem( r.Json, r.Module, r.Author, r.ModifiedBy, r.GroupId, TenantUtil.DateTimeFromUtc(r.CreatedDate), TenantUtil.DateTimeFromUtc(r.ModifiedDate), TenantUtil.DateTimeFromUtc(r.AggregateDate), TenantUtil)) .ToList()); }
private static List <FeedResultItem> GetFeedsInternal(FeedApiFilter filter) { var query = new SqlQuery("feed_aggregate a") .InnerJoin("feed_users u", Exp.EqColumns("a.id", "u.feed_id")) .Select("a.json, a.module, a.author, a.modified_by, a.group_id, a.created_date, a.modified_date, a.aggregated_date") .Where("a.tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) .Where( !Exp.Eq("a.modified_by", SecurityContext.CurrentAccount.ID) & Exp.Eq("u.user_id", SecurityContext.CurrentAccount.ID) ) .OrderBy("a.modified_date", false) .SetFirstResult(filter.Offset) .SetMaxResults(filter.Max); if (filter.OnlyNew) { query.Where(Exp.Ge("a.aggregated_date", filter.From)); } else { if (1 < filter.From.Year) { query.Where(Exp.Ge("a.modified_date", filter.From)); } if (filter.To.Year < 9999) { query.Where(Exp.Le("a.modified_date", filter.To)); } } if (!string.IsNullOrEmpty(filter.Product)) { query.Where("a.product", filter.Product); } if (filter.Author != Guid.Empty) { query.Where("a.modified_by", filter.Author); } if (filter.SearchKeys != null && filter.SearchKeys.Length > 0) { var exp = filter.SearchKeys .Where(s => !string.IsNullOrEmpty(s)) .Select(s => s.Replace("\\", "\\\\").Replace("%", "\\%").Replace("_", "\\_")) .Aggregate(Exp.False, (cur, s) => cur | Exp.Like("a.keywords", s, SqlLike.AnyWhere)); query.Where(exp); } using (var db = new DbManager(Constants.FeedDbId)) { var news = db .ExecuteList(query) .ConvertAll(r => new FeedResultItem( Convert.ToString(r[0]), Convert.ToString(r[1]), new Guid(Convert.ToString(r[2])), new Guid(Convert.ToString(r[3])), Convert.ToString(r[4]), TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[5])), TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[6])), TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[7])))); return(news); } }
private static List<FeedResultItem> GetFeedsInternal(FeedApiFilter filter) { var query = new SqlQuery("feed_aggregate a") .InnerJoin("feed_users u", Exp.EqColumns("a.id", "u.feed_id")) .Select("a.json, a.module, a.author, a.modified_by, a.group_id, a.created_date, a.modified_date, a.aggregated_date") .Where("a.tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) .Where( !Exp.Eq("a.modified_by", SecurityContext.CurrentAccount.ID) & Exp.Eq("u.user_id", SecurityContext.CurrentAccount.ID) ) .OrderBy("a.modified_date", false) .SetFirstResult(filter.Offset) .SetMaxResults(filter.Max); if (filter.OnlyNew) { query.Where(Exp.Ge("a.aggregated_date", filter.From)); } else { if (1 < filter.From.Year) { query.Where(Exp.Ge("a.modified_date", filter.From)); } if (filter.To.Year < 9999) { query.Where(Exp.Le("a.modified_date", filter.To)); } } if (!string.IsNullOrEmpty(filter.Product)) { query.Where("a.product", filter.Product); } if (filter.Author != Guid.Empty) { query.Where("a.modified_by", filter.Author); } if (filter.SearchKeys != null && filter.SearchKeys.Length > 0) { var exp = filter.SearchKeys .Where(s => !string.IsNullOrEmpty(s)) .Select(s => s.Replace("\\", "\\\\").Replace("%", "\\%").Replace("_", "\\_")) .Aggregate(Exp.False, (cur, s) => cur | Exp.Like("a.keywords", s, SqlLike.AnyWhere)); query.Where(exp); } using (var db = new DbManager(Constants.FeedDbId)) { var news = db .ExecuteList(query) .ConvertAll(r => new FeedResultItem( Convert.ToString(r[0]), Convert.ToString(r[1]), new Guid(Convert.ToString(r[2])), new Guid(Convert.ToString(r[3])), Convert.ToString(r[4]), TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[5])), TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[6])), TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[7])))); return news; } }
public static List<FeedResultItem> GetFeeds(FeedApiFilter filter) { var filterOffset = filter.Offset; var filterLimit = filter.Max > 0 && filter.Max < 1000 ? filter.Max : 1000; var feeds = new Dictionary<string, List<FeedResultItem>>(); var tryCount = 0; List<FeedResultItem> feedsIteration; do { feedsIteration = GetFeedsInternal(filter); foreach (var feed in feedsIteration) { if (feeds.ContainsKey(feed.GroupId)) { feeds[feed.GroupId].Add(feed); } else { feeds[feed.GroupId] = new List<FeedResultItem> { feed }; } } filter.Offset += feedsIteration.Count; } while (feeds.Count < filterLimit && feedsIteration.Count == filterLimit && tryCount++ < 5); filter.Offset = filterOffset; return feeds.Take(filterLimit).SelectMany(group => group.Value).ToList(); }