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])) }); }
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 }); }
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()); }
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); }
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); }
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(); }
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); }
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() }); }
public List <SenderDTO> GetAllSenders() { return(this.messageService.GetAllSenders().Select(o => SenderDTO.From(o)).ToList()); }