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 UpdatedJan 12, 2026
  • 3 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}

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