diff --git a/src/main/java/com/alibaba/druid/hbase/exec/HBaseUtils.java b/src/main/java/com/alibaba/druid/hbase/exec/HBaseUtils.java new file mode 100644 index 0000000000..f25f53ef42 --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/exec/HBaseUtils.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.hbase.exec; + +import java.io.IOException; +import java.math.BigDecimal; + +import org.apache.hadoop.hbase.util.Bytes; + + +public class HBaseUtils { + public static byte[] toBytes(Object value) throws IOException { + if (value == null) { + return null; + } + + byte[] bytes; + if (value instanceof String) { + String strValue = (String) value; + bytes = Bytes.toBytes(strValue); + } else if (value instanceof Integer) { + int intValue = ((Integer) value).intValue(); + bytes = Bytes.toBytes(intValue); + } else if (value instanceof Long) { + long longValue = ((Long) value).longValue(); + bytes = Bytes.toBytes(longValue); + } else if (value instanceof Boolean) { + boolean booleanValue = ((Boolean) value).booleanValue(); + bytes = Bytes.toBytes(booleanValue); + } else if (value instanceof BigDecimal) { + BigDecimal decimalValue = (BigDecimal) value; + bytes = Bytes.toBytes(decimalValue); + } else { + throw new IOException("TODO"); // TODO + } + + return bytes; + } +} diff --git a/src/main/java/com/alibaba/druid/hbase/exec/InsertExecutePlan.java b/src/main/java/com/alibaba/druid/hbase/exec/InsertExecutePlan.java index 508e1e5311..4a9806aeef 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/InsertExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/InsertExecutePlan.java @@ -1,6 +1,5 @@ package com.alibaba.druid.hbase.exec; -import java.math.BigDecimal; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.Map; @@ -36,26 +35,7 @@ public class InsertExecutePlan extends SingleTableExecutePlan { continue; } - byte[] bytes; - - if (value instanceof String) { - String strValue = (String) value; - bytes = Bytes.toBytes(strValue); - } else if (value instanceof Integer) { - int intValue = ((Integer) value).intValue(); - bytes = Bytes.toBytes(intValue); - } else if (value instanceof Long) { - long longValue = ((Long) value).longValue(); - bytes = Bytes.toBytes(longValue); - } else if (value instanceof Boolean) { - boolean booleanValue = ((Boolean) value).booleanValue(); - bytes = Bytes.toBytes(booleanValue); - } else if (value instanceof BigDecimal) { - BigDecimal decimalValue = (BigDecimal) value; - bytes = Bytes.toBytes(decimalValue); - } else { - throw new SQLException("TODO"); // TODO - } + byte[] bytes = HBaseUtils.toBytes(value); if (put == null) { // first value is key, TODO put = new Put(bytes); 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 3bb08385f3..bd51d6ce90 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/SingleTableQueryExecutePlan.java @@ -12,6 +12,10 @@ 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; +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.visitor.SQLEvalVisitorUtils; public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { @@ -39,8 +43,27 @@ public class SingleTableQueryExecutePlan extends SingleTableExecutePlan { try { HBaseConnection connection = statement.getConnection(); HTableInterface htable = connection.getHTable(getTableName()); - + String dbType = connection.getConnectProperties().getProperty("dbType"); + Scan scan = new Scan(); + + 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 = HBaseUtils.toBytes(value); + if ("id".equals(fieldName)) { + if (condition.getOperator() == SQLBinaryOperator.GreaterThan) { + scan.setStartRow(bytes); + } else if (condition.getOperator() == SQLBinaryOperator.LessThan) { + scan.setStopRow(bytes); + } else { + throw new SQLException("TODO"); + } + } + } + ResultScanner scanner = htable.getScanner(scan); return new HBaseResultSet(statement, htable, scanner); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 767d02d308..5a845b1190 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlEvalVisitorImpl; import com.alibaba.druid.util.JdbcUtils; @@ -40,12 +41,20 @@ public class SQLEvalVisitorUtils { return eval(dbType, sqlObject, Arrays.asList(parameters)); } + public static Object getValue(SQLObject sqlObject) { + if (sqlObject instanceof SQLNumericLiteralExpr) { + return ((SQLNumericLiteralExpr) sqlObject).getNumber(); + } + + return sqlObject.getAttributes().get(EVAL_VALUE); + } + public static Object eval(String dbType, SQLObject sqlObject, List parameters) { SQLEvalVisitor visitor = createEvalVisitor(dbType); visitor.setParameters(parameters); sqlObject.accept(visitor); - Object value = sqlObject.getAttributes().get(EVAL_VALUE); + Object value = getValue(sqlObject); if (value == null) { if (!sqlObject.getAttributes().containsKey(EVAL_VALUE)) { throw new DruidRuntimeException("eval error : " + SQLUtils.toSQLString(sqlObject, dbType));