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 2015/04/21 19:54:49 UTC

incubator-tinkerpop git commit: the Method.CREATE, Method.GET, etc. model works for Attachable. A few bugs here and there. Pushing for safety.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/attachable_work 58a63998a -> 3545da8da


the Method.CREATE, Method.GET, etc. model works for Attachable. A few bugs here and there. Pushing for safety.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/3545da8d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/3545da8d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/3545da8d

Branch: refs/heads/attachable_work
Commit: 3545da8da78a2f91ad0fd65aa0c73f3d3ea5754d
Parents: 58a6399
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Apr 21 11:54:45 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Apr 21 11:54:45 2015 -0600

----------------------------------------------------------------------
 .../computer/traversal/TraverserExecutor.java   |  3 +-
 .../traversal/step/map/ComputerResultStep.java  |  2 +-
 .../gremlin/process/traversal/Traverser.java    |  6 ++--
 .../traverser/B_O_PA_S_SE_SL_Traverser.java     |  6 ++--
 .../traverser/util/AbstractPathTraverser.java   | 18 +++++------
 .../traverser/util/AbstractTraverser.java       | 16 +++++----
 .../traverser/util/EmptyTraverser.java          |  9 ++++--
 .../gremlin/structure/util/Attachable.java      | 34 ++++++++++----------
 .../util/detached/DetachedElement.java          |  2 +-
 .../structure/util/detached/DetachedPath.java   |  2 +-
 .../util/detached/DetachedProperty.java         |  2 +-
 .../util/detached/DetachedVertexProperty.java   |  4 +--
 .../util/reference/ReferenceElement.java        |  2 +-
 .../structure/util/reference/ReferencePath.java |  2 +-
 .../util/reference/ReferenceProperty.java       |  2 +-
 .../gremlin/structure/util/star/StarGraph.java  | 10 +++++-
 .../util/detached/DetachedEdgeTest.java         |  5 +--
 .../util/detached/DetachedPropertyTest.java     |  5 +--
 .../detached/DetachedVertexPropertyTest.java    |  5 +--
 .../util/detached/DetachedVertexTest.java       |  5 +--
 .../util/reference/ReferenceEdgeTest.java       |  7 ++--
 .../reference/ReferenceVertexPropertyTest.java  |  5 +--
 .../util/reference/ReferenceVertexTest.java     |  5 +--
 .../process/computer/spark/SparkExecutor.java   | 12 +++++--
 .../computer/spark/SparkGraphComputer.java      |  5 +--
 25 files changed, 103 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
index f030dfe..5c3ecdb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
 
@@ -50,7 +51,7 @@ public final class TraverserExecutor {
         messenger.receiveMessages().forEachRemaining(traverserSet -> {
             traverserSet.forEach(traverser -> {
                 traverser.setSideEffects(traversalSideEffects);
-                traverser.attach(vertex);
+                traverser.attach(vertex, Attachable.Method.GET);
                 aliveTraversers.add((Traverser.Admin) traverser);
             });
         });

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index 7ed0f06..b57ad3a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -84,7 +84,7 @@ public final class ComputerResultStep<S> extends AbstractStep<S, S> {
 
         final Traverser.Admin<S> traverser = this.traversers.next();
         if (this.attachElements && (traverser.get() instanceof Attachable))
-            traverser.set((S) ((Attachable) traverser.get()).attach(this.graph));
+            traverser.set((S) ((Attachable) traverser.get()).attach(this.graph, Attachable.Method.GET));
         return traverser;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
index d177842..f8e80f6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
@@ -145,7 +145,7 @@ public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cl
      * The methods in System.Traverser are useful to underlying Step and Traversal implementations.
      * They should not be accessed by the user during lambda-based manipulations.
      */
-    public interface Admin<T> extends Traverser<T>, Attachable<Admin<T>> {
+    public interface Admin<T> extends Traverser<T>, Attachable<T> {
 
         public static final String HALT = "halt";
 
@@ -250,7 +250,7 @@ public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cl
          * @return The inflated traverser
          */
         @Override
-        public Admin<T> attach(final Vertex hostVertex);
+        public T attach(final Vertex hostVertex, final Method method);
 
         /**
          * Traversers can not attach to graphs and thus, an {@link UnsupportedOperationException} is thrown.
@@ -260,7 +260,7 @@ public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cl
          * @throws UnsupportedOperationException is always thrown as it makes no sense to attach a traverser to a graph
          */
         @Override
-        public default Admin<T> attach(final Graph graph) throws UnsupportedOperationException {
+        public default T attach(final Graph graph, final Method method) throws UnsupportedOperationException {
             throw new UnsupportedOperationException("A traverser can only exist at the vertices of the graph, not the graph itself");
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
index 36e78f8..4a8925f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
@@ -62,12 +62,12 @@ public class B_O_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
     }
 
     @Override
-    public Traverser.Admin<T> attach(final Vertex vertex) {
-        super.attach(vertex);
+    public T attach(final Vertex vertex, final Method method) {
+        super.attach(vertex, method);
         final Path newSparsePath = getOrCreateFromCache(this.sideEffects);
         this.path.forEach((object, labels) -> newSparsePath.extend(object, labels.toArray(new String[labels.size()])));
         this.path = newSparsePath;
-        return this;
+        return this.t;
     }
 
     //////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
index ff77e77..73a52de 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
@@ -23,9 +23,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
 
 import java.util.Optional;
 import java.util.function.UnaryOperator;
@@ -148,13 +147,14 @@ public abstract class AbstractPathTraverser<T> implements Traverser<T>, Traverse
     }
 
     @Override
-    public Traverser.Admin<T> attach(final Vertex vertex) {
-        if (this.t instanceof DetachedElement)
-            this.t = (T) ((DetachedElement) this.t).attach(vertex);
-        else if (this.t instanceof DetachedProperty)
-            this.t = (T) ((DetachedProperty) this.t).attach(vertex);
-        // you do not want to attach a path because it will reference graph objects not at the current vertex
-        return this;
+    public T attach(final Vertex vertex, final Method method) {
+        if (this.t instanceof Attachable && !(((Attachable) this.t).getBase() instanceof Path))
+            this.t = ((Attachable<T>) this.t).attach(vertex, method);
+        return this.t;
+    }
+
+    public T getBase() {
+        return this.get();
     }
 
     /////////////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
index cb86070..1420905 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyPath;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceElement;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
@@ -108,13 +109,11 @@ public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Ad
     }
 
     @Override
-    public Admin<T> attach(final Vertex hostVertex) {
-        if (this.t instanceof ReferenceElement)
-            this.t = (T) ((ReferenceElement) this.t).attach(hostVertex);
-        else if (this.t instanceof ReferenceProperty)
-            this.t = (T) ((ReferenceProperty) this.t).attach(hostVertex);
+    public T attach(final Vertex hostVertex, final Method method) {
+        if(this.t instanceof Attachable && !(((Attachable) this.t).getBase() instanceof Path))
+            this.t = (T) method.apply((Attachable)this.t,hostVertex);
         // you do not want to attach a path because it will reference graph objects not at the current vertex
-        return this;
+        return this.t;
     }
 
     @Override
@@ -134,6 +133,11 @@ public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Ad
     }
 
     @Override
+    public T getBase() {
+        return this.t;
+    }
+
+    @Override
     public <S> S sack() {
         throw new UnsupportedOperationException("This traverser does not support sacks: " + this.getClass().getCanonicalName());
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
index 498f6b0..7d843fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
@@ -86,8 +86,8 @@ public final class EmptyTraverser<T> implements Traverser<T>, Traverser.Admin<T>
     }
 
     @Override
-    public Admin<T> attach(final Vertex hostVertex) {
-        return this;
+    public T attach(final Vertex hostVertex, final Method method) {
+        return null;
     }
 
     @Override
@@ -101,6 +101,11 @@ public final class EmptyTraverser<T> implements Traverser<T>, Traverser.Admin<T>
     }
 
     @Override
+    public T getBase() {
+        return null;
+    }
+
+    @Override
     public <S> S sack() {
         return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/Attachable.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/Attachable.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/Attachable.java
index ba50374..65bd610 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/Attachable.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/Attachable.java
@@ -43,7 +43,7 @@ public interface Attachable<T> {
         GET {
             @Override
             public Object apply(final Attachable attachable, final Object hostVertexOrGraph) {
-                final Object base = attachable.get();
+                final Object base = attachable.getBase();
                 if (base instanceof Vertex) {
                     final Optional<Vertex> optional = hostVertexOrGraph instanceof Graph ?
                             Method.getVertex(attachable, (Graph) hostVertexOrGraph) :
@@ -73,7 +73,7 @@ public interface Attachable<T> {
         CREATE {
             @Override
             public Object apply(final Attachable attachable, final Object hostVertexOrGraph) {
-                final Object base = attachable.get();
+                final Object base = attachable.getBase();
                 if (base instanceof Vertex) {
                     return hostVertexOrGraph instanceof Graph ?
                             Method.createVertex(attachable, (Graph) hostVertexOrGraph) :
@@ -99,21 +99,21 @@ public interface Attachable<T> {
         ///////////////////
 
         public static Optional<Vertex> getVertex(final Attachable<Vertex> attachableVertex, final Graph hostGraph) {
-            final Iterator<Vertex> vertexIterator = hostGraph.vertices(attachableVertex.get().id());
+            final Iterator<Vertex> vertexIterator = hostGraph.vertices(attachableVertex.getBase().id());
             return vertexIterator.hasNext() ? Optional.of(vertexIterator.next()) : Optional.empty();
         }
 
         public static Optional<Vertex> getVertex(final Attachable<Vertex> attachableVertex, final Vertex hostVertex) {
-            return ElementHelper.areEqual(attachableVertex.get(), hostVertex) ? Optional.of(hostVertex) : Optional.empty();
+            return ElementHelper.areEqual(attachableVertex.getBase(), hostVertex) ? Optional.of(hostVertex) : Optional.empty();
         }
 
         public static Optional<Edge> getEdge(final Attachable<Edge> attachableEdge, final Graph hostGraph) {
-            final Iterator<Edge> edgeIterator = hostGraph.edges(attachableEdge.get().id());
+            final Iterator<Edge> edgeIterator = hostGraph.edges(attachableEdge.getBase().id());
             return edgeIterator.hasNext() ? Optional.of(edgeIterator.next()) : Optional.empty();
         }
 
         public static Optional<Edge> getEdge(final Attachable<Edge> attachableEdge, final Vertex hostVertex) {
-            final Object baseId = attachableEdge.get().id();
+            final Object baseId = attachableEdge.getBase().id();
             final Iterator<Edge> edgeIterator = hostVertex.edges(Direction.OUT);
             while (edgeIterator.hasNext()) {
                 final Edge edge = edgeIterator.next();
@@ -124,7 +124,7 @@ public interface Attachable<T> {
         }
 
         public static Optional<VertexProperty> getVertexProperty(final Attachable<VertexProperty> attachableVertexProperty, final Graph hostGraph) {
-            final VertexProperty baseVertexProperty = attachableVertexProperty.get();
+            final VertexProperty baseVertexProperty = attachableVertexProperty.getBase();
             final Iterator<Vertex> vertexIterator = hostGraph.vertices(baseVertexProperty.element().id());
             if (vertexIterator.hasNext()) {
                 final Iterator<VertexProperty<Object>> vertexPropertyIterator = vertexIterator.next().properties(baseVertexProperty.key());
@@ -138,7 +138,7 @@ public interface Attachable<T> {
         }
 
         public static Optional<VertexProperty> getVertexProperty(final Attachable<VertexProperty> attachableVertexProperty, final Vertex hostVertex) {
-            final VertexProperty baseVertexProperty = attachableVertexProperty.get();
+            final VertexProperty baseVertexProperty = attachableVertexProperty.getBase();
             final Iterator<VertexProperty<Object>> vertexPropertyIterator = hostVertex.properties(baseVertexProperty.key());
             while (vertexPropertyIterator.hasNext()) {
                 final VertexProperty vertexProperty = vertexPropertyIterator.next();
@@ -149,8 +149,8 @@ public interface Attachable<T> {
         }
 
         public static Optional<Property> getProperty(final Attachable<Property> attachableProperty, final Graph hostGraph) {
-            final Property baseProperty = attachableProperty.get();
-            final Element propertyElement = attachableProperty.get().element();
+            final Property baseProperty = attachableProperty.getBase();
+            final Element propertyElement = attachableProperty.getBase().element();
             if (propertyElement instanceof Edge) {
                 final Iterator<Edge> edgeIterator = hostGraph.edges(propertyElement.id());
                 if (edgeIterator.hasNext()) {
@@ -179,8 +179,8 @@ public interface Attachable<T> {
         }
 
         public static Optional<Property> getProperty(final Attachable<Property> attachableProperty, final Vertex hostVertex) {
-            final Property baseProperty = attachableProperty.get();
-            final Element propertyElement = attachableProperty.get().element();
+            final Property baseProperty = attachableProperty.getBase();
+            final Element propertyElement = attachableProperty.getBase().element();
             if (propertyElement instanceof Edge) {
                 final Iterator<Edge> edgeIterator = hostVertex.edges(Direction.OUT);
                 if (edgeIterator.hasNext()) {
@@ -208,7 +208,7 @@ public interface Attachable<T> {
         /////
 
         public static Vertex createVertex(final Attachable<Vertex> attachableVertex, final Graph hostGraph) {
-            final Vertex baseVertex = attachableVertex.get();
+            final Vertex baseVertex = attachableVertex.getBase();
             final List<Object> keyValues = new ArrayList<>();
             keyValues.add(org.apache.tinkerpop.gremlin.process.traversal.T.id);
             keyValues.add(baseVertex.id());
@@ -227,7 +227,7 @@ public interface Attachable<T> {
         }
 
         public static Edge createEdge(final Attachable<Edge> attachableEdge, final Graph hostGraph) {
-            final Edge baseEdge = attachableEdge.get();
+            final Edge baseEdge = attachableEdge.getBase();
             Iterator<Vertex> vertices = hostGraph.vertices(baseEdge.outVertex().id());
             final Vertex outV = vertices.hasNext() ? vertices.next() : hostGraph.addVertex(org.apache.tinkerpop.gremlin.process.traversal.T.id, baseEdge.outVertex().id());
             vertices = hostGraph.vertices(baseEdge.inVertex().id());
@@ -250,7 +250,7 @@ public interface Attachable<T> {
         }
 
         public static VertexProperty createVertexProperty(final Attachable<VertexProperty> attachableVertexProperty, final Graph hostGraph) {
-            final VertexProperty<Object> baseVertexProperty = attachableVertexProperty.get();
+            final VertexProperty<Object> baseVertexProperty = attachableVertexProperty.getBase();
             final Iterator<Vertex> vertexIterator = hostGraph.vertices(baseVertexProperty.element().id());
             if (vertexIterator.hasNext()) {
                 final VertexProperty vertexProperty = vertexIterator.next().property(VertexProperty.Cardinality.list, baseVertexProperty.key(), baseVertexProperty.value(), org.apache.tinkerpop.gremlin.process.traversal.T.id, baseVertexProperty.id());
@@ -261,7 +261,7 @@ public interface Attachable<T> {
         }
 
         public static VertexProperty createVertexProperty(final Attachable<VertexProperty> attachableVertexProperty, final Vertex hostVertex) {
-            final VertexProperty<Object> baseVertexProperty = attachableVertexProperty.get();
+            final VertexProperty<Object> baseVertexProperty = attachableVertexProperty.getBase();
             final VertexProperty vertexProperty = hostVertex.property(VertexProperty.Cardinality.list, baseVertexProperty.key(), baseVertexProperty.value(), org.apache.tinkerpop.gremlin.process.traversal.T.id, baseVertexProperty.id());
             baseVertexProperty.properties().forEachRemaining(p -> vertexProperty.property(p.key(), p.value()));
             return vertexProperty;
@@ -278,7 +278,7 @@ public interface Attachable<T> {
 
     }
 
-    public T get();
+    public T getBase();
 
     public T attach(final Vertex hostVertex, final Method method) throws IllegalStateException;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedElement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedElement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedElement.java
index b748633..1da69f3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedElement.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedElement.java
@@ -97,7 +97,7 @@ public abstract class DetachedElement<E> implements Element, Serializable, Attac
                 (Iterator) this.properties.entrySet().stream().filter(entry -> ElementHelper.keyExists(entry.getKey(), propertyKeys)).flatMap(entry -> entry.getValue().stream()).iterator();
     }
 
-    public E get() {
+    public E getBase() {
         return (E) this;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
index 8610922..9d971d9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
@@ -35,7 +35,7 @@ public class DetachedPath extends MutablePath implements Attachable<Path> {
 
     }
 
-    public Path get() {
+    public Path getBase() {
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedProperty.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedProperty.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedProperty.java
index c5b3a9d..a4d4a0c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedProperty.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedProperty.java
@@ -53,7 +53,7 @@ public class DetachedProperty<V> implements Property, Serializable, Attachable<P
         this.element = DetachedFactory.detach(element, false);
     }
 
-    public Property get() {
+    public Property getBase() {
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexProperty.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexProperty.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexProperty.java
index 675244a..700f0d5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexProperty.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexProperty.java
@@ -128,9 +128,9 @@ public class DetachedVertexProperty<V> extends DetachedElement<Property<V>> impl
         return (Iterator) super.properties(propertyKeys);
     }
 
-    public static <V> VertexProperty<V> addTo(final Vertex vertex, final DetachedVertexProperty<V> detachedVertexProperty) {
+    /*public static <V> VertexProperty<V> addTo(final Vertex vertex, final DetachedVertexProperty<V> detachedVertexProperty) {
         final VertexProperty<V> vertexProperty = vertex.property(VertexProperty.Cardinality.single, detachedVertexProperty.key(), detachedVertexProperty.value()); // TODO: this isn't right, is it? (need to remove views from Spark/Giraph)
         detachedVertexProperty.properties().forEachRemaining(property -> vertexProperty.property(property.key(), property.value()));
         return vertexProperty;
-    }
+    }*/
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceElement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceElement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceElement.java
index c7b68b7..0bcf37c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceElement.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceElement.java
@@ -72,7 +72,7 @@ public abstract class ReferenceElement<E extends Element> implements Element, Se
         return ElementHelper.areEqual(this, other);
     }
 
-    public E get() {
+    public E getBase() {
         return (E) this;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
index 7b85c17..b52b93d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
@@ -38,7 +38,7 @@ public class ReferencePath extends MutablePath implements Attachable<Path> {
 
     }
 
-    public Path get() {
+    public Path getBase() {
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceProperty.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceProperty.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceProperty.java
index d68d1aa..c034629 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceProperty.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceProperty.java
@@ -45,7 +45,7 @@ public class ReferenceProperty<V> implements Attachable<Property>, Serializable,
 
     }
 
-    public Property get() {
+    public Property getBase() {
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraph.java
index b474fdb..ccfe7d9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraph.java
@@ -247,7 +247,7 @@ public final class StarGraph implements Graph {
             super(id, label);
         }
 
-        public Vertex get() {
+        public Vertex getBase() {
             return this;
         }
 
@@ -264,6 +264,14 @@ public final class StarGraph implements Graph {
             this.inEdges.clear();
         }
 
+        public void dropVertexProperties(final String... keys) {
+            if (null != keys) {  // TODO: this is bad
+                for (final String key : keys) {
+                    this.vertexProperties.remove(key);
+                }
+            }
+        }
+
         @Override
         public Edge addEdge(final String label, final Vertex inVertex, final Object... keyValues) {
             return this.addOutEdge(label, inVertex, keyValues);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdgeTest.java
index eaf62b1..0bd9b1b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdgeTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdgeTest.java
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory;
 import org.apache.tinkerpop.gremlin.util.StreamFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
@@ -125,7 +126,7 @@ public class DetachedEdgeTest extends AbstractGremlinTest {
     public void shouldAttachToGraph() {
         final Edge toDetach = g.E(convertToEdgeId("josh", "created", "lop")).next();
         final DetachedEdge detachedEdge = DetachedFactory.detach(toDetach, true);
-        final Edge attached = detachedEdge.attach(graph);
+        final Edge attached = detachedEdge.attach(graph, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedEdge);
@@ -137,7 +138,7 @@ public class DetachedEdgeTest extends AbstractGremlinTest {
         final Edge toDetach = g.E(convertToEdgeId("josh", "created", "lop")).next();
         final Vertex outV = toDetach.vertices(Direction.OUT).next();
         final DetachedEdge detachedEdge = DetachedFactory.detach(toDetach, true);
-        final Edge attached = detachedEdge.attach(outV);
+        final Edge attached = detachedEdge.attach(outV, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedEdge);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPropertyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPropertyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPropertyTest.java
index 299d089..674bafc 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPropertyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPropertyTest.java
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
@@ -72,7 +73,7 @@ public class DetachedPropertyTest extends AbstractGremlinTest {
         final Edge e = g.E(convertToEdgeId("josh", "created", "lop")).next();
         final Property toDetach = e.properties("weight").next();
         final DetachedProperty detachedProperty = DetachedFactory.detach(toDetach);
-        final Property attached = detachedProperty.attach(graph);
+        final Property attached = detachedProperty.attach(graph, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedProperty);
@@ -84,7 +85,7 @@ public class DetachedPropertyTest extends AbstractGremlinTest {
         final Edge e = g.E(convertToEdgeId("josh", "created", "lop")).next();
         final Property toDetach = e.property("weight");
         final DetachedProperty detachedProperty = DetachedFactory.detach(toDetach);
-        final Property attached = detachedProperty.attach(e.outVertex());
+        final Property attached = detachedProperty.attach(e.outVertex(), Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedProperty);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexPropertyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexPropertyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexPropertyTest.java
index b9ae3ba..a363373 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexPropertyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexPropertyTest.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.util.StreamFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;
@@ -127,7 +128,7 @@ public class DetachedVertexPropertyTest extends AbstractGremlinTest {
         final Vertex v = graph.addVertex();
         final VertexProperty toDetach = v.property(VertexProperty.Cardinality.single, "test", "this");
         final DetachedVertexProperty detached = DetachedFactory.detach(toDetach, true);
-        final VertexProperty attached = detached.attach(graph);
+        final VertexProperty attached = detached.attach(graph, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedVertexProperty);
@@ -139,7 +140,7 @@ public class DetachedVertexPropertyTest extends AbstractGremlinTest {
         final Vertex v = graph.addVertex();
         final VertexProperty toDetach = v.property(VertexProperty.Cardinality.single, "test", "this");
         final DetachedVertexProperty detached = DetachedFactory.detach(toDetach, true);
-        final VertexProperty attached = detached.attach(v);
+        final VertexProperty attached = detached.attach(v, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertEquals(toDetach.getClass(), attached.getClass());

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexTest.java
index add7797..f1fcc33 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexTest.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;
@@ -136,7 +137,7 @@ public class DetachedVertexTest extends AbstractGremlinTest {
     public void shouldAttachToGraph() {
         final Vertex toDetach = g.V(convertToVertexId("josh")).next();
         final DetachedVertex detachedVertex = DetachedFactory.detach(toDetach, true);
-        final Vertex attached = detachedVertex.attach(graph);
+        final Vertex attached = detachedVertex.attach(graph, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedVertex);
@@ -147,7 +148,7 @@ public class DetachedVertexTest extends AbstractGremlinTest {
     public void shouldAttachToVertex() {
         final Vertex toDetach = g.V(convertToVertexId("josh")).next();
         final DetachedVertex detachedVertex = DetachedFactory.detach(toDetach, true);
-        final Vertex attached = detachedVertex.attach(toDetach);
+        final Vertex attached = detachedVertex.attach(toDetach, Attachable.Method.GET);
 
         assertEquals(toDetach, attached);
         assertFalse(attached instanceof DetachedVertex);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceEdgeTest.java
index 616d26e..20e4073 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceEdgeTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceEdgeTest.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;
@@ -102,7 +103,7 @@ public class ReferenceEdgeTest extends AbstractGremlinTest {
     public void shouldAttachToGraph() {
         final Edge toReference = g.E(convertToEdgeId("josh", "created", "lop")).next();
         final ReferenceEdge referenceEdge = ReferenceFactory.detach(toReference);
-        final Edge referenced = referenceEdge.attach(graph);
+        final Edge referenced = referenceEdge.attach(graph, Attachable.Method.GET);
 
         assertEquals(toReference, referenced);
         assertFalse(referenced instanceof ReferenceEdge);
@@ -113,8 +114,8 @@ public class ReferenceEdgeTest extends AbstractGremlinTest {
     public void shouldAttachToVertex() {
         final Edge toReference = g.E(convertToEdgeId("josh", "created", "lop")).next();
         final Vertex outV = toReference.vertices(Direction.OUT).next();
-        final ReferenceEdge detachedEdge = ReferenceFactory.detach(toReference);
-        final Edge attached = detachedEdge.attach(outV);
+        final ReferenceEdge referenceEdge = ReferenceFactory.detach(toReference);
+        final Edge attached = referenceEdge.attach(outV, Attachable.Method.GET);
 
         assertEquals(toReference, attached);
         assertFalse(attached instanceof ReferenceEdge);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexPropertyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexPropertyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexPropertyTest.java
index 95be726..4f6e17f 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexPropertyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexPropertyTest.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
@@ -80,7 +81,7 @@ public class ReferenceVertexPropertyTest extends AbstractGremlinTest {
         final Vertex v = graph.addVertex();
         final VertexProperty toReference = v.property(VertexProperty.Cardinality.single, "test", "this");
         final ReferenceVertexProperty rvp = ReferenceFactory.detach(toReference);
-        final VertexProperty referenced = rvp.attach(graph);
+        final VertexProperty referenced = rvp.attach(graph, Attachable.Method.GET);
 
         assertEquals(toReference, referenced);
         assertFalse(referenced instanceof ReferenceVertexProperty);
@@ -92,7 +93,7 @@ public class ReferenceVertexPropertyTest extends AbstractGremlinTest {
         final Vertex v = graph.addVertex();
         final VertexProperty toReference = v.property(VertexProperty.Cardinality.single, "test", "this");
         final ReferenceVertexProperty rvp = ReferenceFactory.detach(toReference);
-        final VertexProperty referenced = rvp.attach(v);
+        final VertexProperty referenced = rvp.attach(v, Attachable.Method.GET);
 
         assertEquals(toReference, referenced);
         assertEquals(toReference.getClass(), referenced.getClass());

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexTest.java
index a2fa663..41e9c67 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferenceVertexTest.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;
@@ -102,7 +103,7 @@ public class ReferenceVertexTest extends AbstractGremlinTest {
     public void shouldAttachToGraph() {
         final Vertex v = g.V(convertToVertexId("josh")).next();
         final ReferenceVertex referenceVertex = ReferenceFactory.detach(v);
-        final Vertex attachedV = referenceVertex.attach(graph);
+        final Vertex attachedV = referenceVertex.attach(graph, Attachable.Method.GET);
 
         assertEquals(v, attachedV);
         assertFalse(attachedV instanceof ReferenceVertex);
@@ -113,7 +114,7 @@ public class ReferenceVertexTest extends AbstractGremlinTest {
     public void shouldAttachToVertex() {
         final Vertex v = g.V(convertToVertexId("josh")).next();
         final ReferenceVertex referenceVertex = ReferenceFactory.detach(v);
-        final Vertex attachedV = referenceVertex.attach(v);
+        final Vertex attachedV = referenceVertex.attach(v, Attachable.Method.GET);
 
         assertEquals(v, attachedV);
         assertFalse(attachedV instanceof ReferenceVertex);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkExecutor.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkExecutor.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkExecutor.java
index 5203b21..af0a6a6 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkExecutor.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkExecutor.java
@@ -41,6 +41,8 @@ import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
 import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.util.ComputerGraph;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.star.StarGraph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
@@ -83,10 +85,12 @@ public final class SparkExecutor {
                     workerVertexProgram.workerIterationStart(memory); // start the worker
                     return () -> IteratorUtils.map(partitionIterator, vertexViewIncoming -> {
                         final Vertex vertex = vertexViewIncoming._2()._1().get(); // get the vertex from the vertex writable
+                        // drop any compute properties that are in memory
+                        ((StarGraph.StarVertex)vertex).dropVertexProperties(elementComputeKeysArray);
                         final boolean hasViewAndMessages = vertexViewIncoming._2()._2().isPresent(); // if this is the first iteration, then there are no views or messages
                         final List<DetachedVertexProperty<Object>> previousView = hasViewAndMessages ? vertexViewIncoming._2()._2().get().getView() : Collections.emptyList();
                         final List<M> incomingMessages = hasViewAndMessages ? vertexViewIncoming._2()._2().get().getIncomingMessages() : Collections.emptyList();
-                        previousView.forEach(property -> DetachedVertexProperty.addTo(vertex, property));  // attach the view to the vertex
+                        previousView.forEach(property -> property.attach(vertex, Attachable.Method.CREATE));  // attach the view to the vertex
                         ///
                         messenger.setVertexAndIncomingMessages(vertex, incomingMessages); // set the messenger with the incoming messages
                         workerVertexProgram.execute(ComputerGraph.of(vertex, elementComputeKeys), messenger, memory); // execute the vertex program on this vertex for this iteration
@@ -137,18 +141,20 @@ public final class SparkExecutor {
     // MAP REDUCE //
     ////////////////
 
-    public static <M> JavaPairRDD<Object, VertexWritable> prepareGraphRDDForMapReduce(final JavaPairRDD<Object, VertexWritable> graphRDD, final JavaPairRDD<Object, ViewIncomingPayload<M>> viewIncomingRDD) {
+    public static <M> JavaPairRDD<Object, VertexWritable> prepareGraphRDDForMapReduce(final JavaPairRDD<Object, VertexWritable> graphRDD, final JavaPairRDD<Object, ViewIncomingPayload<M>> viewIncomingRDD, final String[] elementComputeKeys) {
         return (null == viewIncomingRDD) ?
                 graphRDD.mapValues(vertexWritable -> {
                     ((StarGraph.StarVertex)vertexWritable.get()).dropEdges();
+                    ((StarGraph.StarVertex)vertexWritable.get()).dropVertexProperties(elementComputeKeys);
                     return vertexWritable;
                 }) :
                 graphRDD.leftOuterJoin(viewIncomingRDD)
                         .mapValues(tuple -> {
                             final Vertex vertex = tuple._1().get();
                             ((StarGraph.StarVertex)vertex).dropEdges();
+                            ((StarGraph.StarVertex)vertex).dropVertexProperties(elementComputeKeys);
                             final List<DetachedVertexProperty<Object>> view = tuple._2().isPresent() ? tuple._2().get().getView() : Collections.emptyList();
-                            view.forEach(property -> DetachedVertexProperty.addTo(vertex, property));
+                            view.forEach(property -> property.attach(vertex, Attachable.Method.CREATE));
                             return tuple._1();
                         });
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3545da8d/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
index 1b51690..d40b932 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
@@ -67,7 +67,7 @@ public final class SparkGraphComputer implements GraphComputer {
     protected final HadoopGraph hadoopGraph;
     private boolean executed = false;
     private final Set<MapReduce> mapReducers = new HashSet<>();
-    private VertexProgram vertexProgram;
+    private VertexProgram<Object> vertexProgram;
 
     private Optional<ResultGraph> resultGraph = Optional.empty();
     private Optional<Persist> persist = Optional.empty();
@@ -214,7 +214,8 @@ public final class SparkGraphComputer implements GraphComputer {
                         //////////////////////////////
                         if (!this.mapReducers.isEmpty()) {
                             // drop all edges and messages in the graphRDD as they are no longer needed for the map reduce jobs
-                            final JavaPairRDD<Object, VertexWritable> mapReduceGraphRDD = SparkExecutor.prepareGraphRDDForMapReduce(graphRDD, viewIncomingRDD).setName("mapReduceGraphRDD").cache();
+                            final String[] elementComputeKeys = this.vertexProgram == null ? new String[0] : this.vertexProgram.getElementComputeKeys().toArray(new String[this.vertexProgram.getElementComputeKeys().size()]);
+                            final JavaPairRDD<Object, VertexWritable> mapReduceGraphRDD = SparkExecutor.prepareGraphRDDForMapReduce(graphRDD, viewIncomingRDD, elementComputeKeys).setName("mapReduceGraphRDD").cache();
                             for (final MapReduce mapReduce : this.mapReducers) {
                                 // execute the map reduce job
                                 final HadoopConfiguration newApacheConfiguration = new HadoopConfiguration(apacheConfiguration);