You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2019/04/29 17:04:49 UTC

[tinkerpop] branch tp4 updated: There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization.

This is an automated email from the ASF dual-hosted git repository.

okram pushed a commit to branch tp4
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/tp4 by this push:
     new 1494567  There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization.
1494567 is described below

commit 1494567d9371d885ac9af7e435efff9621a87ca6
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 11:04:37 2019 -0600

    There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization.
---
 .../language/gremlin/TraversalSource.java          |  2 +-
 .../tinkerpop/language/gremlin/TraversalUtil.java  |  9 ++-
 .../language/gremlin/core/CoreTraversal.java       | 11 +--
 .../apache/tinkerpop/language/gremlin/core/__.java |  6 +-
 .../machine/bytecode/compiler/Argument.java        |  3 -
 .../bytecode/compiler/BytecodeCompiler.java        |  6 +-
 .../machine/bytecode/compiler/CoreCompiler.java    | 16 ++--
 .../machine/bytecode/compiler/FunctionType.java    |  2 +-
 .../machine/bytecode/compiler/MethodArgument.java  | 93 ----------------------
 .../DbInitial.java => flatmap/DbFlatMap.java}      | 26 +++---
 .../InjectFlatMap.java}                            | 24 ++++--
 .../machine/function/initial/FlatMapInitial.java}  | 18 ++---
 .../initial/Initializing.java}                     |  9 +--
 .../tinkerpop/machine/function/map/PathMap.java    | 32 +++++---
 .../machine/function/map/PathObjectMap.java        | 65 +++++++++++++++
 .../strategy/decoration/ExplainStrategy.java       |  2 +-
 .../apache/tinkerpop/machine/structure/TTuple.java |  2 +
 .../tinkerpop/machine/structure/util/J2Tuple.java  |  5 ++
 .../tinkerpop/machine/structure/util/JTuple.java   |  5 ++
 .../machine/traverser/path/BasicPath.java          |  6 --
 .../machine/traverser/path/EmptyPath.java          |  5 --
 .../tinkerpop/machine/traverser/path/Path.java     |  7 +-
 .../tinkerpop/machine/processor/pipes/Pipes.java   |  6 +-
 .../bytecode/compiler/BlueprintsCompiler.java      |  4 +-
 .../blueprints/data/BlueprintsVertex.java          |  5 ++
 .../{initial => flatmap}/VerticesFlatMap.java      | 16 ++--
 .../provider/BlueprintsVerticesStrategy.java       |  2 +-
 .../machine/structure/jdbc/JDBCDatabase.java       |  6 ++
 .../tinkerpop/machine/structure/jdbc/JDBCRow.java  | 10 +++
 .../tinkerpop/machine/structure/jdbc/JDBCTest.java |  2 +-
 30 files changed, 209 insertions(+), 196 deletions(-)

diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java
index bcbf648..1b91203 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java
@@ -97,7 +97,7 @@ public class TraversalSource<C> implements Cloneable {
         this.prepareSourceCode();
         final Bytecode<C> bytecode = this.bytecode.clone();
         final Coefficient<C> coefficient = this.coefficient.clone();
-        bytecode.addInstruction(coefficient, Symbols.INITIAL, objects);
+        bytecode.addInstruction(coefficient, Symbols.INJECT, objects);
         return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO
     }
 
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
index 25157fd..3f98959 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
@@ -61,10 +61,11 @@ public final class TraversalUtil {
         return args;
     }
 
-    public static Object[] addObjects(final Object[] original, final Object... updates) {
-        final Object[] objects = new Object[original.length + updates.length];
-        System.arraycopy(original, 0, objects, 0, original.length);
-        System.arraycopy(updates, 0, objects, original.length, updates.length);
+    public static Object[] addObjects(final Object head, final Object[] original, final Object... updates) {
+        final Object[] objects = new Object[original.length + updates.length + 1];
+        objects[0] = head;
+        System.arraycopy(original, 0, objects, 1, original.length);
+        System.arraycopy(updates, 0, objects, original.length+1, updates.length);
         return objects;
     }
 }
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
index 86f2329..35c01ed 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
@@ -63,8 +63,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
 
     @Override
     public Traversal<C, S, E> by(final String byString) {
-        this.bytecode.addArgs(byString);
-        return this;
+        return this.by(__.value(byString));
     }
 
     @Override
@@ -232,16 +231,12 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
 
     @Override
     public <R> Traversal<C, S, R> path(final String label) {
-        this.addInstruction(Symbols.PATH, label, "|");
-        return (Traversal) this.addInstruction(Symbols.VALUE, label);
+        return this.addInstruction(Symbols.PATH, label);
     }
 
     @Override
     public Traversal<C, S, Path> path(final String label, final String... labels) {
-        this.addInstruction(Symbols.PATH, label);
-        this.bytecode.addArgs((Object[]) labels);
-        this.bytecode.addArgs("|");
-        return (Traversal) this;
+        return this.addInstruction(Symbols.PATH,TraversalUtil.addObjects(label,labels,"|"));
     }
 
     @Override
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java
index 77b3a40..e2f973f 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java
@@ -87,7 +87,7 @@ public class __ {
         return __.<C, S>start().path();
     }
 
-    public static <C, S, R> Traversal<C, S, R> path(final String label) {
+    public static <C, S, E> Traversal<C, S, E> path(final String label) {
         return __.<C, S>start().path(label);
     }
 
@@ -106,4 +106,8 @@ public class __ {
     public static <C, S, E> Traversal<C, S, E> union(final Traversal<C, S, E>... traversals) {
         return __.<C, S>start().union(traversals);
     }
+
+    public static <C, S, E> Traversal<C, S, E> value(final String key) {
+        return __.<C, S>start().value(key);
+    }
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java
index 85f87c6..3931d58 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java
@@ -22,7 +22,6 @@ import org.apache.tinkerpop.machine.bytecode.Bytecode;
 import org.apache.tinkerpop.machine.traverser.Traverser;
 
 import java.io.Serializable;
-import java.util.Arrays;
 import java.util.Iterator;
 
 /**
@@ -39,8 +38,6 @@ public interface Argument<E> extends Serializable, Cloneable {
     public static <C, S, E> Argument<E> create(final Object... args) {
         if (args[0] instanceof Bytecode)
             return new BytecodeArgument<>((Bytecode<C>) args[0]);
-        else if (args[0] instanceof String && ((String) args[0]).contains("::"))
-            return new MethodArgument<>((String) args[0], Arrays.copyOfRange(args, 1, args.length));
         else
             return new ConstantArgument<>((E) args[0]);
     }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
index 50582bf..16cf912 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
@@ -21,6 +21,8 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
 import org.apache.tinkerpop.machine.bytecode.Bytecode;
 import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.function.CFunction;
+import org.apache.tinkerpop.machine.function.initial.FlatMapInitial;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -33,7 +35,9 @@ public interface BytecodeCompiler {
     public default <C> List<CFunction<C>> compile(final Bytecode<C> bytecode) {
         final List<CFunction<C>> functions = new ArrayList<>();
         for (final Instruction<C> instruction : bytecode.getInstructions()) {
-            functions.add(this.compile(instruction));
+            final CFunction function = this.compile(instruction);
+            functions.add(functions.isEmpty() && bytecode.getParent().isEmpty() && function instanceof Initializing ?
+                    new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function) : function);
         }
         return functions;
     }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
index b77011b..69a23a4 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
@@ -30,12 +30,12 @@ import org.apache.tinkerpop.machine.function.filter.HasKeyFilter;
 import org.apache.tinkerpop.machine.function.filter.HasKeyValueFilter;
 import org.apache.tinkerpop.machine.function.filter.IdentityFilter;
 import org.apache.tinkerpop.machine.function.filter.IsFilter;
+import org.apache.tinkerpop.machine.function.flatmap.DbFlatMap;
 import org.apache.tinkerpop.machine.function.flatmap.EntriesFlatMap;
 import org.apache.tinkerpop.machine.function.flatmap.FlatMapFlatMap;
+import org.apache.tinkerpop.machine.function.flatmap.InjectFlatMap;
 import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap;
 import org.apache.tinkerpop.machine.function.flatmap.ValuesFlatMap;
-import org.apache.tinkerpop.machine.function.initial.DbInitial;
-import org.apache.tinkerpop.machine.function.initial.InitialInitial;
 import org.apache.tinkerpop.machine.function.map.ConstantMap;
 import org.apache.tinkerpop.machine.function.map.IncrMap;
 import org.apache.tinkerpop.machine.function.map.LoopsMap;
@@ -78,7 +78,7 @@ public final class CoreCompiler implements BytecodeCompiler {
         put(Symbols.HAS_KEY_VALUE, FunctionType.FILTER);
         put(Symbols.IDENTITY, FunctionType.FILTER);
         put(Symbols.INCR, FunctionType.MAP);
-        put(Symbols.INITIAL, FunctionType.INITIAL);
+        put(Symbols.INJECT, FunctionType.FLATMAP);
         put(Symbols.IS, FunctionType.FILTER);
         put(Symbols.JOIN, FunctionType.BARRIER);
         put(Symbols.LOOPS, FunctionType.MAP);
@@ -89,12 +89,12 @@ public final class CoreCompiler implements BytecodeCompiler {
         put(Symbols.REPEAT, FunctionType.BRANCH);
         put(Symbols.SUM, FunctionType.REDUCE);
         put(Symbols.UNFOLD, FunctionType.FLATMAP);
-        put(Symbols.V, FunctionType.FLATMAP);
         put(Symbols.VALUE, FunctionType.MAP);
         put(Symbols.VALUES, FunctionType.FLATMAP);
 
         //
         put(Symbols.DB, FunctionType.FLATMAP);
+        put(Symbols.V, FunctionType.FLATMAP);
     }};
 
     @Override
@@ -124,8 +124,8 @@ public final class CoreCompiler implements BytecodeCompiler {
                 return IdentityFilter.compile(instruction);
             case Symbols.INCR:
                 return IncrMap.compile(instruction);
-            case Symbols.INITIAL:
-                return InitialInitial.compile(instruction);
+            case Symbols.INJECT:
+                return InjectFlatMap.compile(instruction);
             case Symbols.IS:
                 return IsFilter.compile(instruction);
             case Symbols.JOIN:
@@ -151,7 +151,7 @@ public final class CoreCompiler implements BytecodeCompiler {
             case Symbols.VALUES:
                 return ValuesFlatMap.compile(instruction);
             case Symbols.DB:
-                return DbInitial.compile(instruction);
+                return DbFlatMap.compile(instruction);
             default:
                 return null;
         }
@@ -205,7 +205,7 @@ public final class CoreCompiler implements BytecodeCompiler {
         public static final String HAS_KEY_VALUE = "hasKeyValue";
         public static final String IDENTITY = "identity";
         public static final String INCR = "incr";
-        public static final String INITIAL = "initial";
+        public static final String INJECT = "initial";
         public static final String IS = "is";
         public static final String JOIN = "join";
         public static final String LOOPS = "loops";
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
index d3580d6..3ceca4b 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
@@ -23,6 +23,6 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
  */
 public enum FunctionType {
 
-    BARRIER, INITIAL, MAP, FLATMAP, FILTER, REDUCE, BRANCH
+    BARRIER, MAP, FLATMAP, FILTER, REDUCE, BRANCH
 
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
deleted file mode 100644
index c2aef26..0000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.bytecode.compiler;
-
-import org.apache.tinkerpop.machine.structure.TTuple;
-import org.apache.tinkerpop.machine.traverser.Traverser;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
-import org.apache.tinkerpop.machine.util.NumberHelper;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class MethodArgument<E> implements Argument<E> {
-
-    private final String method;
-    private final Argument[] arguments;
-
-    public MethodArgument(final String method, final Object... arguments) {
-        this.method = method.split("::")[1];
-        this.arguments = new Argument[arguments.length];
-        for (int i = 0; i < arguments.length; i++) {
-            this.arguments[i] = Argument.create(arguments[i]);
-        }
-    }
-
-    @Override
-    public <C, S> E mapArg(final Traverser<C, S> traverser) {
-        if (this.method.equals("object"))
-            return (E) traverser.object();
-        else if (this.method.equals("count"))
-            return (E) traverser.coefficient().count();
-        else if (this.method.equals("keys"))
-            return (E) ((Map) traverser.object()).keySet();
-        else if (this.method.equals("get"))
-            return (E) ((TTuple) traverser.object()).value(this.arguments[0].mapArg(traverser));
-        else if (this.method.equals("add"))
-            return (E) NumberHelper.add((Number) traverser.object(), (Number) this.arguments[0].mapArg(traverser));
-        else
-            throw new RuntimeException("Unknown method");
-    }
-
-    @Override
-    public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser) {
-        return IteratorUtils.of(this.mapArg(traverser));
-    }
-
-    @Override
-    public <C, S> boolean filterArg(final Traverser<C, S> traverser) {
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return this.method.hashCode() ^ Arrays.hashCode(this.arguments);
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof MethodArgument &&
-                this.method.equals(((MethodArgument) object).method) &&
-                Arrays.equals(this.arguments, ((MethodArgument) object).arguments);
-    }
-
-    @Override
-    public MethodArgument<E> clone() {
-        return this;
-    }
-
-    @Override
-    public String toString() {
-        return this.method + "(" + Arrays.toString(this.arguments) + ")";
-    }
-}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java
similarity index 70%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java
index 246f072..a071ec7 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java
@@ -16,39 +16,33 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.function.initial;
+package org.apache.tinkerpop.machine.function.flatmap;
 
 import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
-import org.apache.tinkerpop.machine.function.MapFunction;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
 import org.apache.tinkerpop.machine.structure.rdbms.TDatabase;
 import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
 import org.apache.tinkerpop.machine.util.StringFactory;
 
 import java.util.Iterator;
-import java.util.List;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class DbInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, TDatabase>, MapFunction<C, S, TDatabase> {
+public final class DbFlatMap<C, S> extends AbstractFunction<C> implements Initializing<C, S, TDatabase> {
 
     private TDatabase database;
 
-    private DbInitial(final Coefficient<C> coefficient, final String label, final TDatabase database) {
+    private DbFlatMap(final Coefficient<C> coefficient, final String label, final TDatabase database) {
         super(coefficient, label);
         this.database = database;
     }
 
 
     @Override
-    public Iterator<TDatabase> get() {
-        return List.of(this.database).iterator();
-    }
-
-    @Override
     public int hashCode() {
         return super.hashCode() ^ this.database.hashCode();
     }
@@ -58,17 +52,17 @@ public final class DbInitial<C, S> extends AbstractFunction<C> implements Initia
         return StringFactory.makeFunctionString(this, this.database);
     }
 
-    public static <C, S> DbInitial<C, S> compile(final Instruction<C> instruction) {
-        return new DbInitial<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]);
+    public static <C, S> DbFlatMap<C, S> compile(final Instruction<C> instruction) {
+        return new DbFlatMap<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]);
     }
 
     @Override
-    public TDatabase apply(final Traverser<C, S> traverser) {
-        return this.database;
+    public Iterator<TDatabase> apply(final Traverser<C, S> traverser) {
+        return IteratorUtils.of(this.database);
     }
 
     @Override
-    public DbInitial<C, S> clone() {
+    public DbFlatMap<C, S> clone() { // TODO
         return this;
     }
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
similarity index 67%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
index d043892..1635b2b 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
@@ -16,12 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.function.initial;
+package org.apache.tinkerpop.machine.function.flatmap;
 
 import org.apache.tinkerpop.machine.bytecode.Instruction;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
+import org.apache.tinkerpop.machine.traverser.Traverser;
 import org.apache.tinkerpop.machine.util.ArrayIterator;
 import org.apache.tinkerpop.machine.util.StringFactory;
 
@@ -31,17 +32,17 @@ import java.util.Iterator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class InitialInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> {
+public final class InjectFlatMap<C, S, E> extends AbstractFunction<C> implements Initializing<C, S, E> {
 
-    private final S[] objects;
+    private final E[] objects;
 
-    private InitialInitial(final Coefficient<C> coefficient, final String label, final S... objects) {
+    private InjectFlatMap(final Coefficient<C> coefficient, final String label, final E... objects) {
         super(coefficient, label);
         this.objects = objects;
     }
 
     @Override
-    public Iterator<S> get() {
+    public Iterator<E> apply(Traverser<C, S> traverser) {
         return new ArrayIterator<>(this.objects);
     }
 
@@ -55,7 +56,14 @@ public final class InitialInitial<C, S> extends AbstractFunction<C> implements I
         return StringFactory.makeFunctionString(this, this.objects);
     }
 
-    public static <C, S> InitialInitial<C, S> compile(final Instruction<C> instruction) {
-        return new InitialInitial<>(instruction.coefficient(), instruction.label(), (S[]) instruction.args());
+    @Override
+    public InjectFlatMap<C, S, E> clone() {
+        return this; // TODO
+    }
+
+    public static <C, S, E> InjectFlatMap<C, S, E> compile(final Instruction<C> instruction) {
+        return new InjectFlatMap<>(instruction.coefficient(), instruction.label(), (E[]) instruction.args());
     }
+
+
 }
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
similarity index 66%
copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
index 2790291..2a2ca21 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
@@ -16,29 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
+package org.apache.tinkerpop.machine.function.initial;
 
-import org.apache.tinkerpop.machine.structure.graph.TVertex;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
 import org.apache.tinkerpop.machine.function.InitialFunction;
-import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
+import org.apache.tinkerpop.machine.traverser.species.EmptyTraverser;
 
 import java.util.Iterator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> {
+public final class FlatMapInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> {
 
-    public VerticesFlatMap(final Coefficient<C> coefficient, final String label) {
+    private final Initializing<C, ?, S> function;
+
+    public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function) {
         super(coefficient, label);
+        this.function = function;
     }
 
     @Override
-    public Iterator<TVertex> get() {
-        return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex());
+    public Iterator<S> get() {
+        return this.function.apply(EmptyTraverser.instance());
     }
-
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java
similarity index 82%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java
index d3580d6..782e1f3 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java
@@ -16,13 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.bytecode.compiler;
+package org.apache.tinkerpop.machine.function.initial;
+
+import org.apache.tinkerpop.machine.function.FlatMapFunction;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public enum FunctionType {
-
-    BARRIER, INITIAL, MAP, FLATMAP, FILTER, REDUCE, BRANCH
-
+public interface Initializing<C, S, E> extends FlatMapFunction<C, S, E> {
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
index 7702568..5aac466 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.machine.traverser.path.BasicPath;
 import org.apache.tinkerpop.machine.traverser.path.Path;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -82,20 +83,25 @@ public final class PathMap<C, S> extends AbstractFunction<C> implements MapFunct
         return clone;
     }
 
-    public static <C, S> PathMap<C, S> compile(final Instruction<C> instruction) {
-        final List<String> labels = new ArrayList<>();
-        final List<Compilation<C, Object, Object>> compilations = new ArrayList<>();
-        boolean processingLabels = true;
-        for (final Object arg : instruction.args()) {
-            if (arg.equals("|")) {
-                processingLabels = false;
-                continue;
+    public static <C, S, E> MapFunction<C, S, E> compile(final Instruction<C> instruction) {
+        if (Arrays.stream(instruction.args()).anyMatch("|"::equals)) {
+            final List<String> labels = new ArrayList<>();
+            final List<Compilation<C, Object, Object>> compilations = new ArrayList<>();
+            boolean processingLabels = true;
+            for (final Object arg : instruction.args()) {
+                if (arg.equals("|")) {
+                    processingLabels = false;
+                    continue;
+                }
+                if (processingLabels)
+                    labels.add((String) arg);
+                else
+                    compilations.add(Compilation.compile(arg));
             }
-            if (processingLabels)
-                labels.add((String) arg);
-            else
-                compilations.add(Compilation.compile(arg));
+            return (MapFunction<C, S, E>) new PathMap<>(instruction.coefficient(), instruction.label(), labels, compilations);
+        } else {
+            return PathObjectMap.compile(instruction);
         }
-        return new PathMap<>(instruction.coefficient(), instruction.label(), labels, compilations);
+
     }
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java
new file mode 100644
index 0000000..b124ac1
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.function.map;
+
+import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
+import org.apache.tinkerpop.machine.coefficient.Coefficient;
+import org.apache.tinkerpop.machine.function.AbstractFunction;
+import org.apache.tinkerpop.machine.function.MapFunction;
+import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.traverser.path.Path;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathObjectMap<C, S, E> extends AbstractFunction<C> implements MapFunction<C, S, E> {
+
+    private final String pathLabel;
+    private Compilation<C, Object, Object> byCompilation;
+
+    private PathObjectMap(final Coefficient<C> coefficient, final String label, final String pathLabel, final Compilation<C, Object, Object> byCompilation) {
+        super(coefficient, label);
+        this.pathLabel = pathLabel;
+        this.byCompilation = byCompilation;
+    }
+
+    @Override
+    public E apply(final Traverser<C, S> traverser) {
+        final Object object = traverser.path().get(Path.Pop.last, this.pathLabel);
+        return (E) (null == this.byCompilation ? object : this.byCompilation.mapObject(object).object());
+    }
+
+
+    @Override
+    public int hashCode() {
+        return super.hashCode() ^ this.pathLabel.hashCode() ^ (null == this.byCompilation ? 1 : this.byCompilation.hashCode());
+    }
+
+    @Override
+    public PathObjectMap<C, S, E> clone() {
+        final PathObjectMap<C, S, E> clone = (PathObjectMap<C, S, E>) super.clone();
+        clone.byCompilation = null == this.byCompilation ? null : this.byCompilation.clone();
+        return clone;
+    }
+
+    public static <C, S, E> PathObjectMap<C, S, E> compile(final Instruction<C> instruction) {
+        return new PathObjectMap<>(instruction.coefficient(), instruction.label(), (String) instruction.args()[0], Compilation.compileOrNull(1, instruction.args()));
+    }
+}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
index d60cfff..65e02cb 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
@@ -50,7 +50,7 @@ public final class ExplainStrategy extends AbstractStrategy<Strategy.DecorationS
             bytecode.getInstructions().clear();
             bytecode.addInstruction(
                     (Coefficient<C>) LongCoefficient.create(),
-                    Symbols.INITIAL,
+                    Symbols.INJECT,
                     ExplainStrategy.explainBytecode(clone));
         }
     }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
index c324caf..cc4763d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
@@ -41,6 +41,8 @@ public interface TTuple<K, V> {
 
     public void remove(final K key);
 
+    public int size();
+
     public Iterator<T2Tuple<K, V>> entries();
 
 }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java
index e94e138..aeffd07 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java
@@ -66,6 +66,11 @@ public final class J2Tuple<K, V> implements T2Tuple<K, V> {
     }
 
     @Override
+    public int size() {
+        return 1;
+    }
+
+    @Override
     public Iterator<T2Tuple<K, V>> entries() {
         return IteratorUtils.of(this);
     }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
index 7f59f9a..5966aa2 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
@@ -70,6 +70,11 @@ public class JTuple<K, V> implements TTuple<K, V> {
     }
 
     @Override
+    public int size() {
+        return this.map.size();
+    }
+
+    @Override
     public Iterator<T2Tuple<K, V>> entries() {
         return IteratorUtils.map(this.map.entrySet().iterator(), e -> new J2Tuple<>(e.getKey(), e.getValue()));
     }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
index 19c3736..5b7f078 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
@@ -19,7 +19,6 @@
 package org.apache.tinkerpop.machine.traverser.path;
 
 import org.apache.tinkerpop.machine.structure.util.T2Tuple;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -42,11 +41,6 @@ public final class BasicPath implements Path {
     }
 
     @Override
-    public Object value(final String key) {
-        return this.get(Pop.last, key);
-    }
-
-    @Override
     public void set(final String key, final Object value) {
         final int index = this.labels.indexOf(key);
         if (-1 != index)
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
index b3b0a6d..e3039f1 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java
@@ -40,11 +40,6 @@ public final class EmptyPath implements Path {
     }
 
     @Override
-    public Object value(final String key) {
-        throw new IllegalStateException("No objects in EmptyPath");
-    }
-
-    @Override
     public void set(final String key, final Object value) {
 
     }
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
index cd911b5..0d06f73 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
@@ -25,7 +25,7 @@ import java.io.Serializable;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Path extends Serializable, Cloneable, TTuple<String,Object> {
+public interface Path extends Serializable, Cloneable, TTuple<String, Object> {
 
     public enum Pop {
         first, last, all;
@@ -39,6 +39,11 @@ public interface Path extends Serializable, Cloneable, TTuple<String,Object> {
 
     public Object get(final Pop pop, final String label);
 
+    @Override
+    public default Object value(final String key) {
+        return this.get(Pop.last, key);
+    }
+
     public int size();
 
     public Path clone();
diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
index f93f644..cc5a4cf 100644
--- a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
+++ b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
@@ -59,9 +59,7 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
                 previousStep = this.startStep;
             }
 
-            if (this.steps.isEmpty() && function instanceof InitialFunction)
-                nextStep = new InitialStep<>((InitialFunction<C, S>) function, compilation.getTraverserFactory()); // TODO: this is a hack for DB
-            else if (function instanceof RepeatBranch)
+            if (function instanceof RepeatBranch)
                 nextStep = new RepeatStep<>(previousStep, (RepeatBranch<C, S>) function);
             else if (function instanceof BranchFunction)
                 nextStep = new BranchStep<>(previousStep, (BranchFunction<C, S, E>) function);
@@ -71,6 +69,8 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
                 nextStep = new FlatMapStep<>(previousStep, (FlatMapFunction<C, S, E>) function);
             else if (function instanceof MapFunction)
                 nextStep = new MapStep<>(previousStep, (MapFunction<C, S, E>) function);
+            else if (function instanceof InitialFunction)
+                nextStep = new InitialStep<>((InitialFunction<C, S>) function, compilation.getTraverserFactory());
             else if (function instanceof BarrierFunction)
                 nextStep = new BarrierStep<>(previousStep, (BarrierFunction<C, S, E, Object>) function, compilation.getTraverserFactory());
             else if (function instanceof ReduceFunction)
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java
index 06f77c1..eb3dc6c 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java
@@ -23,7 +23,7 @@ import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
 import org.apache.tinkerpop.machine.bytecode.compiler.FunctionType;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.CFunction;
-import org.apache.tinkerpop.machine.structure.blueprints.function.initial.VerticesFlatMap;
+import org.apache.tinkerpop.machine.structure.blueprints.function.flatmap.VerticesFlatMap;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -53,7 +53,7 @@ public final class BlueprintsCompiler implements BytecodeCompiler {
 
     @Override
     public FunctionType getFunctionType(final String op) {
-        return op.equals(Symbols.BP_V) ? FunctionType.INITIAL : null;
+        return op.equals(Symbols.BP_V) ? FunctionType.FLATMAP : null;
     }
 
     public static class Symbols {
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java
index fa08d24..120533e 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java
@@ -69,6 +69,11 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable {
     }
 
     @Override
+    public int size() {
+        return 0;
+    }
+
+    @Override
     public V value(String key) {
         return (V) "marko";
     }
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java
similarity index 79%
rename from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
rename to java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java
index 2790291..0f9c2e7 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java
@@ -16,13 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
+package org.apache.tinkerpop.machine.structure.blueprints.function.flatmap;
 
-import org.apache.tinkerpop.machine.structure.graph.TVertex;
 import org.apache.tinkerpop.machine.coefficient.Coefficient;
 import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
+import org.apache.tinkerpop.machine.function.FlatMapFunction;
 import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex;
+import org.apache.tinkerpop.machine.structure.graph.TVertex;
+import org.apache.tinkerpop.machine.traverser.Traverser;
 import org.apache.tinkerpop.machine.util.IteratorUtils;
 
 import java.util.Iterator;
@@ -30,15 +31,20 @@ import java.util.Iterator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> {
+public class VerticesFlatMap<C, S> extends AbstractFunction<C> implements FlatMapFunction<C, S, TVertex> {
 
     public VerticesFlatMap(final Coefficient<C> coefficient, final String label) {
         super(coefficient, label);
     }
 
     @Override
-    public Iterator<TVertex> get() {
+    public Iterator<TVertex> apply(final Traverser<C, S> traverser) {
         return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex());
     }
 
+    @Override
+    public VerticesFlatMap<C, S> clone() {
+        return this; // TODO;
+    }
+
 }
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
index 8cbe34f..6b18d77 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
@@ -38,6 +38,6 @@ public class BlueprintsVerticesStrategy extends AbstractStrategy<Strategy.Provid
                 temp = instruction;
         }
         if (null != temp)
-            BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V));
+            BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V)); // TODO: as(label)
     }
 }
diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
index ed57e74..b04e894 100644
--- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.machine.structure.rdbms.TDatabase;
 import org.apache.tinkerpop.machine.structure.rdbms.TTable;
 import org.apache.tinkerpop.machine.structure.util.J2Tuple;
 import org.apache.tinkerpop.machine.structure.util.T2Tuple;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
@@ -83,6 +84,11 @@ final class JDBCDatabase implements TDatabase {
     }
 
     @Override
+    public int size() {
+        return (int) IteratorUtils.count(this.entries());
+    }
+
+    @Override
     public Iterator<T2Tuple<String, TTable>> entries() {
         try {
             final ResultSet result = this.connection.createStatement().executeQuery("SHOW TABLES");
diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java
index 2591553..36d2c96 100644
--- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java
@@ -101,6 +101,16 @@ final class JDBCRow<V> implements TRow<V> {
     }
 
     @Override
+    public int size() {
+        try {
+            this.rows.absolute(this.rowId);
+            return this.rows.getMetaData().getColumnCount();
+        } catch (final SQLException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+    @Override
     public Iterator<T2Tuple<String, V>> entries() {
         try {
             this.rows.absolute(this.rowId);
diff --git a/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java b/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java
index 242bba7..6429f07 100644
--- a/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java
+++ b/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java
@@ -67,6 +67,6 @@ public class JDBCTest {
         System.out.println(jdbc.db().values("people").toList());
         System.out.println(jdbc.db().values("people").value("name").toList());
         System.out.println(jdbc.db().values("people").entries().toList());
-        System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").value("name")).as("y").path("x", "y").toList());
+        System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").by("name")).as("y").path("x", "y").toList());
     }
 }