TINKERPOP-1587 TinkerGraph serialization supports multiproperties This generally applies to TinkerGraphs sent over Gremlin Server.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/cc918df4 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/cc918df4 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/cc918df4 Branch: refs/heads/TINKERPOP-1545-tp32 Commit: cc918df4e56d468c56e7e0f3ef1aba49c207b03b Parents: c1e3271 Author: Stephen Mallette <sp...@genoprime.com> Authored: Thu Dec 29 05:37:47 2016 -0500 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Thu Dec 29 05:37:47 2016 -0500 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + .../upgrade/release-3.2.x-incubating.asciidoc | 14 +++++++++++ .../tinkergraph/structure/TinkerIoRegistry.java | 10 ++++++-- .../tinkergraph/structure/TinkerGraphTest.java | 25 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/cc918df4/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index b9c6408..d6fdc89 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.4 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* `TinkerGraph` Gryo and GraphSON deserialization is now configured to use multi-properties. * Changed behavior of `ElementHelper.areEqual(Property, Property)` to not throw exceptions with `null` arguments. * Added `GryoVersion` for future flexibility when introducing a new verison of Gryo and moved serializer registrations to it. * Fixed Gryo serialization of `ConnectiveP` instances. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/cc918df4/docs/src/upgrade/release-3.2.x-incubating.asciidoc ---------------------------------------------------------------------- diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc b/docs/src/upgrade/release-3.2.x-incubating.asciidoc index 428b0c6..6dcb0a3 100644 --- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc +++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc @@ -32,6 +32,20 @@ Please see the link:https://github.com/apache/tinkerpop/blob/3.2.4/CHANGELOG.asc Upgrading for Users ~~~~~~~~~~~~~~~~~~~ +TinkerGraph Deserialization +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A TinkerGraph deserialized from Gryo or GraphSON is now configured with multi-properties enabled. This change allows +TinkerGraphs returned from Gremlin Server to properly return multi-properties, which was a problem seen when +subgraphing a graph that contained properties with a setting other than `Cardinality.single`. + +This change could be considered breaking in the odd chance that a TinkerGraph returned from Gremlin Server was later +mutated, because calls to `property(k,v)` would default to `Cardinality.list` instead of `Cardinality.single`. In the +event that this is a problem, simple change calls to `property(k,v)` to `property(Cardinality.single,k,v)` and +explicitly set the `Cardinality`. + +See: link:https://issues.apache.org/jira/browse/TINKERPOP-1587[TINKERPOP-1587] + Traversal Promises ^^^^^^^^^^^^^^^^^^ http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/cc918df4/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistry.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistry.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistry.java index 64398c9..66bdba1 100644 --- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistry.java +++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistry.java @@ -18,6 +18,8 @@ */ package org.apache.tinkerpop.gremlin.tinkergraph.structure; +import org.apache.commons.configuration.BaseConfiguration; +import org.apache.commons.configuration.Configuration; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.io.AbstractIoRegistry; @@ -109,7 +111,9 @@ public final class TinkerIoRegistry extends AbstractIoRegistry { @Override public TinkerGraph read(final Kryo kryo, final Input input, final Class<TinkerGraph> tinkerGraphClass) { - final TinkerGraph graph = TinkerGraph.open(); + final Configuration conf = new BaseConfiguration(); + conf.setProperty("gremlin.tinkergraph.defaultVertexPropertyCardinality", "list"); + final TinkerGraph graph = TinkerGraph.open(conf); final int len = input.readInt(); final byte[] bytes = input.readBytes(len); try (final ByteArrayInputStream stream = new ByteArrayInputStream(bytes)) { @@ -222,7 +226,9 @@ public final class TinkerIoRegistry extends AbstractIoRegistry { @Override public TinkerGraph deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - final TinkerGraph graph = TinkerGraph.open(); + final Configuration conf = new BaseConfiguration(); + conf.setProperty("gremlin.tinkergraph.defaultVertexPropertyCardinality", "list"); + final TinkerGraph graph = TinkerGraph.open(conf); final List<Map<String, Object>> edges; final List<Map<String, Object>> vertices; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/cc918df4/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java index 451bc3b..9de9a70 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java @@ -313,6 +313,19 @@ public class TinkerGraphTest { } @Test + public void shouldSerializeTinkerGraphWithMultiPropertiesToGryo() throws Exception { + final TinkerGraph graph = TinkerFactory.createTheCrew(); + try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) { + graph.io(IoCore.gryo()).writer().create().writeObject(out, graph); + final byte[] b = out.toByteArray(); + try (final ByteArrayInputStream inputStream = new ByteArrayInputStream(b)) { + final TinkerGraph target = graph.io(IoCore.gryo()).reader().create().readObject(inputStream, TinkerGraph.class); + IoTest.assertCrewGraph(target, false); + } + } + } + + @Test public void shouldSerializeTinkerGraphToGraphSON() throws Exception { final TinkerGraph graph = TinkerFactory.createModern(); try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) { @@ -325,6 +338,18 @@ public class TinkerGraphTest { } @Test + public void shouldSerializeTinkerGraphWithMultiPropertiesToGraphSON() throws Exception { + final TinkerGraph graph = TinkerFactory.createTheCrew(); + try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) { + graph.io(IoCore.graphson()).writer().create().writeObject(out, graph); + try (final ByteArrayInputStream inputStream = new ByteArrayInputStream(out.toByteArray())) { + final TinkerGraph target = graph.io(IoCore.graphson()).reader().create().readObject(inputStream, TinkerGraph.class); + IoTest.assertCrewGraph(target, false); + } + } + } + + @Test public void shouldSerializeTinkerGraphToGraphSONWithTypes() throws Exception { final TinkerGraph graph = TinkerFactory.createModern(); final Mapper<ObjectMapper> mapper = graph.io(IoCore.graphson()).mapper().embedTypes(true).create();