in asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixLoweringVisitor.java [485:529]
private void synchronizeVariables(LoweringEnvironment workingEnvironment, VertexPatternExpr branchVertex,
Map<ElementLabel, VariableExpr> labelVariableMap) throws CompilationException {
VariableExpr vertexVariable = branchVertex.getVariableExpr();
VariableExpr iterationAlias = aliasLookupTable.getIterationAlias(vertexVariable);
VariableExpr joinAlias = aliasLookupTable.getJoinAlias(vertexVariable);
ElementLabel elementLabel = branchVertex.getLabels().iterator().next();
if (labelVariableMap.containsKey(elementLabel)) {
VariableExpr targetVertexVariable = labelVariableMap.get(elementLabel);
VariableExpr targetIterationAlias = aliasLookupTable.getIterationAlias(targetVertexVariable);
VariableExpr targetJoinAlias = aliasLookupTable.getJoinAlias(targetVertexVariable);
variableRemapCloneVisitor.resetSubstitutions();
variableRemapCloneVisitor.addSubstitution(iterationAlias, targetIterationAlias);
variableRemapCloneVisitor.addSubstitution(joinAlias, targetJoinAlias);
variableRemapCloneVisitor.addSubstitution(vertexVariable, targetVertexVariable);
workingEnvironment.acceptTransformer(lowerList -> {
// Transform our non-representative clauses.
ListIterator<AbstractClause> nonRepresentativeIterator =
lowerList.getNonRepresentativeClauses().listIterator();
while (nonRepresentativeIterator.hasNext()) {
AbstractClause workingClause = nonRepresentativeIterator.next();
nonRepresentativeIterator.set((AbstractClause) variableRemapCloneVisitor.substitute(workingClause));
}
// Transform our vertex bindings.
ListIterator<LetClause> vertexBindingIterator =
lowerList.getRepresentativeVertexBindings().listIterator();
while (vertexBindingIterator.hasNext()) {
LetClause vertexBinding = vertexBindingIterator.next();
vertexBindingIterator.set((LetClause) variableRemapCloneVisitor.substitute(vertexBinding));
}
// Transform our edge bindings.
ListIterator<LetClause> edgeBindingIterator = lowerList.getRepresentativeEdgeBindings().listIterator();
while (edgeBindingIterator.hasNext()) {
LetClause edgeBinding = edgeBindingIterator.next();
edgeBindingIterator.set((LetClause) variableRemapCloneVisitor.substitute(edgeBinding));
}
});
branchVertex.setVariableExpr(targetVertexVariable);
} else {
labelVariableMap.put(elementLabel, vertexVariable);
}
}