[
https://issues.apache.org/jira/browse/TINKERPOP-1734?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16272381#comment-16272381
]
ASF GitHub Bot commented on TINKERPOP-1734:
-------------------------------------------
Github user jorgebay commented on a diff in the pull request:
https://github.com/apache/tinkerpop/pull/758#discussion_r154014270
--- Diff: docs/src/reference/the-traversal.asciidoc ---
@@ -3218,3 +3218,93 @@ social.persons("marko").youngestFriendsAge()
social.persons().filter(__.createdAtLeast(2)).count()
----
+=== Gremlin.Net
+
+Developing DSLs for .Net is most easily implemented using
link:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods[Extension
Methods]
+as they don't require direct extension of classes in the TinkerPop
hierarchy. Extension Method classes simply need to
+be constructed for the `GraphTraversal` and the `GraphTraversalSource`.
Unfortunately, anonymous traversals (spawned
+from `__`) can't use the Extension Method approach as they do not work for
static classes and static classes can't be
+extended. The only option is to re-implement the methods of `__` as a
wrapper in the anonymous traversal for the DSL
+or to simply create a static class for the DSL and use the two anonymous
traversals creators independently. The
+following example uses the latter approach as it saves a lot of
boilerplate code with the minor annoyance of having a
+second static class to deal with when writing traversals rather than just
calling `__` for everything.
+
+[source,csharp]
+----
+namespace Dsl
+{
+
+ public static class SocialTraversal
+ {
+ public static GraphTraversal<Vertex,Vertex> Knows(this
GraphTraversal<Vertex,Vertex> t, string personName)
+ {
+ return t.Out("knows").HasLabel("person").Has("name",
personName);
+ }
+
+ public static GraphTraversal<Vertex, int> YoungestFriendsAge(this
GraphTraversal<Vertex,Vertex> t)
+ {
+ return
t.Out("knows").HasLabel("person").Values<int>("age").Min<int>();
+ }
+
+ public static GraphTraversal<Vertex,long> CreatedAtLeast(this
GraphTraversal<Vertex,Vertex> t, long number)
+ {
+ return t.OutE("created").Count().Is(P.Gte(number));
+ }
+ }
+
+ public static class __Social
+ {
+ public static GraphTraversal<object,Vertex> Knows(string
personName)
+ {
+ return __.Out("knows").HasLabel("person").Has("name",
personName);
+ }
+
+ public static GraphTraversal<object, int> YoungestFriendsAge()
+ {
+ return
__.Out("knows").HasLabel("person").Values<int>("age").Min<int>();
+ }
+
+ public static GraphTraversal<object,long> CreatedAtLeast(long
number)
+ {
+ return __.OutE("created").Count().Is(P.Gte(number));
+ }
+ }
+
+ public static class SocialTraversalSource
+ {
+ public static GraphTraversal<Vertex,Vertex> Persons(this
GraphTraversalSource g, params string[] personNames)
+ {
+ GraphTraversal<Vertex,Vertex> t = g.V().HasLabel("person");
+
+ if (personNames.Length > 0)
+ {
+ t = t.Has("name", P.Within(personNames));
+ }
+
+ return t;
+ }
+ }
+}
+----
+
+Note the creation of `__Social` as the Social DSL's "extension" to the
available ways in which to spawn anonymous
+traversals. The use of the double underscore prefix in the name is just a
convention to consider using and is not a
+requirement. To use the DSL, bring it into scope with the `using`
directive:
+
+[source,csharp]
+----
+using Dsl;
--- End diff --
I would include a [`using static`
directive](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-static)
in the code sample:
```csharp
using static Dsl.__Social;
```
which allows using `__Social` methods directly:
```csharp
social.Persons().Filter(CreatedAtLeast(2)).Count();
```
> DSL for Gremlin .NET
> --------------------
>
> Key: TINKERPOP-1734
> URL: https://issues.apache.org/jira/browse/TINKERPOP-1734
> Project: TinkerPop
> Issue Type: Improvement
> Components: dotnet
> Affects Versions: 3.2.5
> Reporter: stephen mallette
>
> This may just be a documentation issue, but we need to determine the approach
> to building DSLs with .NET.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)