From 4c40ac259e80d3e083ecd54e3907c28dce053ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sat, 19 May 2012 16:08:50 +0800 Subject: [PATCH] hbase support --- .../exec/SingleTableQueryExecutePlan.java | 24 ++++++++++++++++++- .../alibaba/druid/hbase/HBaseDriverTest.java | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) 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 bd51d6ce90..34f8bbb272 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java @@ -7,6 +7,11 @@ import java.util.List; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.filter.BinaryComparator; +import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; +import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.FilterList; +import org.apache.hadoop.hbase.filter.RowFilter; import com.alibaba.druid.hbase.HBaseConnection; import com.alibaba.druid.hbase.HBasePreparedStatement; @@ -54,13 +59,18 @@ public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { byte[] bytes = HBaseUtils.toBytes(value); if ("id".equals(fieldName)) { - if (condition.getOperator() == SQLBinaryOperator.GreaterThan) { + if (condition.getOperator() == SQLBinaryOperator.GreaterThanOrEqual) { scan.setStartRow(bytes); } else if (condition.getOperator() == SQLBinaryOperator.LessThan) { scan.setStopRow(bytes); + } else if (condition.getOperator() == SQLBinaryOperator.LessThanOrEqual) { + RowFilter filter = new RowFilter(CompareOp.LESS_OR_EQUAL, new BinaryComparator(bytes)); + setFilter(scan, filter); } else { throw new SQLException("TODO"); } + } else { + } } @@ -73,5 +83,17 @@ public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { throw new SQLException("executeQuery error", e); } } + + void setFilter(Scan scan, Filter filter) { + if (scan.getFilter() == null) { + scan.setFilter(filter); + } else if (scan.getFilter() instanceof FilterList) { + FilterList filterList = (FilterList) scan.getFilter(); + filterList.addFilter(filter); + } else { + FilterList filterList = new FilterList(scan.getFilter(), filter); + scan.setFilter(filterList); + } + } } diff --git a/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java b/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java index 01380d2093..6952745253 100644 --- a/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java +++ b/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java @@ -13,7 +13,7 @@ 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 where id > 3 and id < ?"); + 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();