public static long CountEntries() { var thisContext = new MeterReadingTableStorageContext("aqualiameterdata"); return(thisContext.CountEntries()); }
public string Read(bool bWrap) { _currentContext = new SQLAzureDataContext(); var meterId = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "elementId") != 0 ? _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value : string.Empty; var start = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "start") ? DateTime.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value) : DateTime.MinValue; var end = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "end") ? DateTime.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value) : DateTime.MaxValue; long timestep = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "timeStep") ? Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1; var resultTxt = new StringBuilder(); var elementText = "<elementId>" + meterId + "</elementId>"; var site = _currentContext.Meters.FirstOrDefault(x => x.MeterIdentity == meterId)?.DMA.Site; if (!string.IsNullOrEmpty(meterId) && site != null) { var thisContext = new MeterReadingTableStorageContext(site.TableName); if (timestep == -1) { var finalFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, meterId); if (start != DateTime.MinValue) { var date1 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, start.Ticks.ToString()); finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date1); } if (end != DateTime.MaxValue) { var date2 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, end.Ticks.ToString()); finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date2); } var allRecords = thisContext.MeterReadingsFiltered(finalFilter); foreach (var record in allRecords) { resultTxt.Append("<record>" + $"<time>{record.CreatedOn.ToString("yyyy-MM-ddTHH:mm:sszzz")}</time><variable name=\"flow\">" + $"<value>{record.Reading}</value></variable>" + $"</record>{Environment.NewLine}"); } } else { const long multiplier = 10000000; long timestepTicks = timestep * multiplier; long numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks); int numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks); // Create a collection of fixed blocks in time from supplied Start to End var dateTimeBlockSet = new List <DateTimeBlock>(); for (var blockIndex = 0; blockIndex < numberOfBlock; blockIndex++) { var newDateTimeBlock = new DateTimeBlock { From = start.AddTicks(blockIndex * timestepTicks), To = start.AddTicks((blockIndex + 1) * timestepTicks) }; dateTimeBlockSet.Add(newDateTimeBlock); } // loop through each block and and find any records that span that block, trimming those on the edges foreach (var thisBlock in dateTimeBlockSet) { var recordsSpanningBlock = new List <MeterReadingEntity>(); var finalFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, meterId); if (start != DateTime.MinValue) { var date1 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, thisBlock.From.Ticks.ToString()); finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date1); } if (end != DateTime.MaxValue) { var date2 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, thisBlock.To.Ticks.ToString()); finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date2); } recordsSpanningBlock.AddRange(thisContext.MeterReadingsFiltered(finalFilter)); if (recordsSpanningBlock.Any()) { // var minResult = recordsSpanningBlock.Min(x => x.Reading); // var maxResult = recordsSpanningBlock.Max(x => x.Reading); var minResult = float.Parse(recordsSpanningBlock.Min(x => x.Reading)); var maxResult = float.Parse(recordsSpanningBlock.Max(x => x.Reading)); var averageValue = (minResult + maxResult) / 2; // if (!string.IsNullOrEmpty(minResult) && !string.IsNullOrEmpty(maxResult)) { // var flow = Int32.Parse(maxResult) - Int32.Parse(minResult); resultTxt.Append("<record>" + $"<time>{thisBlock.From.ToString("yyyy-MM-ddTHH:mm:sszzz")}</time><variable name=\"flow\">" + $"<value>{averageValue}</value></variable>" + $"</record>{Environment.NewLine}"); } } } } } if (bWrap) { return("<response>" + $"<recordSet>{elementText}{resultTxt}</recordSet>" + "</response>"); } else { return(resultTxt.ToString()); } }
private void runIngest(DateTime dateTimeNow) { var _currentContext = new SQLAzureDataContext(); if (dateTimeNow.Minute < 5) { var dmaList = _currentContext.DMAs.Where(x => x.Virtual); foreach (var dma in dmaList) { var thisContext = new MeterReadingTableStorageContext(dma.Site.TableName); var meterList = _currentContext.Meters.Where(x => x.DMA.Identifier == dma.Identifier); double flow = 0; double volume = 0; foreach (var meter in meterList) { var finalFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, meter.MeterIdentity); var spanStart = new TimeSpan(0, 1, dateTimeNow.Minute, dateTimeNow.Second); var spanEnd = new TimeSpan(0, 0, dateTimeNow.Minute, dateTimeNow.Second); var spanBegin = dateTimeNow.Subtract(spanStart); var date1 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, spanBegin.Ticks.ToString()); finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date1); var spanStop = dateTimeNow.Subtract(spanEnd); var date2 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, spanStop.Ticks.ToString()); finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date2); var allRecords = thisContext.MeterReadingsFiltered(finalFilter); if (allRecords.Any()) { var volumeSet = allRecords.Select(x => x.Reading); var finalStartFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, meter.MeterIdentity); var begindate = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, spanBegin.Ticks.ToString()); finalStartFilter = TableQuery.CombineFilters(finalStartFilter, TableOperators.And, begindate); var startRecord = thisContext.MeterReadingsFiltered(finalStartFilter) .OrderByDescending(x => x.CreatedOn) .First(); double startVolume; DateTime startDate; DateTime endDate = allRecords.Select(x => x.CreatedOn).Max(); if (startRecord != null) { startVolume = double.Parse(startRecord.Reading); startDate = startRecord.CreatedOn; } else { startVolume = double.Parse(volumeSet.Min()); startDate = allRecords.Select(x => x.CreatedOn).Min(); } var endVolume = double.Parse(volumeSet.Max()); double minutes = (endDate - startDate).Minutes; if (minutes != 0) { minutes = minutes / 60; } double seconds = (endDate - startDate).Seconds; if (seconds != 0) { seconds = seconds / 3600; } var hours = ((endDate - startDate).Days * 24) + (((endDate - startDate).Hours)) + minutes + seconds; var multiplier = 1 / hours; var hourlyVolume = (endVolume - startVolume) * multiplier; volume = volume + (hourlyVolume); flow = flow + (hourlyVolume / (hours * 3600)); } } var dmaData = new DMAData { Time = dateTimeNow.AddMilliseconds(dma.Id), DMA = dma, Flow = flow, Volume = volume / 1000 }; _currentContext.DMADatas.InsertOnSubmit(dmaData); } _currentContext.SubmitChanges(); } }