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 2016/08/27 00:54:59 UTC

[44/50] [abbrv] tinkerpop git commit: added aggregateTo=bulkset. Added test cases to ensure side_effects are retrieved correctly. Added __hash__ where needed. tests are nearly done.

added aggregateTo=bulkset. Added test cases to ensure side_effects are retrieved correctly. Added __hash__ where needed. tests are nearly done.


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

Branch: refs/heads/master
Commit: a0bd413063af64f5bee0ce24b910fe62b756f2ce
Parents: 8569800
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Aug 26 14:23:08 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Aug 26 14:23:20 2016 -0600

----------------------------------------------------------------------
 .../python/GraphTraversalSourceGenerator.groovy |  3 +-
 .../driver/driver_remote_connection.py          | 19 ++++---
 .../gremlin_python/process/graph_traversal.py   |  3 +-
 .../jython/gremlin_python/structure/graph.py    |  6 +++
 .../driver/test_driver_remote_connection.py     | 54 ++++++++++++++++++++
 .../main/jython/tests/structure/test_graph.py   |  1 +
 6 files changed, 77 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a0bd4130/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy
index 74c6d89..aaaa5b6 100644
--- a/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy
+++ b/gremlin-python/src/main/groovy/org/apache/tinkerpop/gremlin/python/GraphTraversalSourceGenerator.groovy
@@ -55,6 +55,7 @@ specific language governing permissions and limitations
 under the License.
 '''
 """)
+        pythonClass.append("import sys\n")
         pythonClass.append("from .traversal import Traversal\n")
         pythonClass.append("from .traversal import TraversalStrategies\n")
         pythonClass.append("from .traversal import Bytecode\n")
@@ -127,7 +128,7 @@ under the License.
     if isinstance(index, int):
         return self.range(index, index + 1)
     elif isinstance(index, slice):
-        return self.range(index.start, index.stop)
+        return self.range(0 if index.start is None else index.start, sys.maxint if index.stop is None else index.stop)
     else:
         raise TypeError("Index must be int or slice")
   def __getattr__(self, key):

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a0bd4130/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
index 3273ad4..fa61fb5 100644
--- a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
+++ b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py
@@ -131,16 +131,16 @@ class DriverRemoteConnection(RemoteConnection):
             recv_message = yield response.receive()
             if recv_message is None:
                 break
-
+            aggregateTo = recv_message[0]
             # on first message, get the right result data structure
             if None == results:
-                if "list" == recv_message[0]:
+                if "list" == aggregateTo:
                     results = []
-                elif "set" == recv_message[0]:
+                elif "set" == aggregateTo:
                     results = set()
-                elif "map" == recv_message[0]:
+                elif aggregateTo in ["map", "bulkset"]:
                     results = {}
-                elif "none" == recv_message[0]:
+                elif "none" == aggregateTo:
                     results = None
                 else:
                     results = []
@@ -150,8 +150,12 @@ class DriverRemoteConnection(RemoteConnection):
                 results = recv_message[1][0]
             # updating a map is different than a list or a set
             elif isinstance(results, dict):
-                for item in recv_message[1]:
-                    results.update(item)
+                if "map" == aggregateTo:
+                    for item in recv_message[1]:
+                        results.update(item)
+                else:
+                    for item in recv_message[1]:
+                        results[item.object] = item.bulk
             # flat add list to result list
             else:
                 results += recv_message[1]
@@ -160,6 +164,7 @@ class DriverRemoteConnection(RemoteConnection):
     def close(self):
         self._websocket.close()
 
+
 class Response:
     def __init__(self, websocket, username, password):
         self._websocket = websocket

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a0bd4130/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
index b7d6691..a9a1e8f 100644
--- a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
+++ b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
@@ -16,6 +16,7 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 '''
+import sys
 from .traversal import Traversal
 from .traversal import TraversalStrategies
 from .traversal import Bytecode
@@ -90,7 +91,7 @@ class GraphTraversal(Traversal):
     if isinstance(index, int):
         return self.range(index, index + 1)
     elif isinstance(index, slice):
-        return self.range(index.start, index.stop)
+        return self.range(0 if index.start is None else index.start, sys.maxint if index.stop is None else index.stop)
     else:
         raise TypeError("Index must be int or slice")
   def __getattr__(self, key):

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a0bd4130/gremlin-python/src/main/jython/gremlin_python/structure/graph.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/structure/graph.py b/gremlin-python/src/main/jython/gremlin_python/structure/graph.py
index b047893..22403b6 100644
--- a/gremlin-python/src/main/jython/gremlin_python/structure/graph.py
+++ b/gremlin-python/src/main/jython/gremlin_python/structure/graph.py
@@ -43,6 +43,9 @@ class Element(object):
     def __eq__(self, other):
         return isinstance(other, self.__class__) and self.id == other.id
 
+    def __hash__(self):
+        return hash(self.id)
+
 
 class Vertex(Element):
     def __init__(self, id, label="vertex"):
@@ -82,3 +85,6 @@ class Property(object):
 
     def __eq__(self, other):
         return isinstance(other, self.__class__) and self.key == other.key and self.value == other.value
+
+    def __hash__(self):
+        return hash(self.key) + hash(self.value)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a0bd4130/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
index b47eff9..90a4ef6 100644
--- a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
+++ b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
@@ -37,6 +37,8 @@ class TestDriverRemoteConnection(TestCase):
         #
         g = Graph().traversal().withRemote(connection)
         #
+        assert 6L == g.V().count().toList()[0]
+        #
         assert Vertex(1) == g.V(1).next()
         assert 1 == g.V(1).id().next()
         assert Traverser(Vertex(1)) == g.V(1).nextTraverser()
@@ -48,8 +50,60 @@ class TestDriverRemoteConnection(TestCase):
         assert "lop" in results
         assert "ripple" in results
         #
+        assert 10 == g.V().repeat(both()).times(5)[0:10].count().next()
+        assert 1 == g.V().repeat(both()).times(5)[0].count().next()
+        assert 0 == g.V().repeat(both()).times(5)[0:0].count().next()
+        assert 4 == g.V()[2:].count().next()
+        assert 2 == g.V()[:2].count().next()
+        # todo: need a traversal metrics deserializer
+        g.V().out().profile().next()
         connection.close()
 
+    def test_side_effects(self):
+        statics.load_statics(globals())
+        connection = DriverRemoteConnection('ws://localhost:8182', 'g')
+        #
+        g = Graph().traversal().withRemote(connection)
+        ###
+        t = g.V().hasLabel("project").name.iterate()
+        assert 0 == len(t.side_effects.keys())
+        try:
+            m = t.side_effects["m"]
+            raise Exception("Accessing a non-existent key should throw an error")
+        except KeyError:
+            pass
+        ###
+        t = g.V().out("created").groupCount("m").by("name")
+        results = t.toSet()
+        assert 2 == len(results)
+        assert Vertex(3) in results
+        assert Vertex(5) in results
+        assert 1 == len(t.side_effects.keys())
+        assert "m" in t.side_effects.keys()
+        m = t.side_effects["m"]
+        assert isinstance(m, dict)
+        assert 2 == len(m)
+        assert 3 == m["lop"]
+        assert 1 == m["ripple"]
+        assert isinstance(m["lop"], long)
+        assert isinstance(m["ripple"], long)
+        ###
+        t = g.V().out("created").groupCount("m").by("name").name.aggregate("n")
+        results = t.toSet()
+        assert 2 == len(results)
+        assert "lop" in results
+        assert "ripple" in results
+        assert 2 == len(t.side_effects.keys())
+        assert "m" in t.side_effects.keys()
+        assert "n" in t.side_effects.keys()
+        n = t.side_effects.get("n")
+        assert isinstance(n, dict)
+        assert 2 == len(n)
+        assert "lop" in n.keys()
+        assert "ripple" in n.keys()
+        assert 3 == n["lop"]
+        assert 1 == n["ripple"]
+
 
 if __name__ == '__main__':
     test = False

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a0bd4130/gremlin-python/src/main/jython/tests/structure/test_graph.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/tests/structure/test_graph.py b/gremlin-python/src/main/jython/tests/structure/test_graph.py
index 5f62464..6025802 100644
--- a/gremlin-python/src/main/jython/tests/structure/test_graph.py
+++ b/gremlin-python/src/main/jython/tests/structure/test_graph.py
@@ -67,6 +67,7 @@ class TestGraph(TestCase):
                     assert i != j
                 else:
                     assert i == j
+                    assert i.__hash__() == hash(i)
 
 
 if __name__ == '__main__':