From 647fc890aaea4d9b6b8adc3a7205c3161baf1520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 21 May 2012 04:31:47 +0800 Subject: [PATCH] hbase support --- .../druid/hbase/HPreparedStatement.java | 21 ++++++------- .../hbase/hbql/ast/HBQLShowStatement.java | 16 ++++++++++ .../hbase/hbql/ast/HBQLStatementImpl.java | 23 ++++++++++++++ .../hbase/hbql/parser/HBQLExprParser.java | 16 ++++++++++ .../hbql/parser/HBQLStatementParser.java | 9 ++++++ .../hbase/hbql/visitor/HBQLOutputVisitor.java | 24 +++++++++++++++ .../druid/hbase/hbql/visitor/HBQLVisitor.java | 5 +++- .../druid/sql/parser/SQLParserUtils.java | 30 ++++++++++++------- .../druid/sql/parser/SQLStatementParser.java | 11 +++++++ .../com/alibaba/druid/util/JdbcUtils.java | 2 ++ .../druid/hbase/HBQLShowTableTest.java | 29 ++++++++++++++++++ 11 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLShowStatement.java create mode 100644 src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLStatementImpl.java create mode 100644 src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLExprParser.java create mode 100644 src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLOutputVisitor.java create mode 100644 src/test/java/com/alibaba/druid/hbase/HBQLShowTableTest.java diff --git a/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java b/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java index b4846c7384..8d1a1bf6e5 100644 --- a/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java @@ -34,6 +34,8 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare private ExecutePlan executePlan; + private String dbType = "hbase"; + public HPreparedStatement(HBaseConnection conn, String sql) throws SQLException{ super(conn); this.sql = sql; @@ -41,7 +43,7 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare init(); } - + private void splitCondition(List conditions, SQLExpr expr) { if (expr instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) expr; @@ -55,7 +57,6 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare } public void init() throws SQLException { - String dbType = this.hbaseConnection.getConnectProperties().getProperty("dbType"); List stmtList = SQLUtils.parseStatements(sql, dbType); if (stmtList.size() != 1) { @@ -65,7 +66,7 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare SQLStatement sqlStmt = stmtList.get(0); if (sqlStmt instanceof SQLSelectStatement) { SQLSelectStatement selectStmt = (SQLSelectStatement) sqlStmt; - + SQLEvalVisitor evalVisitor = SQLEvalVisitorUtils.createEvalVisitor(dbType); selectStmt.accept(evalVisitor); @@ -76,9 +77,9 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare SingleTableQueryExecutePlan singleTableQueryExecuetePlan = new SingleTableQueryExecutePlan(); singleTableQueryExecuetePlan.setTableName(tableName); - + splitCondition(singleTableQueryExecuetePlan.getConditions(), selectQueryBlock.getWhere()); - + HResultSetMetaData resultMetaData = new HResultSetMetaData(); for (SQLSelectItem selectItem : selectQueryBlock.getSelectList()) { ColumnMetaData columnMetaData = new ColumnMetaData(); @@ -97,20 +98,20 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare SQLEvalVisitor evalVisitor = SQLEvalVisitorUtils.createEvalVisitor(dbType); insertStmt.accept(evalVisitor); - + String tableName = ((SQLIdentifierExpr) insertStmt.getTableSource().getExpr()).getName(); - + InsertExecutePlan insertExecutePlan = new InsertExecutePlan(); insertExecutePlan.setTableName(tableName); - + for (int i = 0; i < insertStmt.getColumns().size(); ++i) { SQLExpr columnExpr = insertStmt.getColumns().get(i); SQLExpr valueExpr = insertStmt.getValues().getValues().get(i); - + String columnName = ((SQLIdentifierExpr) columnExpr).getName(); insertExecutePlan.getColumns().put(columnName, valueExpr); } - + this.executePlan = insertExecutePlan; } else { throw new SQLException("TODO"); diff --git a/src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLShowStatement.java b/src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLShowStatement.java new file mode 100644 index 0000000000..75dafe543c --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLShowStatement.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.hbase.hbql.ast; + +import com.alibaba.druid.hbase.hbql.visitor.HBQLVisitor; + +public class HBQLShowStatement extends HBQLStatementImpl { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public void accept0(HBQLVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLStatementImpl.java b/src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLStatementImpl.java new file mode 100644 index 0000000000..8de6299743 --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/hbql/ast/HBQLStatementImpl.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.hbase.hbql.ast; + +import com.alibaba.druid.hbase.hbql.visitor.HBQLVisitor; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class HBQLStatementImpl extends SQLStatementImpl { + + private static final long serialVersionUID = 1L; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof HBQLVisitor) { + accept0((HBQLVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } + + public void accept0(HBQLVisitor visitor) { + throw new UnsupportedOperationException(this.getClass().getName()); + } +} diff --git a/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLExprParser.java b/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLExprParser.java new file mode 100644 index 0000000000..e8a323d848 --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLExprParser.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.hbase.hbql.parser; + +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLExprParser; + + +public class HBQLExprParser extends SQLExprParser { + public HBQLExprParser(String sql) throws ParserException{ + super(sql); + } + + public HBQLExprParser(Lexer lexer){ + super(lexer); + } +} diff --git a/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLStatementParser.java b/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLStatementParser.java index 1b17b4cd65..fbc58304a4 100644 --- a/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/hbase/hbql/parser/HBQLStatementParser.java @@ -1,5 +1,7 @@ package com.alibaba.druid.hbase.hbql.parser; +import com.alibaba.druid.hbase.hbql.ast.HBQLShowStatement; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLStatementParser; @@ -14,4 +16,11 @@ public class HBQLStatementParser extends SQLStatementParser { public HBQLStatementParser(SQLExprParser exprParser){ super(exprParser); } + + public SQLStatement parseShow() { + acceptIdentifier("SHOW"); + acceptIdentifier("TABLES"); + return new HBQLShowStatement(); + } + } diff --git a/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLOutputVisitor.java b/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLOutputVisitor.java new file mode 100644 index 0000000000..a3a061f470 --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLOutputVisitor.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.hbase.hbql.visitor; + +import com.alibaba.druid.hbase.hbql.ast.HBQLShowStatement; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; + + +public class HBQLOutputVisitor extends SQLASTOutputVisitor implements HBQLVisitor { + + public HBQLOutputVisitor(Appendable appender){ + super(appender); + } + + @Override + public void endVisit(HBQLShowStatement x) { + + } + + @Override + public boolean visit(HBQLShowStatement x) { + print("SHOW TABLES"); + return false; + } + +} diff --git a/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLVisitor.java b/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLVisitor.java index 4c4ac97c8e..8a0af606ae 100644 --- a/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLVisitor.java +++ b/src/main/java/com/alibaba/druid/hbase/hbql/visitor/HBQLVisitor.java @@ -1,8 +1,11 @@ package com.alibaba.druid.hbase.hbql.visitor; +import com.alibaba.druid.hbase.hbql.ast.HBQLShowStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; - public interface HBQLVisitor extends SQLASTVisitor { + void endVisit(HBQLShowStatement x); + + boolean visit(HBQLShowStatement x); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java index 0587fa0833..e9cbe0eaf6 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java @@ -1,5 +1,7 @@ package com.alibaba.druid.sql.parser; +import com.alibaba.druid.hbase.hbql.parser.HBQLExprParser; +import com.alibaba.druid.hbase.hbql.parser.HBQLStatementParser; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; @@ -10,45 +12,53 @@ import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerExprParser; import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; import com.alibaba.druid.util.JdbcUtils; - public class SQLParserUtils { + public static SQLStatementParser createSQLStatementParser(String sql, String dbType) { if (JdbcUtils.ORACLE.equals(dbType)) { return new OracleStatementParser(sql); } - + if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlStatementParser(sql); } - + if (JdbcUtils.POSTGRESQL.equals(dbType)) { return new PGSQLStatementParser(sql); } - + if (JdbcUtils.SQL_SERVER.equals(dbType)) { return new SQLServerStatementParser(sql); } - + + if (JdbcUtils.HBASE.equals(dbType)) { + return new HBQLStatementParser(sql); + } + return new SQLStatementParser(sql); } - + public static SQLExprParser createExprParser(String sql, String dbType) { if (JdbcUtils.ORACLE.equals(dbType)) { return new OracleExprParser(sql); } - + if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlExprParser(sql); } - + if (JdbcUtils.POSTGRESQL.equals(dbType)) { return new PGExprParser(sql); } - + if (JdbcUtils.SQL_SERVER.equals(dbType)) { return new SQLServerExprParser(sql); } - + + if (JdbcUtils.HBASE.equals(dbType)) { + return new HBQLExprParser(sql); + } + return new SQLExprParser(sql); } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 3301429bfa..d215bbf3a3 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -191,6 +191,13 @@ public class SQLStatementParser extends SQLParser { statementList.add(stmt); continue; } + + if (identifierEquals("SHOW")) { + SQLStatement stmt = parseShow(); + + statementList.add(stmt); + continue; + } if (lexer.token() == Token.LPAREN) { char mark_ch = lexer.current(); @@ -236,6 +243,10 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseCommit() { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } + + public SQLStatement parseShow() { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } public SQLUseStatement parseUse() { accept(Token.USE); diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 38bd99ceee..1d6babc983 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -62,6 +62,8 @@ public final class JdbcUtils { public static final String MYSQL = "mysql"; public static final String DERBY = "derby"; + + public static final String HBASE = "hbase"; private final static Log LOG = LogFactory.getLog(JdbcUtils.class); diff --git a/src/test/java/com/alibaba/druid/hbase/HBQLShowTableTest.java b/src/test/java/com/alibaba/druid/hbase/HBQLShowTableTest.java new file mode 100644 index 0000000000..6575d59cd6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/hbase/HBQLShowTableTest.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.hbase; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Properties; + +import junit.framework.TestCase; + + +public class HBQLShowTableTest extends TestCase { + public void test_select_0 () throws Exception { + HDriver driver = new HDriver(); + Connection conn = driver.connect("jdbc:druid-hbase:10.20.153.63", new Properties()); + + PreparedStatement stmt = conn.prepareStatement("SHOW TABLES"); + stmt.setInt(1, 6); + + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + System.out.print(rs.getString(1)); + System.out.println(); + } + rs.close(); + stmt.close(); + + conn.close(); + } +}