You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/03/03 11:49:06 UTC
[1/4] tinkerpop git commit: Added some more benchmarks to cover more
mutation use cases [Forced Update!]
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1642 e79d46b85 -> 1f5113dc7 (forced update)
Added some more benchmarks to cover more mutation use cases
The key addition was for chained mutation traversals which seems to be a pattern that is developing in the community. CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/09349322
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/09349322
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/09349322
Branch: refs/heads/TINKERPOP-1642
Commit: 09349322ebe75ad3b965a78f77470591ec137937
Parents: 13bcdb4
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 2 13:33:40 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 2 13:33:40 2017 -0500
----------------------------------------------------------------------
.../gremlin/process/GraphMutateBenchmark.java | 48 ++++++++++++++++++++
1 file changed, 48 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/09349322/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
----------------------------------------------------------------------
diff --git a/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java b/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
index 04d7138..d446d6f 100644
--- a/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
+++ b/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process;
import org.apache.tinkerpop.benchmark.util.AbstractGraphMutateBenchmark;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -32,6 +33,7 @@ import org.openjdk.jmh.annotations.Setup;
* {@link org.apache.tinkerpop.gremlin.structure.Graph} mutation methods.
*
* @author Ted Wilmes (http://twilmes.org)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class GraphMutateBenchmark extends AbstractGraphMutateBenchmark {
@@ -56,6 +58,19 @@ public class GraphMutateBenchmark extends AbstractGraphMutateBenchmark {
}
@Benchmark
+ public Vertex testAddVertexWithProps() {
+ final Vertex v = graph.addVertex("test");
+ for (int iy = 0; iy < 32; iy++) {
+ if (iy % 2 == 0)
+ v.property("x" + String.valueOf(iy), iy);
+ else
+ v.property("x" + String.valueOf(iy), String.valueOf(iy));
+ }
+
+ return v;
+ }
+
+ @Benchmark
public VertexProperty testVertexProperty() {
return a.property("name", "Susan");
}
@@ -76,11 +91,44 @@ public class GraphMutateBenchmark extends AbstractGraphMutateBenchmark {
}
@Benchmark
+ public Vertex testAddVWithProps() {
+ GraphTraversal<Vertex, Vertex> t = g.addV("test");
+ for (int iy = 0; iy < 32; iy++) {
+ if (iy % 2 == 0)
+ t = t.property("x" + String.valueOf(iy), iy);
+ else
+ t = t.property("x" + String.valueOf(iy), String.valueOf(iy));
+ }
+ return t.next();
+ }
+
+ @Benchmark
public Vertex testVertexPropertyStep() {
return g.V(a).property("name", "Susan").next();
}
@Benchmark
+ public Vertex testAddVWithPropsChained() {
+ // construct a traversal that adds 100 vertices with 32 properties each
+ GraphTraversal<Vertex, Vertex> t = null;
+ for (int ix = 0; ix < 100; ix++) {
+ if (null == t)
+ t = g.addV("person");
+ else
+ t = t.addV("person");
+
+ for (int iy = 0; iy < 32; iy++) {
+ if (iy % 2 == 0)
+ t = t.property("x" + String.valueOf(iy), iy * ix);
+ else
+ t = t.property("x" + String.valueOf(iy), String.valueOf(iy + ix));
+ }
+ }
+
+ return t.next();
+ }
+
+ @Benchmark
public Edge testAddE() {
return g.V(a).as("a").V(b).as("b").addE("knows").from("a").to("b").next();
}
[3/4] tinkerpop git commit: TINKERPOP-1642 Improved performance of
addV() and chained mutating statements
Posted by sp...@apache.org.
TINKERPOP-1642 Improved performance of addV() and chained mutating statements
Added more tests for Parameters. Performance improved by about 2.5x given the benchmarks. Also long chained mutating traversals are now inserting roughly on par with single insert traversals (prior to this change they were about 25% slower).
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/34959899
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/34959899
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/34959899
Branch: refs/heads/TINKERPOP-1642
Commit: 349598991cebd15f478fb93ccc098bb60823a44a
Parents: 07ab120
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 2 10:44:58 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 2 14:35:56 2017 -0500
----------------------------------------------------------------------
.../traversal/dsl/graph/GraphTraversal.java | 9 +-
.../process/traversal/step/util/Parameters.java | 33 ++++-
.../traversal/step/util/ParametersTest.java | 119 ++++++++++++++++++-
3 files changed, 146 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/34959899/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 8070538..c89c7be 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -1010,7 +1010,6 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
for (int i = 0; i < propertyKeyValues.length; i = i + 2) {
this.property(propertyKeyValues[i], propertyKeyValues[i + 1]);
}
- //((AddVertexStep) this.asAdmin().getEndStep()).addPropertyMutations(propertyKeyValues);
return (GraphTraversal<S, Vertex>) this;
}
@@ -2058,11 +2057,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
this.asAdmin().getBytecode().addStep(Symbols.property, key, value, keyValues);
else
this.asAdmin().getBytecode().addStep(Symbols.property, cardinality, key, value, keyValues);
+
// if it can be detected that this call to property() is related to an addV/E() then we can attempt to fold
// the properties into that step to gain an optimization for those graphs that support such capabilities.
- if ((this.asAdmin().getEndStep() instanceof AddVertexStep || this.asAdmin().getEndStep() instanceof AddEdgeStep
- || this.asAdmin().getEndStep() instanceof AddVertexStartStep) && keyValues.length == 0 && null == cardinality) {
- ((Mutating) this.asAdmin().getEndStep()).addPropertyMutations(key, value);
+ final Step endStep = this.asAdmin().getEndStep();
+ if ((endStep instanceof AddVertexStep || endStep instanceof AddEdgeStep || endStep instanceof AddVertexStartStep) &&
+ keyValues.length == 0 && null == cardinality) {
+ ((Mutating) endStep).addPropertyMutations(key, value);
} else {
this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), cardinality, key, value));
((AddPropertyStep) this.asAdmin().getEndStep()).addPropertyMutations(keyValues);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/34959899/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
index 3584c87..67cb2f9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
@@ -49,6 +49,11 @@ public final class Parameters implements Cloneable, Serializable {
private Map<Object, List<Object>> parameters = new HashMap<>();
/**
+ * Determines if there are traversals present in the parameters {@code Map}.
+ */
+ private boolean traversalsPresent = false;
+
+ /**
* Checks for existence of key in parameter set.
*
* @param key the key to check
@@ -138,6 +143,11 @@ public final class Parameters implements Cloneable, Serializable {
Parameters.legalPropertyKeyValueArray(keyValues);
for (int i = 0; i < keyValues.length; i = i + 2) {
if (keyValues[i + 1] != null) {
+ // track whether or not traversals are present so that elsewhere in Parameters there is no need
+ // to iterate all values to not find any.
+ if (!traversalsPresent && keyValues[i + 1] instanceof Traversal.Admin)
+ traversalsPresent = true;
+
List<Object> values = this.parameters.get(keyValues[i]);
if (null == values) {
values = new ArrayList<>();
@@ -150,18 +160,31 @@ public final class Parameters implements Cloneable, Serializable {
}
}
+ /**
+ * Calls {@link TraversalParent#integrateChild(Traversal.Admin)} on any traversal objects in the parameter list.
+ * This method requires that {@link #set(Object...)} is called prior to this method as the it will switch the
+ * {@code traversalsPresent} flag field if a {@link Traversal.Admin} object is present and allow this method to
+ * do its work.
+ */
public void integrateTraversals(final TraversalParent step) {
- for (final List<Object> values : this.parameters.values()) {
- for (final Object object : values) {
- if (object instanceof Traversal.Admin) {
- step.integrateChild((Traversal.Admin) object);
+ if (traversalsPresent) {
+ for (final List<Object> values : this.parameters.values()) {
+ for (final Object object : values) {
+ if (object instanceof Traversal.Admin) {
+ step.integrateChild((Traversal.Admin) object);
+ }
}
}
}
}
+ /**
+ * Gets all the {@link Traversal.Admin} objects in the map of parameters.
+ */
public <S, E> List<Traversal.Admin<S, E>> getTraversals() {
- List<Traversal.Admin<S, E>> result = new ArrayList<>();
+ if (!traversalsPresent) return Collections.emptyList();
+
+ final List<Traversal.Admin<S, E>> result = new ArrayList<>();
for (final List<Object> list : this.parameters.values()) {
for (final Object object : list) {
if (object instanceof Traversal.Admin) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/34959899/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
index 7490dea..27b9293 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
@@ -18,8 +18,12 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.util;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.junit.Test;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -28,12 +32,66 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class ParametersTest {
@Test
+ public void shouldGetKeyValuesEmpty() {
+ final Parameters parameters = new Parameters();
+ assertThat(Arrays.equals(parameters.getKeyValues(mock(Traverser.Admin.class)), new Object[0]), is(true));
+ }
+
+ @Test
+ public void shouldGetKeyValues() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "b", "bat", "c", "cat");
+
+ final Object[] params = parameters.getKeyValues(mock(Traverser.Admin.class));
+ assertEquals(6, params.length);
+ assertThat(Arrays.equals(new Object[] {"a", "axe", "b", "bat", "c", "cat"}, params), is(true));
+ }
+
+ @Test
+ public void shouldGetKeyValuesIgnoringSomeKeys() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "b", "bat", "c", "cat");
+
+ final Object[] params = parameters.getKeyValues(mock(Traverser.Admin.class), "b");
+ assertEquals(4, params.length);
+ assertThat(Arrays.equals(new Object[] {"a", "axe", "c", "cat"}, params), is(true));
+ }
+
+ @Test
+ public void shouldGetUsingTraverserOverload() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "b", "bat", "c", "cat");
+
+ assertEquals(Collections.singletonList("axe"), parameters.get(mock(Traverser.Admin.class), "a", () -> "x"));
+ assertEquals(Collections.singletonList("bat"), parameters.get(mock(Traverser.Admin.class), "b", () -> "x"));
+ assertEquals(Collections.singletonList("cat"), parameters.get(mock(Traverser.Admin.class), "c", () -> "x"));
+ assertEquals(Collections.singletonList("zebra"), parameters.get(mock(Traverser.Admin.class), "z", () -> "zebra"));
+ }
+
+ @Test
+ public void shouldGetMultipleUsingTraverserOverload() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat");
+
+ final Map<Object,List<Object>> params = parameters.getRaw();
+ assertEquals(3, params.size());
+ assertEquals(Arrays.asList("axe", "ant"), parameters.get(mock(Traverser.Admin.class), "a", () -> "x"));
+ assertEquals(Arrays.asList("bat", "ball"), parameters.get(mock(Traverser.Admin.class), "b", () -> "x"));
+ assertEquals(Collections.singletonList("cat"), parameters.get(mock(Traverser.Admin.class), "c", () -> "x"));
+ assertEquals(Collections.singletonList("zebra"), parameters.get(mock(Traverser.Admin.class), "z", () -> "zebra"));
+ }
+
+ @Test
public void shouldGetRaw() {
final Parameters parameters = new Parameters();
parameters.set("a", "axe", "b", "bat", "c", "cat");
@@ -143,11 +201,60 @@ public class ParametersTest {
final Parameters parameters = new Parameters();
parameters.set("a", "axe", "b", "bat", "c", "cat");
- final Map<Object,List<Object>> params = parameters.getRaw();
- assertEquals(3, params.size());
- assertEquals("axe", params.get("a").get(0));
- assertEquals("bat", params.get("b").get(0));
- assertEquals("cat", params.get("c").get(0));
- assertEquals("zebra", parameters.get("z", () -> "zebra").get(0));
+ assertEquals(Collections.singletonList("axe"), parameters.get("a", () -> "x"));
+ assertEquals(Collections.singletonList("bat"), parameters.get("b", () -> "x"));
+ assertEquals(Collections.singletonList("cat"), parameters.get("c", () -> "x"));
+ assertEquals(Collections.singletonList("zebra"), parameters.get("z", () -> "zebra"));
+ }
+
+ @Test
+ public void shouldClone() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat");
+
+ final Parameters parametersClone = parameters.clone();
+
+ assertEquals(parameters.getRaw(), parametersClone.getRaw());
+ }
+
+ @Test
+ public void shouldBeDifferent() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat");
+
+ final Parameters parametersDifferent = new Parameters();
+ parametersDifferent.set("a", "ant", "a", "axe", "b", "bat", "b", "ball", "c", "cat");
+
+ assertNotEquals(parameters.getRaw(), parametersDifferent.getRaw());
+ }
+
+ @Test
+ public void shouldGetNoTraversals() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat");
+ assertEquals(Collections.emptyList(), parameters.getTraversals());
+ }
+
+ @Test
+ public void shouldGetTraversals() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat", "t", __.outE("knows"));
+ assertEquals(Collections.singletonList(__.outE("knows")), parameters.getTraversals());
+ }
+
+ @Test
+ public void shouldIntegrateTraversals() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat", "t", __.outE("knows"));
+
+ final TraversalParent mock = mock(TraversalParent.class);
+
+ // the mock can return nothing of consequence as the return isn't used in this case. we just need to
+ // validate that the method gets called as a result of calls to set/integrateTraversals()
+ when(mock.integrateChild(__.outE("knows").asAdmin())).thenReturn(null);
+
+ parameters.integrateTraversals(mock);
+
+ verify(mock).integrateChild(__.outE("knows").asAdmin());
}
}
[4/4] tinkerpop git commit: TINKERPOP-1642 Cached the Traversal list
in Parameters
Posted by sp...@apache.org.
TINKERPOP-1642 Cached the Traversal list in Parameters
This leads to a pretty good boost in performance from the prior commit especially for long chained mutating traversals that add vertices and edges as there is a 3X improvement in those cases.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/1f5113dc
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/1f5113dc
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/1f5113dc
Branch: refs/heads/TINKERPOP-1642
Commit: 1f5113dc77de520a4c7e5640266ff3b17bbaaf8b
Parents: 3495989
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Mar 3 06:47:56 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Fri Mar 3 06:47:56 2017 -0500
----------------------------------------------------------------------
.../process/traversal/step/util/Parameters.java | 59 ++++++++++++--------
.../traversal/step/util/ParametersTest.java | 50 +++++++++++++++++
2 files changed, 87 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1f5113dc/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
index 67cb2f9..3f0cb7c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.io.Serializable;
import java.util.ArrayList;
@@ -49,9 +50,11 @@ public final class Parameters implements Cloneable, Serializable {
private Map<Object, List<Object>> parameters = new HashMap<>();
/**
- * Determines if there are traversals present in the parameters {@code Map}.
+ * A cached list of traversals that server as parameter values. The list is cached on calls to
+ * {@link #set(Object...)} because when the parameter map is large the cost of iterating it repeatedly on the
+ * high number of calls to {@link #getTraversals()} and {@link #integrateTraversals(TraversalParent)} is great.
*/
- private boolean traversalsPresent = false;
+ private List<Traversal.Admin> traversals = new ArrayList<>();
/**
* Checks for existence of key in parameter set.
@@ -73,6 +76,10 @@ public final class Parameters implements Cloneable, Serializable {
this.parameters.put(newKey, this.parameters.remove(oldKey));
}
+ /**
+ * Gets the list of values for a key, while resolving the values of any parameters that are {@link Traversal}
+ * objects.
+ */
public <S, E> List<E> get(final Traverser.Admin<S> traverser, final Object key, final Supplier<E> defaultValue) {
final List<E> values = (List<E>) this.parameters.get(key);
if (null == values) return Collections.singletonList(defaultValue.get());
@@ -102,9 +109,28 @@ public final class Parameters implements Cloneable, Serializable {
* @return the value of the removed key
*/
public Object remove(final Object key) {
- return parameters.remove(key);
+ final List<Object> o = parameters.remove(key);
+
+ // once a key is removed, it's possible that the traversal cache will need to be regenerated
+ if (IteratorUtils.anyMatch(o.iterator(), p -> p instanceof Traversal.Admin)) {
+ traversals.clear();
+ traversals = new ArrayList<>();
+ for (final List<Object> list : this.parameters.values()) {
+ for (final Object object : list) {
+ if (object instanceof Traversal.Admin) {
+ traversals.add((Traversal.Admin) object);
+ }
+ }
+ }
+ }
+
+ return o;
}
+ /**
+ * Gets the array of keys/values of the parameters while resolving parameter values that contain
+ * {@link Traversal} instances
+ */
public <S> Object[] getKeyValues(final Traverser.Admin<S> traverser, final Object... exceptKeys) {
if (this.parameters.size() == 0) return EMPTY_ARRAY;
final List<Object> keyValues = new ArrayList<>();
@@ -143,10 +169,10 @@ public final class Parameters implements Cloneable, Serializable {
Parameters.legalPropertyKeyValueArray(keyValues);
for (int i = 0; i < keyValues.length; i = i + 2) {
if (keyValues[i + 1] != null) {
- // track whether or not traversals are present so that elsewhere in Parameters there is no need
+ // track the list of traversals that are present so that elsewhere in Parameters there is no need
// to iterate all values to not find any.
- if (!traversalsPresent && keyValues[i + 1] instanceof Traversal.Admin)
- traversalsPresent = true;
+ if (keyValues[i + 1] instanceof Traversal.Admin)
+ traversals.add((Traversal.Admin) keyValues[i + 1]);
List<Object> values = this.parameters.get(keyValues[i]);
if (null == values) {
@@ -167,14 +193,8 @@ public final class Parameters implements Cloneable, Serializable {
* do its work.
*/
public void integrateTraversals(final TraversalParent step) {
- if (traversalsPresent) {
- for (final List<Object> values : this.parameters.values()) {
- for (final Object object : values) {
- if (object instanceof Traversal.Admin) {
- step.integrateChild((Traversal.Admin) object);
- }
- }
- }
+ for (Traversal.Admin t : traversals) {
+ step.integrateChild(t);
}
}
@@ -182,15 +202,10 @@ public final class Parameters implements Cloneable, Serializable {
* Gets all the {@link Traversal.Admin} objects in the map of parameters.
*/
public <S, E> List<Traversal.Admin<S, E>> getTraversals() {
- if (!traversalsPresent) return Collections.emptyList();
-
+ // stupid generics - just need to return "traversals"
final List<Traversal.Admin<S, E>> result = new ArrayList<>();
- for (final List<Object> list : this.parameters.values()) {
- for (final Object object : list) {
- if (object instanceof Traversal.Admin) {
- result.add((Traversal.Admin) object);
- }
- }
+ for (Traversal.Admin t : traversals) {
+ result.add(t);
}
return result;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1f5113dc/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
index 27b9293..9c96c1c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.util;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
@@ -31,6 +32,7 @@ import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.Mockito.mock;
@@ -153,6 +155,39 @@ public class ParametersTest {
}
@Test
+ public void shouldRemoveRefreshTraversalCache() {
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "b", "bat", "c", "cat", "c", mock(Traversal.Admin.class), "t", mock(Traversal.Admin.class));
+
+ final Map<Object,List<Object>> before = parameters.getRaw();
+ assertEquals(4, before.size());
+ assertEquals(2, parameters.getTraversals().size());
+ assertEquals("axe", before.get("a").get(0));
+ assertEquals("bat", before.get("b").get(0));
+ assertEquals("cat", before.get("c").get(0));
+ assertThat(before.get("c").get(1), instanceOf(Traversal.Admin.class));
+ assertThat(before.get("t").get(0), instanceOf(Traversal.Admin.class));
+
+ parameters.remove("t");
+
+ final Map<Object,List<Object>> afterRemoveT = parameters.getRaw();
+ assertEquals(3, afterRemoveT.size());
+ assertEquals(1, parameters.getTraversals().size());
+ assertEquals("axe", afterRemoveT.get("a").get(0));
+ assertEquals("bat", afterRemoveT.get("b").get(0));
+ assertEquals("cat", afterRemoveT.get("c").get(0));
+ assertThat(afterRemoveT.get("c").get(1), instanceOf(Traversal.Admin.class));
+
+ parameters.remove("c");
+
+ final Map<Object,List<Object>> afterRemoveC = parameters.getRaw();
+ assertEquals(2, afterRemoveC.size());
+ assertEquals(0, parameters.getTraversals().size());
+ assertEquals("axe", afterRemoveC.get("a").get(0));
+ assertEquals("bat", afterRemoveC.get("b").get(0));
+ }
+
+ @Test
public void shouldRename() {
final Parameters parameters = new Parameters();
parameters.set("a", "axe", "b", "bat", "c", "cat");
@@ -215,6 +250,21 @@ public class ParametersTest {
final Parameters parametersClone = parameters.clone();
assertEquals(parameters.getRaw(), parametersClone.getRaw());
+ assertEquals(parameters.getTraversals(), parametersClone.getTraversals());
+ }
+
+ @Test
+ public void shouldCloneWithTraversals() {
+ final Traversal.Admin t = mock(Traversal.Admin.class);
+ when(t.clone()).thenReturn(t);
+
+ final Parameters parameters = new Parameters();
+ parameters.set("a", "axe", "a", "ant", "b", "bat", "b", "ball", "c", "cat", "t", t);
+
+ final Parameters parametersClone = parameters.clone();
+
+ assertEquals(parameters.getRaw(), parametersClone.getRaw());
+ assertEquals(parameters.getTraversals().size(), parametersClone.getTraversals().size());
}
@Test
[2/4] tinkerpop git commit: Added another benchmark for adding a
whole graph with process API CTR
Posted by sp...@apache.org.
Added another benchmark for adding a whole graph with process API CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/07ab1209
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/07ab1209
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/07ab1209
Branch: refs/heads/TINKERPOP-1642
Commit: 07ab1209d08cc9325b3b01c9633700a80b54afec
Parents: 0934932
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 2 14:33:45 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 2 14:33:45 2017 -0500
----------------------------------------------------------------------
.../gremlin/process/GraphMutateBenchmark.java | 44 ++++++++++++++++++++
1 file changed, 44 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/07ab1209/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
----------------------------------------------------------------------
diff --git a/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java b/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
index d446d6f..55ab14a 100644
--- a/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
+++ b/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/process/GraphMutateBenchmark.java
@@ -28,6 +28,8 @@ import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Setup;
+import java.util.Random;
+
/**
* {@code GraphMutateBenchmark} benchmarks {@link org.apache.tinkerpop.gremlin.process.traversal.Traversal} and
* {@link org.apache.tinkerpop.gremlin.structure.Graph} mutation methods.
@@ -129,6 +131,48 @@ public class GraphMutateBenchmark extends AbstractGraphMutateBenchmark {
}
@Benchmark
+ public Edge testAddVAddEWithPropsChained() {
+ // construct a traversal that adds 100 vertices with 32 properties each as well as 300 edges with 8
+ // properties each
+ final Random rand = new Random(584545454L);
+
+ GraphTraversal<Vertex, ?> t = null;
+ for (int ix = 0; ix < 10; ix++) {
+ if (null == t)
+ t = g.addV("person");
+ else
+ t = t.addV("person");
+
+ for (int iy = 0; iy < 32; iy++) {
+ if (iy % 2 == 0)
+ t = t.property("x" + String.valueOf(iy), iy * ix);
+ else
+ t = t.property("x" + String.valueOf(iy), String.valueOf(iy + ix));
+ }
+
+ t = t.as("person" + ix);
+
+ if (ix > 0) {
+ int edgeCount = ix == 9 ? 6 : 3;
+ for (int ie = 0; ie < edgeCount; ie++) {
+ t = t.addE("knows").from("person" + ix).to("person" + rand.nextInt(ix));
+
+ for (int iy = 0; iy < 8; iy++) {
+ if (iy % 2 == 0)
+ t = t.property("x" + String.valueOf(iy), iy * ie);
+ else
+ t = t.property("x" + String.valueOf(iy), String.valueOf(iy + ie));
+ }
+ }
+ }
+ }
+
+ final Edge e = (Edge) t.next();
+ System.out.println("****************" + graph);
+ return e;
+ }
+
+ @Benchmark
public Edge testAddE() {
return g.V(a).as("a").V(b).as("b").addE("knows").from("a").to("b").next();
}