in gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java [103:153]
private static char isLocalStarGraph(final Traversal.Admin<?, ?> traversal, char state) {
if (state == 'u' &&
(traversal instanceof ValueTraversal ||
(traversal instanceof TokenTraversal && !((TokenTraversal) traversal).getToken().equals(T.id))))
return 'x';
for (final Step step : traversal.getSteps()) {
if ((step instanceof PropertiesStep || step instanceof LabelStep || step instanceof PropertyMapStep) && state == 'u')
return 'x';
else if (step instanceof VertexStep) {
if (state == 'u') return 'x';
state = ((VertexStep) step).returnsVertex() ? 'u' : 'e';
} else if (step instanceof EdgeVertexStep) {
state = 'u';
} else if (step instanceof HasContainerHolder && state == 'u') {
for (final HasContainer hasContainer : ((HasContainerHolder) step).getHasContainers()) {
if (!hasContainer.getKey().equals(T.id.getAccessor()))
return 'x';
}
} else if (step instanceof TraversalParent) {
final char currState = state;
final Set<Character> states = new HashSet<>();
for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) {
final char s = isLocalStarGraph(local, currState);
if ('x' == s) return 'x';
states.add(s);
}
if (!(step instanceof ByModulating)) {
if (states.contains('u'))
state = 'u';
else if (states.contains('e'))
state = 'e';
}
states.clear();
if (step instanceof SelectStep || step instanceof SelectOneStep) {
states.add('u');
}
for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getGlobalChildren()) {
final char s = isLocalStarGraph(local, currState);
if ('x' == s) return 'x';
states.add(s);
}
if (states.contains('u'))
state = 'u';
else if (states.contains('e'))
state = 'e';
if (state != currState && (step instanceof RepeatStep || step instanceof MatchStep))
return 'x';
}
}
return state;
}