提交 6467243a 编写于 作者: J jurgen

Extract single source table from SQL queries

上级 1d315016
......@@ -37,6 +37,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithResult;
import org.jkiss.dbeaver.model.sql.SQLDataSource;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.model.sql.SQLQuery;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.sql.parser.SQLSemanticProcessor;
import org.jkiss.dbeaver.model.struct.*;
......@@ -517,6 +518,9 @@ public final class DBUtils {
DBCAttributeMetaData attrMeta = binding.getMetaAttribute();
DBCEntityMetaData entityMeta = attrMeta.getEntityMetaData();
Object metaSource = attrMeta.getSource();
if (entityMeta == null && metaSource instanceof SQLQuery) {
entityMeta = ((SQLQuery)metaSource).getSingleSource();
}
DBSEntity entity = null;
if (metaSource instanceof DBSEntity) {
entity = (DBSEntity)metaSource;
......
......@@ -21,18 +21,23 @@ package org.jkiss.dbeaver.model.sql;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Database;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.update.Update;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IToken;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData;
import org.jkiss.dbeaver.model.exec.DBCEntityMetaData;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLSyntaxManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.SQLBlockBeginToken;
import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.SQLBlockEndToken;
......@@ -40,6 +45,7 @@ import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.SQLParameterToken;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
......@@ -56,6 +62,7 @@ public class SQLQuery {
private Object data;
private SQLQueryType type;
private Statement statement;
private SingleTableMeta singleTableMeta;
public SQLQuery(String query, int offset, int length)
{
......@@ -66,6 +73,25 @@ public class SQLQuery {
statement = CCJSqlParserUtil.parse(query);
if (statement instanceof Select) {
type = SQLQueryType.SELECT;
// Detect single source table
SelectBody selectBody = ((Select) statement).getSelectBody();
if (selectBody instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) selectBody;
if (plainSelect.getFromItem() instanceof Table &&
CommonUtils.isEmpty(plainSelect.getJoins()) &&
CommonUtils.isEmpty(plainSelect.getGroupByColumnReferences()) &&
plainSelect.getInto() == null)
{
Table fromItem = (Table) plainSelect.getFromItem();
Database database = fromItem.getDatabase();
String schemaName = fromItem.getSchemaName();
String tableName = fromItem.getName();
singleTableMeta = new SingleTableMeta(
database == null ? null : database.getDatabaseName(),
schemaName,
tableName);
}
}
} else if (statement instanceof Insert) {
type = SQLQueryType.INSERT;
} else if (statement instanceof Update) {
......@@ -121,8 +147,8 @@ public class SQLQuery {
return type;
}
public DBSEntity getSingleSource(DBPDataSource dataSource) {
return null;
public DBCEntityMetaData getSingleSource() {
return singleTableMeta;
}
public void parseParameters(IDocument document, SQLSyntaxManager syntaxManager)
......@@ -165,4 +191,37 @@ public class SQLQuery {
return query;
}
private static class SingleTableMeta implements DBCEntityMetaData {
private final String catalogName;
private final String schemaName;
private final String tableName;
private SingleTableMeta(String catalogName, String schemaName, String tableName) {
this.catalogName = catalogName;
this.schemaName = schemaName;
this.tableName = tableName;
}
@Override
public String getCatalogName() {
return catalogName;
}
@Override
public String getSchemaName() {
return schemaName;
}
@Override
public String getEntityName() {
return tableName;
}
@Override
public List<? extends DBCAttributeMetaData> getAttributes() {
return Collections.emptyList();
}
}
}
......@@ -316,7 +316,7 @@ public class SQLQueryJob extends DataSourceJob
sqlQuery,
rsOffset,
rsMaxRows);
curStatement.setStatementSource(partSite.getPart());
curStatement.setStatementSource(sqlStatement);
if (hasParameters) {
// Bind them
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册