Пример #1
0
        public IEnumerable <OnlineTimeline> GetOnlineTimelines(DateTime begin, DateTime end, IEnumerable <long> personIds)
        {
            var metaDataSnapshots = MetaDataSnapshotRepository
                                    .Select(s => s.Provider.Uuid == PersonMetaProviderUuid && s.SnapshotType == (int)VkSnapshotType.Online && begin <= s.Date && end >= s.Date)
                                    .ToArray();

            var personOnlineDataSnapshots = metaDataSnapshots
                                            .GroupBy(s => s.AccountId)
                                            .Select(g => new
            {
                g.First().PersonId,
                AccountId = g.Key,
                Snapshots = g.SelectMany(s => s.GetSnapshots <VkOnlineSnapshot>())
            })
                                            .ToArray();

            return(personOnlineDataSnapshots.Select(os =>
            {
                var orderedSnapshots = os.Snapshots.OrderBy(s => s.Time).ToArray();
                var chunks = new List <OnlineTimeline.Chunk>();
                var timeline = new OnlineTimeline
                {
                    From = orderedSnapshots.FirstOrDefault()?.Time ?? end,
                    PersonId = os.PersonId,
                    AccountId = os.AccountId,
                    Chunks = chunks
                };

                orderedSnapshots.OrderBy(s => s.Time).Feed(
                    (a, b) => a.Type == b.Type && a.LastActivity == b.LastActivity && a.LastActivityPlatformId == b.LastActivityPlatformId && a.LastActivityPlatformType == b.LastActivityPlatformType,
                    snapshots =>
                {
                    var first = snapshots.First();
                    var last = snapshots.Last();
                    var chunk = new OnlineTimeline.Chunk
                    {
                        OnlineType = (int)first.Type,
                        OnlineMeta = $"ApplicationId: {first.ApplicationId}, " +
                                     $"LastActivityPlatformId: {first.LastActivityPlatformId}, " +
                                     $"LastActivityPlatformType: {first.LastActivityPlatformType}, " +
                                     $"LastActivity: {first.LastActivity}",
                        Length = last.Time - first.Time
                    };

                    chunks.Add(chunk);
                });

                return timeline;
            }));
        }
Пример #2
0
        public void FetchOnline(IEnumerable <long> personIds)
        {
            if (personIds == null)
            {
                throw new ArgumentNullException(nameof(personIds));
            }
            if (personIds.Count() > MaxStackSize)
            {
                throw new ArgumentException($"Maximum count is \"{MaxStackSize}\".", nameof(personIds));
            }

            var webResourceId     = WebResourceRepository.Single(r => r.Uuid == WebResourceUuids.Vk, r => r.Id);
            var providerId        = PersonMetaProviderRepository.Single(p => p.Uuid == PersonMetaProviderUuid, p => p.Id);
            var personAccountDict = MetaAccountRepository.Select(a => a.WebResourceId == webResourceId && personIds.Contains(a.PersonId))
                                    .GroupBy(a => a.PersonId)
                                    .ToDictionary(g => g.Key, g => g.Select(a => a.AccountId));

            var allAccountIds             = personAccountDict.SelectMany(pa => pa.Value).ToArray();
            var accountOnlineSnapshotDict = VkApiConnector.FetchOnlineSnapshots(allAccountIds).Result;

            foreach (var accountSnapshot in accountOnlineSnapshotDict)
            {
                var personId        = personAccountDict.First(p => p.Value.Any(a => a == accountSnapshot.Key)).Key;
                var onlineSnapshots = accountOnlineSnapshotDict[accountSnapshot.Key];

                foreach (var onlineSnapshot in onlineSnapshots)
                {
                    var todayOnlineDataSnapshot = MetaDataSnapshotRepository.GetOrFetchDataSnapshot(providerId, personId, accountSnapshot.Key, onlineSnapshot.Time, (int)VkSnapshotType.Online);
                    var snapshots = todayOnlineDataSnapshot.GetSnapshots <VkOnlineSnapshot>().Append(onlineSnapshot).ToArray();

                    todayOnlineDataSnapshot.SetSnapshots(snapshots);
                    MetaDataSnapshotRepository.Save(todayOnlineDataSnapshot);
                }
            }

            UnitOfWork.Commit();
        }