You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by jo...@apache.org on 2017/11/23 08:16:25 UTC

[50/50] tinkerpop git commit: Use non-dynamic traversal evaluation and support numeric conversion

Use non-dynamic traversal evaluation and support numeric conversion


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/d087a880
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/d087a880
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/d087a880

Branch: refs/heads/TINKERPOP-1827
Commit: d087a880f6b1370684d591676645d728e48ce0fe
Parents: ad78f6e
Author: Jorge Bay Gondra <jo...@gmail.com>
Authored: Tue Nov 21 11:44:03 2017 +0100
Committer: Jorge Bay Gondra <jo...@gmail.com>
Committed: Thu Nov 23 09:08:09 2017 +0100

----------------------------------------------------------------------
 .../Gherkin/CommonSteps.cs                      | 52 +++++++++++++++-----
 .../Gherkin/GherkinTestRunner.cs                | 33 +------------
 .../Gherkin/ScenarioData.cs                     | 40 ++++++++++++---
 .../ModernGraphTypeInformation.cs               | 29 +++--------
 .../TraversalEvaluationTests.cs                 | 10 ++--
 .../TraversalEvaluation/TraversalParser.cs      | 13 +++--
 6 files changed, 98 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d087a880/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 9bc36a6..fda44b8 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
@@ -41,13 +41,13 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         private GraphTraversalSource _g;
         private string _graphName;
         private readonly IDictionary<string, object> _parameters = new Dictionary<string, object>();
-        private dynamic _traversal;
+        private ITraversal _traversal;
         private object[] _result;
 
         private static readonly IDictionary<Regex, Func<string, string, object>> Parsers =
             new Dictionary<string, Func<string, string, object>>
             {
-                {@"d\[([\d.]+)\]\.([ilfd])", ToNumber},
+                {@"d\[([\d.]+)\]\.([ilfdm])", ToNumber},
                 {@"v\[(.+)\]", ToVertex},
                 {@"v\[(.+)\]\.id", (x, graphName) => ToVertex(x, graphName).Id},
                 {@"v\[(.+)\]\.sid", (x, graphName) => ToVertex(x, graphName).Id.ToString()},
@@ -55,8 +55,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                 {@"e\[(.+)\].id", (x, graphName) => ToEdge(x, graphName).Id},
                 {@"e\[(.+)\].sid", (x, graphName) => ToEdge(x, graphName).Id.ToString()},
                 {@"p\[(.+)\]", ToPath},
-                {@"l\[(.+)\]", ToList},
-                {@"s\[(.+)\]", ToSet},
+                {@"l\[(.*)\]", ToList},
+                {@"s\[(.*)\]", ToSet},
                 {@"m\[(.+)\]", ToMap},
                 {@"c\[(.+)\]", ToLambda}
             }.ToDictionary(kv => new Regex("^" + kv.Key + "$", RegexOptions.Compiled), kv => kv.Value);
@@ -67,7 +67,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                 { 'i', s => Convert.ToInt32(s) },
                 { 'l', s => Convert.ToInt64(s) },
                 { 'f', s => Convert.ToSingle(s) },
-                { 'd', s => Convert.ToDouble(s) }
+                { 'd', s => Convert.ToDouble(s) },
+                { 'm', s => Convert.ToDecimal(s)}
             };
 
         [Given("the (\\w+) graph")]
@@ -121,22 +122,41 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         [When("iterated to list")]
         public void IterateToList()
         {
-            if (!(_traversal is ITraversal))
+            if (_traversal == null)
             {
                 throw new InvalidOperationException("Traversal should be set before iterating");
             }
-            IEnumerable enumerable = _traversal.ToList();
-            _result = enumerable.Cast<object>().ToArray();
+            ITraversal t = _traversal;
+            var list = new List<object>();
+            while (t.MoveNext())
+            {
+                list.Add(t.Current);
+            }
+            _result = list.ToArray();
         }
 
         [When("iterated next")]
         public void IterateNext()
         {
-            if (!(_traversal is ITraversal))
+            if (_traversal == null)
             {
                 throw new InvalidOperationException("Traversal should be set before iterating");
             }
-            _result = _traversal.Next();
+            _traversal.MoveNext();
+            var result = _traversal.Current;
+            switch (result)
+            {
+                case null:
+                    _result = null;
+                    return;
+                case object[] arrayResult:
+                    _result = arrayResult;
+                    return;
+                case IEnumerable enumerableResult:
+                    _result = enumerableResult.Cast<object>().ToArray();
+                    return;
+            }
+            throw new InvalidCastException($"Can not convert instance of {result.GetType()} to object[]");
         }
 
         [Then("the result should be (\\w+)")]
@@ -150,6 +170,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                     return;
                 case "ordered":
                 case "unordered":
+                case "of":
                     Assert.NotNull(table);
                     var rows = table.Rows.ToArray();
                     Assert.Equal("result", rows[0].Cells.First().Value);
@@ -165,7 +186,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                         {
                             Assert.Contains(resultItem, expectedArray);
                         }
-                        Assert.Equal(expectedArray.Length, _result.Length);
+                        if (characterizedAs != "of")
+                        {
+                            Assert.Equal(expectedArray.Length, _result.Length);   
+                        }
                     }
                     break;
                 default:
@@ -248,7 +272,11 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
 
         private static IList<object> ToList(string stringList, string graphName)
         {
-            return stringList.Split(',').Select(x => ParseValue(x, graphName)).ToArray();
+            if (stringList == "")
+            {
+                return new List<object>(0);
+            }
+            return stringList.Split(',').Select(x => ParseValue(x, graphName)).ToList();
         }
 
         private static Vertex ToVertex(string name, string graphName)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d087a880/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
index cd03eca..dd5fbca 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
@@ -53,11 +53,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                 { "g_V_outXcreatedX_groupCount_byXnameX", IgnoreReason.MapCoersionIssue},
                 { "g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount", IgnoreReason
                 .MapCoersionIssue},
-                { "g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX", IgnoreReason.MapCoersionIssue},
-                
-                { "g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum", IgnoreReason.ScenarioDesignMapNumbers},
-                { "g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX", IgnoreReason.ScenarioDesignMapNumbers},
-                { "g_V_groupXaX_byXlabelX_byXoutE_weight_sumX_capXaX", IgnoreReason.ScenarioDesignMapNumbers}
+                { "g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX", IgnoreReason.MapCoersionIssue}
             };
         
         private static class Keywords
@@ -136,7 +132,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                 }
             }
             OutputResults(results);
-            Console.WriteLine("Finished Gherkin-based tests");
+            WriteOutput("Finished Gherkin-based tests");
             ScenarioData.Shutdown();
         }
 
@@ -367,35 +363,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         {
             var rootPath = GetRootPath();
             var path = Path.Combine(rootPath, "gremlin-test", "features");
-            WriteOutput(path);
-            WriteOutput("------");
-
-//            var files = new []
-//            {
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Sum.feature",
-////                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Coalesce.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/AddEdge.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/AddVertex.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/ValueMap.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Select.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Project.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Path.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Map.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Match.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Max.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/map/Mean.feature",
-//                
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/sideEffect/Sack.feature",
-//                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/sideEffect/Group.feature",
-////                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/sideEffect/GroupCount.feature",
-////                "/Users/jorge/workspace/tinkerpop/gremlin-test/features/sideEffect/Inject.feature",
-//            };
-//            var files = new [] {"/Users/jorge/workspace/temp/count.feature"};
             var files = Directory.GetFiles(path, "*.feature", SearchOption.AllDirectories);
             foreach (var gherkinFile in files)
             {
                 var parser = new Parser();
-                WriteOutput("Parsing " + gherkinFile);
                 var doc = parser.Parse(gherkinFile);
                 yield return doc.Feature;
             }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d087a880/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 919da0b..ed767d5 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
@@ -23,8 +23,10 @@
 
 using System;
 using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.Linq;
 using System.Text.RegularExpressions;
+using Gremlin.Net.Driver.Exceptions;
 using Gremlin.Net.IntegrationTest.Process.Traversal.DriverRemoteConnection;
 using Gremlin.Net.Process.Remote;
 using Gremlin.Net.Process.Traversal;
@@ -41,6 +43,12 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         private static readonly Regex EdgeIRegex = new Regex("i=(.+?)[,}]", RegexOptions.Compiled);
         
         private static readonly string[] GraphNames = {"modern", "classic", "crew", "grateful"};
+
+        private static readonly IDictionary<string, Vertex> EmptyVertices =
+            new ReadOnlyDictionary<string, Vertex>(new Dictionary<string, Vertex>());
+        
+        private static readonly IDictionary<string, Edge> EmptyEdges =
+            new ReadOnlyDictionary<string, Edge>(new Dictionary<string, Edge>());
         
         private static readonly RemoteConnectionFactory ConnectionFactory = new RemoteConnectionFactory();
 
@@ -99,18 +107,34 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
 
         private static IDictionary<string, Vertex> GetVertices(GraphTraversalSource g)
         {
-            return g.V().Group<string, object>().By("name").By(__.Tail<Vertex>()).Next()
-                .ToDictionary(kv => kv.Key, kv => (Vertex)kv.Value);
+            try
+            {
+                return g.V().Group<string, object>().By("name").By(__.Tail<Vertex>()).Next()
+                    .ToDictionary(kv => kv.Key, kv => (Vertex) kv.Value);
+            }
+            catch (ResponseException)
+            {
+                // Property name might not exist
+                return EmptyVertices;
+            }
         }
 
         private static IDictionary<string, Edge> GetEdges(GraphTraversalSource g)
         {
-            return 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);
+            try
+            {
+                return 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);
+            }
+            catch (ResponseException)
+            {
+                // Property name might not exist
+                return EmptyEdges;
+            }
         }
 
         private static string GetEdgeKey(string key)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d087a880/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 3125aab..aec3d3e 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/ModernGraphTypeInformation.cs
@@ -45,6 +45,12 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
         /// </summary>s
         public static Type GetTypeArguments(MethodInfo method, object[] parameterValues, int genericTypeIndex)
         {
+            var isGeneric = method.DeclaringType.GetTypeInfo().IsGenericType;
+            if (!isGeneric)
+            {
+                // Maintain object for anonymous traversal
+                return typeof(object);
+            }
             switch (method.Name)
             {
                 case nameof(GraphTraversal<object,object>.Properties):
@@ -68,31 +74,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
                 case nameof(GraphTraversal<object,object>.Match):
                     // Maintain the same type
                     return method.DeclaringType.GetGenericArguments()[1];
-                case nameof(GraphTraversal<object,object>.ValueMap):
-                case nameof(GraphTraversal<object,object>.Select):
-                case nameof(GraphTraversal<object,object>.Group):
-                case nameof(GraphTraversal<object,object>.GroupCount):
-                case nameof(GraphTraversal<object,object>.Unfold):
-                case nameof(GraphTraversal<object,object>.Choose):
-                case nameof(GraphTraversal<object,object>.Union):
-                case nameof(GraphTraversal<object,object>.Project):
-                case nameof(GraphTraversal<object,object>.Sack):
-                case nameof(GraphTraversal<object,object>.Map):
-                case nameof(GraphTraversal<object,object>.Max):
-                case nameof(GraphTraversal<object,object>.Min):
-                case nameof(GraphTraversal<object,object>.Mean):
-                case nameof(GraphTraversal<object,object>.Cap):
-                case nameof(GraphTraversal<object,object>.Constant):
-                case nameof(GraphTraversal<object,object>.Branch):
-                case nameof(GraphTraversal<object,object>.Local):
-                case nameof(GraphTraversal<object,object>.Tail):
-                case nameof(GraphTraversal<object,object>.Range):
-                case nameof(GraphTraversal<object,object>.Value):
-                case nameof(GraphTraversal<object,object>.Fold):
+                default:
                     // default to object for this methods
                     return typeof(object);
             }
-            return null;
         }
 
         private static Type GetElementPropertyType(string name)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d087a880/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 3907dd2..94a8c99 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalEvaluationTests.cs
@@ -42,8 +42,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
                     new[] {new Token("constant", new[] {LiteralParameter.Create(123L)})}),
                 Tuple.Create("g.V().constant(123)", 
                     new[] {new Token("constant", new[] {LiteralParameter.Create(123)})}),
-                Tuple.Create("g.V().constant(123.1)", 
-                    new[] {new Token("constant", new[] {LiteralParameter.Create(123.1)})}),
+                Tuple.Create("g.V().constant(123.50)", 
+                    new[] {new Token("constant", new[] {LiteralParameter.Create(123.50m)})}),
                 Tuple.Create("g.V().constant(123.1f)", 
                     new[] {new Token("constant", new[] {LiteralParameter.Create(123.1f)})}),
                 Tuple.Create("g.V().has(\"no\").count()",
@@ -96,7 +96,11 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
                 Tuple.Create(
                     "g.V().hasLabel(\"software\").group().by(\"name\").by(__.bothE().values(\"weight\").sum())", 5),
                 Tuple.Create("g.V().choose(__.outE().count().is(0L),__.as(\"a\"),__.as(\"b\"))" +
-                                  "\n.choose(__.select(\"a\"),__.select(\"a\"),__.select(\"b\"))", 3)
+                                  "\n.choose(__.select(\"a\"),__.select(\"a\"),__.select(\"b\"))", 3),
+                Tuple.Create("g.V().repeat(__.out()).times(2) ", 3),
+                Tuple.Create("g.V().local(__.match(\n   __.as(\"project\").in(\"created\").as(\"person\"),\n__.as(\"person\").values(\"name\").as(\"name\"))).select(\"name\", \"project\").by().by(\"name\")", 5),
+                Tuple.Create("g.V().as(\"a\").out().as(\"a\").out().as(\"a\").select(\"a\").by(__.unfold().values(\"name\").fold()).tail(Scope.local, 2)", 9),
+                Tuple.Create("g.V().coin(1.0)", 2)
             };
             var g = new Graph().Traversal();
             foreach (var tuple in traversalTexts)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d087a880/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 66aae70..827960d 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/TraversalEvaluation/TraversalParser.cs
@@ -244,6 +244,12 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
                         // if we have the type of value we have the type of E2. 
                         genericParameterTypes.Add(info.ParameterType.Name, tokenParameter.GetParameterType());
                     }
+                    if (info.ParameterType != tokenParameter.GetParameterType() && IsNumeric(info.ParameterType) &&
+                        IsNumeric(tokenParameter.GetParameterType()))
+                    {
+                        // Numeric conversion
+                        value = Convert.ChangeType(value, info.ParameterType);
+                    }
                 }
                 if (IsParamsArray(info))
                 {
@@ -332,8 +338,9 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
                         parameters.Add(param);
                         break;
                     }
-                    case ',' when text[i+1] != ' ' && parsing == ParsingPart.StartParameters:
-                    case ' ' when text[i+1] != ' ' && text[i+1] != ')' && parsing == ParsingPart.StartParameters:
+                    case ',' when parsing == ParsingPart.StartParameters && text.Length > i + 1 && text[i+1] != ' ':
+                    case ' ' when parsing == ParsingPart.StartParameters && text.Length > i + 1 && text[i+1] != ' ' &&
+                                  text[i+1] != ')':
                     {
                         i++;
                         var param = ParseParameter(text, ref i);
@@ -450,7 +457,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin.TraversalEvaluation
             if (match.Groups[1].Value != "")
             {
                 // Captured text with the decimal separator
-                return LiteralParameter.Create(Convert.ToDouble(match.Value));
+                return LiteralParameter.Create(Convert.ToDecimal(match.Value));
             }
             return LiteralParameter.Create(Convert.ToInt32(match.Value));
         }