private void expandVertexPattern()

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);
            }
        }
    }