blob: e46e3673465a6ffca02ca6adbddd7a90e3abfcfa [file] [log] [blame]
TinkerPop3 CHANGEGLOG
=====================
TinkerPop 3.0.0 (A Gremlin Rāga in 7/16 Time)
---------------------------------------------
image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
TinkerPop 3.0.0.M4 (Release Date: NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 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.
* Add 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.
* Prevent 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.
* Add more specific features around the types of "identifiers" a graph can support.
* Add 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 not 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.