Пример #1
0
        private async Task <ReadResult <TKey, TEntry> > ReadRangeInternal(TKey id, DateTime from, DateTime to, Sort sort)
        {
            // there's twos ways to accomplish this take:
            //  1. Super fast (iterate partitions and create query for each)
            //  2. Normal (use single query)

            if (_partitioningProvider is IIterablePartitionProvider <TKey> )
            {
                // use method 1 (Super fast)
                var tasks    = new List <Task <List <TEntry> > >();
                var iterable = (IIterablePartitionProvider <TKey>)_partitioningProvider;
                foreach (var table in _tableProvider.IterateTables(from, to))
                {
                    var computedFrom = table.ComputeFrom(from);
                    var computedTo   = table.ComputeTo(to);

                    foreach (var partitionRange in iterable.IteratePartitions(id, computedFrom, computedTo))
                    {
                        var specificQuery = new TableQuery <TsdbTableEntity>()
                                            .Where(CreateSpecificPartitionFilter(id, computedFrom, computedTo, partitionRange));

                        tasks.Add(ReadInternal(specificQuery, table, sort, null));
                    }
                }

                await Task.WhenAll(tasks).ConfigureAwait(false);

                var queryResults = tasks.Select(x => x.Result);
                if (sort == Sort.Ascending)
                {
                    queryResults = queryResults.Reverse();
                }

                // combine the results and return it
                return(new ReadResult <TKey, TEntry>(id, sort, queryResults.SelectMany(x => x).ToList()));
            }
            else
            {
                // use method 2 (Normal)
                var generalQuery = new TableQuery <TsdbTableEntity>()
                                   .Where(CreateGeneralFilter(id, from, to));

                var tasks = new List <Task <List <TEntry> > >();
                foreach (var table in _tableProvider.IterateTables(from, to))
                {
                    tasks.Add(ReadInternal(generalQuery, table, sort, null));
                }

                await Task.WhenAll(tasks).ConfigureAwait(false);

                var queryResults = tasks.Select(x => x.Result);
                if (sort == Sort.Ascending)
                {
                    queryResults = queryResults.Reverse();
                }

                return(new ReadResult <TKey, TEntry>(id, sort, queryResults.SelectMany(x => x).ToList()));
            }
        }