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

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@274 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-06-22 02:27:21 +00:00
parent b42fe2909d
commit e96cd02a8b
19 changed files with 89 additions and 52 deletions
@@ -26,7 +26,7 @@ import com.alibaba.druid.stat.TableStat.Mode;
public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
private HashMap<String, TableStat> tableStats = new HashMap<String, TableStat>();
private HashMap<TableStat.Name, TableStat> tableStats = new HashMap<TableStat.Name, TableStat>();
private Set<Column> fields = new HashSet<Column>();
private final static ThreadLocal<Map<String, String>> aliasLocal = new ThreadLocal<Map<String, String>>();
@@ -49,7 +49,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
Mode mode = modeLocal.get();
@@ -98,7 +98,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementUpdateCount();
@@ -133,7 +133,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementDeleteCount();
}
@@ -183,7 +183,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementInsertCount();
@@ -221,7 +221,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementInsertCount();
@@ -318,9 +318,13 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter {
return false;
}
public Map<String, TableStat> getTables() {
public Map<TableStat.Name, TableStat> getTables() {
return tableStats;
}
public boolean containsTable(String tableName) {
return tableStats.containsKey(new TableStat.Name(tableName));
}
public Set<Column> getFields() {
return fields;
@@ -25,10 +25,11 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
import com.alibaba.druid.stat.TableStat.Mode;
import com.alibaba.druid.stat.TableStat.Name;
public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
private HashMap<String, TableStat> tableStats = new HashMap<String, TableStat>();
private HashMap<TableStat.Name, TableStat> tableStats = new HashMap<TableStat.Name, TableStat>();
private Set<Column> fields = new HashSet<Column>();
private final static ThreadLocal<Map<String, String>> aliasLocal = new ThreadLocal<Map<String, String>>();
@@ -51,7 +52,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
Mode mode = modeLocal.get();
@@ -90,7 +91,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
Mode mode = modeLocal.get();
@@ -139,7 +140,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementUpdateCount();
@@ -166,7 +167,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementUpdateCount();
@@ -208,7 +209,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementDeleteCount();
@@ -251,7 +252,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
TableStat stat = tableStats.get(ident);
if (stat == null) {
stat = new TableStat();
tableStats.put(ident, stat);
tableStats.put(new TableStat.Name(ident), stat);
}
stat.incrementInsertCount();
@@ -365,9 +366,13 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter {
return false;
}
public Map<String, TableStat> getTables() {
public Map<Name, TableStat> getTables() {
return tableStats;
}
public boolean containsTable(String tableName) {
return tableStats.containsKey(new TableStat.Name(tableName));
}
public Set<Column> getFields() {
return fields;
@@ -22,7 +22,6 @@ public class TableStat {
public int getUpdateCount() {
return updateCount;
}
public void incrementUpdateCount() {
updateCount++;
@@ -35,7 +34,7 @@ public class TableStat {
public int getDeleteCount() {
return deleteCount;
}
public void incrementDeleteCount() {
this.deleteCount++;
}
@@ -43,7 +42,7 @@ public class TableStat {
public void setDeleteCount(int deleteCount) {
this.deleteCount = deleteCount;
}
public void incrementInsertCount() {
this.insertCount++;
}
@@ -74,6 +73,37 @@ public class TableStat {
return buf.toString();
}
public static class Name {
private String name;
public Name(String name){
this.name = name;
}
public String getName() {
return this.name;
}
public int hashCode() {
return this.name.toLowerCase().hashCode();
}
public boolean equals(Object o) {
if (!(o instanceof Name)) {
return false;
}
Name other = (Name) o;
return this.name.equalsIgnoreCase(other.name);
}
public String toString() {
return this.name;
}
}
public static class Column {
private String table;
@@ -29,8 +29,8 @@ public class MySqlSchemaStatVisitorTest1 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("usergroups"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("usergroups"));
Assert.assertEquals(4, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "groupId")));
@@ -57,8 +57,8 @@ public class MySqlSchemaStatVisitorTest1 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("usergroups"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("usergroups"));
Assert.assertEquals(4, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "groupId")));
@@ -29,7 +29,7 @@ public class MySqlSchemaStatVisitorTest2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -54,7 +54,7 @@ public class MySqlSchemaStatVisitorTest2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -79,7 +79,7 @@ public class MySqlSchemaStatVisitorTest2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,8 +29,8 @@ public class MySqlSchemaStatVisitorTest3 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("users2"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("users2"));
Assert.assertEquals(5, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class MySqlSchemaStatVisitorTest4 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class MySqlSchemaStatVisitorTest_Delete extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class MySqlSchemaStatVisitorTest_Subquery extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,8 +29,8 @@ public class MySqlSchemaStatVisitorTest_Subquery2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("groups"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("groups"));
Assert.assertEquals(5, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class MySqlSchemaStatVisitorTest_Update extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -6,8 +6,6 @@ import junit.framework.Assert;
import junit.framework.TestCase;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.stat.TableStat.Column;
@@ -31,8 +29,8 @@ public class OracleSchemaStatVisitorTest1 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("usergroups"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("usergroups"));
Assert.assertEquals(4, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "groupId")));
@@ -45,13 +43,13 @@ public class OracleSchemaStatVisitorTest1 extends TestCase {
public void test_1() throws Exception {
String sql = "select a.name, b.name FROM users a, usergroups b on a.groupId = b.id where a.groupID = ?";
MySqlStatementParser parser = new MySqlStatementParser(sql);
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
Assert.assertEquals(1, statementList.size());
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.accept(visitor);
System.out.println(sql);
@@ -59,8 +57,8 @@ public class OracleSchemaStatVisitorTest1 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("usergroups"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("usergroups"));
Assert.assertEquals(4, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "groupId")));
@@ -29,7 +29,7 @@ public class OracleSchemaStatVisitorTest2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -54,7 +54,7 @@ public class OracleSchemaStatVisitorTest2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -79,7 +79,7 @@ public class OracleSchemaStatVisitorTest2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,8 +29,8 @@ public class OracleSchemaStatVisitorTest3 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("users2"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("users2"));
Assert.assertEquals(5, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class OracleSchemaStatVisitorTest4 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class OracleSchemaStatVisitorTest_Delete extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class OracleSchemaStatVisitorTest_Subquery extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,8 +29,8 @@ public class OracleSchemaStatVisitorTest_Subquery2 extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.getTables().containsKey("groups"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(true, visitor.containsTable("groups"));
Assert.assertEquals(5, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));
@@ -29,7 +29,7 @@ public class OracleSchemaStatVisitorTest_Update extends TestCase {
System.out.println("fields : " + visitor.getFields());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(true, visitor.getTables().containsKey("users"));
Assert.assertEquals(true, visitor.containsTable("users"));
Assert.assertEquals(2, visitor.getFields().size());
Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id")));