public AccountUsedLimitsTodayDataInfo GetUsedTodayTariffLimit(AccountDbContext context) { CheckForNewCurrentDataRow(context); var result = new AccountUsedLimitsTodayDataInfo() { EventRequests = DataTotal.EventsRequests + DataCurrent.EventsRequests, EventsSize = DataTotal.EventsSize + DataCurrent.EventsSize, UnitTestsRequests = DataTotal.UnitTestsRequests + DataCurrent.UnitTestsRequests, UnitTestsSize = DataTotal.UnitTestsSize + DataCurrent.UnitTestsSize, LogSize = DataTotal.LogSize + DataCurrent.LogSize, MetricRequests = DataTotal.MetricsRequests + DataCurrent.MetricsRequests, MetricsSize = DataTotal.MetricsSize + DataCurrent.MetricsSize, SmsCount = DataTotal.SmsCount + DataCurrent.SmsCount }; var tempData = new LimitDataArchiveItem(); foreach (var data in DataTotal.UnitTestData.ToList()) { tempData.GetUnitTestData(data.Key).ResultsCount += data.Value.ResultsCount; } foreach (var data in DataCurrent.UnitTestData.ToList()) { tempData.GetUnitTestData(data.Key).ResultsCount += data.Value.ResultsCount; } result.UnitTestsResults = tempData.UnitTestData.Select(t => new AccountUsedLimitsUnitTestDataInfo() { UnitTestId = t.Key, ApiChecksResults = t.Value.ResultsCount }).ToArray(); return(result); }
protected void RecalcDataTotal(AccountDbContext context) { LimitDataArchiveItem[] rows; lock (DataArchiveLockObject) { var dataArchive = GetDataArchive(context); rows = dataArchive.Where(t => t.BeginDate >= Now.Date).ToArray(); } // Рассчитаем суммарные значения по истории за сегодня var newDataTotal = new LimitDataArchiveItem(); newDataTotal.EventsRequests = rows.Sum(t => t.EventsRequests); newDataTotal.EventsSize = rows.Sum(t => t.EventsSize); newDataTotal.UnitTestsRequests = rows.Sum(t => t.UnitTestsRequests); newDataTotal.UnitTestsSize = rows.Sum(t => t.UnitTestsSize); newDataTotal.MetricsRequests = rows.Sum(t => t.MetricsRequests); newDataTotal.MetricsSize = rows.Sum(t => t.MetricsSize); newDataTotal.LogSize = rows.Sum(t => t.LogSize); newDataTotal.SmsCount = rows.Sum(t => t.SmsCount); // Рассчитаем суммарные данные по проверкам // Сначала суммируем все несохранённые данные из архива в памяти foreach (var row in rows.Where(t => t.Id == Guid.Empty).ToArray()) { foreach (var unitTestData in row.UnitTestData) { var totalData = newDataTotal.GetUnitTestData(unitTestData.Key); totalData.ResultsCount += unitTestData.Value.ResultsCount; } } // И добавляем к ним сохранённые данные из архива в базе var repository = context.GetLimitDataForUnitTestRepository(); var archiveFromDb = repository.GetGroupedByUnitTest(Now.Date); foreach (var row in archiveFromDb) { var totalData = newDataTotal.GetUnitTestData(row.Item1); totalData.ResultsCount += row.Item2; } DataTotal = newDataTotal; // Рассчитаем суммарные данные за всю историю OverallArchive = GetUsedLimitsTotalData(context); }
protected void CheckForNewCurrentDataRow(AccountDbContext context) { var needRecalc = false; lock (DataArchiveLockObject) { // Загрузим архив, если его ещё нет if (_dataArchive == null) { RecalcDataTotal(context); } // Проверим, не пора ли переместить текущую запись в архив и создать новую if (Now >= DataCurrent.EndDate) { var dataArchive = GetDataArchive(context); var newArchiveItem = new LimitDataArchiveItem() { Id = DataCurrent.Id, BeginDate = DataCurrent.BeginDate, EndDate = DataCurrent.EndDate, EventsRequests = DataCurrent.EventsRequests, EventsSize = DataCurrent.EventsSize, LogSize = DataCurrent.LogSize, MetricsRequests = DataCurrent.MetricsRequests, MetricsSize = DataCurrent.MetricsSize, UnitTestsRequests = DataCurrent.UnitTestsRequests, UnitTestsSize = DataCurrent.UnitTestsSize, UnitTestData = DataCurrent.UnitTestData, SmsCount = DataCurrent.SmsCount }; dataArchive.Add(newArchiveItem); DataCurrent = GetNewCurrentDataRow(); needRecalc = true; } } if (needRecalc) { RecalcDataTotal(context); } }