package org.voltdb.benchmark.tpcc.procedures;
import java.util.Iterator;
import org.voltdb.ProcInfo;
import org.voltdb.SQLStmt;
import org.voltdb.VoltMapReduceProcedure;
import org.voltdb.VoltTable;
import org.voltdb.VoltTableRow;
import org.voltdb.VoltType;
import edu.brown.utils.CollectionUtil;
@ProcInfo(
mapInputQuery = "mapInputQuery"
)
public class MRquery6 extends VoltMapReduceProcedure<Double> {
// It's silly for me to do this query for MR transaction, simple sum with only one key
public SQLStmt mapInputQuery = new SQLStmt(
"SELECT SUM(ol_amount) as revenue " +
"FROM ORDER_LINE " +
"WHERE ol_delivery_d >= '1999-01-01 00:00:00.000000' " +
"and ol_delivery_d < '2020-01-01 00:00:00.000000' " +
"and ol_quantity between 1 and 100000"
);
@Override
public VoltTable.ColumnInfo[] getMapOutputSchema() {
return new VoltTable.ColumnInfo[]{
new VoltTable.ColumnInfo("key", VoltType.FLOAT),
new VoltTable.ColumnInfo("ol_amount", VoltType.FLOAT),
};
}
@Override
public VoltTable.ColumnInfo[] getReduceOutputSchema() {
return new VoltTable.ColumnInfo[]{
new VoltTable.ColumnInfo("revenue", VoltType.FLOAT)
};
}
@Override
public void map(VoltTableRow row) {
double value = row.getDouble(0);
Object new_row[] = {
0.1,
value
};
this.mapEmit(0.1, new_row);
}
@Override
public void reduce(Double key, Iterator<VoltTableRow> rows) {
double sum_ol_amount = 0;
for (VoltTableRow r : CollectionUtil.iterable(rows)) {
assert(r != null);
sum_ol_amount += rows.next().getDouble(1);
} // FOR
Object new_row[] = {
sum_ol_amount
};
this.reduceEmit(new_row);
}
}