package edu.brown.hstore.specexec; import java.util.ArrayList; import java.util.List; import org.voltdb.ParameterSet; import org.voltdb.catalog.Statement; import edu.brown.hstore.txns.QueryInvocation; import edu.brown.statistics.Histogram; import edu.brown.statistics.ObjectHistogram; import edu.brown.utils.PartitionSet; /** * This class is used to track the order in which queries are invoked * in the entire transaction. * @author pavlo */ public class QueryTracker { private final List<QueryInvocation> invocations = new ArrayList<QueryInvocation>(); /** * Internal counter for the number of times that we've executed queries in the past. */ private final Histogram<Statement> stmtCounters = new ObjectHistogram<Statement>(true); // ---------------------------------------------------------------------------- // API METHODS // ---------------------------------------------------------------------------- /** * Add a query invocation into this tracker and return the number of * times that we have executed the query in the past. * @param stmt * @param partitions * @param stmtParams * @return */ public int addQuery(Statement stmt, PartitionSet partitions, ParameterSet stmtParams) { int counter = (int)this.stmtCounters.put(stmt) - 1; QueryInvocation pq = new QueryInvocation(stmt, counter, partitions, stmtParams.hashCode()); this.invocations.add(pq); return (counter); } /** * Search for the QueryInvocation handle for the given Statement and counter. * If no match is found, null is returned. * @param stmt * @param counter * @return */ public QueryInvocation findPrefetchedQuery(Statement stmt, int counter) { for (QueryInvocation pq : this.invocations) { if (pq.stmt.equals(stmt) && pq.counter == counter) { return (pq); } } // FOR return (null); } public int getQueryCount(Statement stmt) { // FIXME return (0); } public void clear() { this.invocations.clear(); this.stmtCounters.clear(); } public int size() { return (this.invocations.size()); } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (int i = 0, cnt = this.invocations.size(); i < cnt; i++) { QueryInvocation qi = this.invocations.get(i); sb.append(String.format("[%02d] %s - #02d / partitions=%s / params=%d\n", i, qi.stmt.fullName(), qi.counter, qi.partitions, qi.paramsHash)); } // FOR return (sb.toString()); } }