Repository: spark Updated Branches: refs/heads/branch-2.1 32c85383b -> c69825a98
[SPARK-18677] Fix parsing ['key'] in JSON path expressions. ## What changes were proposed in this pull request? This fixes the parser rule to match named expressions, which doesn't work for two reasons: 1. The name match is not coerced to a regular expression (missing .r) 2. The surrounding literals are incorrect and attempt to escape a single quote, which is unnecessary ## How was this patch tested? This adds test cases for named expressions using the bracket syntax, including one with quoted spaces. Author: Ryan Blue <[email protected]> Closes #16107 from rdblue/SPARK-18677-fix-json-path. (cherry picked from commit 48778976e0566d9c93a8c900825def82c6b81fd6) Signed-off-by: Herman van Hovell <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/spark/repo Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/c69825a9 Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/c69825a9 Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/c69825a9 Branch: refs/heads/branch-2.1 Commit: c69825a98989ee975dc8b87979e29e0fff15a3f7 Parents: 32c8538 Author: Ryan Blue <[email protected]> Authored: Fri Dec 2 08:41:40 2016 -0800 Committer: Herman van Hovell <[email protected]> Committed: Fri Dec 2 08:41:51 2016 -0800 ---------------------------------------------------------------------- .../catalyst/expressions/jsonExpressions.scala | 2 +- .../expressions/JsonExpressionsSuite.scala | 24 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/spark/blob/c69825a9/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala ---------------------------------------------------------------------- diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala index b61583d..667ff64 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala @@ -69,7 +69,7 @@ private[this] object JsonPathParser extends RegexParsers { // parse `.name` or `['name']` child expressions def named: Parser[List[PathInstruction]] = for { - name <- '.' ~> "[^\\.\\[]+".r | "[\\'" ~> "[^\\'\\?]+" <~ "\\']" + name <- '.' ~> "[^\\.\\[]+".r | "['" ~> "[^\\'\\?]+".r <~ "']" } yield { Key :: Named(name) :: Nil } http://git-wip-us.apache.org/repos/asf/spark/blob/c69825a9/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala ---------------------------------------------------------------------- diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala index 3b0e908..618b8b2 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala @@ -43,6 +43,30 @@ class JsonExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { """{"price":19.95,"color":"red"}""") } + test("$['store'].bicycle") { + checkEvaluation( + GetJsonObject(Literal(json), Literal("$['store'].bicycle")), + """{"price":19.95,"color":"red"}""") + } + + test("$.store['bicycle']") { + checkEvaluation( + GetJsonObject(Literal(json), Literal("$.store['bicycle']")), + """{"price":19.95,"color":"red"}""") + } + + test("$['store']['bicycle']") { + checkEvaluation( + GetJsonObject(Literal(json), Literal("$['store']['bicycle']")), + """{"price":19.95,"color":"red"}""") + } + + test("$['key with spaces']") { + checkEvaluation(GetJsonObject( + Literal("""{ "key with spaces": "it works" }"""), Literal("$['key with spaces']")), + "it works") + } + test("$.store.book") { checkEvaluation( GetJsonObject(Literal(json), Literal("$.store.book")), --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
