mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
添加SQL统计功能,统计SQL中所使用的表和字段
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@272 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
+57
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user