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 <[email protected]>
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")
[email protected](
- 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")
[email protected](
test =
"org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest",
method = "*",
reason = "No support for Tree serialization in GraphBinary")