Github user krlohnes commented on a diff in the pull request:
https://github.com/apache/tinkerpop/pull/838#discussion_r191572290
--- Diff:
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
---
@@ -273,11 +300,40 @@ public RepeatEndStep(final Traversal.Admin traversal)
{
super(traversal);
}
+ final LinkedList<Traverser.Admin<S>> stashedStarts = new
LinkedList<>();
+
+ private Traverser.Admin<S> nextStart(RepeatStep<S> repeatStep,
boolean useDfs) {
+ if (!useDfs) {
+ return this.starts.next();
+ } else {
+ if (this.starts.hasNext()) {
+ return this.starts.next();
+ } else {
+ return this.stashedStarts.pop();
+ }
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ return super.hasNext() || !this.stashedStarts.isEmpty();
+ }
+
@Override
protected Iterator<Traverser.Admin<S>> standardAlgorithm() throws
NoSuchElementException {
final RepeatStep<S> repeatStep = (RepeatStep<S>)
this.getTraversal().getParent();
+ final List<Step> steps = repeatStep.repeatTraversal.getSteps();
+ final Step stepBeforeRepeatEndStep = steps.get(steps.size() -
2);
+ final boolean useDfs = !(stepBeforeRepeatEndStep instanceof
Barrier);
while (true) {
- final Traverser.Admin<S> start = this.starts.next();
+ final Traverser.Admin<S> start = nextStart(repeatStep,
useDfs);
+ if (useDfs) {
+ final List<Traverser.Admin<S>> localStarts = new
ArrayList<>();
--- End diff --
No, this could be done with an index and writing directly to stashed
starts, definitely. will fix.
---