Esempio n. 1
0
        private async void Retrive_Option5(object sender, RoutedEventArgs e)
        {
            ResultTextBox.Text = "";

            var table     = tableClient.GetTableReference("option5");
            var startTime = StartTimePicker.Time;
            var endTime   = EndTimePicker.Time;
            var days      = EndDay.Date.Subtract(StartDay.Date).Days;

            try
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();

                var finalResult = new List <MessageEntity>();
                var tasks       = new List <Task>();

                for (var d = 0; d <= days; d++)
                {
                    for (var hour = 0; hour <= endTime.Hours; hour++)
                    {
                        var endMinutes = d == days && hour == endTime.Hours ? endTime.Minutes : 60;

                        if (endMinutes == 60) // full hour
                        {
                            var partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, StartDay.AddDays(d).AddHours(hour).ToString("yyyyMMddHH"));
                            var query           = new TableQuery <MergedMessageEntity_Option5>().Where(partitionFilter);

                            tasks.Add(Task.Run(async() =>
                            {
                                //Stopwatch sw1 = new Stopwatch();
                                //sw1.Start();

                                var token = new TableContinuationToken();
                                do
                                {
                                    var seg = await table.ExecuteQuerySegmentedAsync(query, token);
                                    token   = seg.ContinuationToken;

                                    var messages = seg.SelectMany(merged =>
                                    {
                                        var mm = new List <MessageEntity>();
                                        for (var sec = 0; sec < 60; sec++)
                                        {
                                            var m     = new MessageEntity();
                                            var value = merged.GetValue(sec);
                                            m.Sensor1 = value.Sensor1;
                                            m.Sensor2 = value.Sensor2;
                                            m.Sensor3 = value.Sensor3;
                                            m.Sensor4 = value.Sensor4;
                                            m.Sensor5 = value.Sensor5;
                                            mm.Add(m);
                                        }

                                        return(mm);
                                    });
                                    lock (finalResult)
                                    {
                                        finalResult.AddRange(messages);
                                    }
                                }while (token != null);

                                //sw1.Stop();
                                //Debug.WriteLine($"Retrieve 1 hour block takes: {String.Format("{0:0.00000}", sw1.Elapsed.TotalSeconds)}");
                            }));
                        }
                        else // left minutes
                        {
                            var h               = StartDay.AddDays(d).AddHours(hour);
                            var rowKeys         = new List <string>();
                            var partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, h.ToString("yyyyMMddHH"));
                            for (var i = 0; i <= endMinutes; i++)
                            {
                                rowKeys.Add(h.AddMinutes(i).ToString("yyyyMMddHHmm"));
                            }

                            var rowsFilter = new StringBuilder();
                            for (var i = 0; i < rowKeys.Count; i++)
                            {
                                var r = rowKeys[i];
                                rowsFilter.Append(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, r));

                                if (i != rowKeys.Count - 1)
                                {
                                    rowsFilter.Append(" " + TableOperators.Or + " ");
                                }
                            }

                            if (rowsFilter.Length > 0)
                            {
                                var combinedFilter = TableQuery.CombineFilters(partitionFilter, TableOperators.And, rowsFilter.ToString());
                                var query          = new TableQuery <MergedMessageEntity_Option5>().Where(combinedFilter);

                                tasks.Add(Task.Run(async() =>
                                {
                                    //Stopwatch sw1 = new Stopwatch();
                                    //sw1.Start();

                                    var token = new TableContinuationToken();
                                    do
                                    {
                                        var seg = await table.ExecuteQuerySegmentedAsync(query, token);
                                        token   = seg.ContinuationToken;

                                        var messages = seg.SelectMany(merged =>
                                        {
                                            var mm = new List <MessageEntity>();
                                            for (var sec = 0; sec < 60; sec++)
                                            {
                                                var m     = new MessageEntity();
                                                var value = merged.GetValue(sec);
                                                m.Sensor1 = value.Sensor1;
                                                m.Sensor2 = value.Sensor2;
                                                m.Sensor3 = value.Sensor3;
                                                m.Sensor4 = value.Sensor4;
                                                m.Sensor5 = value.Sensor5;
                                                mm.Add(m);
                                            }

                                            return(mm);
                                        });
                                        lock (finalResult)
                                        {
                                            finalResult.AddRange(messages);
                                        }
                                    }while (token != null);

                                    //sw1.Stop();
                                    //Debug.WriteLine($"Retrieve left minutes {leftMinutes} takes: {String.Format("{0:0.00000}", sw1.Elapsed.TotalSeconds)}");
                                }));
                            }
                        }
                    }
                }


                await Task.WhenAll(tasks);

                sw.Stop();
                ResultTextBox.Text = $"Option 5: Found {finalResult.Count} records. It took {String.Format("{0:0.00000}", sw.Elapsed.TotalSeconds)} seconds.";
            }
            catch (Exception ex)
            {
                ResultTextBox.Text = ex.Message;
                Debug.WriteLine(ex.Message);
            }
        }