diff --git a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs index 2064ace5..8879da9d 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs @@ -1271,11 +1271,85 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath JArray a = JArray.Parse(json); - List result = a.SelectTokens("$.[?($.store.bicycle.price < 20)]").ToList(); + List result = a.SelectTokens("$.[?($.[0].store.bicycle.price < 20)]").ToList(); Assert.AreEqual(1, result.Count); - result = a.SelectTokens("$.[?($.store.bicycle.price < 10)]").ToList(); + result = a.SelectTokens("$.[?($.[0].store.bicycle.price < 10)]").ToList(); Assert.AreEqual(0, result.Count); } + + [Test] + public void RootInFilterWithRootObject() + { + string json = @"{ + ""store"" : { + ""book"" : [ + { + ""category"" : ""reference"", + ""author"" : ""Nigel Rees"", + ""title"" : ""Sayings of the Century"", + ""price"" : 8.95 + }, + { + ""category"" : ""fiction"", + ""author"" : ""Evelyn Waugh"", + ""title"" : ""Sword of Honour"", + ""price"" : 12.99 + }, + { + ""category"" : ""fiction"", + ""author"" : ""Herman Melville"", + ""title"" : ""Moby Dick"", + ""isbn"" : ""0-553-21311-3"", + ""price"" : 8.99 + }, + { + ""category"" : ""fiction"", + ""author"" : ""J. R. R. Tolkien"", + ""title"" : ""The Lord of the Rings"", + ""isbn"" : ""0-395-19395-8"", + ""price"" : 22.99 + } + ], + ""bicycle"" : [ + { + ""color"" : ""red"", + ""price"" : 19.95 + } + ] + }, + ""expensive"" : 10 + }"; + + JObject a = JObject.Parse(json); + + List result = a.SelectTokens("$..book[?(@.price <= $['expensive'])]").ToList(); + Assert.AreEqual(2, result.Count); + + result = a.SelectTokens("$.store..[?(@.price > $.expensive)]").ToList(); + Assert.AreEqual(3, result.Count); + } + + [Test] + public void RootInFilterWithInitializers() + { + JObject rootObject = new JObject + { + { "referenceDate", new JValue(DateTime.MinValue) }, + { + "dateObjectsArray", + new JArray() + { + new JObject { { "date", new JValue(DateTime.MinValue) } }, + new JObject { { "date", new JValue(DateTime.MaxValue) } }, + new JObject { { "date", new JValue(DateTime.Now) } }, + new JObject { { "date", new JValue(DateTime.MinValue) } }, + } + } + }; + + List result = rootObject.SelectTokens("$.dateObjectsArray[?(@.date == $.referenceDate)]").ToList(); + Assert.AreEqual(2, result.Count); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Linq/JsonPath/RootFilter.cs b/Src/Newtonsoft.Json/Linq/JsonPath/RootFilter.cs index 6ad3fb14..2378477f 100644 --- a/Src/Newtonsoft.Json/Linq/JsonPath/RootFilter.cs +++ b/Src/Newtonsoft.Json/Linq/JsonPath/RootFilter.cs @@ -12,7 +12,7 @@ namespace Newtonsoft.Json.Linq.JsonPath public override IEnumerable ExecuteFilter(JToken root, IEnumerable current, bool errorWhenNoMatch) { - return root; + yield return root; } } } \ No newline at end of file