[ 
https://issues.apache.org/jira/browse/TINKERPOP-2071?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16667562#comment-16667562
 ] 

ASF GitHub Bot commented on TINKERPOP-2071:
-------------------------------------------

spmallette closed pull request #964: TINKERPOP-2071: gremlin-python: g:Set 
graphson deserializer should return a python set
URL: https://github.com/apache/tinkerpop/pull/964
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 9a47f3c9c9..184c1d9454 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -23,6 +23,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 [[release-3-3-5]]
 === TinkerPop 3.3.5 (Release Date: NOT OFFICIALLY RELEASED YET)
 
+* gremlin-python: the graphson deserializer for g:Set should return a python 
set
 
 [[release-3-3-4]]
 === TinkerPop 3.3.4 (Release Date: October 15, 2018)
diff --git a/docs/src/reference/gremlin-variants.asciidoc 
b/docs/src/reference/gremlin-variants.asciidoc
index 074c436f41..4bc2f36646 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -307,9 +307,10 @@ g.V().out().map(lambda: "x: 
len(x.get().value('name'))").sum().toList()
 
 === Limitations
 
-* Traversals that return a `Set` will be coerced to a `List` in Python so that 
traversals return consistent results
-within a collection across different languages. In the case of Python, number 
equality is different from JVM languages
-which produces different `Set` results when those types are in use. If a `Set` 
is needed then convert `List` results
+* Traversals that return a `Set` *might* be coerced to a `List` in Python. In 
the case of Python, number equality 
+is different from JVM languages which produces different `Set` results when 
those types are in use. When this case
+is detected during deserialization, the `Set` is coerced to a `List` so that 
traversals return consistent
+results within a collection across different languages. If a `Set` is needed 
then convert `List` results
 to `Set` manually.
 
 [[gremlin-DotNet]]
diff --git 
a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV3d0.py 
b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV3d0.py
index a04142180d..65e01afe96 100644
--- a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV3d0.py
+++ b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV3d0.py
@@ -22,6 +22,7 @@
 import uuid
 import math
 from collections import OrderedDict
+import logging
 
 import six
 from aenum import Enum
@@ -31,6 +32,8 @@
 from gremlin_python.process.traversal import Binding, Bytecode, P, Traversal, 
Traverser, TraversalStrategy, T
 from gremlin_python.structure.graph import Edge, Property, Vertex, 
VertexProperty, Path
 
+log = logging.getLogger(__name__)
+
 # When we fall back to a superclass's serializer, we iterate over this map.
 # We want that iteration order to be consistent, so we use an OrderedDict,
 # not a dict.
@@ -429,11 +432,20 @@ def dictify(cls, s, writer):
 
     @classmethod
     def objectify(cls, s, reader):
-        # coerce to list here because Java might return numerics of different 
types which python won't recognize
-        # see comments of TINKERPOP-1844 for more details
-        new_set = []
-        for obj in s:
-            new_set.append(reader.toObject(obj))
+        """
+        By default, returns a python set
+
+        In case Java returns numeric values of different types which
+        python don't recognize, coerce and return a list.
+        See comments of TINKERPOP-1844 for more details
+        """
+        new_list = [reader.toObject(obj) for obj in s]
+        new_set = set(new_list)
+        if len(new_list) != len(new_set):
+            log.warning("Coercing g:Set to list due to java numeric values. "
+                        "See TINKERPOP-1844 for more details.")
+            return new_list
+
         return new_set
 
 
diff --git 
a/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py 
b/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py
index 4aa4eed001..f1268bd3df 100644
--- a/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py
+++ b/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV3d0.py
@@ -51,11 +51,20 @@ def test_collections(self):
         assert x[1] == 2
         assert x[2] == "3"
         ##
+
         x = self.graphson_reader.readObject(
             json.dumps({"@type": "g:Set", "@value": [{"@type": "g:Int32", 
"@value": 1},
                                                      {"@type": "g:Int32", 
"@value": 2},
-                                                     {"@type": "g:Float", 
"@value": 2.0},
                                                      "3"]}))
+        # return a set as normal
+        assert isinstance(x, set)
+        assert x == set([1, 2, "3"])
+
+        x = self.graphson_reader.readObject(
+            json.dumps({"@type": "g:Set", "@value": [{"@type": "g:Int32", 
"@value": 1},
+                                                    {"@type": "g:Int32", 
"@value": 2},
+                                                    {"@type": "g:Float", 
"@value": 2.0},
+                                                    "3"]}))
         # coerce to list here because Java might return numerics of different 
types which python won't recognize
         # see comments of TINKERPOP-1844 for more details
         assert isinstance(x, list)
diff --git a/gremlin-test/features/map/Select.feature 
b/gremlin-test/features/map/Select.feature
index d4fdd04295..468346453a 100644
--- a/gremlin-test/features/map/Select.feature
+++ b/gremlin-test/features/map/Select.feature
@@ -724,6 +724,6 @@ Feature: Step - select()
     When iterated next
     Then the result should be ordered
       | result |
-      | l[a,b] |
-      | l[c]   |
+      | s[a,b] |
+      | s[c]   |
     And the graph should return 6 for count of "g.V().as(\"a\", 
\"b\").out().as(\"c\").path().select(Column.keys)"


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> gremlin-python: the graphson deserializer for g:Set should return a python set
> ------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-2071
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2071
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: python
>    Affects Versions: 3.3.3
>            Reporter: Alan Boudreault
>            Assignee: stephen mallette
>            Priority: Major
>
> This is something that has already been discussed. The reason that a g:Set is 
> deserialized to a list is because Java can return some numerical values that 
> are not differentiate by python. See TINKERPOP-1844 for more details.
> However, I think this is is not something very common so I would like to 
> propose another behavior:
> 1. By default, always return a python set as normal for g:Set
> 2. When we detect the case described, log a warning and return a python list.
> 3. Document properly the limitation and the behavior of g:Set.
> Already discussed with Stephen and we think it's an acceptable behavior. I 
> will provide a PR shortly.
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to