diff --git a/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java b/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java index 713cb98cc3..1963d5edd9 100644 --- a/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java +++ b/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java @@ -3,6 +3,7 @@ package com.alibaba.druid.hbase; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import com.alibaba.druid.common.jdbc.PreparedStatementBase; @@ -12,6 +13,8 @@ import com.alibaba.druid.hbase.exec.SingleTableQueryExecutePlan; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; @@ -36,6 +39,18 @@ public class HBasePreparedStatement extends PreparedStatementBase implements Pre init(); } + + private void splitCondition(List conditions, SQLExpr expr) { + if (expr instanceof SQLBinaryOpExpr) { + SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) expr; + if (binaryExpr.getOperator() == SQLBinaryOperator.BooleanAnd) { + splitCondition(conditions, binaryExpr.getLeft()); + splitCondition(conditions, binaryExpr.getRight()); + return; + } + } + conditions.add(expr); + } public void init() throws SQLException { String dbType = this.hbaseConnection.getConnectProperties().getProperty("dbType"); @@ -48,6 +63,9 @@ public class HBasePreparedStatement extends PreparedStatementBase implements Pre SQLStatement sqlStmt = stmtList.get(0); if (sqlStmt instanceof SQLSelectStatement) { SQLSelectStatement selectStmt = (SQLSelectStatement) sqlStmt; + + SQLEvalVisitor evalVisitor = SQLEvalVisitorUtils.createEvalVisitor(dbType); + selectStmt.accept(evalVisitor); SQLSelectQueryBlock selectQueryBlock = (SQLSelectQueryBlock) selectStmt.getSelect().getQuery(); @@ -56,6 +74,9 @@ public class HBasePreparedStatement extends PreparedStatementBase implements Pre SingleTableQueryExecutePlan singleTableQueryExecuetePlan = new SingleTableQueryExecutePlan(); singleTableQueryExecuetePlan.setTableName(tableName); + + List conditions = new ArrayList(); + splitCondition(conditions, selectQueryBlock.getWhere()); this.executePlan = singleTableQueryExecuetePlan; } else if (sqlStmt instanceof SQLInsertStatement) { diff --git a/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java b/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java index 3a2d94e016..4803909937 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java @@ -1,6 +1,8 @@ package com.alibaba.druid.hbase.exec; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.ResultScanner; @@ -12,6 +14,16 @@ import com.alibaba.druid.hbase.HBaseResultSet; public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { + private List columeNames = new ArrayList(); + + public SingleTableQueryExecutePlan(){ + + } + + public List getColumeNames() { + return columeNames; + } + @Override public HBaseResultSet executeQuery(HBasePreparedStatement statement) throws SQLException { try { diff --git a/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java b/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java index fc1e8ea5d3..01380d2093 100644 --- a/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java +++ b/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java @@ -13,7 +13,9 @@ public class HBaseDriverTest extends TestCase { HBaseDriver driver = new HBaseDriver(); Connection conn = driver.connect("jdbc:druid-hbase:10.20.153.63", new Properties()); - PreparedStatement stmt = conn.prepareStatement("SELECT id, name, gender, salary FROM test_user"); + PreparedStatement stmt = conn.prepareStatement("SELECT id, name, gender, salary FROM test_user where id > 3 and id < ?"); + stmt.setInt(1, 6); + ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.print(rs.getInt("id"));