From 664a4b1258ff796ebd95ce657952461fc420c550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 21 May 2012 21:29:39 +0800 Subject: [PATCH] hbase support --- .../impl/execute/SingleTableExecutePlan.java | 5 ++ .../execute/SingleTableQueryExecutePlan.java | 83 ++++++++++--------- .../impl/mapping/HMappingDefaultImpl.java | 3 - 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableExecutePlan.java b/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableExecutePlan.java index e984577797..87fb78b2ac 100644 --- a/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableExecutePlan.java @@ -1,6 +1,7 @@ package com.alibaba.druid.hdriver.impl.execute; import com.alibaba.druid.hdriver.impl.mapping.HMapping; +import com.alibaba.druid.hdriver.impl.mapping.HMappingDefaultImpl; public class SingleTableExecutePlan extends ExecutePlanAdapter { @@ -17,6 +18,10 @@ public class SingleTableExecutePlan extends ExecutePlanAdapter { } public HMapping getMapping() { + HMapping mapping = this.mapping; + if (mapping == null) { + mapping = new HMappingDefaultImpl(); + } return mapping; } diff --git a/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableQueryExecutePlan.java b/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableQueryExecutePlan.java index b8439a6dcd..d7cbd2f8ae 100644 --- a/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableQueryExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hdriver/impl/execute/SingleTableQueryExecutePlan.java @@ -1,5 +1,6 @@ package com.alibaba.druid.hdriver.impl.execute; +import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -33,6 +34,11 @@ public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { private HResultSetMetaDataImpl resultMetaData; + private String dbType = "hbase"; + + private Scan scan; + private HPreparedStatementImpl statement; + public SingleTableQueryExecutePlan(){ } @@ -66,51 +72,13 @@ public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { } HBaseConnectionImpl connection = statement.getConnection(); - String dbType = connection.getConnectProperties().getProperty("dbType"); - Scan scan = new Scan(); + scan = new Scan(); + this.statement = statement; for (SQLExpr item : conditions) { SQLBinaryOpExpr condition = (SQLBinaryOpExpr) item; - String fieldName = ((SQLIdentifierExpr) condition.getLeft()).getName(); - Object value = SQLEvalVisitorUtils.eval(dbType, condition.getRight(), statement.getParameters()); - - byte[] bytes = mapping.toBytes(fieldName, value); - if (mapping.isRow(fieldName)) { - 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 { - byte[] qualifier = mapping.getQualifier(fieldName); - byte[] family = mapping.getFamily(fieldName); - - CompareOp compareOp; - if (condition.getOperator() == SQLBinaryOperator.Equality) { - compareOp = CompareOp.EQUAL; - } else if (condition.getOperator() == SQLBinaryOperator.GreaterThan) { - compareOp = CompareOp.GREATER; - } else if (condition.getOperator() == SQLBinaryOperator.GreaterThanOrEqual) { - compareOp = CompareOp.GREATER_OR_EQUAL; - } else if (condition.getOperator() == SQLBinaryOperator.LessThan) { - compareOp = CompareOp.LESS; - } else if (condition.getOperator() == SQLBinaryOperator.LessThanOrEqual) { - compareOp = CompareOp.LESS_OR_EQUAL; - } else if (condition.getOperator() == SQLBinaryOperator.NotEqual) { - compareOp = CompareOp.NOT_EQUAL; - } else { - throw new SQLException("TODO"); - } - - SingleColumnValueFilter filter = new SingleColumnValueFilter(family, qualifier, compareOp, bytes); - setFilter(scan, filter); - } + setFilter(condition); } HTableInterface htable = connection.getHTable(getTableName()); @@ -124,6 +92,39 @@ public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { throw e; } catch (Exception e) { throw new SQLException("executeQuery error", e); + } finally { + scan = null; + this.statement = null; + } + } + + private void setFilter(SQLBinaryOpExpr condition) throws IOException, + SQLException { + HMapping mapping = this.getMapping(); + + String fieldName = ((SQLIdentifierExpr) condition.getLeft()).getName(); + Object value = SQLEvalVisitorUtils.eval(dbType, condition.getRight(), statement.getParameters()); + + byte[] bytes = mapping.toBytes(fieldName, value); + if (mapping.isRow(fieldName)) { + 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 { + byte[] qualifier = mapping.getQualifier(fieldName); + byte[] family = mapping.getFamily(fieldName); + + CompareOp compareOp = toCompareOp(condition.getOperator()); + + SingleColumnValueFilter filter = new SingleColumnValueFilter(family, qualifier, compareOp, bytes); + setFilter(scan, filter); } } diff --git a/src/main/java/com/alibaba/druid/hdriver/impl/mapping/HMappingDefaultImpl.java b/src/main/java/com/alibaba/druid/hdriver/impl/mapping/HMappingDefaultImpl.java index 999e0c90ec..f51b17b78a 100644 --- a/src/main/java/com/alibaba/druid/hdriver/impl/mapping/HMappingDefaultImpl.java +++ b/src/main/java/com/alibaba/druid/hdriver/impl/mapping/HMappingDefaultImpl.java @@ -1,8 +1,5 @@ package com.alibaba.druid.hdriver.impl.mapping; -import java.io.IOException; -import java.math.BigDecimal; - import org.apache.hadoop.hbase.util.Bytes; public class HMappingDefaultImpl extends HMappingAdapter implements HMapping {