/***************************************************************************
* Copyright (C) 2009 by H-Store Project *
* Brown University *
* Massachusetts Institute of Technology *
* Yale University *
* *
* Permission is hereby granted, free of charge, to any person obtaining *
* a copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to *
* the following conditions: *
* *
* The above copyright notice and this permission notice shall be *
* included in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
* OTHER DEALINGS IN THE SOFTWARE. *
***************************************************************************/
package edu.brown.workload;
import java.util.Arrays;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONStringer;
import org.voltdb.catalog.Database;
import org.voltdb.catalog.Procedure;
import org.voltdb.catalog.Statement;
import edu.brown.catalog.CatalogKey;
import edu.brown.catalog.CatalogUtil;
import edu.brown.utils.ClassUtil;
/**
*
* @author Andy Pavlo <pavlo@cs.brown.edu>
*
*/
public class QueryTrace extends AbstractTraceElement<Statement> {
public enum Members {
BATCH_ID,
};
private int batch_id;
public QueryTrace() {
super();
}
public QueryTrace(String catalog_stmt_name, Object params[], int batch_id) {
super(catalog_stmt_name, params);
this.batch_id = batch_id;
}
public QueryTrace(Statement catalog_statement, Object params[], int batch_id) {
this(CatalogKey.createKey(catalog_statement), params, batch_id);
}
@SuppressWarnings("unchecked")
@Override
protected QueryTrace cloneImpl() {
QueryTrace clone = new QueryTrace(this.catalog_item_name, this.params, this.batch_id);
return (clone);
}
@Override
public String getCatalogItemName() {
return CatalogKey.getNameFromKey(super.getCatalogItemName());
}
/**
*
* @return
*/
public int getBatchId() {
return this.batch_id;
}
@Override
public Statement getCatalogItem(Database catalog_db) {
return (CatalogKey.getFromKey(catalog_db, this.catalog_item_name, Statement.class));
}
/**
* Grabs the parent procedure for this query/statement
* @return the Procedure catalog object
*/
public Procedure getCatalogProcedure(Database catalog_db) {
Statement catalog_stmt = this.getCatalogItem(catalog_db);
return catalog_stmt.getParent();
}
@Override
public String toString() {
return (this.getClass().getSimpleName() + "[" + this.catalog_item_name + "]");
}
@Override
public String debug(Database catalog_db) {
String ret = this.catalog_item_name;
// Params
ret += " - Parameters: [";
String add = "";
for (Object param : this.params) {
ret += add + (ClassUtil.isArray(param) ? Arrays.toString((Object[])param) : param);
add = ", ";
} // FOR
ret += "]";
if (this.weight > 1) ret += String.format(" - Weight: %d", this.weight);
if (this.aborted) ret += " *ABORTED*";
return (ret);
}
@Override
public void toJSONString(JSONStringer stringer, Database catalog_db) throws JSONException {
super.toJSONString(stringer, catalog_db);
stringer.key(Members.BATCH_ID.name()).value(this.batch_id);
}
@Override
protected void fromJSONObject(JSONObject object, Database catalog_db) throws JSONException {
throw new RuntimeException("Unimplemented!");
}
protected void fromJSONObject(JSONObject object, Procedure catalog_proc) throws JSONException {
super.fromJSONObject(object, CatalogUtil.getDatabase(catalog_proc));
this.batch_id = object.getInt(Members.BATCH_ID.name());
Statement catalog_stmt = null;
if (this.catalog_item_name.contains(":") == false) {
catalog_stmt = catalog_proc.getStatements().getIgnoreCase(this.catalog_item_name);
} else {
catalog_stmt = CatalogKey.getFromKey(CatalogUtil.getDatabase(catalog_proc),
this.catalog_item_name, Statement.class);
}
if (catalog_stmt == null) {
catalog_stmt = catalog_proc.getStatements().getIgnoreCase(CatalogKey.getNameFromKey(this.catalog_item_name));
if (catalog_stmt == null) {
String msg = "Procedure '" + catalog_proc.getName() + "' does not have a Statement '" + this.catalog_item_name + "'";
msg += "\nValid Statements: " + CatalogUtil.debug(catalog_proc.getStatements());
throw new JSONException(msg);
}
}
// HACK
this.catalog_item_name = CatalogKey.createKey(catalog_stmt);
try {
super.paramsFromJSONObject(object, catalog_stmt.getParameters(), "javatype");
} catch (Exception ex) {
LOG.fatal("Failed to load query trace for " + this.catalog_item_name);
throw new JSONException(ex);
}
}
public static QueryTrace loadFromJSONObject(JSONObject object, Procedure catalog_proc) throws JSONException {
QueryTrace query = new QueryTrace();
query.fromJSONObject(object, catalog_proc);
return (query);
}
} // END CLASS