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

[tinkerpop] branch TINKERPOP-2159 updated (2e6b1f6 -> a1c4b0b)

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

dkuppitz pushed a change to branch TINKERPOP-2159
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git.


    omit 2e6b1f6  updated docs
    omit 14948cb  TINKERPOP-2159 Fixed multi-valued property handling in EventStrategy / AddPropertyStep.
     add f5f973a  Fix typos and wording
     add 4fa5162  TINKERPOP-1435 Python support for BigInteger/BigDecimal
     add 5d540d8  TINKERPOP-1435 Add byte support in GraphSON extended module for python
     add 19d42c9  TINKERPOP-1435 Add ByteBuffer support in GraphSON for python
     add 480ed6d  TINKERPOP-1435 Added Char support to graphson and python
     add 202c497  TINKERPOP-1435 added Duration for graphson in python
     add 1cace8f  TINKERPOP-1435 Add char serialization for GraphSON 3.0 in python
     add e4d7544  TINKERPOP-1435 Update changelog
     add ea1e5a3  Merge branch 'TINKERPOP-1435' into tp33
     add 33441fd  TINKERPOP-2163 Improved performance of JavaTranslator method selection
     add d7d0989  Merge branch 'TINKERPOP-2163' into tp33
     add a440e88  TINKERPOP-2164: Reduce chance of hash collisions in Bytecode and its inner classes
     add 016f8ca  Merge branch 'pr-1067' into tp33
     add baed0e5  Bump dependencies for httpclient, commons-codec, slf4j
     add ffee148  Merge branch 'bumps' into tp33
     add 6bb7d57  Fix error in 'The First Five Minutes' section
     add 95087ce  Added TraversalConstructionBenchmark CTR
     add 0b614d8  Added a note about release candidates to GLV "readmes" CTR
     add 44bfc7f  TINKERPOP-2165 Preferred commons-lang3 to commons-lang
     add 65c876e  Merge branch 'TINKERPOP-2165' into tp33
     add f139b40  TINKERPOP-1992 Fix negative time on profile() step
     add f980886  TINKERPOP-1992 Update changelog
     add ee30283  TINKERPOP-1992 Added test to validate that durations are greater than zero.
     add 44693d0  TINKERPOP-1992 Prevented reset of barrier from happening more than once
     add 29fe4cd  Merge branch 'TINKERPOP-1992' into tp33
     add 5ac3add  Added "note" to .net project template.
     add 7e58bf8  TINKERPOP-2174 docker best practices
     add cef3197  TINKERPOP-2174 added changelog entry
     add e57051f  Merge pull request #1080 from apache/TINKERPOP-2174
     add f16b50f  TINKERPOP-2167 Traversals as async iterables in gremlin-javascript
     add d1b3da8  update gremlin-javascript traversal template
     add 78d4e82  Async iterator for Node 6, 8 with unit test
     add dc38ae0  Updated changelog CTR
     add c37d303  Added isodate to pip calls which enables docs to generate properly CTR
     add 845bb9c  TINKERPOP-2177 Prevented failures with auth based requests in python CTR
     add 522ba25  TINKERPOP-2172 Fix PartitionStrategy to apply AddEdgeStartStep
     add f2b78cd  Removed old addE() syntax CTR
     add 95e0d46  Updated changelog
     add d51ed2f  Merge branch 'TINKERPOP-2172' into tp33
     add 2cd84ff  TINKERPOP-2169 Fix connection leak on CorruptedFrameException
     add 13439ac  TINKERPOP-2173 Reset log level to original after each test
     add fb78499  Merge branch 'pr-1082' into tp33
     add 46e6a4d  Update changelog CTR
     add 1a9805b  Change exception message in assertion.
     add 0601c5b  Allowed for multiple error messages to be acceptable in assert
     add 484b826  Minor instructional update in release docs CTR
     add c5d5018  Minor instructional change in dev doc to be more efficient CTR
     add 3284f2e  Move assert of logs out after the Cluster is closed
     add 918591a  Update changelog/upgrade docs for 3.3.6 release CTR
     add 3732a8a  TinkerPop 3.3.6 release
     add 5321dfe  Removed some fancy bits that were added to try to speed up build
     add 232dc99  fixed links - CTR
     add 81577d5  fixed links - CTR
     add 2dc3091  Bump to 3.3.7-SNAPSHOT CTR
     add 45710b1  Bound twine to 1.12.1 as latest version doesn't do auth right for some reason
     add 4a78c6b  minor edit - ` won't render if end markup doesn't have trailing space - CTR
     add 993a443  more minor ` edits - CTR
     add b6ec19f  minor asciidoc fix - CTR
     add cff5267  escape __ with + CTR
     add 4125f94  render code blocks at EOF - CTR
     add a162109  TINKERPOP-2180: Ensure gremlin.sh works when directories contain spaces
     add 70c8f7e  Bump GMavenPlus to 1.6.3 CTR
     add 9334272  TINKERPOP-2180: Make sure user.working_dir is still respected properly
     add 62158d2  TINKERPOP-2180: Fix -l DEBUG
     add 06cc959  TINKERPOP-2179: Have SerializationException extend IOException
     add b59d779  Merge pull request #1083 from newkek/TINKERPOP-2179
     new 4cc32a2  TINKERPOP-2159 Fixed multi-valued property handling in EventStrategy / AddPropertyStep.
     new a1c4b0b  updated docs

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (2e6b1f6)
            \
             N -- N -- N   refs/heads/TINKERPOP-2159 (a1c4b0b)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGELOG.asciidoc                                 |  76 ++++++++++-
 docker/Dockerfile                                  |   2 +-
 docker/hadoop/Dockerfile.template                  |   2 +-
 docs/preprocessor/awk/tabify.awk                   |   7 +
 docs/src/dev/developer/for-committers.asciidoc     |   8 +-
 docs/src/dev/developer/release.asciidoc            |   4 +-
 docs/src/dev/provider/index.asciidoc               |   4 +-
 .../src/recipes/traversal-component-reuse.asciidoc |   2 +-
 docs/src/reference/gremlin-applications.asciidoc   |   2 +-
 docs/src/reference/gremlin-variants.asciidoc       |  12 +-
 docs/src/reference/implementations-giraph.asciidoc |   2 +-
 docs/src/reference/implementations-neo4j.asciidoc  |   2 +-
 docs/src/reference/implementations-spark.asciidoc  |   2 +-
 docs/src/reference/the-traversal.asciidoc          |   4 +-
 docs/src/tutorials/getting-started/index.asciidoc  |  16 +--
 .../gremlin-language-variants/index.asciidoc       |   6 +-
 docs/src/tutorials/gremlins-anatomy/index.asciidoc |  10 +-
 .../tutorials/the-gremlin-console/index.asciidoc   |   4 +-
 docs/src/upgrade/release-3.3.x.asciidoc            |  21 ++-
 giraph-gremlin/pom.xml                             |   2 +-
 .../process/computer/GiraphGraphComputer.java      |   4 +-
 gremlin-archetype/gremlin-archetype-dsl/pom.xml    |   2 +-
 gremlin-archetype/gremlin-archetype-server/pom.xml |   2 +-
 .../gremlin-archetype-tinkergraph/pom.xml          |   2 +-
 gremlin-archetype/pom.xml                          |   2 +-
 gremlin-console/Dockerfile                         |  12 +-
 gremlin-console/bin/gremlin.sh                     |   2 +-
 gremlin-console/pom.xml                            |   7 +-
 gremlin-console/src/main/bin/gremlin.sh            |  29 ++--
 .../console/jsr223/DriverRemoteAcceptor.java       |   2 +-
 gremlin-console/src/main/static/LICENSE            |   6 +-
 gremlin-console/src/main/static/NOTICE             |  12 +-
 gremlin-console/src/main/static/licenses/slf4j     |   2 +-
 .../src/test/python/tests/test_console.py          |   5 +
 gremlin-core/pom.xml                               |   6 +-
 .../tinkerpop/gremlin/jsr223/JavaTranslator.java   |  38 ++++--
 .../gremlin/process/traversal/Bytecode.java        |  39 +++---
 .../process/traversal/step/ProfilingAware.java     |  98 ++++++++++++++
 .../process/traversal/step/map/GraphStep.java      |   4 +-
 .../process/traversal/step/map/GroupStep.java      |  39 +++++-
 .../step/sideEffect/GroupSideEffectStep.java       |  24 +++-
 .../process/traversal/step/util/Parameters.java    |   2 +-
 .../process/traversal/step/util/ProfileStep.java   |  15 +++
 .../strategy/decoration/PartitionStrategy.java     |   4 +-
 .../strategy/finalization/ProfileStrategy.java     |   9 +-
 .../traversal/util/DefaultTraversalMetrics.java    |   2 +-
 .../gremlin/structure/io/gryo/GryoMapper.java      |   2 +-
 .../gremlin/structure/io/gryo/GryoTypeReg.java     |   2 +-
 .../gremlin/structure/util/StringFactory.java      |   2 +-
 .../gremlin/process/traversal/BytecodeTest.java    |  24 ++++
 .../graphson/GraphSONMapperEmbeddedTypeTest.java   |  63 ++++++++-
 gremlin-dotnet/glv/Gremlin.Net.csproj.template     |   4 +-
 gremlin-dotnet/pom.xml                             |   2 +-
 .../Gremlin.Net.Template.csproj                    |   2 +-
 .../Gremlin.Net.Template.nuspec                    |   2 +-
 gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj  |   8 +-
 gremlin-dotnet/src/pom.xml                         |  23 +---
 gremlin-dotnet/test/pom.xml                        |  23 +---
 gremlin-driver/pom.xml                             |   2 +-
 .../apache/tinkerpop/gremlin/driver/Client.java    |   2 +-
 .../tinkerpop/gremlin/driver/Connection.java       |  69 +++++-----
 .../tinkerpop/gremlin/driver/ConnectionPool.java   |  35 +++--
 .../apache/tinkerpop/gremlin/driver/Handler.java   |   2 +-
 .../org/apache/tinkerpop/gremlin/driver/Host.java  |   2 +
 .../gremlin/driver/message/ResponseMessage.java    |   4 +-
 .../remote/DriverRemoteTraversalSideEffects.java   |   3 +-
 .../gremlin/driver/ser/SerializationException.java |   8 +-
 .../tinkerpop/gremlin/driver/ResultQueueTest.java  |   2 +-
 .../gremlin/driver/SerializationExceptionTest.java |  31 ++---
 .../driver/ser/GryoMessageSerializerV1d0Test.java  |   2 +-
 gremlin-groovy/pom.xml                             |   2 +-
 .../gremlin/groovy/engine/GremlinExecutor.java     |   4 +-
 ...GremlinGroovyScriptEngineCompileStaticTest.java |   2 +-
 .../GremlinGroovyScriptEngineOverGraphTest.java    |   2 +-
 .../jsr223/GremlinGroovyScriptEngineTest.java      |   2 +-
 .../GremlinGroovyScriptEngineTypeCheckedTest.java  |   2 +-
 gremlin-javascript/glv/TraversalSource.template    |   8 ++
 gremlin-javascript/pom.xml                         |   2 +-
 .../main/javascript/gremlin-javascript/README.md   |   3 +
 .../gremlin-javascript/lib/process/traversal.js    |   8 ++
 .../javascript/gremlin-javascript/package.json     |   2 +-
 .../gremlin-javascript/test/unit/traversal-test.js |   9 ++
 gremlin-python/pom.xml                             |   8 +-
 gremlin-python/src/main/jython/README              |   5 +-
 .../main/jython/gremlin_python/driver/protocol.py  |   2 +-
 .../src/main/jython/gremlin_python/statics.py      |  24 ++++
 .../gremlin_python/structure/io/graphsonV2d0.py    | 109 ++++++++++++++-
 .../gremlin_python/structure/io/graphsonV3d0.py    | 109 ++++++++++++++-
 gremlin-python/src/main/jython/setup.py            |   3 +-
 gremlin-python/src/main/jython/tests/conftest.py   |  16 +++
 .../src/main/jython/tests/driver/test_client.py    |  43 ++++++
 .../jython/tests/structure/io/test_graphsonV2d0.py |  97 ++++++++++++++
 .../jython/tests/structure/io/test_graphsonV3d0.py | 100 ++++++++++++++
 gremlin-server/Dockerfile                          |  13 +-
 gremlin-server/pom.xml                             |   2 +-
 .../server/handler/HttpGremlinEndpointHandler.java |   5 +-
 .../gremlin/server/op/AbstractOpProcessor.java     |   2 +-
 gremlin-server/src/main/static/LICENSE             |   6 +-
 gremlin-server/src/main/static/NOTICE              |   6 -
 gremlin-server/src/main/static/licenses/slf4j      |   2 +-
 .../driver/ClientConnectionIntegrateTest.java      | 107 +++++++++++++++
 .../gremlin/server/GremlinDriverIntegrateTest.java |   3 +-
 .../server/GremlinServerAuthIntegrateTest.java     |   2 +-
 .../server/GremlinServerAuthKrb5IntegrateTest.java |   2 +-
 .../gremlin/server/GremlinServerIntegrateTest.java |  26 ++--
 .../server/GremlinServerSessionIntegrateTest.java  |   3 +-
 gremlin-shaded/pom.xml                             |   2 +-
 gremlin-test/pom.xml                               |   3 +-
 .../process/traversal/step/map/ProfileTest.java    |   2 +-
 .../decoration/PartitionStrategyProcessTest.java   |  16 ++-
 gremlin-tools/gremlin-benchmark/pom.xml            |   2 +-
 ...rk.java => TraversalConstructionBenchmark.java} | 146 ++++++++-------------
 gremlin-tools/gremlin-coverage/pom.xml             |   2 +-
 gremlin-tools/gremlin-io-test/pom.xml              |   2 +-
 gremlin-tools/pom.xml                              |   2 +-
 hadoop-gremlin/pom.xml                             |   4 +-
 neo4j-gremlin/pom.xml                              |   2 +-
 pom.xml                                            |  28 +++-
 spark-gremlin/pom.xml                              |   2 +-
 tinkergraph-gremlin/pom.xml                        |   2 +-
 .../tinkergraph/structure/TinkerGraphTest.java     |  25 ++++
 121 files changed, 1427 insertions(+), 430 deletions(-)
 create mode 100644 gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ProfilingAware.java
 copy gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/DirectionTest.java => gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/SerializationExceptionTest.java (59%)
 create mode 100644 gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientConnectionIntegrateTest.java
 copy gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/{GraphMutateBenchmark.java => TraversalConstructionBenchmark.java} (51%)


[tinkerpop] 02/02: updated docs

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkuppitz pushed a commit to branch TINKERPOP-2159
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit a1c4b0b25402ce4604d91979af18560e30ce1ce6
Author: Daniel Kuppitz <da...@hotmail.com>
AuthorDate: Thu Mar 7 10:25:46 2019 -0700

    updated docs
---
 CHANGELOG.asciidoc                        |  1 +
 docs/src/reference/the-traversal.asciidoc |  6 ++++++
 docs/src/upgrade/release-3.3.x.asciidoc   | 15 +++++++++++++++
 3 files changed, 22 insertions(+)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 88df8ad..4422a4b 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -24,6 +24,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 === TinkerPop 3.3.7 (Release Date: NOT OFFICIALLY RELEASED YET)
 
 * Ensure `gremlin.sh` works when directories contain spaces
+* Made `EventStrategy` compatible with multi-valued properties.
 
 
 [[release-3-3-6]]
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index 88a20b5..ef28339 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -3492,6 +3492,12 @@ l = new ConsoleMutationListener(graph)
 strategy = EventStrategy.build().addListener(l).create()
 g = graph.traversal().withStrategies(strategy)
 g.addV().property('name','stephen')
+g.V().has('name','stephen').
+  property(list, 'location', 'centreville', 'startTime', 1990, 'endTime', 2000).
+  property(list, 'location', 'dulles', 'startTime', 2000, 'endTime', 2006).
+  property(list, 'location', 'purcellville', 'startTime', 2006)
+g.V().has('name','stephen').
+  property(set, 'location', 'purcellville', 'startTime', 2006, 'endTime', 2019)
 g.E().drop()
 ----
 
diff --git a/docs/src/upgrade/release-3.3.x.asciidoc b/docs/src/upgrade/release-3.3.x.asciidoc
index c1911d3..6dfdfc1 100644
--- a/docs/src/upgrade/release-3.3.x.asciidoc
+++ b/docs/src/upgrade/release-3.3.x.asciidoc
@@ -27,6 +27,21 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 
 Please see the link:https://github.com/apache/tinkerpop/blob/3.3.7/CHANGELOG.asciidoc#release-3-3-7[changelog] for a complete list of all the modifications that are part of this release.
 
+=== Upgrading for Users
+
+==== EventStrategy
+
+Prior TinkerPop 3.3.6 `EventStrategy` did not work with multi-properties. The `EventStrategy` behavior for single-valued properties has not changed; if a property is added to a multi-valued
+`VertexProperty`, then a `VertexPropertyChangedEvent` will be now be fired. The arguments passed to the event depend on the cardinality type.
+
+[width="100%",cols="2"]
+|=========================================================
+|`Cardinality.list` | Since properties will always be added and never be overwritten, the old property passed to the change event will always be an empty property.
+|`Cardinality.set`  | The old property passed to the change event will be empty if no other property with the same value exists, otherwise, it will be the existing property.
+|=========================================================
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2159[TINKERPOP-2159]
+
 == TinkerPop 3.3.6
 
 *Release Date: March 18, 2019*


[tinkerpop] 01/02: TINKERPOP-2159 Fixed multi-valued property handling in EventStrategy / AddPropertyStep.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkuppitz pushed a commit to branch TINKERPOP-2159
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 4cc32a2d9c71945c50140b0c00d38c847389ce14
Author: Daniel Kuppitz <da...@hotmail.com>
AuthorDate: Mon Feb 18 07:30:48 2019 -0700

    TINKERPOP-2159 Fixed multi-valued property handling in EventStrategy / AddPropertyStep.
---
 .../traversal/step/sideEffect/AddPropertyStep.java | 77 +++++++++++++++-------
 .../tinkergraph/structure/TinkerGraphPlayTest.java | 33 ++++++----
 2 files changed, 74 insertions(+), 36 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
index 7509f86..27ffe4e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -41,7 +41,9 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
 
+import java.util.Iterator;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -93,29 +95,58 @@ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S>
         final Element element = traverser.get();
 
         if (this.callbackRegistry != null) {
-            final EventStrategy eventStrategy = getTraversal().getStrategies().getStrategy(EventStrategy.class).get();
-            final Property currentProperty = traverser.get().property(key);
-            final boolean newProperty = element instanceof Vertex ? currentProperty == VertexProperty.empty() : currentProperty == Property.empty();
-            final Event.ElementPropertyChangedEvent evt;
-            if (element instanceof Vertex)
-                evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element),
-                        newProperty ?
-                                eventStrategy.empty(element, key) :
-                                eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues);
-            else if (element instanceof Edge)
-                evt = new Event.EdgePropertyChangedEvent(eventStrategy.detach((Edge) element),
-                        newProperty ?
-                                eventStrategy.empty(element, key) :
-                                eventStrategy.detach(currentProperty), value);
-            else if (element instanceof VertexProperty)
-                evt = new Event.VertexPropertyPropertyChangedEvent(eventStrategy.detach((VertexProperty) element),
-                        newProperty ?
-                                eventStrategy.empty(element, key) :
-                                eventStrategy.detach(currentProperty), value);
-            else
-                throw new IllegalStateException(String.format("The incoming object cannot be processed by change eventing in %s:  %s", AddPropertyStep.class.getName(), element));
-
-            this.callbackRegistry.getCallbacks().forEach(c -> c.accept(evt));
+            getTraversal().getStrategies().getStrategy(EventStrategy.class)
+                    .ifPresent(eventStrategy -> {
+                        Event.ElementPropertyChangedEvent evt = null;
+                        if (element instanceof Vertex) {
+                            final VertexProperty.Cardinality cardinality = this.cardinality != null
+                                    ? this.cardinality
+                                    : element.graph().features().vertex().getCardinality(key);
+
+                            if (cardinality == VertexProperty.Cardinality.list) {
+                                evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element),
+                                        eventStrategy.empty(element, key), value, vertexPropertyKeyValues);
+                            }
+                            else if (cardinality == VertexProperty.Cardinality.set) {
+                                Property currentProperty = VertexProperty.empty();
+                                final Iterator<? extends Property> properties = traverser.get().properties(key);
+                                while (properties.hasNext()) {
+                                    final Property property = properties.next();
+                                    if (Objects.equals(property.value(), value)) {
+                                        currentProperty = property;
+                                        break;
+                                    }
+                                }
+                                evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element),
+                                        currentProperty == VertexProperty.empty() ?
+                                                eventStrategy.empty(element, key) :
+                                                eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues);
+                            }
+                        }
+                        if (evt == null) {
+                            final Property currentProperty = traverser.get().property(key);
+                            final boolean newProperty = element instanceof Vertex ? currentProperty == VertexProperty.empty() : currentProperty == Property.empty();
+                            if (element instanceof Vertex)
+                                evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element),
+                                        newProperty ?
+                                                eventStrategy.empty(element, key) :
+                                                eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues);
+                            else if (element instanceof Edge)
+                                evt = new Event.EdgePropertyChangedEvent(eventStrategy.detach((Edge) element),
+                                        newProperty ?
+                                                eventStrategy.empty(element, key) :
+                                                eventStrategy.detach(currentProperty), value);
+                            else if (element instanceof VertexProperty)
+                                evt = new Event.VertexPropertyPropertyChangedEvent(eventStrategy.detach((VertexProperty) element),
+                                        newProperty ?
+                                                eventStrategy.empty(element, key) :
+                                                eventStrategy.detach(currentProperty), value);
+                            else
+                                throw new IllegalStateException(String.format("The incoming object cannot be processed by change eventing in %s:  %s", AddPropertyStep.class.getName(), element));
+                        }
+                        final Event.ElementPropertyChangedEvent event = evt;
+                        this.callbackRegistry.getCallbacks().forEach(c -> c.accept(event));
+                    });
         }
 
         if (null != this.cardinality)
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index c278e89..8e3e8bd 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -27,6 +27,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.ConsoleMutationListener;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy;
 import org.apache.tinkerpop.gremlin.structure.*;
@@ -124,20 +126,25 @@ public class TinkerGraphPlayTest {
     @Ignore
     public void testPlayDK() throws Exception {
 
-        Graph graph = TinkerGraph.open();
-        graph.io(GraphMLIo.build()).readGraph("../data/grateful-dead.xml");
+        final Graph graph = TinkerGraph.open();
+        final EventStrategy strategy = EventStrategy.build().addListener(new ConsoleMutationListener(graph)).create();
+        final GraphTraversalSource g = graph.traversal().withStrategies(strategy);
+
+        g.addV().property(T.id, 1).iterate();
+        g.V(1).property("name", "name1").iterate();
+        g.V(1).property("name", "name2").iterate();
+        g.V(1).property("name", "name2").iterate();
+
+        g.addV().property(T.id, 2).iterate();
+        g.V(2).property(VertexProperty.Cardinality.list, "name", "name1").iterate();
+        g.V(2).property(VertexProperty.Cardinality.list, "name", "name2").iterate();
+        g.V(2).property(VertexProperty.Cardinality.list, "name", "name2").iterate();
+
 
-        GraphTraversalSource g = graph.traversal();//.withoutStrategies(EarlyLimitStrategy.class);
-        g.V().has("name", "Bob_Dylan").in("sungBy").as("a").
-                repeat(out().order().by(Order.shuffle).simplePath().from("a")).
-                until(out("writtenBy").has("name", "Johnny_Cash")).limit(1).as("b").
-                repeat(out().order().by(Order.shuffle).as("c").simplePath().from("b").to("c")).
-                until(out("sungBy").has("name", "Grateful_Dead")).limit(1).
-                path().from("a").unfold().
-                <List<String>>project("song", "artists").
-                by("name").
-                by(__.coalesce(out("sungBy", "writtenBy").dedup().values("name"), constant("Unknown")).fold()).
-                forEachRemaining(System.out::println);
+        g.addV().property(T.id, 3).iterate();
+        g.V(3).property(VertexProperty.Cardinality.set, "name", "name1", "ping", "pong").iterate();
+        g.V(3).property(VertexProperty.Cardinality.set, "name", "name2", "ping", "pong").iterate();
+        g.V(3).property(VertexProperty.Cardinality.set, "name", "name2", "pong", "ping").iterate();
     }
 
     @Test