Aggregation Examples

Here is an example of code that uses the jAgg API for aggregate operations:

The Record class is an example class that stores data to aggregate:

public class Record {
   private String trialClass;
   private float testResult;
   public Record(String trialClass, float result) {
      this.trialClass = trialClass; testResult = result; }
   public String getTrialClass() { return trialClass; }
   public float getTestResult() { return testResult; }
}
            

The following is code that generates a List of Records and calls the jAgg API for aggregate operations:

List<Record> rawData = new ArrayList<Record>();
rawData.add(new Record("placebo", 60.5));
rawData.add(new Record("placebo", 62.5));
rawData.add(new Record("placebo", 58.5));
rawData.add(new Record("newDrug", 80.5));
rawData.add(new Record("newDrug", 83.5));
rawData.add(new Record("newDrug", 77.5));

List<String> properties = new ArrayList<String>();
properties.add("trialClass");

List<Aggregator> aggregators = new ArrayList<Aggregator>();
aggregators.add(new CountAggregator("*"));
aggregators.add(new AvgAggregator("testResult"));
aggregators.add(new StdDevAggregator("testResult"));

List<AggregateValue<Record>> aggValues = Aggregations.groupBy(
   rawData, properties, aggregators);

for (AggregateValue<Record> aggValue : aggValues )
{
   Record r = aggValue.getObject();
   StringBuffer buf = new StringBuffer();
   buf.append(r.getTrialClass());
   buf.append(":");
   for (Aggregator aggregator : aggregators)
   {
      buf.append(" ");
      buf.append(aggregator.toString());
      buf.append("=");
      buf.append(aggValue.getAggregateValue(aggregator));
   }
   System.out.println(buf.toString());
}
            

Alternatively, using Multiset Discrimination, one would replace the call to "groupBy" above with the following line:

List<AggregateValue<Record>> aggValues = Aggregations.groupBy(
   rawData, properties, aggregators, true);
            

This code would output the following:

newDrug: Count(*)=3 Avg(testResult)=80.5 StdDev(testResult)=3
placebo: Count(*)=3 Avg(testResult)=60.5 StdDev(testResult)=2
            

Analytic Examples

Here is an example of code that uses the jAgg API for analytic operations:

The Sales class is an example class that stores sales data to analyze:

public class Sales {
   private String departmentName;
   private int quarterNumber;
   private long sales;
   public Sales(String departmentName, int quarterNumber, long sales) {
      this.departmentName = departmentName; this.quarterNumber = quarterNumber;
      this.sales = sales; }
   public String getDepartmentName() { return departmentName; }
   public int getQuarter() { return quarterNumber; }
   public long getSales() { return sales; }
}
            

The following is code that generates a List of Sales and calls the jAgg API for analytic operations:

List<Sales> rawData = new ArrayList<Sales>();
rawData.add(new Sales("Widgets", 1, 100000));
rawData.add(new Sales("Widgets", 2, 115000));
rawData.add(new Sales("Widgets", 3,  95000));
rawData.add(new Sales("Widgets", 4, 125000));
rawData.add(new Sales("Gizmos" , 1,  50000));
rawData.add(new Sales("Gizmos" , 2,  80000));
rawData.add(new Sales("Gizmos" , 3,  90000));
rawData.add(new Sales("Gizmos" , 4, 140000));

List<AnalyticAggregator> analytics = new ArrayList<AnalyticAggregator>();
analytics.add(new AnalyticAggregator.Builder()
        .setAnalyticFunction(new SumAggregator("sales"))
        .setPartition(new PartitionClause(Arrays.asList("departmentName")))
        .setOrderBy(new OrderByClause(
                Arrays.asList(new OrderByElement("quarter"))))
        .build());
analytics.add(new AnalyticAggregator.Builder()
        .setAnalyticFunction(new LagAnalytic("sales", 1, 0L))
        .setPartition(new PartitionClause(Arrays.asList("departmentName")))
        .setOrderBy(new OrderByClause(
                Arrays.asList(new OrderByElement("quarter"))))
        .build());

Analytic ana = new Analytic.Builder().setAnalytics(analytics).build();

List<AnalyticValue<Sales>> anaValues = ana.analyze(rawData);

for (AnalyticValue<Sales> anaValue : anaValues )
{
   Sales s = anaValue.getObject();
   StringBuffer buf = new StringBuffer();
   buf.append(s.getDepartmentName());
   buf.append(", Q");
   buf.append(s.getQuarter());
   buf.append(", $");
   buf.append(s.getSales());
   buf.append(", running total: $");
   buf.append(anaValue.getAnalyzedValue(0));
   buf.append(", change: $");
   buf.append(s.getSales() - ((Number) anaValue.getAnalyzedValue(1)).longValue());
   System.out.println(buf.toString());
}
            

This code would output the following:

Widgets, Q1, $100000, running total: $100000.0, change: $100000
Widgets, Q2, $115000, running total: $215000.0, change: $15000
Widgets, Q3, $95000, running total: $310000.0, change: $-20000
Widgets, Q4, $125000, running total: $435000.0, change: $30000
Gizmos, Q1, $50000, running total: $50000.0, change: $50000
Gizmos, Q2, $80000, running total: $130000.0, change: $30000
Gizmos, Q3, $90000, running total: $220000.0, change: $10000
Gizmos, Q4, $140000, running total: $360000.0, change: $50000