private void expandEdgePattern()

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