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

- A QIR visitor throws generic exception for unsupported node

- Better HBase driver (adds filter)
parent 99ea0355
No related branches found
No related tags found
No related merge requests found
......@@ -7,96 +7,177 @@ import qir.ast.expression.logic.*;
import qir.ast.expression.relational.*;
import qir.ast.operator.*;
import qir.ast.value.*;
import qir.util.QIRException;
/**
* Implement IQIRVisitor<T> to visit a QIR tree. The return type of the visit functions in the
* visitor and the accept functions in the QIR nodes is T.
*/
public interface IQIRVisitor<T> {
public abstract T visit(final QIRProject qirProject);
public default T visit(final QIRProject qirProject) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirProject.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRScan qirScan);
public default T visit(final QIRScan qirScan) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirScan.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRFilter qirFilter);
public default T visit(final QIRFilter qirFilter) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirFilter.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRGroupBy qirGroup);
public default T visit(final QIRGroupBy qirGroup) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirGroup.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRSortBy qirOrder);
public default T visit(final QIRSortBy qirOrder) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirOrder.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRJoin qirJoin);
public default T visit(final QIRJoin qirJoin) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirJoin.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLeftJoin qirJoin);
public default T visit(final QIRLeftJoin qirJoin) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirJoin.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRRightJoin qirJoin);
public default T visit(final QIRRightJoin qirJoin) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirJoin.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLimit qirLimit);
public default T visit(final QIRLimit qirLimit) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLimit.getClass().getSimpleName() + ".");
}
public abstract <DBRepr, ConnData> T visit(final QIRDBNode<DBRepr, ConnData> qirDBNode);
public default <DBRepr, ConnData> T visit(final QIRDBNode<DBRepr, ConnData> qirDBNode) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirDBNode.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRBuiltin qirBuiltin);
public default T visit(final QIRBuiltin qirBuiltin) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirBuiltin.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRVariable qirVariable);
public default T visit(final QIRVariable qirVariable) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirVariable.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLambda qirLambda);
public default T visit(final QIRLambda qirLambda) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLambda.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRApply qirApply);
public default T visit(final QIRApply qirApply) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirApply.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRIf qirIf);
public default T visit(final QIRIf qirIf) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirIf.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRPlus qirPlus);
public default T visit(final QIRPlus qirPlus) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirPlus.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRMinus qirMinus);
public default T visit(final QIRMinus qirMinus) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirMinus.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRStar qirStar);
public default T visit(final QIRStar qirStar) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirStar.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRDiv qirDiv);
public default T visit(final QIRDiv qirDiv) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirDiv.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRMod qirMod);
public default T visit(final QIRMod qirMod) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirMod.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRAnd qirAnd);
public default T visit(final QIRAnd qirAnd) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirAnd.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIROr qirOr);
public default T visit(final QIROr qirOr) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirOr.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIREqual qirEqual);
public default T visit(final QIREqual qirEqual) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirEqual.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLowerOrEqual qirLowerOrEqual);
public default T visit(final QIRLowerOrEqual qirLowerOrEqual) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLowerOrEqual.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLowerThan qirLowerThan);
public default T visit(final QIRLowerThan qirLowerThan) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLowerThan.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRNot qirNot);
public default T visit(final QIRNot qirNot) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirNot.getClass().getSimpleName() + ".");
}
public abstract <DBRepr, ConnData> T visit(final QIRTable<DBRepr, ConnData> qirTable);
public default <DBRepr, ConnData> T visit(final QIRTable<DBRepr, ConnData> qirTable) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirTable.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLnil qirLnil);
public default T visit(final QIRLnil qirLnil) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLnil.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLcons qirLcons);
public default T visit(final QIRLcons qirLcons) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLcons.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRLdestr qirLdestr);
public default T visit(final QIRLdestr qirLdestr) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirLdestr.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRTnil qirTnil);
public default T visit(final QIRTnil qirTnil) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirTnil.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRTcons qirTcons);
public default T visit(final QIRTcons qirTcons) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirTcons.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRTdestr qirTdestr);
public default T visit(final QIRTdestr qirTdestr) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirTdestr.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRString qirString);
public default T visit(final QIRString qirString) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirString.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRNumber qirNumber);
public default T visit(final QIRNumber qirNumber) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirNumber.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRBigNumber qirBigNumber);
public default T visit(final QIRBigNumber qirBigNumber) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirBigNumber.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRDouble qirDouble);
public default T visit(final QIRDouble qirDouble) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirDouble.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRBoolean qirBoolean);
public default T visit(final QIRBoolean qirBoolean) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirBoolean.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRNull qirNull);
public default T visit(final QIRNull qirNull) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirNull.getClass().getSimpleName() + ".");
}
public abstract T visit(final QIRTruffleNode qirTruffleNode);
public default T visit(final QIRTruffleNode qirTruffleNode) {
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirTruffleNode.getClass().getSimpleName() + ".");
}
/**
* @param qirNode An unsupported node.
*/
public default T visit(final QIRNode qirNode) {
throw new UnsupportedOperationException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirNode.getClass().getSimpleName() + ".");
throw new QIRException(this.getClass().getSimpleName() + " error: unsupported QIR node " + qirNode.getClass().getSimpleName() + ".");
}
}
\ No newline at end of file
......@@ -16,6 +16,6 @@ public class HBaseQuery {
@Override
public String toString() {
return scan + "@" + tableName;
return "select " + scan.getAttributesMap().keySet().stream().map(x -> x + " ") + " from " + tableName + (scan.getFilter() != null ? " where " + scan.getFilter() : "");
}
}
package qir.driver.hbase;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import qir.ast.expression.relational.*;
import qir.driver.IQIRVisitor;
/**
* Translation from QIR query to SQL query in String format.
*/
final class QIRHBasePredicateVisitor implements IQIRVisitor<Filter> {
@Override
public final Filter visit(final QIREqual qirEqual) { // TODO: rowfilters?
return new SingleColumnValueFilter("default".getBytes(), qirEqual.left.accept(new QIRHBaseValueVisitor()).getBytes(), CompareOp.EQUAL,
qirEqual.right.accept(new QIRHBaseValueVisitor()).getBytes());
}
@Override
public final Filter visit(final QIRLowerOrEqual qirLowerOrEqual) {
return new SingleColumnValueFilter("default".getBytes(), qirLowerOrEqual.left.accept(new QIRHBaseValueVisitor()).getBytes(), CompareOp.LESS_OR_EQUAL,
qirLowerOrEqual.right.accept(new QIRHBaseValueVisitor()).getBytes());
}
@Override
public final Filter visit(final QIRLowerThan qirLowerThan) {
return new SingleColumnValueFilter("default".getBytes(), qirLowerThan.left.accept(new QIRHBaseValueVisitor()).getBytes(), CompareOp.LESS,
qirLowerThan.right.accept(new QIRHBaseValueVisitor()).getBytes());
}
}
\ No newline at end of file
......@@ -4,260 +4,43 @@ 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;
import qir.util.QIRException;
/**
* Translation from QIR to HBase query.
* Translation from QIR query to HBase query in {@link HBaseQuery} format.
*/
final class QIRHBaseQueryVisitor implements IQIRVisitor<HBaseQuery> {
@Override
public HBaseQuery visit(QIRProject qirProject) {
if (!(qirProject.formatter instanceof QIRLambda && ((QIRLambda) qirProject.formatter).body instanceof QIRLcons))
public final HBaseQuery visit(QIRProject qirProject) {
if (!(qirProject.formatter instanceof QIRLambda && ((QIRLambda) qirProject.formatter).body instanceof QIRTcons))
throw new QIRException("QIR SQL Project not implemented for formatter type: " + qirProject.formatter.getClass());
final HBaseQuery child = qirProject.child.accept(this);
for (QIRNode formatter = ((QIRLambda) qirProject.formatter).body; formatter instanceof QIRLcons; formatter = ((QIRLcons) formatter).tail)
child.scan.addColumn("default".getBytes(), ((String) ((QIRBaseValue<?>) ((QIRLcons) formatter).value).value).getBytes());
for (QIRNode formatter = ((QIRLambda) qirProject.formatter).body; formatter instanceof QIRTcons; formatter = ((QIRTcons) formatter).tail)
child.scan.addColumn("default".getBytes(), ((QIRTcons) formatter).accept(new QIRHBaseValueVisitor()).getBytes());
return child;
}
@Override
public HBaseQuery visit(QIRScan qirScan) {
public final HBaseQuery visit(QIRScan qirScan) {
return new HBaseQuery(new Scan(),
(String) ((QIRBaseValue<?>) ((QIRTable<?, ?>) qirScan.table).schemaName).value + ":" + (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;
public final HBaseQuery visit(QIRFilter qirFilter) {
if (!(qirFilter.filter instanceof QIRLambda))
throw new QIRException("QIR HBase Filter not implemented for filter type: " + qirFilter.filter.getClass());
final HBaseQuery child = qirFilter.child.accept(this);
child.scan.setFilter(((QIRLambda) qirFilter.filter).body.accept(new QIRHBasePredicateVisitor()));
return child;
}
@Override
public <DBRepr, ConnData> HBaseQuery visit(QIRDBNode<DBRepr, ConnData> qirDBNode) {
public final <DBRepr, ConnData> HBaseQuery visit(final QIRDBNode<DBRepr, ConnData> 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, ConnData> HBaseQuery visit(QIRTable<DBRepr, ConnData> 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
package qir.driver.hbase;
import qir.ast.*;
import qir.ast.data.*;
import qir.ast.value.*;
import qir.driver.IQIRVisitor;
import qir.util.QIRException;
/**
* Translation from QIR query to SQL query in String format.
*/
final class QIRHBaseValueVisitor implements IQIRVisitor<String> {
@Override
public final String visit(final QIRString qirString) {
return "'" + qirString.value + "'";
}
@Override
public final String visit(final QIRNumber qirNumber) {
return Long.toString(qirNumber.value);
}
@Override
public final String visit(final QIRBigNumber qirBigNumber) {
return qirBigNumber.value.toString();
}
@Override
public final String visit(final QIRDouble qirDouble) {
return qirDouble.value.toString();
}
@Override
public final String visit(final QIRBoolean qirBoolean) {
return qirBoolean.value ? "true" : "false";
}
@Override
public final String visit(final QIRNull qirNull) {
return "null";
}
@Override
public final String visit(final QIRVariable qirVariable) {
return qirVariable.id;
}
@Override
public final String visit(final QIRTcons qirTcons) {
final String value = qirTcons.value.accept(this);
if (value != qirTcons.id)
throw new QIRException(this.getClass().getSimpleName() + ": aliased column not unsupported.");
return value;
}
@Override
public final String visit(final QIRTdestr qirTdestr) {
return qirTdestr.colName;
}
}
\ No newline at end of file
......@@ -18,7 +18,7 @@ import qir.driver.IQIRVisitor;
import qir.util.*;
/**
* Translation from QIR to SQL.
* Translation from QIR query to SQL query in String format.
*/
final class QIRSQLStringVisitor implements IQIRVisitor<String> {
private static String prefix = "_QIR_";
......@@ -112,6 +112,13 @@ final class QIRSQLStringVisitor implements IQIRVisitor<String> {
throw new QIRException("QIR SQL Join not implemented for filter type: " + qirJoin.filter.getClass());
}
@Override
public final String visit(final QIRLimit qirLimit) {
if (qirLimit.limit instanceof QIRLambda)
return qirLimit.child.accept(this) + " limit " + ((QIRLambda) qirLimit.limit).body.accept(this);
return qirLimit.child.accept(this) + " limit " + qirLimit.limit.accept(this);
}
@Override
public final <DBRepr, ConnData> String visit(final QIRDBNode<DBRepr, ConnData> qirDBNode) {
return (String) qirDBNode.translation;
......@@ -122,13 +129,6 @@ final class QIRSQLStringVisitor implements IQIRVisitor<String> {
return qirBuiltin.name;
}
@Override
public final String visit(final QIRLimit qirLimit) {
if (qirLimit.limit instanceof QIRLambda)
return qirLimit.child.accept(this) + " limit " + ((QIRLambda) qirLimit.limit).body.accept(this);
return qirLimit.child.accept(this) + " limit " + qirLimit.limit.accept(this);
}
@Override
public final String visit(final QIRVariable qirVariable) {
return qirVariable.id;
......
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