package edu.brown.gui.catalog; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.voltdb.catalog.Catalog; import org.voltdb.catalog.CatalogDiffEngine; import org.voltdb.catalog.Cluster; import org.voltdb.catalog.Column; import org.voltdb.catalog.Database; import org.voltdb.catalog.Index; import org.voltdb.catalog.Procedure; import org.voltdb.catalog.Table; import org.voltdb.types.IndexType; import edu.brown.catalog.CatalogUtil; import edu.brown.statistics.Histogram; import edu.brown.statistics.HistogramUtil; import edu.brown.statistics.ObjectHistogram; import edu.brown.utils.CollectionUtil; import edu.brown.utils.StringUtil; public class CatalogSummaryUtil { final Catalog catalog; public CatalogSummaryUtil(Catalog catalog) { this.catalog = catalog; } public Map<String, Integer>[] getProceduresInfo(boolean full) { Database catalog_db = CatalogUtil.getDatabase(catalog); Map<String, Integer> m[] = (Map<String, Integer>[])new Map<?, ?>[1]; int idx = -1; int procs = 0; int sysprocs = 0; int params = 0; int stmts = 0; for (Procedure p : catalog_db.getProcedures()) { if (p.getSystemproc()) { sysprocs++; } else { procs++; params += p.getParameters().size(); stmts += p.getStatements().size(); } } // FOR m[++idx] = new LinkedHashMap<String, Integer>(); m[idx].put("Procedures", procs); m[idx].put("Procedure Parameters", params); m[idx].put("Statements", stmts); m[idx].put("System Procedures", sysprocs); return (m); } public Map<String, Integer>[] getTablesInfo(boolean full) { Database catalog_db = CatalogUtil.getDatabase(catalog); Map<String, Integer> m[] = (Map<String, Integer>[])new Map<?, ?>[3]; int idx = -1; int cols = 0; int fkeys = 0; int tables = 0; int idx_total = 0; int idx_unique = 0; Histogram<IndexType> idx_types = new ObjectHistogram<IndexType>(); for (Table t : CatalogUtil.getDataTables(catalog_db)) { tables++; // COLUMNS cols += t.getColumns().size(); for (Column c : t.getColumns()) { Column fkey = CatalogUtil.getForeignKeyParent(c); if (fkey != null) fkeys++; } // INDEXES idx_total += t.getIndexes().size(); for (Index i : t.getIndexes()) { if (i.getUnique()) { idx_unique++; } IndexType idx_type = IndexType.get(i.getType()); idx_types.put(idx_type); } // FOR } // FOR // ---------------------- // TABLE INFO // ---------------------- m[++idx] = new LinkedHashMap<String, Integer>(); m[idx].put("Tables", tables); m[idx].put("Replicated Tables", CatalogUtil.getReplicatedTables(catalog_db).size()); m[idx].put("Views", CatalogUtil.getViewTables(catalog_db).size()); m[idx].put("Vertical Partition Replicas", CatalogUtil.getVerticallyPartitionedTables(catalog_db).size()); m[idx].put("Evictable Tables", CatalogUtil.getEvictableTables(catalog_db).size()); m[idx].put("System Tables", CatalogUtil.getSysTables(catalog_db).size()); // ---------------------- // INDEX INFO // ---------------------- m[++idx] = new LinkedHashMap<String, Integer>(); m[idx].put("Indexes", idx_total); m[idx].put("Unique Indexes", idx_unique); for (IndexType idx_type : idx_types.values()) { m[idx].put(String.format(" + %s Indexes", idx_type.name()), (int)idx_types.get(idx_type, 0)); } // FOR // ---------------------- // COLUMN INFO // ---------------------- m[++idx] = new LinkedHashMap<String, Integer>(); m[idx].put("Columns", cols); m[idx].put("Foreign Keys", fkeys); return (m); } public Map<String, Integer>[] getHostsInfo(boolean full) { Cluster catalog_clus = CatalogUtil.getCluster(this.catalog); Map<String, Integer> m[] = (Map<String, Integer>[])new Map<?, ?>[2]; int idx = -1; m[++idx] = new LinkedHashMap<String, Integer>(); m[idx].put("Hosts", catalog_clus.getHosts().size()); m[idx].put("Sites", catalog_clus.getSites().size()); m[idx].put("Partitions", CatalogUtil.getNumberOfPartitions(catalog_clus)); return (m); } /** * Return summary text about the catalog */ public String getSummaryText() { Collection<Map<String, Integer>> maps = new ArrayList<Map<String, Integer>>(); // ---------------------- // TABLE + COLUMN INFO // ---------------------- CollectionUtil.addAll(maps, this.getTablesInfo(false)); // ---------------------- // PROCEDURES INFO // ---------------------- CollectionUtil.addAll(maps, this.getProceduresInfo(false)); // ---------------------- // HOST INFO // ---------------------- CollectionUtil.addAll(maps, this.getHostsInfo(false)); return (StringUtil.formatMaps(maps.toArray(new Map<?, ?>[0]))); } }