TINKERPOP-2360 gremlin-python: fix up serializer out of range of int
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 352a660..19be040 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -33,6 +33,7 @@
* Bumped to Jackson 2.9.10.4.
* Remove invalid service descriptors from gremlin-shaded.
* Fixed bug in Python and .NET traversal `clone()` where deep copies of bytecode were not occurring.
+* Fixed bug in Python about integer serializer which out of range of Int32
[[release-3-3-10]]
=== TinkerPop 3.3.10 (Release Date: February 3, 2020)
diff --git a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV2d0.py b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV2d0.py
index 7c6b181..e405a8e 100644
--- a/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV2d0.py
+++ b/gremlin-python/src/main/jython/gremlin_python/structure/io/graphsonV2d0.py
@@ -489,6 +489,18 @@
graphson_type = "g:Int32"
graphson_base_type = "Int32"
+ @classmethod
+ def dictify(cls, n, writer):
+ # if we exceed Java int range then we need a long
+ if isinstance(n, bool):
+ return n
+ elif n < -9223372036854775808 or n > 9223372036854775807:
+ return GraphSONUtil.typedValue("BigInteger", str(n), "gx")
+ elif n < -2147483648 or n > 2147483647:
+ return GraphSONUtil.typedValue("Int64", n)
+ else:
+ return GraphSONUtil.typedValue(cls.graphson_base_type, n)
+
class ByteIO(_NumberIO):
python_type = SingleByte
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 2c54c38..bd5b31e 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
@@ -567,6 +567,17 @@
graphson_type = "g:Int32"
graphson_base_type = "Int32"
+ @classmethod
+ def dictify(cls, n, writer):
+ # if we exceed Java int range then we need a long
+ if isinstance(n, bool):
+ return n
+ elif n < -9223372036854775808 or n > 9223372036854775807:
+ return GraphSONUtil.typedValue("BigInteger", str(n), "gx")
+ elif n < -2147483648 or n > 2147483647:
+ return GraphSONUtil.typedValue("Int64", n)
+ else:
+ return GraphSONUtil.typedValue(cls.graphson_base_type, n)
class ByteIO(_NumberIO):
python_type = SingleByte
diff --git a/gremlin-python/src/main/jython/tests/driver/test_client.py b/gremlin-python/src/main/jython/tests/driver/test_client.py
index aeb10a8..f0ea163 100644
--- a/gremlin-python/src/main/jython/tests/driver/test_client.py
+++ b/gremlin-python/src/main/jython/tests/driver/test_client.py
@@ -129,6 +129,17 @@
assert len(result_set.all().result()) == 6
+def test_client_bytecode_with_int(client):
+ g = Graph().traversal()
+ t = g.V().has('age', 851401972585122).count()
+ message = RequestMessage('traversal', 'bytecode', {'gremlin': t.bytecode, 'aliases': {'g': 'gmodern'}})
+ result_set = client.submit(message)
+ results = []
+ for result in result_set:
+ results += result
+ assert len(results) == 1
+
+
def test_multi_request_in_session(client):
# Overwrite fixture with session client
session_id = str(uuid.uuid4())
diff --git a/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV2d0.py b/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV2d0.py
index cac9aab..e9801af 100644
--- a/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV2d0.py
+++ b/gremlin-python/src/main/jython/tests/structure/io/test_graphsonV2d0.py
@@ -307,6 +307,7 @@
assert {"@type": "gx:Byte", "@value": 1} == json.loads(self.graphson_writer.writeObject(int.__new__(SingleByte, 1)))
assert {"@type": "g:Int64", "@value": 2} == json.loads(self.graphson_writer.writeObject(long(2)))
assert {"@type": "g:Int32", "@value": 1} == json.loads(self.graphson_writer.writeObject(1))
+ assert {"@type": "g:Int64", "@value": 851401972585122} == json.loads(self.graphson_writer.writeObject(851401972585122))
assert {"@type": "g:Double", "@value": 3.2} == json.loads(self.graphson_writer.writeObject(3.2))
assert {"@type": "g:Double", "@value": "NaN"} == json.loads(self.graphson_writer.writeObject(float('nan')))
assert {"@type": "g:Double", "@value": "Infinity"} == json.loads(self.graphson_writer.writeObject(float('inf')))
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 ca3880f..5010891 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
@@ -358,6 +358,7 @@
assert {"@type": "gx:Byte", "@value": 1} == json.loads(self.graphson_writer.writeObject(int.__new__(SingleByte, 1)))
assert {"@type": "g:Int64", "@value": 2} == json.loads(self.graphson_writer.writeObject(long(2)))
assert {"@type": "g:Int32", "@value": 1} == json.loads(self.graphson_writer.writeObject(1))
+ assert {"@type": "g:Int64", "@value": 851401972585122} == json.loads(self.graphson_writer.writeObject(851401972585122))
assert {"@type": "g:Double", "@value": 3.2} == json.loads(self.graphson_writer.writeObject(3.2))
assert {"@type": "g:Double", "@value": "NaN"} == json.loads(self.graphson_writer.writeObject(float('nan')))
assert {"@type": "g:Double", "@value": "Infinity"} == json.loads(self.graphson_writer.writeObject(float('inf')))