in asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/ExhaustiveSearchResolver.java [70:113]
private void expandVertexPattern(VertexPatternExpr unexpandedVertexPattern, Deque<PatternGroup> inputPatternGroups,
Deque<PatternGroup> outputPatternGroups) throws CompilationException {
VariableExpr vertexVariable = unexpandedVertexPattern.getVariableExpr();
Set<ElementLabel> vertexLabelSet = unexpandedVertexPattern.getLabels();
Set<ElementLabel> expandedLabelSet =
expandElementLabels(unexpandedVertexPattern, vertexLabelSet, schemaKnowledgeTable);
while (!inputPatternGroups.isEmpty()) {
PatternGroup unexpandedPatternGroup = inputPatternGroups.pop();
for (ElementLabel vertexLabel : expandedLabelSet) {
PatternGroup expandedPatternGroup = new PatternGroup();
for (VertexPatternExpr vertexPatternExpr : unexpandedPatternGroup.getVertexPatternSet()) {
VertexPatternExpr clonedVertexPattern = deepCopyVisitor.visit(vertexPatternExpr, null);
SubqueryVertexJoinAnnotation hint = vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class);
if (vertexPatternExpr.getVariableExpr().equals(vertexVariable)
|| (hint != null && hint.getSourceVertexVariable().equals(vertexVariable))) {
clonedVertexPattern.getLabels().clear();
clonedVertexPattern.getLabels().add(vertexLabel);
}
expandedPatternGroup.getVertexPatternSet().add(clonedVertexPattern);
}
for (EdgePatternExpr unexpandedEdgePattern : unexpandedPatternGroup.getEdgePatternSet()) {
EdgePatternExpr clonedEdgePattern = deepCopyVisitor.visit(unexpandedEdgePattern, null);
VertexPatternExpr clonedLeftVertex = clonedEdgePattern.getLeftVertex();
SubqueryVertexJoinAnnotation hint1 = clonedLeftVertex.findHint(SubqueryVertexJoinAnnotation.class);
if (clonedLeftVertex.getVariableExpr().equals(vertexVariable)
|| (hint1 != null && hint1.getSourceVertexVariable().equals(vertexVariable))) {
clonedLeftVertex.getLabels().clear();
clonedLeftVertex.getLabels().add(vertexLabel);
}
VertexPatternExpr clonedRightVertex = clonedEdgePattern.getRightVertex();
SubqueryVertexJoinAnnotation hint2 = clonedLeftVertex.findHint(SubqueryVertexJoinAnnotation.class);
if (clonedRightVertex.getVariableExpr().equals(vertexVariable)
|| (hint2 != null && hint2.getSourceVertexVariable().equals(vertexVariable))) {
clonedRightVertex.getLabels().clear();
clonedRightVertex.getLabels().add(vertexLabel);
}
expandedPatternGroup.getEdgePatternSet().add(clonedEdgePattern);
}
unifyVertexLabels(expandedPatternGroup);
outputPatternGroups.push(expandedPatternGroup);
}
}
}