Edge and Path result parsing
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/17d6876b Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/17d6876b Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/17d6876b Branch: refs/heads/master Commit: 17d6876b48632dd24c57d681476b1232adea8d1d Parents: f38c2d0 Author: Jorge Bay Gondra <jorgebaygon...@gmail.com> Authored: Fri Nov 3 16:00:50 2017 +0100 Committer: Jorge Bay Gondra <jorgebaygon...@gmail.com> Committed: Thu Nov 30 10:00:08 2017 +0100 ---------------------------------------------------------------------- .../Gherkin/CommonSteps.cs | 8 +++---- .../Gherkin/ScenarioData.cs | 25 +++++++++++++++++--- .../ModernGraphTypeInformation.cs | 4 ++++ .../TraversalEvaluationTests.cs | 3 ++- .../TraversalEvaluation/TraversalParser.cs | 17 +++++++++++-- 5 files changed, 47 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/17d6876b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs index 235f1ba..8b27567 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs @@ -182,14 +182,14 @@ namespace Gremlin.Net.IntegrationTest.Gherkin return ScenarioData.Instance.ModernVertices[name]; } - private static Edge ToEdge(string s) + private static Edge ToEdge(string name) { - throw new NotImplementedException(); + return ScenarioData.Instance.ModernEdges[name]; } - private static Path ToPath(string arg) + private static Path ToPath(string value) { - throw new NotImplementedException(); + return new Path(new List<List<string>>(0), value.Split(',').Select(ParseValue).ToList()); } private static object ParseValue(string stringValue) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/17d6876b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs index c45ed12..d9f66ff 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs @@ -24,6 +24,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using Gremlin.Net.IntegrationTest.Process.Traversal.DriverRemoteConnection; using Gremlin.Net.Process.Traversal; using Gremlin.Net.Structure; @@ -35,6 +36,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin private static readonly Lazy<ScenarioData> Lazy = new Lazy<ScenarioData>(Load); public static ScenarioData Instance => Lazy.Value; + + private static readonly Regex EdgeORegex = new Regex("o=(.+?)[,}]", RegexOptions.Compiled); + private static readonly Regex EdgeLRegex = new Regex("l=(.+?)[,}]", RegexOptions.Compiled); + private static readonly Regex EdgeIRegex = new Regex("i=(.+?)[,}]", RegexOptions.Compiled); public IDictionary<string, Vertex> ModernVertices { get; } @@ -50,10 +55,24 @@ namespace Gremlin.Net.IntegrationTest.Gherkin { var connectionFactory = new RemoteConnectionFactory(); var g = new Graph().Traversal().WithRemote(connectionFactory.CreateRemoteConnection()); - //TODO: Remove workaround once Group() is fixed TINKERPOP-1752 - var vertices = g.V().ToList().ToDictionary(v => g.V(v.Id).Values<string>("name").Next(), v => v); + var vertices = g.V().Group<string, object>().By("name").By(__.Tail<Vertex>()).Next() + .ToDictionary(kv => kv.Key, kv => (Vertex)kv.Value); + var edges = g.E().Group<string, object>() + .By(__.Project<Edge>("o", "l", "i") + .By(__.OutV().Values<string>("name")).By(__.Label()).By(__.InV().Values<string>("name"))) + .By(__.Tail<object>()) + .Next() + .ToDictionary(kv => GetEdgeKey(kv.Key), kv => (Edge)kv.Value); connectionFactory.Dispose(); - return new ScenarioData(vertices, null); + return new ScenarioData(vertices, edges); + } + + private static string GetEdgeKey(string key) + { + var o = EdgeORegex.Match(key).Groups[1].Value; + var l = EdgeLRegex.Match(key).Groups[1].Value; + var i = EdgeIRegex.Match(key).Groups[1].Value; + return o + "-" + l + "->" + i; } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/17d6876b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs index e26ec5f..7e2bee1 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs @@ -59,6 +59,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation case nameof(GraphTraversal<object,object>.ValueMap): // Use IDictionary<string, object> for value maps return typeof(object); + case nameof(GraphTraversal<object,object>.Limit): + case nameof(GraphTraversal<object,object>.Optional): + // Maintain the same type + return method.DeclaringType.GetGenericArguments()[1]; } return null; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/17d6876b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs index d2a62b4..aaca93f 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs @@ -81,7 +81,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation Tuple.Create("g.V().valueMap(true, \"name\", \"age\")", 2), Tuple.Create("g.V().where(__.in(\"created\").count().is(1)).values(\"name\")", 3), Tuple.Create("g.V().count(Scope.local)", 2), - Tuple.Create("g.V().values(\"age\").is(P.lte(30))", 3) + Tuple.Create("g.V().values(\"age\").is(P.lte(30))", 3), + Tuple.Create("g.V().optional(__.out().optional(__.out())).path().limit(1)", 4) }; var g = new Graph().Traversal(); foreach (var tuple in traversalTexts) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/17d6876b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs ---------------------------------------------------------------------- diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs index bb0aac8..b5efb8d 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs @@ -44,6 +44,11 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation private static readonly Regex RegexEnum = new Regex(@"\w+\.\w+", RegexOptions.Compiled); private static readonly Regex RegexParam = new Regex(@"\w+", RegexOptions.Compiled); + + private static readonly HashSet<Type> NumericTypes = new HashSet<Type> + { + typeof(int), typeof(long), typeof(double), typeof(float), typeof(short), typeof(decimal), typeof(byte) + }; internal static ITraversal GetTraversal(string traversalText, GraphTraversalSource g, IDictionary<string, object> contextParameterValues) @@ -151,9 +156,15 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation } else { - if (!methodParameter.ParameterType.GetTypeInfo().IsAssignableFrom(tokenParameterType)) + if (IsNumeric(methodParameter.ParameterType) && IsNumeric(tokenParameterType)) { - break; + // Acount for implicit conversion of numeric values as an exact match + exactMatches++; + } + else if (!methodParameter.ParameterType.GetTypeInfo().IsAssignableFrom(tokenParameterType)) + { + // Not a match + break; } // Is assignable to the parameter type matched = true; @@ -169,6 +180,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation lastMethod; } + private static bool IsNumeric(Type t) => NumericTypes.Contains(t); + private static bool IsParamsArray(ParameterInfo methodParameter) { return methodParameter.IsDefined(typeof(ParamArrayAttribute), false);