package edu.brown.costmodel;
import org.apache.log4j.Logger;
import org.voltdb.CatalogContext;
import org.voltdb.catalog.Procedure;
import edu.brown.catalog.CatalogKey;
import edu.brown.utils.PartitionEstimator;
import edu.brown.workload.TransactionTrace;
import edu.brown.workload.filters.Filter;
public class LowerBoundsCostModel extends SingleSitedCostModel {
private static final Logger LOG = Logger.getLogger(LowerBoundsCostModel.class);
private int txn_ctr = 0;
private final int num_partitions;
public LowerBoundsCostModel(CatalogContext catalogContext, PartitionEstimator p_estimator) {
super(catalogContext, p_estimator);
this.num_partitions = catalogContext.numberOfPartitions;
}
@Override
public void clear(boolean force) {
super.clear(true);
this.txn_ctr = 0;
}
@Override
public TransactionCacheEntry processTransaction(final CatalogContext catalogContext, final TransactionTrace txn_trace, final Filter filter) throws Exception {
final boolean trace = LOG.isTraceEnabled();
// Make all transactions single-partition. Use round-robin partition
// selection.
Procedure catalog_proc = txn_trace.getCatalogItem(catalogContext.database);
String proc_key = CatalogKey.createKey(catalog_proc);
int total_queries = txn_trace.getQueryCount();
int base_partition = (this.txn_ctr++ % this.num_partitions);
if (trace)
LOG.trace("Examining " + txn_trace + " [base_partition=" + base_partition + "]");
TransactionCacheEntry txn_entry = this.createTransactionCacheEntry(txn_trace, proc_key);
this.setBasePartition(txn_entry, base_partition);
this.histogram_sp_procs.put(proc_key);
txn_entry.setExaminedQueryCount(total_queries);
txn_entry.setSingleSiteQueryCount(total_queries);
txn_entry.setSingleSited(true);
this.histogram_txn_partitions.put(base_partition);
// For each query, we need to mark the histograms appropriately
for (int i = 0; i < total_queries; i++) {
this.histogram_query_partitions.put(base_partition);
txn_entry.addTouchedPartition(base_partition);
} // FOR
return (txn_entry);
}
} // END CLASS