package edu.brown.hstore.estimators.remote; import java.util.ArrayList; import java.util.List; import org.voltdb.CatalogContext; import org.voltdb.catalog.Statement; import org.voltdb.utils.NotImplementedException; import edu.brown.catalog.special.CountedStatement; import edu.brown.hstore.Hstoreservice.QueryEstimate; import edu.brown.hstore.estimators.Estimate; import edu.brown.hstore.estimators.EstimatorUtil; import edu.brown.markov.EstimationThresholds; import edu.brown.utils.PartitionSet; /** * A RemoteEstimate is a partial TransactionEstimate for a txn that * is running at remote node. Not all of the internal probabilities * will be available for it. * @author pavlo */ public class RemoteEstimate implements Estimate { private final QueryEstimate query_estimates[]; private final List<CountedStatement> countedStmts[]; private final CatalogContext catalogContext; private int batchId; @SuppressWarnings("unchecked") public RemoteEstimate(CatalogContext catalogContext) { this.catalogContext = catalogContext; this.query_estimates = new QueryEstimate[this.catalogContext.numberOfPartitions]; this.countedStmts = (List<CountedStatement>[])new List<?>[this.catalogContext.numberOfPartitions]; } public void init(int batchId) { this.batchId = batchId; } @Override public boolean isInitialized() { return (true); } @Override public void finish() { for (int p = 0; p < this.query_estimates.length; p++) { this.query_estimates[p] = null; if (this.countedStmts[p] != null) this.countedStmts[p].clear(); } // FOR this.batchId = EstimatorUtil.INITIAL_ESTIMATE_BATCH; } @Override public int getBatchId() { return (this.batchId); } @Override public boolean isInitialEstimate() { return (this.batchId == EstimatorUtil.INITIAL_ESTIMATE_BATCH); } @Override public boolean isValid() { return (true); } @Override public long getRemainingExecutionTime() { return Long.MAX_VALUE; } @Override public boolean hasQueryEstimate(int partition) { return (this.query_estimates[partition] != null); } public void addQueryEstimate(QueryEstimate est, int partition) { this.query_estimates[partition] = est; } @Override public List<CountedStatement> getQueryEstimate(int partition) { if (this.countedStmts[partition] == null) { this.countedStmts[partition] = new ArrayList<CountedStatement>(); QueryEstimate est = this.query_estimates[partition]; for (int i = 0, cnt = est.getStmtIdsCount(); i < cnt; i++) { Statement catalog_stmt = this.catalogContext.getStatementById(est.getStmtIds(i)); assert(catalog_stmt != null) : "Invalid Statement id '" + est.getStmtIds(i) + "'"; this.countedStmts[partition].add(new CountedStatement(catalog_stmt, est.getStmtCounters(i))); } // FOR } return (this.countedStmts[partition]); } @Override public PartitionSet getTouchedPartitions(EstimationThresholds t) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } // @Override // public boolean isSinglePartitionProbabilitySet() { // return (false); // } @Override public boolean isSinglePartitioned(EstimationThresholds t) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } // @Override // public boolean isReadOnlyProbabilitySet(int partition) { // throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); // } @Override public boolean isReadOnlyPartition(EstimationThresholds t, int partition) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } @Override public boolean isReadOnlyAllPartitions(EstimationThresholds t) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } // @Override // public PartitionSet getReadOnlyPartitions(EstimationThresholds t) { // throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); // } @Override public boolean isWriteProbabilitySet(int partition) { return (false); } @Override public boolean isWritePartition(EstimationThresholds t, int partition) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } @Override public PartitionSet getWritePartitions(EstimationThresholds t) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } @Override public boolean isDoneProbabilitySet(int partition) { return (false); } @Override public boolean isDonePartition(EstimationThresholds t, int partition) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } @Override public PartitionSet getDonePartitions(EstimationThresholds t) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } @Override public boolean isAbortProbabilitySet() { return false; } @Override public boolean isAbortable(EstimationThresholds t) { throw new NotImplementedException(this.getClass().getSimpleName() + " does not implement this method"); } }