wip
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/19e723d9 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/19e723d9 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/19e723d9 Branch: refs/heads/TINKERPOP-1975-x Commit: 19e723d9491bb8993d1add193b749f1cd1811b43 Parents: c1cf410 Author: Stephen Mallette <[email protected]> Authored: Thu May 31 15:22:26 2018 -0400 Committer: Stephen Mallette <[email protected]> Committed: Thu May 31 15:22:26 2018 -0400 ---------------------------------------------------------------------- .../step/map/PageRankVertexProgramStep.java | 2 +- .../step/map/PeerPressureVertexProgramStep.java | 74 ++++++++++++++++++-- .../traversal/step/map/PeerPressureTest.java | 31 +++++++- 3 files changed, 99 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/19e723d9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java index 5c96a1e..1c5b364 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java @@ -76,7 +76,7 @@ public final class PageRankVertexProgramStep extends VertexProgramStep this.pageRankProperty = (String) keyValues[1]; } else if (keyValues[0].equals(PageRank.TIMES)) { if (!(keyValues[1] instanceof Integer)) - throw new IllegalArgumentException("PageRank.TIMES requires a String as its argument"); + throw new IllegalArgumentException("PageRank.TIMES requires an Integer as its argument"); this.times = (int) keyValues[1]; }else { this.parameters.set(this, keyValues); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/19e723d9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java index 47d4160..be65f42 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PeerPressureVertexProgramStep.java @@ -25,10 +25,13 @@ import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.Pee import org.apache.tinkerpop.gremlin.process.computer.traversal.lambda.HaltedTraversersCountTraversal; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating; +import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring; import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal; import org.apache.tinkerpop.gremlin.structure.Edge; @@ -42,16 +45,44 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) + * @author Stephen Mallette (http://stephen.genoprime.com) */ -public final class PeerPressureVertexProgramStep extends VertexProgramStep implements TraversalParent, ByModulating, TimesModulating { +public final class PeerPressureVertexProgramStep extends VertexProgramStep + implements TraversalParent, ByModulating, TimesModulating, Configuring { + private Parameters parameters = new Parameters(); private PureTraversal<Vertex, Edge> edgeTraversal; private String clusterProperty = PeerPressureVertexProgram.CLUSTER; private int times = 30; public PeerPressureVertexProgramStep(final Traversal.Admin traversal) { super(traversal); - this.modulateBy(__.<Vertex>outE().asAdmin()); + this.configure(PeerPressure.EDGES, __.<Vertex>outE().asAdmin()); + } + + @Override + public void configure(final Object... keyValues) { + if (keyValues[0].equals(PeerPressureVertexProgramStep.PeerPressure.EDGES)) { + if (!(keyValues[1] instanceof Traversal)) + throw new IllegalArgumentException("PeerPressure.EDGES requires a Traversal as its argument"); + this.edgeTraversal = new PureTraversal<>(((Traversal<Vertex,Edge>) keyValues[1]).asAdmin()); + this.integrateChild(this.edgeTraversal.get()); + } else if (keyValues[0].equals(PeerPressureVertexProgramStep.PeerPressure.PROPERTY_NAME)) { + if (!(keyValues[1] instanceof String)) + throw new IllegalArgumentException("PeerPressure.PROPERTY_NAME requires a String as its argument"); + this.clusterProperty = (String) keyValues[1]; + } else if (keyValues[0].equals(PeerPressureVertexProgramStep.PeerPressure.TIMES)) { + if (!(keyValues[1] instanceof Integer)) + throw new IllegalArgumentException("PeerPressure.TIMES requires an Integer as its argument"); + this.times = (int) keyValues[1]; + }else { + this.parameters.set(this, keyValues); + } + } + + @Override + public Parameters getParameters() { + return parameters; } @Override @@ -59,20 +90,31 @@ public final class PeerPressureVertexProgramStep extends VertexProgramStep imple return super.hashCode() ^ this.edgeTraversal.hashCode() ^ this.clusterProperty.hashCode() ^ this.times; } + /** + * @deprecated As of release 3.4.0, replaced by {@link #configure(Object...)} + */ + @Deprecated @Override public void modulateBy(final Traversal.Admin<?, ?> edgeTraversal) { - this.edgeTraversal = new PureTraversal<>((Traversal.Admin<Vertex, Edge>) edgeTraversal); - this.integrateChild(this.edgeTraversal.get()); + configure(PeerPressure.EDGES, edgeTraversal); } + /** + * @deprecated As of release 3.4.0, replaced by {@link #configure(Object...)} + */ + @Deprecated @Override public void modulateBy(final String clusterProperty) { - this.clusterProperty = clusterProperty; + configure(PeerPressure.PROPERTY_NAME, clusterProperty); } + /** + * @deprecated As of release 3.4.0, replaced by {@link #configure(Object...)} + */ + @Deprecated @Override public void modulateTimes(int times) { - this.times = times; + configure(PeerPressure.TIMES, times); } @Override @@ -115,4 +157,24 @@ public final class PeerPressureVertexProgramStep extends VertexProgramStep imple super.setTraversal(parentTraversal); this.integrateChild(this.edgeTraversal.get()); } + + /** + * Configuration options to be passed to the {@link GraphTraversal#with(String, Object)} step. + */ + public static class PeerPressure { + /** + * Configures number of iterations that the algorithm should run. + */ + public static final String TIMES = Graph.Hidden.hide("tinkerpop.peerPressure.times"); + + /** + * Configures the edge to traverse when determining clusters. + */ + public static final String EDGES = Graph.Hidden.hide("tinkerpop.peerPressure.edges"); + + /** + * Configures the name of the property within which to store the cluster value. + */ + public static final String PROPERTY_NAME = Graph.Hidden.hide("tinkerpop.peerPressure.propertyName"); + } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/19e723d9/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java index f9615d5..c76941b 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PeerPressureTest.java @@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.TestHelper; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.PeerPressureVertexProgram; +import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PeerPressureVertexProgramStep.PeerPressure; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -50,6 +51,8 @@ public abstract class PeerPressureTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_byXoutEX_byXclusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX(); + public abstract Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX(); + @Test @LoadGraphWith(MODERN) public void g_V_peerPressure() { @@ -100,7 +103,28 @@ public abstract class PeerPressureTest extends AbstractGremlinProcessTest { assertTrue(ids.contains(convertToVertexId("peter"))); } - + @Test + @LoadGraphWith(MODERN) + public void g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX() { + TestHelper.assumeNonDeterministic(); + final Traversal<Vertex, Map<String, List<Object>>> traversal = get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX(); + printTraversalForm(traversal); + final List<Map<String, List<Object>>> results = traversal.toList(); + assertEquals(6, results.size()); + final Map<String, Object> clusters = new HashMap<>(); + results.forEach(m -> clusters.put((String) m.get("name").get(0), m.get("cluster").get(0))); + assertEquals(2, results.get(0).size()); + assertEquals(6, clusters.size()); + assertEquals(clusters.get("josh"), clusters.get("ripple")); + assertEquals(clusters.get("josh"), clusters.get("lop")); + final Set<Object> ids = new HashSet<>(clusters.values()); + assertEquals(4, ids.size()); + assertTrue(ids.contains(convertToVertexId("marko"))); + assertTrue(ids.contains(convertToVertexId("vadas"))); + assertTrue(ids.contains(convertToVertexId("josh"))); + assertTrue(ids.contains(convertToVertexId("peter"))); + } + public static class Traversals extends PeerPressureTest { @Override @@ -117,5 +141,10 @@ public abstract class PeerPressureTest extends AbstractGremlinProcessTest { public Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_byXoutEX_byXclusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX() { return g.V().has("name", "ripple").in("created").peerPressure().by(__.outE()).by("cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster"); } + + @Override + public Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXEDGES_outEX_withXPROPERTY_NAME_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX() { + return g.V().has("name", "ripple").in("created").peerPressure().with(PeerPressure.EDGES,__.outE()).with(PeerPressure.PROPERTY_NAME, "cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster"); + } } } \ No newline at end of file
