This is an automated email from the ASF dual-hosted git repository.

jorgebg pushed a commit to branch TINKERPOP-1942
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/TINKERPOP-1942 by this push:
     new d294e4c  Map.Entry serializer
d294e4c is described below

commit d294e4c69a7838fc0a343a69f47bf8ef51d57b86
Author: Jorge Bay Gondra <jorgebaygon...@gmail.com>
AuthorDate: Mon Dec 17 15:28:14 2018 +0100

    Map.Entry serializer
---
 .../driver/ser/binary/GraphBinaryWriter.java       |  8 ++++++
 .../driver/ser/binary/TypeSerializerRegistry.java  | 12 +++++---
 .../ser/binary/types/MapEntrySerializer.java       | 33 ++++++++++++++++++++++
 .../ser/binary/types/TransformSerializer.java      | 28 ++++++++++++++++++
 .../remote/GraphBinaryRemoteGraphProvider.java     |  8 ------
 5 files changed, 77 insertions(+), 12 deletions(-)

diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
index 4eb70f7..a785f37 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryWriter.java
@@ -23,6 +23,7 @@ import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.Unpooled;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.CustomTypeSerializer;
+import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.TransformSerializer;
 
 public class GraphBinaryWriter {
     private final TypeSerializerRegistry registry;
@@ -80,6 +81,13 @@ public class GraphBinaryWriter {
                     customTypeSerializer.write(value, allocator, this));
         }
 
+        if (serializer instanceof TransformSerializer) {
+            // For historical reasons, there are types that need to be 
transformed into another type
+            // before serialization, e.g., Map.Entry
+            TransformSerializer<T> transformSerializer = 
(TransformSerializer<T>) serializer;
+            return write(transformSerializer.transform(value), allocator);
+        }
+
         return allocator.compositeBuffer(2).addComponents(true,
                 // {type_code}
                 // TODO: Reuse buffer pooled locally
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/TypeSerializerRegistry.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/TypeSerializerRegistry.java
index 3180927..85524ac 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/TypeSerializerRegistry.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/TypeSerializerRegistry.java
@@ -40,6 +40,7 @@ import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.ListSerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.LocalDateSerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.LocalDateTimeSerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.LocalTimeSerializer;
+import org.apache.tinkerpop.gremlin.driver.ser.binary.types.MapEntrySerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.types.MapSerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.types.MonthDaySerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.OffsetDateTimeSerializer;
@@ -51,6 +52,7 @@ import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.PropertySerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.types.SetSerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.SingleTypeSerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.types.StringSerializer;
+import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.TransformSerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.TraversalStrategySerializer;
 import 
org.apache.tinkerpop.gremlin.driver.ser.binary.types.TraverserSerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.binary.types.UUIDSerializer;
@@ -171,6 +173,8 @@ public class TypeSerializerRegistry {
                 new RegistryEntry<>(TraversalStrategy.class, new 
TraversalStrategySerializer()),
                 new RegistryEntry<>(BulkSet.class, new BulkSetSerializer()),
 
+                new RegistryEntry<>(Map.Entry.class, new MapEntrySerializer()),
+
                 new RegistryEntry<>(Character.class, new CharSerializer()),
                 new RegistryEntry<>(Duration.class, new DurationSerializer()),
                 new RegistryEntry<>(InetAddress.class, new 
InetAddressSerializer()),
@@ -298,7 +302,7 @@ public class TypeSerializerRegistry {
             throw new NullPointerException("Serializer instance can not be 
null");
         }
 
-        if (serializer.getDataType() == null) {
+        if (serializer.getDataType() == null && !(serializer instanceof 
TransformSerializer)) {
             throw new NullPointerException("Serializer data type can not be 
null");
         }
 
@@ -310,10 +314,10 @@ public class TypeSerializerRegistry {
             serializersByInterface.put(type, serializer);
         }
 
-        if (serializer.getDataType() != DataType.CUSTOM) {
-            serializersByDataType.put(serializer.getDataType(), serializer);
-        } else {
+        if (serializer.getDataType() == DataType.CUSTOM) {
             serializersByCustomTypeName.put(entry.getCustomTypeName(), 
(CustomTypeSerializer) serializer);
+        } else if (serializer.getDataType() != null) {
+            serializersByDataType.put(serializer.getDataType(), serializer);
         }
     }
 
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapEntrySerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapEntrySerializer.java
new file mode 100644
index 0000000..87e9b93
--- /dev/null
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/MapEntrySerializer.java
@@ -0,0 +1,33 @@
+package org.apache.tinkerpop.gremlin.driver.ser.binary.types;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
+import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
+import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryWriter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MapEntrySerializer extends SimpleTypeSerializer<Map.Entry> 
implements TransformSerializer<Map.Entry> {
+    public MapEntrySerializer() {
+        super(null);
+    }
+
+    @Override
+    Map.Entry readValue(ByteBuf buffer, GraphBinaryReader context) throws 
SerializationException {
+        throw new SerializationException("A map entry should not be read 
individually");
+    }
+
+    @Override
+    public ByteBuf writeValue(Map.Entry value, ByteBufAllocator allocator, 
GraphBinaryWriter context) throws SerializationException {
+        throw new SerializationException("A map entry should not be written 
individually");
+    }
+
+    @Override
+    public Object transform(Map.Entry value) {
+        final Map map = new HashMap();
+        map.put(value.getKey(), value.getValue());
+        return map;
+    }
+}
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TransformSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TransformSerializer.java
new file mode 100644
index 0000000..cc97577
--- /dev/null
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TransformSerializer.java
@@ -0,0 +1,28 @@
+/*
+ * 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.driver.ser.binary.types;
+
+import org.apache.tinkerpop.gremlin.driver.ser.binary.TypeSerializer;
+
+/**
+ * Represents a special TypeSerializer placeholder that transforms the value 
into another before serializing it.
+ */
+public interface TransformSerializer<T> extends TypeSerializer<T> {
+    Object transform(T value);
+}
diff --git 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
index b8c4cda..30f7a43 100644
--- 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
+++ 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
@@ -25,14 +25,6 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 @Graph.OptOut(
-        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest",
-        method = 
"g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_unfold_order_byXvalues_descX",
-        reason = "No support for Map.Entry serialization in GraphBinary")
-@Graph.OptOut(
-        test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest",
-        method = 
"g_V_group_byXlabelX_byXbothE_groupXaX_byXlabelX_byXweight_sumX_weight_sumX",
-        reason = "No support for Map.Entry serialization in GraphBinary")
-@Graph.OptOut(
         test = 
"org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest",
         method = "*",
         reason = "No support for Tree serialization in GraphBinary")

Reply via email to