Search in sources :

Example 1 with Table

use of org.voltdb.catalog.Table in project voltdb by VoltDB.

the class InvocationDispatcher method getLoadSinglePartitionTablePartitionParamType.

/**
     * XXX: This should go away when we get rid of the legacy hashinator.
     */
private static final int getLoadSinglePartitionTablePartitionParamType(CatalogMap<Table> tables, StoredProcedureInvocation spi) throws Exception {
    String tableName = (String) spi.getParameterAtIndex(1);
    // get the table from the catalog
    Table catTable = tables.getIgnoreCase(tableName);
    if (catTable == null) {
        throw new Exception(String.format("Unable to find target table \"%s\" for LoadSinglepartitionTable.", tableName));
    }
    Column pCol = catTable.getPartitioncolumn();
    return pCol.getType();
}
Also used : Table(org.voltdb.catalog.Table) Column(org.voltdb.catalog.Column) JSONException(org.json_voltpatches.JSONException) NodeExistsException(org.apache.zookeeper_voltpatches.KeeperException.NodeExistsException) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException)

Example 2 with Table

use of org.voltdb.catalog.Table in project voltdb by VoltDB.

the class ReportMaker method genrateStatementRow.

static String genrateStatementRow(CatalogMap<Table> tables, Procedure procedure, Statement statement) {
    // get the proc annotation which should exist or be created just before this is called
    ProcedureAnnotation procAnnotation = (ProcedureAnnotation) procedure.getAnnotation();
    assert (procAnnotation != null);
    StringBuilder sb = new StringBuilder();
    sb.append("        <tr class='primaryrow2'>");
    // name column
    String anchor = (procedure.getTypeName() + "-" + statement.getTypeName()).toLowerCase();
    sb.append("<td style='white-space: nowrap'><i id='p-" + anchor + "--icon' class='icon-chevron-right'></i> <a href='#' id='p-");
    sb.append(anchor).append("' class='togglex'>");
    sb.append(statement.getTypeName());
    sb.append("</a></td>");
    // sql column
    sb.append("<td><tt>");
    sb.append(escapeHtml4(statement.getSqltext()));
    sb.append("</td></tt>");
    // params column
    sb.append("<td>");
    List<StmtParameter> params = CatalogUtil.getSortedCatalogItems(statement.getParameters(), "index");
    List<String> paramTypes = new ArrayList<String>();
    for (StmtParameter param : params) {
        paramTypes.add(VoltType.get((byte) param.getJavatype()).name());
    }
    if (paramTypes.size() == 0) {
        sb.append("<i>None</i>");
    }
    sb.append(StringUtils.join(paramTypes, ", "));
    sb.append("</td>");
    // r/w column
    sb.append("<td>");
    if (statement.getReadonly()) {
        tag(sb, "success", "Read");
    } else {
        tag(sb, "warning", "Write");
    }
    sb.append("</td>");
    // attributes
    sb.append("<td>");
    if (!statement.getIscontentdeterministic() || !statement.getIsorderdeterministic()) {
        tag(sb, "inverse", "Determinism");
    }
    if (statement.getSeqscancount() > 0) {
        tag(sb, "important", "Scans");
    }
    sb.append("</td>");
    sb.append("</tr>\n");
    // BUILD THE DROPDOWN FOR THE PLAN/DETAIL TABLE
    sb.append("<tr class='dropdown2'><td colspan='5' id='p-" + procedure.getTypeName().toLowerCase() + "-" + statement.getTypeName().toLowerCase() + "--dropdown'>\n");
    sb.append("<div class='well well-small'><h4>Explain Plan:</h4>\n");
    String plan = escapeHtml4(Encoder.hexDecodeToString(statement.getExplainplan()));
    plan = plan.replace("\n", "<br/>");
    plan = plan.replace(" ", "&nbsp;");
    for (String tableName : statement.getTablesread().split(",")) {
        if (tableName.length() == 0) {
            continue;
        }
        Table t = tables.get(tableName);
        assert (t != null);
        TableAnnotation ta = (TableAnnotation) t.getAnnotation();
        assert (ta != null);
        ta.statementsThatReadThis.add(statement);
        ta.proceduresThatReadThis.add(procedure);
        procAnnotation.tablesRead.add(t);
        String uname = tableName.toUpperCase();
        String link = "\"<a href='#s-" + tableName + "'>" + uname + "</a>\"";
        plan = plan.replace("&quot;" + uname + "&quot;", link);
    }
    for (String tableName : statement.getTablesupdated().split(",")) {
        if (tableName.length() == 0) {
            continue;
        }
        Table t = tables.get(tableName);
        assert (t != null);
        TableAnnotation ta = (TableAnnotation) t.getAnnotation();
        assert (ta != null);
        ta.statementsThatUpdateThis.add(statement);
        ta.proceduresThatUpdateThis.add(procedure);
        procAnnotation.tablesUpdated.add(t);
        String uname = tableName.toUpperCase();
        String link = "\"<a href='#s-" + tableName + "'>" + uname + "</a>\"";
        plan = plan.replace("&quot;" + uname + "&quot;", link);
    }
    for (String tableDotIndexPair : statement.getIndexesused().split(",")) {
        if (tableDotIndexPair.length() == 0) {
            continue;
        }
        String[] parts = tableDotIndexPair.split("\\.", 2);
        assert (parts.length == 2);
        if (parts.length != 2) {
            continue;
        }
        String tableName = parts[0];
        String indexName = parts[1];
        Table t = tables.get(tableName);
        assert (t != null);
        Index i = t.getIndexes().get(indexName);
        assert (i != null);
        IndexAnnotation ia = (IndexAnnotation) i.getAnnotation();
        if (ia == null) {
            ia = new IndexAnnotation();
            i.setAnnotation(ia);
        }
        ia.proceduresThatUseThis.add(procedure);
        procAnnotation.indexesUsed.add(i);
        String uindexName = indexName.toUpperCase();
        String link = "\"<a href='#s-" + tableName + "-" + indexName + "'>" + uindexName + "</a>\"";
        plan = plan.replace("&quot;" + uindexName + "&quot;", link);
    }
    sb.append("<tt>").append(plan).append("</tt>");
    sb.append("</div>\n");
    sb.append("</td></tr>\n");
    return sb.toString();
}
Also used : StmtParameter(org.voltdb.catalog.StmtParameter) Table(org.voltdb.catalog.Table) ArrayList(java.util.ArrayList) Index(org.voltdb.catalog.Index)

Example 3 with Table

use of org.voltdb.catalog.Table in project voltdb by VoltDB.

the class ReportMaker method generateSchemaRow.

static String generateSchemaRow(Table table, boolean isExportTable) {
    StringBuilder sb = new StringBuilder();
    sb.append("<tr class='primaryrow'>");
    // column 1: table name
    String anchor = table.getTypeName().toLowerCase();
    sb.append("<td style='white-space: nowrap;'><i id='s-" + anchor + "--icon' class='icon-chevron-right'></i> <a href='#' id='s-");
    sb.append(anchor).append("' class='togglex'>");
    sb.append(table.getTypeName());
    sb.append("</a></td>");
    // column 2: type
    sb.append("<td>");
    if (table.getMaterializer() != null) {
        tag(sb, "info", "Materialized View");
    } else {
        if (isExportTable) {
            tag(sb, "inverse", "Export Streams");
        } else {
            tag(sb, null, "Table");
        }
    }
    sb.append("</td>");
    // column 3: partitioning
    sb.append("<td style='whitespace: nowrap;'>");
    if (table.getIsreplicated()) {
        tag(sb, "warning", "Replicated");
    } else {
        tag(sb, "success", "Partitioned");
        Column partitionCol = table.getPartitioncolumn();
        if (partitionCol != null) {
            sb.append("<small> on " + partitionCol.getName() + "</small>");
        } else {
            Table matSrc = table.getMaterializer();
            if (matSrc != null) {
                sb.append("<small> with " + matSrc.getTypeName() + "</small>");
            }
        }
    }
    sb.append("</td>");
    // column 4: column count
    sb.append("<td>");
    sb.append(table.getColumns().size());
    sb.append("</td>");
    // column 5: index count
    sb.append("<td>");
    sb.append(table.getIndexes().size());
    // computing unused indexes
    int unusedIndexes = 0;
    for (Index index : table.getIndexes()) {
        IndexAnnotation indexAnnotation = (IndexAnnotation) index.getAnnotation();
        if (indexAnnotation == null) {
            unusedIndexes++;
        }
    }
    if (unusedIndexes != 0) {
        sb.append(" (" + unusedIndexes + " unused)");
    }
    sb.append("</td>");
    // column 6: has pkey
    sb.append("<td>");
    boolean found = false;
    for (Constraint constraint : table.getConstraints()) {
        if (ConstraintType.get(constraint.getType()) == ConstraintType.PRIMARY_KEY) {
            found = true;
            break;
        }
    }
    if (found) {
        tag(sb, "info", "Has-PKey");
    } else {
        tag(sb, null, "No-PKey");
    }
    sb.append("</td>");
    // column 6: has tuple limit
    sb.append("<td>");
    if (table.getTuplelimit() != Integer.MAX_VALUE) {
        tag(sb, "info", String.valueOf(table.getTuplelimit()));
        if (CatalogUtil.getLimitPartitionRowsDeleteStmt(table) != null) {
            sb.append("<small>enforced by DELETE statement</small>");
        }
    } else {
        tag(sb, null, "No-limit");
    }
    sb.append("</td>");
    sb.append("</tr>\n");
    // BUILD THE DROPDOWN FOR THE DDL / INDEXES DETAIL
    sb.append("<tr class='tablesorter-childRow'><td class='invert' colspan='7' id='s-" + table.getTypeName().toLowerCase() + "--dropdown'>\n");
    TableAnnotation annotation = (TableAnnotation) table.getAnnotation();
    if (annotation != null) {
        // output the DDL
        if (annotation.ddl == null) {
            sb.append("<p>MISSING DDL</p>\n");
        } else {
            String ddl = escapeHtml4(annotation.ddl);
            sb.append("<p><pre>" + ddl + "</pre></p>\n");
        }
        // make sure procs appear in only one category
        annotation.proceduresThatReadThis.removeAll(annotation.proceduresThatUpdateThis);
        if (annotation.proceduresThatReadThis.size() > 0) {
            sb.append("<p>Read-only by procedures: ");
            List<String> procs = new ArrayList<String>();
            for (Procedure proc : annotation.proceduresThatReadThis) {
                procs.add("<a href='#p-" + proc.getTypeName() + "'>" + proc.getTypeName() + "</a>");
            }
            sb.append(StringUtils.join(procs, ", "));
            sb.append("</p>");
        }
        if (annotation.proceduresThatUpdateThis.size() > 0) {
            sb.append("<p>Read/Write by procedures: ");
            List<String> procs = new ArrayList<String>();
            for (Procedure proc : annotation.proceduresThatUpdateThis) {
                procs.add("<a href='#p-" + proc.getTypeName() + "'>" + proc.getTypeName() + "</a>");
            }
            sb.append(StringUtils.join(procs, ", "));
            sb.append("</p>");
        }
    }
    // LIMIT PARTITION ROW statement may also use the index in this table, prepare the information for report
    if (!table.getTuplelimitdeletestmt().isEmpty()) {
        assert (table.getTuplelimitdeletestmt().size() == 1);
        Statement stmt = table.getTuplelimitdeletestmt().iterator().next();
        for (String tableDotIndexPair : stmt.getIndexesused().split(",")) {
            if (tableDotIndexPair.length() == 0) {
                continue;
            }
            String[] parts = tableDotIndexPair.split("\\.", 2);
            assert (parts.length == 2);
            if (parts.length != 2) {
                continue;
            }
            String tableName = parts[0];
            String indexName = parts[1];
            if (!table.getTypeName().equals(tableName)) {
                continue;
            }
            Index i = table.getIndexes().get(indexName);
            assert (i != null);
            IndexAnnotation ia = (IndexAnnotation) i.getAnnotation();
            if (ia == null) {
                ia = new IndexAnnotation();
                i.setAnnotation(ia);
            }
            ia.statementsThatUseThis.add(stmt);
        }
    }
    if (table.getIndexes().size() > 0) {
        sb.append(generateIndexesTable(table));
    } else {
        sb.append("<p>No indexes defined on table.</p>\n");
    }
    // Generate explainview report.
    if (table.getMaterializer() != null) {
        sb.append(generateExplainViewTable(table));
    }
    sb.append("</td></tr>\n");
    return sb.toString();
}
Also used : Table(org.voltdb.catalog.Table) Constraint(org.voltdb.catalog.Constraint) Statement(org.voltdb.catalog.Statement) ArrayList(java.util.ArrayList) Index(org.voltdb.catalog.Index) Constraint(org.voltdb.catalog.Constraint) Column(org.voltdb.catalog.Column) Procedure(org.voltdb.catalog.Procedure)

Example 4 with Table

use of org.voltdb.catalog.Table in project voltdb by VoltDB.

the class ReportMaker method getStatsHTML.

/**
     * Get some embeddable HTML of some generic catalog/application stats
     * that is drawn on the first page of the report.
     */
static String getStatsHTML(Database db, long requiredHeap, ArrayList<Feedback> warnings) {
    StringBuilder sb = new StringBuilder();
    sb.append("<table class='table table-condensed'>\n");
    // count things
    int indexes = 0, views = 0, statements = 0;
    int partitionedTables = 0, replicatedTables = 0;
    int partitionedProcs = 0, replicatedProcs = 0;
    int readProcs = 0, writeProcs = 0;
    for (Table t : db.getTables()) {
        if (t.getMaterializer() != null) {
            views++;
        } else {
            if (t.getIsreplicated()) {
                replicatedTables++;
            } else {
                partitionedTables++;
            }
        }
        indexes += t.getIndexes().size();
    }
    for (Procedure p : db.getProcedures()) {
        // skip auto-generated crud procs
        if (p.getDefaultproc()) {
            continue;
        }
        if (p.getSinglepartition()) {
            partitionedProcs++;
        } else {
            replicatedProcs++;
        }
        if (p.getReadonly()) {
            readProcs++;
        } else {
            writeProcs++;
        }
        statements += p.getStatements().size();
    }
    // version
    sb.append("<tr><td>Generated by VoltDB Version</td><td>");
    sb.append(VoltDB.instance().getVersionString()).append("</td></tr>\n");
    // timestamp
    sb.append("<tr><td>Last Schema Update on</td><td>");
    SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
    sb.append(sdf.format(m_timestamp)).append("</td></tr>\n");
    // tables
    sb.append("<tr><td>Table Count</td><td>");
    sb.append(String.format("%d (%d partitioned / %d replicated)", partitionedTables + replicatedTables, partitionedTables, replicatedTables));
    sb.append("</td></tr>\n");
    // views
    sb.append("<tr><td>Materialized View Count</td><td>").append(views).append("</td></tr>\n");
    // indexes
    sb.append("<tr><td>Index Count</td><td>").append(indexes).append("</td></tr>\n");
    // procedures
    sb.append("<tr><td>Procedure Count</td><td>");
    sb.append(String.format("%d (%d partitioned / %d replicated) (%d read-only / %d read-write)", partitionedProcs + replicatedProcs, partitionedProcs, replicatedProcs, readProcs, writeProcs));
    sb.append("</td></tr>\n");
    // statements
    sb.append("<tr><td>SQL Statement Count</td><td>").append(statements).append("</td></tr>\n");
    //heap
    sb.append("<tr><td>Required Java Heap</td><td>").append(requiredHeap).append(" Megabytes").append("</td></tr>\n");
    long megabytes = 1024 * 1024;
    long configuredHeap = Runtime.getRuntime().maxMemory() / megabytes;
    if (configuredHeap > requiredHeap) {
        sb.append("<tr><td>Configured Java Heap</td><td>").append(configuredHeap).append(" Megabytes").append("</td></tr>\n");
    } else {
        sb.append("<tr><td>Configured Java Heap</td><td><font color=\"red\">").append(configuredHeap).append("<font color=\"black\">").append(" Megabytes").append("</td></tr>\n");
    }
    sb.append("</table>\n\n");
    // warnings, add warning section if any
    if (warnings.size() > 0) {
        sb.append("<h4>Warnings</h4>");
        sb.append("<table class='table table-condensed'>\n");
        for (Feedback warning : warnings) {
            String procName = warning.getFileName().replace(".class", "");
            String nameLink = "";
            // not a warning during compiling procedures, must from the schema
            if (procName.compareToIgnoreCase("null") == 0) {
                String schemaName = "";
                String warningMsg = warning.getMessage().toLowerCase();
                if (warningMsg.contains("table ")) {
                    int begin = warningMsg.indexOf("table ") + 6;
                    int end = (warningMsg.substring(begin)).indexOf(" ");
                    schemaName = warningMsg.substring(begin, begin + end);
                }
                nameLink = "<a href='#s-" + schemaName + "'>" + schemaName.toUpperCase() + "</a>";
            } else {
                nameLink = "<a href='#p-" + procName.toLowerCase() + "'>" + procName + "</a>";
            }
            sb.append("<tr><td>").append(nameLink).append("</td><td>").append(escapeHtml4(warning.getMessage())).append("</td></tr>\n");
        }
        sb.append("").append("</table>\n").append("</td></tr>\n");
    }
    return sb.toString();
}
Also used : Table(org.voltdb.catalog.Table) Feedback(org.voltdb.compiler.VoltCompiler.Feedback) Procedure(org.voltdb.catalog.Procedure) SimpleDateFormat(java.text.SimpleDateFormat) Constraint(org.voltdb.catalog.Constraint)

Example 5 with Table

use of org.voltdb.catalog.Table in project voltdb by VoltDB.

the class Site method statsTick.

/**
     * Cache the current statistics.
     *
     * @param time
     */
private void statsTick(long time) {
    /*
         * grab the table statistics from ee and put it into the statistics
         * agent.
         */
    if (m_tableStats != null) {
        CatalogMap<Table> tables = m_context.database.getTables();
        int[] tableIds = new int[tables.size()];
        int i = 0;
        for (Table table : tables) {
            tableIds[i++] = table.getRelativeIndex();
        }
        // data to aggregate
        long tupleCount = 0;
        long tupleDataMem = 0;
        long tupleAllocatedMem = 0;
        long indexMem = 0;
        long stringMem = 0;
        // update table stats
        final VoltTable[] s1 = m_ee.getStats(StatsSelector.TABLE, tableIds, false, time);
        if ((s1 != null) && (s1.length > 0)) {
            VoltTable stats = s1[0];
            assert (stats != null);
            // rollup the table memory stats for this site
            while (stats.advanceRow()) {
                //Assert column index matches name for ENG-4092
                assert (stats.getColumnName(7).equals("TUPLE_COUNT"));
                assert (stats.getColumnName(6).equals("TABLE_TYPE"));
                if ("PersistentTable".equals(stats.getString(6))) {
                    tupleCount += stats.getLong(7);
                }
                assert (stats.getColumnName(8).equals("TUPLE_ALLOCATED_MEMORY"));
                tupleAllocatedMem += stats.getLong(8);
                assert (stats.getColumnName(9).equals("TUPLE_DATA_MEMORY"));
                tupleDataMem += stats.getLong(9);
                assert (stats.getColumnName(10).equals("STRING_DATA_MEMORY"));
                stringMem += stats.getLong(10);
            }
            stats.resetRowPosition();
            m_tableStats.setStatsTable(stats);
        } else {
            // the EE returned no table stats, which means there are no tables.
            // Need to ensure the cached stats are cleared to reflect that
            m_tableStats.resetStatsTable();
        }
        // update index stats
        final VoltTable[] s2 = m_ee.getStats(StatsSelector.INDEX, tableIds, false, time);
        if ((s2 != null) && (s2.length > 0)) {
            VoltTable stats = s2[0];
            assert (stats != null);
            // rollup the index memory stats for this site
            while (stats.advanceRow()) {
                //Assert column index matches name for ENG-4092
                assert (stats.getColumnName(11).equals("MEMORY_ESTIMATE"));
                indexMem += stats.getLong(11);
            }
            stats.resetRowPosition();
            m_indexStats.setStatsTable(stats);
        } else {
            // the EE returned no index stats, which means there are no indexes.
            // Need to ensure the cached stats are cleared to reflect that
            m_indexStats.resetStatsTable();
        }
        // update the rolled up memory statistics
        if (m_memStats != null) {
            m_memStats.eeUpdateMemStats(m_siteId, tupleCount, tupleDataMem, tupleAllocatedMem, indexMem, stringMem, m_ee.getThreadLocalPoolAllocations());
        }
    }
}
Also used : VoltTable(org.voltdb.VoltTable) Table(org.voltdb.catalog.Table) VoltTable(org.voltdb.VoltTable)

Aggregations

Table (org.voltdb.catalog.Table)100 Column (org.voltdb.catalog.Column)37 Database (org.voltdb.catalog.Database)23 VoltTable (org.voltdb.VoltTable)21 Constraint (org.voltdb.catalog.Constraint)20 ArrayList (java.util.ArrayList)18 Index (org.voltdb.catalog.Index)17 AbstractExpression (org.voltdb.expressions.AbstractExpression)17 HashSet (java.util.HashSet)13 ColumnRef (org.voltdb.catalog.ColumnRef)10 TupleValueExpression (org.voltdb.expressions.TupleValueExpression)10 HashMap (java.util.HashMap)9 JSONException (org.json_voltpatches.JSONException)9 StmtTargetTableScan (org.voltdb.planner.parseinfo.StmtTargetTableScan)9 SchemaColumn (org.voltdb.plannodes.SchemaColumn)9 Catalog (org.voltdb.catalog.Catalog)7 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)6 MaterializedViewInfo (org.voltdb.catalog.MaterializedViewInfo)6 Procedure (org.voltdb.catalog.Procedure)6 StmtTableScan (org.voltdb.planner.parseinfo.StmtTableScan)6