////
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.
////
= TinkerPop3 CHANGELOG

== TinkerPop 3.4.0 (Avant-Gremlin Construction #3 for Theremin and Flowers)

image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/avant-gremlin.png[width=185]

[[release-3-4-5]]
=== TinkerPop 3.4.5 (Release Date: February 3, 2020)

This release also includes changes from <<release-3-3-10, 3.3.10>>.

* Expanded the use of `by(String)` modulator so that it can work on `Map` as well as `Element`.
* Improved error messaging for `by(String)` so that it is more clear as to what the problem is
* Bump to Netty 4.1.42
* Improved SPARQL query translation to better allow for index optimizations during execution.
* Improved Gremlin Server websocket handling preventing automatic server close of the channel for protocol errors.
* Introduced internal `Buffer` API as a way to wrap Netty's Buffer API and moved `GraphBinaryReader`, `GraphBinaryWriter` and `TypeSerializer<T>` to `gremlin-core`.
* Unified the behavior of property comparison: only compare key&value.
* Supported `hasKey()` and `hasValue()` step for edge property and meta property, like `g.E().properties().hasKey('xx')`.
* Modified driver to send `overrideRequestId` and `userAgent` to server when they are present in `RequestOptions` for bytecode requests.

==== Bugs

* TINKERPOP-2175 Executor thread is not returned on channel close
* TINKERPOP-2266 Keep alive not started at connection creation
* TINKERPOP-2274 Test of TinkerGraph Gremlin fail on Windows and non EN locale
* TINKERPOP-2318 Edge properties dedup() not work with spark-gremlin *(breaking)*
* TINKERPOP-2332 JavaScript GLV: structure element toString() should internally call toString()
* TINKERPOP-2333 JavaScript GLV: GraphSON2/3 Edge deserialization is invalid

==== Improvements

* TINKERPOP-1733 hasKey, hasValues should work on Element and Property
* TINKERPOP-2262 Improve Netty protocol handling
* TINKERPOP-2305 GraphBinary: Wrap Buffer API
* TINKERPOP-2307 Add better error message for badly configured Channelizer
* TINKERPOP-2309 Bump gremlinpython to Tornado 5.x
* TINKERPOP-2314 Employ by(String) for Map when possible and improve errors around incorrect types
* TINKERPOP-2315 Implement some form of clone() or reset() for Traversal in GLVs
* TINKERPOP-2320 [SECURITY] XMLInputFactory initialization in GraphMLReader introduces
* TINKERPOP-2322 Deprecate Jython support
* TINKERPOP-2324 Deprecate the raw NIO support in the Java driver
* TINKERPOP-2325 Generate traversals that will better yield index lookups with SPARQL
* TINKERPOP-2329 JavaScript GLV: Update websocket library dependency
* TINKERPOP-2330 JavaScript GLV should expose GraphSON2Writer and GraphSONReader

[[release-3-4-4]]
=== TinkerPop 3.4.4 (Release Date: October 14, 2019)

This release also includes changes from <<release-3-3-9, 3.3.9>>.

* Provided support for DSLs by way of remote connections through `AnonymousTraversalSource`.
* Added `elementMap()` step.
* Added GraphBinary support for Python.
* Allowed for embedded map assertions in GLV tests.
* Added `Direction` deserialization support in GLVs.

==== Bugs

* TINKERPOP-2159 EventStrategy doesn't handle multi-valued properties
* TINKERPOP-2276 No constructor for remote connection in DSL generated traversal source
* TINKERPOP-2283 GraphStep's ids null exception
* TINKERPOP-2285 Error object is unreachable
* TINKERPOP-2289 Use address instead of hostname for connection
* TINKERPOP-2290 Javascript GLV connection refused error handling
* TINKERPOP-2291 TraversalExplanation deserialization in GraphSON
* TINKERPOP-2298 Bytecode.java  flattenArguments throw exception when null
* TINKERPOP-2303 GremlinDsl generate addV instead of addE

==== Improvements

* TINKERPOP-1810 Add Lambda.binaryOperator and Lambda.unaryOperator
* TINKERPOP-1838 Python sample script
* TINKERPOP-2046 Gremlin-Python: Support custom request headers in WebSocket request
* TINKERPOP-2213 Replace scriptEvaluationTimeout in favor of something more suitable to bytecode
* TINKERPOP-2275 Update jackson databind 2.9.9.3+
* TINKERPOP-2277 Python sdk postpone the timing to create transport
* TINKERPOP-2279 GraphBinary support in Python
* TINKERPOP-2280 Prevent use of T values as property key overloads
* TINKERPOP-2284 Make it easier to return more structure of graph elements
* TINKERPOP-2302 Add isOnGraphComputer() field accessor to ElementMapStep

[[release-3-4-3]]
=== TinkerPop 3.4.3 (Release Date: August 5, 2019)

This release also includes changes from <<release-3-3-8, 3.3.8>>.

* Improved error messaging on timeouts returned to the console from `:>`.
* Added a `toString()` serializer for GraphBinary.
* Configured the Gremlin Console to use GraphBinary by default.
* Fixed transaction management for empty iterators in Gremlin Server.
* Deprecated `MessageSerializer` implementations for Gryo in Gremlin Server.
* Deprecated `Serializers` enum values of `GRYO_V1D0` and `GRYO_V3D0`.
* Deprecated `SerTokens` values of `MIME_GRYO_V1D0` and `MIME_GRYO_V3D0`.
* Added a Docker command to start Gremlin Server with the standard GLV test configurations.
* Added `aggregate(Scope,String)` and deprecated `store()` in favor of `aggregate(local)`.
* Modified `NumberHelper` to better ignore `Double.NaN` in `min()` and `max()` comparisons.
* Bump to Netty 4.1.36.
* Bump to Groovy 2.5.7.
* Added `userAgent` to RequestOptions. Gremlin Console sends `Gremlin Console/<version>` as the `userAgent`.
* Fixed DriverRemoteConnection ignoring `with` `Token` options when multiple were set.
* Added `:set warnings <true|false>` to Gremlin Console.

==== Bugs

* TINKERPOP-1619 TinkerGraphComputer worker count affects OptionalStep query results
* TINKERPOP-2157 SparkStarBarrierInterceptor injects (Byte) 0
* TINKERPOP-2224 Detect and fix resource leak
* TINKERPOP-2230 match() step unexpected behaviours
* TINKERPOP-2232 RemoteStrategy does not call parent class TraversalStrategy __init__
* TINKERPOP-2238 Fix remaining iterator leaks marked by @IgnoreIteratorLeak
* TINKERPOP-2241 Client exception don't match Server exception when server  throw StackOverflowError
* TINKERPOP-2248 Instability of driver for blocked requests
* TINKERPOP-2257 transaction itty  may still be visited after commit
* TINKERPOP-2264 Gremlin Python should deserialize g:Date to UTC

==== Improvements

* TINKERPOP-1084 Branch option tokens should be allowed to be traversals.
* TINKERPOP-1553 Deprecate store() in favor of aggregate(Scope)
* TINKERPOP-1921 Support hasNext terminal step in GLVs
* TINKERPOP-2020 Support withComputer() for javascript
* TINKERPOP-2223 Update jackson databind to 2.9.9
* TINKERPOP-2236 Improve error messaging for TinkerGraph IdManagers that fail on conversions
* TINKERPOP-2237 Prevent error when closing sessions that don't exist *(breaking)*
* TINKERPOP-2242 Bump to netty 4.1.36
* TINKERPOP-2243 Add user-agent to RequestOptions
* TINKERPOP-2246 Consolidate the error propagation to the client
* TINKERPOP-2250 Support toString serialization in GraphBinary
* TINKERPOP-2256 processAllStarts of AggregateStep should only be called when barrier is empty
* TINKERPOP-2260 Update jackson databind 2.9.9.1
* TINKERPOP-2265 Deprecate Traversal.getSideEffects() functionality for remoting purposes
* TINKERPOP-2270 Deprecate multi/metaproperty support in Neo4j
* TINKERPOP-2271 Add console preference to control server-originated warning display
* TINKERPOP-2272 Rename steps and tokens that conflict with standard python functions

[[release-3-4-2]]
=== TinkerPop 3.4.2 (Release Date: May 28, 2019)

This release also includes changes from <<release-3-3-7, 3.3.7>>.

* Allow a `Traversal` to know what `TraversalSource` it spawned from.
* Fixed problem with connection pool sizing and retry.
* Added status attribute for warnings to be returned to the client.
* Modified Gremlin Console to report warning status attributes.
* Changed `:>` in Gremlin Console to submit the client-side timeout on each request.
* Provided method to override the request identifier with `RequestOptions`.
* Added option to set per-request settings on a `Traversal` submitted via `Bytecode`.
* Fixed the Gryo registration for `OptionsStrategy` as it was not serializing state properly.

==== Bugs

* TINKERPOP-2090 After running backend for a day or so System.IO.IOException keep throwing
* TINKERPOP-2112 Folding in property() step is not being optimally performed
* TINKERPOP-2180 gremlin.sh doesn't work when directories contain spaces
* TINKERPOP-2183 InterpreterModeASTTransformation needs to be more specific about what it transforms
* TINKERPOP-2189 ConnectedComponent test assumes fixed order of vertices
* TINKERPOP-2194 Enforcing an order on properties in one test method of ChooseTest
* TINKERPOP-2196 PartitionStrategy with includeMetaProperties(true) can't add labeled vertex
* TINKERPOP-2198 Documentation for Store contradicts itself
* TINKERPOP-2199 within step does not work with more than two parameters with python
* TINKERPOP-2200 AddEdgeStartStep used DetachedFactory.detach instead of EventStrategy.detach
* TINKERPOP-2204 Client receives no response on failed request
* TINKERPOP-2206 Certain types in javascript don't appear to serialize with a GraphSON type
* TINKERPOP-2212 Path is not detaching properly under certain conditions
* TINKERPOP-2217 Race condition in Gremlin.net driver connection

==== Improvements

* TINKERPOP-2089 Javascript DSL support
* TINKERPOP-2179 Have o.a.t.g.driver.ser.SerializationException extend IOException
* TINKERPOP-2181 Allow ctrl+c to break out of a long running process in Gremlin Console
* TINKERPOP-2182 Remove gperfutils from Gremlin Console *(breaking)*
* TINKERPOP-2190 Document Gremlin sanitization best practices
* TINKERPOP-2191 Implement EdgeLabelVerificationStrategy
* TINKERPOP-2193 Allow a Traversal to know what TraversalSource it spawned from
* TINKERPOP-2203 Bind the console timeout to the request timeout
* TINKERPOP-2208 Include inject() in DSLs generated with Java annotation processor
* TINKERPOP-2211 Provide API to add per request option for a bytecode
* TINKERPOP-2216 Consider adding conventional status attribute key for warnings
* TINKERPOP-2219 Upgrade Netty version

[[release-3-4-1]]
=== TinkerPop 3.4.1 (Release Date: March 18, 2019)

This release also includes changes from <<release-3-3-6, 3.3.6>>.

* Gremlin.NET driver: Fixed removal of closed connections and added round-robin scheduling.
* Added GraphBinary serializer for TraversalMetrics
* Added registration for `SparqlStrategy` for GraphSON.
* Fixed up `SparqlStrategy` so that it could be used properly with `RemoteStrategy`.
* Fixed `ByteBuffer` serialization for GraphBinary.
* Fixed `Path.toString()` in `gremlin-javascript` which was referencing an invalid object.
* Fixed potential for an infinite loop in connection creation for `gremlin-dotnet`.
* Added fallback resolver to `TypeSerializerRegistry` for GraphBinary.
* Added easier to understand exceptions for connection problems in the Gremlin.Net driver.
* Support configuring the type registry builder for GraphBinary.
* Bump to Groovy 2.5.6.
* Release working buffers in case of failure for GraphBinary.
* GraphBinary: Use the same `ByteBuf` instance to write during serialization. Changed signature of write methods in type serializers.
* Remove unused parameter in GraphBinary's `ResponseMessageSerializer`.
* Changed `SparqlTraversalSource` so as to enable Gremlin steps to be used to process results from the `sparql()` step.
* GraphBinary: Cache expression to obtain the method in `PSerializer`.

==== Bugs

* TINKERPOP-1992 count has negative time in profile
* TINKERPOP-2126 toString() methods not thread-safe
* TINKERPOP-2135 Gremlin.Net ConnectionPool doesn't handle closed idle connections properly
* TINKERPOP-2139 Errors during request serialization in WebSocketGremlinRequestEncoder/NioGremlinRequestEncoder are not reported to the client
* TINKERPOP-2141 ByteBufferSerializer modifies buffer's position
* TINKERPOP-2148 "no connection available!" is being thrown despite lots of free connections
* TINKERPOP-2152 Path toString fails in Gremlin JavaScript
* TINKERPOP-2153 Remove unused parameter from ResponseMessageSerializer *(breaking)*
* TINKERPOP-2154 GraphBinary: Serializers should release resources in case of failures
* TINKERPOP-2155 Situation can occur that causes infinite amount of connection to be opened, causing System.Net.WebSockets.WebSocketException
* TINKERPOP-2161 GraphBinary: Write serialization performance issue
* TINKERPOP-2169 Responses exceeding maxContentLength cause subsequent queries to hang
* TINKERPOP-2172 PartitionStrategy doesn't apply to AddEdgeStartStep
* TINKERPOP-2173 Incorrect reset of log level in integration test
* TINKERPOP-2177 Streaming response immediately after authentication stops after first partial response

==== Improvements

* TINKERPOP-1435 Support for extended GraphSON in gremlin-python
* TINKERPOP-1882 Apply range and limit steps as early as possible
* TINKERPOP-1998 IoGraphTest use different schemas for standard and readGraph configurations
* TINKERPOP-2088 Enable SourceLink for Gremlin.Net
* TINKERPOP-2098 Improve gremlin-server.sh help output
* TINKERPOP-2122 Expose status codes from server errors
* TINKERPOP-2124 InlineFilterStrategy produces wrong result
* TINKERPOP-2125 Extend release validation script
* TINKERPOP-2127 Add g:TraversalMetrics and g:Metrics deserializers for gremlinpython
* TINKERPOP-2129 Mask security secret or password in logs
* TINKERPOP-2130 Cannot instantiate DriverRemoteConnection without passing an options object
* TINKERPOP-2131 NoConnectionAvailableException doesn't reveal the reason
* TINKERPOP-2134 Bump to Groovy 2.5.6
* TINKERPOP-2136 Inside lower bound inclusion (documentation)
* TINKERPOP-2138 Provide a configuration to disable the global closure cache
* TINKERPOP-2140 Test build with Docker automatically
* TINKERPOP-2144 Better handle Authenticator instance failures
* TINKERPOP-2147 Add GraphBinary serializer for TraversalMetrics
* TINKERPOP-2149 GraphBinary: Make type serializer resolution pluggable
* TINKERPOP-2150 GraphBinary: Support configuring the TypeSerializerRegistry builder class in config
* TINKERPOP-2163 JavaTranslator performance enhancements
* TINKERPOP-2164 Bytecode's hashCode impl (and its inner classes) can produce hash collisions
* TINKERPOP-2165 Prefer commons-lang3 to commons-lang
* TINKERPOP-2166 GraphBinary: P deserialization should be optimized
* TINKERPOP-2167 Gremlin Javascript Traversal as async iterable
* TINKERPOP-2171 Allow SPARQL to be extended with Gremlin steps
* TINKERPOP-2174 Improve Docker Image Security

[[release-3-4-0]]
=== TinkerPop 3.4.0 (Release Date: January 2, 2019)

This release also includes changes from <<release-3-3-4, 3.3.4>> and <<release-3-3-5, 3.3.5>>.

* Changed Python "bindings" to use an actual `Bindings` object rather than a 2-tuple.
* Improved the Gremlin.NET driver: It now uses request pipelining and its `ConnectionPool` has a fixed size.
* Implemented `IndexStep` which allows to transform local collections into indexed collections or maps.
* Made `valueMap()` aware of `by` and `with` modulators and deprecated `valueMap(boolean)` overloads.
* Use `Compare.eq` in `Contains` predicates to ensure the same filter behavior for numeric values.
* Added `OptionsStrategy` to allow traversals to take arbitrary traversal-wide configurations.
* Added text predicates.
* Added `BulkSet` as a GraphSON type with support in all language variants.
* Added `ReferenceElementStrategy` to auto-detach elements to "reference" from a traversal.
* Added initial release of the GraphBinary serialization format with Java support.
* Allowed `ImportCustomizer` to accept fields.
* Removed groovy-sql dependency.
* Modified `Mutating` steps so that they are no longer marked as `final`.
* Rewrote `ConnectiveStrategy` to support an arbitrary number of infix notations in a single traversal.
* GraphSON `MessageSerializer` s will automatically register the GremlinServerModule to a provided GraphSONMapper.
* Removed support for `-i` option in Gremlin Server which was previously deprecated.
* Implemented `ShortestPathVertexProgram` and the `shortestPath()` step.
* `AbstractGraphProvider` uses `g.io()` for loading test data.
* Added the `io()` start step and `read()` and `write()` termination steps to the Gremlin language.
* Added `GraphFeatures.supportsIoRead()` and `GraphFeatures.supportsIoWrite()`.
* Deprecated `Graph.io()` and related infrastructure.
* `GraphMLReader` better handles edge and vertex properties with the same name.
* Maintained order of annotations in metrics returned from `profile()`-step.
* Refactored `TypeTranslator` to be directly extensible for `ScriptTranslator` functions.
* Bumped to Netty 4.1.25.
* Bumped to Spark 2.4.0.
* Bumped to Groovy 2.5.4.
* Modified Gremlin Server to return a "host" status attribute on responses.
* Added ability to the Java, .NET, Python and JavaScript drivers to retrieve status attributes returned from the server.
* Modified Java and Gremlin.Net `ResponseException` to include status code and status attributes.
* Modified Python `GremlinServerError` to include status attributes.
* Modified the return type for `IGremlinClient.SubmitAsync()` to be a `ResultSet` rather than an `IReadOnlyCollection`.
* Deprecated two `submit()`-related methods on the Java driver `Client` class.
* Added `Client.submit()` overloads that accept per-request `RequestOptions`.
* Added sparql-gremlin.
* Fixed a bug in dynamic Gryo registration where registrations that did not have serializers would fail.
* Moved `Parameterizing` interface to the `org.apache.tinkerpop.gremlin.process.traversal.step` package with other marker interfaces of its type.
* Replaced `Parameterizing.addPropertyMutations()` with `Configuring.configure()`.
* Changed interface hierarchy for `Parameterizing` and `Mutating` interfaces as they are tightly related.
* Introduced the `with(k,v)` and `with(k)` step modulators which can supply configuration options to `Configuring` steps.
* Added `OptionsStrategy` to allow traversals to take arbitrary traversal-wide configurations.
* Introduced the `with(k,v)` and `with(k)` traveral source configuration options which can supply configuration options to the traversal.
* Added `connectedComponent()` step and related `VertexProgram`.
* Added `supportsUpsert()` option to `VertexFeatures` and `EdgeFeatures`.
* `min()` and `max()` now support all types implementing `Comparable`.
* Change the `toString()` of `Path` to be standardized as other graph elements are.
* `hadoop-gremlin` no longer generates a test artifact.
* Allowed `GraphProvider` to expose a cached `Graph.Feature` object so that the test suite could re-use them to speed test runs.
* Fixed a bug in `ReducingBarrierStep`, that returned the provided seed value despite no elements being available.
* Changed the order of `select()` scopes. The order is now: maps, side-effects, paths.
* Moved `TraversalEngine` to `gremlin-test` as it has long been only used in testing infrastructure.
* Nested loop support added allowing `repeat()` steps to be nested.
* Events from `EventStrategy` raised from "new" mutations will now return a `KeyedVertexProperty` or `KeyedProperty` as is appropriate.
* `MutationListener#vertexPropertyChanged(Vertex, VertexProperty, Object, Object...)` no longer has a default implementation.
* Deprecated `GraphSONMessageSerializerV2d0` as it is now analogous to `GraphSONMessageSerializerGremlinV2d0`.
* Moved previously deprecated `RemoteGraph` to `gremlin-test` as it is now just a testing component.
* Removed previously deprecated `RemoteStrategy.instance()` and the strategy no longer has any connection to `RemoteGraph`.
* Removed previously deprecated methods in `SubgraphStrategy` and `PartitionStrategy` builders.
* Removed previously deprecated Credentials DSL infrastructure.
* Removed previously deprecated `RemoteConnection#submit(Traversal)` and `RemoteConnection#submit(Bytecode)` methods.
* Removed previously deprecated `MutationListener#vertexPropertyChanged(Vertex, Property, Object, Object...)`.
* Removed previously deprecated `OpSelectorHandler` constructor.
* Removed previously deprecated `close()` from `GremlinGroovyScriptEngine` which no longer implements `AutoCloseable`.
* Removed previously deprecated `getGraphInputFormat()` and `getGraphOutputFormat()` from `HadoopConfiguration`.
* Removed previously deprecated `AbstractOpProcessor#makeFrame()` method.
* Removed previously deprecated `AuthenticationSettings.className` configuration option in Gremlin Server.
* Removed previously deprecated `GraphManager` methods `getGraphs()` and `getTraversalSources()`.
* Removed previously deprecated Gremlin Server setting for `serializedResponseTimeout`.
* Removed previously deprecated Structure API exceptions related to "element not found" situations.
* Removed previously deprecated `rebindings` options from the Java driver API.
* Removed previously deprecated `LambdaCollectingBarrierStep.Consumers` enum.
* Removed previously deprecated `HasContainer#makeHasContainers(String, P)`
* Removed support for Giraph.
* Removed previously deprecated JavaScript Driver property `traversers` of the `ResultSet`.
* gremlin-python: use explicit Bindings object for python instead of a 2-tuple

==== Bugs

* TINKERPOP-1777 Gremlin .max step returns -2147483648 for empty result sets *(breaking)*
* TINKERPOP-1869 Profile step and iterate do not play nicely with each other
* TINKERPOP-1898 Issue with bindings in strategies and lambdas
* TINKERPOP-1927 Gherkin scenario expects list with duplicates, but receives g:Set
* TINKERPOP-1933 gremlin-python maximum recursion depth exceeded on large responses
* TINKERPOP-1947 Path history isn't preserved for keys in mutations
* TINKERPOP-1949 Formatting error on website
* TINKERPOP-1958 TinkerGraphCountStrategy can return wrong counts
* TINKERPOP-1961 Duplicate copies of images directory in docs
* TINKERPOP-1962 GroovyTranslator doesn't handle empty maps
* TINKERPOP-1963 Use of reducing step in choose()
* TINKERPOP-1972 inject() tests are throwing exceptions in .NET GLV tests
* TINKERPOP-1978 Check for Websocket connection state when retrieved from Connection Pool missing
* TINKERPOP-1979 Several OLAP issues in MathStep
* TINKERPOP-1988 minor error in documentation
* TINKERPOP-1999 [Java][gremlin-driver] Query to a remote server via the websocket client hangs indefinitely if the server becomes unavailable
* TINKERPOP-2005 Intermittent NullPointerException in response handling
* TINKERPOP-2006 GraphML serialization invalid if a vertex and edge have similar named property
* TINKERPOP-2009 Pick.any and Pick.none should be exposed in Gremlin-JavaScript
* TINKERPOP-2021 Prevent maximum recursion depth failure
* TINKERPOP-2028 AbstractGraphSONMessageSerializerV2d0 should register GremlinServerModule when mapper is provided
* TINKERPOP-2029 ConcurrentModificationException for InlineFilterStrategy
* TINKERPOP-2030 KeepAlive task executed for every Connection.write call
* TINKERPOP-2032 Update jython-standalone
* TINKERPOP-2044 Cannot reconnect to Azure cosmos host that becomes available again
* TINKERPOP-2058 Contains predicates should rely on Compare predicates *(breaking)*
* TINKERPOP-2081 PersistedOutputRDD materialises rdd lazily with Spark 2.x
* TINKERPOP-2091 Wrong/Missing feature requirements in StructureStandardTestSuite
* TINKERPOP-2094 Gremlin Driver Cluster Builder serializer method does not use mimeType as suggested
* TINKERPOP-2095 GroupStep looks for irrelevant barrier steps
* TINKERPOP-2096 gremlinpython: AttributeError when connection is closed before result is received
* TINKERPOP-2100 coalesce() creating unexpected results when used with order()
* TINKERPOP-2113 P.Within() doesn't work when given a List argument

==== Improvements

* TINKERPOP-550 Gremlin IO needs to support both OLTP and OLAP naturally.
* TINKERPOP-967 Support nested-repeat() structures
* TINKERPOP-1113 GraphComputer subclasses should support native methods
* TINKERPOP-1143 Remove deprecated TraversalSource.Builder and TraversalEngine. *(breaking)*
* TINKERPOP-1296 Remove deprecated serializedResponseTimeout from Gremlin Server *(breaking)*
* TINKERPOP-1342 Allow setting scriptEvaluationTimeout in driver
* TINKERPOP-1365 Log the seed used to initialize Random in tests
* TINKERPOP-1410 mvn install -Dmaven.test.skip=true doesn't work on a clean machine *(breaking)*
* TINKERPOP-1446 Add a StringFactory for Path which prefixes with type.
* TINKERPOP-1447 Add some JavaScript intelligence to the documentation so that comments and output are not copied in a copy paste
* TINKERPOP-1494 Means of exposing execution information from a result produced by RemoteConnection
* TINKERPOP-1518 Provide a way for providers to expose static Graph.Features to tests
* TINKERPOP-1522 Order of select() scopes *(breaking)*
* TINKERPOP-1595 Go through TraversalVertexProgram with a profile and optimize.
* TINKERPOP-1628 Implement TraversalSelectStep
* TINKERPOP-1685 Introduce optional feature to allow for upserts without read-before-write
* TINKERPOP-1705 Remove deprecated rebindings option *(breaking)*
* TINKERPOP-1707 Remove deprecated AuthenticationSettings.className option *(breaking)*
* TINKERPOP-1755 No docs for ReferenceElements
* TINKERPOP-1769 Python graph[empty] string representation is confusing
* TINKERPOP-1774 Gremlin .NET: Support min and max sizes in Connection pool
* TINKERPOP-1775 Gremlin .NET: Implement a Connection write queue to support request pipelining
* TINKERPOP-1778 Do not promote timedInterrupt option for Gremlin Server script processing
* TINKERPOP-1780 Add authentication tests for gremlin-python
* TINKERPOP-1831 Refactor EventStrategy  *(breaking)*
* TINKERPOP-1836 .NET sample project
* TINKERPOP-1841 Include Python GLV tests on TravisCI
* TINKERPOP-1849 Provide a way to fold() with an index
* TINKERPOP-1864 Gremlin Python tests for GraphSON 2.0 and 3.0
* TINKERPOP-1878 Sparql to Gremlin Compiler
* TINKERPOP-1888 Extend max and min to all Comparable properties, not just Numbers *(breaking)*
* TINKERPOP-1889 JavaScript GLV: Use heartbeat to prevent connection timeout
* TINKERPOP-1897 Provide Docker images of Gremlin Server and Console
* TINKERPOP-1906 Make ResponseException explorable
* TINKERPOP-1912 Remove MD5 checksums
* TINKERPOP-1913 Expose metadata from Gremlin Server to Clients
* TINKERPOP-1930 Drop support for Giraph *(breaking)*
* TINKERPOP-1934 Bump to latest version of httpclient
* TINKERPOP-1936 Performance enhancement to Bytecode deserialization
* TINKERPOP-1941 Remove deprecated Structure API exception methods *(breaking)*
* TINKERPOP-1942 Binary serialization format
* TINKERPOP-1945 Add support for extended GraphSon types to Gremlin.net
* TINKERPOP-1946 Remove the deprecated Credentials DSL infrastructure *(breaking)*
* TINKERPOP-1950 Traversal construction performance enhancements
* TINKERPOP-1951 gremlin-server.bat doesn't support paths containing spaces
* TINKERPOP-1953 Bump to Groovy 2.4.15
* TINKERPOP-1954 Remove deprecated GraphManager methods *(breaking)*
* TINKERPOP-1959 Provide a way to submit scripts to the server in gremlin-javascript
* TINKERPOP-1967 Add a connectedComponent() step
* TINKERPOP-1968 Refactor elements of Gremlin Server testing
* TINKERPOP-1975 Introduce with() step modulator *(breaking)*
* TINKERPOP-1976 Include Computer tests for GLVs
* TINKERPOP-1977 Gremlin-JavaScript: Support SASL authentication
* TINKERPOP-1984 Allow support for multiple serializer versions in Gremlin Server HTTP *(breaking)*
* TINKERPOP-1985 Update position on bulk loading
* TINKERPOP-1986 Remove deprecation from PartitionStrategy, SubgraphStrategy and GremlinScriptEngine *(breaking)*
* TINKERPOP-1987 Bump to Netty 4.1.x
* TINKERPOP-1989 Preserve order that plugins are applied in Gremlin Console
* TINKERPOP-1990 Add a shortestPath() step
* TINKERPOP-1993 Bump to Spark 2.3.1
* TINKERPOP-1995 DriverRemoteConnection close() method returns undefined
* TINKERPOP-1996 Introduce read() and write() steps
* TINKERPOP-2002 Create a blog post explaining the value of using TinkerPop
* TINKERPOP-2010 Generate jsdoc for gremlin-javascript
* TINKERPOP-2011 Use NumberHelper on choose()
* TINKERPOP-2012 Target .NET Standard 2.0 for Gremlin.Net
* TINKERPOP-2013 Process tests that are auto-ignored stink
* TINKERPOP-2015 Allow users to configure the WebSocket connections
* TINKERPOP-2016 Upgrade Jackson FasterXML to 2.9.5 or later to fix security vulnerability
* TINKERPOP-2017 Check for Column in by()
* TINKERPOP-2018 Generate API docs for Gremlin.Net
* TINKERPOP-2022 Cluster SSL should trust default ca certs by default
* TINKERPOP-2023 Gremlin Server should not create self-signed certs *(breaking)*
* TINKERPOP-2024 Gremlin Server Application archetype should connect via withRemote
* TINKERPOP-2025 Change to SHA-256/512 and drop SHA-1 for releases
* TINKERPOP-2026 Gremlin.Net.Driver should check ClientWebSocket.State before closing
* TINKERPOP-2031 Remove support for -i in gremlin-server.sh *(breaking)*
* TINKERPOP-2033 Maintain order of profile() annotations
* TINKERPOP-2034 Register synchronizedMap() with Gryo
* TINKERPOP-2037 Remove unused groovy-sql dependency
* TINKERPOP-2038 Make groovy script cache size configurable
* TINKERPOP-2039 Bump to Groovy 2.5.2 *(breaking)*
* TINKERPOP-2040 Improve flexibility of GroovyTranslator to handle custom types
* TINKERPOP-2041 Text Predicates
* TINKERPOP-2045 Remove non-indy groovy dependencies
* TINKERPOP-2049 Single argument with() overload
* TINKERPOP-2050 Add a :bytecode command to Gremlin Console
* TINKERPOP-2053 Provider OptionsStrategy for traversal configurations
* TINKERPOP-2055 Provide support for special number cases like Infinity in GraphSON
* TINKERPOP-2056 Use NumberHelper in Compare
* TINKERPOP-2059 Modulation of valueMap() *(breaking)*
* TINKERPOP-2060 Make Mutating steps non-final
* TINKERPOP-2061 Add with() configuration as global to a traversal
* TINKERPOP-2062 Add Traversal class to CoreImports
* TINKERPOP-2064 Add status attributes to results for gremlin-javascript
* TINKERPOP-2065 Optimize iterate() for remote traversals
* TINKERPOP-2066 Bump to Groovy 2.5.3
* TINKERPOP-2067 Allow getting raw data from Gremlin.Net.Driver.IGremlinClient
* TINKERPOP-2068 Bump Jackson Databind 2.9.7
* TINKERPOP-2069 Document configuration of Gremlin.Net
* TINKERPOP-2070 gremlin-javascript: Introduce Connection representation
* TINKERPOP-2071 gremlin-python: the graphson deserializer for g:Set should return a python set
* TINKERPOP-2072 Refactor custom type translation for ScriptTranslators *(breaking)*
* TINKERPOP-2073 Generate tabs for static code blocks
* TINKERPOP-2074 Ensure that only NuGet packages for the current version are pushed
* TINKERPOP-2075 Introduce ReferenceElementStrategy
* TINKERPOP-2077 VertexProgram.Builder should have a default create() method with no Graph
* TINKERPOP-2078 Hide use of EmptyGraph or RemoteGraph behind a more unified method for TraversalSource construction
* TINKERPOP-2079 Move RemoteGraph to test package *(breaking)*
* TINKERPOP-2084 For remote requests in console display the remote stack trace
* TINKERPOP-2092 Deprecate default GraphSON serializer fields
* TINKERPOP-2093 Bump to Groovy 2.5.4
* TINKERPOP-2097 Create a DriverRemoteConnection with an initialized Client
* TINKERPOP-2101 Support Spark 2.4
* TINKERPOP-2103 Remove deprecated submit() options on RemoteConnection *(breaking)*
* TINKERPOP-2104 Allow ImportCustomizer to handle fields
* TINKERPOP-2106 When gremlin executes timeout, throw TimeoutException instead of TraversalInterruptedException/InterruptedIOException
* TINKERPOP-2110 Allow Connection on Different Path (from /gremlin)
* TINKERPOP-2111 Add BulkSet as a GraphSON type *(breaking)*
* TINKERPOP-2114 Document common Gremlin anti-patterns
* TINKERPOP-2116 Explicit Bindings object for Python *(breaking)*
* TINKERPOP-2117 gremlin-python: Provide a better data structure for a Binding
* TINKERPOP-2119 Validate C# code samples in docs
* TINKERPOP-2121 Bump Jackson Databind 2.9.8

== TinkerPop 3.3.0 (Gremlin Symphony #40 in G Minor)

image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/gremlin-mozart.png[width=185]

[[release-3-3-10]]
=== TinkerPop 3.3.10 (Release Date: February 3, 2020)

* Improved error messaging for a `Cluster` with a bad `Channelizer` configuration in the Java driver.
* Made `Cluster` be able to open configuration file on resources directory.
* Implemented `Traversal.clone()` operations for all language variants.
* Refactored `PathProcessorStrategy` to use the marker model.
* Bump to Tornado 5.x for gremlin-python.
* Started keep-alive polling on `Connection` construction to ensure that a `Connection` doesn't die in the pool.
* Deprecated `TraversalStrategies.applyStrategies()`.
* Deprecated Jython support in `gremlin-python`.
* Deprecated `NioChannelizer` and related classes in `gremlin-driver` and `gremlin-server`.
* Fixed a bug in the `ClassCacheRequestCount` metric for `GremlinGroovyScriptEngine` which wasn't including the cache hit count, only the misses.
* Improved Gremlin Server executor thread handling on client close requests.
* Reverted: Modified Java driver to use IP address rather than hostname to create connections.
* Allow custom XMLInputFactory to be used with GraphMLReader.

==== Bugs

* TINKERPOP-2175 Executor thread is not returned on channel close
* TINKERPOP-2266 Keep alive not started at connection creation
* TINKERPOP-2274 Test of TinkerGraph Gremlin fail on Windows and non EN locale
* TINKERPOP-2332 JavaScript GLV: structure element toString() should internally call toString()
* TINKERPOP-2333 JavaScript GLV: GraphSON2/3 Edge deserialization is invalid

==== Improvements

* TINKERPOP-2307 Add better error message for badly configured Channelizer
* TINKERPOP-2309 Bump gremlinpython to Tornado 5.x
* TINKERPOP-2315 Implement some form of clone() or reset() for Traversal in GLVs
* TINKERPOP-2320 [SECURITY] XMLInputFactory initialization in GraphMLReader introduces
* TINKERPOP-2322 Deprecate Jython support
* TINKERPOP-2324 Deprecate the raw NIO support in the Java driver
* TINKERPOP-2329 JavaScript GLV: Update websocket library dependency
* TINKERPOP-2330 JavaScript GLV should expose GraphSON2Writer and GraphSONReader

[[release-3-3-9]]
=== TinkerPop 3.3.9 (Release Date: October 14, 2019)

* Exposed response status attributes in a `ResponseError` in gremlin-javascript.
* Added `ImmutableExplanation` for a `TraversalExplanation` that just contains data.
* Added support for `UnaryOperator` and `BinaryOperator` for `Lambda` instances.
* Fixed `TraversalExplanation` deserialization in GraphSON 2 and 3 which was not supported before in Java.
* Added support for custom request headers in Python.
* Fixed Java DSL annotation for generation of `addE()` which was formerly calling the wrong step.
* Deprecated `scriptEvaluationTimeout` in favor of the more generic `evaluationTimeout`.
* Bumped jackson-databind to 2.9.10 due to CVE-2019-14379, CVE-2019-14540, CVE-2019-16335.
* Added `ReservedKeysVerificationStrategy` to allow warnings or exceptions when certain keys are used for properties.
* Added the `AbstractWarningVerificationStrategy` base class for "warning" style `VerificationStrategy` implementations.
* Refactored `EdgeLabelVerificationStrategy` to use `AbstractWarningVerificationStrategy`.
* Added `EdgeLabelVerificationStrategy` to Python.
* Improved handling of `null` values in bytecode construction.
* Fixed Java driver authentication problems when calling the driver from multiple threads.
* Modified Java driver to use IP address rather than hostname to create connections.
* Fixed potential for `NullPointerException` with empty identifiers in `GraphStep`.
* Postponed the timing of transport creation to `connection.write` in Gremlin Python.
* Made `EventStrategy` compatible with multi-valued properties.
* Changed `TraversalOpProcessor` to throw a `SERVER_ERROR_SCRIPT_EVALUATION` (597) if lambdas don't compile.
* Bumped `commons-compress` to 1.19 due to CVE-2018-11771.
* gremlin-javascript: Use `socketError` Connection event to prevent exit on error and expose Connection events.

==== Bugs

* TINKERPOP-2159 EventStrategy doesn't handle multi-valued properties
* TINKERPOP-2283 GraphStep's ids null exception
* TINKERPOP-2285 Error object is unreachable
* TINKERPOP-2289 Use address instead of hostname for connection
* TINKERPOP-2290 Javascript GLV connection refused error handling
* TINKERPOP-2291 TraversalExplanation deserialization in GraphSON
* TINKERPOP-2298 Bytecode.java  flattenArguments throw exception when null
* TINKERPOP-2303 GremlinDsl generate addV instead of addE

==== Improvements

* TINKERPOP-1810 Add Lambda.binaryOperator and Lambda.unaryOperator
* TINKERPOP-1838 Python sample script
* TINKERPOP-2046 Gremlin-Python: Support custom request headers in WebSocket request
* TINKERPOP-2213 Replace scriptEvaluationTimeout in favor of something more suitable to bytecode
* TINKERPOP-2275 Update jackson databind 2.9.9.3+
* TINKERPOP-2277 Python sdk postpone the timing to create transport
* TINKERPOP-2280 Prevent use of T values as property key overloads

[[release-3-3-8]]
=== TinkerPop 3.3.8 (Release Date: August 5, 2019)

* Provided support for `withComputer()` in gremlin-javascript.
* Deprecated remote traversal side-effect retrieval and related infrastructure.
* Bumped to Groovy 2.4.17.
* Bumped to Jackson Databind 2.9.9.1.
* Fixed bug with Python in `g:Date` of GraphSON where local time zone was being used during serialization/deserialization.
* Improved error messaging when an attempt is made to serialize multi-properties to GraphML.
* Deprecated multi/meta-property support in `Neo4jGraph`.
* Improved exception and messaging for gt/gte/lt/lte when one of the object isn't a `Comparable`.
* Added test infrastructure to check for storage iterator leak.
* Fixed multiple iterator leaks in query processor.
* Fixed `optional()` so that the child traversal is treated as local.
* Changed default keep-alive time for driver to 3 minutes.
* Fixed bug where server-side keep-alive was not always disabled when its setting was zero.
* Added support for `hasNext()` in Javascript and .NET.
* Improved error messaging for invalid inputs to the TinkerGraph `IdManager` instances.
* Forced replacement of connections in Java driver for certain exception types that seem to ultimately kill the connection.
* Changed the `reverse()` of `desc` and `asc` on `Order` to not use the deprecated `decr` and `incr`.
* Fixed bug in `MatchStep` where the correct was not properly determined.
* Fixed bug where client/server exception mismatch when server throw StackOverflowError
* Added underscore suffixed steps and tokens in Gremlin-Python that conflict with global function names.
* Prevent exception when closing a session that doesn't exist.
* Allow predicates and traversals to be used as options in `BranchStep`.
* Ensure only a single final response is sent to the client with Gremlin Server.
* Deprecated `ResponseHandlerContext` with related infrastructure and folded its functionality into `Context` in Gremlin Server.
* Improved performance of `aggregate()` by avoiding excessive calls to `hasNext()` when the barrier is empty.

==== Bugs

* TINKERPOP-1619 TinkerGraphComputer worker count affects OptionalStep query results
* TINKERPOP-2224 Detect and fix resource leak
* TINKERPOP-2230 match() step unexpected behaviours
* TINKERPOP-2232 RemoteStrategy does not call parent class TraversalStrategy __init__
* TINKERPOP-2238 Fix remaining iterator leaks marked by @IgnoreIteratorLeak
* TINKERPOP-2241 Client exception don't match Server exception when server  throw StackOverflowError
* TINKERPOP-2248 Instability of driver for blocked requests
* TINKERPOP-2264 Gremlin Python should deserialize g:Date to UTC

==== Improvements

* TINKERPOP-1084 Branch option tokens should be allowed to be traversals.
* TINKERPOP-1921 Support hasNext terminal step in GLVs
* TINKERPOP-2020 Support withComputer() for javascript
* TINKERPOP-2223 Update jackson databind to 2.9.9
* TINKERPOP-2236 Improve error messaging for TinkerGraph IdManagers that fail on conversions
* TINKERPOP-2237 Prevent error when closing sessions that don't exist *(breaking)*
* TINKERPOP-2246 Consolidate the error propagation to the client
* TINKERPOP-2256 processAllStarts of AggregateStep should only be called when barrier is empty
* TINKERPOP-2260 Update jackson databind 2.9.9.1
* TINKERPOP-2265 Deprecate Traversal.getSideEffects() functionality for remoting purposes
* TINKERPOP-2270 Deprecate multi/metaproperty support in Neo4j
* TINKERPOP-2272 Rename steps and tokens that conflict with standard python functions

[[release-3-3-7]]
=== TinkerPop 3.3.7 (Release Date: May 28, 2019)

* Developed DSL pattern for gremlin-javascript.
* Generated uberjar artifact for Gremlin Console.
* Improved folding of `property()` step into related mutating steps.
* Added `inject()` to steps generated on the DSL `TraversalSource`.
* Removed `gperfutils` dependencies from Gremlin Console.
* Fixed `PartitionStrategy` when setting vertex label and having `includeMetaProperties` configured to `true`.
* Ensure `gremlin.sh` works when directories contain spaces.
* Prevented client-side hangs if metadata generation fails on the server.
* Fixed bug with `EventStrategy` in relation to `addE()` where detachment was not happening properly.
* Ensured that `gremlin.sh` works when directories contain spaces.
* Fixed bug in detachment of `Path` where embedded collection objects would prevent that process.
* Enabled `ctrl+c` to interrupt long running processes in Gremlin Console.
* Quieted "host unavailable" warnings for both the driver and Gremlin Console.
* Fixed construction of `g:List` from arrays in gremlin-javascript.
* Fixed bug in `GremlinGroovyScriptEngine` interpreter mode around class definitions.
* Implemented `EdgeLabelVerificationStrategy`.
* Fixed behavior of `P` for `within()` and `without()` in GLVs to be consistent with Java when using varargs.
* Cleared the input buffer after exceptions in Gremlin Console.
* Added parameter to configure the `processor` in the gremlin-javascript `client` constructor.
* Bumped `Netty` to 4.1.32.

==== Bugs

* TINKERPOP-2112 Folding in property() step is not being optimally performed
* TINKERPOP-2180 gremlin.sh doesn't work when directories contain spaces
* TINKERPOP-2183 InterpreterModeASTTransformation needs to be more specific about what it transforms
* TINKERPOP-2194 Enforcing an order on properties in one test method of ChooseTest
* TINKERPOP-2196 PartitionStrategy with includeMetaProperties(true) can't add labeled vertex
* TINKERPOP-2198 Documentation for Store contradicts itself
* TINKERPOP-2199 within step does not work with more than two parameters with python
* TINKERPOP-2200 AddEdgeStartStep used DetachedFactory.detach instead of EventStrategy.detach
* TINKERPOP-2204 Client receives no response on failed request
* TINKERPOP-2206 Certain types in javascript don't appear to serialize with a GraphSON type
* TINKERPOP-2212 Path is not detaching properly under certain conditions

==== Improvements

* TINKERPOP-2089 Javascript DSL support
* TINKERPOP-2179 Have o.a.t.g.driver.ser.SerializationException extend IOException
* TINKERPOP-2181 Allow ctrl+c to break out of a long running process in Gremlin Console
* TINKERPOP-2182 Remove gperfutils from Gremlin Console *(breaking)*
* TINKERPOP-2191 Implement EdgeLabelVerificationStrategy
* TINKERPOP-2211 Provide API to add per request option for a bytecode

[[release-3-3-6]]
=== TinkerPop 3.3.6 (Release Date: March 18, 2019)

* Docker images use user `gremlin` instead of `root`
* Added a new `ResponseStatusCode` for client-side serialization errors.
* Refactored use of `commons-lang` to use `common-lang3` only, though dependencies may still use `commons-lang`.
* Bumped `commons-lang3` to 3.8.1.
* Improved handling of client-side serialization errors that were formerly just being logged rather than being raised.
* Add Python `TraversalMetrics` and `Metrics` deserializers.
* Masked sensitive configuration options in the logs of `KryoShimServiceLoader`.
* Added `globalFunctionCacheEnabled` to the `GroovyCompilerGremlinPlugin` to allow that cache to be disabled.
* Added `globalFunctionCacheEnabled` override to `SessionOpProcessor` configuration.
* Added status code to `GremlinServerError` so that it would be more directly accessible during failures.
* Added GraphSON serialization support for `Duration`, `Char`, `ByteBuffer`, `Byte`, `BigInteger` and `BigDecimal` in `gremlin-python`.
* Added `ProfilingAware` interface to allow steps to be notified that `profile()` was being called.
* Fixed bug where `profile()` could produce negative timings when `group()` contained a reducing barrier.
* Improved logic determining the dead or alive state of a Java driver `Connection`.
* Improved handling of dead connections and the availability of hosts.
* Bumped `httpclient` to 4.5.7.
* Bumped `slf4j` to 1.7.25.
* Bumped `commons-codec` to 1.12.
* Fixed partial response failures when using authentication in `gremlin-python`.
* Fixed concurrency issues in `TraverserSet.toString()` and `ObjectWritable.toString()`.
* Fixed a bug in `InlineFilterStrategy` that mixed up and's and or's when folding merging conditions together.
* Fixed a bug in `PartitionStrategy` where `addE()` as a start step was not applying the partition.
* Improved handling of failing `Authenticator` instances thus improving server responses to drivers.
* Improved performance of `JavaTranslator` by reducing calls to `Method.getParameters()`.
* Implemented `EarlyLimitStrategy` which is supposed to significantly reduce backend operations for queries that use `range()`.
* Reduced chance of hash collisions in `Bytecode` and its inner classes.
* Added `Symbol.asyncIterator` member to the `Traversal` class to provide support for `await ... of` loops (async iterables).

==== Bugs

* TINKERPOP-2081 PersistedOutputRDD materialises rdd lazily with Spark 2.x
* TINKERPOP-2091 Wrong/Missing feature requirements in StructureStandardTestSuite
* TINKERPOP-2094 Gremlin Driver Cluster Builder serializer method does not use mimeType as suggested
* TINKERPOP-2095 GroupStep looks for irrelevant barrier steps
* TINKERPOP-2096 gremlinpython: AttributeError when connection is closed before result is received
* TINKERPOP-2100 coalesce() creating unexpected results when used with order()
* TINKERPOP-2105 Gremlin-Python connection not returned back to the pool on exception from gremlin server
* TINKERPOP-2113 P.Within() doesn't work when given a List argument

==== Improvements

* TINKERPOP-1889 JavaScript GLV: Use heartbeat to prevent connection timeout
* TINKERPOP-2010 Generate jsdoc for gremlin-javascript
* TINKERPOP-2013 Process tests that are auto-ignored stink
* TINKERPOP-2018 Generate API docs for Gremlin.Net
* TINKERPOP-2038 Make groovy script cache size configurable
* TINKERPOP-2050 Add a :bytecode command to Gremlin Console
* TINKERPOP-2062 Add Traversal class to CoreImports
* TINKERPOP-2065 Optimize iterate() for remote traversals
* TINKERPOP-2067 Allow getting raw data from Gremlin.Net.Driver.IGremlinClient
* TINKERPOP-2068 Bump Jackson Databind 2.9.7
* TINKERPOP-2069 Document configuration of Gremlin.Net
* TINKERPOP-2070 gremlin-javascript: Introduce Connection representation
* TINKERPOP-2071 gremlin-python: the graphson deserializer for g:Set should return a python set
* TINKERPOP-2073 Generate tabs for static code blocks
* TINKERPOP-2074 Ensure that only NuGet packages for the current version are pushed
* TINKERPOP-2077 VertexProgram.Builder should have a default create() method with no Graph
* TINKERPOP-2078 Hide use of EmptyGraph or RemoteGraph behind a more unified method for TraversalSource construction
* TINKERPOP-2084 For remote requests in console display the remote stack trace
* TINKERPOP-2092 Deprecate default GraphSON serializer fields
* TINKERPOP-2097 Create a DriverRemoteConnection with an initialized Client
* TINKERPOP-2102 Deprecate static fields on TraversalSource related to remoting
* TINKERPOP-2106 When gremlin executes timeout, throw TimeoutException instead of TraversalInterruptedException/InterruptedIOException
* TINKERPOP-2110 Allow Connection on Different Path (from /gremlin)
* TINKERPOP-2114 Document common Gremlin anti-patterns
* TINKERPOP-2118 Bump to Groovy 2.4.16
* TINKERPOP-2121 Bump Jackson Databind 2.9.8

[[release-3-3-5]]
=== TinkerPop 3.3.5 (Release Date: January 2, 2019)

This release also includes changes from <<release-3-2-11, 3.2.11>>.

* Fixed and/or folding in `InlineFilterStrategy`.
* Fixed configuration and serialization of `SubgraphStrategy` which was missing the `checkAdjacentVertices` flag.
* Captured `TraversalInterruptionException` and converted to `TimeoutException` for `GremlinExecutor`.
* Fixed a bug in `CoalesceStep` which squared the bulk if the step followed a `Barrier` step.
* Fixed a bug in `GroupStep` that assigned wrong reducing bi-operators
* Added `:bytecode` command to help developers debugging `Bytecode`-based traversals.
* Added option to set the path for the URI on the Java driver.
* Fixed `PersistedOutputRDD` to eager persist RDD by adding `count()` action calls.
* Deserialized `g:Set` to a Python `Set` in GraphSON in `gremlin-python`.
* Deprecated `StarGraph.builder()` and `StarGraph.Builder.build()` in favor of the more common "builder" patterns of `build()` and `create()` respectively.
* Deprecated `Serializers.DEFAULT_RESULT_SERIALIZER` and `DEFAULT_REQUEST_SERIALIZER`.
* Deprecated `TraversalSource#GREMLIN_REMOTE` and `TraversalSource#GREMLIN_REMOTE_CONNECTION_CLASS` moving them to `RemoteConnection`.
* Fixed the setting of the default label for a `ReferenceVertex` when the original vertex was of type `ComputerAdjacentVertex`.
* Changed Java driver to expect a generic `RemoteTraverser` object rather than the specific `DefaultRemoteTraverser`.
* Better handled server disconnect condition for the `gremlin-python` driver by throwing a clear exception.
* Display the remote stack trace in the Gremlin Console when scripts sent to the server fail.
* Added `AnonymousTraversalSource` which provides a more unified means of constructing a `TraversalSource`.
* Added `DriverRemoteConnection.using(Client)` to provide users better control over the number of connections being created.
* Changed behavior of GraphSON deserializer in gremlin-python such that `g:Set` returns a Python `Set`.
* Bumped to Groovy 2.4.16.
* Fixed bug that prevented `TraversalExplanation` from serializing properly with GraphSON.
* Changed behavior of `iterate()` in Python, Javascript and .NET to send `none()` thus avoiding unnecessary results being returned.
* Provided for a configurable class map cache in the `GremlinGroovyScriptEngine` and exposed that in Gremlin Server.
* `GraphProvider` instances can be annotated with `OptOut` configurations that will be applied in addition to the `OptOut` instances on a `Graph`.

==== Bugs

* TINKERPOP-2081 PersistedOutputRDD materialises rdd lazily with Spark 2.x
* TINKERPOP-2091 Wrong/Missing feature requirements in StructureStandardTestSuite
* TINKERPOP-2094 Gremlin Driver Cluster Builder serializer method does not use mimeType as suggested
* TINKERPOP-2095 GroupStep looks for irrelevant barrier steps
* TINKERPOP-2096 gremlinpython: AttributeError when connection is closed before result is received
* TINKERPOP-2100 coalesce() creating unexpected results when used with order()
* TINKERPOP-2113 P.Within() doesn't work when given a List argument

==== Improvements

* TINKERPOP-1889 JavaScript GLV: Use heartbeat to prevent connection timeout
* TINKERPOP-2010 Generate jsdoc for gremlin-javascript
* TINKERPOP-2013 Process tests that are auto-ignored stink
* TINKERPOP-2018 Generate API docs for Gremlin.Net
* TINKERPOP-2038 Make groovy script cache size configurable
* TINKERPOP-2050 Add a :bytecode command to Gremlin Console
* TINKERPOP-2062 Add Traversal class to CoreImports
* TINKERPOP-2065 Optimize iterate() for remote traversals
* TINKERPOP-2067 Allow getting raw data from Gremlin.Net.Driver.IGremlinClient
* TINKERPOP-2069 Document configuration of Gremlin.Net
* TINKERPOP-2070 gremlin-javascript: Introduce Connection representation
* TINKERPOP-2071 gremlin-python: the graphson deserializer for g:Set should return a python set
* TINKERPOP-2073 Generate tabs for static code blocks
* TINKERPOP-2074 Ensure that only NuGet packages for the current version are pushed
* TINKERPOP-2077 VertexProgram.Builder should have a default create() method with no Graph
* TINKERPOP-2078 Hide use of EmptyGraph or RemoteGraph behind a more unified method for TraversalSource construction
* TINKERPOP-2084 For remote requests in console display the remote stack trace
* TINKERPOP-2092 Deprecate default GraphSON serializer fields
* TINKERPOP-2097 Create a DriverRemoteConnection with an initialized Client
* TINKERPOP-2102 Deprecate static fields on TraversalSource related to remoting
* TINKERPOP-2106 When gremlin executes timeout, throw TimeoutException instead of TraversalInterruptedException/InterruptedIOException
* TINKERPOP-2110 Allow Connection on Different Path (from /gremlin)
* TINKERPOP-2114 Document common Gremlin anti-patterns
* TINKERPOP-2118 Bump to Groovy 2.4.16
* TINKERPOP-2121 Bump Jackson Databind 2.9.8

[[release-3-3-4]]
=== TinkerPop 3.3.4 (Release Date: October 15, 2018)

This release also includes changes from <<release-3-2-10, 3.2.10>>.

* Added synchronized `Map` to Gryo 3.0 registrations.
* Removed `timedInterrupt` from documentation as a way to timeout.
* Deprecated `Order` for `incr` and `decr` in favor of `asc` and `desc`.
* Fixed bug in `math()` for OLAP where `ComputerVerificationStrategy` was incorrectly detecting path label access and preventing execution.

==== Bugs

* TINKERPOP-1898 Issue with bindings in strategies and lambdas
* TINKERPOP-1933 gremlin-python maximum recursion depth exceeded on large responses
* TINKERPOP-1958 TinkerGraphCountStrategy can return wrong counts
* TINKERPOP-1961 Duplicate copies of images directory in docs
* TINKERPOP-1962 GroovyTranslator doesn't handle empty maps
* TINKERPOP-1963 Use of reducing step in choose()
* TINKERPOP-1972 inject() tests are throwing exceptions in .NET GLV tests
* TINKERPOP-1978 Check for Websocket connection state when retrieved from Connection Pool missing
* TINKERPOP-1979 Several OLAP issues in MathStep
* TINKERPOP-1988 minor error in documentation
* TINKERPOP-1999 [Java][gremlin-driver] Query to a remote server via the websocket client hangs indefinitely if the server becomes unavailable
* TINKERPOP-2005 Intermittent NullPointerException in response handling
* TINKERPOP-2009 Pick.any and Pick.none should be exposed in Gremlin-JavaScript
* TINKERPOP-2021 Prevent maximum recursion depth failure
* TINKERPOP-2030 KeepAlive task executed for every Connection.write call
* TINKERPOP-2032 Update jython-standalone
* TINKERPOP-2044 Cannot reconnect to Azure cosmos host that becomes available again

==== Improvements

* TINKERPOP-1113 GraphComputer subclasses should support native methods
* TINKERPOP-1365 Log the seed used to initialize Random in tests
* TINKERPOP-1447 Add some JavaScript intelligence to the documentation so that comments and output are not copied in a copy paste
* TINKERPOP-1595 Go through TraversalVertexProgram with a profile and optimize.
* TINKERPOP-1778 Do not promote timedInterrupt option for Gremlin Server script processing
* TINKERPOP-1780 Add authentication tests for gremlin-python
* TINKERPOP-1836 .NET sample project
* TINKERPOP-1841 Include Python GLV tests on TravisCI
* TINKERPOP-1864 Gremlin Python tests for GraphSON 2.0 and 3.0
* TINKERPOP-1897 Provide Docker images of Gremlin Server and Console
* TINKERPOP-1945 Add support for extended GraphSon types to Gremlin.net
* TINKERPOP-1951 gremlin-server.bat doesn't support paths containing spaces
* TINKERPOP-1956 Deprecate Order incr/decr for asc/desc
* TINKERPOP-1959 Provide a way to submit scripts to the server in gremlin-javascript
* TINKERPOP-1968 Refactor elements of Gremlin Server testing
* TINKERPOP-1976 Include Computer tests for GLVs
* TINKERPOP-1977 Gremlin-JavaScript: Support SASL authentication
* TINKERPOP-1985 Update position on bulk loading
* TINKERPOP-1989 Preserve order that plugins are applied in Gremlin Console
* TINKERPOP-1995 DriverRemoteConnection close() method returns undefined
* TINKERPOP-2011 Use NumberHelper on choose()
* TINKERPOP-2012 Target .NET Standard 2.0 for Gremlin.Net
* TINKERPOP-2015 Allow users to configure the WebSocket connections
* TINKERPOP-2016 Upgrade Jackson FasterXML to 2.9.5 or later to fix security vulnerability
* TINKERPOP-2017 Check for Column in by()
* TINKERPOP-2022 Cluster SSL should trust default ca certs by default
* TINKERPOP-2023 Gremlin Server should not create self-signed certs *(breaking)*
* TINKERPOP-2024 Gremlin Server Application archetype should connect via withRemote
* TINKERPOP-2025 Change to SHA-256/512 and drop SHA-1 for releases
* TINKERPOP-2026 Gremlin.Net.Driver should check ClientWebSocket.State before closing
* TINKERPOP-2034 Register synchronizedMap() with Gryo
* TINKERPOP-2035 Gremlin-JavaScript: Pass custom headers to the websocket connection
* TINKERPOP-2040 Improve flexibility of GroovyTranslator to handle custom types
* TINKERPOP-2045 Remove non-indy groovy dependencies
* TINKERPOP-2055 Provide support for special number cases like Infinity in GraphSON
* TINKERPOP-2056 Use NumberHelper in Compare

[[release-3-3-3]]
=== TinkerPop 3.3.3 (Release Date: May 8, 2018)

This release also includes changes from <<release-3-2-9, 3.2.9>>.

* Implemented `TraversalSelectStep` which allows to `select()` runtime-generated keys.
* Coerced `BulkSet` to `g:List` in GraphSON 3.0.
* Deprecated `CredentialsGraph` DSL in favor of `CredentialsTraversalDsl` which uses the recommended method for Gremlin DSL development.
* Allowed `iterate()` to be called after `profile()`.

==== Bugs

* TINKERPOP-1869 Profile step and iterate do not play nicely with each other
* TINKERPOP-1927 Gherkin scenario expects list with duplicates, but receives g:Set
* TINKERPOP-1947 Path history isn't preserved for keys in mutations

==== Improvements

* TINKERPOP-1628 Implement TraversalSelectStep
* TINKERPOP-1755 No docs for ReferenceElements
* TINKERPOP-1903 Credentials DSL should use the Java annotation processor
* TINKERPOP-1912 Remove MD5 checksums
* TINKERPOP-1934 Bump to latest version of httpclient
* TINKERPOP-1936 Performance enhancement to Bytecode deserialization
* TINKERPOP-1943 JavaScript GLV: Support GraphSON3
* TINKERPOP-1944 JavaScript GLV: DriverRemoteConnection is not exported in the root module
* TINKERPOP-1950 Traversal construction performance enhancements
* TINKERPOP-1953 Bump to Groovy 2.4.15

[[release-3-3-2]]
=== TinkerPop 3.3.2 (Release Date: April 2, 2018)

This release also includes changes from <<release-3-2-8, 3.2.8>>.

* Fixed regression issue where the HTTPChannelizer doesn't instantiate the specified AuthenticationHandler.
* Defaulted GLV tests for gremlin-python to run for GraphSON 3.0.
* Fixed a bug with `Tree` serialization in GraphSON 3.0.
* In gremlin-python, the GraphSON 3.0 `g:Set` type is now deserialized to `List`.

==== Bugs

* TINKERPOP-1053 installed plugins are placed in a directory relative to where gremlin.sh is started
* TINKERPOP-1509 Failing test case for tree serialization
* TINKERPOP-1738 Proper functioning of GraphSONReader depends on order of elements in String representation
* TINKERPOP-1758 RemoteStrategy should be before all other DecorationStrategies.
* TINKERPOP-1855 Update Rexster links
* TINKERPOP-1858 HttpChannelizer regression: Does not create specified AuthenticationHandler
* TINKERPOP-1859 Complex instance of P not serializing to bytecode properly
* TINKERPOP-1860 valueMap(True) result in error in gremlin-python
* TINKERPOP-1862 TinkerGraph VertexProgram message passing doesn't work properly when using Direction.BOTH
* TINKERPOP-1867 union() can produce extra traversers
* TINKERPOP-1872 Apply edgeFunction in SparkMessenger
* TINKERPOP-1873 min() and max() work only in the range of Integer values
* TINKERPOP-1874 P does not appear to be serialized consistently in GraphSON
* TINKERPOP-1875 Gremlin-Python only aggregates to list when using GraphSON3
* TINKERPOP-1879 Gremlin Console does not resepect equal sign for flag argument assignments
* TINKERPOP-1880 Gremlin.NET Strong name signature could not be verified. (HRESULT: 0x80131045)
* TINKERPOP-1883 gremlinpython future will never return
* TINKERPOP-1890 getAnonymousTraversalClass() is not being generated for Java DSLs
* TINKERPOP-1891 Serialization of P.not() for gremlin-javascript
* TINKERPOP-1892 GLV test failures for .NET
* TINKERPOP-1894 GraphSONMessageSerializerV2d0 fails to deserialize valid P.not()
* TINKERPOP-1896 gremlin-python lambdas error
* TINKERPOP-1907 Fix failing GLV test for withSack() in .NET
* TINKERPOP-1917 gx:BigDecimal serialization broken in Gremlin.Net on systems with ',' as decimal separator
* TINKERPOP-1918 Scenarios fail because of wrong numerical types
* TINKERPOP-1919 Gherkin runner doesn't work with P.And() and P.Or() in Gremlin.Net
* TINKERPOP-1920 Tests fail because P.Within() arguments are wrapped in an array in Gremlin.Net
* TINKERPOP-1922 Gherkin features fail that contain P.not() in Gremlin.Net

==== Improvements

* TINKERPOP-1357 Centrality Recipes should mention pageRank and OLAP.
* TINKERPOP-1489 Provide a Javascript Gremlin Language Variant
* TINKERPOP-1586 SubgraphStrategy in OLAP
* TINKERPOP-1726 Support WebSockets ping/pong keep-alive in Gremlin server
* TINKERPOP-1842 iterate() missing in terminal steps documentation
* TINKERPOP-1844 Python GLV test should run for GraphSON 3.0 *(breaking)*
* TINKERPOP-1850 Range step has undocumented special values
* TINKERPOP-1854 Support lambdas in Gremlin.Net
* TINKERPOP-1857 GLV test suite consistency and completeness
* TINKERPOP-1863 Delaying the setting of requestId till the RequestMessage instantiation time
* TINKERPOP-1865 Run Gremlin .NET GLV tests with GraphSON 3.0
* TINKERPOP-1866 Support g:T for .NET
* TINKERPOP-1868 Support inject source step in Gremlin.Net
* TINKERPOP-1870 n^2 synchronious operation in OLAP WorkerExecutor.execute() method
* TINKERPOP-1871 Exception handling is slow in element  ReferenceElement creation
* TINKERPOP-1877 Add new graph data for specialized testing scenarios
* TINKERPOP-1884 Bump to Netty 4.0.56.Final
* TINKERPOP-1885 Various Gremlin.Net documentation updates
* TINKERPOP-1901 Enable usage of enums in more steps in Gremlin.Net
* TINKERPOP-1908 Bump to Groovy 2.4.14
* TINKERPOP-1911 Refactor JavaTranslator to cache all reflective calls
* TINKERPOP-1914 Support construct a GremlinServer instance from gremlin executor service

[[release-3-3-1]]
=== TinkerPop 3.3.1 (Release Date: December 17, 2017)

This release also includes changes from <<release-3-2-7, 3.2.7>>.

* Added `NoneStep` and `Traversal.none()` for full filtering integration with `iterate()`.
* Fixed bug in serialization of `Path` for GraphSON 3.0 in `gremlin-python`.
* Added support for GraphSON 3.0 in Gremlin.Net.
* Added `math()`-step which supports scientific calculator capabilities for numbers within a traversal.
* Added missing `GraphTraversalSource.addE()`-method to `GremlinDslProcessor`.
* Changed `to()` and `from()` traversal-based steps to take a wildcard `?` instead of of `E`.
* Added `addV(traversal)` and `addE(traversal)` so that created element labels can be determined dynamically.
* `PageRankVertexProgram` supports `maxIterations` but will break out early if epsilon-based convergence occurs.
* Added support for epsilon-based convergence in `PageRankVertexProgram`.
* Fixed two major bugs in how PageRank was being calculated in `PageRankVertexProgram`.
* Added `Io.requiresVersion(Object)` to allow graph providers a way to check the `Io` type and version being constructed.
* Defaulted `IoCore.gryo()` and `IoCore.graphson()` to both use their 3.0 formats which means that `Graph.io()` will use those by default.
* Bumped Neo4j 3.2.3

==== Bugs

* TINKERPOP-1773 Lop should be created as a "software" and not a "person"
* TINKERPOP-1783 PageRank gives incorrect results for graphs with sinks *(breaking)*
* TINKERPOP-1799 Failure to serialize path() in gremlin-python
* TINKERPOP-1847 tinkergraph-gremlin dependency on gremlin-test, bad scope?

==== Improvements

* TINKERPOP-1632 Create a set of default functions
* TINKERPOP-1692 Bump to Neo4j 3.2.3
* TINKERPOP-1717 Update name and link of DynamoDB storage backend in landing page
* TINKERPOP-1730 Gremlin .NET support for GraphSON 3.0
* TINKERPOP-1767 Method for graph providers to check an IO version and type
* TINKERPOP-1793 addE() should allow dynamic edge labels
* TINKERPOP-1834 Consider iterate() as a first class step

[[release-3-3-0]]
=== TinkerPop 3.3.0 (Release Date: August 21, 2017)

This release also includes changes from <<release-3-2-6, 3.2.6>>.

* Removed previously deprecated `ScriptElementFactory`.
* Added `GraphTraversalSource.addE(String)` in support of `g.addE().from().to()`.
* Added support for `to(Vertex)` and `from(Vertex)` as a shorthand for `to(V(a))` and `from(V(b))`.
* Bumped to support Spark 2.2.0.
* Detected if type checking was required in `GremlinGroovyScriptEngine` and disabled related infrastructure if not.
* Removed previously deprecated `GraphTraversal.selectV3d0()` step.
* Removed previously deprecated `DetachedEdge(Object,String,Map,Pair,Pair)` constructor.
* Removed previously deprecated `Bindings` constructor. It is now a private constructor.
* Removed previously deprecated `TraversalSource.withBindings()`.
* Removed previously deprecated `GraphTraversal.sack(BiFunction,String)`.
* `TraversalMetrics` and `Metrics` Gryo 1.0 formats changed given internal changes to their implementations.
* Made `TraversalMetrics` safe to write to from multiple threads.
* Removed previously deprecated `TraversalSideEffects` methods.
* Removed previously deprecated `finalization.LazyBarrierStrategy` (moved to `optimization.LazyBarrierStrategy`).
* Removed previously deprecated `Constants` in Hadoop.
* Removed previously deprecated `VertexComputing.generateComputer(Graph)`.
* Removed previously deprecated `ConfigurationTraversal`.
* Established the Gryo 3.0 format.
* `GryoVersion` now includes a default `ClassResolver` to supply to the `GryoMapper`.
* `GryoClassResolver` renamed to `GryoClassResolverV1d0` which has an abstract class that for providers to extend in `AbstractGryoClassResolver`.
* Removed previously deprecated `Order` enums of `keyIncr`, `keyDecr`, `valueIncr`, and `valueDecr.`
* Removed previously deprecated `GraphTraversal.mapKeys()` step.
* Removed previously deprecated `GraphTraversal.mapValues()` step.
* Removed previously deprecated `GraphTraversal#addV(Object...)`.
* Removed previously deprecated `GraphTraversal#addE(Direction, String, String, Object...)`.
* Removed previously deprecated `GraphTraversal#addOutE(String, String, Object...)`.
* Removed previously deprecated `GraphTraversal#addInV(String, String, Object...)`.
* Removed previously deprecated `GraphTraversal.groupV3d0()` and respective `GroupSideEffectStepV3d0` and `GroupStepV3d0`.
* Removed previously deprecated `TraversalSource.Builder` class.
* Removed previously deprecated `ConnectiveP`, `AndP`, `OrP` constructors.
* Removed previously deprecated `TraversalScriptFunction` class.
* Removed previously deprecated `TraversalScriptHelper` class.
* Removed previously deprecated `ScriptEngineCache` class.
* Removed previously deprecated `CoreImports` class.
* Removed previously deprecated `GremlinJythonScriptEngine#()` constructor.
* Removed access to previously deprecated `CoreGremlinPlugin#INSTANCE` field.
* `gremlin.sh` and `gremln.bat` no longer support the option to pass a script as an argument for execution mode without using the `-i` option.
* Graphite and Ganglia are no longer packaged with the Gremlin Server distribution.
* `TransactionException` is no longer a class of `AbstractTransaction` and it extends `RuntimeException`.
* Included an ellipse on long property names that are truncated.
* Renamed `RangeByIsCountStrategy` to `CountStrategy`.
* Added more specific typing to various `__` traversal steps. E.g. `<A,Vertex>out()` is `<Vertex,Vertex>out()`.
* Updated Docker build scripts to include Python dependencies (NOTE: users should remove any previously generated TinkerPop Docker images).
* Added "attachment requisite" `VertexProperty.element()` and `Property.element()` data in GraphSON serialization.
* GraphSON 3.0 is now the default serialization format in TinkerGraph and Gremlin Server.
* Changed `ServerGremlinExecutor` to not use generics since there really is no flexibility in the kind of `ScheduledExecutorService` that will be used.
* Removed support for passing a byte array on the `sasl` parameter.
* Removed previously deprecated `GraphSONMapper$Builder#embedTypes` option.
* Removed previously deprecated `:remote config timeout max`.
* Removed previously deprecated `ConnectionPoolSettings.sessionId` and `ConnectionPoolSettings.optionalSessionId()`.
* Removed previously deprecated `reconnectInitialDelay` setting from the Java driver.
* Removed previously deprecated `useMapperFromGraph` option.
* Established the GraphSON 3.0 format with new `g:Map`, `g:List` and `g:Set` types.
* Removed previously deprecated `Io.Builder#registry(IoRegistry)` method.
* Removed previously deprecated `GryoMessageSerializerV1d0(GryoMapper)` constructor.
* Removed previously deprecated `TinkerIoRegistry`.
* Removed previously deprecated `getInstance()` methods on all TinkerPop classes.
* Removed previously deprecated `VertexPropertyFeatures.supportsAddProperty()`.
* Removed previously deprecated TinkerGraph configuration member variables.
* Removed previously deprecated `Transaction.submit(Function)`.
* Removed previously deprecated `OpSelectorHandler.errorMeter` and `AbstractEvalOpProcessor.errorMeter` fields.
* Removed previously deprecated `AbstractEvalOpProcessor.validBindingName` field.
* Removed previously deprecated `SimpleAuthenticator.CONFIG_CREDENTIALS_LOCATION` field.
* Removed previously deprecated `IteratorHandler`, `NioGremlinResponseEncoder` and `WsGremlinResponseEncoder` classes.
* Removed previously deprecated `Session.kill()` and `Session.manualKill()`.
* Removed previously deprecated `Authenticator.newSaslNegotiator()` and its method implementations in classes that were assignable to that interface.
* Removed `gremlin-groovy-test`.
* Removed previously deprecated "G" functions in `gremlin-groovy` (i.e. `GFunction`).
* Removed references to the old `GremlinPlugin` system that was in `gremlin-groovy` - the revised `GremlinPlugin` system in `gremlin-core` is the only one now in use.
* `GremlinGroovyScriptEngine` no longer implements the now removed `DependencyManager`.
* Added `Vertex`, `Edge`, `VertexProperty`, and `Property` serializers to Gremlin-Python and exposed tests that use graph object arguments.
* `Bytecode.getSourceInstructions()` and `Bytecode.getStepInstructions()` now returns `List<Instruction>` instead of `Iterable<Instruction>`.
* Added various `TraversalStrategy` registrations with `GryoMapper`.
* Fixed a naming mistake in Gremlin-Python: `IdentityRemoveStrategy` is now called `IdentityRemovalStrategy`.
* Added `TranslationStrategy` test infrastructure that verifies `Bytecode` generated from a translation is equal to the original `Bytecode`.
* Moved `NumberHelper` into the `org.apache.tinkerpop.gremlin.util` package.
* Added `Pop.mixed` instead of using `null` to represent such semantics.
* `select()`-step now defaults to using `Pop.last` instead of `Pop.mixed`.
* Added `gremlin-io-test` module to validate IO formats.
* `RequestMessage` and `ResponseMessage` are now registered with `GryoMapper` as part of the TinkerPop range of type identifiers.
* Removed previously deprecated `Console` constructor that took a `String` as an argument from `gremlin-console`.
* Removed previously deprecated `ConcurrentBindings` from `gremlin-groovy`.
* Removed previously deprecated `ScriptExecutor` from `gremlin-groovy`.
* Removed previously deprecated `SandboxExtension` from `gremlin-groovy`.
* Removed previously deprecated `GremlinGroovyScriptEngine` constructor that took `ImportCustomizerProvider` as an argument from `gremlin-groovy`.
* Removed previously deprecated `GremlinGroovyScriptEngine#plugins()` from `gremlin-groovy`.
* Added `OptionalStep` for use with `optional()` to better handle issues associated with branch side-effects.
* `UnfoldStep` now supports unfolding of arrays.
* Removed all performance tests that were not part of `gremlin-benchmark`.
* Removed dependency on `junit-benchmarks` and it's related reference to `h2`.
* Moved the source for the "home page" into the repository under `/site` so that it easier to accept contributions.
* Added `UnshadedKryoShimService` as the new default serializer model for `SparkGraphComputer`.
* `GryoRegistrator` is more efficient than the previous `GryoSerializer` model in `SparkGraphComputer`.
* Added support for `IoRegistry` custom serialization in Spark/Giraph and provided a general `hadoop-gremlin` test suite.
* Replaced term `REST` with `HTTP` to remove any confusion as to the design of the API.
* Moved `gremlin-benchmark` under `gremlin-tools` module.
* Added `gremlin-tools` and its submodule `gremlin-coverage`.
* Removed `tryRandomCommit()` from `AbstractGremlinTest`.
* Changed `gremlin-benchmark` system property for the report location to `benchmarkReportDir` for consistency.
* Added SysV and systemd init scripts.
* `GraphTraversal.valueMap(includeTokens,propertyKeys...)` now returns a `Map<Object,E>` since keys could be `T.id` or `T.label`.
* Added `skip(long)` and `skip((Scope,long)` which call the `range(low,high)` equivalents with -1 as the high.
* Added Kerberos authentication to `gremlin-server` for websockets and nio transport.
* Added audit logging of authenticated users and gremlin queries to `gremlin-server`.

==== Bugs

* TINKERPOP-1211 UnfoldStep should unfold arrays. *(breaking)*
* TINKERPOP-1426 GryoSerializer should implement Java serialization interface
* TINKERPOP-1465 Remove deprecated newSaslNegotiator *(breaking)*
* TINKERPOP-1483 PropertyMapStep returns Map<String,E> but puts non String keys in it!
* TINKERPOP-1520 Difference between 'has' step generated graphson2.0 in java and python glv implementation
* TINKERPOP-1533 Storage and IoRegistry
* TINKERPOP-1597 PathRetractionStrategy messing up certain traversals
* TINKERPOP-1635 gremlin-python: Duplicate serialization of element property in PropertySerializer
* TINKERPOP-1658 Graphson2 map keys are serialised as strings
* TINKERPOP-1716 Traversal strategies are not applied with remote in Gremlin Console

==== Improvements

* TINKERPOP-832 Remove deprecated addV/E/InE/OutE methods *(breaking)*
* TINKERPOP-833 Remove deprecated GremlinGroovyScriptEngine constructor and plugins() *(breaking)*
* TINKERPOP-834 Remove deprecated sack() method *(breaking)*
* TINKERPOP-880 Remove deprecated GroupStepV3d0 and GroupSideEffectStepV3d0 *(breaking)*
* TINKERPOP-929 Remove Deprecated TinkerGraph public static methods. *(breaking)*
* TINKERPOP-980 Add a service script or daemon mode in the distribution *(breaking)*
* TINKERPOP-999 ServerGremlinExecutor construction need not use generics for ExecutorService *(breaking)*
* TINKERPOP-1004 Make Transaction.commit() failures consistent across implementations. *(breaking)*
* TINKERPOP-1010 Remove deprecated credentialsDbLocation for SimpleAuthenticator *(breaking)*
* TINKERPOP-1024 Remove deprecated tryRandomCommit() *(breaking)*
* TINKERPOP-1028 Remove deprecated ConnectionPoolSettings session settings *(breaking)*
* TINKERPOP-1040 Remove deprecated SandboxExtension *(breaking)*
* TINKERPOP-1046 Remove deprecated Gremlin Server handler implementations *(breaking)*
* TINKERPOP-1049 Remove deprecated error meter member variables in Gremlin Server handlers *(breaking)*
* TINKERPOP-1094 Remove deprecated VertexPropertyFeatures.FEATURE_ADD_PROPERTY *(breaking)*
* TINKERPOP-1116 Some anonymous traversal steps can be hard typed. *(breaking)*
* TINKERPOP-1130 Each release should store Kryo/GraphSON/GraphML versions to ensure future compatibility *(breaking)*
* TINKERPOP-1142 Remove deprecated valueIncr, valueDecr, keyIncr, keyDecr. *(breaking)*
* TINKERPOP-1169 Remove deprecated TraversalScriptFunction and TraversalScriptHelper *(breaking)*
* TINKERPOP-1170 Remove deprecated ConfigurationTraversal. *(breaking)*
* TINKERPOP-1171 Remove deprecated TraversalSource.Builder *(breaking)*
* TINKERPOP-1235 Remove deprecated ProcessPerformanceSuite and TraversalPerformanceTest *(breaking)*
* TINKERPOP-1275 Remove deprecated max setting for :remote *(breaking)*
* TINKERPOP-1283 Remove deprecated ScriptExecutor *(breaking)*
* TINKERPOP-1289 Remove deprecated ConnectiveP, AndP, and OrP constructors. *(breaking)*
* TINKERPOP-1291 Remove deprecated mapValues and mapKeys methods *(breaking)*
* TINKERPOP-1313 Rename RangeByIsCountStrategy *(breaking)*
* TINKERPOP-1316 Remove deprecated constructor from GryoMessageSerializers *(breaking)*
* TINKERPOP-1327 Bring GryoRegistrator to the forefront and deprecate GryoSerializer *(breaking)*
* TINKERPOP-1363 Cleanup Docker build script for next major release *(breaking)*
* TINKERPOP-1369 Replace REST API with HTTP API
* TINKERPOP-1389 Support Spark 2.0.0
* TINKERPOP-1399 NumberHelper needs to go into util and have a private constructor *(breaking)*
* TINKERPOP-1404 Path/label optimization
* TINKERPOP-1408 Remove Deprecated Io.Builder.registry() *(breaking)*
* TINKERPOP-1414 Change default GraphSON version to 3.0 *(breaking)*
* TINKERPOP-1420 Remove deprecated ConcurrentBindings in gremlin-groovy *(breaking)*
* TINKERPOP-1421 Remove deprecated ControlOps *(breaking)*
* TINKERPOP-1427 GraphSON 3.0 needs collection types and consistent number typing.
* TINKERPOP-1443 Use an API checker during build
* TINKERPOP-1445 Large nested VertexProperties and Properties do not get printed well
* TINKERPOP-1454 Create Serializers for Graph objects in Gremlin-Python
* TINKERPOP-1481 Remove deprecated reconnectInitialDelay in Java driver *(breaking)*
* TINKERPOP-1485 Move source for TinkerPop site to source code repo
* TINKERPOP-1506 Optional/Coalesce should not allow sideEffect traversals.
* TINKERPOP-1514 Restructure for gremlin-tools module *(breaking)*
* TINKERPOP-1524 Bytecode.getXXXInstructions should return a List, not Iterable.
* TINKERPOP-1526 Remove deprecated Session kill() overloads *(breaking)*
* TINKERPOP-1536 Include GLVs in Docker build
* TINKERPOP-1541 Select should default to Pop.last semantics *(breaking)*
* TINKERPOP-1549 Implement skip()
* TINKERPOP-1550 Make Graphite and Ganglia optional dependencies
* TINKERPOP-1563 Remove deprecated getInstance() methods *(breaking)*
* TINKERPOP-1565 Setup GraphSON 3.0
* TINKERPOP-1566 Kerberos authentication for gremlin-server
* TINKERPOP-1574 Get rid of untyped GraphSON in 3.0
* TINKERPOP-1603 Remove support for SASL byte array in protocol *(breaking)*
* TINKERPOP-1612 Remove gremlin-groovy-test module *(breaking)*
* TINKERPOP-1621 Remove deprecated GremlnPlugin and related infrastructure *(breaking)*
* TINKERPOP-1622 Remove deprecated G functions in gremlin-groovy *(breaking)*
* TINKERPOP-1651 Remove deprecated gremlin.sh init syntax *(breaking)*
* TINKERPOP-1686 Make TraversalMetrics thread safe *(breaking)*
* TINKERPOP-1698 Gryo 3.0
* TINKERPOP-1699 Remove deprecated userMapperFromGraph *(breaking)*
* TINKERPOP-1700 Remove deprecated embedTypes option
* TINKERPOP-1706 Remove deprecated ScriptEngineCache and related dead code *(breaking)*
* TINKERPOP-1715 Bump to Spark 2.2
* TINKERPOP-1719 Remove deprecated Traversal related code *(breaking)*
* TINKERPOP-1720 Remove deprecated Hadoop code *(breaking)*
* TINKERPOP-1721 Remove deprecated Bindings related code *(breaking)*
* TINKERPOP-1724 Remove deprecated ScriptElementFactory
* TINKERPOP-1729 Remove deprecated select steps.
* TINKERPOP-1740 Add vertex parameter overload to to() and from()
* TINKERPOP-1747 Streamline inheritance for gremlin-python GraphSON serializer classes

== TinkerPop 3.2.0 (Nine Inch Gremlins)

image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/nine-inch-gremlins.png[width=185]

[[release-3-2-11]]
=== TinkerPop 3.2.11 (Release Date: January 2, 2019)

* Bumped to Jackson Databind 2.9.8

==== Improvements

* TINKERPOP-2074 Ensure that only NuGet packages for the current version are pushed
* TINKERPOP-2121 Bump Jackson Databind 2.9.8

[[release-3-2-10]]
=== TinkerPop 3.2.10 (Release Date: October 15, 2018)

* Removed conflicting non-indy groovy core dependency
* Bumped jython-standalone 2.7.1
* Added a delegate to the Gremlin.Net driver that can be used to configure the WebSocket connection.
* SSL security enhancements
* Added Gremlin version to Gremlin Server startup logging output.
* Fixed problem with Gremlin Server sometimes returning an additional message after a failure.
* Allowed spaces in classpath for `gremlin-server.bat`.
* Fixed bug in traversals that used Python lambdas with strategies in `gremlin-python`.
* Modified Maven archetype for Gremlin Server to use remote traversals rather than scripts.
* Added an system error code for failed plugin installs for Gremlin Server `-i` option.
* Fixed bug in keep-alive requests from over-queuing cancelled jobs.
* Match numbers in `choose()` options using `NumberHelper` (match values, ignore data type).
* Added support for GraphSON serialization of `Date` in Javascript.
* Added synchronized `Map` to Gryo 1.0 registrations.
* Added `Triple` to Gryo 1.0 registrations.
* Added support for `Double.NaN`, `Double.POSITIVE_INFINITY` and `Double.NEGATIVE_INFINITY`.
* Improved escaping of special characters in strings passed to the `GroovyTranslator`.
* Added `Cluster` configuration option to set a custom validation script to use to test server connectivity in the Java driver.
* Improved ability of `GroovyTranslator` to handle more types supported by GraphSON.
* Improved ability of `GroovyTranslator` to handle custom types.
* Added better internal processing of `Column` in `by(Function)`.
* Added `hasNext()` support on `Traversal` for `gremlin-python`.
* Added support for additional extended types in Gremlin.Net with `decimal`, `TimeSpan`, `BigInteger`, `byte`, `byte[]`, `char` and `short`.
* Fixed bug in Java driver where an disorderly shutdown of the server would cause the client to hang.
* Added a dotnet template project that should make it easier to get started with Gremlin.Net.
* Removed `ThreadInterruptCustomizerProvider` from documentation as a way to timeout.
* Changed behavior of `withRemote()` if called multiple times so as to simply throw an exception and not perform the side-effect of auto-closing.
* Added Docker images for Gremlin Console and Gremlin Server.
* Fixed bug in `branch()` where reducing steps as options would produce incorrect results.
* Removed recursive handling of streaming results from Gremlin-Python driver to avoid max recursion depth errors.
* Improved performance of `TraversalVertexProgram` and related infrastructure.
* Checked web socket state before closing connection in the .NET driver.
* Deprecated `BulkLoaderVertexProgram` and related infrastructure.
* Deprecated `BulkDumperVertexProgram` with the more aptly named `CloneVertexProgram`.
* Added `createGratefulDead()` to `TinkerFactory` to help make it easier to try to instantiate that toy graph.
* Added identifiers to edges in the Kitchen Sink toy graph.
* Ordered the loading of plugins in the Gremlin Console by their position in the configuration file.
* Refactored the Gremlin Server integration testing framework and streamlined that infrastructure.
* Logged the seed used in initializing `Random` for tests.
* Fixed bug in `GroovyTranslator` that didn't properly handle empty `Map` objects.
* Added concrete configuration methods to `SparkGraphComputer` to make a more clear API for configuring it.
* Fixed a bug in `TinkerGraphCountStrategy`, which didn't consider that certain map steps may not emit an element.
* Fixed a bug in JavaScript GLV where DriverRemoteConnection close() method didn't returned a Promise instance.
* Bumped to Jackson 2.9.6.
* Sasl Plain Text Authentication added to Gremlin Javascript.
* Ability to send scripts to server added to Gremlin Javascript.
* Translator class added to Gremlin Javascript to translate bytecode to script clientside.

==== Bugs

* TINKERPOP-1898 Issue with bindings in strategies and lambdas
* TINKERPOP-1933 gremlin-python maximum recursion depth exceeded on large responses
* TINKERPOP-1958 TinkerGraphCountStrategy can return wrong counts
* TINKERPOP-1961 Duplicate copies of images directory in docs
* TINKERPOP-1962 GroovyTranslator doesn't handle empty maps
* TINKERPOP-1963 Use of reducing step in choose()
* TINKERPOP-1972 inject() tests are throwing exceptions in .NET GLV tests
* TINKERPOP-1978 Check for Websocket connection state when retrieved from Connection Pool missing
* TINKERPOP-1988 minor error in documentation
* TINKERPOP-1999 [Java][gremlin-driver] Query to a remote server via the websocket client hangs indefinitely if the server becomes unavailable
* TINKERPOP-2005 Intermittent NullPointerException in response handling
* TINKERPOP-2009 Pick.any and Pick.none should be exposed in Gremlin-JavaScript
* TINKERPOP-2030 KeepAlive task executed for every Connection.write call
* TINKERPOP-2032 Update jython-standalone
* TINKERPOP-2044 Cannot reconnect to Azure cosmos host that becomes available again

==== Improvements

* TINKERPOP-1113 GraphComputer subclasses should support native methods
* TINKERPOP-1365 Log the seed used to initialize Random in tests
* TINKERPOP-1595 Go through TraversalVertexProgram with a profile and optimize.
* TINKERPOP-1778 Do not promote timedInterrupt option for Gremlin Server script processing
* TINKERPOP-1780 Add authentication tests for gremlin-python
* TINKERPOP-1836 .NET sample project
* TINKERPOP-1841 Include Python GLV tests on TravisCI
* TINKERPOP-1897 Provide Docker images of Gremlin Server and Console
* TINKERPOP-1945 Add support for extended GraphSon types to Gremlin.net
* TINKERPOP-1951 gremlin-server.bat doesn't support paths containing spaces
* TINKERPOP-1959 Provide a way to submit scripts to the server in gremlin-javascript
* TINKERPOP-1968 Refactor elements of Gremlin Server testing
* TINKERPOP-1976 Include Computer tests for GLVs
* TINKERPOP-1977 Gremlin-JavaScript: Support SASL authentication
* TINKERPOP-1985 Update position on bulk loading
* TINKERPOP-1989 Preserve order that plugins are applied in Gremlin Console
* TINKERPOP-1995 DriverRemoteConnection close() method returns undefined
* TINKERPOP-2011 Use NumberHelper on choose()
* TINKERPOP-2012 Target .NET Standard 2.0 for Gremlin.Net
* TINKERPOP-2015 Allow users to configure the WebSocket connections
* TINKERPOP-2016 Upgrade Jackson FasterXML to 2.9.5 or later to fix security vulnerability
* TINKERPOP-2017 Check for Column in by()
* TINKERPOP-2022 Cluster SSL should trust default ca certs by default
* TINKERPOP-2023 Gremlin Server should not create self-signed certs *(breaking)*
* TINKERPOP-2024 Gremlin Server Application archetype should connect via withRemote
* TINKERPOP-2025 Change to SHA-256/512 and drop SHA-1 for releases
* TINKERPOP-2026 Gremlin.Net.Driver should check ClientWebSocket.State before closing
* TINKERPOP-2034 Register synchronizedMap() with Gryo
* TINKERPOP-2035 Gremlin-JavaScript: Pass custom headers to the websocket connection
* TINKERPOP-2040 Improve flexibility of GroovyTranslator to handle custom types
* TINKERPOP-2045 Remove non-indy groovy dependencies
* TINKERPOP-2055 Provide support for special number cases like Infinity in GraphSON
* TINKERPOP-2056 Use NumberHelper in Compare

[[release-3-2-9]]
=== TinkerPop 3.2.9 (Release Date: May 8, 2018)

* Fixed bug where path history was not being preserved for keys in mutations.
* Bumped to httpclient 4.5.5.
* Bumped to Groovy 2.4.15 - fixes bug with `Lambda` construction.
* Improved performance of GraphSON deserialization of `Bytecode`.
* Improved performance of traversal construction.

====  Bugs

* TINKERPOP-1947 Path history isn't preserved for keys in mutations

==== Improvements

* TINKERPOP-1755 No docs for ReferenceElements
* TINKERPOP-1912 Remove MD5 checksums
* TINKERPOP-1934 Bump to latest version of httpclient
* TINKERPOP-1936 Performance enhancement to Bytecode deserialization
* TINKERPOP-1944 JavaScript GLV: DriverRemoteConnection is not exported in the root module
* TINKERPOP-1950 Traversal construction performance enhancements
* TINKERPOP-1953 Bump to Groovy 2.4.15

[[release-3-2-8]]
=== TinkerPop 3.2.8 (Release Date: April 2, 2018)

* Added a `Lambda` class to Gremlin.Net that makes it possible to use Groovy and Python lambdas with Gremlin.Net.
* Enums are now represented as classes in Gremlin.Net which allows to use them as arguments in more steps.
* Bumped to Groovy 2.4.14.
* Added `checkAdjacentVertices` option to `SubgraphStrategy`.
* Modified `GremlinDslProcessor` so that it generated the `getAnonymousTraversalClass()` method to return the DSL version of `__`.
* Added the "Kitchen Sink" test data set.
* Fixed deserialization of `P.not()` for GraphSON.
* Bumped to Jackson 2.9.4.
* Improved performance of `JavaTranslator` by caching reflected methods required for traversal construction.
* Ensure that `RemoteStrategy` is applied before all other `DecorationStrategy` instances.
* Added `idleConnectionTimeout` and `keepAliveInterval` to Gremlin Server that enables a "ping" and auto-close for seemingly dead clients.
* Fixed a bug where lambdas in `gremlin-python` would trigger a failure if steps using python-only symbols were present (such as `as_()`).
* Fixed a bug in `NumberHelper` that led to wrong min/max results if numbers exceeded the Integer limits.
* Delayed setting of the request identifier until `RequestMessage` construction by the builder.
* `ReferenceElement` avoids `UnsupportedOperationException` handling in construction thus improving performance.
* Improved error messaging for failed serialization and deserialization of request/response messages.
* Fixed handling of `Direction.BOTH` in `Messenger` implementations to pass the message to the opposite side of the `StarGraph`.
* Removed hardcoded expectation in metrics serialization test suite as different providers may have different outputs.
* Added `IndexedTraverserSet` which indexes on the value of a `Traverser` thus improving performance when used.
* Utilized `IndexedTraverserSet` in `TraversalVertexProgram` to avoid extra iteration when doing `Vertex` lookups.
* Bumped to Netty 4.0.56.Final.
* Fixed .NET GraphSON serialization of `P.Within()` and `P.without()` when passing a `Collection` as an argument.
* Fixed a bug in Gremlin Console which prevented handling of `gremlin.sh` flags that had an "=" between the flag and its arguments.
* Fixed bug where `SparkMessenger` was not applying the `edgeFunction` from `MessageScope`.
* Fixed a bug in `ComputerAwareStep` that didn't handle `reset()` properly and thus occasionally produced some extra traversers.
* Removed `TraversalPredicate` class in Gremlin.Net. It is now included in the `P` class instead.

==== Bugs

* TINKERPOP-1053 installed plugins are placed in a directory relative to where gremlin.sh is started
* TINKERPOP-1509 Failing test case for tree serialization
* TINKERPOP-1738 Proper functioning of GraphSONReader depends on order of elements in String representation
* TINKERPOP-1758 RemoteStrategy should be before all other DecorationStrategies.
* TINKERPOP-1855 Update Rexster links
* TINKERPOP-1859 Complex instance of P not serializing to bytecode properly
* TINKERPOP-1860 valueMap(True) result in error in gremlin-python
* TINKERPOP-1862 TinkerGraph VertexProgram message passing doesn't work properly when using Direction.BOTH
* TINKERPOP-1867 union() can produce extra traversers
* TINKERPOP-1872 Apply edgeFunction in SparkMessenger
* TINKERPOP-1873 min() and max() work only in the range of Integer values
* TINKERPOP-1874 P does not appear to be serialized consistently in GraphSON
* TINKERPOP-1879 Gremlin Console does not resepect equal sign for flag argument assignments
* TINKERPOP-1880 Gremlin.NET Strong name signature could not be verified. (HRESULT: 0x80131045)
* TINKERPOP-1883 gremlinpython future will never return
* TINKERPOP-1890 getAnonymousTraversalClass() is not being generated for Java DSLs
* TINKERPOP-1891 Serialization of P.not() for gremlin-javascript
* TINKERPOP-1892 GLV test failures for .NET
* TINKERPOP-1894 GraphSONMessageSerializerV2d0 fails to deserialize valid P.not()
* TINKERPOP-1896 gremlin-python lambdas error
* TINKERPOP-1907 Fix failing GLV test for withSack() in .NET
* TINKERPOP-1917 gx:BigDecimal serialization broken in Gremlin.Net on systems with ',' as decimal separator
* TINKERPOP-1918 Scenarios fail because of wrong numerical types
* TINKERPOP-1919 Gherkin runner doesn't work with P.And() and P.Or() in Gremlin.Net
* TINKERPOP-1920 Tests fail because P.Within() arguments are wrapped in an array in Gremlin.Net
* TINKERPOP-1922 Gherkin features fail that contain P.not() in Gremlin.Net

==== Improvements

* TINKERPOP-1357 Centrality Recipes should mention pageRank and OLAP.
* TINKERPOP-1489 Provide a Javascript Gremlin Language Variant
* TINKERPOP-1586 SubgraphStrategy in OLAP
* TINKERPOP-1726 Support WebSockets ping/pong keep-alive in Gremlin server
* TINKERPOP-1842 iterate() missing in terminal steps documentation
* TINKERPOP-1850 Range step has undocumented special values
* TINKERPOP-1854 Support lambdas in Gremlin.Net
* TINKERPOP-1857 GLV test suite consistency and completeness
* TINKERPOP-1863 Delaying the setting of requestId till the RequestMessage instantiation time
* TINKERPOP-1868 Support inject source step in Gremlin.Net
* TINKERPOP-1870 n^2 synchronious operation in OLAP WorkerExecutor.execute() method
* TINKERPOP-1877 Add new graph data for specialized testing scenarios
* TINKERPOP-1884 Bump to Netty 4.0.56.Final
* TINKERPOP-1885 Various Gremlin.Net documentation updates
* TINKERPOP-1901 Enable usage of enums in more steps in Gremlin.Net
* TINKERPOP-1908 Bump to Groovy 2.4.14
* TINKERPOP-1911 Refactor JavaTranslator to cache all reflective calls

[[release-3-2-7]]
=== TinkerPop 3.2.7 (Release Date: December 17, 2017)

* Added core GraphSON classes for Gremlin-Python: `UUID`, `Date`, and `Timestamp`.
* Documented the recommended method for constructing DSLs with Gremlin.Net.
* Provided a method to configure detachment options with `EventStrategy`.
* Fixed a race condition in `TinkerIndex`.
* Fixed bug in handling of the long forms of `-e` and `-i` (`--execute` and `--interactive` respectively) for Gremlin Console.
* Fixed bug in `LambdaRestrictionStrategy` where traversals using `Lambda` scripts weren't causing the strategy to trigger.
* Improved error messaging for bytecode deserialization errors in Gremlin Server.
* Fixed an `ArrayOutOfBoundsException` in `hasId()` for the rare situation when the provided collection is empty.
* Bump to Netty 4.0.53
* `TraversalVertexProgram` `profile()` now accounts for worker iteration in `GraphComputer` OLAP.
* Returned the `Builder` instance from the `DetachedEdge.Builder` methods of `setOutE` and `setOutV`.
* Added test framework for GLVs.
* Fixed bug in `TraversalHelper.replaceStep()` where the step being replaced needed to be removed prior to the new one being added.
* Added alias support in the .NET `DriverRemoteConnection`.
* Added a test for self-edges and fixed `Neo4jVertex` to provided repeated self-edges on `BOTH`.
* Better respected permissions on the `plugins.txt` file and prevented writing if marked as read-only.
* Added getters for the lambdas held by `LambdaCollectingBarrierStep`, `LambdaFlatMapStep` and `LambdaSideEffectStep`.
* Fixed an old hack in `GroovyTranslator` and `PythonTranslator` where `Elements` were being mapped to their id only.
* Fixed an "attachement"-bug in `InjectStep` with a solution generalized to `StartStep`.
* Truncate the script in error logs and error return messages for "Method code too large" errors in Gremlin Server.
* Fixed a bug in `LambdaRestrictionStrategy` where it was too eager to consider a step as being a lambda step.
* `ReferenceVertex` was missing its `label()` string. `ReferenceElement` now supports all label handling.
* Fixed a bug where bytecode containing lambdas would randomly select a traversal source from bindings.
* Deprecated `GremlinScriptEngine.eval()` methods and replaced them with new overloads that include the specific `TraversalSource` to bind to.
* Added `GraphHelper.cloneElements(Graph original, Graph clone)` to the `gremlin-test` module to quickly clone a graph.
* Added `GremlinDsl.AnonymousMethod` annotation to help provide explicit types for anonymous methods when the types are not easily inferred.
* Bump to GMavenPlus 1.6.
* Added better error message for illegal use of `repeat()`-step.
* Fixed a bug in `RangeByIsCountStrategy` that led to unexpected behaviors when predicates were used with floating point numbers.
* Bump to Jackson 2.8.10.
* Deprecated `MutationListener.vertexPropertyChanged()` method that did not use `VertexProperty` and added a new method that does.
* Added an `EmbeddedRemoteConnection` so that it's possible to mimic a remote connection within the same JVM.
* Supported interruption for remote traversals.
* Allow the `:remote` command to accept a `Cluster` object defined in the console itself.
* The Console's `plugin.txt` file is only updated if there were manually uninstalled plugins.
* Fixed a bug in `MatchStep` where mid-traversal `where()` variables were not being considered in start-scope.
* Generalized `MatchStep` to locally compute all clauses with barriers (not just reducing barriers).
* Ensured that plugins were applied in the order they were configured.
* Fixed a bug in `Neo4jGremlinPlugin` that prevented it from loading properly in the `GremlinPythonScriptEngine`.
* Fixed a bug in `ComputerVerificationStrategy` where child traversals were being analyzed prior to compilation.
* Fixed a bug that prevented Gremlin from ordering lists and streams made of mixed number types.
* Fixed a bug where `keepLabels` were being corrupted because a defensive copy was not being made when they were being set by `PathRetractionStrategy`.
* Cancel script evaluation timeout in `GremlinExecutor` when script evaluation finished.
* Added a recipe for OLAP traversals with Spark on YARN.
* Added `spark-yarn` dependencies to the manifest of `spark-gremlin`.

==== Bugs

* TINKERPOP-1650 PathRetractionStrategy makes Match steps unsolvable
* TINKERPOP-1731 Docker build does not appear to work for gremlin-dotnet
* TINKERPOP-1745 Gremlin .NET: Use DateTimeOffset instead of DateTime to represent g:Date
* TINKERPOP-1753 OrderStep not able to order by non-integer numbers
* TINKERPOP-1760 OLAP compilation failing around ConnectiveStrategy
* TINKERPOP-1761 GremlinExecutor: Timeout future not cancelled on successful script evaluation
* TINKERPOP-1762 Make MatchStep analyze mid-clause variables for executing ordering purposes.
* TINKERPOP-1764 Generalize MatchStep to localize all barriers, not just reducing barriers.
* TINKERPOP-1766 Gremlin.Net: Closed connections should not be re-used
* TINKERPOP-1782 RangeByIsCountStrategy doesn't handle floating point numbers properly
* TINKERPOP-1789 Reference elements should be represented by id and label *(breaking)*
* TINKERPOP-1790 GraphSON 3.0 doc updates
* TINKERPOP-1791 GremlinDsl custom step with generic end type produces invalid code in __.java
* TINKERPOP-1792 Random TraversalSource Selection in GremlinScriptEngine
* TINKERPOP-1795 Getting Lambda comparator message for .profile() step
* TINKERPOP-1796 Driver connection pool SSL properties missing
* TINKERPOP-1797 LambdaRestrictionStrategy and LambdaMapStep in `by()`-modulation.
* TINKERPOP-1798 MutationListener.vertexPropertyChanged oldValue should be a VertexProperty
* TINKERPOP-1801 OLAP profile() step return incorrect timing
* TINKERPOP-1802 hasId() fails for empty collections
* TINKERPOP-1803 inject() doesn't re-attach with remote traversals
* TINKERPOP-1819 documentation query and description mismatch
* TINKERPOP-1821 Consistent behavior of self-referencing edges
* TINKERPOP-1825 Gremlin .NET: Constant() step has incorrect parameter defined
* TINKERPOP-1830 Race condition in Tinkergraph index creation
* TINKERPOP-1832 TraversalHelper.replaceStep sets previousStep to the wrong step
* TINKERPOP-1846 LambdaRestrictionStrategy not triggering for Lambda scripts
* TINKERPOP-1848 Fix g:Date assertion in python tests
* TINKERPOP-1851 Gremlin long options for -e and -i are not working properly

==== Improvements

* TINKERPOP-1661 Docker-built documentation does not always point locally
* TINKERPOP-1725 DotNet GLV: Make traversal generation deterministic
* TINKERPOP-1734 DSL for Gremlin .NET
* TINKERPOP-1746 Better error message on wrong ordering of emit()/until()/has()
* TINKERPOP-1752 Gremlin.Net: Generate completely type-safe methods
* TINKERPOP-1756 Provide a way to easily mock a RemoteConnection for tests
* TINKERPOP-1759 Improve hashcode and equals for Traverser implementations
* TINKERPOP-1768 Bump to Jackson 2.8.10
* TINKERPOP-1770 Remote traversal timeout
* TINKERPOP-1771 gremlin.bat doesn't support paths containing spaces
* TINKERPOP-1779 Bump to GMavenPlus 1.6
* TINKERPOP-1784 Gremlin Language Test Suite
* TINKERPOP-1785 Gremlin.Net should be strong-name signed
* TINKERPOP-1786 Recipe and missing manifest items for Spark on Yarn
* TINKERPOP-1787 Allow :remote command to accept a user defined Cluster instance
* TINKERPOP-1806 Consistently use Gremlin.Net instead of Gremlin-DotNet
* TINKERPOP-1807 Gremlin-Python doesn't support GraphSON types g:Date, g:Timestamp and g:UUID
* TINKERPOP-1808 Add ability to get the consumer in LambdaSideEffectStep
* TINKERPOP-1811 Improve error reporting for serialization errors between gremlin-python and gremlin-server
* TINKERPOP-1812 ProfileTest assumes that graph implementations will not add their own steps
* TINKERPOP-1813 Subgraph step requires the graph API
* TINKERPOP-1814 Some process tests require the graph API
* TINKERPOP-1820 Include .NET GLV tests on TravisCI
* TINKERPOP-1824 Update netty version to 4.0.52
* TINKERPOP-1827 Gremlin .NET: Test Suite Runner
* TINKERPOP-1829 Improve flexibility of detachment for EventStrategy
* TINKERPOP-1833 DetachedEdge.Builder#setInV and setOutV doesn't return the builder
* TINKERPOP-1835 Bump Netty 4.0.53
* TINKERPOP-1837 Gremlin .NET: Provide type coercion between IDictionary<K, V> instances

[[release-3-2-6]]
=== TinkerPop 3.2.6 (Release Date: August 21, 2017)

This release also includes changes from <<release-3-1-8, 3.1.8>>.

* Bump to Netty 4.0.50
* Registered `HashMap$TreeNode` to Gryo.
* Fixed a lambda-leak in `SackValueStep` where `BiFunction` must be tested for true lambda status.
* Fixed a bug in `RangeByIsCountStrategy` that broke any `ConnectiveStep` that included a child traversal with an optimizable pattern.
* Allowed access to `InjectStep.injections` for `TraversalStrategy` analysis.
* Exceptions that occur during result iteration in Gremlin Server will now return `SCRIPT_EVALUATION_EXCEPTION` rather than `SERVER_ERROR`.
* `AddEdgeStep` attaches detached vertices prior to edge creation.
* Added graph element GraphSON serializers in Gremlin-Python.
* Initialization scripts for Gremlin Server will not timeout.
* Added Gremlin.Net.
* `ProfileTest` is now less stringent about assertions which will reduce burdens on providers.
* `GremlinExecutor` begins timeout of script evaluation at the time the script was submitted and not from the time it began evaluation.
* Added Gremlin.Net.
* `ReferenceFactory` and `DetachedFactory` now detach elements in collections accordingly.
* Deprecated `GryoLiteMessageSerializerV1d0` in favor of `HaltedTraverserStrategy`.
* Deprecated the `useMapperFromGraph` configuration option for Gremlin Server serializers.
* `JavaTranslator` is now smart about handling `BulkSet` and `Tree`.
* Added annotations to the traversal metrics pretty print.
* `EdgeOtherVertexStep` is no longer final and can be extended by providers.
* `EdgeVertexStep` is no longer final and can be extended by providers.
* Deprecated `Transaction.submit(Function)`.
* Fixed `HADOOP_GREMLIN_LIBS` parsing for Windows.
* Improved GraphSON serialization performance around `VertexProperty`.
* Changed some tests in `EventStrategyProcessTest` which were enforcing some unintended semantics around transaction state.
* Added WsAndHttpChannelizer and SaslAndHttpBasicAuthenticationHandler to be allow for servicing Http and Websocket requests to the same server
* Added deep copy of `Bytecode` to `DefaultTraversal.clone()`.

==== Bugs

* TINKERPOP-1385 Refactor Profiling test cases
* TINKERPOP-1679 Detached side-effects aren't attached when remoted
* TINKERPOP-1683 AbstractHadoopGraphComputer on Windows
* TINKERPOP-1691 Some EventStrategyProcessTest assume element state is synced in memory
* TINKERPOP-1704 XXXTranslators are not being respective of BulkSet and Tree.
* TINKERPOP-1727 Bytecode object shallow copied when traversals are cloned
* TINKERPOP-1742 RangeByIsCountStrategy fails for ConnectiveSteps
* TINKERPOP-1743 LambdaRestrictionStrategy does not catch lambdas passed to sack()
* TINKERPOP-1744 Gremlin .NET: Exception from sync execution gets wrapped in AggregateException

==== Improvements

* TINKERPOP-741 Remove Options For Transaction Retry
* TINKERPOP-915 Gremlin Server supports REST and Websockets simultanteously
* TINKERPOP-920 Test case needed for ensuring same cardinality for key.
* TINKERPOP-1552 C# Gremlin Language Variant
* TINKERPOP-1669 EdgeVertexStep should be designed for extension
* TINKERPOP-1676 Improve GraphSON 2.0 Performance  *(breaking)*
* TINKERPOP-1688 Include TraversalMetrics annotation in pretty print
* TINKERPOP-1694 Deprecate useMapperFromGraph
* TINKERPOP-1701 HaltedTraverserStrategy should recurse into collections for detachment.
* TINKERPOP-1703 Make EdgeOtherVertexStep non-final
* TINKERPOP-1708 Add a "Note on Scopes" document
* TINKERPOP-1709 Add a list of all the steps that support by()/from()/to()/as()/option()
* TINKERPOP-1710 Add a note on tree() by-modulation and uniqueness of tree branches.
* TINKERPOP-1714 Gremlin Server scriptEvaluationTimeout should take into account request arrival time
* TINKERPOP-1718 Deprecate GryoLiteMessageSerializerV1d0
* TINKERPOP-1748 Callout comments break code snippets
* TINKERPOP-1749 Bump to Netty 4.0.50

[[release-3-2-5]]
=== TinkerPop 3.2.5 (Release Date: June 12, 2017)

This release also includes changes from <<release-3-1-7, 3.1.7>>.

* Fixed folding of multiple `hasId()` steps into `GraphStep`.
* Added string performance options to `StarGraph`.
* Fixed a bug in `until(predicate)` where it was actually calling `emit(predicate)`.
* Fixed inconsistency in GraphSON serialization of `Path` where properties of graph elements were being included when serialized.
* Improved performance and memory usage of GraphSON when serializing `TinkerGraph` and graph elements.
* Removed use of `stream()` in `DetachedEdge` and `DetachedVertex`.
* Deprecated a constructor in `DetachedEdge` that made use of `Pair` in favor of a new one that just uses the objects that were in the `Pair`.
* Improved error messaging on the `g.addV(Object...)` when passing an invalid arguments.
* Reduced memory usage for TinkerGraph deserialization in GraphSON by streaming vertices and edges.
* Added the `gremlin-archetype-dsl` to demonstrate how to structure a Maven project for a DSL.
* Developed and documented patterns for Domain Specific Language implementations.
* Removed the Groovy dependency from `gremlin-python` and used Groovy Templates and the `gmavenplus-plugin` to generate the python GLV classes.
* Now using Groovy `[...]` map notation in `GroovyTranslator` instead of `new LinkedHashMap(){{ }}`.
* Maintained type information on `Traversal.promise()`.
* Propagated exception to `Future` instead of calling thread in `RemoteConnection`.
* Fixed a bug in `RepeatUnrollStrategy` where `LoopsStep` and `LambdaHolder` should invalidate the strategy's application.
* Deprecated `authentication.className` setting in favor of using `authentication.authenticator`.
* Added `authentication.authenticationHandler` setting.
* Added abstraction to authorization to allow users to plug in their own `AbstractAuthorizationHandler` implementations.
* Fixed a `NullPointerException` bug in `B_LP_O_S_SE_SL_Traverser`.
* `PathRetractionStrategy` now uses the marker-model to reduce recursive lookups of invalidating steps.
* `ProfileStrategy` now uses the marker-model to reduce recursive lookups of `ProfileSideEffectStep`.
* `Mutating` steps now implement `Scoping` interface.
* Fixed a step id compilation bug in `AddVertexStartStep`, `AddVertexStep`, `AddEdgeStep`, and `AddPropertyStep`.
* Added more details to Gremlin Server client side messages - exception hierarchy and stack trace.
* Deprecated "Exception-Class" in the Gremlin Server HTTP protocol in favor of the new "exceptions" field.
* De-registered metrics on Gremlin Server shutdown.
* Added "help" command option on `:remote config` for plugins that support that feature in the Gremlin Console.
* Allowed for multiple scripts and related arguments to be passed to `gremlin.sh` via `-i` and `-e`.
* `LABELED_PATH` requirement is now set if any step in the traversal is labeled.
* Updated `PathRetractionStrategy` to not run if the provided traversal contains a `VertexProgramStep` that has a `LABELED_PATH` requirement.
* Added various metrics to the `GremlinGroovyScriptEngine` around script compilation and exposed them in Gremlin Server.
* Moved the `caffeine` dependency down to `gremlin-groovy` and out of `gremlin-server`.
* Improved script compilation in `GremlinGroovyScriptEngine` to use better caching, log long compile times and prevent failed compilations from recompiling on future requests.
* Synchronized script compilation.
* Logged Script compilation times.
* Prevented failed scripts from recompiling.
* Logged warnings for scripts that take "too long" to compile.
* Improved memory usage of the `GremlinGroovyScriptEngine`.
* Added `cyclicPath().from().to().by()` support to `GraphTraversal`.
* Added `simplePath().from().to().by()` support to `GraphTraversal`.
* Added `path().from().to()` support to `GraphTraversal` so sub-paths can be isolated from the current path.
* Added `FromToModulating` interface for use with `to()`- and `from()`-based step modulators.
* Added `Path.subPath()` which supports isolating a sub-path from `Path` via to/from-labels.
* Fixed `NullPointerException` in `GraphMLReader` that occurred when an `<edge>` didn't have an ID field and the base graph supported ID assignment.
* Added `ScopingStrategy` which will computer and provide all `Scoping` steps with the path labels of the global `Traversal`.
* Split `ComputerVerificationStrategy` into two strategies: `ComputerVerificationStrategy` and `ComputerFinalizationStrategy`.
* Removed `HasTest.g_V_hasId_compilationEquality` from process test suite as it makes too many assumptions about provider compilation.
* Deprecated `CustomizerProvider` infrastructure.
* Deprecated `PluginAcceptor` infrastructure.
* Improved consistency of the application of bindings to `GremlinScriptEngine` implementations in the `BindingsGremlinPlugin`.
* Fixed a bug in OLAP `ComputerAwareStep` where end-step labels were not being appended to the traverser correctly.
* Refactor `SparkContext` handler to support external kill and stop operations.
* Fixed an optimization bug in `LazyBarrierStrategy` around appending barriers to the end of a `Traversal`.
* Fixed an optimization bug in `PathRetractionStrategy` around appending barriers to the end of a `Traversal`.
* `TraverserIterator` in GremlinServer is smart to try and bulk traversers prior to network I/O.
* Improved error handling of compilation failures for very large or highly parameterized script sent to Gremlin Server.
* Fixed a bug in `RangeByIsCountStrategy` that changed the meaning of inner traversals.
* Improved Gremlin-Python Driver implementation by adding a threaded client with basic connection pooling and support for pluggable websocket clients.
* Changed `GraphManager` from a final class implementation to an interface.
* Updated `GraphManager` interface to include methods for opening/instantiating a graph and closing a graph.
* Implemented `DefaultGraphManager` to include previous `GraphManager` functionality and adhere to updated interface.
* Deprecated `GraphManager.getGraphs()` and added `GraphManager.getGraphNames()`.
* Deprecated `GraphManager.getTraversalSources()` and added `GraphManager.getTraversalSourceNames()`.
* Fixed a bug so now users can supply a YAML with an empty `staticVariableTypes` to be used by the `FileSandboxExtension`

==== Bugs

* TINKERPOP-1258 HasTest.g_V_hasId_compilationEquality makes GraphStep assumptions
* TINKERPOP-1528 CountByIsRangeStrategy fails for a particular query
* TINKERPOP-1626 choose() is buggy in OLAP
* TINKERPOP-1638 count() is optimized away in where()
* TINKERPOP-1640 ComputerVerificationStrategy gives false errors
* TINKERPOP-1652 Disable PathRetractionStrategy strategy if VertexProgramStep has LABELLED_PATH requirement
* TINKERPOP-1660 Documentation links should not link to TINKERPOP-xxxx branches
* TINKERPOP-1666 NPE in FileSandboxExtension if staticVariableTypes is empty in supplied YAML file
* TINKERPOP-1668 RepeatUnrollStrategy should not execute if there is a LoopStep used.
* TINKERPOP-1670 End type lost when using promise()
* TINKERPOP-1673 GroovyTranslator produces Gremlin that can't execute on :remote
* TINKERPOP-1675 RemoteStep#processNextStart() throws CompletionException instead of underlying exception
* TINKERPOP-1681 Multiple hasId's are or'd into GraphStep

==== Improvements

* TINKERPOP-761 Some basic mathematical functions / steps
* TINKERPOP-786 Patterns for DSL Development
* TINKERPOP-1044 ResponseMessage should contain server-side exception name.
* TINKERPOP-1095 Create a custom ScriptContext
* TINKERPOP-1266 Make memory available to benchmarks configurable
* TINKERPOP-1303 add help for :remote config for Gephi Plugin
* TINKERPOP-1340 docs do not state at what version an API was introduced (or deprecated)
* TINKERPOP-1387 from and to modulators for path steps
* TINKERPOP-1438 Consider GraphManager as an interface*(breaking)*
* TINKERPOP-1453 Allow Gremlin-Python to handle asynchronous failure
* TINKERPOP-1577 Provide support for Python3 or Python2 in the Docker builds.
* TINKERPOP-1599 implement real gremlin-python driver
* TINKERPOP-1614 Improve documentation for Graph.V() and Graph.E() on main docs page
* TINKERPOP-1618 Remove groovy dependency from gremlin-python
* TINKERPOP-1627 LazyBarrierStrategy should not append an end barrier.
* TINKERPOP-1631 Fix visibility issues with the BindingsGremlinPlugin
* TINKERPOP-1634 Deprecate old methods of GremlinGroovyScriptEngine customization
* TINKERPOP-1642 Improve performance of mutating traversals
* TINKERPOP-1644 Improve script compilation process and include metrics
* TINKERPOP-1653 Allow multiple scripts with arguments to be passed to the Console
* TINKERPOP-1657 Provide abstraction to easily allow different HttpAuth schemes
* TINKERPOP-1663 Validate a maximum for the number of parameters passed to Gremlin Server
* TINKERPOP-1665 Remove unittest from Gremlin-Python tests
* TINKERPOP-1671 Default method for RemoteConnection.submitAsync throws exception from submit on calling thread instead of failing the future
* TINKERPOP-1677 Bump Groovy to 2.4.11
* TINKERPOP-1680 Add string performance options to StarGraph

[[release-3-2-4]]
=== TinkerPop 3.2.4 (Release Date: February 8, 2017)

This release also includes changes from <<release-3-1-6, 3.1.6>>.

* Fixed a bug where `PathProcessor.keepLabels` were not being pushed down into child traversals by `PathRetractionStrategy`.
* Added default `MessagePassingReductionStrategy` for `GraphComputer` that can reduce the number of message passing iterations.
* Fixed a bug associated with user-provided maps and `GroupSideEffectStep`.
* `GroupBiOperator` no longer maintains a detached traversal and thus, no more side-effect related OLAP inconsistencies.
* Added `ProjectedTraverser` which wraps a traverser with a `List<Object>` of projected data.
* Fixed an optimization bug in `CollectingBarrierSteps` where the barrier was being consumed on each `addBarrier()`.
* `OrderGlobalStep` and `SampleGlobalStep` use `ProjectedTraverser` and now can work up to the local star graph in OLAP.
* SASL negotiation supports both a byte array and Base64 encoded bytes as a string for authentication to Gremlin Server.
* Deprecated all test suites in `gremlin-groovy-test` - Graph Providers no longer need to implement these.
* Deprecated `TinkerIoRegistry` replacing it with the more consistently named `TinkerIoRegistryV1d0`.
* Made error messaging more consistent during result iteration timeouts in Gremlin Server.
* Fixed a memory leak in the classloader for the `GremlinGroovyScriptEngine` where classes in the loader were not releasing from memory as a strong reference was always maintained.
* `PathRetractionStrategy` does not add a `NoOpBarrierStep` to the end of local children as its wasted computation in 99% of traversals.
* Fixed a bug in `AddVertexStartStep` where if a side-effect was being used in the parametrization, an NPE occurred.
* Fixed a bug in `LazyBarrierStrategy` where `profile()` was deactivating it accidentally.
* Fixed a bug in `RepeatUnrollStrategy` where stateful `DedupGlobalStep` was cloned and thus, maintained two deduplication sets.
* Added documentation around "terminal steps" in Gremlin: `hasNext()`, `next()`, `toList()`, etc.
* Added specific GraphSON serializers for `RequestMessage` and `ResponseMessage` in GraphSON 2.0.
* Added `CloseableIterator` to allow `Graph` providers who open expensive resources a way to let users release them.
* Fixed minor bug in `gremlin-driver` where closing a session-based `Client` without initializing it could generate an error.
* Relieved synchronization pressure in various areas of `TinkerGraphComputer`.
* Fixed an optimization bug in OLAP-based `DedupGlobalStep` where deduping occurred twice.
* `MemoryComputeKey` now implements `Cloneable` which is useful for `BiOperator` reducers that maintain thread-unsafe state.
* `TinkerGraphComputer` now supports distributed `Memory` with lock-free partition aggregation.
* `TinkerGraph` Gryo and GraphSON deserialization is now configured to use multi-properties.
* Changed behavior of `ElementHelper.areEqual(Property, Property)` to not throw exceptions with `null` arguments.
* Added `GryoVersion` for future flexibility when introducing a new verison of Gryo and moved serializer registrations to it.
* Fixed Gryo serialization of `ConnectiveP` instances.
* Lessened the severity of Gremlin Server logging when it encounters two or more serializers addressing the same mime type.
* Bumped to Netty 4.0.42.final.
* Added `ByteBuffer`, `InetAddress`, `Timestamp` to the list of Gryo supported classes.
* Fixed Gryo serialization of `Class`.
* Fixed GraphSON serialization of enums like `T`, `P`, etc. where values were overriding each other in the GraphSON type registry.
* Fixed a bug in Gremlin-Python around `__.__()` and `__.start()`.
* Fixed a bug around long serialization in Gremlin-Python when using Python3.
* Deprecated `TraversalSource.withBindings()` as it is no longer needed in Gremlin-Java and never was needed for other variants.
* Fixed a bug in Gremlin-Java `Bytecode` where anonymous traversals were not aware of parent bindings.
* Fixed a bug in Gremlin-Java GraphSON deserialization around `P.within()` and `P.without()`.
* Converted Spark process suite tests to "integration" tests.
* Fixed a bug in `InlineFilterStrategy` having to do with folding `HasContainers` into `VertexStep`.
* Deprecated `HasContainer.makeHasContainers()` which was used to dissect `AndP` and shouldn't be used at the TinkerPop-level.
* `GraphTraversal.has()` now will try and fold-left `HasContainer` if end step is a `HasContainerHolder`.
* Created explicit `P`-predicate methods for `GraphTraversal.hasXXX()`.
* Fixed a bug in `FilterRankStrategy` around `where().by()` ordering.
* Added another optimization in `RangeByIsCountStrategy`, that removes `count().is()` altogether if it's not needed.
* Fixed a OLAP `MatchStep.clone()`-bug that occurs when the `match()` is in a local child.
* Added another optimization in `RangeByIsCountStrategy`, that removes `count().is()` altogether if it's not needed.
* Fixed a bug in `RangeByIsCountStrategy` where labeled parents shouldn't have the strategy applied to their children.
* Fixed a bug in `PathRetractionStrategy` where `MatchEndStep` labels were being dropped when they shouldn't be.
* Added `TinkerGraphCountStrategy` which translates `g.V().map*.count()` patterns into direct `Map.size()` calls in `TinkerGraph`.
* Added `Path.head()` and `Path.isEmpty()` with default method implementations.
* Fixed a `NoSuchElementException` bug with `GroupXXXStep` where if the reduced `TraverserSet` is empty, don't add the key/value.
* Fixed a `NullPointerException` bug with profiling `GroupSideEffectStep` in OLTP.
* Improved ability to release resources in `GraphProvider` instances in the test suite.
* Factored `GremlinPlugin` functionality out of gremlin-groovy and into gremlin-core - related classes were deprecated.
* Added a `force` option for killing sessions without waiting for transaction close or timeout of a currently running job or multiple jobs.
* Deprecated `Session.kill()` and `Session.manualKill()`.
* Added `Traversal.promise()` method to allow for asynchronous traversal processing on "remote" traversals.
* Deprecated `RemoteConnection.submit(Bytecode)` in favor of `submitAsync(Bytecode)`.
* Added `choose(predicate,traversal)` and `choose(traversal,traversal)` to effect if/then-semantics (no else). Equivalent to `choose(x,y,identity())`.
* Removed `ImmutablePath.TailPath` as it is no longer required with new recursion model.
* Removed call stack recursion in `ImmutablePath`.
* Gremlin-Python serializes `Bytecode` as an object (instead of a JSON string) when submit over the `RemoteConnection`.
* Fixed the handling of the `DriverRemoteConnection` pass-through configurations to the driver.
* `IncidentToAdjacentStrategy` now uses a hidden label marker model to avoid repeated recursion for invalidating steps.
* `PathProcessorStrategy` can inline certain `where(traversal)`-steps in order to increase the likelihood of star-local children.
* `SparkGraphComputer` no longer starts a worker iteration if the worker's partition is empty.
* Added `ProjectStep.getProjectKeys()` for strategies that rely on such information.
* Added `VertexFeatures.supportsDuplicateMultiProperties()` for graphs that only support unique values in multi-properties.
* Deprecated the "performance" tests in `OptIn`.
* Deprecated `getInstance()` methods in favor of `instance()` for better consistency with the rest of the API.
* Block calls to "remote" traversal side-effects until the traversal read is complete which signifies an end to iteration.
* Added `Pick.none` and `Pick.any` to the serializers and importers.
* Added a class loader to `TraversalStrategies.GlobalCache` which guarantees strategies are registered prior to `GlobalCache.getStrategies()`.
* Fixed a severe bug where `GraphComputer` strategies are not being loaded until the second use of the traversal source.
* The root traversal now throws regular `NoSuchElementException` instead of `FastNoSuchElementException`. (*breaking*)
* Added a short sleep to prevent traversal from finishing before it can be interrupted during `TraversalInterruptionComputerTest`.
* Added support for SSL client authentication

==== Bugs

* TINKERPOP-1380 dedup() doesn't dedup in rare cases
* TINKERPOP-1384 Description of filter function in traversal documentation
* TINKERPOP-1428 profile() throws NPE for union(group, group)
* TINKERPOP-1521 Mutating steps don't recognize side-effects
* TINKERPOP-1525 Plug VertexProgram iteration leak on empty Spark RDD partitions
* TINKERPOP-1534 Gremlin Server instances leaking in tests
* TINKERPOP-1537 Python tests should not use hard-coded number of workers
* TINKERPOP-1547 Two bugs found associated with MatchStep: Path retraction and range count.
* TINKERPOP-1548 Traversals can complete before interrupted in TraversalInterruptionComputerTest
* TINKERPOP-1560 Cache in GroovyClassLoader may continue to grow
* TINKERPOP-1561 gremiln-python GraphSONWriter doesn't properly serialize long in Python 3.5
* TINKERPOP-1567 GraphSON deserialization fails with within('a')
* TINKERPOP-1573 Bindings don't work in coalesce
* TINKERPOP-1576 gremlin-python calls non-existent methods
* TINKERPOP-1581 Gremlin-Python driver connection is not thread safe.
* TINKERPOP-1583 PathRetractionStrategy retracts keys that are actually needed
* TINKERPOP-1585 OLAP dedup over non elements
* TINKERPOP-1587 Gremlin Server Subgraph Cardinality Not Respected
* TINKERPOP-1594 LazyBarrierStrategy does not activate with ProfileStep
* TINKERPOP-1605 gremlin-console 3.2.3 -e can no longer take paths relative to current working directory

==== Improvements

* TINKERPOP-887 FastNoSuchElementException hides stack trace in client code
* TINKERPOP-919 Features needs to specify whether 2 vertex properties with same key/value is allowed.
* TINKERPOP-932 Add ability to cancel script execution associated with a Gremlin Server Session
* TINKERPOP-1248 OrderGlobalStep should use local star graph to compute sorts, prior to reduction.
* TINKERPOP-1261 Side-effect group().by() can't handle user-defined maps
* TINKERPOP-1292 TinkerGraphComputer VertexProgramInterceptors
* TINKERPOP-1372 ImmutablePath should not use Java recursion (call stacks are wack)
* TINKERPOP-1433 Add steps to dev docs to help committers get their keys in order
* TINKERPOP-1434 Block calls to traversal side-effects until read is complete
* TINKERPOP-1471 IncidentToAdjacentStrategy use hidden marker to avoid repeated recursion.
* TINKERPOP-1473 Given PathRetractionStrategy, PathProcessorStrategy can be extended to support partial where() inlining.
* TINKERPOP-1482 has(x).has(y) chains should be has(x.and(y))
* TINKERPOP-1490 Provider a Future based Traversal.async(Function<Traversal,V>) terminal step
* TINKERPOP-1502 Chained has()-steps should simply left-append HasContainers in Gremlin-Java.
* TINKERPOP-1507 Pick.any and Pick.none are not in GraphSON or Gremlin-Python
* TINKERPOP-1508 Add choose(predicate,trueTraversal)
* TINKERPOP-1527 Do not override registered strategies in TraversalStrategies.GlobalCache
* TINKERPOP-1530 Consistent use of instance()
* TINKERPOP-1539 Create a ComplexTraversalTest with crazy nested gnarly traversals.
* TINKERPOP-1542 Add Path.isEmpty() with a default implementation.
* TINKERPOP-1562 Migrate ScriptEngine-related code to gremlin-core
* TINKERPOP-1570 Bump to Netty 4.0.42
* TINKERPOP-1582 TraversalOpProcessor does not support custom serializers
* TINKERPOP-1584 Add gryo serializers to support types covered in GraphSON
* TINKERPOP-1588 Added Terminal Steps section to the docs
* TINKERPOP-1589 Re-Introduce CloseableIterator
* TINKERPOP-1590 Create TinkerWorkerMemory and Partitioned Vertices
* TINKERPOP-1600 Consistent use of base 64 encoded bytes for SASL negotiation
* TINKERPOP-1602 Support SSL client certificate authentication
* TINKERPOP-1606 Refactor GroupStep to not have the reduction traversal included in its BiOperator.
* TINKERPOP-1610 Deprecate gremlin-groovy-test provider based tests
* TINKERPOP-1617 Create a SingleIterationStrategy which will do its best to rewrite OLAP traversals to not message pass.

[[release-3-2-3]]
=== TinkerPop 3.2.3 (Release Date: October 17, 2016)

This release also includes changes from <<release-3-1-5, 3.1.5>>.

* Restructured Gremlin-Python's GraphSON I/O package to make it easier for users to register serializers/deserializers. (*breaking*)
* Fixed a bug with `TraversalOpProcessor` that was returning a final result prior to committing the transaction.
* Fixed a bug in `ConnectiveStrategy` where infix and/or was not correctly reasoning on `choose()` `HasNextStep` injections.
* Increased performance of `CredentialGraph` authentication.
* Removed Java 8 stream usage from `TraversalHelper` for performance reasons.
* Fixed a bug in `RepeatStep` where `emit().as('x')` wasn't adding the step labels to the emit-traverser.
* Added `GraphComputing.atMaster(boolean)` to allow steps to know whether they are executing at master or distributed at workers.
* Fixed a bug in OLAP where `DedupGlobalStep` wasn't de-duping local master traversers.
* Added `HasContainerHolder.removeHasContainer()`-method with default `UnsupportedOperationException` implementation.
* `TraversalSource.withComputer()` is simplified to add a `VertexProgramStrategy`. Easier for language variants.
* Fixed a `Set`, `List`, `Map` bug in the various `Translators` where such collections were not being internally translated.
* Fixed a `Bytecode` bug where nested structures (map, list, set) were not being analyzed for bindings and bytecode conversions.
* Fixed a `String` bug in `GroovyTranslator` and `PythonTranslator` where if the string has double-quotes it now uses """ """.
* Added a default `TraversalStrategy.getConfiguration()` which returns the configuration needed to construct the strategy.
* `Computer` instances can be created with `Computer.create(Configuration)` and accessed via `Computer.getConf()`.
* Every `TraversalStrategy` can be created via a `Configuration` and a static `MyStrategy.create(Configuration)`.
* Added language-agnostic `TraversalStrategy` support in `Bytecode`.
* Added `PartitionStrategy.Builder.readPartitions()` and deprecated `PartitionStrategy.Builder.addPartition()`.
* A new version of `LazyBarrierStrategy` has been created and added to the default strategies.
* `FilterRankStrategy` now propagates labels "right" over non-`Scoping` filters.
* Fixed a bug in `ConnectiveP` where nested equivalent connectives should be inlined.
* Fixed a bug in `IncidentToAdjacentStrategy` where `TreeStep` traversals were allowed.
* Fixed a end-step label bug in `MatchPredicateStrategy`.
* Fixed a bug in `MatchPredicateStrategy` where inlined traversals did not have strategies applied to it.
* Fixed a bug in `RepeatUnrollStrategy` where inlined traversal did not have strategies applied to it.
* Fixed padding of prompt in Gremlin Console when the number of lines went beyond a single digit.
* Fixed GraphSON 2.0 namespace for `TinkerGraph` to be "tinker" instead of "gremlin".
* Dropped serialization support in GraphSON 2.0 for `Calendar`, `TimeZone`, and `Timestamp`.
* Added `TraversalHelper.copyLabels()` for copying (or moving) labels form one step to another.
* Added `TraversalHelper.applySingleLevelStrategies()` which will apply a subset of strategies but not walk the child tree.
* Added the concept that hidden labels using during traversal compilation are removed at the end during `StandardVerificationStrategy`. (*breaking*)
* Added `InlineFilterStrategy` which will determine if various `TraversalParent` children are filters and if so, inline them.
* Removed `IdentityRemovalStrategy` from the default listing as its not worth the clock cycles.
* Removed the "!" symbol in `NotStep.toString()` as it is confusing and the `NotStep`-name is sufficient.
* Fixed a bug in `TraversalVertexProgram` (OLAP) around ordering and connectives (i.e. `and()` and `or()`).
* Added `AbstractGremlinProcessTest.checkOrderedResults()` to make testing ordered results easier.
* `AbstractLambdaTraversal` now supports a `bypassTraversal` where it is possible for strategies to redefine such lambda traversals.
* Added an internal utility `ClassFilterStep` which determines if the traverser object's class is an instance of the provided class.
* `ConnectiveStep` extends `FilterStep` and thus, is more appropriately categorized in the step hierarchy.
* `PropertyMapStep` supports a provided traversal for accessing the properties of the element. (*breaking*)
* `SubgraphStrategy` now supports vertex property filtering.
* Fixed a bug in Gremlin-Python `P` where predicates reversed the order of the predicates.
* Added tests to `DedupTest` for the `dedup(Scope, String...)` overload.
* Added more detailed reference documentation for IO formats.
* Fixed a bug in serialization of `Lambda` instances in GraphSON, which prevented their use in remote traversals.
* Fixed a naming bug in Gremlin-Python where `P._and` and `P._or` should be `P.and_` and `P.or_`. (*breaking*)
* `where()` predicate-based steps now support `by()`-modulation.
* Added Gryo serialization for `Bytecode`.
* Moved utility-based serializers to `UtilSerializers` for Gryo - these classes were private and hence this change is non-breaking.
* `TraversalRing` returns a `null` if it does not contain traversals (previously `IdentityTraversal`).
* Deprecated `Graph.Exceptions.elementNotFoundException()` as it was not used in the code base outside of the test suite.
* Fixed a `JavaTranslator` bug where `Bytecode` instructions were being mutated during translation.
* Added `Path` to Gremlin-Python with respective GraphSON 2.0 deserializer.
* `Traversal` and `TraversalSource` now implement `AutoCloseable`.
* Added "keep-alive" functionality to the Java driver, which will send a heartbeat to the server when normal request activity on a connection stops for a period of time.
* Renamed the `empty.result.indicator` preference to `result.indicator.null` in Gremlin Console
* If `result.indicator.null` is set to an empty string, then no "result line" is printed in Gremlin Console.
* Deprecated `reconnectInitialDelay` on the Java driver.
* Added some validations to `Cluster` instance building.
* Produced better errors in `readGraph` of `GryoReader` and `GraphSONReader` if a `Vertex` cannot be found in the cache on edge loading.
* VertexPrograms can now declare traverser requirements, e.g. to have access to the path when used with `.program()`.
* New build options for `gremlin-python` where `-DglvPython` is no longer required.
* Added missing `InetAddress` to GraphSON extension module.
* Added new recipe for "Pagination".
* Added new recipe for "Recommendation".
* Added functionality to Gremlin-Server REST endpoint to forward Exception Messages and Class in HTTP Response
* Gremlin Server `TraversalOpProcessor` now returns confirmation upon `Op` `close`.
* Added `close` method Java driver and Python driver `DriverRemoteTraversalSideEffects`.

==== Bugs

* TINKERPOP-1423 IncidentToAdjacentStrategy should be disabled for tree steps
* TINKERPOP-1440 g:Path needs a GraphSON deserializer in Gremlin-Python
* TINKERPOP-1457 Groovy Lambdas for remote traversals not serializable
* TINKERPOP-1458 Gremlin Server doesn't return confirmation upon Traversal OpProcessor "close" op
* TINKERPOP-1466 PeerPressureTest has been failing recently
* TINKERPOP-1472 RepeatUnrollStrategy does not semi-compile inlined repeat traversal
* TINKERPOP-1476 TinkerGraph does not get typed with the right type name in GraphSON
* TINKERPOP-1495 Global list deduplication doesn't work in OLAP
* TINKERPOP-1500 and/or infix and choose() do not work correctly.
* TINKERPOP-1511 Remote client addV, V()

==== Improvements

* TINKERPOP-790 Implement AutoCloseable on TraversalSource
* TINKERPOP-944 Deprecate Graph.Exceptions.elementNotFound
* TINKERPOP-1189 SimpleAuthenticator over HttpChannelizer makes Gremlin Server pretty slow and consumes more CPU
* TINKERPOP-1249 Gremlin driver to periodically issue ping / heartbeat to gremlin server
* TINKERPOP-1280 VertexPrograms should declare traverser requirements
* TINKERPOP-1330 by()-modulation for where()
* TINKERPOP-1409 Make the "null" return in the gremlin console into something more understandable  *(breaking)*
* TINKERPOP-1431 Documentation generation requires tests to execute on gremlin-python
* TINKERPOP-1437 Add tests for dedup(Scope) in DedupTest
* TINKERPOP-1444 Benchmark bytecode->Traversal creation and implement GremlinServer cache if necessary.
* TINKERPOP-1448 gremlin-python should be Python 2/3 compatible
* TINKERPOP-1449 Streamline gremlin-python build
* TINKERPOP-1455 Provide String-based withStrategy()/withoutStrategy() for language variant usage
* TINKERPOP-1456 Support SubgraphStrategy.vertexProperties().
* TINKERPOP-1460 Deprecate reconnectInitialDelay in Java driver
* TINKERPOP-1464 Gryo Serialization for Bytecode
* TINKERPOP-1469 Get rid of Stream-usage in TraversalHelper
* TINKERPOP-1470 InlineFilterStrategy should try and P.or() has() children in OrSteps.
* TINKERPOP-1486 Improve API of RemoteConnection
* TINKERPOP-1487 Reference Documentation for IO
* TINKERPOP-1488 Make LazyBarrierStrategy part of the default TraversalStrategies *(breaking)*
* TINKERPOP-1492 RemoteStrategy or the RemoteConnection should append a lazy barrier().
* TINKERPOP-1423 IncidentToAdjacentStrategy should be disabled for tree steps
* TINKERPOP-1440 g:Path needs a GraphSON deserializer in Gremlin-Python
* TINKERPOP-1457 Groovy Lambdas for remote traversals not serializable
* TINKERPOP-1458 Gremlin Server doesn't return confirmation upon Traversal OpProcessor "close" op
* TINKERPOP-1466 PeerPressureTest has been failing recently
* TINKERPOP-1472 RepeatUnrollStrategy does not semi-compile inlined repeat traversal
* TINKERPOP-1495 Global list deduplication doesn't work in OLAP
* TINKERPOP-1500 and/or infix and choose() do not work correctly.
* TINKERPOP-1511 Remote client addV, V()

[[release-3-2-2]]
=== TinkerPop 3.2.2 (Release Date: September 6, 2016)

This release also includes changes from <<release-3-1-4, 3.1.4>>.

* Included GraphSON as a default serializer (in addition to Gryo, which was already present) in Gremlin Server if none are defined.
* Added `gremlin-python` package as a Gremlin language variant in Python.
* Added `Bytecode` which specifies the instructions and arguments used to construct a traversal.
* Created an experimental GraphSON representation of `Bytecode` that will be considered unstable until 3.3.0.
* Added `Translator` which allows from the translation of `Bytecode` into some other form (e.g. script, `Traversal`, etc.).
* Added `JavaTranslator`, `GroovyTranslator`, `PythonTranslator`, and `JythonTranslator` for translating `Bytecode` accordingly.
* Added `TranslationStrategy` to `gremlin-test` so translators can be tested against the process test suite.
* Added `Traversal.Admin.nextTraverser()` to get the next result in bulk-form (w/ default implementation).
* Added `TraversalSource.getAnonymousTraversalClass()` (w/ default implementation).
* Added `GremlinScriptEngine` interface which specifies a `eval(Bytecode, Bindings)` method.
* Deprecated `RemoteGraph` in favor of `TraversalSource.withRemote()` as it is more technically correct to tie a remote traversal to the `TraversalSource` than a `Graph` instance.
* `GremlinGroovyScriptEngine` implements `GremlinScriptEngine`.
* Added `GremlinJythonScriptEngine` which implements `GremlinScriptEngine`.
* Removed support for submitting a Java serialized `Traversal` to Gremlin Server.
* Removed a largely internal feature that supported automatic unrolling of traversers in the Gremlin Driver.
* Made it possible to directly initialize `OpProcessor` implementations with server `Settings`.
* Included GraphSON as a default serializer (in addition to Gryo, which was already present) in Gremlin Server if none are defined
* Introduced GraphSON 2.0.
* Deprecated `embedTypes` on the builder for `GraphSONMapper`.
* Bumped to Netty 4.0.40.final.
* Defaulted the `gremlinPool` setting in Gremlin Server to be zero, which will instructs it to use `Runtime.availableProcessors()` for that settings.
* Changed scope of log4j dependencies so that they would only be used in tests and the binary distributions of Gremlin Console and Server.
* Deprecated `Io.Builder.registry()` in favor of the newly introduced `Io.Builder.onMapper()`.
* Added new recipe for "Traversal Induced Values".
* Fixed a potential leak of a `ReferenceCounted` resource in Gremlin Server.
* Added class registrations for `Map.Entry` implementations to `GryoMapper`.
* Added methods to retrieve `Cluster` settings in `gremlin-driver`.
* Fixed a severe bug in `SubgraphStrategy`.
* Deprecated `SubgraphStrategy.Builder.vertexCriterion()/edgeCriterion()` in favor of `vertices()/edges()`.
* Fixed a small bug in `StandardVerificationStrategy` that caused verification to fail when `withPath` was used in conjunction with `ProfileStep`.
* Added color preferences
* Added input, result prompt preferences
* Added multi-line indicator in Gremlin Console

==== Bugs

* TINKERPOP-810 store not visible
* TINKERPOP-1151 slf4j-log4j12 / log4j is only required for testing *(breaking)*
* TINKERPOP-1383 publish-docs.sh might publish to current too early
* TINKERPOP-1390 IdentityRemoveStrategyTest fails randomly
* TINKERPOP-1400 SubgraphStrategy introduces infinite recursion if filter has Vertex/Edge steps.
* TINKERPOP-1405 profile() doesn't like withPath()

==== Improvements

* TINKERPOP-1037 Gremlin shell output coloring
* TINKERPOP-1226 Gremlin Console should :clear automagically after "Display stack trace."
* TINKERPOP-1230 Serialising lambdas for RemoteGraph
* TINKERPOP-1274 GraphSON Version 2.0
* TINKERPOP-1278 Implement Gremlin-Python and general purpose language variant test infrastructure
* TINKERPOP-1285 Gremline console does not differentiate between multi-line and single-line input
* TINKERPOP-1334 Provide a way to pull gremlin.driver.Cluster connection settings.
* TINKERPOP-1347 RemoteConnection needs to provide TraversalSideEffects. *(breaking)*
* TINKERPOP-1373 Default gremlinPool to number of cores
* TINKERPOP-1386 Bump to Netty 4.0.40.Final
* TINKERPOP-1392 Remove support for java serialized Traversal *(breaking)*
* TINKERPOP-1394 Fix links in Recipes doc
* TINKERPOP-1396 Traversal Induced Values Recipe
* TINKERPOP-1402 Impossible for graph implementations to provide a class resolver for Gryo IO
* TINKERPOP-1407 Default serializers for Gremlin Server
* TINKERPOP-1425 Use trailing underscores in gremlin-python

[[release-3-2-1]]
=== TinkerPop 3.2.1 (Release Date: July 18, 2016)

This release also includes changes from <<release-3-1-3, 3.1.3>>.

* `PathProcessor` steps now have the ability (if configured through a strategy) to drop `Traverser` path segments.
* `MatchStep` in OLTP has a lazy barrier to increase the probability of bulking.
* Added `PathRetractionStrategy` which will remove labeled path segments that will no longer be referenced.
* Added `Path.retract()` to support retracting paths based on labels.
* Optimized `ImmutablePath` and `MutablePath` equality code removing significant unnecessary object creation code.
* Bumped to Groovy 2.4.7.
* Added `RepeatUnrollStrategy` to linearize a `repeat()`-traversal if loop amount is known at compile time.
* Fixed a bug in `BranchStep` around child integration during `clone()`.
* Fixed a bug in `AbstractStep` around label set cloning.
* Added `TraversalStrategyPerformanceTest` for verifying the performance gains of optimization-based traversal strategies.
* `TraversalExplanation.prettyPrint()` exists which provides word wrapping and GremlinConsole is smart to use console width to control `toString()`.
* `TraversalOpProcessor` (`RemoteConnection`) uses `HaltedTraverserStrategy` metadata to determine detachment procedure prior to returning results.
* Allow DFS paths in `HADOOP_GREMLIN_LIBS`.
* Added a safer serializer infrastructure for use with `SparkGraphComputer` that uses `KryoSerializer` and the new `GryoRegistrator`.
* Added `HaltedTraverserStrategy` to allow users to get back different element detachments in OLAP.
* Fixed a `NullPointerException` bug around nested `group()`-steps in OLAP.
* Fixed a severe bug around halted traversers in a multi-job OLAP traversal chain.
* Ensure a separation of `GraphComputer` and `VertexProgram` configurations in `SparkGraphComputer` and `GiraphGraphComputer`.
* `PeerPressureVertexProgram` now supports dynamic initial vote strength calculations.
* Added `EmptyMemory` for ease of use when no memory exists.
* Updated `VertexComputing.generateProgram()` API to include `Memory`. *(breaking)*
* `ImmutablePath.TailPath` is now serializable like `ImmutablePath`.
* Added `ConfigurationCompilerProvider` which allows fine-grained control of some of the internal `GremlinGroovyScriptEngine` settings at the Groovy compilation level.
* Intoduced the `application/vnd.gremlin-v1.0+gryo-lite` serialization type to Gremlin Server which users "reference" elements rather than "detached".
* `GryoMapper` allows overrides of existing serializers on calls to `addCustom` on the builder.
* Added a traversal style guide to the recipes cookbook.
* Fixed a bug in master-traversal traverser propagation.
* Added useful methods for custom `VertexPrograms` to be used with `program()`-step.
* Increased the test coverage around traverser propagation within a multi-job OLAP traversal.
* Added tests to validate the status of a transaction immediately following calls to close.
* Added tests to ensure that threaded transactions cannot be re-used.
* `GraphFilter` helper methods are now more intelligent when determining edge direction/label legality.
* Added `GraphFilterStrategy` to automatically construct `GraphFilters` via traversal introspection in OLAP.
* Updated the Gephi Plugin to support Gephi 0.9.x.
* Increased the testing and scope of `TraversalHelper.isLocalStarGraph()`.
* Changed signature of `get_g_VXlistXv1_v2_v3XX_name` and `get_g_VXlistX1_2_3XX_name` of `VertexTest` to take arguments for the `Traversal` to be constructed by extending classes.
* Added `VertexProgramInterceptor` interface as a general pattern for `GraphComputer` providers to use for bypassing `GraphComputer` semantics where appropriate.
* Added `SparkStarBarrierInterceptor` that uses Spark DSL for local star graph traversals that end with a `ReducingBarrierStep`.
* Added `SparkInterceptorStrategy` which identifies which interceptor to use (if any) given the submitted `VertexProgram`.
* Added `SparkSingleIterationStrategy` that does not partition nor cache the graph RDD if the traversal does not message pass.
* Added more helper methods to `TraversalHelper` for handling scoped traversal children.
* Deprecated all "performance" tests based on "JUnit Benchmarks".
* `SparkGraphComputer` no longer shuffles empty views or empty outgoing messages in order to save time and space.
* `TraversalVertexProgram` no longer maintains empty halted traverser properties in order to save space.
* Added `List<P<V>>` constructors to `ConnectiveP`, `AndP`, and `OrP` for ease of use.
* Added support for interactive (`-i`) and execute (`-e`) modes for Gremlin Console.
* Displayed line numbers for script execution failures of `-e` and `-i`.
* Improved messaging around script execution errors in Gremlin Console.
* Added "help" support to Gremlin Console with the `-h` flag.
* Added options to better control verbosity of Gremlin Console output with `-Q`, `-V` and `-D`.
* Deprecated the `ScriptExecutor` - the `-e` option to `gremlin.sh` is now handled by `Console`.
* `Traversal` now allows cancellation with `Thread.interrupt()`.
* Added a Gremlin language variant tutorial teaching people how to embed Gremlin in a host programming language.

==== Bugs

* TINKERPOP-1281 Memory.HALTED_TRAVERSER transience is not sound.
* TINKERPOP-1305 HALTED_TRAVERSERS hold wrong information
* TINKERPOP-1307 NPE with OLTP nested group() in an OLAP group() traversal
* TINKERPOP-1323 ComputerVerificationStrategy fails for nested match() steps
* TINKERPOP-1341 UnshadedKryoAdapter fails to deserialize StarGraph when SparkConf sets spark.rdd.compress=true whereas GryoSerializer works
* TINKERPOP-1348 TraversalInterruptionTest success dependent on iteration order

==== Improvements

* TINKERPOP-818 Consider a P.type()
* TINKERPOP-946 Traversal respecting Thread.interrupt()
* TINKERPOP-947 Enforce semantics of threaded transactions as manual *(breaking)*
* TINKERPOP-1059 Add test to ensure transaction opening happens at read/write and not on close *(breaking)*
* TINKERPOP-1071 Enhance pre-processor output
* TINKERPOP-1091 Get KryoSerializer to work natively. *(breaking)*
* TINKERPOP-1120 If there is no view nor messages, don't create empty views/messages in SparkExecutor
* TINKERPOP-1144 Improve ScriptElementFactory
* TINKERPOP-1155 gremlin.sh -e doesn't log line numbers for errors
* TINKERPOP-1156 gremlin.sh could use a help text
* TINKERPOP-1157 gremlin.sh should allow you to execute a script and go interactive on error or completion
* TINKERPOP-1232 Write a tutorial demonstrating the 3 ways to write a Gremlin language variant.
* TINKERPOP-1254 Support dropping traverser path information when it is no longer needed.
* TINKERPOP-1268 Improve script execution options for console *(breaking)*
* TINKERPOP-1273 Deprecate old performance tests
* TINKERPOP-1276 Deprecate serializedResponseTimeout
* TINKERPOP-1279 Add Iterable<V> parameter constructor to ConnectiveP subclasses
* TINKERPOP-1282 Add more compliance tests around how memory and vertex compute keys are propagated in chained OLAP.
* TINKERPOP-1286 Add Recipes documentation
* TINKERPOP-1288 Support gremlin.spark.skipPartitioning configuration.
* TINKERPOP-1290 Create VertexProgramInterceptor as a pattern for GraphComputer strategies.
* TINKERPOP-1293 Implement GraphFilterStrategy as a default registration for GraphComputer
* TINKERPOP-1294 Deprecate use of junit-benchmarks
* TINKERPOP-1297 Gephi plugin on Gephi 0.9.x  *(breaking)*
* TINKERPOP-1299 Refactor TraversalVertexProgram to make it easier to understand.
* TINKERPOP-1308 Serialize to "reference" for Gremlin Server
* TINKERPOP-1310 Allow OLAP to return properties as Detached
* TINKERPOP-1321 Loosen coupling between TinkerPop serialization logic and shaded Kryo
* TINKERPOP-1322 Provide fine-grained control of CompilerConfiguration
* TINKERPOP-1328 Provide [gremlin-python] as an code executor in docs
* TINKERPOP-1331 HADOOP_GREMLIN_LIBS can only point to local file system
* TINKERPOP-1332 Improve .explain() Dialogue
* TINKERPOP-1338 Bump to Groovy 2.4.7
* TINKERPOP-1349 RepeatUnrollStrategy should unroll loops while maintaining equivalent semantics.
* TINKERPOP-1355 Design HasContainer for extension

[[release-3-2-0-incubating]]
=== TinkerPop 3.2.0 (Release Date: April 8, 2016)

This release also includes changes from <<release-3-1-2-incubating, 3.1.2-incubating>>.

* Bumped to Neo4j 2.3.3.
* Renamed variable `local` to `fs` in `HadoopGremlinPlugin` to avoid a naming conflict with `Scope.local`. *(breaking)*
* Added `GraphTraversal.optional()` which will use the inner traversal if it returns results, else it won't.
* `GroupStep` and `GroupSideEffectStep` make use of mid-traversal reducers to limit memory consumption in OLAP.
* Added `GraphTraversal.program(VertexProgram)` to allow arbitrary user vertex programs in OLAP.
* Added `GraphTraversal.project()` for creating a `Map<String,E>` given the current traverser and an arbitrary number of `by()`-modulators.
* `HADOOP_GREMLIN_LIBS` can now reference a directory in HDFS and will be used if the directory does not exist locally.
* Added `gremlin-benchmark` module with JMH benchmarking base classes that can be used for further benchmark development.
* `TraversalStrategies.GlobalCache` supports both `Graph` and `GraphComputer` strategy registrations.
* `select("a","b").by("name").by("age")`-style traversals now work in OLAP with new `PathProcessorStrategy`.
* `DedupGlobalStep` can now handle star-bound `by()`-modulators and scoped keys on `GraphComputer`.
* Added `Computer` which is a builder for `GraphComputers` that is serializable.
* `PersistedOutputRDD` now implements `PersistResultGraphAware` and thus, no more unneeded warnings when using it.
* Renamed `StandardTraversalMetrics` to `DefaultTraversalMetrics` given the `DefaultXXX`-convention throughout. *(breaking)*
* Bumped to Apache Hadoop 2.7.2.
* Fixed a bug around profiling and nested traversals.
* Added `gremlin.hadoop.defaultGraphComputer` so users can use `graph.compute()` with `HadoopGraph`.
* Added `gremlin.hadoop.graphReader` and `gremlin.hadoop.graphWriter` which can handled `XXXFormats` and `XXXRDDs`.
* Deprecated `gremlin.hadoop.graphInputFormat`, `gremlin.hadoop.graphOutputFormat`, `gremlin.spark.graphInputRDD`, and `gremlin.spark.graphOutputRDD`.
* If no configuration is provided to `HadoopPools` it uses the default configuration to create a pool once and only once per JVM.
* Implemented `RemoteGraph`, `RemoteConnection`, and `RemoteStrategy`.
* Added validation to `GryoMapper` Kryo identifiers before construction to prevent accidental duplicates.
* Added `GraphStep.addIds()` which is useful for `HasContainer` "fold ins."
* Added a static `GraphStep.processHashContainerIds()` helper for handling id-based `HasContainers`.
* `GraphStep` implementations should have `g.V().hasId(x)` and `g.V(x)` compile equivalently. *(breaking)*
* Optimized `ExpandableStepIterator` with simpler logic and increased the likelihood of bulking.
* Optimized `TraverserRequirement` calculations.
* `Step.addStart()` and `Step.addStarts()` now take `Traverser.Admin<S>` and `Traverser.Admin<S>`, respectively. *(breaking)*
* `Step.processNextStart()` and `Step.next()` now return `Traverser.Admin<E>`. *(breaking)*
* `Traversal.addTraverserRequirement()` method removed. *(breaking)*
* Fixed a `hashCode()` bug in `OrderGlobalStep` and `OrderLocalStep`.
* Added `OrderLimitStrategy` which will ensure that partitions are limited before being merged in OLAP.
* `ComparatorHolder` now separates the traversal from the comparator. *(breaking)*
* Bumped to Apache Spark 1.6.1.
* If no Spark serializer is provided then `GryoSerializer` is the default, not `JavaSerializer`.
* Added `Operator.sumLong` as a optimized binary operator intended to be used by `Memory` reducers that know they are dealing with longs.
* Traversers from `ComputerResultStep` are no longer attached. Attaching is only used in TinkerPop's test suite via `System.getProperties()`.
* Fixed a `hashCode()`/`equals()` bug in `MessageScope`.
* Fixed a severe `Traversal` cloning issue that caused inconsistent `TraversalSideEffects`.
* `TraversalSideEffects` remain consistent and usable across multiple chained OLAP jobs.
* Added `MemoryTraversalSideEffects` which wraps `Memory` in a `TraversalSideEffects` for use in OLAP.
* `TraversalSideEffects` are now fully functional in OLAP save that an accurate global view is possible at the start of an iteration (not during).
* Updated the `TraversalSideEffects` API to support registered reducers and updated `get()`-semantics. *(breaking)*
* Split existing `profile()` into `ProfileStep` and `ProfileSideEffectStep`.
* The `profile()`-step acts like a reducing barrier and emits `TraversalMetrics` without the need for `cap()`. *(breaking)*
* Added `LocalBarrier` interface to allow traversers to remain distributed during an iteration so as to reduce cluster traffic.
* Added `NoOpBarrierStep` as a `LocalBarrier` implementation of `LambdaCollectingBarrierStep(noOp)`.
* `AggregateStep` implements `LocalBarrier` and thus, doesn't needlessly communicate its barrier traversers.
* Fixed an OLAP-based `Barrier` synchronization bug.
* Fixed a semantic bug in `BranchStep` (and inheriting steps) where barriers reacted locally. *(breaking)*
* Added `MemoryComputeKey` for specification of `Memory` keys in `VertexProgram`. *(breaking)*
* Added `VertexComputeKey` for specification of vertex compute properties in `VertexProgram`. *(breaking)*
* Added `and`, `or`, and `addAll` to `Operator`.
* `Memory` API changed to support setting and adding values for reduction. *(breaking)*
* `Memory` keys can be marked as broadcast and only those values are sent to workers on each iterator.
* `Memory` keys can be marked transient and thus deleted at the end of the OLAP job.
* Vertex compute keys can be marked transient and thus deleted at the end of the OLAP job.
* `VertexProgram` API changed to support `MemoryComputeKey` and `VertexComputeKey`. *(breaking)*
* `TraversalVertexProgram` able to execute OLAP and OLTP traversal sections dynamically within the same job.
* Removed `FinalGet` interface as all post processing of reductions should be handled by the reducing step explicitly. *(breaking)*
* Simplified all `SupplyingBarrierStep` implementations as they no longer require `MapReduce` in OLAP.
* Simplified all `CollectingBarrierStep` implementations as they no longer require `MapReduce` in OLAP.
* Simplified all `ReducingBarrierStep` implementations as they no longer require `MapReduce` in OLAP.
* All steps in OLAP that used `MapReduce` now use `Memory` to do their reductions which expands the list of legal traversals.
* `GroupStep` simplified with `GroupHelper.GroupMap` no longer being needed. Related to the removal of `FinalGet`.
* OLAP side-effects that are no longer generated by `MapReduce` are simply stored in `ComputerResult.Memory` w/ no disk persistence needed. *(breaking)*
* Added `Generate` step interface which states that there could be a final generating phase to a side-effect or reduction (e.g. `GroupStep`).
* `Barrier` step interface is now the means by which non-parallel steps communicate with their counterparts in OLAP.
* Added `MemoryComputing` step interface which states that the step uses `MemoryComputeKeys` for its computation in OLAP.
* Added `PeerPressureVertexProgramStep` and `GraphTraversal.peerPressure()`.
* Added `PureTraversal` for handling pure and compiled versions of a `Traversal`. Useful in OLAP.
* Added `ScriptTraversal` which allows for delayed compilation of script-based `Traversals`.
* Simplified `VertexProgram` implementations with a `PureTraversal`-model and deprecated `ConfigurationTraversal`.
* Simplified script-based `Traversals` via `ScriptTraversal` and deprecated `TraversalScriptFunction` and `TraversalScriptHelper`.
* Added `TimesModulating` interface which allows the `Step` to decide how a `times()`-modulation should be handled.
* Added `ByModulating` interface which allows the `Step` to decide how a `by()`-modulation should be handled. *(breaking)*
* Simplified the `by()`-modulation patterns of `OrderGlobalStep` and `OrderLocalStep`.
* Added `GraphComputerTest.shouldSupportPreExistingComputeKeys()` to ensure existing compute keys are "revived." *(breaking)*
* Added `GraphComputerTest.shouldSupportJobChaining()` to ensure OLAP jobs can be linearly chained. *(breaking)*
* Fixed a bug in both `SparkGraphComputer` and `GiraphGraphComputer` regarding source data access in job chains.
* Expanded job chaining test coverage for `GraphComputer` providers.
* Added `TraversalHelper.onGraphComputer(traversal)`.
* `MapReduce.map()` no longer has a default implementation. This method must be implemented. *(breaking)*
* `TraversalVertexProgram` can work without a `GraphStep` start.
* Added `PageRankVertexProgramStep` and `GraphTraversal.pageRank()`.
* Added `TraversalVertexProgramStep` to support OLAP traversal job chaining.
* Added `VertexProgramStrategy` which compiles multiple OLAP jobs into a single traversal.
* Simplified the comparator model in `OrderGlobalStep` and `OrderLocalStep`.
* Refactored `TraversalSource` model to allow fluent-method construction of `TraversalSources`.
* Deprecated the concept of a `TraversalSource.Builder`.
* Removed the concept of a `TraversalEngine`. All `Traversal` modulations are now mediated by `TraversalStrategies`. *(breaking)*
* Added `SideEffectStrategy` for registering sideEffects in a spawned `Traversal`.
* Added `SackStrategy` for registering a sack for a spawned `Traversal`.
* Added `RequirementsStrategy` and `RequirementsStep` for adding dynamic `TraverserRequirements` to a `Traversal`.
* Removed `EngineDependentStrategy`.
* Renamed step interface `EngineDependent` to `GraphComputing` with method `onGraphComputer()`. *(breaking)*
* Cleaned up various `TraversalStrategy` tests now that `TraversalEngine` no longer exists.
* Added `GraphFilter` to support filtering out vertices and edges that won't be touched by an OLAP job.
* Added `GraphComputer.vertices()` and `GraphComputer.edges()` for `GraphFilter` construction. *(breaking)*
* `SparkGraphComputer`, `GiraphGraphComputer`, and `TinkerGraphComputer` all support `GraphFilter`.
* Added `GraphComputerTest.shouldSupportGraphFilter()` which verifies all filtered graphs have the same topology.
* Added `GraphFilterAware` interface to `hadoop-gremlin/` which tells the OLAP engine that the `InputFormat` handles filtering.
* `GryoInputFormat` and `ScriptInputFormat` implement `GraphFilterAware`.
* Added `GraphFilterInputFormat` which handles graph filtering for `InputFormats` that are not `GraphFilterAware`.
* Fixed a bug in `TraversalHelper.isLocalStarGraph()` which allowed certain illegal traversals to pass.
* Added `TraversalHelper.isLocalProperties()` to verify that the traversal does not touch incident edges.
* `GraphReader` I/O interface now has `Optional<Vertex> readGraph(InputStream, GraphFilter)`. Default `UnsupportedOperationException`.
* `GryoReader` does not materialize edges that will be filtered out and this greatly reduces GC and load times.
* Created custom `Serializers` for `SparkGraphComputer` message-passing classes which reduce graph sizes significantly.

==== Bugs

* TINKERPOP-951 Barrier steps provide unexpected results in Gremlin OLAP
* TINKERPOP-1057 GroupSideEffectStep doesn't use provided maps
* TINKERPOP-1103 Two objects fighting for local variable name in Gremlin Console *(breaking)*
* TINKERPOP-1149 TraversalXXXSteps Aren't Providing SideEffects
* TINKERPOP-1181 select(Column) should not use a LambdaMapStep
* TINKERPOP-1188 Semantics of BarrierSteps in TraversalParent global traversals is wrong. *(breaking)*
* TINKERPOP-1194 explain() seems broken
* TINKERPOP-1217 Repeated Logging of "The HadoopPools has not been initialized, using the default pool"

==== Improvements

* TINKERPOP-570 [Proposal] Provide support for OLAP to OLTP to OLAP to OLTP
* TINKERPOP-575 Implement RemoteGraph
* TINKERPOP-813 [Proposal] Make the Gremlin Graph Traversal Machine and Instruction Set Explicit
* TINKERPOP-872 Remove GroupCountStep in favor of new Reduce-based GroupStep
* TINKERPOP-890 Remove the concept of branch/ package. *(breaking)*
* TINKERPOP-958 Improve usability of .profile() step.
* TINKERPOP-962 Provide "vertex query" selectivity when importing data in OLAP. *(breaking)*
* TINKERPOP-968 Add first class support for an optional traversal
* TINKERPOP-971 TraversalSource should be fluent like GraphComputer *(breaking)*
* TINKERPOP-1016 Replace junit-benchmarks with JMH
* TINKERPOP-1021 Deprecate Order.valueIncr, Order.valueDecr, Order.keyIncr, and Order.keyDecr *(breaking)*
* TINKERPOP-1032 Clean up the conf/hadoop configurations
* TINKERPOP-1034 Bump to support Spark 1.5.2
* TINKERPOP-1069 Support Spark 1.6.0
* TINKERPOP-1082 INPUT_RDD and INPUT_FORMAT are bad, we should just have one key.
* TINKERPOP-1112 Create GryoSerializers for the Spark Payload classes.
* TINKERPOP-1121 FileSystemStorage needs to be smart about /.
* TINKERPOP-1132 Messenger.receiveMessages() Iterator should .remove().
* TINKERPOP-1140 TraversalVertexProgramStep in support of OLAP/OLTP conversions.
* TINKERPOP-1153 Add ByModulating and TimesModulating interfaces.
* TINKERPOP-1154 Create a ScriptTraversal which is Serializable and auto-compiles.
* TINKERPOP-1162 Add VertexProgram.getTransientComputeKeys() for removing scratch-data. *(breaking)*
* TINKERPOP-1163 GraphComputer's can have TraversalStrategies.
* TINKERPOP-1164 ReducingBarriersSteps should use ComputerMemory, not MapReduce.
* TINKERPOP-1166 Add Memory.reduce() as option to Memory implementations. *(breaking)*
* TINKERPOP-1173 If no Serializer is provided in Configuration, use GryoSerializer by default (Spark)
* TINKERPOP-1180 Add more optimized binary operators to Operator.
* TINKERPOP-1192 TraversalSideEffects should support registered reducers (binary operators).
* TINKERPOP-1193 Add a LocalBarrier interface.
* TINKERPOP-1199 Use "MicroMetrics" as the mutator of the TraversalMetrics.
* TINKERPOP-1206 ExpandableIterator can take a full TraverserSet at once -- Barriers.
* TINKERPOP-1209 ComparatorHolder should returns a Pair<Traversal,Comparator>. *(breaking)*
* TINKERPOP-1210 Provide an OrderLimitStep as an optimization.
* TINKERPOP-1219 Create a test case that ensures the provider's compilation of g.V(x) and g.V().hasId(x) is identical *(breaking)*
* TINKERPOP-1222 Allow default GraphComputer configuration
* TINKERPOP-1223 Allow jars in gremlin.distributedJars to be read from HDFS
* TINKERPOP-1225 Do a "rolling reduce" for GroupXXXStep in OLAP.
* TINKERPOP-1227 Add Metrics for the TraversalOpProcessor
* TINKERPOP-1234 program() step that takes arbitrary vertex programs
* TINKERPOP-1236 SelectDenormalizationStrategy for select().by(starGraph) in OLAP.
* TINKERPOP-1237 ProjectMap: For the Love of Die Faterland
* TINKERPOP-1238 Re-use Client instances in RemoteGraph tests

== TinkerPop 3.1.0 (A 187 On The Undercover Gremlinz)

image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/gremlin-gangster.png[width=185]

[[release-3-1-8]]
=== TinkerPop 3.1.8 (Release Date: August 21, 2017)

* Fixed a `MessageScope` bug in `TinkerGraphComputer`.
* Fixed a bug in `BigDecimal` divisions in `NumberHelper` that potentially threw an `ArithmeticException`.
* Non-deserializable exceptions no longer added to ScriptRecordReader IOExceptions.

==== Bugs

* TINKERPOP-1519 TinkerGraphComputer doesn't handle multiple MessageScopes in single iteration
* TINKERPOP-1736 Sack step evaluated by Groovy interprets numbers in an unexpected way
* TINKERPOP-1754 Spark can not deserialise some ScriptRecordReader parse exceptions

[[release-3-1-7]]
=== TinkerPop 3.1.7 (Release Date: June 12, 2017)

* Configured Modern and The Crew graphs to work with a integer `IdManager` when `TinkerFactory.createXXX()` is called.
* Added XSLT transform option to convert TinkerPop 2.x GraphML to 3.x GraphML.
* Added validation to `StarVertexProperty`.
* Bumped to Jackson 2.8.7.
* Fixed `EventStrategy` so that newly added properties trigger events with the name of the key that was added.
* Drop use of jitpack for the jbcrypt artifact - using the official one in Maven Central.
* Bumped to Groovy 2.4.11.

==== Improvements

* TINKERPOP-1504 MutationListener doesn't provide property key on property additions
* TINKERPOP-1608 TP2-to-TP3 GraphML XSLT
* TINKERPOP-1633 Use org.mindrot:jbcrypt v0.4
* TINKERPOP-1645 Bump to Groovy 2.4.9
* TINKERPOP-1654 Upgrade to jackson-databind 2.8.6+ in gremlin-shaded
* TINKERPOP-1659 Docker build should use maven settings.xml
* TINKERPOP-1664 StarVertexProperty#property should throw an NPE if the value is null

[[release-3-1-6]]
=== TinkerPop 3.1.6 (Release Date: February 3, 2017)

* Fixed bug in `IncidentToAdjacentStrategy`, it was missing some invalidating steps.
* Returned a confirmation on session close from Gremlin Server.
* Use non-default port for running tests on Gremlin Server.
* Fully shutdown metrics services in Gremlin Server on shutdown.
* Deprecated `tryRandomCommit()` in `AbstractGremlinTest` - the annotation was never added in 3.1.1, and was only deprecated via javadoc.
* Minor fixes to various test feature requirements in `gremlin-test`.
* Allow developers to pass options to `docker run` with TINKERPOP_DOCKER_OPTS environment variable

==== Bugs

* TINKERPOP-1493 Groovy project doesn't build on Windows
* TINKERPOP-1545 IncidentToAdjacentStrategy is buggy

==== Improvements

* TINKERPOP-1538 Gremlin Server spawned by test suites should use a different port
* TINKERPOP-1544 Return a confirmation of session close
* TINKERPOP-1556 Allow Hadoop to run on IPv6 systems
* TINKERPOP-1557 Improve docker build time with this one weird trick!
* TINKERPOP-1598 Bump to Grovy 2.4.8

[[release-3-1-5]]
=== TinkerPop 3.1.5 (Release Date: October 17, 2016)

* Improved handling of `Cluster.close()` and `Client.close()` to prevent the methods from hanging.
* Fixed a bug in `NotStep` where child requirements were not being analyzed.
* Fixed output redirection and potential memory leak in `GremlinGroovyScriptEngine`.
* Corrected naming of `g_withPath_V_asXaX_out_out_mapXa_name_it_nameX` and `g_withPath_V_asXaX_out_mapXa_nameX` in `MapTest`.
* Improved session cleanup when a close is triggered by the client.
* Removed the `appveyor.yml` file as the AppVeyor build is no longer enabled by Apache Infrastructure.
* Fixed TinkerGraph which was not saving on `close()` if the path only consisted of the file name.
* Fixed a bug in `RangeByIsCountStrategy` which didn't use the `NotStep` properly.

==== Bugs

* TINKERPOP-1158 gremlin.sh -v emits log4j initialization errors
* TINKERPOP-1391 issue with where filter
* TINKERPOP-1442 Killing session should make better attempt to cleanup
* TINKERPOP-1451 TinkerGraph persistence cannot handle a single file name as the graph location
* TINKERPOP-1467 Improve close() operations on the Java driver
* TINKERPOP-1478 Propogate ScriptEngine fixes from groovy to GremlinGroovyScriptEngine
* TINKERPOP-1512 gremlin-server-classic.yaml is broken

==== Improvements

* TINKERPOP-927 bin/publish-docs.sh should only upload diffs.
* TINKERPOP-1264 Improve BLVP docs
* TINKERPOP-1477 Make DependencyGrabberTest an integration test

[[release-3-1-4]]
=== TinkerPop 3.1.4 (Release Date: September 6, 2016)

* Improved the error provided by a client-side session if no hosts were available.
* Fixed a bug in `PropertiesTest` which assumed long id values.
* Fixed a bug in `StarGraph` around self-edges.
* Fixed a potential leak of a `ReferenceCounted` resource in Gremlin Server.
* Renamed distributions to make the prefix "apache-tinkerpop-" as opposed to just "apache-".
* Fixed a problem (previously thought resolved on 3.1.3) causing Gremlin Server to lock up when parallel requests were submitted on the same session if those parallel requests included a script that blocked indefinitely.
* Fixed bug in `TailGlobalStep` where excess bulk was not accounted for correctly.

==== Bugs

* TINKERPOP-1350 Server locks when submitting parallel requests on session
* TINKERPOP-1375 Possible ByteBuf leak for certain transactional scenarios
* TINKERPOP-1377 Closing a remote in "console mode" has bad message
* TINKERPOP-1379 unaccounted excess in TailGlobalStep
* TINKERPOP-1397 StarVertex self edge has buggy interaction with graph filters
* TINKERPOP-1419 Wrong exception when a SessionedClient is initialized with no available host

==== Improvements

* TINKERPOP-989 Default documentation should be reference/index.html
* TINKERPOP-1376 Rename TinkerPop artifacts
* TINKERPOP-1413 PropertiesTest#g_V_hasXageX_propertiesXnameX assumes that ids are longs
* TINKERPOP-1416 Write Gremlin Server log files somewhere during doc generation
* TINKERPOP-1418 CoreTraversalTests depend on missing functionality

[[release-3-1-3]]
=== TinkerPop 3.1.3 (Release Date: July 18, 2016)

* Fixed bug in `SubgraphStep` where features were not being checked properly prior to reading meta-properties.
* Ensured calls to `Result.hasNext()` were idempotent.
* Avoid hamcrest conflict by using mockito-core instead of mockito-all dependency in `gremlin-test`.
* Fixed bug in `GremlinExecutor` causing Gremlin Server to lock up when parallel requests were submitted on the same session if those parallel requests included a script that blocked indefinitely.
* Changed `GremlinExecutor` timeout scheduling so that the timer would not start until a time closer to the actual start of script evaluation.
* Fixed bug in `SubgraphStrategy` where step labels were not being propogated properly to new steps injected by the strategy.
* Fix incorrect test `FeatureRequirement` annotations.
* Defaulted to `Edge.DEFAULT` if no edge label was supplied in GraphML.
* Fixed bug in `IoGraphTest` causing IllegalArgumentException: URI is not hierarchical error for external graph implementations.
* Fixed bug in `GremlinGroovyScriptEngineFileSandboxTest` resource loading
* Improved `TinkerGraph` performance when iterating vertices and edges.
* Fixed a bug where timeout functions provided to the `GremlinExecutor` were not executing in the same thread as the script evaluation.
* Fixed a bug in the driver where many parallel requests over a session would sometimes force a connection to close and replace itself.
* Graph providers should no longer rely on the test suite to validate that hyphens work for property keys.
* Optimized a few special cases in `RangeByIsCountStrategy`.
* Added more "invalid" variable bindings to the list used by Gremlin Server to validate incoming bindings on requests.
* Fixed a bug where the `ConnectionPool` in the driver would not grow with certain configuration options.
* Fixed a bug where pauses in Gremlin Server writing to an overtaxed client would generate unexpected `FastNoSuchElementException` errors.
* Named the thread pool used by Gremlin Server sessions: "gremlin-server-session-$n".
* Fixed a bug in `BulkSet.equals()` which made itself apparent when using `store()` and `aggregate()` with labeled `cap()`.
* Fixed a bug where `Result.one()` could potentially block indefinitely under certain circumstances.
* Ensured that all asserts of vertex and edge counts were being applied properly in the test suite.
* Fixed bug in `gremlin-driver` where certain channel-level errors would not allow the driver to reconnect.
* `SubgraphStep` now consults the parent graph features to determine cardinality of a property.
* Use of `Ctrl-C` in Gremlin Console now triggers closing of open remotes.
* Bumped SLF4J to 1.7.21 as previous versions suffered from a memory leak.
* Fixed a bug in `Neo4jGraphStepStrategy` where it wasn't defined properly as a `ProviderOptimizationStrategy`.
* Renamed `AndTest.get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name` to `get_g_V_andXhasXage_gt_27X__outE_count_gte_2X_name` to match the traversal being tested.
* Fixed a self-loop bug in `StarGraph`.
* Added configuration option for disabling `:remote` timeout with `:remote config timeout none`.
* Added `init-tp-spark.sh` to Gremlin Console binary distribution.
* Fixed bug where use of `:x` in a Gremlin Console initialization script would generate a stack trace.
* Added configuration options to Gremlin Driver and Server to override the SSL configuration with an `SslContext`.
* Added driver configuration settings for SSL: `keyCertChainFile`, `keyFile` and `keyPassword`.
* Fixed bug where transaction managed sessions were not properly rolling back transactions for exceptions encountered during script evaluation.
* Fixed bug in `:uninstall` command if the default `/ext` directory was not used.
* Added support to Gremlin Driver to allow either plain text or GSSAPI SASL authentication allowing the client to pass the SASL mechanism in the request.
* Improved dryRun functionality for the docs processor. It's now possible to dry run (or full run) only specific files.
* Added precompile of `ScriptInputFormat` scripts to `ScriptRecordReader` to improve performance.

==== Bugs

* TINKERPOP-906 Install plugin always fails after first unresolved dependency
* TINKERPOP-1088 Preserve Cardinality in Subgraph
* TINKERPOP-1092 Gremlin Console init script with :x throws exception
* TINKERPOP-1139 [Neo4JGraph] GraphTraversal with SubgraphStrategy removes addLabelStep (as("b"))
* TINKERPOP-1196 Calls to Result.one() might block indefinitely
* TINKERPOP-1215 Labeled a SideEffectCapStep cause problems.
* TINKERPOP-1242 ScriptEngineTest randomly hangs indefinately.
* TINKERPOP-1257 Bad SackTest variable use.
* TINKERPOP-1265 Managed Session Eval Exceptions Rollback
* TINKERPOP-1272 Gremlin Console distribution needs bin/init-tp-spark.sh
* TINKERPOP-1284 StarGraph does not handle self-loops correctly.
* TINKERPOP-1300 Many asserts around vertex/edge counts on graphs not applied
* TINKERPOP-1317 IoGraphTest throws error: URI is not hierarchical
* TINKERPOP-1318 java.lang.NoSuchMethodError: org/hamcrest/Matcher.describeMismatch
* TINKERPOP-1319 several FeatureRequirement annotations are incorrect in gremlin-test
* TINKERPOP-1320 GremlinGroovyScriptEngineFileSandboxTest throws error: URI is not hierarchical
* TINKERPOP-1324 Better error for invalid args to addV()
* TINKERPOP-1350 Server locks when submitting parallel requests on session
* TINKERPOP-1351 Number of connections going beyond the pool max size
* TINKERPOP-1352 Connection Pool doesn't always grow
* TINKERPOP-1359 Exception thrown when calling subgraph() on Neo4jGraph
* TINKERPOP-1360 intermittent error in spark-gremlin integration test

==== Improvements

* TINKERPOP-939 Neo4jGraph should support HighAvailability (Neo4jHA).
* TINKERPOP-1003 Setting up latest/current links for bins and docs.
* TINKERPOP-1020 Provide --dryRun selectivity for "half publishing" docs.
* TINKERPOP-1063 TinkerGraph performance enhancements
* TINKERPOP-1229 More Descriptive Messaging for :remote console
* TINKERPOP-1260 Log for validate-distribution.sh
* TINKERPOP-1263 Pass SASL mechanism name through with initial SASL response
* TINKERPOP-1267 Configure Console for no timeout on remote requests
* TINKERPOP-1269 More SSL settings for driver
* TINKERPOP-1295 Precompile ScriptInputFormat scripts once during initialization of ScriptRecordReader
* TINKERPOP-1301 Provide Javadoc for ScriptInput/OutputFormat's
* TINKERPOP-1302 Ctrl-C should kill open remotes in Console
* TINKERPOP-1312 .count().is(0) is not properly optimized
* TINKERPOP-1314 Improve error detection in docs preprocessor
* TINKERPOP-1354 Include all static enum imports in request validation for bindings *(breaking)*

[[release-3-1-2-incubating]]
=== TinkerPop 3.1.2 (Release Date: April 8, 2016)

* Fixed two `NullPointerException`-potential situations in `ObjectWritable`.
* Provided Docker script that allows the execution of several build tasks within a Docker container.
* Added a per-request `scriptEvaluationTimeout` option to the Gremlin Server protocol.
* Changed `DriverRemoteAcceptor` to send scripts as multi-line.
* Fixed a bug in `gremlin-driver` where connections were not returning to the pool after many consecutive errors.
* Fixed a bug where `tree()` did not serialize into GraphSON.
* Bumped to SLF4j 1.7.19.
* Bumped to Apache Hadoop 2.7.2.
* Fixed a bug in `gremlin-driver` where a really fast call to get a `Future` to wait for a result might not register an error raised from the server.
* Fixed a severe bug where `LP_O_OB_P_S_SE_SL_Traverser` was not registered with `GryoMapper`.
* The future from `GremlinExecutor.eval()` is completed after the entire evaluation lifecyle is completed.
* Spark `Memory` uses `collect().iterator()` instead of `toLocalIterator()` to reduce noise in Spark UI.
* Added the `:remote console` option which flips the Gremlin Console into a remote-only mode where all script evaluation is routed to the currently configured remote, which removes the need to use the `:>` command.
* Added `allowRemoteConsole()` to the `RemoteAcceptor` interface.
* The `:remote` for `tinkerpop.server` now includes an option to establish the connection as a "session".
* Provided an implementation for calls to `SessionedClient.alias()`, which formerly threw an `UnsupportedOperationException`.
* Bumped to commons-collections 3.2.2.
* Fixed a bug where `OrderGlobalStep` and `OrderLocalStep` were not incorporating their children's traverser requirements.
* Fixed a compilation bug in `TraversalExplanation`.
* Fixed bug where a session explicitly closed was being closed again by session expiration.
* Improved the recovery options for `gremlin-driver` after failed requests to Gremlin Server.
* Added `maxWaitForSessionClose` to the settings for `gremlin-driver`.
* Bumped to Netty 4.0.34.Final.
* Added "interpreter mode" for the `ScriptEngine` and Gremlin Server which allows variables defined with `def` or a type to be recognized as "global".
* Bumped to Apache Groovy 2.4.6.
* Added the `gremlin-archetype-server` archetype that demonstrates
* Added the `gremlin-archetype-tinkergraph` archetype that demonstrates a basic project that uses TinkerGraph.
* Added `gremlin-archetype` module to house TinkerPop "examples".
* Fixed a condition where `ConnectionPool` initialization in the driver would present a `NullPointerException` on initialization if there were errors constructing the pool in full.
* Fixed a bug in the round-robin load balancing strategy in the driver would waste requests potentially sending messages to dead hosts.
* Added new Provider Documentation book - content for this book was extracted from the reference documentation.
* Fixed a bug where multiple "close" requests were being sent by the driver on `Client.close()`.
* Fixed an `Property` attach bug that shows up in serialization-based `GraphComputer` implementations.
* Fixed a pom.xml bug where Gremlin Console/Server were not pulling the latest Neo4j 2.3.2.
* Fixed bug in "round robin" load balancing in `gremlin-driver` where requests were wrongly being sent to the same host.
* Prevented the spawning of unneeded reconnect tasks in `gremlin-driver` when a host goes offline.
* Fixed bug preventing `gremlin-driver` from reconnecting to Gremlin Server when it was restarted.
* Better handled errors that occurred on commits and serialization in Gremlin Server to first break the result iteration loop and to ensure commit errors were reported to the client.
* Added GraphSON serializers for the `java.time.*` classes.
* Improved the logging of the Gremlin Server REST endpoint as it pertained to script execution failures.
* `TraversalExplanation` is now `Serializable` and compatible with GraphSON and Gryo serialization.
* Fixed a problem with global bindings in Gremlin Server which weren't properly designed to handle concurrent modification.
* Deprecated `ScriptElementFactory` and made the local `StarGraph` globally available for ``ScriptInputFormat``'s `parse()` method.
* Improved reusability of unique test directory creation in `/target` for `AbstractGraphProvider`, which was formerly only available to Neo4j, by adding `makeTestDirectory()`.
* Optimized memory-usage in `TraversalVertexProgram`.
* `Graph` instances are not merely "closed" at the end of tests, they are "cleared" via `GraphProvider.clear()`, which should in turn cleans up old data for an implementation.
* Expanded the Gremlin Server protocol to allow for transaction management on in-session requests and updated the `gremlin-driver` to take advantage of that.
* Greatly reduced the amount of objects required in OLAP for the `ReducingBarrierStep` steps.
* Improved messages for the different distinct "timeouts" that a user can encounter with Gremlin Server.

==== Bugs

* TINKERPOP-1041 StructureStandardTestSuite has file I/O issues on Windows
* TINKERPOP-1105 SparkGraphComputer / Null Pointer Exceptions for properties traversals
* TINKERPOP-1106 Errors on commit in Gremlin Server don't register as exception on driver
* TINKERPOP-1125 RoundRobin load balancing always uses the second Host when size = 2
* TINKERPOP-1126 A single Host spawns many reconnect tasks
* TINKERPOP-1127 client fails to reconnect to restarted server
* TINKERPOP-1146 IoTest are not clearing the db after the test run
* TINKERPOP-1148 ConcurrentModificationException with bindings in Gremlin Server
* TINKERPOP-1150 Update pom file dependencies to work with Neo4j 2.3.2
* TINKERPOP-1159 Client sends multiple session close messages per host
* TINKERPOP-1168 Switch plugins in docs preprocessor
* TINKERPOP-1172 Reconnect to Gremlin Server previously marked as dead
* TINKERPOP-1175 Anonymous traversals can't be explained
* TINKERPOP-1184 Sessions not being closed properly
* TINKERPOP-1216 OrderStep or O_Traverser is broken
* TINKERPOP-1239 Excessive continual failure for requests can cause TimeoutException in driver
* TINKERPOP-1245 Gremlin shell starts incorrectly on OS X due to awk difference
* TINKERPOP-1251 NPE in ObjectWritable.toString
* TINKERPOP-1252 Failed Neo4j transaction can leave Neo4jTransaction in inconsistent state

==== Improvements

* TINKERPOP-732 gremlin-server GraphSON serializer issue with tree()
* TINKERPOP-916 Develop a better "simple" driver for testing and example purposes
* TINKERPOP-937 Extract the implementations sections of the primary documentation to its own book
* TINKERPOP-956 Connection errors tend to force a complete close of the channel
* TINKERPOP-1039 Enable auto-commit for session'd requests.
* TINKERPOP-1068 Bump to support jbcrypt-0.4m.jar
* TINKERPOP-1080 Bump Netty version - 4.0.34.Final
* TINKERPOP-1085 Establish TinkerPop "example" projects
* TINKERPOP-1096 Support aliasing for sessions in Gremlin Server
* TINKERPOP-1097 Gremlin Console supporting sessions
* TINKERPOP-1107 Provide a way to support global variables with sandboxing enabled
* TINKERPOP-1109 Make Gremlin Console better suited for system level installs
* TINKERPOP-1131 TraversalVertexProgram traverser management is inefficient memory-wise.
* TINKERPOP-1135 Improve GraphSON representation of java.time.* classes
* TINKERPOP-1137 Deprecate ScriptElementFactory and make star graph globally available
* TINKERPOP-1138 Improve messaging on server timeouts
* TINKERPOP-1147 Add serialization for TraversalExplanation
* TINKERPOP-1160 Add timeout configuration for time to wait for connection close
* TINKERPOP-1165 Tooling Support: Compile with -parameters
* TINKERPOP-1176 Bump Groovy version - 2.4.6
* TINKERPOP-1177 Improve documentation around Spark's storage levels
* TINKERPOP-1197 Document Gremlin Server available metrics
* TINKERPOP-1198 Bump commons-collections to 3.2.2
* TINKERPOP-1213 missing docs for has(label, key, value)
* TINKERPOP-1218 Usage of toLocalIterator Produces large amount of Spark Jobs

[[release-3-1-1-incubating]]
=== TinkerPop 3.1.1 (Release Date: February 8, 2016)

* Made `GryoRecordReader` more robust to 0 byte record splits.
* Fixed a constructor/serialization bug in `LP_O_OB_S_SE_SL_Traverser`.
* Added a lazy iterator, memory safe implementation of MapReduce to `SparkGraphComputer`.
* Added `MapReduce.combine()` support to `SparkGraphComputer`.
* Bumped to Neo4j 2.3.2.
* Fixed Java comparator contract issue around `Order.shuffle`.
* Optimized a very inefficient implementation of `SampleLocalStep`.
* Reduced the complexity and execution time of all `AbstractLambdaTraversal` instances.
* `DefaultTraversal` has a well defined `hashCode()` and `equals()`.
* Added serializers to Gryo for `java.time` related classes.
* Integrated `NumberHelper` in `SackFunctions`.
* Deprecated `VertexPropertyFeatures.supportsAddProperty()` which effectively was a duplicate of `VertexFeatures.supportsMetaProperties`.
* The Spark persistence `StorageLevel` can now be set for both job graphs and `PersistedOutputRDD` data.
* Added to the list of "invalid binding keys" allowed by Gremlin Server to cover the private fields of `T` which get exposed in the `ScriptEngine` on static imports.
* Added `BulkDumperVertexProgram` that allows to dump a whole graph in any of the supported IO formats (GraphSON, Gryo, Script).
* Fixed a bug around duration calculations of `cap()`-step during profiling.
* It is possible to completely avoid using HDFS with Spark if `PersistedInputRDD` and `PersistedOutpuRDD` are leveraged.
* `InputRDD` and `OutputRDD` can now process both graphs and memory (i.e. sideEffects).
* Removed Groovy specific meta-programming overloads for handling Hadoop `FileSystem` (instead, its all accessible via `FileSystemStorage`).
* Added `FileSystemStorage` and `SparkContextStorage` which both implement the new `Storage` API.
* Added `Storage` to the gremlin-core io-package which providers can implement to allow conventional access to data sources (e.g. `ls()`, `rm()`, `cp()`, etc.).
* Bumped to Spark 1.5.2.
* Bumped to Groovy 2.4.5.
* Added `--noClean` option in `bin/process-docs.sh` to prevent the script from cleaning Grapes and HDFS.
* Execute the `LifeCycle.beforeEval()` in the same thread that `eval()` is executed in for `GremlinExecutor`.
* Improved error handling of Gremlin Console initialization scripts to better separate errors in initialization script I/O versus execution of the script itself.
* Fixed a bug in `Graph.OptOut` when trying to opt-out of certain test cases with the `method` property set to "*".
* Added another `BulkLoader` implementation (`OneTimeBulkLoader`) that doesn't store temporary properties in the target graph.
* Added option to allow for a custom `ClassResolver` to be assigned to a `GryoMapper` instance.
* Fixed a `SparkGraphComputer` sorting bug in MapReduce that occurred when there was more than one partition.
* Added `strictTransactionManagement` to the Gremlin Server settings to indicate that the `aliases` parameter must be passed on requests and that transaction management will be scoped to the graphs provided in that argument.
* Fixed a `NullPointerException` bug in `PeerPressureVertexProgram` that occurred when an adjacency traversal was not provided.
* Standardized "test data directories" across all tests as generated by `TestHelper`.
* Fixed a bug in Gremlin Server where error messages were not always being passed back in the `statusMessage` field of the `ResponseMessage`.
* Added validation for parameter `bindings` to ensure that keys were `String` values.
* Improved Transaction Management consistency in Gremlin Server.
* Added `FileSandboxExtension` which takes a configuration file to white list methods and classes that can be used in `ScriptEngine` execution.
* Deprecated `SandboxExtension` and `SimpleSandboxExtension` in favor of `AbstractSandboxExtension` which provides better abstractions for those writing sandboxes.
* Fixed a long standing "view merge" issue requiring `reduceByKey()` on input data to Spark. It is no longer required.
* Added `Spark` static object to allow "file system" control of persisted RDDs in Spark.
* Added a Spark "job server" to ensure that persisted RDDs are not garbage collected by Spark.
* Improved logging control during builds with Maven.
* Fixed settings that weren't being passed to the Gremlin Driver `Cluster` through configuration file.
* `Column` now implements `Function`. The modulator `by(valueDecr)` can be replaced by `by(values,decr)` and thus, projection and order are separated.
* Added `InputRDDFormat` which wraps an `InputRDD` to make it accessible to Hadoop and not just Spark.
* Added `AbstractSparkTest` which handles closing `SparkContext` instances between tests now that we support persisted contexts.
* Fixed a serialization bug in `GryoSerializer` that made it difficult for graph providers to yield `InputRDDs` for `SparkGraphComputer`.
* `SparkGraphComputer` is now tested against Gryo, GraphSON, and `InputRDD` data sources.
* `HadoopElementIterator` (for Hadoop-Gremlin OLTP) now works for any `InputFormat`, not just `FileInputFormats`.
* Added `Traverser.Admin.getTags()` which are used to mark branches in a traversal (useful in `match()` and related future steps).
* Fixed the `Future` model for `GiraphGraphComputer` and `SparkGraphComputer` so that class loaders are preserved.
* Added support for arbitrary vertex ID types in `BulkLoaderVertexProgram`.
* Deprecated `credentialsDbLocation` from `SimpleAuthenticator` in Gremlin Server.
* `TinkerGraph` has "native" serialization in GraphSON, which enables it to be a return value from Gremlin Server.
* Improved the ability to embed Gremlin Server by providing a way to get the `ServerGremlinExecutor` and improve reusability of `AbstractEvalOpProcessor` and related classes.
* Added `Authenticator.newSaslNegotiator(InetAddress)` and deprecated the zero-arg version of that method.
* `ProfileStep` is now available off of `Traversal` via `profile()`. To be consistent with `Traversal.explain()`.
* If no comparator is provided to `order()`, `Order.incr` is assumed (previously, an exception occurred).
* Fixed various Gremlin-Groovy tests that assumed `toString()`-able ids.
* Split TinkerPop documentation into different directories.
* Added `explain()`-step which yields a `TraversalExplanation` with a pretty `toString()` detailing the compilation process.
* Fixed a traversal strategy ordering bug in `AdjacentToIncidentStrategy` and `IncidentToAdjacentStrategy`.
* Made a number of changes to improve traversal startup and execution performance.
* Added support for 'gremlin.tinkergraph.graphLocation' to accept a fully qualified class name that implements `Io.Builder` interface.

==== Bugs

* TINKERPOP-763 IsStep broken when profiling is enabled.
* TINKERPOP-972 Cluster::close does not shut down its executor
* TINKERPOP-973 BLVP shouldn't clear configuration properties
* TINKERPOP-976 Fail earlier if invalid version is supplied in validate-distribution.sh
* TINKERPOP-977 Dead link to traversal javadocs
* TINKERPOP-979 ComputerVerificationStrategy not picking up Order local traversal
* TINKERPOP-985 shouldPersistDataOnClose makes incorrect feature check
* TINKERPOP-990 Mixed types in VertexPropertyTest
* TINKERPOP-993 cyclicPath is not(simplePath)
* TINKERPOP-997 FeatureRequirementSet.SIMPLE should not require multi-property *(breaking)*
* TINKERPOP-1000 GremlinGroovyScriptEngineOverGraphTest failures
* TINKERPOP-1001 SugarLoaderPerformanceTest contains hardcoded vertex ids
* TINKERPOP-1002 Should rollback transaction after catching on close
* TINKERPOP-1006 Random error during builds: shouldReloadClassLoaderWhileDoingEvalInSeparateThread()
* TINKERPOP-1011 HadoopGraph can't re-attach when the InputFormat is not a FileInputFormat
* TINKERPOP-1012 BulkLoaderVertexProgram shouldn't assume vertex IDs of type Long
* TINKERPOP-1025 Solve SparkContext Persistence Issues with BulkLoaderVertexProgram
* TINKERPOP-1027 Merge view prior to writing graphRDD to output format/rdd
* TINKERPOP-1036 Support self-looping edges in IO
* TINKERPOP-1052 @Graph.OptOut causes Exception during Suite setup
* TINKERPOP-1060 LambdaRestrictionStrategy too restrictive
* TINKERPOP-1075 Profile duration of cap step seems broken.
* TINKERPOP-1083 Traversal needs a hashCode() and equals() definition.
* TINKERPOP-1089 Order.shuffle implementation is too fragile
* TINKERPOP-1119 LP_O_OB_S_SE_SL_Traverser doesn't have a protected constructor().

==== Improvements

* TINKERPOP-320 BulkDumperVertexProgram
* TINKERPOP-379 MessageScope.Local.setStaticMessage(M msg)
* TINKERPOP-824 Do we need runtime BigDecimal in more places?
* TINKERPOP-859 Provide a more general way to set log levels in plugins
* TINKERPOP-860 Bindings applied to the PluginAcceptor should appear to Gremlin Server
* TINKERPOP-886 Allow any GraphReader/Writer to be persistence engine for TinkerGraph
* TINKERPOP-891 Re-examine Sandboxing Abstractions
* TINKERPOP-912 Improve the ability to embed Gremlin Server with Channelizer injection
* TINKERPOP-928 Use directories to separate different books
* TINKERPOP-930 Tie Alias to Transaction Manager in Gremlin Server
* TINKERPOP-938 Add a "clear SNAPSHOT jars" section to the process-docs.sh.
* TINKERPOP-941 Improve error message for wrong order().by() arguments
* TINKERPOP-943 Warn if Gremlin Server is running prior to generating docs
* TINKERPOP-945 Exceptions should allow me to include root cause if/when available
* TINKERPOP-952 Include Cardinality.list example in VertexProperty section of main docs.
* TINKERPOP-954 Consistent test directory usage
* TINKERPOP-957 Improve speed of addV()
* TINKERPOP-964 Test XXXGraphComputer on a Hadoop2 cluster (non-pseudocluster).
* TINKERPOP-970 ProfileStep should be off Traversal, not GraphTraversal
* TINKERPOP-978 Native TinkerGraph Serializers for GraphSON
* TINKERPOP-981 Deprecate support for credentialsDbLocation in Gremlin Server Config
* TINKERPOP-982 valuesDecr, valuesIncr, keysDecr, and valuesDecr is lame.
* TINKERPOP-983 Provide a way to track open Graph instances in tests
* TINKERPOP-984 Use GraphProvider for id conversion in Groovy Environment test suite
* TINKERPOP-987 Use tinkerpop.apache.org URL in all documentation and homepage
* TINKERPOP-988 SparkGraphComputer.submit shouldn't use ForkJoinPool.commonPool
* TINKERPOP-992 Better support for schema driven Graphs in IO related tests
* TINKERPOP-994 Driver using deprecated Rebindings Still
* TINKERPOP-995 Add Authenticator.newSaslNegotiator(InetAddress)
* TINKERPOP-996 Please delete old releases from mirroring system
* TINKERPOP-998 Deprecate VertexPropertyFeatures.FEATURE_ADD_PROPERTY
* TINKERPOP-1009 Add a CAUTION to documentation about HadoopGraph and getting back elements
* TINKERPOP-1013 Traverser tags as a safer way of using path labels
* TINKERPOP-1018 Allow setting for maxContentLength to be set from yaml in driver
* TINKERPOP-1019 Convert println in test to SLF4j
* TINKERPOP-1022 Automatically warm up ops handlers
* TINKERPOP-1023 Add a spark variable in SparkGremlinPlugin like we do hdfs for HadoopGremlinPlugin
* TINKERPOP-1026 BVLP should store vertex IDs as String
* TINKERPOP-1033 Store sideEffects as a persisted RDD
* TINKERPOP-1035 Better Consistency in Gremlin Server Transaction Management
* TINKERPOP-1045 Client-Side Hangs when attempting to access a HashMap with Keys of type Integer
* TINKERPOP-1047 TinkerGraph GraphSON storage format broken
* TINKERPOP-1051 Add note in best practice docs about gremlin server heap setting
* TINKERPOP-1055 Gremlin Console FileNotFoundException can be misleading
* TINKERPOP-1062 Make LifeCycle beforeEval execute in same thread as eval operation
* TINKERPOP-1064 Allow a ClassResolver to be added to GryoMapper construction
* TINKERPOP-1065 Fix some typos and clarify some wording in the TinkerPop documentation
* TINKERPOP-1066 Add ioRegistries configuration to GraphSON MessageSerializer
* TINKERPOP-1067 Update Groovy to 2.4.5
* TINKERPOP-1072 Allow the user to set persistence options using StorageLevel.valueOf()
* TINKERPOP-1073 HadoopGraph toString() is weird for Spark PersitedRDD data.
* TINKERPOP-1086 Include gryo serializers for java.time related classes
* TINKERPOP-1087 Add has()/order() to FilterRankStrategy
* TINKERPOP-1093 Add Spark init.sh script and update dev documentation.
* TINKERPOP-1100 Look deeply into adding combine()-support in Spark MapReduce.
* TINKERPOP-1117 InputFormatRDD.readGraphRDD requires a valid gremlin.hadoop.inputLocation, breaking InputFormats (Cassandra, HBase) that don't need one

[[release-3-1-0-incubating]]
=== TinkerPop 3.1.0 (Release Date: November 16, 2015)

This release also includes changes from <<release-3-0-1-incubating, 3.0.1-incubating>> and <<release-3-0-2-incubating, 3.0.2-incubating>>.

* Fixed bug in Gryo and GraphSON (with embedded types) serialization for serialization of results returned from `Map.entrySet()`.
* `Transaction` settings for `onReadWrite` and `onClose` are now `ThreadLocal` in nature of standard transactions.
* Optimized `BulkLoaderVertexProgram`. It now uses `EventStrategy` to monitor what the underlying `BulkLoader` implementation does (e.g. whether it creates a new vertex or returns an existing).
* Integrated `NumberHelper` in `SumStep`, `MinStep`, `MaxStep` and `MeanStep` (local and global step variants).
* Gremlin Console remoting to Gremlin Server now supports a configuration option for assigning aliases.
* `CountMatchAlgorithm`, in OLAP, now biases traversal selection towards those traversals that start at the current traverser location to reduce message passing.
* Fixed a file stream bug in Hadoop OLTP that showed up if the streamed file was more than 2G of data.
* Added the ability to set thread local properties in `SparkGraphComputer` when using a persistent context.
* Bumped to Neo4j 2.3.0.
* Deprecated "rebindings" as an argument to Gremlin Server and replaced it with "aliases".
* Added `PersistedInputRDD` and `PersistedOutputRDD` which enables `SparkGraphComputer` to store the graph RDD in the context between jobs (no HDFS serialization required).
* Renamed the `public static String` configuration variable names of TinkerGraph (deprecated old variables).
* Added `GraphComputer.configure(key,value)` to allow engine-specific configurations.
* `GraphStep` is no longer in the `sideEffect`-package and is now in `map`-package (breaking change).
* Added support for mid-traversal `V()`-steps (`GraphStep` semantics updated).
* Fixed `Number` handling in `Operator` enums. Prior this change a lot of operations on mixed `Number` types returned a wrong result (wrong data type).
* Fixed a bug in Gremlin Server/Driver serializer where empty buffers were getting returned in certain cases.
* Renamed `ConjunctionX` to `ConnectiveX` because "conjunction" is assumed "and" (disjunction "or"), where "connective" is the parent concept.
* Removed `PathIdentityStep` as it was a hack that is now solved by `Traversal.Admin.addTraverserRequirement()`.
* Added `Traversal.Admin.addTraverserRequirement()` to allow a traversal strategy or source to add requirements (not only step determined anymore).
* Added `TraverserRequirement.ONE_BULK` to state the traverser does not handle bulk.
* Added `GraphTraversalSource.withBulk(boolean)` to enabled users to compute only using `bulk=1`.
* Gremlin Server supports Netty native transport on linux.
* Removed the need for `GFunction` (etc.) closure wrappers in Gremlin-Groovy as `as Function` can be used to convert closures accordingly.
* Added `SelectColumnStep` (`select(keys)` and `select(values)`). Deprecated `mapKeys()` and `mapValues()`.
* Renamed `gremlin.hadoop.graphInputRDD` and `gremlin.hadoop.graphOutputRDD` to `gremlin.spark.graphInputRDD` and `gremlin.spark.graphOutputRDD`, respectively.
* Fixed a bug in `FoldStep` around bulking. This could be a breaking change, but it is the correct semantics.
* Previous `group()`-behavior steps are accessible via the deprecated `groupV3d0()`-steps.
* `GroupStep` and `GroupSideEffectStep` now do lazy reductions to reduce memory footprint. Breaking change for `group()` semantics.
* Added `GroupStepHelper` with various static methods and classes that are used by both `GroupStep` and `GroupSideEffectStep`.
* Added `BarrierStep` interface with `processAllStarts()` method which process all starts up to yielding the barrier result.
* Fixed a severe threading issue in `TinkerGraphComputer`.
* The location of the jars in HDFS is now `hadoop-gremlin-x.y.z-libs` to ensure multiple TinkerPop versions don't clash.
* `GiraphGraphComputer` will only upload the jars to HDFS if it doesn't already exist (to help speed up startup time).
* `GiraphGraphComputer.workers()` is smart about using threads and machines to load balance TinkerPop workers across cluster.
* `GraphComputer.workers(int)` allows the user to programmatically set the number of workers to spawn.
* Added `GryoSerializer` as the new recommended Spark `Serializer`. Handles `Graph` and `GryoMapper` registries.
* `GryoPool` now makes use of `GryoPool.Builder` for its construction.
* Bumped to Apache Hadoop 2.7.1.
* Bumped to Apache Giraph 1.1.0.
* Bumped to Apache Spark 1.5.1.
* Split Hadoop-Gremlin apart such there is now `hadoop-gremlin`, `spark-gremlin`, and `giraph-gremlin` (and respective `GremlinPlugins`).
* Added `LambdaCollectingBarrierStep` which generalizes `NoOpBarrierStep` and allows for `barrier(normSack)`-type operations.
* Fixed bugs in the Gremlin Server's NIO protocol both on the server and driver side.
* Added `Path.popEquals(Pop,Object)` to check for path equality based on `Pop` (useful for `TraverserRequirement.LABELED_PATH`).
* Added `Operator.assign` to allow setting a direct value.
* `Operator` is now a `BinaryOperator<Object>` with appropriate typecasting for respective number operators.
* Simplified `SackValueStep` so it now supports both `sack(function)` and `sack(function).by()`. Deprecated `sack(function,string)` .
* Added `Parameters` object to allow for the parameters of a step to be retrieved at runtime via a traversal.
* Redesigned (though backwards compatible) `AddEdgeStep`, `AddVertexStep`, and `AddPropertyStep` (and respective `GraphTraversal` API).
* Added `GraphTraversalSource.inject()` so users can spawn a traverser with non-graph objects.
* `GraphStep` can now take a single argument `Collection` which is either elements or element ids (i.e. `g.V([1,2,3])` is supported now).
* Added `LoopsStep` to make the loop counter accessible within `repeat()`, `until()` and `emit()`.
* Gephi Plugin no longer requires manual insert of `store` steps to visualize a traversal.
* Added a `TinkerIoRegistry` that registers a custom serializer for Gryo that will serialize an entire `TinkerGraph` instance.
* Added configuration options to Gephi Plugin for setting the size of nodes visualized.
* Replaced `DedupBijectionStrategy` with the more effective `FilterRankingStrategy`.
* `ComputerAwareSteps` must not only handle step ids, but also step labels.
* Renamed `B_O_P_SE_SL_Traverser` to `B_LP_O_P_SE_SL_Traverser` as it now supports `TraverserRequirement.LABELED_PATH`.
* Added `B_LP_O_S_SE_SL_Traverser` in support of `TraverserRequirement.LABELED_PATH`.
* Added `TraverserRequirement.LABELED_PATH` which only generates path data for steps that are labeled (greatly increases the likelihood of bulking).
* Fixed a bug in `Path` usage that required an API update: `Path.addLabel()` is now `Path.extend(Set<String>)` and `Traverser.addLabels(Set<String>)`.
* Made `Path` iterable, so that it can be ``unfold()``'ed and used by local steps like `min(local)`, `max(local)`, etc.
* `WhereTraversalStep` and `WherePredicateStep` are now the only "special" `Scoping` steps after `MatchStartStep` in `match()`.

==== Bugs

* TINKERPOP-774 order / dedup issues
* TINKERPOP-799 [Proposal] with()-modulator for stream level variable binding.
* TINKERPOP-801 groupCount() fails for vertices (elements?) (using Spark)
* TINKERPOP-811 AddPropertyStepTest fails "all of a sudden"
* TINKERPOP-823 addV() broken for multi-value properties
* TINKERPOP-843 Misspecified HADOOP_GREMLIN_LIBS generates NullPointerException
* TINKERPOP-857 Add GraphComputer.config(key,value)
* TINKERPOP-895 Use "as BinaryOperator" and remove GBinaryOperator
* TINKERPOP-903 Fix empty buffer return upon buffer capacity exceeded
* TINKERPOP-910 In session transaction opened from sessionless request
* TINKERPOP-918 ComputerVerificationStrategy is too restrictive
* TINKERPOP-926 Renamed TinkerGraph public statics to common pattern used for other statics.
* TINKERPOP-948 AbstractGremlinProcessTest.checkMap not asserted in GroupTest
* TINKERPOP-953 Artifact equality is not evaluating properly
* TINKERPOP-955 HashMap$Node not serializable

==== Improvements

* TINKERPOP-297 Ensure Consistent Behavior Over Deleted Elements *(breaking)*
* TINKERPOP-333 Support VertexProperty in PartitionStrategy
* TINKERPOP-391 More fluency in GraphComputer for parameterization.
* TINKERPOP-616 Use Spark 1.3.0 in Hadoop-Gremlin.
* TINKERPOP-624 Passing Detached/Referenced to Graph.vertices/edge()
* TINKERPOP-680 Configurable Channelizer for Gremlin Driver
* TINKERPOP-728 Improve Remote Graph Object Treatment in Console
* TINKERPOP-756 Provide a strict parsing option for GraphMLReader
* TINKERPOP-760 Make loop counter accessible within repeat()
* TINKERPOP-762 Allow mid-traversal V() (and E())
* TINKERPOP-765 Decompose AbstractTransaction for different transactional contexts *(breaking)*
* TINKERPOP-767 Path should play well with "local" steps.
* TINKERPOP-768 MatchStep in OLAP should be smart about current vertex.
* TINKERPOP-769 Make the introduction of the TP3 docs story better.
* TINKERPOP-772 TraverserRequirement.LABELED_PATH
* TINKERPOP-796 Support merge binary operator for Gremlin sacks *(breaking)*
* TINKERPOP-798 [Proposal] Rename mapKeys()/mapValues() to select(keys) and select(values).
* TINKERPOP-802 Provide sack(object) so that the sack can be directly set.
* TINKERPOP-803 A better solution to g.V(someCollection.toArray())
* TINKERPOP-805 Enforce AutoCloseable Semantics on Transaction *(breaking)*
* TINKERPOP-821 Improve testing around TraversalHelper around recursive methods
* TINKERPOP-825 [Proposal] SetBulkStep (sideEffectStep)
* TINKERPOP-826 OneToManyBarrierStrategy
* TINKERPOP-827 Add a console session to the PageRank section of the docs.
* TINKERPOP-829 TinkerGraphComputer should support the user specified thread/worker count.
* TINKERPOP-835 Shade Jackson Dependencies *(breaking)*
* TINKERPOP-836 Support Hadoop2 in place of Hadoop1
* TINKERPOP-850 Reduce Graph.addVertex overload ambiguity *(breaking)*
* TINKERPOP-851 GroupCountStep needs a by() for the count.
* TINKERPOP-861 Solve "The Number Problem" for Operator (and follow on operators)
* TINKERPOP-863 [Proposal] Turn off bulking -- or is there something more general? (hope not).
* TINKERPOP-866 GroupStep and Traversal-Based Reductions *(breaking)*
* TINKERPOP-868 Allow Spark Gremlin Computer to Reuse Spark Contexts
* TINKERPOP-874 Rename Gremlin-Spark properties using gremlin.spark prefix. *(breaking)*
* TINKERPOP-876 Rename VendorOptimizationStrategy XXXOptimizationStrategy *(breaking)*
* TINKERPOP-879 Remove deprecated promoteBindings from GremlinExecutor *(breaking)*
* TINKERPOP-885 Change Transaction.onReadWrite() to be a ThreadLocal setting *(breaking)*
* TINKERPOP-888 GraphTraversal.property overloads *(breaking)*
* TINKERPOP-896 Simplify the {{withSack}} methods of {{GraphTraversalSource}}. *(breaking)*
* TINKERPOP-897 Remove deprecated GSupplier, GFunction, GConsumer, etc. methods. *(breaking)*
* TINKERPOP-898 Rename ConjuctionP and ConjuctionStep to ConnectiveP and ConnectiveStep *(breaking)*
* TINKERPOP-899 Bump to the latest version of Neo4j.
* TINKERPOP-900 Provide by(object) which compiles to by(constant(object))
* TINKERPOP-901 Option for use of Netty epoll on Linux to reduce GC pressure
* TINKERPOP-904 BulkLoaderVertexProgram optimizations
* TINKERPOP-905 Harden time oriented tests in ResultQueueTest
* TINKERPOP-907 getters for RepeatStep.untilTraversal and RepeatStep.emitTraversal
* TINKERPOP-908 Use line breaks in documentation
* TINKERPOP-909 Improve steps that handle numeric data
* TINKERPOP-911 Allow setting Thread Specific Spark JobGroup/Custom Properties based on hadoop conf
* TINKERPOP-913 Rename Gremlin Server arguments rebinding to alias
* TINKERPOP-914 DriverRemoteAcceptor in Gremlin Console supports aliases
* TINKERPOP-917 Add HadoopGraph.open(String)
* TINKERPOP-922 Add a book for Developer Documentation
* TINKERPOP-923 Add a book for Tutorials
* TINKERPOP-925 Use persisted SparkContext to persist an RDD across Spark jobs.
* TINKERPOP-931 Make it possible to extend the core OpProcessor implementations
* TINKERPOP-933 Improve release process to get files named properly
* TINKERPOP-935 Add missing "close" operation to the session opProcessor docs

== TinkerPop 3.0.0 (A Gremlin Rāga in 7/16 Time)

image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/gremlin-hindu.png[width=225]

[[release-3-0-2-incubating]]
=== TinkerPop 3.0.2 (Release Date: October 19, 2015)

* Cleaned up `ext/` directory when plugin installation fails for `gremlin-server` and `gremlin-console`.
* Fixed issues in `gremlin-server` when configured for HTTP basic authentication.
* Made `BulkLoaderVertexProgram` work for any persistent TP3-supporting graph (input and output).
* `TreeSideEffectStep` now implements `PathProcessor` which fixed a `ComputerVerificationStrategy` issue.
* Added a shell script that verifies source and binary distributions.
* Fixed a bulk related bug in `GroupStep` when used on `GraphComputer` (OLAP).
* Gremlin Server binary distribution now packages `tinkergraph-gremlin` and `gremlin-groovy` as plugins to be consistent with Gremlin Console's packaging.
* The `RepeatStep` clauses (`until()`,`emit()`,`repeat()`) can only be set at most one time in order to prevent user confusion.
* Fixed a `clone()` bug in `RepeatStep`, `TreeStep`, `GroupCountStep`, `GroupStep`, and `TraversalRing`.
* Fixed a thread context bug in `TinkerGraphComputer`.
* Fixed issues with the `gremlin-driver` related to hanging connections in certain conditions.
* TinkerGraph now has an option for persistence where the data is saved on `close()` and, if present, loaded on `open()`.
* Added an overload for `GremlinExecutor.eval()` that takes a `Lifecycle` object to override some default settings from `GremlinExecutor.Builder`.
* Improved session closing for transactional graphs during shutdown of Gremlin Server.
* Fixed id parameter used in tests for `GroovyStoreTest` and `GroovyRepeatTest` to not be treated as an embedded string.
* `GraphStep` will convert any `Vertex` or `Edge` ids to their id `Object` prior to submission to `GraphComputer` (OLAP).

==== Bugs

* TINKERPOP-814 ConnectionPool can fill with dead Connections
* TINKERPOP-816 Gryo deserialization of error response with null message causes NPE and protocol desync
* TINKERPOP-817 Gryo serialization of large responses fails and causes protocol desync
* TINKERPOP-840 TreeTest Is not being ignored via ComputerVerificationStrategy
* TINKERPOP-849 gremlin-server doesn't close sessions on 'close' opcode
* TINKERPOP-855 sasl authentication type error due to Json format
* TINKERPOP-865 Errors with HTTP REST basic auth
* TINKERPOP-867 TinkerGraphProvider does not initialize temp dir
* TINKERPOP-870 Rebound client requires a connection to occur on the underlying client.
* TINKERPOP-877 Driver hangs if SSL enabled on server but not on client

==== Improvements

* TINKERPOP-828 TinkerGraph can supportPersistence(), should we allow it.
* TINKERPOP-830 process-docs.sh introduces extra white space dependent on console width
* TINKERPOP-839 Docs should have a ${version.number} under the logo.
* TINKERPOP-852 A shell script that validates the distribution artifacts at release time
* TINKERPOP-853 TinkerPop Logo in JavaDoc index.html
* TINKERPOP-858 Cleanup after failed :install

[[release-3-0-1-incubating]]
=== TinkerPop 3.0.1 (Release Date: September 2, 2015)

* `Compare` now uses `BigDecimal` internally to ensure that precision is not lost on standard number comparisons.
* Renamed `ComputerVerificationStrategy` to `VerificationStrategy` so all the verification strategies can use it.
* Added `StandardVerificationStrategy` that throws exceptions for illegal traversal patterns on the standard engine (which extends to `GraphComputer`).
* Added `GraphFeatures.supportsConcurrentAccess()` to allows `Graph` implementations to signify if multiple instances can access the same data.
* Clarified semantics of `Transaction.close()` in unit tests - now refers only to closing the current transaction in the current thread.
* `Neo4jGraph` no longer uses `OptOut` on `TransactionTest.shouldRollbackOnCloseWhenConfigured` (formerly `shouldRollbackOnShutdownWhenConfigured`)
* Gremlin Server initialization scripts can now return a `Map` of values that will become global bindings for the server.
* Introduced the `--dryRun` option to the document generation process which ignores actual script execution in the Gremlin Console.
* Fixed bug in `EventStrategy` around property changed events when calling `property` without cardinality or meta-property values.
* Improved support for the `Accept` header for REST-based requests in Gremlin Server.
* `GraphFactory` now allows specification of the class to use to instantiate the `Graph` through the `GraphFactoryClass` annotation.
* Added `wrapAdjacencyList` and `unwrapAdjacencyList` options to `GraphSONWriter` and `GraphSONReader` respectively, thus allowing valid JSON to be written/read if the user desires.
* Added Gremlin Server/Driver authentication support via SASL.
* Added Basic HTTP authentication support for REST in Gremlin Server.
* Added Gremlin Server plugin to help with "credential graph" management (used in conjunction with authentication features of Gremlin Server).
* Added "secure" Gremlin Server/Driver example configuration files.
* Adjusted configuration for javadoc generation to eliminate error messages.
* Removed "reserved" graph concept names from tests (e.g. "label", "edge", "value") to support the convention of avoiding these strings for property names.
* Introduced `GraphProvider.Descriptor` which annotates a `GraphProvider` implementation to describe what `GraphComputer` implementation will be used.
* Modified `OptOut` to include a `computers` attribute which allows the `Graph` to opt-out of computer-based tests for specific computation engines.
* Added a `SandboxExtension` that can be plugged into `TypeCheckedCustomizerProvider` and `CompileStaticCustomizerProvider` to control classes and methods that can be used in the `GremlinGroovyScriptEngine`.
* Added a number of new `ImportCustomizerProvider` implementations such as, `TimedInterruptCustomizerProvider`, `TypeCheckedCustomizerProvider` and others.
* Refactored `GremlinGroovyScriptEngine` to make more general use of `ImportCustomizerProvider` implementations.
* Removed `SecurityCustomizerProvider` class and the "sandbox" configuration on the `ScriptEngines` class - this was an experimental feature and not meant for public use.
* Removed dependency on `groovy-sandbox` from the `gremlin-groovy` module.

==== Bugs

* TINKERPOP-770 Exception while AddPropertyStep tries to detach vertex property
* TINKERPOP-780 Use of fold() in repeat()
* TINKERPOP-782 map(Traversal) should declare requirements of child
* TINKERPOP-785 Gremlin Server Not Properly Reporting Port Conflict
* TINKERPOP-792 select at start of match traversal on Map can fail
* TINKERPOP-794 IncidentToAdjecentStrategy malfunction
* TINKERPOP-804 Failed installing neo4j-gremlin extension on Windows 7
* TINKERPOP-822 Neo4j GraphStep with element arguments ignores has  *(breaking)*

==== Improvements

* TINKERPOP-576 Gremlin Server Authentication
* TINKERPOP-582 Remove Groovy Sandbox Dependency
* TINKERPOP-610 General graph concept names in test schema
* TINKERPOP-656 IoRegistry Chaining
* TINKERPOP-690 Be able to OPT_OUT for Standard, but not Computer *(breaking)*
* TINKERPOP-699 GraphSON writeGraph not producing valid json object
* TINKERPOP-750 Compare should not have special case for Number
* TINKERPOP-752 Make Gremlin Server Better Respect ACCEPT
* TINKERPOP-764 Unify semantics of Transaction.close() in tests and documentation *(breaking)*
* TINKERPOP-771 IoRegistry Instantiation With GryoPool
* TINKERPOP-778 Support GraphFactory location via annotation.
* TINKERPOP-791 Document rules for committers
* TINKERPOP-797 order() seems to only like List? *(breaking)*
* TINKERPOP-808 TraversalComparator.comparator needs a getter

=== TinkerPop 3.0.0 (Release Date: July 9, 2015)

* Modified the `GremlinExecutor` to catch `Throwable` as opposed to `Exception` so as to properly handle `Error` based exceptions.
* Modified the `GremlinGroovyScriptEngine` compilation configuration to prevent inappropriate script evaluation timeouts on standalone functions.
* Added a custom configuration for "timed interrupt" in the `ScriptEngines` instantiation of the `GremlinGroovyScriptEngine`.
* Added `mapKeys()` (`MapKeyStep`) and `mapValues()` (`MapValueStep`) to get the keys and values of a map, respectively.
* `select()` no longer supports empty arguments. The user must specify the keys they are selecting.
* `MatchStep` and `match()` no longer have a "start label" parameter -- it is computed if the incoming traverser does not have requisite labels.
* Turned transactional testing back on in Gremlin Server using Neo4j.
* Renamed `Transaction.create()` to `Transaction.createThreadedTx()`.
* Added `TraversalParent.removeGlobalChild()` and `TraversalParent.removeLocalChild()`.
* Added a `clear` option to the Gephi Plugin to empty the Gephi workspace.
* Refactored `ResultSet` and related classes to stop polling for results.
* `AbstractStep` now guarantees that bulk-less and null-valued traversers are never propagated.
* Added `dedup(string...)` which allows for the deduplication of a stream based on unique scope values.
* Fixed multiple bugs in the Gephi Plugin related to refactoring of traversal side-effects.
* Split `WhereStep` into `WherePredicateStep` and `WhereTraversalStep` to simplify internals.
* Prevent the driver from attempting to reconnect on a dead host if the `Cluster.close()` method has been called.
* Renamed the "deactivate" option on `:plugin` command to "unuse" to be symmetric with the "use" option.
* Added `Traversal.toStream()` to turn the `Traversal<S,E>` into a `Stream<E>`.
* Added `Scoping.Variable` enum of `START` and `END` which allows the `Scoping` step to specify where its bindings are.
* `ComputerVerificationStrategy` is smart about not allowing `WhereXXXStep` with a start-variable to run in OLAP as it selects the value from the path.
* Rewrote `MatchStep` where it now works on `GraphComputer`, solves more patterns, provides plugable execution plans, supports nested AND/OR, `not()`-patterns, etc.
* Renamed `Graphs` in Gremlin Server to `GraphManager`.
* Fixed bug in Gremlin Driver where client-side serialization errors would not bubble up properly.
* Fixed problem in Gremlin Server to ensure that a final `SUCCESS` or `NO_CONTENT` message assured that the transaction was successful in sessionless requests.
* Arrow keys for cycling through command history now work in Gremlin Console when being used on Windows.
* Added `NotStep` and `not(traversal)` for not'ing a traversal (integrates like `ConjunctionStep`).
* Removed `TraversalP`. Traversals and `P`-predicates are completely separate concepts.
* `has(key,traversal)` is now an alias for `filter(__.values(key).traversal)` using `TraversalFilterStep`.
* Simplified `SubgraphStrategy` by using `TraversalFilterStep` instead of the more complex `WhereStep`.
* Added `TraversalMapStep`, `TraversalFlatMapStep`, `TraversalFilterStep`, and `TraversalSideEffectStep` which all leverage an internal traversal.
* Added `Path.get(pop,label)` as default helpers in `Path`.
* Added `Pop.first`, `Pop.last`, and `Pop.all` as enums for getting single items from a collection or a list of said items.
* Changed `GremlinServer.start()` to return a `CompletableFuture` that contains the constructed `ServerGremlinExecutor`.
* Restructured `IoTest` breaking it up into smaller and more logically grouped test cases.
* Gremlin Server `Settings` now has sensible defaults thus allowing the server to be started with no additional configuration.
* Fixed garbled characters in Gremlin Console that notably showed up in `:help`
* Replaced dependency on `groovy-all` with individual Groovy dependencies as needed.
* Bumped `org.gperfutils:gbench` to the `0.4.3` and a version explicitly compatible with Groovy 2.4.x.
* Renamed `KeyStep` to `PropertyKeyStep` to be consistent with `PropertyValueStep`.
* Added `Gremlin-Lib-Paths` to modify paths in plugin `lib` directory.
* Modified the capabilities of `Gremlin-Plugin-Paths` to delete paths that have no value on the right-hand-side of the equals sign.
* The REST API in Gremlin Server now requires parameters to be defined with a "bindings." prefix.
* Modified the REST API in Gremlin Server to accept rebindings.
* Added `rebindings` optional argument to sessionless requests to allow global bindings to be rebound as needed.
* Added `LazyBarrierStrategy` which "stalls" a traversal of a particular form in order to gain a bulking optimization.
* `CollectingBarrierStep` supports `maxBarrierSize` for "lazy barrier," memory conservation.
* `Scoping` now has `getScopeKeys()` to get the keys desired by the scoping step.
* Refactored SSL support in the Gremlin Server/Driver.
* Factored out `ServerGremlinExecutor` which contains the core elements of server-side script execution in Gremlin Server.
* Bumped to netty 4.0.28.Final.
* Refactored the `Mutating` interface and introduce `CallbackRegistry` interface around `EventStrategy`.
* Changed `onReadWrite` and `onClose` of `AbstractTransaction` to be synchronized.
* Added `LabelP` to support index lookups and `has()` filtering on `Neo4jGraph` multi-label vertices.
* `AddEdgeStep` is now a `Scoping` step.
* Added a fully defined set of `Graph.Feature` implementations to `EmptyGraph`.
* Dropped dependency on `org.json:json` - used existing Jackson dependency.
* Added back neo4j-gremlin as the licensing of the Neo4j API is now Apache2.
* Added `willAllowId` method to features related to vertices, edges and vertex properties to test if an identifier can be use when `supportsUserSuppliedIds` is `true`.
* Fixed a bug in `GraphTraversal.choose(predicate,trueTraversal,falseTraversal)`.
* Removed `MapTraversal`, `MapTraverserTraversal`, `FilterTraversal`, and `FilterTraverserTraversal` as these are simply `__.map(function)` and `__.filter(predicate)`.
* Include `hadoop-gremlin` Hadoop configuration sample files in Gremlin Console distribution.
* Iteration of results in Gremlin Server occur in the same thread as evaluation and prior to transaction close.
* TinkerGraphComputer now supports every `ResultGraph`/`Persist` combination.
* `GraphComputerTest` extended with validation of the semantics of all `ResultGraph`/`Persist` combinations.
* GiraphGraphComputer no longer requires an extra iteration and MapReduce job to derive the full `Memory` result.
* SparkGraphComputer now supports `InputRDD` and `OutputRDD` to allow vendors/users to use a `SparkContext` to read/write the graph adjacency list.
* Added `Scoping.getScopeValue()` method so all "selecting" steps use the same pattern for map, path, and sideEffect data retrieval.

=== TinkerPop 3.0.0.M9 (Release Date: May 26, 2015)

* Removed `GraphComputer.isolation()` as all implementations use standard BSP.
* Added a Gremlin Server `LifeCycleHook` to ensure that certain scripts execute once at startup and once at shutdown.
* `has(key)` and `hasNot(key)` are now aliases for `where(values(key))` and `where(not(values(key)))`, respectively.
* TinkerGraph classes are now final to restrict user and vendor extension.
* Added `TraversalStrategy.VendorOptimization` to ensure that all TinkerPop optimizations execute first on the known TinkerPop steps.
* Added `TailGlobalStep` and `TailLocalStep` (`tail()`) which gets objects from the end of the traversal stream.
* `AndStep` and `OrStep` are now simply markers where `WhereStep(a.and(b).and(c)...and(z))` is the compilation.
* Moved `Compare`, `Contains`, `Order`, `Operator`, and `P` to `process/traversal` from `structure/` as they are process-based objects.
* `HasContainer` now uses `P` predicate as helper methods and tests are more thorough on `P`.
* Changed Gremlin Server integration/performance tests to be runnable from within the `gremlin-server` directory or from the project root.
* Moved the string methods of `TraversalHelper` to `StringFactory`.
* Renamed JSON-related serializers for Gremlin Server to be more consistent with GraphSON naming.
* Removed `HasTraversalStep` in favor of new `P.traversal` model with `HasStep`.
* Fixed bug in `WsGremlinTextRequestDecoder` where custom serializers from graphs were not being used.
* Added `AndP` which allows for the `and()`-ing of `P` predicates.
* `Order.opposite()` is now `reversed()` as that is a `Comparator` interface method with the same semantics.
* `Compare/Contains/P.opposite()` are now `negate()` as that is a `BiPredicate` interface method with the same semantics.
* `has(traversal)` is replaced by `where(traversal)` and `has(key,traversal)`. `HasXXX` is always with respects to an element property.
* Added `TraversalScriptHelper` with static methods for dynamically creating a `Traversal` from a JSR 223 `ScriptEngine`.
* Changed `SubgraphStrategy` to take `Traversal` rather than `Predicate` for filtering.
* Improved `SubgraphStrategy` to only modify the `Traversal` if filtering was required.
* Improved logging of errors in the `HttpGremlinEndpointHandler` to include a stracktrace if one was present.
* Moved `AbstractGremlinSuite.GraphProviderClass` to `org.apache.tinkerpop.gremlin.GraphProviderClass`.
* Simplified the Gremlin-Groovy test suite where there is now no distinction between `STANDARD` and `COMPUTER` tests.
* `VertexProgram` and `MapReduce` now add a `Graph` parameter to `loadState(Graph, Configuration)`.
* Added `ScopingStrategy` which auto-scopes `select()` and `where()` so the language looks clean.
* Added `Scoping` as a marker interface to state that a step desires a particular `Scope`.
* `SelectStep`, `SelectOneStep`, and `WhereStep` support both `Scope.local` and `Scope.global` for `Map<String,Object>` or `Path` analysis, respectively.
* Fixed a bug in the `TraversalStrategies` sort algorithm.
* Removed numerous unused static utility methods in `TraversalHelper`.
* TinkerGraph process suite tests are now running with and without strategies in place.
* Added `IncidentToAdjacentStrategy` which rewrites `outE().inV()`, `inE().outV()` and `bothE().otherV()` to `out()`, `in()` and `both()` respectively.
* Renamed `ComparatorHolderRemovalStrategy` to `OrderGlobalRemovalStrategy` as it now only applies to `OrderGlobalStep`.
* Anonymous traversal no longer have `EmptyGraph` as their graph, but instead use `Optional<Graph>.isPresent() == false`.
* Added `Traversal.Admin.setGraph(Graph)` as strategies that need reference to the graph, need it across all nested traversals.
* `AbstractLambdaTraversal` is now smart about `TraversalParent` and `TraversalStrategies`.
* Fixed bug in `GraphML` reader that was not allowing `<edge>` elements to come before `<node>` elements as allowable by the GraphML specification.
* Added `VertexFeature.getCardinality`.
* Added `AdjacentToIncidentStrategy` which rewrites `out().count()` to `outE().count()` (and similar such patterns).
* `GryoPool` now takes a `Configuration` object which allows setting the size of the pool and the `IoRegistry` instance.
* Added `PersistResultGraphAware` interface which is used by `OutputFormats` to specify persistence possibilities for a Hadoop `GraphComputer`.
* `ElementIdStrategy` now allows the identifier property to be set directly (and not only by specifying `T.id`).
* Added sample configuration files for registering a `TraversalStrategy` in Gremlin Server.
* Added response status code for `NO_CONTENT` to represent output for a successful script execution without a result (e.g. an empty `Iterator`).
* Removed the notion of a "terminator" message from the Gremlin Server protocol - new response status code for `PARTIAL_CONTENT`.
* `Path` and `Step` labels are ordered by the order in which the respective `addLabel()` calls were made.
* A `Step` now has a `Set<String>` of labels. Updated `as()` to take a var args of labels.
* Dropped `BatchGraph` from the code base - it will be replaced by bulk loader functionality over OLAP.
* `TraversalSideEffects` now implements `Optional` semantics. Less code as Java8 provides the helper methods.
* `TraversalScriptSupplier` now takes an `Object` var args for setting `ScriptEngine` bindings if needed.
* `Compare` is now more lenient on `Number`-types.
* Removed `Compare.inside` and `Compare.outside` as they are not primitive comparators and should be composed from primitives.
* Introduced `P` (predicate) for cleaner looking `is()`, `has()`, and `where()` calls -- e.g. `has('age',eq(32))`.
* `GraphTraversalSource` is now the location for `withXXX()` operations. No longer do they exist at `GraphTraversal`.
* All `Traverser` objects now extend from `AbstractTraverser` or a child that ultimately extends from `AbstractTraverser`.
* OLTP `select()` now returns a list for traversals with duplicate labels (as this was a unintended side-effect of `SparsePath`).
* Removed the `SparsePath` optimization as it led to numerous corner-case inconsistencies.
* `VertexWritable` serializes and deserializes the `StarGraph` object -- no more intermediate `DetachedXXX` objects.
* Gremlin Server better supports the settings for the high and low watermark that will slow writes to clients that are lagging.
* Added `GraphReader.readObject()` and `GraphWriter.writeObject` abstractions for those implementations that can support them.
* Altered `GraphWriter.writeVertices()` method to take an `Iterator` of vertices rather than a `Traversal`.
* GraphSON format for output from `GraphWriter.writeVertex`, `GraphWriter.writeVertices`, and `GraphWriter.writeGraph` have all changed now that they use `StarGraph` serialization.
* Gryo format for output from `GraphWriter.writeVertex`, `GraphWriter.writeVertices`, and `GraphWriter.writeGraph` have all changed now that they use `StarGraph` serialization.
* Added read and write methods to `GraphReader` and `GraphWriter` for `Property` and `VertexProperty`.
* Reduced object creation in GraphSON during serialization.
* Moved `T` tokens to the `structure/` package as its more general than `process/`.
* `Attachable.attach()` now takes a `Method` to determine whether to attach via `GET`, `CREATE`, or `GET_OR_CREATE`.
* Decreased size of Gremlin Server `RequestMessage` and `ResponseMessage` serialization payloads and reduced object creation.
* `Graph.empty()` no longer required with the introduction of `ShellGraph` which is a placeholder for a graph class and computer.
* `VertexProperty.Cardinality` default is now vendor chosen. If the vendor has not preference, they should use `Cardinality.single`.
* `Messenger.receiveMessages()` no longer takes a `MessageScope` and thus, consistent behavior between message-passing and message-pulling systems.
* Changed the `gremlin.tests` environment variable for test filtering to the more standard convention of `GREMLIN_TESTS` and made it work for all test suites.
* Removed `back()`-step as `select()`-step provides the same behavior with more intelligent optimizations and `by()`-modulation.
* Removed `Graph.Helper` method annotation and related infrastructure in tests.
* Modified header of Gryo to be 16 bytes instead of 32 (and removed the version stamp).
* Removed the concept of handling version in Gryo via the builder as it wasn't really accomplishing the capability of ensuring backward compatibility.
* Moved `Exceptions.propertyRemovalNotSupported` from `Element` to `Property` for consistency.
* Provided a method for Gremlin Server to bind `TraversalSource` objects for use in scripts.
* Modified the reference implementation for dealing with "custom" identifier serialization in GraphSON - See `IoTest.CustomId` for the example.
* Modified `g.vertices/edges` and related methods and tests to support non-type specific querying (e.g. `g.V(1)` and `g.V(1L)` should both return the same result now).
* `TinkerGraph` supports an `IdManager` which helps enforce identifier types and improve flexibility in terms of how it will respond to queries around identifiers.
* `DetachedXXX` now uses the standard `structure/` exceptions for unsupported operations.
* Added private constructors to all `Exceptions` inner classes in the respective `structure/` interfaces.
* Re-introduced `ReferenceXXX` to ensure a smaller data footprint in OLAP situation (`DetachedXXX` uses too much data).
* `Attachable` now has a set of static exception messages in an `Exceptions` inner class.
* Added `StarGraph` which is a heap efficient representation of a vertex and its incident edges (useful for `GraphComputer` implementations).
* `TraverserSet` uses a `FastNoSuchElementException` on `remove()` for increased performance.
* Add `Profiling` interface to enable vendors to receive a `Step's MutableMetrics`.

=== TinkerPop 3.0.0.M8 (Release Date: April 6, 2015)

* Removed Neo4j-Gremlin from this distribution due to GPL licensing. Working with Neo4j team to reintroduce by M9.
* Altered structure of plugin directories for Gremlin Server and Gremlin Console to allow for the full `lib` directory with all dependencies and the lighter `plugin` directory which contains filtered dependencies given the path.
* Improved `OptOut` to allow for exclusion of a group of tests by specifying a base test class.
* `GraphComputerTest` is now Java8 specific and much easier to extend with new test cases.
* Merged the `gremlin-algorithm` module into `gremlin-test`.
* Removed `LambdaVertexProgram` and `LambdaMapReduce` as it will be one less thing to maintain.
* Gremlin Console accepts a `max-iteration` configuration via the standard `:set` command to limit result iteration.
* `Vertex.property()` default behavior is now `Cardinality.single`.
* Added `ElementIdStrategy` as a `TraversalStrategy`.
* Introduce `AbstractTransaction` to simplify implementation of standard transactional features for vendors.
* Added `EventStrategy` to generate `Graph` modification events to listeners.
* Added test to enforce return of an empty `Property` on `VertexProperty.property(k)` if no meta properties exist.
* Added methods to registered transaction completion listeners on `Transaction` and provided a default implementation.
* Fixed bug in Neo4j where return of an empty meta property was returning a `NullPointerException`.
* Refactored step API -- the TinkerPop3 steps are the foundation for any domain specific language (including graph).
* `MapReduce` now has `workerStart(Stage)` and `workerEnd(Stage)` methods with analagous semantics to `VertexProgram`.
* Hadoop-Gremlin `ObjectWritable` now leverages Kryo for data serialization.
* `GiraphGraphComputer` supports arbitrary objects as the vertex id -- previously, only long ids were supported.
* Added `VertexProgramPool` to support thread safe pooling of vertex programs for graph computers that provide threaded workers.
* Added `GryoPool` to support thread safe pooling of Gryo readers and writers.
* Added `TraversalSource` which contextualizes a traversal to a graph, DSL, execution engine, and runtime strategies.
* Added `AddVertexStep` (`addV`), `AddPropertyStep` (`property`), and changed `AddEdgeStep` to a map-step instead of a sideEffect-step.
* Added `compile` method to `GremlinExecutor` and related classes.
* Fixed bug in Gremlin Server that was generating extra response messages on script evaluation errors.
* Changed the `Memory` API to not return the mutated value on `or`, `and`, `incr` as it is too difficult to implement faithfully in a distributed system.
* Added `SparkGraphComputer` to Hadoop-Gremlin which uses Apache Spark as the underlying computing engine.
* Renamed "Gremlin Kryo" to "Gryo".
* Refactored `TinkerWorkerPool` to use `ExecutorService` so as to reuse threads when executing graph computer functions.
* Removed `Reducing.Reducer` and `ReducingStrategy`. Previous `Reducing` classes are now `MapReducer` classes.
* Refactored the "process" test suite to allow for better test configuration with respect to different `TraversalEngine` implementations.
* Added `hasNot(traversal)` which is a faster way of doing `has(traversal.count().is(0L))`.
* `TraversalStrategy.apply(traversal)` is the new method signature as the `TraversalEngine` can be retrieved from the `Traversal`.
* `TraversalEngine` is now an interface and provided to the traversal by the graph. `Graph` methods added to set the desired traversal engine to use.
* Added `count(local)`, `sum(local)`, `max(local)`, `min(local)`, `mean(local)`, `dedup(local)`, `sample(local)` and `range(local)` for operating on the local object (e.g. collection, map, etc.).
* `TraversalComparator` exists which allows for `order().by(outE().count(),decr)`.
* Added Apache Rat plugin to detect the proper inclusion of license headers in files.
* A `Traversal` now respects thread interruption during iteration, throwing a `TraversalInterruptionException` if it encounters interruption on the current thread.
* Apache refactoring: `com.tinkerpop` -> `org.apache.tinkerpop`.
* `Traversal` is now `Serializable` and with most queries no longer needing lambdas, Gremlin-Java works over the wire.
* Added `VertexProperty.Cardinality` with `list`, `set`, and `single`. No more `Vertex.singleProperty()` method.
* Added `RangeByIsCountStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
* Added `CoalesceStep` / `coalesce()` that emits the first traversal which emits at least one element.
* Added more syntactic sugar tricks to the Gremlin sugar plugin -- `&`, `|`, `select from`, `gt`, etc.
* `Traversal.Admin` is consistent internal to steps, traversals, strategies, etc. For the user, `Traversal` is all they see.
* `TraversalHolder` is now called `TraversalParent` with the child/parent terminology used throughout.
* Added `GroovyEnvironmentPerformanceSuite`.
* Provided more robust shutdown capabilities for the thread pools used in `GremlinExecutor`.
* A massive `process/` package reorganization -- class names are still the same, just in new packages.
* Bumped `neo4j-graph` to Neo4j 2.1.6.
* Bumped to Groovy 2.4.1.
* Added a new "performance" test suite for Gremlin Process.
* Steps now only operate with traversals -- no more lambdas. Lambda-> `Traversal` conversion utilities added.
* `SideEffectStep` always requires a `Consumer`. Steps that were consumer-less simply extends `AbstractStep`.
* Simplified the `Neo4jGraph` implementation by now allowing `cypher()` mid-traversal. Only available via `g.cypher()`.
* Moved `clock()` out of the Utility plugin. It is now available to both Groovy and Java.
* Changed the `OptOut` annotation to allow for ignoring an entire test case using a wildcard.
* Added `AndStep` and `OrStep` filters to support arbitrary conjunction of traversals.
* `__` is now a class with static `GraphTraversal` methods and thus `repeat(out())` is possible.
* Added `IsStep` / `.is()` that supports filtering scalar values.
* `Neo4jGraph` and `TinkerGraph` no longer create new `Feature` instances on each feature check.
* Added `Compare.inside` and `Compare.outside` for testing ranges. Removed `between()` as now its `has('age',inside,[10,30])`.
* `GraphTraversal.has()` no longer requires the element type to be cast in the traversal definition.
* Fixed a `ConcurrentModificationException` bug in TinkerGraph that occurred when doing full vertex/edge scans and removing elements along the way.
* Added `Scope.local` and `Scope.global` in support of `OrderLocalStep` and `OrderGlobalStep` via `order(scope)`.
* Added `Order.keyIncr`, `Order.keyDecr`, `Order.valueIncr`, and `Order.valueDecr` in support of `Map` sorting.
* Added `Order.shuffle` and removed `shuffle()` in favor of `order().by(shuffle)`.
* Changed `Order implements Comparator<Comparable>` to `Order implements Comparator<Object>` as its now generalized to multiple types of objects.
* The `maxContentLength` setting in Gremlin Server is now respected by the HTTP/REST Gremlin endpoint.
* Fixed resource leak in the HTTP/REST Gremlin endpoint of Gremlin Server.
* Refactored Gremlin Server `start` and `stop` functions to return `CompletableFuture`.
* HTTP REST error response JSON objects from Gremlin Server should no longer have issues with control characters, line feeds, etc.
* Added `MeanStep`, `mean()`, and `MeanNumber` for calculating number averages in a traversal.
* Greatly simplified all the traversal `MapReduce` implementations due to the introduction of `VertexTraversalSideEffects`.
* Added `VertexTraversalSideEffects` as a cheap, static way to get a sideEffect-view of a vertex in OLAP.
* Added `TraversalHelper.isLocalStarGraph()` which determines if a traversal is contained within the local star graph.
* Added `TraversalVerificationStrategy` to verify if the traversal can be executed on respective engine.
* Refactored `GraphTraversal.cap()` to `GraphTraversal.cap(String...)` to support multi-sideEffect grabs.
* Added GraphSON serialization for `Path`.
* Added `Traversal.Admin.getTraverserRequirements()` and removed `TraversalHelper.getTraverserRequirements(Traversal)`.
* `Traversal.equals()` is no longer computed by determining if the objects returned are equal.
* Altered messaging in Gremlin Console when using a remote that is not yet activated.
* Fixed potential for deadlock in Gremlin Driver when waiting for results from the server.
* Added the `useMapperFromGraph` serializer option to the Gremlin Server configuration file to allow auto-registration of serialization classes.
* Refactored Netty pipeline structure to not have a second "Gremlin" executor group and instead used a standard `ExecutorService`.
* Refactored the `GremlinExecutor` to take an optional transformation function so as to allow manipulation of results from `eval` in the same thread of execution.
* Fixed issue with the `HttpGremlinEndpointHandler` where requests were getting blocked when `keep-alive` was on.
* Added `MinStep` and `MaxStep` with respective `min()` and `max()`.
* `CountStep` and `SumStep` now extend `ReducingBarrierStep` and no longer are sideEffect steps.
* `SideEffectCapStep` now extends `SupplyingBarrier` and is much simpler than before.
* Added `SupplyingBarrier` which simply drains the traversal and emits the value of a provided supplier.
* Added `TraversalLambda` which implements function, predicate, and consumer over a provided traversal.
* Any non-core `Step` that takes a function or predicate can now take a traversal which maps to `traversal.next()` (function) and `traversal.hasNext()` (predicate).
* `CollectingBarrierStep` is no longer abstract and added `GraphTraversal.barrier()` which is analogous to `fold().unfold()`, though cheaper.
* Added `TraversalOptionHolder` for branching steps to index works with corresponding `GraphTraversal.option()`.
* `BranchStep` is now a proper generalization of `UnionStep` and `ChooseStep`.
* `SubgraphStep` has changed in support of in-traversal filtering and removing the need for path-based traversers.
* Added `HasTraversalStep` which takes an anonymous traversal to determine whether or not to filter the current object.
* Added `Traversal.Admin.getStartStep()` and `Traversal.Admin.getEndStep()`. Removed `TraversalHelper.getStart()` and `TraversalHelper.getEnd()`.
* Refactored `profile()` to use injected steps. `ProfileStep` can now be used without any special JVM command line parameters.
* Added `ReducingBarrierStep` which acts like `CollectingBarrierStep` but operates on a seed with a bi-function.
* Added a preprocessor for AsciiDocs. Documentation code examples are executed and the results are dynamically inserted into the doc file.
* `LocalStep` traversal is treated as a branch, not an isolated traversal. Moreover, moved `LocalStep` to `branch/`.
* Traversal strategies are now applied when the `TraversalVertexProgram` state is loaded, not when submitted. Less error prone as it guarantees strategy application.
* Reworked `TraversalHolder` where there are "local traversals" and "global traversals". Local traversals are not subject to OLAP message passing.
* Fixed a bug in `DedupStep` that made itself apparent in `DedupOptimizerStrategy`.
* Added `RepeatStep.RepeatEndStep` in order to reduce the complexity of the code on OLAP when the predicates are not at the start of `RepeatStep`.

=== TinkerPop 3.0.0.M7 (Release Date: January 19, 2015)

* Added `SideEffectRegistrar` interface and `SideEffectRegistrationStrategy` for allowing steps to register sideEffects at strategy application time.
* Renamed `Traverser.Admin.setFuture()` and `Traverser.Admin.getFuture()` to `setStepId()` and `getStepId()`, respectively.
* Added `TraversalMatrix` for random access to steps in a traversal by their step id. Used by `TraversalVertexProgram`.
* Added unique identifies to `Step` that are not the user provided labels. `Step.getLabel()` now returns an `Optional<String>`.
* Removed `UnionLinearStrategy`, `ChooseLinearStrategy`, and `RepeatLinearStrategy` as nested traversals are now natively supported in OLAP.
* Fixed `Neo4jGraph` around manual transaction behavior on `commit` and `rollback` such that they would throw exceptions if a transaction was not open.
* Redesigned the hidden step labeling mechanism so its consistent across a cluster, easier for rewrite strategies, and will enable nested OLAP traversals.
* `Traverser.incrLoops()` now takes a string step label to enable nested looping constructs (i.e. loop stacks).
* Added `Traversal.tryNext()` which returns an `Optional`, where the provided default method should be sufficient for all vendors.
* Removed `PathConsumer` in favor of `TraverserRequirement.PATH`-model via `Step.getRequirements()`.
* `Step.getRequirements()` returns a `Set<TraverserRequirement>` which is what is required of the `Traverser` by the `Step`.
* `Traverser` now extends `Cloneable` and `Traverser.clone()` is used to good effect in `Traverser.split()`.
* Added `AbstractTraverser` for which all traversers extend.
* Moved `Traversal.SideEffects` to `TraversalSideEffects` as sideEffects are not necessarily tied to the traversal.
* Removed `Graph.of()` for generating anonymous graph traversals -- replaced by `__`-model.
* Removed `Graph` being stored in `Traversal.SideEffects`. Too dangerous when moving between OLTP and OLAP and its limited uses were worked around easily.
* No need for `DefaultXXXGraphTraversal` unless the vendor is extending with new methods (e.g. `DefaultNeo4jGraphTraversal`).
* Reworked `TraversalStrategies` such that the are "emanating object class"-dependant, not `Traversal` dependent.
* Moved `Traverser.sideEffects()` to `Traverser.asAdmin().getSideEffects()`. Users should use `Traverser.sideEffects(key)` and `Traverser.sideEffects(key,value)`.
* Added `SerializationTest` to the `StructureStandardSuite` in `gremlin-test` which validates serialization at a lower level than `IoTest`.
* Removed `IntervalStep` and renamed `interval()` to `between()` which is simply an alias to a `has().has()` chain.
* Added `__` static interface which allows for `__.out().out()`-style construction of anonymous traversals (instead of `g.of()`).
* The only `GraphTraversal` steps that operate on `Traverser` are the base lambdas and `repeat()` (i.e. `emit()` and `until()`).
* Removed dependency on the `reflections` library in `gremlin-test` which removed the default implementation of `GraphProvider.getImplementations()` - vendors now need to implement this method themselves.
* Relaxed the `<S>` typing requirement for anonymous traversals when applied to `choose()`, `repeat()`, `union()`, etc.
* Removed `LoopStep` and `UntilStep` in favor of the new `RepeatStep` model of looping in Gremlin3.
* `BranchStep` is now exposed in `GraphTraversal` via `branch(function)`.
* `UnionStep` now implements `TraversalHolder`.
* Added `RepeatStep` as the new looping construct supporting do/while, while/do, and emit semantics.
* Moved `Traversal.sideEffects()` to `Traversal.Admin.getSideEffects()` as `cap()` should be used to access the sideEffect data of a traversal.
* Renamed vendor `XXXTraversal` to `XXXGraphTraversal` (interface) and `XXXGraphTraversal` to `DefaultXXXGraphTraversal` (implementation class).
* Modified packaging for console plugins to be more consistent by moving them to the `com.tinkerpop.gremlin.console.groovy.plugin` namespace.
* Removed all TinkerPop specific dependencies to Guava to avoid user version conflicts.
* Added support for `-e` (script file execution) and `-v` (version display) options on `gremlin.sh`.
* GraphSON supports the assignment of multiple custom serialization modules.
* `Traverser.get(stepLabel/sideEffectKey)` no longer exists. There now exists: `Traverser.path(stepLabel)` and `Traverser.sideEffects(sideEffectKey)`.
* `SimpleTraverser` now supports "path" but in a very loose, global cache way. Added `SparsePath` as a `Map`-backed `Path` implementation.
* Provided Neo4j multi-label support in Neo4j-Gremlin. Added three `Neo4jVertex`-specific methods: `addLabel()`, `removeLabel()`, `labels()`.
* Bumped to Groovy 2.3.9.
* Added `Graph.Io` interface which allows for simplified helper methods for end users and a way for vendors to override `GraphReader` and `GraphWriter` initial construction when custom serializers are needed.
* Removed methods from `GraphProvider` related to customizing serializers in `IoTest` from the test suite as the new `Graph.Io` interface now serves that purpose.
* Added `Neo4jGraph.checkElementsInTransaction(boolean)` which will (or not) verify whether elements retrieved via Neo4j global graph operations are transactionally consistent.
* Added `ScriptInputFormat` and `ScriptOutputFormat` to Hadoop-Gremlin for reading and writing a file according to an arbitrary parsing script.
* Added `TimeLimitStep.getTimedOut()` to determine if the step timed out or there were no more objects to process.
* `Graph.System` is now `Graph.Hidden` with "hidden" being the vendor namespace and the key prefix being `~`.
* Much better `toString()` handling in `Step` and `Traversal`.
* `ComparatorHolder<V>` interface returns a `List<Comparator<V>>` instead of a `Comparator<V>[]`.
* `T` now implements `Function<Element,Object>`.
* Added `ElementValueComparator` and `ElementFunctionComparator` in support of vendor introspection on `ComparatorHolder`-steps.
* Renamed `Comparing` marker interface to `ComparatorHolder`.
* `FunctionHolder` interface provides vendor introspection via `ElementValueFunction`.
* Removed `OrderByStep` as it is now just `order()` with a `by()`-based comparator.
* Added `SampleStep` (`sample()`) to allow for sampling the set of previous objects. Useful for doing random walks with `local()`.
* Renamed `random()` to `coin()` to better express that the filter is a random coin toss.
* Added `by()`-projection to modulate the meaning of post-processing steps like `aggregate()`, `groupCount()`, `path()`, `order()`, etc.
* Removed the `Strategy` interface and gave `StrategyGraph` direct access to the `GraphStrategy`.
* Added `Graph.strategy()` to help instantiate `StrategyGraph` instances.
* Modified the signature of all `GraphStrategy` methods to include an parameter that contains a reference to the "composing strategy".
* `PartitionStrategy` hides the specified partition key from view when iterating properties, keys, etc.
* Change construction of `GraphStrategy` implementations to be consistent with singleton instances and builder pattern.
* Added `Graph.Helper` annotation to "protected" certain default interface methods from implementation by vendors.
* Transaction retry functions now work with "manual" transactions.
* Improved error messaging when importing "legacy" GraphSON that was not generated with "extended" properties.
* Renamed "iterator" related methods in the `GraphStrategy` interface to be consistent with the method names they represent.
* `PropertyMapStep` (`valueMap()`) now takes a boolean to state if the tokens of the element are desired along with its properties.
* `HadoopGraph` now connected to the `StructureProcessSuite`.
* `HadoopGraph` no longer supports `Graph.Variables` as they were in-memory. A persistence mechanism can be introduced in the future.
* Hidden properties removed in favor of using `GraphStrategy` for such features.
* `Edge.iterators().vertexIterator(BOTH)` now guarantees `OUT` then `IN` vertex iterator order.
* `Graph.v(Object)` and `Graph.e(Object)` no longer exist. Instead, use `Graph.V(Object... ids)` and `Graph.E(Object... ids)`.
* Added `Graph.Iterators` to allow access to vertex and edge iterators based on element ids and bypassing `GraphTraversal`.
* Renamed `GraphStrategy` implementations to be less verbose - removed the word "Graph" from their names (e.g. `IdGraphStrategy` simply changed to `IdStrategy`).
* Removed `Step.NO_OBJECT` as the problem is solves can be solved with proper use of `flatMap` and `EmptyTraverser`.
* `Path` is now part of `GraphSerializer` and thus, not specific to a particular implementation of `Path`.
* Added messaging to show files being downloaded when using the Gremlin Server "install" command.
* Added test name and class arguments to the `GraphProvider.loadGraphWith` method.
* Merged `ReferencedXXX` and `DetachedXXX` so that all migration of graph element data is via `DetachedXXX`.
* Added `StaticVertexProgram` and `StaticMapReduce` which simply return `this` on `clone()`.
* `VertexProgram` and `MapReduce` now implement `Cloneable` and is used for fast copying across workers within the same machine.
* Added `TraversalHolder` interface which extends `PathConsumer` to determine recursively if nested traversals require path calculations turned on.
* Reworked how a `TraverserGenerator` is retrieved and utilized.
* Added `Traversal.toBulkSet()` to make getting resultant data more efficiently for traversals with repeated data.
* Provided a helper `LocalStep.isLocalStarGraph()` so `GraphComputer` implementers know the requisite data boundaries.
* Created `Traversal.Admin` to hide administrative methods. Added `Traversal.asAdmin()` to get at `Traversal.Admin`.
* Fixed up all `Step` cloning operations realizing that Java8 lambdas are always bound to the calling class (no delegates).
* Usage of `:remote close` without configured remotes shows a reasonable message rather than a stack trace.
* Provided `LocalStep` to signify that the internal traversal is locally bound to the incoming object.
* Failed script evaluation in Gremlin Server now triggers the cancel of the process attempting to timeout the script if it were to run too long.
* Greatly increased the speed of `ScriptEngineLambda` by making use of a static `ScriptEngine` cache.
* Fixed a general bug in all sideEffect using steps where the sideEffect should be accessed via the `Traverser` not `Traversal`.
* `GremlinPlugin` interface no longer has the `additionalDependencies` method - those dependencies are now defined by an entry in the manifest file for the jar called `Gremlin-Plugin-Dependencies`.
* Added `TinkerWorkerPool` which is used for resource efficient threading in `TinkerGraphComputer`.
* `MapReduce.createMapReduce(Configuration)` now exists and serves the same purpose as `VertexProgram.createVertexProgram(Configuration)`.
* Enabled SessionOps to be extended. Added eval handler hook.
* Setting a property with an unsupported data type throw `IllegalArgumentException` instead of `UnsupportedOperationException` as the operation is supported, but the argument is not.

=== TinkerPop 3.0.0.M6 (Release Date: December 2, 2014)

* `javatuples.Pair` avoided on `MapReduce` API in favor of a new `KeyValue` class.
* Renamed `Gremlin-Plugin` manifest entry for plugins to `Gremlin-Plugin-Paths`.
* Added `Gremlin-Plugin-Dependencies` manifest entry to list other dependencies that should be retrieved with a plugin jar.
* `Memory.Admin.asImmutable()` yields an immutable representation of the GraphComputer `Memory`.
* Fixed host selection in `gremlin-driver` by properly accounting for all hosts being marked unavailable at the instantiation of a `Client`.
* Removed Giraph-Gremlin in favor of new Hadoop-Gremlin with `GiraphGraphComputer` support. Future support for `MapReduceGraphComputer`.
* Greatly simplified the `InputFormat` and `OutputFormat` model for working with Giraph (and Hadoop).
* Added a serializer for `Property` for GraphSON correcting format of serialization of a single `Property` on an `Edge`.
* Fixed bug in Gremlin Console that prevented assignments to empty `List` objects.
* Added `VertexProgram.getMessageScopes()` to allow vendors to know which `MessageScopes` at a particular `Memory` state.
* Reduced the number of methods in `MessageScope.Local` as its up to vendors to inspect provided incident `Traversal` accordingly.
* Renamed `MessagesType` to `MessageScope` to make it less ambiguous regarding the class of the messages being sent.
* Changed the message type of `TraversalVertexProgram` to `TraverserSet` to support message combining.
* Added `VertexProgram.getMessageCombiner()` to support the combining of messages in route to a vertex.
* Reduced object creation in `TraversalVertexProgram` around vertex-local traversal sideEffects.
* Renamed `Traverser.Admin.makeChild()` and `Traverser.Admin.makeSibling()` to `Traverser.Admin.split()` to correspond with `merge()`.
* Added `Traverser.Admin.merge(Traverser)` method so that the merging algorithm is with the `Traverser`.
* Added `Operator` enum that contains sack-helpful `BinaryOperators`: sum, minus, mult, div, max, min, etc.
* Added `GraphTraversal.withSack()` and renamed `trackPaths()` and `with()` to `withPath()` and `withSideEffect()`, respectively.
* Added the "Gremlin Sacks" feature to allow a `Traverser` to carry local information along its walk.
* GraphSON format no longer makes use of `hiddens` JSON key. Its all just `properties`.
* Added `DoubleIterator` to make vendor implementations of `Edge.iterators().vertexIterator()` efficient.
* `PropertiesStep` is smart about hiddens vs. properties.
* `Element.iterators().hiddenProperties()` no longer exists. For vendors, simply provide an iterator of properties.
* `GIRAPH_GREMLIN_LIBS` supports colon separated directories for loading jars from multiple paths.
* Introduced method to control the location of dependencies dynamically loaded to the Gremlin Console as part of the `:install` command.
* Fixed problem with the Neo4j Gremlin Plugin not loading properly after Gremlin Console restart.
* Removed the "use" configuration from Gremlin Server.
* Moved `SugarGremlinPlugin` from `gremlin-console` to `gremlin-groovy` so that it could be shared with Gremlin Server.
* Fixed bug in serialization of `null` results returned to the Gremlin Console when serializing to strings.
* Moved the `GremlinPlugin` for `TinkerGraph` to `tinkergraph-gremlin` module (it is no longer in `gremlin-console`).
* Added a `plugin-info.txt` file to Gremlin Console `/ext/{module}` subdirectories to identify the module that was originally requested.
* Gremlin Server now allows for the explicit configuration of plugin activation.
* Refactored `GremlinPlugin` and `AbstractGremlinPlugin` to better account for plugins that run on the server and those that run in the console.
* Added a `plugins` configuration to Gremlin Server to control the plugins that are enabled on initialization.
* Added a builder option to `GremlinExecutor` to control the plugins that are enabled on initialization.
* Added `RemoteException` for usage with `RemoteAcceptor` implementations for the Gremlin Console so as to better standardize their development.
* Standardized all text being written to the Gremlin Console using starting upper case letter.
* Prevented error in the Console when `:submit` is called but no remotes were configured.
* Provided a way to clean the `grapes` directory as part of a standard build with `mvn clean install`.

=== TinkerPop 3.0.0.M5 (Release Date: November 7, 2014)

* Removed `PropertyFilterIterator` as using Java8 streams was just as efficient for the use case.
* Renamed `KryoWritable` to `GremlinWritable` as it is not necessarily Kryo that is the serialization mechanism.
* Fixed an input split bug in Giraph that was making it so that splits were not always at vertex boundaries.
* Fixed a combiner bug in `GirapGraphComputer`. Combiners were always calling `MapReduce.reduce()`, not `MapReduce.combine()`.
* Greatly simplified `SubgraphStrategy` by removing requirements for `Traversal` introspection.
* `StrategyWrappedGraph` mimics vendor use of `GraphStep` and `GraphTraversal` and no longer requires dynamic strategy application.
* `TraversalStrategies` make use of a dependency tree sorting algorithm to ensure proper sorts prior to application.
* `TraversalStrategies` are now immutable and are bound to the `Traversal` class.
* Fixed bug in Gephi Plugin that prevented it from communicating with the Gephi Streaming Server.
* Renamed `MessageType.XXX.to()` to `MessageType.XXX.of()` so it makes sense in both the sending and receiving context.
* Improved messaging with respect to tests that are ignored due to features to make it clear that those tests are not in error.
* Relaxed exception consistency checks in the test suite to only check that a thrown exception from an implementation extends the expected exception class (but no longer validates that it is the exact class or that the message text).
* `VertexProgram` now has `workerIterationStart()` and `workerIterationEnd()` to allow developers to control vertex split static data structures.
* `TraversalVertexProgram` startup time greatly reduced due to being smart about `loadState()` behavior.
* Gremlin Server sessions now allow serialization of results that were part of an open transaction.
* Refactor `OpProcessors` implementations in Gremlin Server for better reusability.
* `Vertex.iterators()` no longer have a `branchFactor`. This is now at the query language level with `localLimit()`.
* Added `limit(long)` and `localLimit(int,int)` which simply call the range equivalents with 0 as the low.
* Added `LocalRangeStep` which supports ranging the edges and properties of an element -- `localRange(int,int)`.
* `GraphTraversal.value(String)` no longer exists. Instead, use `GraphTraversal.values(String)`.
* `HiddenXXXStep` and `ValueXXXStep` no longer exist. `PropertyXXXStep` takes a `PropertyType` to denote value and hidden access.
* Added `PropertyType` to the structure-package which provide markers for denoting property types (vs. property classes).
* Renamed `setWorkingDirectory` to `workingDirectory` in the `KryoReader` builder.
* `Path.get(String)` returns the object if only one object is referenced by label, else it returns a `List` of referenced objects.
* Added overload to `GremlinKryo` to allow a serializer to be configured as a `Function<Kryo,Serializer>` to allow better flexibility in serializer creation.
* Added method to `GraphProvider` to allow implementers to provide a mechanism to convert GraphSON serialized identifiers back to custom identifiers as needed.
* Added methods to `GraphProvider` so that implementers could specify a custom built `GremlinKryo` class and/or `SimpleModule` class in case their implementation had custom classes to be serialized.
* Added `Traversal.forEachRemaining(class,consumer)` for those traversals whose end type is different from declared due to strategy rewriting.
* Removed `Traversal.forEach()` as traversal implements `Iterator` and users should use `forEachRemaining()`.
* `RangeStep` now has an inclusive low and an exclusive high -- a change from Gremlin2.
* `DriverGremlinPlugin` returns raw results with driver results available via the `result` variable.
* Removed test enforcement of `private` constructor for a `Graph` instance.
* `RemoteAcceptor` now supports `@` prefixed lines that will grab the script string from the Gremlin Console shell.
* Modified the signature of `Property.element()` to simply return `Element`
* Added `Reducing` marker and `ReducingStrategy` which supports reduction-functions as a final step in Gremlin OLAP (e.g. `fold()`).
* Once strategies are `complete()`, no more steps can be added to a `Traversal`.
* Renamed `Traversal.strategies()` to `Traversal.getStrategies()` as it is not a "query language"-method.
* Added test to enforce that a `label` on a `VertexProperty` is always set to the key of the owning property.
* Fixed bug with multi-property removal in `Neo4jGraph`.
* Bumped to Neo4j 2.1.5.
* Used standard `UUIDSerializer` from the `kryo-serializers` library for serialization of `UUID` objects.
* Changed GraphSON serialization to only use `iterators()` - there were still remnants of `Traversal` usage from previous refactoring.
* Added overload for `detach` method to allow for the `Element` to be detached as a "reference" only (i.e. without properties).
* Renamed `Item` in `gremlin-driver` to `Result`.
* Renamed `strategy` to `getStrategy` in `StrategyWrappedGraph`.
* Renamed `baseGraph` to `getBaseGraph` in `Neo4jGraph`.
* `Neo4jGraph` now returns an empty property `Vertex.property(k)` when the key is non-existent (a problem only visible when meta/multi property configuration was turned off).
* `Traversal.Strategies.apply()` now takes a `TraversalEngine`. Greatly simplifies strategy application for `STANDARD` or `COMPUTER`.
* Renamed `IdentityReductionStrategy` to `IdentityRemovalStrategy` for reasons of clarity.
* Added `ComparingRemovalStrategy` that removes `Comparing`-marked steps unless they are the end step of the traversal.
* `OrderStep` now works in OLAP, but only makes sense as a traversal end step.
* `MapReduce` API extended to include `getMapKeySort()` and `getReduceKeySort()` to sort outputs accordingly.
* Renamed `TraversalResultMapReduce` to `TraverserMapReduce`. Shorter and makes more sense.
* Improved build automation to package javadocs and asciidoc documentation in the distribution files.
* Improved build automation with a script to automatically bump release versions in the various files that needed it such as the `pom.xml` files.
* The identifier on `VertexProperty` is now read properly to those graphs that can support identifier assignment.
* `GraphSONReader.readGraph()` now properly reads vertex properties.
* Removed `Neo4jGraph.getCypher()` as users should use `Neo4jGraph.cypher()` and get back TinkerPop3 graph objects.
* `GiraphGraph.variables().getConfiguration()` is now replaced by `GiraphGraph.configuration()`.
* Added `Graph.configuration()` which returns the `Configuration` object of `Graph.open()`.
* Removed `TraverserTracker` as now there is only a `TraverserSet` for all halted traversers. A nice simplification of `TraversalVertexProgram`.
* Renamed `Traverser.isDone()` to `Traverser.isHalted()` and `DONE` to `HALT`. Consistent with automata terminology.
* Removed `PathTraverserExecutor` and `SimpleTraverserExecutor` as a single `TraverserExecutor` correctly executes both types of traversers.
* `TraversalVertexProgram` does "reflexive message passing" to reduce the total number of iterations required to execute a traversal.
* `MapReduce` no-argument constructors are private and thus, only for reflection and `loadState()` usage.
* MapReducers for `TraversalVertexProgram` are now smart about `with()` declared data structures.
* Updated `Traversal.SideEffects` to use "registered suppliers" and it now works accordingly in both OLTP and OLAP environments.
* Increased the speed of `FlatMapStep` by approximately 1.5x.

=== TinkerPop 3.0.0.M4 (Release Date: October 21, 2014)

* Added features for `VertexProperty` user supplied ids and related data types.
* Removed `SideEffectCap` marker interface as there is only one `SideEffectCapStep` and thus, `instanceof` is sufficient.
* `Path.getObjects()`/`Path.getLabels()` renamed to `Path.objects()`/`Path.labels()` to be in line with "query language" naming convention.
* Greatly simplified `GiraphInternalVertex` due to `Element.graph()` -- 1/2 the memory footprint and reduced construction time.
* Renamed `Property.getElement()` to `Property.element()` given the "query language" naming convention.
* `Element.graph()` added which returns the `Graph` that the element is contained within.
* Added tests for greater consistency around iterating hidden properties.
* Simplified `TraversalVertexProgram` where only a single `TraverserTracker` exists for both path- and simple-traversers.
* Fixed a major bug where `Arrays.binarySearch` was being used on an unsorted array in TinkerGraph and Neo4jGraph.
* Changed `ComputerResult.getXXX()` to `graph()` and `memory()` to be consistent with "query language" naming convention.
* `Traverser.getXXX()` changed to `loops()`, `bulk()`, `path()`, `sideEffects()` to be consistent with "query language" naming convention.
* Optimization to reduce the number of empty lists created due to no step class existing for respective `TraversalStrategy.apply()`.
* Added `CapTraversal` as a marker interface for the `cap()` method.
* Added `union()` with GraphComputer `UnionLinearStrategy`.
* `TimeLimitStep` was moved to `filter/` package. It was a mistake that it was in `sideEffect/`.
* Provided the configuration for generating both a "full" and "core" set of javadocs, where "full" represents all classes in all projects and "core" is the "user" subset.
* Validated bindings passed to Gremlin Server to ensure that they do not match the most common statically imported values.
* If no script engine name is provided to a `LambdaHolder` it is assumed to be Gremlin-Groovy.
* `MapEmitter` and `ReduceEmitter` have an `emit(value)` default method where the key is the `MapReduce.NullObject` singleton.
* `Traverser.Admin` now implements `Attachable` as the `Traversal.SideEffects` can be generated from the `Vertex`.
* Made a solid effort to ensure that all TinkerPop keys are `Graph.System` to leave `Graph.Key` for users.
* The `Graph.System` prefix is now `^` instead of `%&%`. Simpler and easier on the `toString()`-eyes.
* Added `Traversal.SideEffects.ifPresent(Consumer)` as a default helper method.
* Added `profile()`-step which provides detailed information about the performance of each step in a traversal.
* No more `CountCapStep` and `CountStep`, there is only `CountStep` and it is elegant.
* Created a `AbstractTraversalStrategy` with good `toString()`, `hasCode()`, and `equals()` implementations.
* Added `CountTraversal` as a marker-interface stating that the `Traversal` has a `count() -> Long` method.
* `Traversal` no longer has any step methods as its not required for DSL implementers to have "core steps."
* Added "linearization" strategy for `ChooseStep` so it is executed correctly on GraphComputer.
* Added `GraphTraversalStrategyRegistry` which has respective global strategies to make turning on/off strategies easier.
* Added a generic `BranchStep` to be used for re-writing "meta-steps" for execution on GraphComputer.
* Moved `JumpStep`, `UntilStep`, and `ChooseStep` to a new `branch/` package.
* Added test cases to the Structure Suite to enforce consistent operations of reading properties after removal of their owning `Element`.
* GraphSON format change for full `Graph` serialization - Graph variables are now serialized with the key "variables" as opposed to "properties".
* Relaxed `Graph.toString()` test requirements for implementers.
* Made the `toString` operations in `GraphStrategy` consistent.
* Added `VertexFeatures.supportsRemoveProperty`.
* Added `VertexPropertyFeatures.supportsRemoveProperty`.
* Added `EdgeFeatures.supportsRemoveProperty`.
* Added `VertexFeatures.supportsRemoveVertices`.
* Added `EdgeFeatures.supportsRemoveEdges`.
* Vendors should now get a clear error when mis-spelling something in an `@OptOut` (or more likely if a test name changes) and it now works all the test suites.
* All plugins now have a default prefix of "tinkerpop." as a namespace.
* `GraphComputer` now executes a `Set<MapReduce>` and `hashCode()`/`equals()` were implemented for existing `MapReduce` implementations.
* Changed `Contains.in/notin` to `Contains.within/without` as `in` is a reserved term in most languages (including Java and Groovy).
* Added helper methods for loading data into collections in `TraversalHelper`.
* Core `Traversal` methods are smart about bulking -- e.g. `iterate()`, `fill()`, `remove()`, etc.
* `GroupByStep` and `GroupByMapReduce` leverage `BulkSet` as the default group data structure.
* `Element.Iterator` has renamed methods so implementers can do `MyElement implements Element, Element.Iterators`.
* Renamed `MessageType.Global` and `MessageType.Local` creators from `of()` to `to()` as it makes more sense to send messages `to()`.
* With `Traverser.get/setBulk()` there is no need for a `TraverserMessage`. The `Traverser` is now the message in `TraversalVertexProgram`.
* Provided static `make()` methods for constructing `Path` implementations.
* Provided a more space/time efficient algorithm for `Path.isSimple()`.
* The `JumpStep` GraphComputer algorithm `Queue` is now a `TraverserSet`.
* `AggregateStep` and `StoreStep` now use `BulkSet` as their default backing `Collection` (much more space/time efficient).
* Added `BulkSet` which is like `TraverserSet` but for arbitrary objects (i.e. a weighted set).
* `UnrollJumpStrategy` is no longer a default strategy as it is less efficient with the inclusion of `TraverserSet`.
* Introduced `TraverserSet` with bulk updating capabilities. Like OLAP, OLTP looping is now linear space/time complexity.
* TinkerGraph's MapReduce framework is now thread safe with a parallel execution implementation.
* Added a default `Traverser.asAdmin()` method as a typecast convenience to `Traverser.Admin`.
* Renamed `Traverser.System` to `Traverser.Admin` as to not cause `java.lang.System` reference issues.
* Renamed `Memory.Administrative` to `Memory.Admin` to make it shorter and consistent with `Traverser.Admin`.
* Fixed a TinkerGraph bug around user supplied vertex property ids.
* Most `Step` classes are now defined as `public final class` to prevent inheritance.
* `ShuffleStep` now extends `BarrierStep` which enables semantically correct step-sideEffects.
* Leveraged `Traverser.getBulk()` consistently throughout all steps.

=== TinkerPop 3.0.0.M3 (Release Date: October 6, 2014)

* All `Step` fields are now `private`/`protected` with respective getters as currently needed and will be added to as needed.
* Gremlin Server no longer has the `traverse` operation as lambdas aren't really serialized.
* `Path` is now an interface with `ImmutablePath` and `MutablePath` as implementations (2x speedup on path calculations).
* `Traverser` now implements `Comparable`. If the underlying object doesn't implement `Comparable`, then a runtime exception.
* Added abstract `BarrierStep` which greatly simplifies implementing barriers like `AggregateStep`, `OrderStep`, etc.
* `SelectStep` is now intelligent about when to trigger path computations based on label selectors and barriers.
* `T` no longer has `eq`, `neq`, `lt`, `in`, etc. Renamed all respective enums and with `static import`, good in console (e.g. `Compare.eq`).
* Added `Order` enum which provides `Order.decr` and `Order.incr`.
* `Traverser.loops` and `Jump.loops` are now shorts (`32767` max-loops is probably sufficient for 99.9999% of use cases).
* `Traverser.bulk` exists which is how many instances does the traverser represent. For use in grouping with bulk computations.
* Greatly simplified sideEffect steps where there is no distinction between OLAP vs. OLTP (from the `Step` perspective).
* Removed the need for `Bulkable` and `VertexCentric` marker interfaces in process API.
* Renamed configuration parameters in Giraph-Gremlin to be consistent with a `giraph.gremlin`-prefix.
* Made it possible to pass a `ScriptEngine` name and string script in `TraversalVertexProgram` and `LambdaVertexProgram`.
* Made `TinkerGraph` a plugin for the Console as it is no longer a direct dependency in `gremlin-groovy`.
* Added features for supporting the addition of properties via `Element.property(String,Object)`.
* `GiraphGraph` OLTP tested against Gremlin-Java8 and Gremlin-Groovy -- OLAP tested against Gremlin-Groovy.
* `Neo4jGraph` is now tested against both Gremlin-Java8 and Gremlin-Groovy.
* Renamed the test cases in `ProcessTestSuite` to be consistent with other Gremlin language variants.
* Added a `gremlin-groovy-test` suite that can be used to validate implementations against the Groovy variant of Gremlin.
* `TinkerGraph` is no longer serializable, use a `GraphReader`/`GraphWriter` to serialize the graph data.
* Removed `implements Serializable` on numerous classes to ensure safety and proper usage of utilities for cloning.
* `Traversal` now implements `Cloneable` as this is the means that inter-JVM threads are able to get sibling `Traversals`.
* Created "integration" test for `Neo4jGraph` that runs the test suite with multi/meta property features turned off.
* Added `GraphStrategy` methods for `VertexProperty`.
* Converted the `id` data type from string to integer in the Grateful Dead sample data.
* Removed all notions of serializable lambdas as this is a misconception and should not be part of TinkerPop.
* Greatly simplified `TraversalVertexProgram` with three arguments: a `Traversal<Supplier>`, `Class<Traversal<Supplier>>`, or a script string with `ScriptEngine` name.
* Added `TraversalScript` interface with `GroovyTraversalScript` as an instance. To be used by OLAP engines and any language variant (e.g. gremlin-scala, gremlin-js, etc.).
* `UntilStep` now leverages `UnrollJumpStrategy` accordingly.
* Fixed a bug where the `toString()` of `Traversal` was being hijacked by `SugarGremlinPlugin`.
* Fixed compilation bug in `UntilStep` that is realized when used in multi-machine OLAP.
* Simplified `Enumerator` and implementations for `MatchStep`.

=== TinkerPop 3.0.0.M2 (Release Date: September 23, 2014)

* Added an exhaust `InnerJoinEnumerator` fix in `MatchStep` to get all solutions correctly.
* `Neo4jGraph` can be configured to allow or disallow meta- and multi-properties.
* Added `until()`-step as a simpler way to express while-do looping which compiles down to a `jump()`-step equivalent.
* Added "The Crew" (`CREW`) toy graph which contains multi-properties, meta-properties, graph variables, hiddens, etc.
* If the Giraph job fails, then the subsequent `MapReduce` jobs will not execute.
* Added `Graph.System` class which generates keys prefixed with `%&%` which is considered the vendor namespace and not allowed by users.
* Added `ReferencedVertex` (etc. for all graph object types) for lightweight message passing of graph object ids.
* `T.*` now has `label`, `id`, `key`, `value` and no longer are these `String` representations reserved in TinkerPop.
* `Traverser` now has a transient reference to `Traversal.SideEffects`.
* "Detached" classes are now tested by the standard test suite.
* Compartmentalized `Traverser` interface so there is now a `Traverser.System` sub-interface with methods that users shouldn't call.
* Added `OrderByStep` which orders `Elements` according to the value of a provided key.
* 2x speed increase on steps that rely heavily on `ExpandableStepIterator` with massive memory footprint reduction as well.
* Added `VertexProperty<V>` as the property type for vertices -- provides multi-properties and properties on properties for vertices.
* Changed `VertexProgram` such that `getElementComputeKeys()` is simply a `Set<String>`.
* Significant changes to the format of the `ResponseMessage` for Gremlin Server - these changes break existing clients.
* Close any open transactions on any configured `Graph` when a session in Gremlin Server is killed.
* Grateful Dead Graph now uses vertex labels instead of "type" properties.
* There is now a `GraphComputerStrategy` and `EngineDependent` marker interface to allow steps to decide their algorithm depending if they are OLAP or OLTP.
* A labeled step now stores its current traverser value in `Traversal.SideEffects` (no longer can sideEffectKeys and step labels be the same).
* `GraphFactory` support for opening a `Graph` with multiple `GraphStrategy` instances - if there are multiple strategies they are wrapped in order via `SequenceGraphStrategy`.
* The result type for result termination messages returned from Gremlin Server is now set to "no content".
* The `maxContentLength` setting for Gremlin Driver now blocks incoming frames that are too large.
* After initialization scripts are executed in Gremlin Server, the `Graph` instances are re-bound back to their global references, thus allowing `GraphStrategy` initialization or even dynamic `Graph` creation through scripts.
* Added "Modern" graph back which is basically the "Classic" graph with double values for the "weight" property on edges and non-default vertex labels.
* `Traversal.addStep()` is now hard typed so type casting isn't required and traversal APIs look clean.
* Changed the hidden key prefix from `%$%` to `~` in `Graph.Key.hide()`.
* Added `has(label,key,predicate,value)` to allow for `has('person','name','marko')`. Various overloaded methods provided.
* Update to traversal API where if a `SFunction<S,?>` was required, but can process a `Traverser<S>`, then the function is `SFunction<Traverser<S>,?>`.
* Added `WhereStep` as a way to further constrain `select()` and `match()`.
* Extensive work on `GiraphMemory` and its interaction with Giraph aggregators.
* If the input path of a `GiraphGraphComputer` does not exist, failure happens prior to job submission.
* `SugarPlugin` now has all inefficient methods and Gremlin-Groovy proper is only efficient Groovy techniques.
* Prevented concurrency problems by only modifying bindings within the same thread of execution in the `GremlinExecutor`.
* Calls to `use` on the `DependencyManager` now return the list of `GremlinPlugin` instances to initialize instead of just initializing them automatically because it causes problems with `ScriptEngine` setup if a plugin requires a script to be evaluated and a required dependency is not yet loaded.
* `Traversal.SideEffects` has `getGraph()`, `setGraph()`, and `removeGraph()` default helpers.
* `Traversal.Memory` -> `Traversal.SideEffects` and `GraphComputer.SideEffects` -> `GraphComputer.Memory`.
* `StrategyWrappedVertex` and `StrategyWrappedEdge` properly wrap `Element` objects returned from non-traversal based methods.
* Gremlin-Server now sends a single write with status 200 for Object and empty response messages.
* `GremlinGroovyScriptEngine` allows imports to re-import dependencies added via "use".
* Changed order in which the `GremlinExecutor` is initialized such that dependency loading via "use" are handled first which fixes problems with starting Gremlin Server with `gremlin-server-neo4j.yaml`.
* Corrected issues with the "branch factor" related traversals under `SubgraphStrategy`.  This change also altered the semantics of the `SubgraphStrategy` a bit as it became more restrictive around `Edge` inclusion (requires both vertices to be in the subgraph).
* The Gephi Plugin now visualizes traversals and has numerous configuration options.
* Added more specific features around the types of "identifiers" a graph can support.
* Added a new test graph called `MODERN` that is copy of the `CLASSIC` graph, but represents floats as doubles.  This graph will be the default graph for testing going forward.
* Fix bug in `Neo4jGraph` that was not processing multiple vertex labels properly when doing a `has()` step with `IN`.
* Changed semantics of `@LoadGraphWith` in gremlin-test to only refer to the ability of a test implementation to process the data types of the test graph (not to actually load it).
* `StartStep` is a `SideEffect` as it is a process to get data into the stream (like a keyboard) and more efficient as such.
* Greatly simplified the implementations of `Map`, `FlatMap`, `Filter`, and `SideEffect`.
* `Path` data structure changed to an ordered list of objects with each associated to a `Set<String>` of as-labels.
* All sideEffect-based steps no longer extend `FilterStep` with predicate equal true, but a more efficient `SideEffectStep`.
* `TreeStep` now has `TreeMapReduce` for executing on `GraphComputer`.
* `Neo4jTraversal.cypher()` is fluent throughout.
* Reverted back to TP2 model of `as()` referring to step names, not variable names of sideEffects.
* Updated `AddEdge`-step to support property key/value pairs for appending to newly created edges.
* Renamed `Graph.getFeatures()` to `Graph.features()` to be consistent with other API methods.
* `Vertex` and `Edge` now implement all `GraphTraversal` methods to ensure consistency throughout stack.
* `Neo4jTraversal` is auto-generated from `Neo4jTraversalStub` with technique generalizable to other vendors.
* Added test suite to ensure that all traversals are of the same type: `g.V`, `g.E`, `g.of()`, `v.identity()`, `e.identity()`, v-, e-methods.
* Giraph HDFS helpers now support `hdfs.mkdir(string)` and `local.mkdir(string)`
* Added `@OptIn` and `@OptOut` for implementers to specify on their `Graph` implementations for test compliance information.
* `GraphComputer` `Memory` now immutable after computation is complete.
* Dependency grabbing for plugins filter out slf4j logging dependencies so as to avoid multiple bindings with the standard TinkerPop distributions.
* Fixed `GiraphMemory` to be fully consistent with GraphComputer specification.
* Removed fatJar assembly from Giraph-Graph as it is no longed needed with distributed cache model.
* Reworked `GiraphRemoteAcceptor` to provide a `result` variable back to the console with `ComputerResult`.
* `VertexProgram` is no longer `Serializable` (use `loadState` and `storeState` for wire-propagation).
* Moved `GiraphGraph.getOutputGraph()` to `GiraphHelper`.
* Changed `GIRAPH_GREMLIN_HOME` to `GIRAPH_GREMLIN_LIB` to reference directory where jars are to be loaded.
* Updated README with release instructions.

=== TinkerPop 3.0.0.M1 (Release Date: August 12, 2014)

* First official release of TinkerPop3 and thus, no changes.
