Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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 });
        }
Exemplo n.º 3
0
        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 });
        }
Exemplo n.º 4
0
        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();
        }