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

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


The following commit(s) were added to refs/heads/master by this push:
     new 91e7a70  TINKERPOP-2147: Add serializer for TraversalMetrics
     new d82e3b5  Merge pull request #1053 from nastra/TINKERPOP-2147
91e7a70 is described below

commit 91e7a70ea445875749cf8baeec927230b2bbb0e4
Author: Eduard Tudenhoefner <eduard.tudenhoef...@datastax.com>
AuthorDate: Fri Feb 1 13:54:49 2019 +0100

    TINKERPOP-2147: Add serializer for TraversalMetrics
---
 CHANGELOG.asciidoc                                 |  1 +
 docs/src/dev/io/graphbinary.asciidoc               | 10 ++++
 .../gremlin/driver/ser/binary/DataType.java        |  1 +
 .../driver/ser/binary/TypeSerializerRegistry.java  |  2 +
 .../binary/types/TraversalMetricsSerializer.java   | 55 ++++++++++++++++++++++
 .../GraphBinaryReaderWriterRoundTripTest.java      | 22 +++++++++
 6 files changed, 91 insertions(+)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 20370b4..83f1e8c 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 
 This release also includes changes from <<release-3-3-6, 3.3.6>>.
 
+* Added GraphBinary serializer for TraversalMetrics
 * Fixed up `SparqlStrategy` so that it could be used properly with 
`RemoteStrategy`.
 * Fixed `ByteBuffer` serialization for GraphBinary.
 * Added easier to understand exceptions for connection problems in the 
Gremlin.Net driver.
diff --git a/docs/src/dev/io/graphbinary.asciidoc 
b/docs/src/dev/io/graphbinary.asciidoc
index f9f25e8..5c8f818 100644
--- a/docs/src/dev/io/graphbinary.asciidoc
+++ b/docs/src/dev/io/graphbinary.asciidoc
@@ -106,6 +106,7 @@ Changes to existing types require new revision.
 - `0x2a`: BulkSet
 - `0x2b`: Tree
 - `0x2c`: Metrics
+- `0x2d`: TraversalMetrics
 - `0xfe`: Unspecified null object
 - `0x00`: Custom
 
@@ -557,6 +558,15 @@ Where:
 - `{annotations}` is a `Map` composed by `String` keys and a value of any type.
 - `{nested_metrics}` is a `List` composed by `Metrics` items.
 
+==== TraversalMetrics
+
+Format: `{duration}{metrics}`
+
+Where:
+
+- `{duration}` is a `Long` describing the duration in nanoseconds.
+- `{metrics}` is a `List` composed by `Metrics` items.
+
 ==== Custom
 
 A custom type, represented as a blob value.
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/DataType.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/DataType.java
index 4a769fb..abde199 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/DataType.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/DataType.java
@@ -66,6 +66,7 @@ public enum DataType {
     BULKSET(0X2A),
     TREE(0X2B),
     METRICS(0x2C),
+    TRAVERSALMETRICS(0x2D),
 
     CHAR(0X80),
     DURATION(0X81),
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 c270a41..89022b8 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
@@ -38,6 +38,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
 import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Column;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
@@ -135,6 +136,7 @@ public class TypeSerializerRegistry {
             new RegistryEntry<>(BulkSet.class, new BulkSetSerializer()),
             new RegistryEntry<>(Tree.class, new TreeSerializer()),
             new RegistryEntry<>(Metrics.class, new MetricsSerializer()),
+            new RegistryEntry<>(TraversalMetrics.class, new 
TraversalMetricsSerializer()),
 
             // TransformSerializer implementations
             new RegistryEntry<>(Map.Entry.class, new MapEntrySerializer()),
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
new file mode 100644
index 0000000..f2bba8a
--- /dev/null
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/binary/types/TraversalMetricsSerializer.java
@@ -0,0 +1,55 @@
+/*
+ * 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 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.DataType;
+import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryReader;
+import org.apache.tinkerpop.gremlin.driver.ser.binary.GraphBinaryWriter;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class TraversalMetricsSerializer extends 
SimpleTypeSerializer<TraversalMetrics> {
+    private static final CollectionSerializer collectionSerializer = new 
CollectionSerializer(DataType.LIST);
+
+    public TraversalMetricsSerializer() {
+        super(DataType.TRAVERSALMETRICS);
+    }
+
+    @Override
+    protected TraversalMetrics readValue(ByteBuf buffer, GraphBinaryReader 
context) throws SerializationException {
+        Long durationNanos = context.readValue(buffer, Long.class, false);
+        final List<MutableMetrics> metrics = new 
ArrayList<>(collectionSerializer.readValue(buffer, context));
+        return new DefaultTraversalMetrics(durationNanos, metrics);
+    }
+
+    @Override
+    protected ByteBuf writeValue(TraversalMetrics value, ByteBufAllocator 
allocator, GraphBinaryWriter context) throws SerializationException {
+        return allocator.compositeBuffer(2).addComponents(true,
+                context.writeValue(value.getDuration(TimeUnit.NANOSECONDS), 
allocator, false),
+                collectionSerializer.writeValue(value.getMetrics(), allocator, 
context));
+    }
+}
diff --git 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
index 7f58b5c..d9f0f46 100644
--- 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
+++ 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
@@ -36,8 +36,10 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Column;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -139,6 +141,19 @@ public class GraphBinaryReaderWriterRoundTripTest {
         metrics.setAnnotation("a", "b");
         metrics.addNested(new MutableMetrics("idNested", "nameNested"));
 
+        // can't use the existing 'metrics' because traversal metrics modifies 
its nested metrics
+        final MutableMetrics metrics1 = metrics.clone();
+
+        final MutableMetrics metrics2 = new MutableMetrics("id2", "name2");
+        metrics2.setDuration(456, TimeUnit.MICROSECONDS);
+        metrics2.setCount("c2", 40);
+        metrics2.setAnnotation("c", "d");
+        metrics2.addNested(new MutableMetrics("idNested2", "nameNested2"));
+
+        List<MutableMetrics> nestedMetrics = Arrays.asList(metrics1, metrics2);
+        final DefaultTraversalMetrics traversalMetrics = new 
DefaultTraversalMetrics(666, nestedMetrics);
+        final DefaultTraversalMetrics emptyTraversalMetrics = new 
DefaultTraversalMetrics(444, Collections.emptyList());
+
         return Arrays.asList(
                 new Object[] {"String", "ABC", null},
                 new Object[] {"Char", '£', null},
@@ -243,6 +258,13 @@ public class GraphBinaryReaderWriterRoundTripTest {
                     assertEquals(new ArrayList(metrics.getCounts().values()), 
new ArrayList(m.getCounts().values()));
                     assertThat(m.getNested(), new 
ReflectionEquals(metrics.getNested()));
                 }},
+                new Object[] {"EmptyTraversalMetrics", emptyTraversalMetrics, 
(Consumer<TraversalMetrics>) m -> {
+                    assertThat(m, new ReflectionEquals(emptyTraversalMetrics));
+                }},
+                new Object[] {"TraversalMetrics", traversalMetrics, 
(Consumer<TraversalMetrics>) m -> {
+                    assertEquals(m.toString(), traversalMetrics.toString());
+                    assertThat(m, new ReflectionEquals(traversalMetrics, 
"stepIndexedMetrics", "positionIndexedMetrics"));
+                }},
 
                 // collections
                 new Object[] {"ListSingle", list, null},

Reply via email to