diff --git a/CHANGELOG.md b/CHANGELOG.md index d897b9f40..bef62c29a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased ### Fixed +- Correct order for -> and ->> in a json path - @ruslantalpa - Return empty array instead of 500 when a set returning function returns an empty result set - @diogob ## [0.2.12.0] - 2015-10-25 diff --git a/src/PostgREST/Parsers.hs b/src/PostgREST/Parsers.hs index 235962811..0892eba0b 100644 --- a/src/PostgREST/Parsers.hs +++ b/src/PostgREST/Parsers.hs @@ -18,6 +18,7 @@ import Data.Tree import Network.Wai (Request, pathInfo, queryString) import PostgREST.Types import Text.ParserCombinators.Parsec hiding (many, (<|>)) + parseGetRequest :: Request -> Either ParseError ApiRequest parseGetRequest httpRequest = foldr addFilter <$> (addOrder <$> apiRequest <*> ord) <*> flts @@ -77,7 +78,7 @@ lexeme p = ws *> p <* ws pTreePath :: Parser (Path,Field) pTreePath = do p <- pFieldName `sepBy1` pDelimiter - jp <- optionMaybe ( string "->" >> pJsonPath) + jp <- optionMaybe pJsonPath let pp = map cs p jpp = map cs <$> jp return (init pp, (last pp, jpp)) @@ -98,14 +99,14 @@ pFieldName :: Parser Text pFieldName = cs <$> (many1 (letter <|> digit <|> oneOf "_") "field name (* or [a..z0..9_])") -pJsonPathDelimiter :: Parser Text -pJsonPathDelimiter = cs <$> (try (string "->>") <|> string "->") +pJsonPathStep :: Parser Text +pJsonPathStep = cs <$> try (string "->" *> pFieldName) pJsonPath :: Parser [Text] -pJsonPath = pFieldName `sepBy1` pJsonPathDelimiter +pJsonPath = (++) <$> many pJsonPathStep <*> ( (:[]) <$> (string "->>" *> pFieldName) ) pField :: Parser Field -pField = lexeme $ (,) <$> pFieldName <*> optionMaybe ( pJsonPathDelimiter *> pJsonPath) +pField = lexeme $ (,) <$> pFieldName <*> optionMaybe pJsonPath pSelect :: Parser SelectItem pSelect = lexeme $ diff --git a/test/Feature/QuerySpec.hs b/test/Feature/QuerySpec.hs index 50f21361b..b35ca639c 100644 --- a/test/Feature/QuerySpec.hs +++ b/test/Feature/QuerySpec.hs @@ -302,8 +302,7 @@ spec = it "can filter by properties inside json column using not" $ get "/json?data->foo->>bar=not.eq.baz" `shouldRespondWith` [json| [] |] - it "can filter by properties inside json column using ->>" $ do - pendingWith "see issue #334" + it "can filter by properties inside json column using ->>" $ get "/json?data->>id=eq.1" `shouldRespondWith` [json| [{"data": {"id": 1, "foo": {"bar": "baz"}}}] |]