@@ -0,0 +1,1403 @@
+package org.umlg.sqlg.step;%0A%0Aimport org.apache.tinkerpop.gremlin.process.traversal.Traversal;%0Aimport org.apache.tinkerpop.gremlin.process.traversal.Traverser;%0Aimport org.apache.tinkerpop.gremlin.structure.util.CloseableIterator;%0Aimport org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;%0A%0Aimport java.util.Iterator;%0A%0A/**%0A * @author Pieter Martin (https://github.com/pietermartin)%0A * Date: 2017/10/25%0A */%0Apublic abstract class SqlgFlatMapStep%3CS, E%3E extends SqlgAbstractStep%3CS, E%3E %7B%0A%0A    private Traverser.Admin%3CS%3E head = null;%0A    private Iterator%3CE%3E iterator = EmptyIterator.instance();%0A%0A    public SqlgFlatMapStep(final Traversal.Admin traversal) %7B%0A        super(traversal);%0A    %7D%0A%0A    @Override%0A    protected Traverser.Admin%3CE%3E processNextStart() %7B%0A        while (true) %7B%0A            if (this.iterator.hasNext()) %7B%0A                return this.head.split(this.iterator.next(), this);%0A            %7D else %7B%0A                closeIterator();%0A                this.head = this.starts.next();%0A                this.iterator = this.flatMap(this.head);%0A            %7D%0A        %7D%0A    %7D%0A%0A    protected abstract Iterator%3CE%3E flatMap(final Traverser.Admin%3CS%3E traverser);%0A%0A    @Override%0A    public void reset() %7B%0A        super.reset();%0A        closeIterator();%0A        this.iterator = EmptyIterator.instance();%0A    %7D%0A%0A    protected void closeIterator() %7B%0A        CloseableIterator.closeIterator(iterator);%0A    %7D%0A%7D%0A

optimize PropertyStep and PropertyMapStep in the BaseStrategy. This allows different properties to be extracted from inline SelectOneStep