@Override
    protected Traverser.Admin<Path> processNextStart() {
        final Traverser.Admin<S> traverser = this.starts.next();
        final Path path = traverser.path().subPath(this.fromLabel, this.toLabel);
        if (this.traversalRing.isEmpty())
            return PathProcessor.processTraverserPathLabels(traverser.split(path, this), this.keepLabels);
        else {
            this.traversalRing.reset();
            final Path byPath = MutablePath.make();

            final List<Set<String>> labels = path.labels();
            final List<Object> objects = path.objects();
            for (int ix = 0; ix < objects.size(); ix++) {
                final Traversal.Admin t = traversalRing.next();
                final TraversalProduct p = TraversalUtil.produce(objects.get(ix), t);

                // if not productive we can quit coz this path is getting filtered
                if (!p.isProductive()) break;

                byPath.extend(p.get(), labels.get(ix));
            }

            // the path sizes must be equal or else it means a by() wasn't productive and that path will be filtered
            return path.size() == byPath.size() ?
                    PathProcessor.processTraverserPathLabels(traverser.split(byPath, this), this.keepLabels) :
                    EmptyTraverser.instance();
        }
    }
@author Marko A. Rodriguez (http://markorodriguez.com)
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java