添加SQL统计功能,统计SQL中所使用的表和字段

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@272 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-06-22 02:08:22 +00:00
parent 18cc6c3a21
commit 0388f78648
3 changed files with 60 additions and 3 deletions
@@ -19,6 +19,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
import com.alibaba.druid.stat.TableStat.Mode;
@@ -80,6 +82,45 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
return false;
}
public boolean visit(OracleSelectTableReference x) {
if (x.getExpr() instanceof SQLIdentifierExpr) {
String ident = ((SQLIdentifierExpr) x.getExpr()).getName();
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
}
Mode mode = modeLocal.get();
switch (mode) {
case Delete:
stat.incrementDeleteCount();
break;
case Insert:
stat.incrementInsertCount();
break;
case Update:
stat.incrementUpdateCount();
break;
case Select:
stat.incrementSelectCount();
break;
default:
break;
}
Map<String, String> aliasMap = aliasLocal.get();
if (aliasMap != null) {
if (x.getAlias() != null) {
aliasMap.put(x.getAlias(), ident);
}
aliasMap.put(ident, ident);
}
}
return false;
}
public boolean visit(SQLSelect x) {
return true;
@@ -244,12 +285,24 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
Mode originalMode = (Mode) x.getAttribute("_original_use_mode");
modeLocal.set(originalMode);
}
public boolean visit(OracleSelectQueryBlock x) {
return visit((SQLSelectQueryBlock) x);
}
public void endVisit(OracleSelectQueryBlock x) {
endVisit((SQLSelectQueryBlock)x);
}
public boolean visit(SQLJoinTableSource x) {
return true;
}
public boolean visit(SQLPropertyExpr x) {
if ("ROWNUM".equalsIgnoreCase(x.getName())) {
return false;
}
if (x.getOwner() instanceof SQLIdentifierExpr) {
String owner = ((SQLIdentifierExpr) x.getOwner()).getName();
@@ -269,6 +322,10 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
}
public boolean visit(SQLIdentifierExpr x) {
if ("ROWNUM".equalsIgnoreCase(x.getName())) {
return false;
}
String currentTable = currentTableLocal.get();
if (currentTable != null) {
@@ -576,8 +576,8 @@ public class OracleSelectParser extends SQLSelectParser {
accept(Token.JOIN);
joinType = OracleSelectJoin.JoinType.FULL_OUTER_JOIN;
}
if (identifierEquals("INNER")) {
if (lexer.token() == Token.INNER) {
lexer.nextToken();
accept(Token.JOIN);
joinType = OracleSelectJoin.JoinType.INNER_JOIN;