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},