Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -1431,7 +1431,7 @@ public StaticContext visitFlowrExpression(FlworExpression expression, StaticCont
forArities = SequenceType.Arity.ZeroOrMore;
}
}
clause = clause.getNextClause();
clause = clause.getParentClause();
}

SequenceType returnType = expression.getReturnClause().getReturnExpr().getInferredSequenceType();
Expand Down Expand Up @@ -1476,7 +1476,7 @@ public StaticContext visitForClause(ForClause expression, StaticContext argument
checkVariableType(
declaredType,
inferredType,
expression.getNextClause().getStaticContext(),
expression.getParentClause().getStaticContext(),
expression.getClass().getSimpleName(),
expression.getVariableName()
);
Expand All @@ -1495,7 +1495,7 @@ public StaticContext visitLetClause(LetClause expression, StaticContext argument
checkVariableType(
declaredType,
inferredType,
expression.getNextClause().getStaticContext(),
expression.getParentClause().getStaticContext(),
expression.getClass().getSimpleName(),
expression.getVariableName()
);
Expand Down Expand Up @@ -1525,8 +1525,8 @@ public StaticContext visitWhereClause(WhereClause expression, StaticContext argu

@Override
public StaticContext visitGroupByClause(GroupByClause expression, StaticContext argument) {
Clause nextClause = expression.getNextClause(); // != null because group by cannot be last clause of FLOWR
// expression
Clause nextClause = expression.getParentClause(); // != null because group by cannot be last clause of FLOWR
// expression
Set<Name> groupingVars = new HashSet<>();
for (GroupByVariableDeclaration groupByVar : expression.getGroupVariables()) {
// if we are grouping by an existing var (i.e. expr is null), then the appropriate type is already inferred
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ public RuntimeIterator visitMainModule(MainModule expression, RuntimeIterator ar
@Override
public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeIterator argument) {
RuntimeTupleIterator previous = this.visitFlowrClause(
expression.getReturnClause().getPreviousClause(),
expression.getReturnClause().getChildClause(),
argument
);
RuntimeIterator runtimeIterator = new ReturnClauseSparkIterator(
Expand All @@ -223,8 +223,8 @@ private RuntimeTupleIterator visitFlowrClause(
RuntimeIterator argument
) {
RuntimeTupleIterator previousIterator = null;
if (clause.getPreviousClause() != null) {
previousIterator = this.visitFlowrClause(clause.getPreviousClause(), argument);
if (clause.getChildClause() != null) {
previousIterator = this.visitFlowrClause(clause.getChildClause(), argument);
}
if (clause instanceof ForClause) {
ForClause forClause = (ForClause) clause;
Expand Down
77 changes: 57 additions & 20 deletions src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
import org.rumbledb.expressions.flowr.ForClause;
import org.rumbledb.expressions.flowr.GroupByClause;
import org.rumbledb.expressions.flowr.LetClause;
import org.rumbledb.expressions.flowr.OrderByClause;
import org.rumbledb.expressions.flowr.OrderByClauseSortingKey;
import org.rumbledb.expressions.flowr.ReturnClause;
import org.rumbledb.expressions.flowr.WhereClause;
import org.rumbledb.expressions.module.FunctionDeclaration;
import org.rumbledb.expressions.module.LibraryModule;
import org.rumbledb.expressions.module.MainModule;
Expand Down Expand Up @@ -241,24 +245,24 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static
// region FLWOR
@Override
public StaticContext visitFlowrExpression(FlworExpression expression, StaticContext argument) {
Clause clause = expression.getReturnClause().getFirstClause();
StaticContext result = this.visit(clause, argument);
while (clause != null) {
result = this.visit(clause, result);
clause = clause.getNextClause();
}
Clause clause = expression.getReturnClause();
this.visit(clause, argument);
expression.initHighestExecutionMode(this.visitorConfig);
return argument;
}

// region FLWOR vars
@Override
public StaticContext visitForClause(ForClause clause, StaticContext argument) {
// TODO visit at...
this.visit(clause.getExpression(), argument);
StaticContext context = argument;
if (clause.getChildClause() != null) {
context = this.visit(clause.getChildClause(), argument);
}
this.visit(clause.getExpression(), context);
StaticContext result = new StaticContext(context);

clause.initHighestExecutionMode(this.visitorConfig);

StaticContext result = new StaticContext(argument);
result.addVariable(
clause.getVariableName(),
clause.getActualSequenceType(),
Expand All @@ -279,10 +283,15 @@ public StaticContext visitForClause(ForClause clause, StaticContext argument) {

@Override
public StaticContext visitLetClause(LetClause clause, StaticContext argument) {
this.visit(clause.getExpression(), argument);
StaticContext context = argument;
if (clause.getChildClause() != null) {
context = this.visit(clause.getChildClause(), argument);
}
this.visit(clause.getExpression(), context);
StaticContext result = new StaticContext(context);

clause.initHighestExecutionMode(this.visitorConfig);

StaticContext result = new StaticContext(argument);
result.addVariable(
clause.getVariableName(),
clause.getActualSequenceType(),
Expand All @@ -293,20 +302,29 @@ public StaticContext visitLetClause(LetClause clause, StaticContext argument) {
return result;
}

@Override
public StaticContext visitWhereClause(WhereClause clause, StaticContext argument) {
StaticContext context = this.visit(clause.getChildClause(), argument);
this.visit(clause.getWhereExpression(), context);
clause.initHighestExecutionMode(this.visitorConfig);
return context;
}

@Override
public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argument) {
StaticContext groupByClauseContext = new StaticContext(argument);
StaticContext context = this.visit(clause.getChildClause(), argument);
StaticContext groupByClauseContext = new StaticContext(context);
for (GroupByVariableDeclaration variable : clause.getGroupVariables()) {
if (variable.getExpression() != null) {
// if a variable declaration takes place
this.visit(variable.getExpression(), argument);
this.visit(variable.getExpression(), context);
groupByClauseContext.addVariable(
variable.getVariableName(),
variable.getActualSequenceType(),
clause.getMetadata(),
ExecutionMode.LOCAL
);
} else if (!argument.isInScope(variable.getVariableName())) {
} else if (!context.isInScope(variable.getVariableName())) {
throw new UndeclaredVariableException(
"Uninitialized variable reference: " + variable.getVariableName(),
clause.getMetadata()
Expand All @@ -318,19 +336,38 @@ public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argu
}

@Override
public StaticContext visitCountClause(CountClause expression, StaticContext argument) {
expression.initHighestExecutionMode(this.visitorConfig);
StaticContext result = new StaticContext(argument);
public StaticContext visitOrderByClause(OrderByClause clause, StaticContext argument) {
StaticContext context = this.visit(clause.getChildClause(), argument);
for (OrderByClauseSortingKey key : clause.getSortingKeys()) {
this.visit(key.getExpression(), context);
}
clause.initHighestExecutionMode(this.visitorConfig);
return context;
}

@Override
public StaticContext visitCountClause(CountClause clause, StaticContext argument) {
StaticContext context = this.visit(clause.getChildClause(), argument);
clause.initHighestExecutionMode(this.visitorConfig);
StaticContext result = new StaticContext(context);
result.addVariable(
expression.getCountVariable().getVariableName(),
clause.getCountVariable().getVariableName(),
new SequenceType(AtomicItemType.integerItem, SequenceType.Arity.One),
expression.getMetadata(),
clause.getMetadata(),
ExecutionMode.LOCAL
);
this.visit(expression.getCountVariable(), result);
this.visit(clause.getCountVariable(), result);
return result;
}

@Override
public StaticContext visitReturnClause(ReturnClause clause, StaticContext argument) {
StaticContext context = this.visit(clause.getChildClause(), argument);
this.visit(clause.getReturnExpr(), context);
clause.initHighestExecutionMode(this.visitorConfig);
return argument;
}

// endregion

// region control
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,39 +226,39 @@ public Void visitVariableReference(VariableReferenceExpression expression, Void

@Override
public Void visitForClause(ForClause expression, Void argument) {
visit(expression.getPreviousClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getPreviousClause()));
visit(expression.getChildClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getChildClause()));
addOutputVariableDependency(expression, expression.getVariableName());

visit(expression.getExpression(), null);
addInputVariableDependencies(expression, getInputVariableDependencies(expression.getExpression()));

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}

@Override
public Void visitLetClause(LetClause expression, Void argument) {
visit(expression.getPreviousClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getPreviousClause()));
visit(expression.getChildClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getChildClause()));
addOutputVariableDependency(expression, expression.getVariableName());

visit(expression.getExpression(), null);
addInputVariableDependencies(expression, getInputVariableDependencies(expression.getExpression()));

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}

public Void visitGroupByClause(GroupByClause expression, Void argument) {
visit(expression.getPreviousClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getPreviousClause()));
visit(expression.getChildClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getChildClause()));

for (GroupByVariableDeclaration var : expression.getGroupVariables()) {
if (var.getExpression() != null) {
Expand All @@ -272,49 +272,49 @@ public Void visitGroupByClause(GroupByClause expression, Void argument) {

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}

public Void visitOrderByClause(OrderByClause expression, Void argument) {
visit(expression.getPreviousClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getPreviousClause()));
visit(expression.getChildClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getChildClause()));

visit(expression.getPreviousClause(), null);
visit(expression.getChildClause(), null);
for (OrderByClauseSortingKey var : expression.getSortingKeys()) {
visit(var.getExpression(), null);
addInputVariableDependencies(expression, getInputVariableDependencies(var.getExpression()));
}

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}

public Void visitWhereClause(WhereClause expression, Void argument) {
visit(expression.getPreviousClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getPreviousClause()));
visit(expression.getChildClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getChildClause()));

visit(expression.getWhereExpression(), null);
addInputVariableDependencies(expression, getInputVariableDependencies(expression.getWhereExpression()));

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}

public Void visitCountClause(CountClause expression, Void argument) {
visit(expression.getPreviousClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getPreviousClause()));
visit(expression.getChildClause(), null);
addOutputVariableDependencies(expression, getOutputVariableDependencies(expression.getChildClause()));

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}
Expand All @@ -325,7 +325,7 @@ public Void visitReturnClause(ReturnClause expression, Void argument) {

removeInputVariableDependencies(
expression,
getOutputVariableDependencies(expression.getPreviousClause())
getOutputVariableDependencies(expression.getChildClause())
);
return null;
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/rumbledb/expressions/flowr/Clause.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ public FLWOR_CLAUSES getClauseType() {
return this.clauseType;
}

public Clause getPreviousClause() {
public Clause getChildClause() {
return this.previousClause;
}

public Clause getNextClause() {
public Clause getParentClause() {
return this.nextClause;
}

Expand Down