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

Add builtin, fix group and order

parent bddea90d
No related branches found
No related tags found
No related merge requests found
package qir.ast;
import com.oracle.truffle.api.source.SourceSection;
import qir.util.QIRAny;
import qir.visitor.IQIRVisitor;
public class QIRBuiltin extends QIRNode {
public final String name;
public QIRBuiltin(SourceSection sourceSection, String name) {
super(sourceSection);
this.name = name;
}
@Override
public String toString() {
return "Builtin(" + name + ")";
}
@Override
public boolean equals(Object other) {
if (other instanceof QIRAny)
return true;
if (!(other instanceof QIRBuiltin))
return false;
return name.equals(((QIRBuiltin) other).name);
}
@Override
public <T> T accept(IQIRVisitor<T> visitor) {
return visitor.visit(this);
}
}
......@@ -11,12 +11,7 @@ import qir.visitor.IQIRVisitor;
*/
public final class QIRGroup extends QIROperator {
/**
* The equality function between two tuples. Used to create the different groups.
*/
public final QIRNode eq;
/**
* The grouping function that takes a list of tuples, aggregates the tuples according to eq, and
* returns the list of aggregated tuples.
* The list of grouping rows.
*/
public final QIRNode group;
/**
......@@ -24,16 +19,15 @@ public final class QIRGroup extends QIROperator {
*/
public final QIRNode child;
public QIRGroup(final SourceSection source, final QIRNode eq, final QIRNode group, final QIRNode child) {
public QIRGroup(final SourceSection source, final QIRNode group, final QIRNode child) {
super(source);
this.eq = eq;
this.group = group;
this.child = child;
}
@Override
public final String toString() {
return "Group(" + eq + ", " + group + ", " + child + ")";
return "Group(" + group + ", " + child + ")";
}
@Override
......@@ -42,7 +36,7 @@ public final class QIRGroup extends QIROperator {
return true;
if (!(other instanceof QIRGroup))
return false;
return eq.equals(((QIRGroup) other).eq) && group.equals(((QIRGroup) other).group) && child.equals(((QIRGroup) other).child);
return group.equals(((QIRGroup) other).group) && child.equals(((QIRGroup) other).child);
}
@Override
......
......@@ -11,8 +11,7 @@ import qir.visitor.IQIRVisitor;
*/
public final class QIROrder extends QIROperator {
/**
* The ordering function that takes a list of tuples, sort them according to some strategy, and
* returns the sorted list of tuples.
* The list of ordering rows.
*/
public final QIRNode order;
/**
......
package qir.ast.value;
import com.oracle.truffle.api.source.SourceSection;
import qir.util.QIRAny;
import qir.visitor.IQIRVisitor;
/**
* The {@link QIRDouble} represents an integer that can be represented as a Long.
*/
public final class QIRDouble extends QIRBaseValue<Double> {
public QIRDouble(final SourceSection source, final double value) {
super(source, value);
}
@Override
public boolean equals(Object other) {
if (other instanceof QIRAny)
return true;
if (!(other instanceof QIRDouble))
return false;
return value.equals(((QIRDouble) other).value);
}
@Override
public final <T> T accept(final IQIRVisitor<T> visitor) {
return visitor.visit(this);
}
}
\ No newline at end of file
......@@ -21,6 +21,7 @@ import qir.ast.data.QIRTcons;
import qir.ast.data.QIRTnil;
import qir.ast.data.QIRTuple;
import qir.ast.value.QIRBoolean;
import qir.ast.value.QIRDouble;
import qir.ast.value.QIRNumber;
import qir.ast.value.QIRString;
import qir.util.QIRException;
......@@ -50,12 +51,16 @@ public abstract class SQLStringDriver extends SQLDriver<String> {
for (int i = rs.getMetaData().getColumnCount(); i >= 1; i--) {
int type = rs.getMetaData().getColumnType(i);
switch (type) {
case Types.NUMERIC:
case Types.INTEGER:
case Types.DOUBLE:
// TODO: Handle overflow
case Types.NUMERIC:
data = new QIRNumber(SourceSection.createUnavailable("QIRNode", "QIRNumber"), rs.getLong(i));
break;
case Types.BOOLEAN:
data = new QIRBoolean(SourceSection.createUnavailable("QIRNode", "QIRBoolean"), rs.getBoolean(i));
break;
case Types.DOUBLE:
data = new QIRDouble(SourceSection.createUnavailable("QIRNode", "QIRDouble"), rs.getDouble(i));
break;
case Types.OTHER:
String v = rs.getString(i);
v = v.substring(1, v.length() - 1);
......
......@@ -29,6 +29,8 @@ public interface IQIRVisitor<T> {
public abstract <DBRepr> T visit(final QIRDBNode<DBRepr> qirDBNode);
public abstract T visit(final QIRBuiltin qirBuiltin);
public abstract T visit(final QIRVariable qirVariable);
public abstract T visit(final QIRLambda qirLambda);
......@@ -79,6 +81,8 @@ public interface IQIRVisitor<T> {
public abstract T visit(final QIRBigNumber qirBigNumber);
public abstract T visit(final QIRDouble qirDouble);
public abstract T visit(final QIRBoolean qirBoolean);
public abstract T visit(final QIRNull qirNull);
......
......@@ -52,10 +52,10 @@ public final class QIRCompileVisitor implements IQIRVisitor<QIRNode> {
if (child instanceof QIRDBNode)
try {
return new QIRDBNode<>(child.sourceSection, ((QIRDBNode<?>) child).driver, new QIRGroup(qirGroup.sourceSection, qirGroup.eq, qirGroup.group, child));
return new QIRDBNode<>(child.sourceSection, ((QIRDBNode<?>) child).driver, new QIRGroup(qirGroup.sourceSection, qirGroup.group, child));
} catch (QIRException e) {
}
return new QIRGroup(qirGroup.sourceSection, qirGroup.eq.accept(this), qirGroup.group.accept(this), child);
return new QIRGroup(qirGroup.sourceSection, qirGroup.group.accept(this), child);
}
@Override
......@@ -100,6 +100,11 @@ public final class QIRCompileVisitor implements IQIRVisitor<QIRNode> {
return qirDBNode;
}
@Override
public final QIRNode visit(final QIRBuiltin qirBuiltin) {
return qirBuiltin;
}
@Override
public final QIRNode visit(final QIRLambda qirLambda) {
return new QIRLambda(qirLambda.sourceSection, qirLambda.funName, qirLambda.var, qirLambda.body.accept(this));
......@@ -225,6 +230,11 @@ public final class QIRCompileVisitor implements IQIRVisitor<QIRNode> {
return qirBigNumber;
}
@Override
public final QIRNode visit(final QIRDouble qirDouble) {
return qirDouble;
}
@Override
public final QIRNode visit(final QIRBoolean qirBoolean) {
return qirBoolean;
......
......@@ -95,6 +95,11 @@ public final class QIREvaluationVisitor implements IQIRVisitor<QIRNode> {
return driver.run(qirDBNode.translation);
}
@Override
public final QIRNode visit(final QIRBuiltin qirBuiltin) {
return qirBuiltin;
}
@Override
public QIRNode visit(QIRVariable qirVariable) {
return env.get(qirVariable.id);
......@@ -349,6 +354,11 @@ public final class QIREvaluationVisitor implements IQIRVisitor<QIRNode> {
return qirBigNumber;
}
@Override
public final QIRNode visit(final QIRDouble qirDouble) {
return qirDouble;
}
@Override
public QIRNode visit(QIRBoolean qirBoolean) {
return qirBoolean;
......
......@@ -38,7 +38,6 @@ public final class QIRFreeVarsVisitor implements IQIRVisitor<Map<String, QIRVari
@Override
public final Map<String, QIRVariable> visit(final QIRGroup qirGroup) {
qirGroup.eq.accept(this);
qirGroup.group.accept(this);
return qirGroup.child.accept(this);
}
......@@ -67,6 +66,11 @@ public final class QIRFreeVarsVisitor implements IQIRVisitor<Map<String, QIRVari
return freeVariables;
}
@Override
public final Map<String, QIRVariable> visit(final QIRBuiltin qirBuiltin) {
return freeVariables;
}
@Override
public final Map<String, QIRVariable> visit(final QIRLambda qirLambda) {
final QIRVariable var = qirLambda.var;
......@@ -211,6 +215,11 @@ public final class QIRFreeVarsVisitor implements IQIRVisitor<Map<String, QIRVari
return freeVariables;
}
@Override
public final Map<String, QIRVariable> visit(final QIRDouble qirDouble) {
return freeVariables;
}
@Override
public final Map<String, QIRVariable> visit(final QIRBoolean qirBoolean) {
return freeVariables;
......
......@@ -13,6 +13,7 @@ import qir.ast.operator.*;
import qir.ast.value.QIRBaseValue;
import qir.ast.value.QIRBigNumber;
import qir.ast.value.QIRBoolean;
import qir.ast.value.QIRDouble;
import qir.ast.value.QIRNumber;
import qir.ast.value.QIRString;
......@@ -40,7 +41,7 @@ public final class QIRGreedyReduceVisitor implements IQIRVisitor<QIRNode> {
@Override
public final QIRNode visit(final QIRGroup qirGroup) {
return new QIRGroup(qirGroup.sourceSection, qirGroup.eq.accept(this), qirGroup.group.accept(this), qirGroup.child.accept(this));
return new QIRGroup(qirGroup.sourceSection, qirGroup.group.accept(this), qirGroup.child.accept(this));
}
@Override
......@@ -63,6 +64,11 @@ public final class QIRGreedyReduceVisitor implements IQIRVisitor<QIRNode> {
return qirDBNode;
}
@Override
public final QIRNode visit(final QIRBuiltin qirBuiltin) {
return qirBuiltin;
}
@Override
public final QIRNode visit(final QIRLambda qirLambda) {
return new QIRLambda(qirLambda.sourceSection, qirLambda.funName, qirLambda.var, qirLambda.body.accept(this));
......@@ -244,6 +250,11 @@ public final class QIRGreedyReduceVisitor implements IQIRVisitor<QIRNode> {
return qirBigNumber;
}
@Override
public final QIRNode visit(final QIRDouble qirDouble) {
return qirDouble;
}
@Override
public final QIRNode visit(final QIRBoolean qirBoolean) {
return qirBoolean;
......
......@@ -97,6 +97,11 @@ public final class QIRSQLStringVisitor implements IQIRVisitor<String> {
return (String) qirDBNode.translation;
}
@Override
public final String visit(final QIRBuiltin qirBuiltin) {
return qirBuiltin.name;
}
@Override
public final String visit(final QIRLimit qirLimit) {
final QIRNode limit = qirLimit.limit;
......@@ -144,6 +149,18 @@ public final class QIRSQLStringVisitor implements IQIRVisitor<String> {
res = "select (" + res + ") from (" + id.getValue().accept(this) + ") as " + id.getKey();
return res;
}
if (curr instanceof QIRBuiltin) {
final String name = ((QIRBuiltin) curr).name;
if (name.equals("date"))
return name + " " + args.stream().map(arg -> arg.accept(this)).collect(Collectors.joining(" "));
if (name.equals("interval")) {
final String expr = args.pop().accept(this);
final String format = args.pop().accept(this);
return name + " " + expr + " " + format.substring(1, format.length() - 1);
}
if (name.equals("count") && args.size() == 0)
return "count(*)";
}
return curr.accept(this) + "(" + args.stream().map(arg -> arg.accept(this)).collect(Collectors.joining(", ")) + ")";
}
......@@ -282,6 +299,11 @@ public final class QIRSQLStringVisitor implements IQIRVisitor<String> {
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";
......
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