You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/07/13 17:48:01 UTC
[13/52] [abbrv] tinkerpop git commit: Add Gremlin-CSharp and
Gremlin-DotNet
Add Gremlin-CSharp and Gremlin-DotNet
This adds Gremlin-CSharp (a C# GLV), together with a .NET driver. The
driver is based on Gremlin.Net
(https://github.com/FlorianHockmann/Gremlin.Net) with added support for
GLVs and Gremlin-CSharp is auto generated, very similar to
Gremlin-Python.
This should fix TINKERPOP-1552.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/792fca27
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/792fca27
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/792fca27
Branch: refs/heads/TINKERPOP-1552-master
Commit: 792fca27842f54b276404ff1362f42d12ed8f03a
Parents: 3ce8069
Author: Florian Hockmann <fh...@florian-hockmann.de>
Authored: Thu Apr 6 19:02:23 2017 +0200
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Jul 13 13:46:47 2017 -0400
----------------------------------------------------------------------
.gitignore | 9 +
.travis.yml | 5 +
docker/Dockerfile | 6 +-
.../developer/development-environment.asciidoc | 18 +
docs/src/reference/gremlin-variants.asciidoc | 196 ++++++
gremlin-csharp-generator/pom.xml | 60 ++
.../csharp/AnonymousTraversalGenerator.groovy | 71 +++
.../gremlin/csharp/CommonContentHelper.groovy | 49 ++
.../gremlin/csharp/EnumGenerator.groovy | 62 ++
.../gremlin/csharp/GenerateGremlinCSharp.groovy | 32 +
.../csharp/GraphTraversalGenerator.groovy | 77 +++
.../csharp/GraphTraversalSourceGenerator.groovy | 140 +++++
.../gremlin/csharp/PredicateGenerator.groovy | 66 ++
.../gremlin/csharp/SymbolHelper.groovy | 31 +
gremlin-dotnet/Gremlin.Net.sln | 80 +++
gremlin-dotnet/pom.xml | 39 ++
.../src/Gremlin.CSharp/Gremlin.CSharp.csproj | 21 +
.../src/Gremlin.CSharp/Process/Barrier.cs | 30 +
.../src/Gremlin.CSharp/Process/Cardinality.cs | 32 +
.../src/Gremlin.CSharp/Process/Column.cs | 31 +
.../src/Gremlin.CSharp/Process/Direction.cs | 32 +
.../Gremlin.CSharp/Process/GraphTraversal.cs | 630 +++++++++++++++++++
.../Process/GraphTraversalSource.cs | 143 +++++
.../src/Gremlin.CSharp/Process/Operator.cs | 40 ++
.../src/Gremlin.CSharp/Process/Order.cs | 36 ++
gremlin-dotnet/src/Gremlin.CSharp/Process/P.cs | 108 ++++
.../src/Gremlin.CSharp/Process/Pick.cs | 31 +
.../src/Gremlin.CSharp/Process/Pop.cs | 32 +
.../src/Gremlin.CSharp/Process/Scope.cs | 31 +
gremlin-dotnet/src/Gremlin.CSharp/Process/T.cs | 33 +
gremlin-dotnet/src/Gremlin.CSharp/Process/__.cs | 488 ++++++++++++++
.../src/Gremlin.CSharp/Structure/Graph.cs | 35 ++
.../Gremlin.Net.Process.csproj | 24 +
.../Remote/IRemoteConnection.cs | 42 ++
.../Remote/RemoteStrategy.cs | 61 ++
.../Gremlin.Net.Process/Traversal/Binding.cs | 80 +++
.../Gremlin.Net.Process/Traversal/Bindings.cs | 42 ++
.../Gremlin.Net.Process/Traversal/Bytecode.cs | 85 +++
.../Traversal/DefaultTraversal.cs | 195 ++++++
.../Gremlin.Net.Process/Traversal/ITraversal.cs | 96 +++
.../Traversal/ITraversalSideEffects.cs | 52 ++
.../Traversal/ITraversalStrategy.cs | 46 ++
.../Traversal/Instruction.cs | 52 ++
.../Strategy/AbstractTraversalStrategy.cs | 86 +++
.../Strategy/Decoration/ConnectiveStrategy.cs | 33 +
.../Strategy/Decoration/ElementIdStrategy.cs | 32 +
.../Decoration/HaltedTraverserStrategy.cs | 34 +
.../Strategy/Decoration/PartitionStrategy.cs | 56 ++
.../Strategy/Decoration/SubgraphStrategy.cs | 48 ++
.../Decoration/VertexProgramStrategy.cs | 50 ++
.../Finalization/MatchAlgorithmStrategy.cs | 34 +
.../Optimization/AdjacentToIncidentStrategy.cs | 32 +
.../Optimization/FilterRankingStrategy.cs | 32 +
.../Optimization/GraphFilterStrategy.cs | 29 +
.../Optimization/IdentityRemovalStrategy.cs | 32 +
.../Optimization/IncidentToAdjacentStrategy.cs | 33 +
.../Optimization/InlineFilterStrategy.cs | 32 +
.../Optimization/LazyBarrierStrategy.cs | 33 +
.../Optimization/MatchPredicateStrategy.cs | 32 +
.../Strategy/Optimization/OrderLimitStrategy.cs | 29 +
.../Optimization/PathProcessorStrategy.cs | 32 +
.../Optimization/PathRetractionStrategy.cs | 29 +
.../Optimization/RangeByIsCountStrategy.cs | 32 +
.../Optimization/RepeatUnrollStrategy.cs | 29 +
.../Verification/LambdaRestrictionStrategy.cs | 32 +
.../Strategy/Verification/ReadOnlyStrategy.cs | 32 +
.../Traversal/TraversalPredicate.cs | 85 +++
.../Gremlin.Net.Process/Traversal/Traverser.cs | 75 +++
.../src/Gremlin.Net/Driver/Connection.cs | 133 ++++
.../src/Gremlin.Net/Driver/ConnectionFactory.cs | 47 ++
.../src/Gremlin.Net/Driver/ConnectionPool.cs | 114 ++++
.../Driver/Exceptions/ResponseException.cs | 37 ++
.../src/Gremlin.Net/Driver/GremlinClient.cs | 95 +++
.../Driver/GremlinClientExtensions.cs | 140 +++++
.../src/Gremlin.Net/Driver/GremlinServer.cs | 56 ++
.../src/Gremlin.Net/Driver/IConnection.cs | 35 ++
.../src/Gremlin.Net/Driver/IGremlinClient.cs | 48 ++
.../Gremlin.Net/Driver/JsonMessageSerializer.cs | 49 ++
.../Driver/Messages/RequestMessage.cs | 143 +++++
.../Driver/Messages/ResponseMessage.cs | 40 ++
.../Driver/Messages/ResponseResult.cs | 37 ++
.../Driver/Messages/ResponseStatus.cs | 50 ++
.../Driver/Messages/ResponseStatusCode.cs | 67 ++
.../src/Gremlin.Net/Driver/ProxyConnection.cs | 52 ++
.../Driver/Remote/DriverRemoteConnection.cs | 80 +++
.../Driver/Remote/DriverRemoteTraversal.cs | 39 ++
.../Remote/DriverRemoteTraversalSideEffects.cs | 126 ++++
.../ResultsAggregation/AggregatorFactory.cs | 44 ++
.../ResultsAggregation/DefaultAggregator.cs | 42 ++
.../ResultsAggregation/DictionaryAggregator.cs | 44 ++
.../Driver/ResultsAggregation/IAggregator.cs | 31 +
.../ResultsAggregation/TraverserAggregator.cs | 44 ++
gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs | 114 ++++
.../Gremlin.Net/Driver/WebSocketConnection.cs | 96 +++
.../src/Gremlin.Net/Gremlin.Net.csproj | 43 ++
.../src/Gremlin.Net/Properties/AssemblyInfo.cs | 44 ++
.../src/Gremlin.Net/Structure/Edge.cs | 61 ++
.../src/Gremlin.Net/Structure/Element.cs | 77 +++
.../Structure/IO/GraphSON/BindingSerializer.cs | 42 ++
.../Structure/IO/GraphSON/BytecodeSerializer.cs | 58 ++
.../Structure/IO/GraphSON/DateDeserializer.cs | 43 ++
.../Structure/IO/GraphSON/DateSerializer.cs | 43 ++
.../Structure/IO/GraphSON/DoubleConverter.cs | 33 +
.../Structure/IO/GraphSON/EdgeDeserializer.cs | 43 ++
.../Structure/IO/GraphSON/EdgeSerializer.cs | 45 ++
.../Structure/IO/GraphSON/EnumSerializer.cs | 37 ++
.../Structure/IO/GraphSON/FloatConverter.cs | 33 +
.../Structure/IO/GraphSON/GraphSONReader.cs | 123 ++++
.../Structure/IO/GraphSON/GraphSONTokens.cs | 32 +
.../Structure/IO/GraphSON/GraphSONUtil.cs | 62 ++
.../Structure/IO/GraphSON/GraphSONWriter.cs | 146 +++++
.../IO/GraphSON/IGraphSONDeserializer.cs | 41 ++
.../IO/GraphSON/IGraphSONSerializer.cs | 41 ++
.../Structure/IO/GraphSON/Int32Converter.cs | 33 +
.../Structure/IO/GraphSON/Int64Converter.cs | 33 +
.../Structure/IO/GraphSON/NumberConverter.cs | 45 ++
.../Structure/IO/GraphSON/PathDeserializer.cs | 41 ++
.../IO/GraphSON/PropertyDeserializer.cs | 38 ++
.../Structure/IO/GraphSON/PropertySerializer.cs | 64 ++
.../IO/GraphSON/RequestMessageSerializer.cs | 43 ++
.../IO/GraphSON/TraversalPredicateSerializer.cs | 45 ++
.../IO/GraphSON/TraversalSerializer.cs | 38 ++
.../IO/GraphSON/TraversalStrategySerializer.cs | 37 ++
.../Structure/IO/GraphSON/TraverserReader.cs | 38 ++
.../Structure/IO/GraphSON/UuidDeserializer.cs | 36 ++
.../Structure/IO/GraphSON/UuidSerializer.cs | 37 ++
.../Structure/IO/GraphSON/VertexDeserializer.cs | 37 ++
.../IO/GraphSON/VertexPropertyDeserializer.cs | 41 ++
.../IO/GraphSON/VertexPropertySerializer.cs | 43 ++
.../Structure/IO/GraphSON/VertexSerializer.cs | 41 ++
.../src/Gremlin.Net/Structure/Path.cs | 193 ++++++
.../src/Gremlin.Net/Structure/Property.cs | 96 +++
.../src/Gremlin.Net/Structure/Vertex.cs | 52 ++
.../src/Gremlin.Net/Structure/VertexProperty.cs | 66 ++
gremlin-dotnet/src/pom.xml | 55 ++
.../BytecodeGenerationTests.cs | 76 +++
.../BytecodeGeneration/StrategiesTests.cs | 170 +++++
.../ConfigProvider.cs | 47 ++
.../DriverRemoteConnection/EnumTests.cs | 59 ++
.../GraphTraversalSourceTests.cs | 55 ++
.../GraphTraversalTests.cs | 171 +++++
.../DriverRemoteConnection/PredicateTests.cs | 58 ++
.../RemoteConnectionFactory.cs | 41 ++
.../DriverRemoteConnection/SideEffectTests.cs | 221 +++++++
.../DriverRemoteConnection/StrategiesTests.cs | 193 ++++++
.../GraphSONWriterTests.cs | 50 ++
.../Gremlin.CSharp.IntegrationTest.csproj | 38 ++
.../Properties/AssemblyInfo.cs | 44 ++
.../appsettings.json | 4 +
.../GraphTraversalSourceTests.cs | 68 ++
.../Gremlin.CSharp.UnitTest.csproj | 21 +
.../Gremlin.CSharp.UnitTest/PredicateTests.cs | 50 ++
.../ConfigProvider.cs | 47 ++
.../Driver/ConnectionPoolTests.cs | 90 +++
.../Driver/GremlinClientTests.cs | 212 +++++++
.../Driver/MessagesTests.cs | 147 +++++
.../Gremlin.Net.IntegrationTest.csproj | 41 ++
.../Process/Remote/RemoteStrategyTests.cs | 85 +++
.../Properties/AssemblyInfo.cs | 44 ++
.../Util/RequestMessageProvider.cs | 54 ++
.../appsettings.json | 4 +
.../Gremlin.Net.Process.UnitTest.csproj | 22 +
.../Traversal/BytecodeTests.cs | 44 ++
.../Traversal/Strategy/StrategyTests.cs | 109 ++++
.../Traversal/TestTraversal.cs | 51 ++
.../Traversal/TestTraversalStrategy.cs | 50 ++
.../Traversal/TraversalTests.cs | 177 ++++++
.../Traversal/TraverserTests.cs | 75 +++
.../Driver/DriverRemoteConnectionTests.cs | 51 ++
.../Driver/GremlinServerTests.cs | 66 ++
.../Driver/RequestMessageBuilderTests.cs | 41 ++
.../Gremlin.Net.UnitTest.csproj | 35 ++
.../Properties/AssemblyInfo.cs | 44 ++
.../Gremlin.Net.UnitTest/Structure/EdgeTests.cs | 57 ++
.../GraphSON/BytecodeGraphSONSerializerTests.cs | 153 +++++
.../IO/GraphSON/GraphSONReaderTests.cs | 308 +++++++++
.../IO/GraphSON/GraphSONWriterTests.cs | 329 ++++++++++
.../IO/GraphSON/StrategyWriterTests.cs | 66 ++
.../Structure/IO/GraphSON/TestClass.cs | 30 +
.../Structure/IO/GraphSON/TestUtils.cs | 36 ++
.../Gremlin.Net.UnitTest/Structure/PathTests.cs | 416 ++++++++++++
.../Structure/PropertyTests.cs | 165 +++++
.../Structure/VertexPropertyTests.cs | 69 ++
.../Structure/VertexTests.cs | 80 +++
gremlin-dotnet/test/pom.xml | 179 ++++++
pom.xml | 9 +
186 files changed, 13224 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 1bab5f9..b16e11b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,12 @@ __pycache__/
__version__.py
.glv
settings.xml
+tools/
+[Dd]ebug/
+[Rr]elease/
+[Oo]bj/
+*.suo
+*.user
+.vscode/
+.vs/
+*nupkg
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index b1cc11d..55930da 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,6 +21,11 @@ addons:
apt:
packages:
- oracle-java8-installer
+before_install:
+ - sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
+ - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
+ - sudo apt-get update
+ - sudo apt-get install dotnet-dev-1.0.1
script:
- "mvn clean install -Dci"
#notifications:
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/docker/Dockerfile
----------------------------------------------------------------------
diff --git a/docker/Dockerfile b/docker/Dockerfile
index ce3e62e..d68f893 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -20,11 +20,13 @@ FROM ubuntu:trusty
MAINTAINER Daniel Kuppitz <me...@gremlin.guru>
RUN apt-get update \
- && apt-get -y install software-properties-common python-software-properties \
+ && apt-get -y install software-properties-common python-software-properties apt-transport-https \
&& echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections \
&& add-apt-repository -y ppa:webupd8team/java \
+ && sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list' \
+ && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 \
&& apt-get update \
- && apt-get install -y oracle-java8-installer curl gawk git maven openssh-server subversion \
+ && apt-get install -y oracle-java8-installer curl gawk git maven openssh-server dotnet-dev-1.0.1 subversion \
&& apt-get install -y python python-dev python-pip build-essential \
&& pip install virtualenv virtualenvwrapper \
&& pip install --upgrade pip \
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/docs/src/dev/developer/development-environment.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/dev/developer/development-environment.asciidoc b/docs/src/dev/developer/development-environment.asciidoc
index 04b581f..d3eea8e 100644
--- a/docs/src/dev/developer/development-environment.asciidoc
+++ b/docs/src/dev/developer/development-environment.asciidoc
@@ -101,6 +101,24 @@ integration tests and therefore must be actively switched on with `-DskipIntegra
[source,text]
mvn clean install -pl gremlin-console -DskipIntegrationTests=false
+[[dotnet-environment]]
+.NET Environment
+~~~~~~~~~~~~~~~~
+
+The build optionally requires link:https://www.microsoft.com/net/core[.NET Core SDK] (>=1.1.0) to work with the
+gremlin-dotnet module. If .NET Core SDK is not installed, TinkerPop will still build with Maven, but .NET projects
+will be skipped.
+
+`gremlin-dotnet` which also includes Gremlin-Csharp can be build and tested from the command line with:
+
+[source,text]
+mvn clean install -Pgremlin-dotnet
+
+which enables the „gremlin-dotnet“ Maven profile or in a more automated fashion simply add a `.glv` file to the `src`
+and `test` directories of the `gremlin-dotnet` module which will signify to Maven that the environment is .NET-ready.
+The `.glv` file need not have any contents and is ignored by Git. A standard `mvn clean install` will then build
+`gremlin-dotnet` in full.
+
[[release-environment]]
Release Environment
~~~~~~~~~~~~~~~~~~~
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/docs/src/reference/gremlin-variants.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index 2f4e3f5..b494450 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -352,4 +352,200 @@ graphson_writer = GraphSONWriter({MyType: MyType})
connection = DriverRemoteConnection('ws://localhost:8182/gremlin', 'g',
graphson_reader=graphson_reader,
graphson_writer=graphson_writer)
+----
+
+[[gremlin-csharp]]
+Gremlin-CSharp
+--------------
+Apache TinkerPop's Gremlin-CSharp implements Gremlin within the C# language. It targets .NET Standard and can
+therefore be used on different operating systems and with different .NET frameworks, such as .NET Framework
+and link:https://www.microsoft.com/net/core[.NET Core]. Since the C# syntax is very similar to that of Java, it should be very easy to switch between
+Gremlin-Java and Gremlin-CSharp. The only major syntactical difference is that all method names in Gremlin-CSharp
+use PascalCase as opposed to camelCase in Gremlin-Java in order to comply with .NET conventions.
+
+[source,powershell]
+nuget install Gremlin.CSharp
+
+In Gremlin-CSharp there exists `GraphTraversalSource`, `GraphTraversal`, and `__` which mirror the respective classes
+in Gremlin-Java. The `GraphTraversalSource` requires a driver in order to communicate with <<gremlin-server,GremlinServer>> (or any
+RemoteConnection-enabled server).
+
+Gremlin-CSharp and Gremlin-DotNet
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Gremlin-CSharp is the C# language variant of Gremlin, but it needs a driver to communicate with a remote
+Gremlin Server. Such a driver is provided as part of Apache TinkerPop’s Gremlin-DotNet that also includes other
+useful functionality to work with Gremlin in .NET.
+Gremlin-DotNet is currently distributed in two NuGet packages:
+
+* `Gremlin.Net.Process` contains core functionality for Gremlin language variants and defines interfaces for drivers.
+Gremlin-CSharp depends on this package. So it will be installed automatically when you install Gremlin-CSharp.
+* `Gremlin.Net` contains a driver that allows Gremlin-CSharp to be used with a remote server and GraphSON serializers and deserializers.
+
+IMPORTANT: For developers wishing to provide another driver implementation, be sure to implement `IRemoteConnection` in
+`Gremlin.Net.Process.Remote` so it can then be used by Gremlin-CSharp’s `GraphTraversal`.
+
+When Gremlin Server is running, Gremlin-CSharp can communicate with Gremlin Server by sending traversals serialized as `Bytecode`.
+
+IMPORTANT: Gremlin-CSharp is compatible with GraphSON 2.0 only, so this serializer must be configured in Gremlin Server.
+
+A traversal source can be spawned with `RemoteStrategy` from an empty `Graph`.
+
+[source,csharp]
+----
+var graph = new Graph();
+var g = graph.Traversal().WithRemote(new DriverRemoteConnection(new GremlinClient(new GremlinServer("localhost", 8182))));
+----
+
+When a traversal from the `GraphTraversalSource` is iterated, the traversal’s `Bytecode` is sent over the wire via the registered
+`IRemoteConnection`. The bytecode is used to construct the equivalent traversal at the remote traversal source.
+Since Gremlin-CSharp currently doesn't support lambda expressions, all traversals can be translated to Gremlin-Java on the remote
+location (e.g. Gremlin Server).
+
+IMPORTANT: Gremlin-DotNet’s `ITraversal` interface supports the standard Gremlin methods such as `Next()`, `NextTraverser()`, `ToSet()`,
+`ToList()`, etc. Such "terminal" methods trigger the evaluation of the traversal.
+
+RemoteConnection Submission
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Very similar to Gremlin-Python and Gremlin-Java, there are various ways to submit a traversal to a `IRemoteConnection` using
+terminal/action methods off of `ITraversal`.
+
+* `ITraversal.Next()`
+* `ITraversal.NextTraverser()`
+* `ITraversal.ToList()`
+* `ITraversal.ToSet()`
+* `ITraversal.Iterate()`
+
+Static Enums and Methods
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Gremlin has various tokens (e.g. `T`, `P`, `Order`, `Operator`, etc.) that are represented in Gremlin-CSharp as Enums.
+
+These can be used analogously to how they are used in Gremlin-Java.
+
+[source,csharp]
+g.V().HasLabel("person").Has("age",P.Gt(30)).Order().By("age",Order.decr).ToList()
+
+Moreover, the class prefixes can be ommitted with a `using static`.
+
+[source,csharp]
+----
+using static Gremlin.CSharp.Process.P;
+using static Gremlin.CSharp.Process.Order;
+----
+
+Then it is possible to represent the above traversal as below.
+
+[source,csharp]
+g.V().HasLabel("person").Has("age",Gt(30)).Order().By("age",decr).ToList()
+
+Finally, with using static `__`, anonymous traversals like `__.Out()` can be expressed as below. That is, without the `__.`-prefix.
+
+[source,csharp]
+g.V().Repeat(Out()).Times(2).Values("name").Fold().ToList()
+
+Bindings
+~~~~~~~~
+
+When a traversal bytecode is sent over a `IRemoteConnection` (e.g. Gremlin Server), it will be translated, compiled,
+and then executed. If the same traversal is sent again, translation and compilation can be skipped as the previously
+compiled version should be cached. Many traversals are unique up to some parameterization. For instance,
+`g.V(1).Out("created").Values("name")` is considered different from `g.V(4).Out('created').Values("Name")`
+as they have different script "string" representations. However, `g.V(x).Out("created").Values("name")` with bindings of
+`{x : 1}` and `{x : 4}` are considered the same. If a traversal is going to be executed repeatedly, but with different
+parameters, then bindings should be used. In Gremlin-CSharp, bindings are objects that can be created as follows.
+
+[source,csharp]
+----
+var b = new Bindings();
+g.V(b.Of("id", 1)).Out("created").Values("name").toList()
+g.V(b.Of("id", 4)).Out("created").Values("name").toList()
+----
+
+Traversal Strategies
+~~~~~~~~~~~~~~~~~~~~
+
+In order to add and remove traversal strategies from a traversal source, Gremlin-DotNet has an `AbstractTraversalStrategy`
+class along with a collection of subclasses that mirror the standard Gremlin-Java strategies.
+
+[source,csharp]
+----
+g = g.WithStrategies(new SubgraphStrategy(vertexCriterion: HasLabel("person"),
+ edgeCriterion: Has("weight", Gt(0.5))));
+var names = g.V().Values("name").ToList(); // names: [marko, vadas, josh, peter]
+
+g = g.WithoutStrategies(new SubgraphStrategy());
+names = g.V().Values("name").ToList(); // names: [marko, vadas, lop, josh, ripple, peter]
+
+var edgeValueMaps = g.V().OutE().ValueMap(true).ToList();
+// edgeValueMaps: [[label:created, id:9, weight:0.4], [label:knows, id:7, weight:0.5], [label:knows, id:8, weight:1.0],
+// [label:created, id:10, weight:1.0], [label:created, id:11, weight:0.4], [label:created, id:12, weight:0.2]]
+
+g = g.WithComputer(workers: 2, vertices: Has("name", "marko"));
+names = g.V().Values("name").ToList(); // names: [marko]
+
+edgeValueMaps = g.V().OutE().ValueMap(true).ToList();
+// edgeValueMaps: [[label:created, id:9, weight:0.4], [label:knows, id:7, weight:0.5], [label:knows, id:8, weight:1.0]]
+----
+
+NOTE: Many of the TraversalStrategy classes in Gremlin-DotNet are proxies to the respective strategy on Apache TinkerPop’s
+JVM-based Gremlin traversal machine. As such, their `Apply(ITraversal)` method does nothing. However, the strategy is
+encoded in the Gremlin-DotNet bytecode and transmitted to the Gremlin traversal machine for re-construction machine-side.
+
+Custom Serialization
+~~~~~~~~~~~~~~~~~~~~
+
+Gremlin-DotNet provides a GraphSON 2.0 serialization package with the standard Apache TinkerPop `g`-types registered
+(see link:http://tinkerpop.apache.org/docs/x.y.z/dev/io/#graphson-2d0[GraphSON 2.0]). It is possible for users to add new
+types by creating serializers and deserializers in C# (or any other .NET language) and registering them with the `GremlinClient`.
+
+[source,csharp]
+----
+internal class MyType
+{
+ public static string GraphsonPrefix = "providerx";
+ public static string GraphsonBaseType = "MyType";
+ public static string GraphsonType = GraphSONUtil.FormatTypeName(GraphsonPrefix, GraphsonBaseType);
+
+ public MyType(int x, int y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ public int X { get; }
+ public int Y { get; }
+}
+
+internal class MyClassWriter : IGraphSONSerializer
+{
+ public Dictionary<string, dynamic> Dictify(dynamic objectData, GraphSONWriter writer)
+ {
+ MyType myType = objectData;
+ var valueDict = new Dictionary<string, object>
+ {
+ {"x", myType.X},
+ {"y", myType.Y}
+ };
+ return GraphSONUtil.ToTypedValue(nameof(TestClass), valueDict, MyType.GraphsonPrefix);
+ }
+}
+
+internal class MyTypeReader : IGraphSONDeserializer
+{
+ public dynamic Objectify(JToken graphsonObject, GraphSONReader reader)
+ {
+ var x = reader.ToObject(graphsonObject["x"]);
+ var y = reader.ToObject(graphsonObject["y"]);
+ return new MyType(x, y);
+ }
+}
+
+var graphsonReader = new GraphSONReader(
+ new Dictionary<string, IGraphSONDeserializer> {{MyType.GraphsonType, new MyTypeReader()}});
+var graphsonWriter = new GraphSONWriter(
+ new Dictionary<Type, IGraphSONSerializer> {{typeof(MyType), new MyClassWriter()}});
+
+var gremlinClient = new GremlinClient(new GremlinServer("localhost", 8182), graphsonReader, graphsonWriter);
----
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/pom.xml b/gremlin-csharp-generator/pom.xml
new file mode 100644
index 0000000..f488f02
--- /dev/null
+++ b/gremlin-csharp-generator/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>tinkerpop</artifactId>
+ <version>3.2.5-SNAPSHOT</version>
+ </parent>
+ <artifactId>gremlin-csharp-generator</artifactId>
+ <name>Apache TinkerPop :: Gremlin-CSharp Generator</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy</artifactId>
+ <version>${groovy.version}</version>
+ <classifier>indy</classifier>
+ </dependency>
+ </dependencies>
+ <build>
+ <directory>${basedir}/target</directory>
+ <finalName>${project.artifactId}-${project.version}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.2.1</version>
+ <executions>
+ <execution>
+ <id>generate-csharp</id>
+ <phase>generate-test-resources</phase>
+ <goals>
+ <goal>java</goal>
+ </goals>
+ <configuration>
+ <mainClass>org.apache.tinkerpop.gremlin.csharp.GenerateGremlinCSharp</mainClass>
+ <arguments>
+ <argument>${project.parent.basedir}/gremlin-dotnet/src/Gremlin.CSharp</argument>
+ </arguments>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.gmavenplus</groupId>
+ <artifactId>gmavenplus-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/AnonymousTraversalGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/AnonymousTraversalGenerator.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/AnonymousTraversalGenerator.groovy
new file mode 100644
index 0000000..6e2e191
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/AnonymousTraversalGenerator.groovy
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+import java.lang.reflect.Modifier
+
+class AnonymousTraversalGenerator {
+
+ public static void create(final String anonymousTraversalFile) {
+
+ final StringBuilder csharpClass = new StringBuilder()
+
+ csharpClass.append(CommonContentHelper.getLicense())
+
+ csharpClass.append(
+"""
+namespace Gremlin.CSharp.Process
+{
+ public static class __
+ {
+ public static GraphTraversal Start()
+ {
+ return new GraphTraversal();
+ }
+""")
+ __.getMethods().
+ findAll { GraphTraversal.class.equals(it.returnType) }.
+ findAll { Modifier.isStatic(it.getModifiers()) }.
+ collect { it.name }.
+ findAll { !it.equals("__") && !it.equals("start") }.
+ unique().
+ sort { a, b -> a <=> b }.
+ forEach { javaMethodName ->
+ String sharpMethodName = SymbolHelper.toCSharp(javaMethodName)
+
+ csharpClass.append(
+"""
+ public static GraphTraversal ${sharpMethodName}(params object[] args)
+ {
+ return new GraphTraversal().${sharpMethodName}(args);
+ }
+""")
+ }
+ csharpClass.append("\t}\n")
+ csharpClass.append("}")
+
+ final File file = new File(anonymousTraversalFile);
+ file.delete()
+ csharpClass.eachLine { file.append(it + "\n") }
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/CommonContentHelper.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/CommonContentHelper.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/CommonContentHelper.groovy
new file mode 100644
index 0000000..c44bcfa
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/CommonContentHelper.groovy
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+public final class CommonContentHelper {
+
+ public static String getLicense() {
+ return """#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+"""
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/EnumGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/EnumGenerator.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/EnumGenerator.groovy
new file mode 100644
index 0000000..a389f9b
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/EnumGenerator.groovy
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+import org.apache.tinkerpop.gremlin.util.CoreImports
+
+class EnumGenerator {
+
+ public static void create(final String enumDirectory) {
+
+ for (final Class<? extends Enum> enumClass : CoreImports.getClassImports()
+ .findAll { Enum.class.isAssignableFrom(it) }
+ .sort { a, b -> a.getSimpleName() <=> b.getSimpleName() }
+ .collect()) {
+ createEnum(enumDirectory, enumClass)
+ }
+ }
+
+ private static void createEnum(final String enumDirectory, final Class<? extends Enum> enumClass){
+ final StringBuilder csharpEnum = new StringBuilder()
+
+ csharpEnum.append(CommonContentHelper.getLicense())
+
+ csharpEnum.append(
+ """
+namespace Gremlin.CSharp.Process
+{
+ public enum ${enumClass.getSimpleName()}
+ {
+""")
+ enumClass.getEnumConstants()
+ .sort { a, b -> a.name() <=> b.name() }
+ .each { value -> csharpEnum.append(" ${value.name()},\n"); }
+ csharpEnum.deleteCharAt(csharpEnum.length() - 2)
+
+ csharpEnum.append(" }\n")
+ csharpEnum.append("}")
+
+ final String enumFileName = "${enumDirectory}/${enumClass.getSimpleName()}.cs"
+ final File file = new File(enumFileName);
+ file.delete()
+ csharpEnum.eachLine { file.append(it + "\n") }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GenerateGremlinCSharp.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GenerateGremlinCSharp.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GenerateGremlinCSharp.groovy
new file mode 100644
index 0000000..7b03e5a
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GenerateGremlinCSharp.groovy
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+public class GenerateGremlinCSharp {
+
+ public static void main(String[] args) {
+ final String csharpDirectory = args[0]
+ GraphTraversalSourceGenerator.create(csharpDirectory + "/Process/" + "GraphTraversalSource.cs")
+ GraphTraversalGenerator.create(csharpDirectory + "/Process/" + "GraphTraversal.cs")
+ AnonymousTraversalGenerator.create(csharpDirectory + "/Process/" + "__.cs")
+ EnumGenerator.create(csharpDirectory + "/Process/")
+ PredicateGenerator.create(csharpDirectory + "/Process/" + "P.cs")
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalGenerator.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalGenerator.groovy
new file mode 100644
index 0000000..54183a3
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalGenerator.groovy
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+
+class GraphTraversalGenerator {
+
+ public static void create(final String graphTraversalFile) {
+
+ final StringBuilder csharpClass = new StringBuilder()
+
+ csharpClass.append(CommonContentHelper.getLicense())
+
+ csharpClass.append(
+"""
+using System.Collections.Generic;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.CSharp.Process
+{
+ public class GraphTraversal : DefaultTraversal
+ {
+ public GraphTraversal()
+ : this(new List<ITraversalStrategy>(), new Bytecode())
+ {
+ }
+
+ public GraphTraversal(ICollection<ITraversalStrategy> traversalStrategies, Bytecode bytecode)
+ {
+ TraversalStrategies = traversalStrategies;
+ Bytecode = bytecode;
+ }
+""")
+ GraphTraversal.getMethods().
+ findAll { GraphTraversal.class.equals(it.returnType) }.
+ findAll { !it.name.equals("clone") && !it.name.equals("iterate") }.
+ collect { it.name }.
+ unique().
+ sort { a, b -> a <=> b }.
+ forEach { javaMethodName ->
+ String sharpMethodName = SymbolHelper.toCSharp(javaMethodName)
+
+ csharpClass.append(
+ """
+ public GraphTraversal ${sharpMethodName}(params object[] args)
+ {
+ Bytecode.AddStep("${javaMethodName}", args);
+ return this;
+ }
+""")
+ }
+ csharpClass.append("\t}\n")
+ csharpClass.append("}")
+
+ final File file = new File(graphTraversalFile);
+ file.delete()
+ csharpClass.eachLine { file.append(it + "\n") }
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalSourceGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalSourceGenerator.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalSourceGenerator.groovy
new file mode 100644
index 0000000..aaa35fb
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/GraphTraversalSourceGenerator.groovy
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+
+
+class GraphTraversalSourceGenerator {
+
+ public static void create(final String graphTraversalSourceFile) {
+
+ final StringBuilder csharpClass = new StringBuilder()
+
+ csharpClass.append(CommonContentHelper.getLicense())
+
+ csharpClass.append(
+"""
+using System.Collections.Generic;
+using Gremlin.Net.Process.Remote;
+using Gremlin.Net.Process.Traversal;
+using Gremlin.Net.Process.Traversal.Strategy.Decoration;
+
+namespace Gremlin.CSharp.Process
+{
+ public class GraphTraversalSource
+ {
+ public ICollection<ITraversalStrategy> TraversalStrategies { get; set; }
+ public Bytecode Bytecode { get; set; }
+
+ public GraphTraversalSource()
+ : this(new List<ITraversalStrategy>(), new Bytecode())
+ {
+ }
+
+ public GraphTraversalSource(ICollection<ITraversalStrategy> traversalStrategies, Bytecode bytecode)
+ {
+ TraversalStrategies = traversalStrategies;
+ Bytecode = bytecode;
+ }
+"""
+ )
+
+ // Hold the list of methods with their overloads, so we do not create duplicates
+ HashMap<String, ArrayList<String>> sharpMethods = new HashMap<String, ArrayList<String>>()
+
+ GraphTraversalSource.getMethods(). // SOURCE STEPS
+ findAll { GraphTraversalSource.class.equals(it.returnType) }.
+ findAll {
+ !it.name.equals("clone") &&
+ // replace by TraversalSource.Symbols.XXX
+ !it.name.equals("withBindings") &&
+ !it.name.equals("withRemote") &&
+ !it.name.equals("withComputer")
+ }.
+ collect { it.name }.
+ unique().
+ sort { a, b -> a <=> b }.
+ forEach { javaMethodName ->
+ String sharpMethodName = SymbolHelper.toCSharp(javaMethodName)
+
+ csharpClass.append(
+"""
+ public GraphTraversalSource ${sharpMethodName}(params object[] args)
+ {
+ var source = new GraphTraversalSource(new List<ITraversalStrategy>(TraversalStrategies),
+ new Bytecode(Bytecode));
+ source.Bytecode.AddSource("${javaMethodName}\", args);
+ return source;
+ }
+""")
+ }
+
+ csharpClass.append(
+ """
+ public GraphTraversalSource WithBindings(object bindings)
+ {
+ return this;
+ }
+
+ public GraphTraversalSource WithRemote(IRemoteConnection remoteConnection)
+ {
+ var source = new GraphTraversalSource(new List<ITraversalStrategy>(TraversalStrategies),
+ new Bytecode(Bytecode));
+ source.TraversalStrategies.Add(new RemoteStrategy(remoteConnection));
+ return source;
+ }
+
+ public GraphTraversalSource WithComputer(string graphComputer = null, int? workers = null, string persist = null,
+ string result = null, ITraversal vertices = null, ITraversal edges = null,
+ Dictionary<string, dynamic> configuration = null)
+ {
+ return WithStrategies(new VertexProgramStrategy(graphComputer, workers, persist, result, vertices, edges, configuration));
+ }
+""")
+
+ GraphTraversalSource.getMethods(). // SPAWN STEPS
+ findAll { GraphTraversal.class.equals(it.returnType) }.
+ collect { it.name }.
+ unique().
+ sort { a, b -> a <=> b }.
+ forEach { javaMethodName ->
+ String sharpMethodName = SymbolHelper.toCSharp(javaMethodName)
+
+ csharpClass.append(
+ """
+ public GraphTraversal ${sharpMethodName}(params object[] args)
+ {
+ var traversal = new GraphTraversal(TraversalStrategies, new Bytecode(Bytecode));
+ traversal.Bytecode.AddStep("${javaMethodName}\", args);
+ return traversal;
+ }
+""")
+ }
+
+ csharpClass.append("\t}\n")
+ csharpClass.append("}")
+
+ final File file = new File(graphTraversalSourceFile);
+ file.delete()
+ csharpClass.eachLine { file.append(it + "\n") }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/PredicateGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/PredicateGenerator.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/PredicateGenerator.groovy
new file mode 100644
index 0000000..72e3dba
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/PredicateGenerator.groovy
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+import org.apache.tinkerpop.gremlin.process.traversal.P
+
+import java.lang.reflect.Modifier
+
+class PredicateGenerator {
+
+ public static void create(final String predicateFile) {
+
+ final StringBuilder csharpClass = new StringBuilder()
+
+ csharpClass.append(CommonContentHelper.getLicense())
+
+ csharpClass.append(
+"""
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.CSharp.Process
+{
+ public class P
+ {""")
+ P.class.getMethods().
+ findAll { Modifier.isStatic(it.getModifiers()) }.
+ findAll { P.class.isAssignableFrom(it.returnType) }.
+ collect { it.name }.
+ unique().
+ sort { a, b -> a <=> b }.
+ each { javaMethodName ->
+ String sharpMethodName = SymbolHelper.toCSharp(javaMethodName)
+ csharpClass.append(
+"""
+ public static TraversalPredicate ${sharpMethodName}(params object[] args)
+ {
+ var value = args.Length == 1 ? args[0] : args;
+ return new TraversalPredicate("${javaMethodName}", value);
+ }
+""")
+ }
+ csharpClass.append("\t}\n")
+ csharpClass.append("}")
+
+ final File file = new File(predicateFile)
+ file.delete()
+ csharpClass.eachLine { file.append(it + "\n") }
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/SymbolHelper.groovy
----------------------------------------------------------------------
diff --git a/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/SymbolHelper.groovy b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/SymbolHelper.groovy
new file mode 100644
index 0000000..10591d7
--- /dev/null
+++ b/gremlin-csharp-generator/src/main/groovy/org/apache/tinkerpop/gremlin/csharp/SymbolHelper.groovy
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.csharp
+
+public final class SymbolHelper {
+
+ public static String toCSharp(final String symbol) {
+ return (String) Character.toUpperCase(symbol.charAt(0)) + symbol.substring(1)
+ }
+
+ public static String toJava(final String symbol) {
+ return (String) Character.toLowerCase(symbol.charAt(0)) + symbol.substring(1)
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/Gremlin.Net.sln
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/Gremlin.Net.sln b/gremlin-dotnet/Gremlin.Net.sln
new file mode 100644
index 0000000..bfd565f
--- /dev/null
+++ b/gremlin-dotnet/Gremlin.Net.sln
@@ -0,0 +1,80 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26228.4
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{584F838B-DAE2-44F5-868C-1F532949C827}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D4B935A4-93F9-4A58-BC34-E5BFE1D2E2F7}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1B54FAC2-5411-4BB6-B450-FE2FFD8C4782}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gremlin.Net", "src\Gremlin.Net\Gremlin.Net.csproj", "{6C1DD34D-E30F-4E37-AACC-BEB8AD2320D8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gremlin.Net.UnitTest", "test\Gremlin.Net.UnitTest\Gremlin.Net.UnitTest.csproj", "{1FAB781B-B857-4AD2-BEC8-E20C214D9E21}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gremlin.Net.IntegrationTest", "test\Gremlin.Net.IntegrationTest\Gremlin.Net.IntegrationTest.csproj", "{CC54ABE3-13D2-491C-81E2-4D0355ABFA93}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gremlin.CSharp", "src\Gremlin.CSharp\Gremlin.CSharp.csproj", "{709D235A-CA13-434F-9AF9-8C8C009B11D7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gremlin.CSharp.IntegrationTest", "test\Gremlin.CSharp.IntegrationTest\Gremlin.CSharp.IntegrationTest.csproj", "{232F0F2B-178E-4214-99C7-CC4DC6710F44}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gremlin.Net.Process", "src\Gremlin.Net.Process\Gremlin.Net.Process.csproj", "{4949181B-C97D-4BB4-A312-9C1506EC7DA7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gremlin.Net.Process.UnitTest", "test\Gremlin.Net.Process.UnitTest\Gremlin.Net.Process.UnitTest.csproj", "{D97CA283-AC86-4EC9-9E1D-5F9A97977687}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gremlin.CSharp.UnitTest", "test\Gremlin.CSharp.UnitTest\Gremlin.CSharp.UnitTest.csproj", "{F2D976C2-D5EC-4BE5-9F6F-FCFAA9F59858}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6C1DD34D-E30F-4E37-AACC-BEB8AD2320D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6C1DD34D-E30F-4E37-AACC-BEB8AD2320D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6C1DD34D-E30F-4E37-AACC-BEB8AD2320D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6C1DD34D-E30F-4E37-AACC-BEB8AD2320D8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1FAB781B-B857-4AD2-BEC8-E20C214D9E21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1FAB781B-B857-4AD2-BEC8-E20C214D9E21}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1FAB781B-B857-4AD2-BEC8-E20C214D9E21}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1FAB781B-B857-4AD2-BEC8-E20C214D9E21}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CC54ABE3-13D2-491C-81E2-4D0355ABFA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CC54ABE3-13D2-491C-81E2-4D0355ABFA93}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CC54ABE3-13D2-491C-81E2-4D0355ABFA93}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CC54ABE3-13D2-491C-81E2-4D0355ABFA93}.Release|Any CPU.Build.0 = Release|Any CPU
+ {709D235A-CA13-434F-9AF9-8C8C009B11D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {709D235A-CA13-434F-9AF9-8C8C009B11D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {709D235A-CA13-434F-9AF9-8C8C009B11D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {709D235A-CA13-434F-9AF9-8C8C009B11D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {232F0F2B-178E-4214-99C7-CC4DC6710F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {232F0F2B-178E-4214-99C7-CC4DC6710F44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {232F0F2B-178E-4214-99C7-CC4DC6710F44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {232F0F2B-178E-4214-99C7-CC4DC6710F44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4949181B-C97D-4BB4-A312-9C1506EC7DA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4949181B-C97D-4BB4-A312-9C1506EC7DA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4949181B-C97D-4BB4-A312-9C1506EC7DA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4949181B-C97D-4BB4-A312-9C1506EC7DA7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D97CA283-AC86-4EC9-9E1D-5F9A97977687}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D97CA283-AC86-4EC9-9E1D-5F9A97977687}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D97CA283-AC86-4EC9-9E1D-5F9A97977687}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D97CA283-AC86-4EC9-9E1D-5F9A97977687}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F2D976C2-D5EC-4BE5-9F6F-FCFAA9F59858}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F2D976C2-D5EC-4BE5-9F6F-FCFAA9F59858}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F2D976C2-D5EC-4BE5-9F6F-FCFAA9F59858}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F2D976C2-D5EC-4BE5-9F6F-FCFAA9F59858}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {6C1DD34D-E30F-4E37-AACC-BEB8AD2320D8} = {584F838B-DAE2-44F5-868C-1F532949C827}
+ {1FAB781B-B857-4AD2-BEC8-E20C214D9E21} = {1B54FAC2-5411-4BB6-B450-FE2FFD8C4782}
+ {CC54ABE3-13D2-491C-81E2-4D0355ABFA93} = {1B54FAC2-5411-4BB6-B450-FE2FFD8C4782}
+ {709D235A-CA13-434F-9AF9-8C8C009B11D7} = {584F838B-DAE2-44F5-868C-1F532949C827}
+ {232F0F2B-178E-4214-99C7-CC4DC6710F44} = {1B54FAC2-5411-4BB6-B450-FE2FFD8C4782}
+ {4949181B-C97D-4BB4-A312-9C1506EC7DA7} = {584F838B-DAE2-44F5-868C-1F532949C827}
+ {D97CA283-AC86-4EC9-9E1D-5F9A97977687} = {1B54FAC2-5411-4BB6-B450-FE2FFD8C4782}
+ {F2D976C2-D5EC-4BE5-9F6F-FCFAA9F59858} = {1B54FAC2-5411-4BB6-B450-FE2FFD8C4782}
+ EndGlobalSection
+EndGlobal
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/pom.xml b/gremlin-dotnet/pom.xml
new file mode 100644
index 0000000..0472324
--- /dev/null
+++ b/gremlin-dotnet/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>tinkerpop</artifactId>
+ <version>3.2.5-SNAPSHOT</version>
+ </parent>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-dotnet</artifactId>
+ <name>Apache TinkerPop :: Gremlin-DotNet</name>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>test</module>
+ <module>src</module>
+ </modules>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eobjects.build</groupId>
+ <artifactId>dotnet-maven-plugin</artifactId>
+ <extensions>true</extensions>
+ <version>0.14</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.gmavenplus</groupId>
+ <artifactId>gmavenplus-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.CSharp/Gremlin.CSharp.csproj
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.CSharp/Gremlin.CSharp.csproj b/gremlin-dotnet/src/Gremlin.CSharp/Gremlin.CSharp.csproj
new file mode 100644
index 0000000..82291fc
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.CSharp/Gremlin.CSharp.csproj
@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <Version>3.2.5-SNAPSHOT</Version>
+ <TargetFramework>netstandard1.3</TargetFramework>
+ <AssemblyName>Gremlin.CSharp</AssemblyName>
+ <PackageId>Gremlin.CSharp</PackageId>
+ <GeneratePackageOnBuild>False</GeneratePackageOnBuild>
+ <PackageProjectUrl>http://tinkerpop.apache.org</PackageProjectUrl>
+ <PackageLicenseUrl>https://github.com/apache/tinkerpop/blob/master/LICENSE</PackageLicenseUrl>
+ <RepositoryUrl>https://github.com/apache/tinkerpop</RepositoryUrl>
+ <Description>Apache TinkerPop’s Gremlin-CSharp implements Gremlin within C# and can be used on any platform.</Description>
+ <PackageTags>gremlin-csharp;gremlin;tinkerpop</PackageTags>
+ <Authors>Apache TinkerPop</Authors>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\Gremlin.Net.Process\Gremlin.Net.Process.csproj" />
+ </ItemGroup>
+
+</Project>
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.CSharp/Process/Barrier.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.CSharp/Process/Barrier.cs b/gremlin-dotnet/src/Gremlin.CSharp/Process/Barrier.cs
new file mode 100644
index 0000000..a74b47a
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.CSharp/Process/Barrier.cs
@@ -0,0 +1,30 @@
+#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+
+namespace Gremlin.CSharp.Process
+{
+ public enum Barrier
+ {
+ normSack
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.CSharp/Process/Cardinality.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.CSharp/Process/Cardinality.cs b/gremlin-dotnet/src/Gremlin.CSharp/Process/Cardinality.cs
new file mode 100644
index 0000000..4b9fae8
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.CSharp/Process/Cardinality.cs
@@ -0,0 +1,32 @@
+#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+
+namespace Gremlin.CSharp.Process
+{
+ public enum Cardinality
+ {
+ list,
+ set,
+ single
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.CSharp/Process/Column.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.CSharp/Process/Column.cs b/gremlin-dotnet/src/Gremlin.CSharp/Process/Column.cs
new file mode 100644
index 0000000..c397b69
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.CSharp/Process/Column.cs
@@ -0,0 +1,31 @@
+#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+
+namespace Gremlin.CSharp.Process
+{
+ public enum Column
+ {
+ keys,
+ values
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.CSharp/Process/Direction.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.CSharp/Process/Direction.cs b/gremlin-dotnet/src/Gremlin.CSharp/Process/Direction.cs
new file mode 100644
index 0000000..abdf7a2
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.CSharp/Process/Direction.cs
@@ -0,0 +1,32 @@
+#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+
+namespace Gremlin.CSharp.Process
+{
+ public enum Direction
+ {
+ BOTH,
+ IN,
+ OUT
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/792fca27/gremlin-dotnet/src/Gremlin.CSharp/Process/GraphTraversal.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/src/Gremlin.CSharp/Process/GraphTraversal.cs b/gremlin-dotnet/src/Gremlin.CSharp/Process/GraphTraversal.cs
new file mode 100644
index 0000000..4397838
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.CSharp/Process/GraphTraversal.cs
@@ -0,0 +1,630 @@
+#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.CSharp.Process
+{
+ public class GraphTraversal : DefaultTraversal
+ {
+ public GraphTraversal()
+ : this(new List<ITraversalStrategy>(), new Bytecode())
+ {
+ }
+
+ public GraphTraversal(ICollection<ITraversalStrategy> traversalStrategies, Bytecode bytecode)
+ {
+ TraversalStrategies = traversalStrategies;
+ Bytecode = bytecode;
+ }
+
+ public GraphTraversal V(params object[] args)
+ {
+ Bytecode.AddStep("V", args);
+ return this;
+ }
+
+ public GraphTraversal AddE(params object[] args)
+ {
+ Bytecode.AddStep("addE", args);
+ return this;
+ }
+
+ public GraphTraversal AddInE(params object[] args)
+ {
+ Bytecode.AddStep("addInE", args);
+ return this;
+ }
+
+ public GraphTraversal AddOutE(params object[] args)
+ {
+ Bytecode.AddStep("addOutE", args);
+ return this;
+ }
+
+ public GraphTraversal AddV(params object[] args)
+ {
+ Bytecode.AddStep("addV", args);
+ return this;
+ }
+
+ public GraphTraversal Aggregate(params object[] args)
+ {
+ Bytecode.AddStep("aggregate", args);
+ return this;
+ }
+
+ public GraphTraversal And(params object[] args)
+ {
+ Bytecode.AddStep("and", args);
+ return this;
+ }
+
+ public GraphTraversal As(params object[] args)
+ {
+ Bytecode.AddStep("as", args);
+ return this;
+ }
+
+ public GraphTraversal Barrier(params object[] args)
+ {
+ Bytecode.AddStep("barrier", args);
+ return this;
+ }
+
+ public GraphTraversal Both(params object[] args)
+ {
+ Bytecode.AddStep("both", args);
+ return this;
+ }
+
+ public GraphTraversal BothE(params object[] args)
+ {
+ Bytecode.AddStep("bothE", args);
+ return this;
+ }
+
+ public GraphTraversal BothV(params object[] args)
+ {
+ Bytecode.AddStep("bothV", args);
+ return this;
+ }
+
+ public GraphTraversal Branch(params object[] args)
+ {
+ Bytecode.AddStep("branch", args);
+ return this;
+ }
+
+ public GraphTraversal By(params object[] args)
+ {
+ Bytecode.AddStep("by", args);
+ return this;
+ }
+
+ public GraphTraversal Cap(params object[] args)
+ {
+ Bytecode.AddStep("cap", args);
+ return this;
+ }
+
+ public GraphTraversal Choose(params object[] args)
+ {
+ Bytecode.AddStep("choose", args);
+ return this;
+ }
+
+ public GraphTraversal Coalesce(params object[] args)
+ {
+ Bytecode.AddStep("coalesce", args);
+ return this;
+ }
+
+ public GraphTraversal Coin(params object[] args)
+ {
+ Bytecode.AddStep("coin", args);
+ return this;
+ }
+
+ public GraphTraversal Constant(params object[] args)
+ {
+ Bytecode.AddStep("constant", args);
+ return this;
+ }
+
+ public GraphTraversal Count(params object[] args)
+ {
+ Bytecode.AddStep("count", args);
+ return this;
+ }
+
+ public GraphTraversal CyclicPath(params object[] args)
+ {
+ Bytecode.AddStep("cyclicPath", args);
+ return this;
+ }
+
+ public GraphTraversal Dedup(params object[] args)
+ {
+ Bytecode.AddStep("dedup", args);
+ return this;
+ }
+
+ public GraphTraversal Drop(params object[] args)
+ {
+ Bytecode.AddStep("drop", args);
+ return this;
+ }
+
+ public GraphTraversal Emit(params object[] args)
+ {
+ Bytecode.AddStep("emit", args);
+ return this;
+ }
+
+ public GraphTraversal Filter(params object[] args)
+ {
+ Bytecode.AddStep("filter", args);
+ return this;
+ }
+
+ public GraphTraversal FlatMap(params object[] args)
+ {
+ Bytecode.AddStep("flatMap", args);
+ return this;
+ }
+
+ public GraphTraversal Fold(params object[] args)
+ {
+ Bytecode.AddStep("fold", args);
+ return this;
+ }
+
+ public GraphTraversal From(params object[] args)
+ {
+ Bytecode.AddStep("from", args);
+ return this;
+ }
+
+ public GraphTraversal Group(params object[] args)
+ {
+ Bytecode.AddStep("group", args);
+ return this;
+ }
+
+ public GraphTraversal GroupCount(params object[] args)
+ {
+ Bytecode.AddStep("groupCount", args);
+ return this;
+ }
+
+ public GraphTraversal GroupV3d0(params object[] args)
+ {
+ Bytecode.AddStep("groupV3d0", args);
+ return this;
+ }
+
+ public GraphTraversal Has(params object[] args)
+ {
+ Bytecode.AddStep("has", args);
+ return this;
+ }
+
+ public GraphTraversal HasId(params object[] args)
+ {
+ Bytecode.AddStep("hasId", args);
+ return this;
+ }
+
+ public GraphTraversal HasKey(params object[] args)
+ {
+ Bytecode.AddStep("hasKey", args);
+ return this;
+ }
+
+ public GraphTraversal HasLabel(params object[] args)
+ {
+ Bytecode.AddStep("hasLabel", args);
+ return this;
+ }
+
+ public GraphTraversal HasNot(params object[] args)
+ {
+ Bytecode.AddStep("hasNot", args);
+ return this;
+ }
+
+ public GraphTraversal HasValue(params object[] args)
+ {
+ Bytecode.AddStep("hasValue", args);
+ return this;
+ }
+
+ public GraphTraversal Id(params object[] args)
+ {
+ Bytecode.AddStep("id", args);
+ return this;
+ }
+
+ public GraphTraversal Identity(params object[] args)
+ {
+ Bytecode.AddStep("identity", args);
+ return this;
+ }
+
+ public GraphTraversal In(params object[] args)
+ {
+ Bytecode.AddStep("in", args);
+ return this;
+ }
+
+ public GraphTraversal InE(params object[] args)
+ {
+ Bytecode.AddStep("inE", args);
+ return this;
+ }
+
+ public GraphTraversal InV(params object[] args)
+ {
+ Bytecode.AddStep("inV", args);
+ return this;
+ }
+
+ public GraphTraversal Inject(params object[] args)
+ {
+ Bytecode.AddStep("inject", args);
+ return this;
+ }
+
+ public GraphTraversal Is(params object[] args)
+ {
+ Bytecode.AddStep("is", args);
+ return this;
+ }
+
+ public GraphTraversal Key(params object[] args)
+ {
+ Bytecode.AddStep("key", args);
+ return this;
+ }
+
+ public GraphTraversal Label(params object[] args)
+ {
+ Bytecode.AddStep("label", args);
+ return this;
+ }
+
+ public GraphTraversal Limit(params object[] args)
+ {
+ Bytecode.AddStep("limit", args);
+ return this;
+ }
+
+ public GraphTraversal Local(params object[] args)
+ {
+ Bytecode.AddStep("local", args);
+ return this;
+ }
+
+ public GraphTraversal Loops(params object[] args)
+ {
+ Bytecode.AddStep("loops", args);
+ return this;
+ }
+
+ public GraphTraversal Map(params object[] args)
+ {
+ Bytecode.AddStep("map", args);
+ return this;
+ }
+
+ public GraphTraversal MapKeys(params object[] args)
+ {
+ Bytecode.AddStep("mapKeys", args);
+ return this;
+ }
+
+ public GraphTraversal MapValues(params object[] args)
+ {
+ Bytecode.AddStep("mapValues", args);
+ return this;
+ }
+
+ public GraphTraversal Match(params object[] args)
+ {
+ Bytecode.AddStep("match", args);
+ return this;
+ }
+
+ public GraphTraversal Max(params object[] args)
+ {
+ Bytecode.AddStep("max", args);
+ return this;
+ }
+
+ public GraphTraversal Mean(params object[] args)
+ {
+ Bytecode.AddStep("mean", args);
+ return this;
+ }
+
+ public GraphTraversal Min(params object[] args)
+ {
+ Bytecode.AddStep("min", args);
+ return this;
+ }
+
+ public GraphTraversal Not(params object[] args)
+ {
+ Bytecode.AddStep("not", args);
+ return this;
+ }
+
+ public GraphTraversal Option(params object[] args)
+ {
+ Bytecode.AddStep("option", args);
+ return this;
+ }
+
+ public GraphTraversal Optional(params object[] args)
+ {
+ Bytecode.AddStep("optional", args);
+ return this;
+ }
+
+ public GraphTraversal Or(params object[] args)
+ {
+ Bytecode.AddStep("or", args);
+ return this;
+ }
+
+ public GraphTraversal Order(params object[] args)
+ {
+ Bytecode.AddStep("order", args);
+ return this;
+ }
+
+ public GraphTraversal OtherV(params object[] args)
+ {
+ Bytecode.AddStep("otherV", args);
+ return this;
+ }
+
+ public GraphTraversal Out(params object[] args)
+ {
+ Bytecode.AddStep("out", args);
+ return this;
+ }
+
+ public GraphTraversal OutE(params object[] args)
+ {
+ Bytecode.AddStep("outE", args);
+ return this;
+ }
+
+ public GraphTraversal OutV(params object[] args)
+ {
+ Bytecode.AddStep("outV", args);
+ return this;
+ }
+
+ public GraphTraversal PageRank(params object[] args)
+ {
+ Bytecode.AddStep("pageRank", args);
+ return this;
+ }
+
+ public GraphTraversal Path(params object[] args)
+ {
+ Bytecode.AddStep("path", args);
+ return this;
+ }
+
+ public GraphTraversal PeerPressure(params object[] args)
+ {
+ Bytecode.AddStep("peerPressure", args);
+ return this;
+ }
+
+ public GraphTraversal Profile(params object[] args)
+ {
+ Bytecode.AddStep("profile", args);
+ return this;
+ }
+
+ public GraphTraversal Program(params object[] args)
+ {
+ Bytecode.AddStep("program", args);
+ return this;
+ }
+
+ public GraphTraversal Project(params object[] args)
+ {
+ Bytecode.AddStep("project", args);
+ return this;
+ }
+
+ public GraphTraversal Properties(params object[] args)
+ {
+ Bytecode.AddStep("properties", args);
+ return this;
+ }
+
+ public GraphTraversal Property(params object[] args)
+ {
+ Bytecode.AddStep("property", args);
+ return this;
+ }
+
+ public GraphTraversal PropertyMap(params object[] args)
+ {
+ Bytecode.AddStep("propertyMap", args);
+ return this;
+ }
+
+ public GraphTraversal Range(params object[] args)
+ {
+ Bytecode.AddStep("range", args);
+ return this;
+ }
+
+ public GraphTraversal Repeat(params object[] args)
+ {
+ Bytecode.AddStep("repeat", args);
+ return this;
+ }
+
+ public GraphTraversal Sack(params object[] args)
+ {
+ Bytecode.AddStep("sack", args);
+ return this;
+ }
+
+ public GraphTraversal Sample(params object[] args)
+ {
+ Bytecode.AddStep("sample", args);
+ return this;
+ }
+
+ public GraphTraversal Select(params object[] args)
+ {
+ Bytecode.AddStep("select", args);
+ return this;
+ }
+
+ public GraphTraversal SideEffect(params object[] args)
+ {
+ Bytecode.AddStep("sideEffect", args);
+ return this;
+ }
+
+ public GraphTraversal SimplePath(params object[] args)
+ {
+ Bytecode.AddStep("simplePath", args);
+ return this;
+ }
+
+ public GraphTraversal Store(params object[] args)
+ {
+ Bytecode.AddStep("store", args);
+ return this;
+ }
+
+ public GraphTraversal Subgraph(params object[] args)
+ {
+ Bytecode.AddStep("subgraph", args);
+ return this;
+ }
+
+ public GraphTraversal Sum(params object[] args)
+ {
+ Bytecode.AddStep("sum", args);
+ return this;
+ }
+
+ public GraphTraversal Tail(params object[] args)
+ {
+ Bytecode.AddStep("tail", args);
+ return this;
+ }
+
+ public GraphTraversal TimeLimit(params object[] args)
+ {
+ Bytecode.AddStep("timeLimit", args);
+ return this;
+ }
+
+ public GraphTraversal Times(params object[] args)
+ {
+ Bytecode.AddStep("times", args);
+ return this;
+ }
+
+ public GraphTraversal To(params object[] args)
+ {
+ Bytecode.AddStep("to", args);
+ return this;
+ }
+
+ public GraphTraversal ToE(params object[] args)
+ {
+ Bytecode.AddStep("toE", args);
+ return this;
+ }
+
+ public GraphTraversal ToV(params object[] args)
+ {
+ Bytecode.AddStep("toV", args);
+ return this;
+ }
+
+ public GraphTraversal Tree(params object[] args)
+ {
+ Bytecode.AddStep("tree", args);
+ return this;
+ }
+
+ public GraphTraversal Unfold(params object[] args)
+ {
+ Bytecode.AddStep("unfold", args);
+ return this;
+ }
+
+ public GraphTraversal Union(params object[] args)
+ {
+ Bytecode.AddStep("union", args);
+ return this;
+ }
+
+ public GraphTraversal Until(params object[] args)
+ {
+ Bytecode.AddStep("until", args);
+ return this;
+ }
+
+ public GraphTraversal Value(params object[] args)
+ {
+ Bytecode.AddStep("value", args);
+ return this;
+ }
+
+ public GraphTraversal ValueMap(params object[] args)
+ {
+ Bytecode.AddStep("valueMap", args);
+ return this;
+ }
+
+ public GraphTraversal Values(params object[] args)
+ {
+ Bytecode.AddStep("values", args);
+ return this;
+ }
+
+ public GraphTraversal Where(params object[] args)
+ {
+ Bytecode.AddStep("where", args);
+ return this;
+ }
+ }
+}