All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.lealone.sql.dml.Explain Maven / Gradle / Ivy

/*
 * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
 * and the EPL 1.0 (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.lealone.sql.dml;

import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import org.lealone.db.Database;
import org.lealone.db.result.LocalResult;
import org.lealone.db.result.Result;
import org.lealone.db.session.ServerSession;
import org.lealone.db.table.Column;
import org.lealone.db.value.Value;
import org.lealone.db.value.ValueString;
import org.lealone.sql.PreparedSQLStatement;
import org.lealone.sql.SQLStatement;
import org.lealone.sql.StatementBase;
import org.lealone.sql.expression.Expression;
import org.lealone.sql.expression.ExpressionColumn;

/**
 * This class represents the statement
 * EXPLAIN
 */
public class Explain extends ManipulationStatement {

    private StatementBase command;
    private LocalResult result;
    private boolean executeCommand;

    public Explain(ServerSession session) {
        super(session);
    }

    @Override
    public int getType() {
        return SQLStatement.EXPLAIN;
    }

    @Override
    public boolean isQuery() {
        return true;
    }

    public void setCommand(StatementBase command) {
        this.command = command;
    }

    public void setExecuteCommand(boolean executeCommand) {
        this.executeCommand = executeCommand;
    }

    @Override
    public Result getMetaData() {
        return query(-1);
    }

    @Override
    public PreparedSQLStatement prepare() {
        command.prepare();
        return this;
    }

    @Override
    public Result query(int maxRows) {
        Column column = new Column("PLAN", Value.STRING);
        Database db = session.getDatabase();
        ExpressionColumn expr = new ExpressionColumn(db, column);
        Expression[] expressions = { expr };
        result = new LocalResult(session, expressions, 1);
        if (maxRows >= 0) {
            String plan;
            if (executeCommand) {
                db.statisticsStart();
                if (command.isQuery()) {
                    command.query(maxRows);
                } else {
                    command.update();
                }
                plan = command.getPlanSQL();
                Map statistics = db.statisticsEnd();
                if (statistics != null) {
                    int total = 0;
                    for (Entry e : statistics.entrySet()) {
                        total += e.getValue();
                    }
                    if (total > 0) {
                        statistics = new TreeMap(statistics);
                        StringBuilder buff = new StringBuilder();
                        if (statistics.size() > 1) {
                            buff.append("total: ").append(total).append('\n');
                        }
                        for (Entry e : statistics.entrySet()) {
                            int value = e.getValue();
                            int percent = (int) (100L * value / total);
                            buff.append(e.getKey()).append(": ").append(value);
                            if (statistics.size() > 1) {
                                buff.append(" (").append(percent).append("%)");
                            }
                            buff.append('\n');
                        }
                        plan += "\n/*\n" + buff.toString() + "*/";
                    }
                }
            } else {
                plan = command.getPlanSQL();
            }
            add(plan);
        }
        result.done();
        return result;
    }

    private void add(String text) {
        Value[] row = { ValueString.get(text) };
        result.addRow(row);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy