Search Aggregation Example
- Last UpdatedJan 12, 2026
- 3 minute read
- PI System
- AF SDK 3.2.0
- 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}