package sizzle.aggregators;
import java.io.IOException;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer.Context;
import sizzle.io.EmitKey;
/**
* A container for one or more Sizzle aggregators.
*
* @author anthonyu
*
*/
public class Table {
private final Aggregator[] aggregators;
@SuppressWarnings("rawtypes")
private Context context;
private EmitKey key;
public Table(final Aggregator... aggregators) {
this.aggregators = aggregators;
}
public Aggregator getAggregator(final int index) {
return this.aggregators[index];
}
public Aggregator[] getAggregators() {
return this.aggregators;
}
public boolean isAssociative() {
for (final Aggregator a : this.aggregators)
if (!a.isAssociative())
return false;
return true;
}
public void setCombining(final boolean combining) {
for (final Aggregator a : this.aggregators)
a.setCombining(combining);
}
public void start(final EmitKey key) {
this.key = key;
for (final Aggregator a : this.aggregators)
a.start(key);
}
public void setContext(@SuppressWarnings("rawtypes") final org.apache.hadoop.mapreduce.Reducer.Context context) {
this.context = context;
for (final Aggregator a : this.aggregators)
a.setContext(context);
}
public void aggregate(final String[] data, final String metadata) throws IOException, InterruptedException, FinishedException {
for (int i = 0; i < data.length && i < this.aggregators.length; i++)
this.aggregators[i].aggregate(data[i], metadata);
}
@SuppressWarnings("unchecked")
public void finish() throws IOException, InterruptedException {
if (this.aggregators.length > 1) {
final StringBuilder sb = new StringBuilder(this.key + " = { ");
for (final Aggregator a : this.aggregators)
sb.append(a.getResult().getData()[0] + ", ");
final String out = sb.toString();
this.context.write(new Text(out.substring(0, out.length() - 2) + " }"), NullWritable.get());
} else {
this.aggregators[0].finish();
}
}
}