Exemplo n.º 1
0
        public static long CountEntries()
        {
            var thisContext = new MeterReadingTableStorageContext("aqualiameterdata");

            return(thisContext.CountEntries());
        }
Exemplo n.º 2
0
        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());
            }
        }
Exemplo n.º 3
0
        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();
            }
        }