package edu.brown.benchmark.wikipedia.procedures;
import org.voltdb.SQLStmt;
import org.voltdb.VoltProcedure;
import org.voltdb.VoltTable;
import org.voltdb.types.TimestampType;
import edu.brown.benchmark.wikipedia.WikipediaConstants;
/**
* Bulk update the revision counters for users/pages
* @author xin
* @author pavlo
*/
public class UpdateRevisionCounters extends VoltProcedure {
public final SQLStmt updateUser = new SQLStmt(
"UPDATE " + WikipediaConstants.TABLENAME_USER +
" SET user_editcount = ?, " +
" user_touched = ? " +
" WHERE user_id = ?"
);
public final SQLStmt updatePage = new SQLStmt (
"UPDATE " + WikipediaConstants.TABLENAME_PAGE +
" SET page_latest = ?, " +
" page_touched = ?, " +
" page_is_new = 0, " +
" page_is_redirect = 0, " +
" page_len = ? " +
" WHERE page_id = ?"
);
/**
* The given array is a list of the user_editcount values that we need to
* update in the database. Each index in the array corresponds to the
* user_id
*
* @param user_revision_ctr
* @return
*/
public VoltTable run(int user_revision_ctr[], int num_pages, int page_last_rev_id[], int page_last_rev_length[]) {
final TimestampType timestamp = new TimestampType();
final int batch_size = voltRemainingQueue();
int ctr = 0;
for (int i = 0; i < user_revision_ctr.length; i++) {
voltQueueSQL(updateUser, user_revision_ctr[i],
timestamp,
i + 1 // ids start at 1
);
ctr++;
if (i % batch_size == 0) {
voltExecuteSQL();
ctr = 0;
}
}
if (ctr > 0) voltExecuteSQL();
ctr = 0;
for (int i = 0; i < num_pages; i++) {
if (page_last_rev_id[i] == -1) continue;
voltQueueSQL(updatePage, page_last_rev_id[i],
timestamp,
page_last_rev_length[i],
i + 1
);
ctr++;
if (i % batch_size == 0) {
voltExecuteSQL();
ctr = 0;
}
} // FOR
if (ctr > 0) voltExecuteSQL();
// VoltTable has two columns
// #1 -> Number of users updated
// #2 -> Number of pages updated
VoltTable result = new VoltTable(WikipediaConstants.GET_USER_PAGE_UPDATE_COLS);
result.addRow(user_revision_ctr.length, page_last_rev_length.length);
return (result);
}
}