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")