Skip to content
Snippets Groups Projects
Commit 657dcc14 authored by Julien Lopez's avatar Julien Lopez
Browse files

Add very basic support for HBase database

parent 8c3cf05c
No related branches found
No related tags found
No related merge requests found
package qir.driver.hbase;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Deque;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import qir.ast.QIRNode;
import qir.ast.data.QIRLcons;
import qir.ast.data.QIRList;
import qir.ast.data.QIRLnil;
import qir.ast.data.QIRTcons;
import qir.ast.data.QIRTnil;
import qir.ast.data.QIRTuple;
import qir.ast.value.QIRNumber;
import qir.ast.value.QIRString;
import qir.driver.ConnectionData;
import qir.driver.DBDriver;
import qir.util.QIRException;
/**
* Abstract driver for HBase databases. Drivers for HBase databases should extend this class.
*
* @param DBRepr The type of representation of a query for the database.
*/
public final class HBaseDriver extends DBDriver<HBaseQuery> {
protected Connection conn;
public HBaseDriver(final ConnectionData connData) {
super(connData);
}
@Override
public void openConnection(final ConnectionData data) throws QIRException {
if (conn != null)
closeConnection();
final Configuration conf = HBaseConfiguration.create();
conf.set("hbase.rootdir", "/home/julien/hbase/root");
conf.set("hbase.zookeeper.property.dataDir", "/home/julien/hbase/root/zookeeper");
try {
conn = ConnectionFactory.createConnection(conf);
} catch (final IOException e) {
e.printStackTrace();
throw new QIRException("Could not open connection to HBase database: " + data.serverName);
}
connData = data;
}
@Override
public final void closeConnection() throws QIRException {
if (conn == null)
return;
try {
conn.close();
} catch (final IOException e) {
e.printStackTrace();
throw new QIRException("Could not close connection to SQL database: " + connData.serverName);
}
conn = null;
}
@Override
public final boolean isConnOpen() {
return conn != null;
}
@Override
public HBaseQuery translate(final QIRNode root) {
return root.accept(new QIRHBaseQueryVisitor());
}
@Override
public QIRList run(final HBaseQuery query) throws QIRException {
final ResultScanner rs;
final Deque<QIRTuple> tmp = new ArrayDeque<>();
QIRList result = QIRLnil.getInstance();
QIRNode data;
try (final Table table = conn.getTable(TableName.valueOf(query.tableName))) {
rs = table.getScanner(query.scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
QIRTuple newTuple = QIRTnil.getInstance();
for (final Cell cell : r.listCells()) {
final String value = Bytes.toString(CellUtil.cloneValue(cell));
try {
data = new QIRNumber(null, Long.parseLong(value));
} catch (NumberFormatException e) {
data = new QIRString(null, value);
}
newTuple = new QIRTcons(null, Bytes.toString(CellUtil.cloneQualifier(cell)), data, newTuple);
}
tmp.push(newTuple);
}
} catch (IOException e) {
e.printStackTrace();
throw new QIRException("Could not execute query " + query.scan);
}
rs.close();
while (!tmp.isEmpty())
result = new QIRLcons(null, tmp.pop(), result);
return result;
}
}
\ No newline at end of file
package qir.driver.hbase;
import org.apache.hadoop.hbase.client.Scan;
/**
* Represents a query for a HBase database.
*/
public class HBaseQuery {
public final Scan scan;
public final String tableName;
public HBaseQuery(Scan scan, String tableName) {
this.scan = scan;
this.tableName = tableName;
}
}
package qir.driver.hbase;
import org.apache.hadoop.hbase.client.Scan;
import qir.ast.*;
import qir.ast.data.*;
import qir.ast.expression.arithmetic.*;
import qir.ast.expression.logic.*;
import qir.ast.expression.relational.*;
import qir.ast.operator.*;
import qir.ast.value.*;
import qir.driver.IQIRVisitor;
/**
* Translation from QIR to HBase query.
*/
final class QIRHBaseQueryVisitor implements IQIRVisitor<HBaseQuery> {
@Override
public HBaseQuery visit(QIRProject qirProject) {
final HBaseQuery child = qirProject.child.accept(this);
child.scan.addColumn("default".getBytes(), "ename".getBytes());
return child;
}
@Override
public HBaseQuery visit(QIRScan qirScan) {
return new HBaseQuery(new Scan(), (String) ((QIRBaseValue<?>) ((QIRTable<?>) qirScan.table).tableName).value);
}
@Override
public HBaseQuery visit(QIRFilter qirFilter) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRGroupBy qirGroup) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRSortBy qirOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRJoin qirJoin) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLeftJoin qirJoin) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRRightJoin qirJoin) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLimit qirLimit) {
// TODO Auto-generated method stub
return null;
}
@Override
public <DBRepr> HBaseQuery visit(QIRDBNode<DBRepr> qirDBNode) {
return (HBaseQuery) qirDBNode.translation;
}
@Override
public HBaseQuery visit(QIRBuiltin qirBuiltin) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRVariable qirVariable) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLambda qirLambda) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRApply qirApply) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRIf qirIf) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRPlus qirPlus) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRMinus qirMinus) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRStar qirStar) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRDiv qirDiv) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRMod qirMod) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRAnd qirAnd) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIROr qirOr) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIREqual qirEqual) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLowerOrEqual qirLowerOrEqual) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLowerThan qirLowerThan) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRNot qirNot) {
// TODO Auto-generated method stub
return null;
}
@Override
public <DBRepr> HBaseQuery visit(QIRTable<DBRepr> qirTable) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLnil qirLnil) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLcons qirLcons) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRLdestr qirLdestr) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRTnil qirTnil) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRTcons qirTcons) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRTdestr qirTdestr) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRString qirString) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRNumber qirNumber) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRBigNumber qirBigNumber) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRDouble qirDouble) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRBoolean qirBoolean) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRNull qirNull) {
// TODO Auto-generated method stub
return null;
}
@Override
public HBaseQuery visit(QIRTruffleNode qirTruffleNode) {
// TODO Auto-generated method stub
return null;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment