package edu.washington.escience.myria.operator.agg;
import java.util.Objects;
import edu.washington.escience.myria.Type;
import edu.washington.escience.myria.storage.AppendableTable;
import edu.washington.escience.myria.storage.MutableTupleBuffer;
import edu.washington.escience.myria.storage.ReplaceableColumn;
import edu.washington.escience.myria.storage.TupleBatch;
/**
* Knows how to compute some aggregates over a BooleanColumn.
*/
public final class BooleanAggregator extends PrimitiveAggregator {
protected BooleanAggregator(final String inputName, final int column, final AggregationOp aggOp) {
super(inputName, column, aggOp);
}
/** Required for Java serialization. */
private static final long serialVersionUID = 1L;
@Override
public void addRow(
final TupleBatch from,
final int fromRow,
final MutableTupleBuffer to,
final int toRow,
final int offset) {
Objects.requireNonNull(from, "from");
ReplaceableColumn toCol = to.getColumn(offset, toRow);
final int inColumnRow = to.getInColumnIndex(toRow);
switch (aggOp) {
case COUNT:
toCol.replaceLong(toCol.getLong(inColumnRow) + 1, inColumnRow);
break;
default:
throw new IllegalArgumentException(aggOp + " is invalid");
}
}
@Override
protected boolean isSupported(final AggregationOp aggOp) {
return aggOp.equals(AggregationOp.COUNT);
}
@Override
protected Type getOutputType() {
switch (aggOp) {
case COUNT:
return Type.LONG_TYPE;
default:
throw new IllegalArgumentException("Type " + aggOp + " is invalid");
}
};
@Override
public void appendInitValue(AppendableTable data, final int column) {
switch (aggOp) {
case COUNT:
data.putLong(column, 0);
break;
default:
throw new IllegalArgumentException("Type " + aggOp + " is invalid");
}
}
}