Repository: tinkerpop Updated Branches: refs/heads/master fc48b046c -> c60cb9e74
move implementation of clone to GraphHelper Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/9bf5f636 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9bf5f636 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9bf5f636 Branch: refs/heads/master Commit: 9bf5f636eb46f2ae3a8869b3373134ffd94ebb70 Parents: a44e881 Author: Michael Pollmeier <mich...@michaelpollmeier.com> Authored: Mon Sep 11 10:53:40 2017 +1200 Committer: Michael Pollmeier <mich...@michaelpollmeier.com> Committed: Thu Sep 21 14:08:27 2017 +1200 ---------------------------------------------------------------------- gremlin-core/pom.xml | 6 ++ .../gremlin/structure/util/GraphHelper.java | 39 +++++++++++++ .../gremlin/structure/util/GraphHelperTest.java | 59 ++++++++++++++++++++ .../tinkergraph/structure/TinkerGraph.java | 17 +----- .../tinkergraph/structure/TinkerGraphTest.java | 30 ---------- 5 files changed, 105 insertions(+), 46 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bf5f636/gremlin-core/pom.xml ---------------------------------------------------------------------- diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml index bab7b65..e690c5d 100644 --- a/gremlin-core/pom.xml +++ b/gremlin-core/pom.xml @@ -95,6 +95,12 @@ limitations under the License. <artifactId>hamcrest-all</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.tinkerpop</groupId> + <artifactId>tinkergraph-gremlin</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> <!-- needed to test GraphFactory and xml based config via optional dependency in apache configurations --> <dependency> <groupId>commons-collections</groupId> http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bf5f636/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelper.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelper.java new file mode 100644 index 0000000..5d4809c --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelper.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.structure.util; + +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; + +/** + * Utility class supporting common functions for {@link org.apache.tinkerpop.gremlin.structure.Graph}. + */ +public final class GraphHelper { + + private GraphHelper() { + } + + /** + * make a deep clone of the graph elements that preserves ids + */ + public static void cloneElements(final Graph original, final Graph clone) { + original.vertices().forEachRemaining(v -> DetachedFactory.detach(v, true).attach(Attachable.Method.create(clone))); + original.edges().forEachRemaining(e -> DetachedFactory.detach(e, true).attach(Attachable.Method.create(clone))); + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bf5f636/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelperTest.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelperTest.java new file mode 100644 index 0000000..c186caf --- /dev/null +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/GraphHelperTest.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.structure.util; + +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class GraphHelperTest { + + @Test + public void shouldCloneTinkergraph() { + final TinkerGraph original = TinkerGraph.open(); + final TinkerGraph clone = TinkerGraph.open(); + + final Vertex marko = original.addVertex("name", "marko", "age", 29); + final Vertex stephen = original.addVertex("name", "stephen", "age", 35); + marko.addEdge("knows", stephen); + GraphHelper.cloneElements(original, clone); + + final Vertex michael = clone.addVertex("name", "michael"); + michael.addEdge("likes", marko); + michael.addEdge("likes", stephen); + clone.traversal().V().property("newProperty", "someValue").toList(); + clone.traversal().E().property("newProperty", "someValue").toList(); + + assertEquals("original graph should be unchanged", new Long(2), original.traversal().V().count().next()); + assertEquals("original graph should be unchanged", new Long(1), original.traversal().E().count().next()); + assertEquals("original graph should be unchanged", new Long(0), original.traversal().V().has("newProperty").count().next()); + + assertEquals("cloned graph should contain new elements", new Long(3), clone.traversal().V().count().next()); + assertEquals("cloned graph should contain new elements", new Long(3), clone.traversal().E().count().next()); + assertEquals("cloned graph should contain new property", new Long(3), clone.traversal().V().has("newProperty").count().next()); + assertEquals("cloned graph should contain new property", new Long(3), clone.traversal().E().has("newProperty").count().next()); + + assertNotSame("cloned elements should reference to different objects", + original.traversal().V().has("name", "stephen").next(), + clone.traversal().V().has("name", "stephen").next()); + } + +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bf5f636/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java index 6501663..5563665 100644 --- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java +++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java @@ -30,13 +30,9 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.io.Io; import org.apache.tinkerpop.gremlin.structure.io.IoCore; -import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion; -import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoVersion; -import org.apache.tinkerpop.gremlin.structure.util.Attachable; import org.apache.tinkerpop.gremlin.structure.util.ElementHelper; import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer; import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputerView; import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.strategy.optimization.TinkerGraphCountStrategy; @@ -74,7 +70,7 @@ import java.util.stream.Stream; @Graph.OptIn(Graph.OptIn.SUITE_GROOVY_ENVIRONMENT) @Graph.OptIn(Graph.OptIn.SUITE_GROOVY_ENVIRONMENT_INTEGRATE) @Graph.OptIn(Graph.OptIn.SUITE_GROOVY_ENVIRONMENT_PERFORMANCE) -public final class TinkerGraph implements Graph, Cloneable { +public final class TinkerGraph implements Graph { static { TraversalStrategies.GlobalCache.registerStrategies(TinkerGraph.class, TraversalStrategies.GlobalCache.getStrategies(Graph.class).clone().addStrategies( @@ -382,17 +378,6 @@ public final class TinkerGraph implements Graph, Cloneable { } } - /** - * make a deep clone of the graph/vertices/edges that preserves ids - */ - @Override - public TinkerGraph clone() { - final TinkerGraph cloned = new TinkerGraph(configuration); - vertices().forEachRemaining(v -> DetachedFactory.detach(v, true).attach(Attachable.Method.create(cloned))); - edges().forEachRemaining(e -> DetachedFactory.detach(e, true).attach(Attachable.Method.create(cloned))); - return cloned; - } - public class TinkerGraphFeatures implements Features { private final TinkerGraphGraphFeatures graphFeatures = new TinkerGraphGraphFeatures(); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bf5f636/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 cb4f4d7..a85b0ee 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 @@ -68,7 +68,6 @@ import java.util.function.Consumer; import java.util.function.Supplier; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -594,35 +593,6 @@ public class TinkerGraphTest { } } - @Test - public void shouldClone() { - final TinkerGraph g = TinkerGraph.open(); - - final Vertex marko = g.addVertex("name", "marko", "age", 29); - final Vertex stephen = g.addVertex("name", "stephen", "age", 35); - marko.addEdge("knows", stephen); - - final TinkerGraph g2 = g.clone(); - final Vertex michael = g2.addVertex("name", "michael"); - michael.addEdge("likes", marko); - michael.addEdge("likes", stephen); - g2.traversal().V().property("newProperty", "someValue").toList(); - g2.traversal().E().property("newProperty", "someValue").toList(); - - assertEquals("original graph should be unchanged", new Long(2), g.traversal().V().count().next()); - assertEquals("original graph should be unchanged", new Long(1), g.traversal().E().count().next()); - assertEquals("original graph should be unchanged", new Long(0), g.traversal().V().has("newProperty").count().next()); - - assertEquals("cloned graph should contain new elements", new Long(3), g2.traversal().V().count().next()); - assertEquals("cloned graph should contain new elements", new Long(3), g2.traversal().E().count().next()); - assertEquals("cloned graph should contain new property", new Long(3), g2.traversal().V().has("newProperty").count().next()); - assertEquals("cloned graph should contain new property", new Long(3), g2.traversal().E().has("newProperty").count().next()); - - assertNotSame("cloned elements should reference to different objects", - g.traversal().V().has("name", "stephen").next(), - g2.traversal().V().has("name", "stephen").next()); - } - /** * Coerces a {@code Color} to a {@link TinkerGraph} during serialization. Demonstrates how custom serializers * can be developed that can coerce one value to another during serialization.