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

Implementation of Limit operator

parent b8d842e7
No related branches found
No related tags found
No related merge requests found
package qir.ast.operator;
import com.oracle.truffle.api.source.SourceSection;
import qir.ast.QIRNode;
import qir.util.IQIRVisitor;
/**
* The {@link QIRLimit} represents the operation that limits the number of results.
*/
public final class QIRLimit extends QIROperator {
/**
* The limit for the number of results.
*/
private final QIRNode limit;
/**
* The next {@link QIROperator} in the tree.
*/
private final QIRNode child;
public QIRLimit(final SourceSection source, final QIRNode limit, final QIRNode child) {
super(source);
this.limit = limit;
this.child = child;
}
public final QIRNode getLimit() {
return limit;
}
public final QIRNode getChild() {
return child;
}
@Override
public final <T> T accept(final IQIRVisitor<T> visitor) {
return visitor.visit(this);
}
}
\ No newline at end of file
......@@ -26,98 +26,126 @@ public class QIRSQLVisitor implements IQIRVisitor<String> {
return res;
}
@Override
public final String visit(final QIRProject qirProject) {
return "select " + qirProject.getFormatter().accept(this) + " " + qirProject.getChild().accept(this);
}
@Override
public final String visit(final QIRScan qirScan) {
return "from " + qirScan.getTable().accept(this);
}
@Override
public final String visit(final QIRSelect qirSelect) {
return qirSelect.getChild().accept(this) + " where " + qirSelect.getFilter().accept(this);
}
// TODO: Do something with "eq" attribute of QIRGroup.
@Override
public final String visit(final QIRGroup qirGroup) {
return qirGroup.getChild().accept(this) + " group by " + qirGroup.getGroup().accept(this);
}
@Override
public final String visit(final QIROrder qirOrder) {
return qirOrder.getChild().accept(this) + " order by " + qirOrder.getOrder().accept(this);
}
// TODO: Do something with "filter" attribute of QIRJoin.
@Override
public final String visit(final QIRJoin qirJoin) {
final String right = qirJoin.getRight().accept(this);
return qirJoin.getLeft().accept(this) + " natural join " + (right.substring(0, 5).equals("from ") ? right.substring(5) : right);
}
@Override
public final String visit(final QIRLimit qirLimit) {
return qirLimit.getChild().accept(this) + " limit " + qirLimit.getLimit().accept(this);
}
@Override
public final String visit(final QIRLambda qirLambda) {
return qirLambda.getBody().accept(this);
}
@Override
public final String visit(final QIRApply qirApply) {
return qirApply.getLeft().accept(this) + "(" + qirApply.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRPlus qirPlus) {
return "(" + qirPlus.getLeft().accept(this) + ") + (" + qirPlus.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRMinus qirMinus) {
return "(" + qirMinus.getLeft().accept(this) + ") - (" + qirMinus.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRStar qirStar) {
return "(" + qirStar.getLeft().accept(this) + ") * (" + qirStar.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRDiv qirDiv) {
return "(" + qirDiv.getLeft().accept(this) + ") / (" + qirDiv.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRMod qirMod) {
return "(" + qirMod.getLeft().accept(this) + ") / (" + qirMod.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRAnd qirAnd) {
return "(" + qirAnd.getLeft().accept(this) + ") AND (" + qirAnd.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIROr qirOr) {
return "(" + qirOr.getLeft().accept(this) + ") OR (" + qirOr.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIREqual qirEqual) {
return "(" + qirEqual.getLeft().accept(this) + ") = (" + qirEqual.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRGreaterOrEqual qirGreaterOrEqual) {
return "(" + qirGreaterOrEqual.getLeft().accept(this) + ") >= (" + qirGreaterOrEqual.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRGreaterThan qirGreaterThan) {
return "(" + qirGreaterThan.getLeft().accept(this) + ") > (" + qirGreaterThan.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRLowerOrEqual qirLowerOrEqual) {
return "(" + qirLowerOrEqual.getLeft().accept(this) + ") <= (" + qirLowerOrEqual.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRLowerThan qirLowerThan) {
return "(" + qirLowerThan.getLeft().accept(this) + ") < (" + qirLowerThan.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRNotEqual qirNotEqual) {
return "(" + qirNotEqual.getLeft().accept(this) + ") != (" + qirNotEqual.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRNot qirNot) {
return "NOT (" + qirNot.getChild().accept(this) + ")";
}
@Override
public final String visit(final QIRTable qirTable) {
return qirTable.getTableName();
}
......@@ -125,10 +153,12 @@ public class QIRSQLVisitor implements IQIRVisitor<String> {
/**
* @param qirLnil Unique instance of the empty list in QIR.
*/
@Override
public final String visit(final QIRLnil qirLnil) {
return "";
}
@Override
public final String visit(final QIRLcons qirLcons) {
final String value = qirLcons.getValue().accept(this);
final String tail = qirLcons.getTail().accept(this);
......@@ -141,6 +171,7 @@ public class QIRSQLVisitor implements IQIRVisitor<String> {
/**
* @param qirLdestr Unsupported feature.
*/
@Override
public final String visit(final QIRLdestr qirLdestr) {
throw new UnsupportedOperationException(this.getClass().getSimpleName() + " error: unsupported node.");
}
......@@ -148,10 +179,12 @@ public class QIRSQLVisitor implements IQIRVisitor<String> {
/**
* @param qirTnil Unique instance of the empty tuple in QIR.
*/
@Override
public final String visit(final QIRTnil qirTnil) {
return "";
}
@Override
public final String visit(final QIRTcons qirTcons) {
final String id = qirTcons.getId();
String value = qirTcons.getValue().accept(this);
......@@ -163,26 +196,32 @@ public class QIRSQLVisitor implements IQIRVisitor<String> {
return value + ", " + tail;
}
@Override
public final String visit(final QIRTdestr qirTdestr) {
return qirTdestr.getColName();
}
@Override
public final String visit(final QIRString qirString) {
return "'" + qirString.getValue() + "'";
}
@Override
public final String visit(final QIRNumber qirNumber) {
return Long.toString(qirNumber.getValue());
}
@Override
public final String visit(final QIRBigNumber qirBigNumber) {
return qirBigNumber.getValue().toString();
}
@Override
public final String visit(final QIRBoolean qirBoolean) {
return qirBoolean.getValue() ? "true" : "false";
}
@Override
public final String visit(final QIRTruffleNode qirTruffleNode) {
final String funName = qirTruffleNode.getName();
prolog.put(funName, qirTruffleNode.getCode());
......
......@@ -49,6 +49,11 @@ public final class QIRGreedyReduceVisitor implements IQIRVisitor<QIRNode> {
return new QIRJoin(qirJoin.getSourceSection(), qirJoin.getFilter().accept(this), qirJoin.getLeft().accept(this), qirJoin.getRight().accept(this));
}
@Override
public final QIRNode visit(final QIRLimit qirLimit) {
return new QIRLimit(qirLimit.getSourceSection(), qirLimit.getLimit().accept(this), qirLimit.getChild().accept(this));
}
@Override
public final QIRNode visit(final QIRLambda qirLambda) {
return new QIRLambda(qirLambda.getSourceSection(), qirLambda.getName(), qirLambda.getVar(), qirLambda.getBody().accept(this));
......
......@@ -25,6 +25,8 @@ public interface IQIRVisitor<T> {
public abstract T visit(final QIRJoin qirJoin);
public abstract T visit(final QIRLimit qirLimit);
public default T visit(final QIROperator qirOperator) {
throw new UnsupportedOperationException("Error: unsupported operator " + qirOperator.getClass().getSimpleName() + ".");
}
......
......@@ -54,6 +54,12 @@ public final class QIRFreeVarsVisitor implements IQIRVisitor<HashMap<String, QIR
return qirJoin.getRight().accept(this);
}
@Override
public final HashMap<String, QIRVariable> visit(final QIRLimit qirLimit) {
qirLimit.getLimit().accept(this);
return qirLimit.getChild().accept(this);
}
@Override
public final HashMap<String, QIRVariable> visit(final QIRLambda qirLambda) {
final QIRVariable var = qirLambda.getVar();
......
......@@ -39,6 +39,11 @@ public final class QIRPrintVisitor implements IQIRVisitor<String> {
return "Join(" + qirJoin.getFilter().accept(this) + ", " + qirJoin.getLeft().accept(this) + ", " + qirJoin.getRight().accept(this) + ")";
}
@Override
public final String visit(final QIRLimit qirLimit) {
return "Limit(" + qirLimit.getLimit().accept(this) + ", " + qirLimit.getChild().accept(this) + ")";
}
@Override
public final String visit(final QIRLambda qirLambda) {
return "(function:" + qirLambda.getName() + " " + ((qirLambda.getVar() != null) ? qirLambda.getVar().getId() : "<none>") + " -> " + qirLambda.getBody().accept(this) + ")";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment