Exemplo n.º 1
0
        private StatisticTotal GetStatisticTotal(StatisticFunc statisticFunc, DateTime?from, DateTime?to)
        {
            var caches  = statisticCacheService.GetStatisticCaches(statisticFunc, from, to);
            var senders = messageService.GetAllSenders();

            return(new StatisticTotal()
            {
                Total = caches.Sum(o => o.TotalsForSenders.Sum(o => o.Value)),
                Senders = senders.ToDictionary(s => s.Id, s => SenderDTO.From(s)),
                TotalForSenders = senders.ToDictionary(s => s.Id, s => caches.Sum(o => o.TotalsForSenders[s.Id]))
            });
        }
Exemplo n.º 2
0
        public MessageDTO GetFirstMessageOfDayBefore(DateTime dateTime)
        {
            var message = this.messageService.GetFirstMessageOfDayBefore(dateTime);

            if (message == null)
            {
                return(null);
            }
            return(new MessageDTO()
            {
                Id = message.Id,
                Sender = SenderDTO.From(message.Sender),
                IsMedia = message.IsMedia,
                SentDateTime = message.SentDateTime,
                Text = message.Text
            });
        }
Exemplo n.º 3
0
        public List <MessageDTO> GetMessages(int fromId, int toId)
        {
            if (fromId > toId)
            {
                var temp = fromId;
                fromId = toId;
                toId   = temp;
            }

            return(messageService.GetMessages(fromId, toId).Select(o => new MessageDTO()
            {
                Id = o.Id,
                Sender = SenderDTO.From(o.Sender),
                SentDateTime = o.SentDateTime,
                Text = o.Text,
                IsMedia = o.IsMedia
            }).ToList());
        }
Exemplo n.º 4
0
        public async Task <bool> CreateSender(SenderDTO sender)
        {
            HttpClient client = new HttpClient();

            client.BaseAddress = new Uri(API.url + "Senders/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpContent         httpobject = new StringContent(JsonConvert.SerializeObject(sender), Encoding.UTF8, "application/json");
            var                 id         = sender.SenderID;
            HttpResponseMessage response   = await client.PostAsync("", httpobject).ConfigureAwait(false);

            var expected = (int)HttpStatusCode.OK;

            if (expected == (int)response.StatusCode)
            {
                return(true);
            }
            return(false);
        }
Exemplo n.º 5
0
        public async Task <SenderDTO> GetSender(long senderID)
        {
            HttpClient client = new HttpClient();

            client.BaseAddress = new Uri(API.url + "Senders/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            SenderDTO           sender   = null;
            HttpResponseMessage response = await client.GetAsync(senderID.ToString()).ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                sender = JsonConvert.DeserializeObject <SenderDTO>(responseString);
                return(sender);
            }
            return(null);
        }
Exemplo n.º 6
0
        private static async Task RunUpdateSender(long id)
        {
            var sender = new SenderDTO
            {
                SenderID   = id,
                SenderName = "thepiratebay.com",
                UserName   = "******",
                SenderURL  = "updated.se"
            };

            try
            {
                var result = Task.Run(() => SenderAPI.UpdateSender(sender));
            }catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.WriteLine("Updated sender");
            Console.WriteLine("Press enter..");
            Console.ReadLine();
            RunGetSender(id).Wait();
        }
Exemplo n.º 7
0
        private Statistic Get(StatisticFunc statisticFunc, List <Sender> senders, DateTime?fromDate, DateTime?toDate, string groupingPeriod)
        {
            List <DateTime> timePeriods;
            Dictionary <int, List <float> > valuesBySendersOnTimePeriods;

            if (groupingPeriod == "timeOfDay" || groupingPeriod == "hour")
            {
                var filteredMessages = messageService.GetAllMessages().FilterDateRange(fromDate, toDate).ToList();


                Func <Message, DateTime> groupingSelector = null;
                switch (groupingPeriod)
                {
                case "timeOfDay":
                    groupingSelector = o => new DateTime(2021, 1, 1, o.SentDateTime.Hour, 0, 0);
                    break;

                case "hour":
                    groupingSelector = o => new DateTime(o.SentDateTime.Year, o.SentDateTime.Month, o.SentDateTime.Day, o.SentDateTime.Hour, 0, 0);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("Grouping period cannot be: " + groupingPeriod);
                }

                var tp = timePeriods = filteredMessages.GroupBy(groupingSelector).Distinct().Select(o => o.Key).OrderBy(o => o).ToList();

                valuesBySendersOnTimePeriods =
                    senders
                    .ToDictionary(o => o.Id, o => tp
                                  .Select(p => filteredMessages
                                          .AsQueryable()
                                          .Filter(o)
                                          .Where(o => groupingSelector(o) == p))
                                  .AsParallel()
                                  .AsOrdered()
                                  .Select(i => (float)statisticFunc.Func(i))
                                  .ToList());
            }
            else
            {
                var caches = statisticCacheService.GetStatisticCaches(statisticFunc, fromDate, toDate);

                Func <StatisticCacheDTO, DateTime> groupingSelector = null;
                switch (groupingPeriod)
                {
                case "date":
                    groupingSelector = o => o.ForDate;
                    break;

                case "week":
                    groupingSelector = o => o.ForDate.AddDays(-(((int)o.ForDate.DayOfWeek + 6) % 7));
                    break;

                case "month":
                    groupingSelector = o => new DateTime(o.ForDate.Year, o.ForDate.Month, 1);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("Grouping period cannot be: " + groupingPeriod);
                }

                var tp = timePeriods = caches.AsEnumerable().GroupBy(groupingSelector).Distinct().Select(o => o.Key).OrderBy(o => o).ToList();

                valuesBySendersOnTimePeriods =
                    senders
                    .ToDictionary(o => o.Id, s => timePeriods
                                  .Select(p => caches
                                          .Where(o => groupingSelector(o) == p)
                                          .Sum(o => (float)o.TotalsForSenders[s.Id]))
                                  .ToList());
            }

            // izbaci sve dane/sate/tjedne/mjesece u kojima ima totalno 0 poruka/rijeci/znakova
            for (int i = 0; i < timePeriods.Count; i++)
            {
                if (valuesBySendersOnTimePeriods.Sum(o => o.Value[i]) == 0)
                {
                    timePeriods.RemoveAt(i);
                    valuesBySendersOnTimePeriods.ForEach(o => o.Value.RemoveAt(i));
                    i--;
                }
            }

            var          totalBySenders      = valuesBySendersOnTimePeriods.ToDictionary(o => o.Key, o => o.Value.Sum());
            var          total               = totalBySenders.Values.Sum();
            List <float> totalsOnTimePeriods = new List <float>();

            for (int i = 0; i < timePeriods.Count; i++)
            {
                totalsOnTimePeriods.Add(valuesBySendersOnTimePeriods.Sum(o => o.Value[i]));
            }

            var result = new Statistic()
            {
                Total  = total,
                Filter = new Filter()
                {
                    FromDate       = fromDate,
                    ToDate         = toDate,
                    GroupingPeriod = groupingPeriod,
                    Per            = "none"
                },
                Senders        = senders.ToDictionary(s => s.Id, s => SenderDTO.From(s)),
                TotalBySenders = totalBySenders,
                TimePeriods    = timePeriods,
                ValuesBySendersOnTimePeriods = valuesBySendersOnTimePeriods,
                TotalsOnTimePeriods          = totalsOnTimePeriods,
                StatisticName = statisticFunc.Name
            };

            return(result);
        }
Exemplo n.º 8
0
        public EmojiInfoTotal GetEmojiInfoTotal([FromQuery] Filter filter)
        {
            var messages = messageService.GetAllMessages().FilterDateRange(filter.FromDate, filter.ToDate).ToList();

            var result = new Dictionary <string, Dictionary <int, int> >();

            var tasks       = new List <Task>();
            var taskResults = new ConcurrentBag <Dictionary <string, Dictionary <int, int> > >();

            var batchSize = messages.Count / Environment.ProcessorCount;

            for (int i = 0; i < messages.Count; i += batchSize)
            {
                var start = i;
                var size  = batchSize;
                if (messages.Count - i - batchSize < batchSize / 2)
                {
                    size = messages.Count - i;
                    i   += size - batchSize;
                }

                tasks.Add(new Task(() =>
                {
                    taskResults.Add(GetEmojiInfoTotal(messages.Skip(start).Take(size)));
                }));
            }

            tasks.ForEach(t => t.Start());
            Task.WaitAll(tasks.ToArray());

            foreach (var item in taskResults)
            {
                foreach (var emoji in item)
                {
                    if (!result.TryGetValue(emoji.Key, out Dictionary <int, int> dictionary))
                    {
                        result.Add(emoji.Key, dictionary = new Dictionary <int, int>());
                    }

                    foreach (var sender in emoji.Value)
                    {
                        if (!dictionary.TryGetValue(sender.Key, out int count))
                        {
                            dictionary.Add(sender.Key, count = 0);
                        }

                        count += sender.Value;
                        dictionary[sender.Key] = count;
                    }
                }
            }

            var senders = messageService.GetAllSenders();

            return(new EmojiInfoTotal()
            {
                EmojiInfos = result.OrderByDescending(o => o.Value.Sum(i => i.Value)).ThenBy(o => o.Key).Select(o => new EmojiInfo()
                {
                    Total = o.Value.Sum(i => i.Value),
                    EmojiCodePoints = o.Key,
                    Senders = senders.ToDictionary(o => o.Id, o => SenderDTO.From(o)),
                    BySenders = o.Value
                }).ToList()
            });
        }
Exemplo n.º 9
0
 public List <SenderDTO> GetAllSenders()
 {
     return(this.messageService.GetAllSenders().Select(o => SenderDTO.From(o)).ToList());
 }