package edu.brown.catalog.conflicts;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.voltdb.catalog.ConflictPair;
import org.voltdb.catalog.ConflictSet;
import org.voltdb.catalog.Database;
import org.voltdb.catalog.Procedure;
import org.voltdb.catalog.Table;
import edu.brown.catalog.CatalogUtil;
public abstract class ConflictSetUtil {
/**
* Return a set of all the ConflictPairs for the given Procedure
* @param proc0
* @return
*/
public static Collection<ConflictPair> getAllConflictPairs(Procedure proc0) {
Set<ConflictPair> conflicts = new HashSet<ConflictPair>();
for (ConflictSet cset : proc0.getConflicts()) {
conflicts.addAll(cset.getReadwriteconflicts());
conflicts.addAll(cset.getWritewriteconflicts());
} // FOR
return (conflicts);
}
/**
* Return a set of all the ConflictPairs from Proc0->Proc1
* @param proc0
* @param proc1
* @return
*/
public static Collection<ConflictPair> getAllConflictPairs(Procedure proc0, Procedure proc1) {
Set<ConflictPair> conflicts = new HashSet<ConflictPair>();
ConflictSet cset = proc0.getConflicts().get(proc1.getName());
if (cset != null) {
conflicts.addAll(cset.getReadwriteconflicts());
conflicts.addAll(cset.getWritewriteconflicts());
}
return (conflicts);
}
/**
* Return the set of all Tables referenced in the collection of ConflictPairs
* @param conflicts
* @return
*/
public static Collection<Table> getAllTables(Collection<ConflictPair> conflicts) {
Set<Table> tables = new HashSet<Table>();
for (ConflictPair cp : conflicts) {
tables.addAll(CatalogUtil.getTablesFromRefs(cp.getTables()));
} // FOR
return (tables);
}
/**
* Get the Procedure handles that are marked as Write-Write conflicting for the
* given Procedure
* @param catalog_proc
* @return
*/
public static Collection<Procedure> getWriteWriteConflicts(Procedure catalog_proc) {
List<Procedure> conflicts = new ArrayList<Procedure>();
Database catalog_db = CatalogUtil.getDatabase(catalog_proc);
for (String procName : catalog_proc.getConflicts().keySet()) {
ConflictSet cs = catalog_proc.getConflicts().get(procName);
if (cs.getWritewriteconflicts().isEmpty() == false) {
conflicts.add(catalog_db.getProcedures().get(procName));
}
} // FOR
return (conflicts);
}
/**
* Get the Procedure handles that have any conflict with the given Procedure
* @param catalog_proc
* @return
*/
public static Collection<Procedure> getAllConflicts(Procedure catalog_proc) {
List<Procedure> conflicts = new ArrayList<Procedure>();
Database catalog_db = CatalogUtil.getDatabase(catalog_proc);
for (ConflictSet cs : catalog_proc.getConflicts().values()) {
if (cs.getReadwriteconflicts().isEmpty() == false) {
conflicts.add(catalog_db.getProcedures().get(cs.getName()));
}
if (cs.getWritewriteconflicts().isEmpty() == false) {
conflicts.add(catalog_db.getProcedures().get(cs.getName()));
}
} // FOR
return (conflicts);
}
/**
* Get the Procedure handles that are marked as Read-Write conflicting for the
* given Procedure
* @param catalog_proc
* @return
*/
public static Collection<Procedure> getReadWriteConflicts(Procedure catalog_proc) {
List<Procedure> conflicts = new ArrayList<Procedure>();
Database catalog_db = CatalogUtil.getDatabase(catalog_proc);
for (ConflictSet cs : catalog_proc.getConflicts().values()) {
if (cs.getReadwriteconflicts().isEmpty() == false) {
conflicts.add(catalog_db.getProcedures().get(cs.getName()));
}
} // FOR
return (conflicts);
}
}