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

Reply via email to