////
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-7]]
=== TinkerPop 3.4.7 (Release Date: NOT OFFICIALLY RELEASED YET)

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

* Gremlin.NET driver: Fixed a `NullReferenceException` and throw clear exception if received message is empty.
* Bumped to Groovy 2.5.11.
* Improved error message for `math()` when the selected key in a `Map` is `null` or not a `Number`.
* Added `:cls` command to Gremlin Console to clear the screen.

[[release-3-4-6]]
=== TinkerPop 3.4.6 (Release Date: February 20, 2020)

* Fixed bug in `drop()` of properties which was introduced in 3.4.5.

==== Bugs

* TINKERPOP-2338 drop() not removing all edge/meta properties

[[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-11]]
=== TinkerPop 3.3.11 (Release Date: NOT OFFICIALLY RELEASED YET)

* Added `trustStoreType` such that keystore and truststore can be of different types in the Java driver.
* Added session support to all GLVs: Javascript, .NET and Python.
* Fixed bug in Gremlin Server shutdown if failures occurred during `GraphManager` initialization.
* Modified Gremlin Server to close the session when the channel itself is closed.
* Fixed bug in `Order` where comparisons of `enum` types wouldn't compare with `String` values.
* Added `maxWaitForClose` configuration option to the Java driver.
* Deprecated `maxWaitForSessionClose` in the Java driver.
* Bumped to Jackson 2.9.10.4.
* Remove invalid service descriptors from gremlin-shaded.
* Fixed bug in Python and .NET traversal `clone()` where deep copies of bytecode were not occurring.
* Fixed bug in Python about integer serializer which was out of range of `g:Int32`

[[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.
