public async Task <MultiTaggedReadResult <TEntry, TMeasureType> > ReadGroupsAsync(string measureTypeName, IEnumerable <AggregatedField> fields, IEnumerable <KeyValuePair <string, string> > requiredTags, IEnumerable <string> groupByTags, Sort sort = Sort.Descending) { using (await _cc.ReadAsync().ConfigureAwait(false)) { await CreateDatabase().ConfigureAwait(false); requiredTags = requiredTags.ToList(); groupByTags = groupByTags.ToList(); var measureType = await _typeStorage.GetMeasureTypeAsync(measureTypeName).ConfigureAwait(false); var fieldQueryInfos = GetFieldQueryInfos(measureType, fields.ToArray()); var resultSet = await _client.ReadAsync <DynamicInfluxRow>(_database, CreateGroupedSelectQuery( measureType, fieldQueryInfos, requiredTags, groupByTags, sort )).ConfigureAwait(false); return(Convert(measureType, fieldQueryInfos, resultSet, sort)); } }
private async Task <MultiTaggedReadResult <TEntry, TMeasureType> > MergeTaggedResultsAsync( string measureTypeName, AggregatedField[] fields, Sort sort, List <MultiTaggedReadResult <TEntry, TMeasureType> > results) { if (results.Count == 1) { return(results[0]); } else { // figure out which to merge together var finalResultDictionary = new Dictionary <TagCollection, TaggedReadResult <TEntry, TMeasureType> >(); // foreach tag combination! var groupings = new Dictionary <TagCollection, List <TaggedReadResult <TEntry, TMeasureType> > >(); TMeasureType measureType = default(TMeasureType); bool anyResults = false; foreach (var multiTaggedReadResult in results) { measureType = multiTaggedReadResult.MeasureType; foreach (var taggedReadResult in multiTaggedReadResult) { anyResults = true; List <TaggedReadResult <TEntry, TMeasureType> > existingList; if (!groupings.TryGetValue(taggedReadResult.GroupedTags, out existingList)) { existingList = new List <TaggedReadResult <TEntry, TMeasureType> >(); groupings.Add(taggedReadResult.GroupedTags, existingList); } existingList.Add(taggedReadResult); } } if (anyResults) { // need fields and aggregate method var calculators = CreateFieldCalculators(fields, measureType.GetFields().ToDictionary(x => x.Key)); return(Merge(measureType, calculators, sort, groupings)); } else { measureType = await _typedKeyStorage.GetMeasureTypeAsync(measureTypeName); return(new MultiTaggedReadResult <TEntry, TMeasureType>(measureType)); } } }