in asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/ExhaustiveSearchResolver.java [115:154]
private void expandEdgePattern(EdgePatternExpr unexpandedEdgePattern, Deque<PatternGroup> inputPatternGroups,
Deque<PatternGroup> outputPatternGroups) throws CompilationException {
EdgeDescriptor unexpandedEdgeDescriptor = unexpandedEdgePattern.getEdgeDescriptor();
VariableExpr edgeVariable = unexpandedEdgeDescriptor.getVariableExpr();
Set<ElementLabel> edgeLabelSet = unexpandedEdgeDescriptor.getEdgeLabels();
Set<ElementLabel> expandedLabelSet =
expandElementLabels(unexpandedEdgePattern, edgeLabelSet, schemaKnowledgeTable);
// Determine the direction of our edge.
Set<EdgeDirection> edgeDirectionSet = new HashSet<>();
if (unexpandedEdgeDescriptor.getEdgeDirection() != EdgeDirection.RIGHT_TO_LEFT) {
edgeDirectionSet.add(EdgeDirection.LEFT_TO_RIGHT);
}
if (unexpandedEdgeDescriptor.getEdgeDirection() != EdgeDirection.LEFT_TO_RIGHT) {
edgeDirectionSet.add(EdgeDirection.RIGHT_TO_LEFT);
}
// Expand an edge pattern.
while (!inputPatternGroups.isEmpty()) {
PatternGroup unexpandedPatternGroup = inputPatternGroups.pop();
for (ElementLabel edgeLabel : expandedLabelSet) {
for (EdgeDirection edgeDirection : edgeDirectionSet) {
PatternGroup expandedPatternGroup = new PatternGroup();
expandedPatternGroup.getVertexPatternSet().addAll(unexpandedPatternGroup.getVertexPatternSet());
for (EdgePatternExpr edgePatternExpr : unexpandedPatternGroup.getEdgePatternSet()) {
// Update our edge descriptor, if necessary.
EdgePatternExpr clonedEdgePattern = deepCopyVisitor.visit(edgePatternExpr, null);
if (edgeVariable.equals(edgePatternExpr.getEdgeDescriptor().getVariableExpr())) {
clonedEdgePattern.getEdgeDescriptor().getEdgeLabels().clear();
clonedEdgePattern.getEdgeDescriptor().getEdgeLabels().add(edgeLabel);
clonedEdgePattern.getEdgeDescriptor().setEdgeDirection(edgeDirection);
}
expandedPatternGroup.getEdgePatternSet().add(clonedEdgePattern);
}
unifyVertexLabels(expandedPatternGroup);
outputPatternGroups.push(expandedPatternGroup);
}
}
}
}