You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2017/07/27 00:09:37 UTC

tinkerpop git commit: Attempt to fix BigDecimal serialization issues in Gremlin-Python.

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1736-master [created] c0af6eec8


Attempt to fix BigDecimal serialization issues in Gremlin-Python.


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

Branch: refs/heads/TINKERPOP-1736-master
Commit: c0af6eec8ed6ceade364e03a427868fe5067896b
Parents: 3a4406a
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Thu Jul 27 02:07:56 2017 +0200
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Thu Jul 27 02:07:56 2017 +0200

----------------------------------------------------------------------
 .../gremlin/process/traversal/Bytecode.java     |  4 +++
 .../structure/io/graphson/GraphSONModule.java   |  3 ++
 .../io/graphson/GraphSONSerializersV3d0.java    | 30 ++++++++++++++++++++
 .../gremlin/python/jsr223/PythonTranslator.java |  3 ++
 .../python/jsr223/JythonScriptEngineSetup.java  |  1 +
 5 files changed, 41 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c0af6eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
index a3ba9f0..9c69f8e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Bytecode.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -294,6 +295,9 @@ public final class Bytecode implements Cloneable, Serializable {
                 set.add(convertArgument(item, true));
             }
             return set;
+        } else if (argument instanceof BigDecimal) {
+            final BigDecimal bd = (BigDecimal) argument;
+            return bd.scale() > 0 ? bd : bd.setScale(1, BigDecimal.ROUND_HALF_UP);
         } else
             return argument;
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c0af6eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
index 9354eac..5cd2956 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
@@ -74,6 +74,7 @@ import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGraphSONSeriali
 import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGraphSONSerializerV3d0;
 import org.apache.tinkerpop.gremlin.util.function.Lambda;
 
+import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.LocalDate;
@@ -215,6 +216,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
             // need to explicitly add serializers for those types because Jackson doesn't do it at all.
             addSerializer(Integer.class, new GraphSONSerializersV3d0.IntegerGraphSONSerializer());
             addSerializer(Double.class, new GraphSONSerializersV3d0.DoubleGraphSONSerializer());
+            addSerializer(BigDecimal.class, new GraphSONSerializersV3d0.BigDecimalGraphSONSerializer());
 
             // traversal
             addSerializer(Traversal.class, new TraversalSerializersV3d0.TraversalJacksonSerializer());
@@ -255,6 +257,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
             // numbers
             addDeserializer(Integer.class, new GraphSONSerializersV3d0.IntegerJackonsDeserializer());
             addDeserializer(Double.class, new GraphSONSerializersV3d0.DoubleJackonsDeserializer());
+            addDeserializer(BigDecimal.class, new GraphSONSerializersV3d0.BigDecimalJackonsDeserializer());
 
             // traversal
             addDeserializer(Bytecode.class, new TraversalSerializersV3d0.BytecodeJacksonDeserializer());

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c0af6eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
index 8c601b1..a5f1990 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV3d0.java
@@ -59,6 +59,7 @@ import org.apache.tinkerpop.shaded.jackson.databind.type.TypeFactory;
 import org.javatuples.Pair;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -349,6 +350,18 @@ class GraphSONSerializersV3d0 {
         }
     }
 
+    final static class BigDecimalGraphSONSerializer extends StdScalarSerializer<BigDecimal> {
+        public BigDecimalGraphSONSerializer() {
+            super(BigDecimal.class);
+        }
+
+        @Override
+        public void serialize(final BigDecimal bigDecimalValue, final JsonGenerator jsonGenerator,
+                              final SerializerProvider serializerProvider) throws IOException {
+            jsonGenerator.writeNumber(bigDecimalValue);
+        }
+    }
+
     final static class TraversalMetricsJacksonSerializer extends StdScalarSerializer<TraversalMetrics> {
         public TraversalMetricsJacksonSerializer() {
             super(TraversalMetrics.class);
@@ -721,4 +734,21 @@ class GraphSONSerializersV3d0 {
             return true;
         }
     }
+
+    static class BigDecimalJackonsDeserializer extends StdDeserializer<BigDecimal> {
+
+        protected BigDecimalJackonsDeserializer() {
+            super(BigDecimal.class);
+        }
+
+        @Override
+        public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+            return jsonParser.getDecimalValue();
+        }
+
+        @Override
+        public boolean isCachable() {
+            return true;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c0af6eec/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
index d4b9202..7372309 100644
--- a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
+++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
@@ -44,6 +44,7 @@ import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -168,6 +169,8 @@ public class PythonTranslator implements Translator.ScriptTranslator {
             return map.length() > 1 ? map.substring(0, map.length() - 1) + "}" : map.append("}").toString();
         } else if (object instanceof Long)
             return object + "L";
+        else if (object instanceof BigDecimal)
+            return "Decimal(\"" + object.toString() + "\")";
         else if (object instanceof TraversalStrategyProxy) {
             final TraversalStrategyProxy proxy = (TraversalStrategyProxy) object;
             if (proxy.getConfiguration().isEmpty())

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c0af6eec/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java
index bfbd8c4..7cfc27f 100644
--- a/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java
+++ b/gremlin-python/src/test/java/org/apache/tinkerpop/gremlin/python/jsr223/JythonScriptEngineSetup.java
@@ -39,6 +39,7 @@ public class JythonScriptEngineSetup {
     public static PyScriptEngine setup(final PyScriptEngine jythonEngine) {
         try {
             jythonEngine.eval("import gremlin_python.statics");
+            jythonEngine.eval("from decimal import *");
             jythonEngine.eval("from gremlin_python.process.traversal import *");
             jythonEngine.eval("from gremlin_python.process.graph_traversal import *");
             jythonEngine.eval("from gremlin_python.process.graph_traversal import __");