diff --git a/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java b/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java index 3a82609913..0d2e497b7a 100644 --- a/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java +++ b/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java @@ -12,6 +12,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 +38,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"); @@ -59,6 +73,8 @@ public class HBasePreparedStatement extends PreparedStatementBase implements Pre SingleTableQueryExecutePlan singleTableQueryExecuetePlan = new SingleTableQueryExecutePlan(); singleTableQueryExecuetePlan.setTableName(tableName); + + splitCondition(singleTableQueryExecuetePlan.getConditions(), 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 4803909937..3bb08385f3 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java @@ -11,10 +11,20 @@ import org.apache.hadoop.hbase.client.Scan; import com.alibaba.druid.hbase.HBaseConnection; import com.alibaba.druid.hbase.HBasePreparedStatement; import com.alibaba.druid.hbase.HBaseResultSet; +import com.alibaba.druid.sql.ast.SQLExpr; public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { - private List columeNames = new ArrayList(); + private List columeNames = new ArrayList(); + private List conditions = new ArrayList(); + + public List getConditions() { + return conditions; + } + + public void setConditions(List conditions) { + this.conditions = conditions; + } public SingleTableQueryExecutePlan(){ 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"));