package edu.brown.benchmark.articles.procedures;
import org.apache.log4j.Logger;
import org.voltdb.ProcInfo;
import org.voltdb.SQLStmt;
import org.voltdb.VoltProcedure;
import org.voltdb.VoltTable;
import org.voltdb.exceptions.SerializableException;
import org.voltdb.exceptions.EvictedTupleAccessException;
import edu.brown.benchmark.articles.ArticlesConstants;
import edu.brown.benchmark.articles.ArticlesUtil;
import edu.brown.logging.LoggerUtil;
import edu.brown.logging.LoggerUtil.LoggerBoolean;
@ProcInfo(
partitionParam = 0,
singlePartition = true
)
public class AddComment extends VoltProcedure {
private static final Logger LOG = Logger.getLogger(AddComment.class);
private static final LoggerBoolean debug = new LoggerBoolean();
private static final LoggerBoolean trace = new LoggerBoolean();
static {
LoggerUtil.attachObserver(LOG, debug, trace);
}
public final SQLStmt GetNumComments = new SQLStmt("SELECT A_NUM_COMMENTS FROM ARTICLES WHERE A_ID=?");
public final SQLStmt AddComment = new SQLStmt("INSERT INTO COMMENTS(C_ID,C_A_ID,C_U_ID,C_TEXT) VALUES(?, ?, ?, ?)");
public final SQLStmt UpdateArticle = new SQLStmt("UPDATE ARTICLES SET A_NUM_COMMENTS=? WHERE A_ID=?");
/**
*
* @param a_id - Article's ID
* @param u_id - User's ID
* @param c_text - Actual comment text
* @return
*/
public VoltTable[] run(long a_id, long u_id, String c_text) {
VoltTable[] results;
try {
voltQueueSQL(GetNumComments, a_id);
results = voltExecuteSQL();
} catch (SerializableException ex) {
LOG.debug("After comments Num comments");
if (ex instanceof EvictedTupleAccessException) {
EvictedTupleAccessException exception = (EvictedTupleAccessException) ex;
if (debug.val) LOG.warn(exception.block_ids[0]);
}
throw ex;
}
boolean adv = results[0].advanceRow();
if (adv == false) {
throw new VoltAbortException("Invalid article id '" + a_id + "'");
}
long num_comments = results[0].getLong(0);
if (num_comments == ArticlesConstants.MAX_COMMENTS_PER_ARTICLE) {
return results;
}
// Compute a new unique comment id
long c_id = ArticlesUtil.getCommentId(a_id, num_comments);
voltQueueSQL(AddComment, c_id, a_id, u_id, c_text);
voltQueueSQL(UpdateArticle, num_comments + 1, a_id);
results = voltExecuteSQL(true);
assert results.length == 2;
return (results);
}
}