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 MRquery1 extends VoltMapReduceProcedure<Long> { public SQLStmt mapInputQuery = new SQLStmt( "SELECT ol_number, SUM(ol_quantity), SUM(ol_amount), COUNT(*) " + "FROM order_line " + "WHERE ol_delivery_d > '2007-01-02 00:00:00.000000' " + "GROUP BY ol_number " + "ORDER BY ol_number" ); @Override public VoltTable.ColumnInfo[] getMapOutputSchema() { return new VoltTable.ColumnInfo[]{ new VoltTable.ColumnInfo("ol_number", VoltType.BIGINT), new VoltTable.ColumnInfo("ol_quantity", VoltType.BIGINT), new VoltTable.ColumnInfo("ol_amount", VoltType.FLOAT), new VoltTable.ColumnInfo("count_order", VoltType.BIGINT), }; } /* */ @Override public VoltTable.ColumnInfo[] getReduceOutputSchema() { return new VoltTable.ColumnInfo[]{ new VoltTable.ColumnInfo("ol_number", VoltType.BIGINT), new VoltTable.ColumnInfo("sum_qty", VoltType.BIGINT), new VoltTable.ColumnInfo("sum_amount", VoltType.FLOAT), new VoltTable.ColumnInfo("avg_qty", VoltType.BIGINT), new VoltTable.ColumnInfo("avg_amount", VoltType.FLOAT), new VoltTable.ColumnInfo("count_order", VoltType.BIGINT), }; } @Override public void map(VoltTableRow row) { long key = row.getLong(0); // A_NAME long quantity = row.getLong(1); double amount = row.getDouble(2); long ct = row.getLong(3); Object new_row[] = { key, quantity, // FIXME row.getLong(1) amount, ct }; this.mapEmit(key, new_row); } @Override public void reduce(Long key, Iterator<VoltTableRow> rows) { long count = 0; long sum_qty = 0; double sum_amount = 0; for (VoltTableRow r : CollectionUtil.iterable(rows)) { assert(r != null); sum_qty += rows.next().getLong(1); sum_amount += rows.next().getDouble(2); count+= rows.next().getLong(3); } // FOR long avg_qty = sum_qty / count; double avg_amount = sum_amount / count; Object new_row[] = { key, sum_qty, sum_amount, avg_qty, avg_amount, count }; this.reduceEmit(new_row); } }