You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/02/12 19:17:47 UTC

incubator-tinkerpop git commit: added TraversalComparator to compare objects based on a traversal off of them. Added by(traversal, comparator) to GraphTraversal.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master fcc0bf993 -> e4de78947


added TraversalComparator to compare objects based on a traversal off of them. Added by(traversal,comparator) to GraphTraversal.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/e4de7894
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/e4de7894
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/e4de7894

Branch: refs/heads/master
Commit: e4de7894720e743eb2a7ede776787efe0cc34607
Parents: fcc0bf9
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Feb 12 11:17:41 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Feb 12 11:17:41 2015 -0700

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  3 +-
 .../process/graph/traversal/GraphTraversal.java |  6 +++
 .../step/ElementFunctionComparator.java         |  4 +-
 .../traversal/step/ElementValueComparator.java  |  5 +-
 .../traversal/step/TraversalComparator.java     | 57 ++++++++++++++++++++
 .../traversal/step/map/GroovyOrderTest.groovy   | 15 +++++-
 .../graph/traversal/step/map/OrderTest.java     | 31 +++++++++++
 .../tinkergraph/structure/TinkerGraphTest.java  | 20 +++++--
 8 files changed, 129 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 3985d2f..a56dab0 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -9,7 +9,8 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-* Apache refactoring: `com.tinkerpop` -> `org.apache.tinkerpop`
+* `TraversalComparator` exists which allows for `order().by(outE().count(),decr)`.
+* Apache refactoring: `com.tinkerpop` -> `org.apache.tinkerpop`.
 * `Traversal` is now `Serializable` and with 99% of queries no longer needing lambdas, Gremlin-Java works over the wire.
 * Added `VertexProperty.Cardinality` with `list`, `set`, and `single`. No more `Vertex.singleProperty()` method.
 * Added `RangeByIsCountStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
index 1f088b0..83986b6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
@@ -107,6 +107,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTravers
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ElementFunctionComparator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ElementValueComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalComparator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Compare;
@@ -740,6 +741,11 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this;
     }
 
+    public default <V> GraphTraversal<S, E> by(final Traversal<?,?> traversal, final Comparator<V> endComparator) {
+        ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(new TraversalComparator(traversal.asAdmin(), endComparator));
+        return this;
+    }
+
     ////
 
     public default <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
index ca22451..45e0741 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
@@ -27,7 +27,7 @@ import java.util.function.Function;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class ElementFunctionComparator<V> implements Comparator<Element>, Serializable{
+public class ElementFunctionComparator<V> implements Comparator<Element>, Serializable {
 
     private final Function<Element, V> elementFunction;
     private final Comparator<V> valueComparator;
@@ -52,6 +52,6 @@ public class ElementFunctionComparator<V> implements Comparator<Element>, Serial
 
     @Override
     public String toString() {
-        return this.elementFunction + "(" + this.valueComparator + ')';
+        return this.valueComparator.toString() + "(" + this.elementFunction + ')';
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
index 03aa4a2..8929058 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
@@ -20,12 +20,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step;
 
 import org.apache.tinkerpop.gremlin.structure.Element;
 
+import java.io.Serializable;
 import java.util.Comparator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class ElementValueComparator<V> implements Comparator<Element> {
+public class ElementValueComparator<V> implements Comparator<Element>, Serializable {
 
     private final String propertyKey;
     private final Comparator<V> valueComparator;
@@ -50,6 +51,6 @@ public class ElementValueComparator<V> implements Comparator<Element> {
 
     @Override
     public String toString() {
-        return this.propertyKey + '(' + this.valueComparator + ')';
+        return this.valueComparator.toString() + '(' + this.propertyKey + ')';
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
new file mode 100644
index 0000000..829fea8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
@@ -0,0 +1,57 @@
+/*
+ * 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.process.traversal.step;
+
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TraversalComparator<S, E> implements Comparator<S>, Serializable, Cloneable {
+
+    private Traversal.Admin<S, E> traversal;
+    private final Comparator<E> comparator;
+
+    public TraversalComparator(final Traversal.Admin<S, E> traversal, final Comparator<E> comparator) {
+        this.traversal = traversal;
+        this.comparator = comparator;
+    }
+
+    @Override
+    public String toString() {
+        return this.comparator.toString() + "(" + this.traversal + ")";
+    }
+
+    @Override
+    public int compare(final S start1, final S start2) {
+        return this.comparator.compare(TraversalUtil.apply(start1, this.traversal), TraversalUtil.apply(start2, this.traversal));
+    }
+
+    @Override
+    public TraversalComparator clone() throws CloneNotSupportedException {
+        final TraversalComparator clone = (TraversalComparator) super.clone();
+        clone.traversal = this.traversal.clone();
+        return clone;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
index 80c3a7e..8b67d32 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
@@ -18,10 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map
 
+import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
 import org.apache.tinkerpop.gremlin.process.Scope
 import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderTest
+import org.apache.tinkerpop.gremlin.process.graph.traversal.__
 import org.apache.tinkerpop.gremlin.structure.Order
 import org.apache.tinkerpop.gremlin.structure.Vertex
 
@@ -80,6 +80,11 @@ public abstract class GroovyOrderTest {
                 return map;
             }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
         }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            g.V.order.by(__.outE.count, Order.decr)
+        }
     }
 
     public static class ComputerTest extends OrderTest {
@@ -134,5 +139,11 @@ public abstract class GroovyOrderTest {
             """, g)
         }
 
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            g.V.order.by(__.outE.count, Order.decr)
+            // TODO ComputerTestHelper.compute("g.V.order.by(__.outE.count, Order.decr)", g)
+        }
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
index 54a961f..3a55c24 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
@@ -35,8 +35,10 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
 import static org.junit.Assert.*;
 
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -59,9 +61,12 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id);
 
+    public abstract Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_name_order() {
+
         final Traversal<Vertex, String> traversal = get_g_V_name_order();
         printTraversalForm(traversal);
         final List<String> names = traversal.toList();
@@ -196,6 +201,22 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
         assertFalse(traversal.hasNext());
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_order_byXoutE_count__decrX() {
+        Arrays.asList(get_g_V_order_byXoutE_count__decrX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+            assertEquals(vertices.size(), 6);
+            assertEquals("marko", vertices.get(0).value("name"));
+            assertEquals("josh", vertices.get(1).value("name"));
+            assertEquals("peter", vertices.get(2).value("name"));
+            assertTrue(vertices.get(3).value("name").equals("vadas") || vertices.get(3).value("name").equals("ripple") || vertices.get(3).value("name").equals("lop"));
+            assertTrue(vertices.get(4).value("name").equals("vadas") || vertices.get(4).value("name").equals("ripple") || vertices.get(4).value("name").equals("lop"));
+            assertTrue(vertices.get(5).value("name").equals("vadas") || vertices.get(5).value("name").equals("ripple") || vertices.get(5).value("name").equals("lop"));
+        });
+    }
+
     public static class StandardTest extends OrderTest {
 
         @Override
@@ -247,6 +268,11 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
             }).order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
         }
 
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            return g.V().order().by(outE().count(), Order.decr);
+        }
+
     }
 
     public static class ComputerTest extends OrderTest {
@@ -306,5 +332,10 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
                 return map;
             }).order(Scope.local).by(Order.valueDecr).by(Order.keyIncr); // TODO: .submit(g.compute());
         }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            return g.V().order().by(outE().count(), Order.decr); // TODO: .submit(g.compute());  DETACHED VERTICES DO NOT HAVE EDGES
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4de7894/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 e488673..ee60b3b 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
@@ -18,13 +18,19 @@
  */
 package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.process.T;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.RangeByIsCountStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
 import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.*;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Operator;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.io.GraphReader;
 import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLWriter;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
@@ -32,13 +38,17 @@ import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter;
 import org.apache.tinkerpop.gremlin.structure.io.kryo.KryoReader;
 import org.apache.tinkerpop.gremlin.structure.io.kryo.KryoWriter;
 import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.apache.commons.io.FileUtils;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
-import java.io.*;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Supplier;
@@ -138,8 +148,8 @@ public class TinkerGraphTest {
     @Ignore
     public void testPlay3() throws Exception {
         Graph g = TinkerFactory.createModern();
-        Traversal t = g.V().has("name","marko");
-        t.next();
+        Traversal t = g.V().order().by(out().count(),Order.decr).values("name");
+        t.forEachRemaining(System.out::println);
     }
 
     @Test