Please ensure Javascript is enabled for purposes of website accessibility
Powered by Zoomin Software. For more details please contactZoomin

AF SDK Reference

Search Aggregation Example

  • Last UpdatedNov 18, 2025
  • 6 minute read
Search Aggregation Example

The following examples show how to aggregate the result of a search using capabilities introduced in AF 2017 (2.9). The examples show different types of aggregates and how to extract the results. These AF SDK methods allow client applications to avoid writing custom aggregation logic.

  1IEnumerable<int> SearchAggregates_Program(string dbName)
  2{
  3    // Get the Database
  4    PISystems myPISystems = new PISystems();
  5    PISystem myPISystem = myPISystems.DefaultPISystem;
  6    if (myPISystem == null)
  7        throw new InvalidOperationException("Default PISystem was not found.");
  8    AFDatabase myDB = myPISystem.Databases[dbName];
  9    if (myDB == null)
 10        throw new InvalidOperationException("Database was not found.");
 11
 12    List<int> itemCounts = new List<int>();
 13    int count;
 14    using (AFEventFrameSearch eventSearch = new AFEventFrameSearch(myDB, "EventFrameSearch", @"Template:'Event' Start:>'t-1y'"))
 15    {
 16        eventSearch.CacheTimeout = TimeSpan.FromMinutes(10);
 17
 18        // Perform several aggregates
 19        count = SummarizeDuration(eventSearch);
 20        itemCounts.Add(count);
 21        count = FrequencyByElement(eventSearch);
 22        itemCounts.Add(count);
 23        count = DurationByElement(eventSearch);
 24        itemCounts.Add(count);
 25        count = FrequencyByMonth(eventSearch);
 26        itemCounts.Add(count);
 27        count = DurationByMonth(eventSearch);
 28        itemCounts.Add(count);
 29        count = BulkSearchAggregates(eventSearch);
 30        itemCounts.Add(count);
 31    }
 32
 33    return itemCounts;
 34}
 35
 36static int SummarizeDuration(AFEventFrameSearch eventSearch)
 37{
 38    Console.WriteLine("Summarize Duration");
 39
 40    AFSummaryResult summaryResult = eventSearch.Summary("Duration", AFSummaryTypes.Minimum | AFSummaryTypes.Maximum | AFSummaryTypes.Average | AFSummaryTypes.Count);
 41    Console.WriteLine("Minimum: {0}, Average: {1}, Maximum: {2}, Count: {3}",
 42        summaryResult.SummaryResults[AFSummaryTypes.Minimum],
 43        summaryResult.SummaryResults[AFSummaryTypes.Average],
 44        summaryResult.SummaryResults[AFSummaryTypes.Maximum],
 45        summaryResult.SummaryResults[AFSummaryTypes.Count]);
 46
 47    Console.WriteLine();
 48    return summaryResult.SummaryResults[AFSummaryTypes.Count].ValueAsInt32();
 49}
 50
 51static int FrequencyByElement(AFEventFrameSearch eventSearch)
 52{
 53    Console.WriteLine("Frequency by Element");
 54
 55    AFGroupedResult<object> frequencyDistribution = eventSearch.FrequencyDistribution("Element");
 56    foreach(var group in frequencyDistribution.GroupedResults)
 57    {
 58        Console.WriteLine("Element: {0}, Count: {1}",
 59            group.Key, group.Value[AFSummaryTypes.Count]);
 60    }
 61
 62    Console.WriteLine();
 63    return frequencyDistribution.GroupedResults.Sum(kv => kv.Value[AFSummaryTypes.Count].ValueAsInt32());
 64}
 65
 66static int DurationByElement(AFEventFrameSearch eventSearch)
 67{
 68    Console.WriteLine("Average Duration by Element");
 69
 70    AFGroupedResult<object> groupedSummary = eventSearch.GroupedSummary("Element", "Duration", AFSummaryTypes.Average | AFSummaryTypes.Count);
 71    foreach (var group in groupedSummary.GroupedResults)
 72    {
 73        Console.WriteLine("Element: {0}, Average: {1}",
 74            group.Key, group.Value[AFSummaryTypes.Average]);
 75    }
 76
 77    Console.WriteLine();
 78    return groupedSummary.GroupedResults.Sum(kv => kv.Value[AFSummaryTypes.Count].ValueAsInt32());
 79}
 80
 81static int FrequencyByMonth(AFEventFrameSearch eventSearch)
 82{
 83    Console.WriteLine("Frequency by Month");
 84
 85    AFBinnedResult<AFTime> histogram = eventSearch.Histogram("StartTime", 
 86        new AFTimeSpan(months: 1).GetIntervalTimes(new AFTimeRange("1-1y", "1+1mo")), binUOM: null);
 87    foreach (var bin in histogram.BinnedResults)
 88    {
 89        Console.WriteLine("Month: {0}, Count: {1}",
 90            bin.Key, bin.Value[AFSummaryTypes.Count]);
 91    }
 92
 93    Console.WriteLine();
 94    return histogram.BinnedResults.Sum(kv => kv.Value[AFSummaryTypes.Count].ValueAsInt32()) + histogram.OutOfRangeCount + histogram.InvalidCount;
 95}
 96
 97static int DurationByMonth(AFEventFrameSearch eventSearch)
 98{
 99    Console.WriteLine("Duration by Month");
100
101    AFBinnedResult<AFTime> binnedSummary = eventSearch.BinnedSummary("StartTime",
102        new AFTimeSpan(months: 1).GetIntervalTimes(new AFTimeRange("1-1y", "1+1mo")), binUOM: null,
103        summaryField: "Duration", summaryTypes: AFSummaryTypes.Average | AFSummaryTypes.Count);
104    foreach (var bin in binnedSummary.BinnedResults)
105    {
106        Console.WriteLine("Month: {0}, Average: {1}",
107            bin.Key, bin.Value[AFSummaryTypes.Average]);
108    }
109
110    Console.WriteLine();
111    return binnedSummary.BinnedResults.Sum(kv => kv.Value[AFSummaryTypes.Count].ValueAsInt32()) + binnedSummary.OutOfRangeCount + binnedSummary.InvalidCount;
112}
113
114static int BulkSearchAggregates(AFEventFrameSearch eventSearch)
115{
116    Console.WriteLine("Bulk Request");
117
118    var averageAndCount = new AFSummaryRequest("Duration", AFSummaryTypes.Average | AFSummaryTypes.Count);
119    var binByMonth = averageAndCount.BinBy("StartTime",
120        new AFTimeSpan(months: 1).GetIntervalTimes(new AFTimeRange("1-1y", "1+1mo")));
121    var groupByElement = averageAndCount.GroupBy("Element");
122    var overallSummaries = new AFSummaryRequest("Duration", AFSummaryTypes.Minimum | AFSummaryTypes.Average | AFSummaryTypes.Maximum);
123
124    var aggregateResults = eventSearch.Aggregate(new AFAggregateRequest[] { binByMonth, groupByElement, overallSummaries });
125
126    var overallSummaryResult = aggregateResults.GetResult(overallSummaries);
127    Console.WriteLine("Minimum: {0}, Average: {1}, Maximum: {2}",
128        overallSummaryResult.SummaryResults[AFSummaryTypes.Minimum],
129        overallSummaryResult.SummaryResults[AFSummaryTypes.Average],
130        overallSummaryResult.SummaryResults[AFSummaryTypes.Maximum]);
131
132    var binByMonthResult = aggregateResults.GetResult(binByMonth);
133    foreach (var bin in binByMonthResult.BinnedResults)
134    {
135        Console.WriteLine("Month: {0}, Average: {1}, Count: {2}",
136            bin.Key, bin.Value[AFSummaryTypes.Average], bin.Value[AFSummaryTypes.Count]);
137    }
138
139    var groupByElementResult = aggregateResults.GetResult(groupByElement);
140    foreach (var group in groupByElementResult.GroupedResults)
141    {
142        Console.WriteLine("Element: {0}, Average: {1}, Count: {2}",
143            group.Key, group.Value[AFSummaryTypes.Average], group.Value[AFSummaryTypes.Count]);
144    }
145
146    Console.WriteLine();
147    return (int)aggregateResults.TotalCount; // return true if there was no error
148}
  1Private Function SearchAggregates_Program(dbName As String) As IEnumerable(Of Integer)
  2    ' Get the Database
  3    Dim myPISystems As New PISystems()
  4    Dim myPISystem As PISystem = myPISystems.DefaultPISystem
  5    If myPISystem Is Nothing Then
  6        Throw New InvalidOperationException("Default PISystem was not found.")
  7    End If
  8    Dim myDB As AFDatabase = myPISystem.Databases(dbName)
  9    If myDB Is Nothing Then
 10        Throw New InvalidOperationException("Database was not found.")
 11    End If
 12
 13    Dim itemCounts As New List(Of Integer)()
 14    Dim count As Integer
 15    Using eventSearch As New AFEventFrameSearch(myDB, "EventFrameSearch", "Template:'Event' Start:>'t-1y'")
 16        eventSearch.CacheTimeout = TimeSpan.FromMinutes(10)
 17
 18        ' Perform several aggregates
 19        count = SummarizeDuration(eventSearch)
 20        itemCounts.Add(count)
 21        count = FrequencyByElement(eventSearch)
 22        itemCounts.Add(count)
 23        count = DurationByElement(eventSearch)
 24        itemCounts.Add(count)
 25        count = FrequencyByMonth(eventSearch)
 26        itemCounts.Add(count)
 27        count = DurationByMonth(eventSearch)
 28        itemCounts.Add(count)
 29        count = BulkSearchAggregates(eventSearch)
 30        itemCounts.Add(count)
 31    End Using
 32
 33    Return itemCounts
 34End Function
 35
 36Private Shared Function SummarizeDuration(eventSearch As AFEventFrameSearch) As Integer
 37    Console.WriteLine("Summarize Duration")
 38
 39    Dim summaryResult As AFSummaryResult = eventSearch.Summary("Duration", AFSummaryTypes.Minimum Or AFSummaryTypes.Maximum Or AFSummaryTypes.Average Or AFSummaryTypes.Count)
 40    Console.WriteLine("Minimum: {0}, Average: {1}, Maximum: {2}, Count: {3}", summaryResult.SummaryResults(AFSummaryTypes.Minimum), summaryResult.SummaryResults(AFSummaryTypes.Average), summaryResult.SummaryResults(AFSummaryTypes.Maximum), summaryResult.SummaryResults(AFSummaryTypes.Count))
 41
 42    Console.WriteLine()
 43    Return summaryResult.SummaryResults(AFSummaryTypes.Count).ValueAsInt32()
 44End Function
 45
 46Private Shared Function FrequencyByElement(eventSearch As AFEventFrameSearch) As Integer
 47    Console.WriteLine("Frequency by Element")
 48
 49    Dim frequencyDistribution As AFGroupedResult(Of Object) = eventSearch.FrequencyDistribution("Element")
 50    For Each group As KeyValuePair(Of Object, IReadOnlyDictionary(Of AFSummaryTypes, AFValue)) In frequencyDistribution.GroupedResults
 51        Console.WriteLine("Element: {0}, Count: {1}", group.Key, group.Value(AFSummaryTypes.Count))
 52    Next
 53
 54    Console.WriteLine()
 55    Return frequencyDistribution.GroupedResults.Sum(Function(kv) kv.Value(AFSummaryTypes.Count).ValueAsInt32())
 56End Function
 57
 58Private Shared Function DurationByElement(eventSearch As AFEventFrameSearch) As Integer
 59    Console.WriteLine("Average Duration by Element")
 60
 61    Dim groupedSummary As AFGroupedResult(Of Object) = eventSearch.GroupedSummary("Element", "Duration", AFSummaryTypes.Average Or AFSummaryTypes.Count)
 62    For Each group As KeyValuePair(Of Object, IReadOnlyDictionary(Of AFSummaryTypes, AFValue)) In groupedSummary.GroupedResults
 63        Console.WriteLine("Element: {0}, Average: {1}", group.Key, group.Value(AFSummaryTypes.Average))
 64    Next
 65
 66    Console.WriteLine()
 67    Return groupedSummary.GroupedResults.Sum(Function(kv) kv.Value(AFSummaryTypes.Count).ValueAsInt32())
 68End Function
 69
 70Private Shared Function FrequencyByMonth(eventSearch As AFEventFrameSearch) As Integer
 71    Console.WriteLine("Frequency by Month")
 72
 73    Dim histogram As AFBinnedResult(Of AFTime) = eventSearch.Histogram("StartTime", New AFTimeSpan(months:=1).GetIntervalTimes(New AFTimeRange("1-1y", "1+1mo")), binUOM:=Nothing)
 74    For Each bin As KeyValuePair(Of AFRange(Of AFTime), IReadOnlyDictionary(Of AFSummaryTypes, AFValue)) In histogram.BinnedResults
 75        Console.WriteLine("Month: {0}, Count: {1}", bin.Key, bin.Value(AFSummaryTypes.Count))
 76    Next
 77
 78    Console.WriteLine()
 79    Return histogram.BinnedResults.Sum(Function(kv) kv.Value(AFSummaryTypes.Count).ValueAsInt32()) + histogram.OutOfRangeCount + histogram.InvalidCount
 80End Function
 81
 82Private Shared Function DurationByMonth(eventSearch As AFEventFrameSearch) As Integer
 83    Console.WriteLine("Duration by Month")
 84
 85    Dim binnedSummary As AFBinnedResult(Of AFTime) = eventSearch.BinnedSummary("StartTime", New AFTimeSpan(months:=1).GetIntervalTimes(New AFTimeRange("1-1y", "1+1mo")), binUOM:=Nothing, summaryField:="Duration", summaryTypes:=AFSummaryTypes.Average Or AFSummaryTypes.Count)
 86    For Each bin As KeyValuePair(Of AFRange(Of AFTime), IReadOnlyDictionary(Of AFSummaryTypes, AFValue)) In binnedSummary.BinnedResults
 87        Console.WriteLine("Month: {0}, Average: {1}", bin.Key, bin.Value(AFSummaryTypes.Average))
 88    Next
 89
 90    Console.WriteLine()
 91    Return binnedSummary.BinnedResults.Sum(Function(kv) kv.Value(AFSummaryTypes.Count).ValueAsInt32()) + binnedSummary.OutOfRangeCount + binnedSummary.InvalidCount
 92End Function
 93
 94Private Shared Function BulkSearchAggregates(eventSearch As AFEventFrameSearch) As Integer
 95    Console.WriteLine("Bulk Request")
 96
 97    Dim averageAndCount As AFSummaryRequest = New AFSummaryRequest("Duration", AFSummaryTypes.Average Or AFSummaryTypes.Count)
 98    Dim binByMonth As AFBinningRequest(Of AFTime) = averageAndCount.BinBy("StartTime", New AFTimeSpan(months:=1).GetIntervalTimes(New AFTimeRange("1-1y", "1+1mo")))
 99    Dim groupByElement As AFGroupingRequest(Of Object) = averageAndCount.GroupBy("Element")
100    Dim overallSummaries As AFSummaryRequest = New AFSummaryRequest("Duration", AFSummaryTypes.Minimum Or AFSummaryTypes.Average Or AFSummaryTypes.Maximum)
101
102    Dim aggregateResults As AFAggregateResultCollection = eventSearch.Aggregate(New AFAggregateRequest() {binByMonth, groupByElement, overallSummaries})
103
104    Dim overallSummaryResult As AFSummaryResult = aggregateResults.GetResult(overallSummaries)
105    Console.WriteLine("Minimum: {0}, Average: {1}, Maximum: {2}", overallSummaryResult.SummaryResults(AFSummaryTypes.Minimum), overallSummaryResult.SummaryResults(AFSummaryTypes.Average), overallSummaryResult.SummaryResults(AFSummaryTypes.Maximum))
106
107    Dim binByMonthResult As AFBinnedResult(Of AFTime) = aggregateResults.GetResult(binByMonth)
108    For Each bin As KeyValuePair(Of AFRange(Of AFTime), IReadOnlyDictionary(Of AFSummaryTypes, AFValue)) In binByMonthResult.BinnedResults
109        Console.WriteLine("Month: {0}, Average: {1}, Count: {2}", bin.Key, bin.Value(AFSummaryTypes.Average), bin.Value(AFSummaryTypes.Count))
110    Next
111
112    Dim groupByElementResult As AFGroupedResult(Of Object) = aggregateResults.GetResult(groupByElement)
113    For Each group As KeyValuePair(Of Object, IReadOnlyDictionary(Of AFSummaryTypes, AFValue)) In groupByElementResult.GroupedResults
114        Console.WriteLine("Element: {0}, Average: {1}, Count: {2}", group.Key, group.Value(AFSummaryTypes.Average), group.Value(AFSummaryTypes.Count))
115    Next
116
117    Console.WriteLine()
118    Return CInt(aggregateResults.TotalCount)
119    ' return true if there was no error
120End Function

No code example is currently available or this language may not be supported.

No code example is currently available or this language may not be supported.

Related Links
TitleResults for “How to create a CRG?”Also Available in