Search Aggregation Example
- Last UpdatedNov 18, 2025
- 6 minute read
- PI System
- AF SDK 2024 R2
- Developer
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.