diff --git a/src/PostgREST/Parsers.hs b/src/PostgREST/Parsers.hs index 933b6d970..d58a46d0b 100644 --- a/src/PostgREST/Parsers.hs +++ b/src/PostgREST/Parsers.hs @@ -101,8 +101,12 @@ pOrderTerm = try ( do c <- pFieldName _ <- pDelimiter - d <- string "asc" <|> string "desc" - nls <- optionMaybe (pDelimiter *> ( try(string "nullslast" *> pure ("nulls last"::String)) <|> try(string "nullsfirst" *> pure ("nulls first"::String)))) - return $ OrderTerm (cs c) (cs d) (cs <$> nls) + d <- (string "asc" *> pure OrderAsc) + <|> (string "desc" *> pure OrderDesc) + nls <- optionMaybe (pDelimiter *> ( + try(string "nullslast" *> pure OrderNullsLast) + <|> try(string "nullsfirst" *> pure OrderNullsFirst) + )) + return $ OrderTerm c d nls ) - <|> OrderTerm <$> (cs <$> pFieldName) <*> pure "asc" <*> pure Nothing + <|> OrderTerm <$> (cs <$> pFieldName) <*> pure OrderAsc <*> pure Nothing diff --git a/src/PostgREST/QueryBuilder.hs b/src/PostgREST/QueryBuilder.hs index 2e2a4e0db..f2a56d135 100644 --- a/src/PostgREST/QueryBuilder.hs +++ b/src/PostgREST/QueryBuilder.hs @@ -321,8 +321,20 @@ orderF ts = queryTerm :: OrderTerm -> Text queryTerm t = " " <> cs (pgFmtIdent $ otTerm t) <> " " - <> cs (otDirection t) <> " " - <> maybe "" cs (otNullOrder t) <> " " + <> sqlOrderDirection (otDirection t) <> " " + <> maybe "" sqlOrderNulls (otNullOrder t) <> " " + +sqlOrderDirection :: OrderDirection -> SqlFragment +sqlOrderDirection d = + case d of + OrderDesc -> "desc" + OrderAsc -> "asc" + +sqlOrderNulls :: OrderNulls -> SqlFragment +sqlOrderNulls d = + case d of + OrderNullsFirst -> "nulls first" + OrderNullsLast -> "nulls last" insertableValue :: JSON.Value -> SqlFragment insertableValue JSON.Null = "null" diff --git a/src/PostgREST/Types.hs b/src/PostgREST/Types.hs index 795c87e32..02243c20a 100644 --- a/src/PostgREST/Types.hs +++ b/src/PostgREST/Types.hs @@ -1,8 +1,7 @@ module PostgREST.Types where import Data.Text import Data.Tree -import qualified Data.ByteString.Char8 as BS -import qualified Data.ByteString.Lazy as BL +import qualified Data.ByteString.Lazy as BL import Data.Aeson import Data.Map @@ -51,10 +50,13 @@ data PrimaryKey = PrimaryKey { , pkName :: Text } deriving (Show, Eq) +data OrderDirection = OrderAsc | OrderDesc deriving (Show, Eq) +data OrderNulls = OrderNullsFirst | OrderNullsLast deriving (Show, Eq) + data OrderTerm = OrderTerm { otTerm :: Text -, otDirection :: BS.ByteString -, otNullOrder :: Maybe BS.ByteString +, otDirection :: OrderDirection +, otNullOrder :: Maybe OrderNulls } deriving (Show, Eq) data QualifiedIdentifier = QualifiedIdentifier {