packages feed

postgrest 0.3.0.0 → 0.3.0.1

raw patch · 4 files changed

+14/−13 lines, 4 files

Files

postgrest.cabal view
@@ -2,7 +2,7 @@ description:           Reads the schema of a PostgreSQL database and creates RESTful routes                        for the tables and views, supporting all HTTP verbs that security                        permits.-version:               0.3.0.0+version:               0.3.0.1 synopsis:              REST API for any Postgres database license:               MIT license-file:          LICENSE
src/PostgREST/ApiRequest.hs view
@@ -20,6 +20,7 @@ import           PostgREST.Types         (QualifiedIdentifier (..),                                           Schema, Payload(..),                                           UniformObjects(..))+import           Data.Ranged.Ranges      (singletonRange)                                            type RequestBody = BL.ByteString @@ -114,7 +115,7 @@    ApiRequest {     iAction = action-  , iRange  = if singular then Nothing else rangeRequested hdrs+  , iRange  = if singular then Just (singletonRange 0) else rangeRequested hdrs   , iTarget = target   , iAccepts = pickContentType $ lookupHeader "accept"   , iPayload = relevantPayload
src/PostgREST/QueryBuilder.hs view
@@ -34,7 +34,6 @@  import           PostgREST.RangeQuery    (NonnegRange, rangeLimit, rangeOffset) import           Control.Error           (note, fromMaybe, mapMaybe)-import           Data.Maybe              (isNothing) import           Control.Monad           (join) import qualified Data.HashMap.Strict     as HM import           Data.List               (find)@@ -55,8 +54,6 @@                                          ) import           Prelude hiding          (unwords) -import           Data.Ranged.Ranges      (singletonRange)- type PStmt = H.Stmt P.Postgres instance Monoid PStmt where   mappend (B.Stmt query params prep) (B.Stmt query' params' prep') =@@ -74,7 +71,7 @@       if asCsv         then asCsvF         else if isSingle then asJsonSingleF else asJsonF-    ] selectStarF (if isNothing range && isSingle then Just $ singletonRange 0 else range)+    ] selectStarF range   ) V.empty True  createWriteStatement :: SqlQuery -> SqlQuery -> Bool -> Bool ->@@ -127,10 +124,9 @@     _ -> Left "unknown relation"   where     -- add parentTable and parentJoinConditions to the query-    updatedQuery = foldr (flip addCond) (query{from = parentTables ++ from query}) parentJoinConditions+    updatedQuery = foldr (flip addCond) query parentJoinConditions       where         parentJoinConditions = map (getJoinConditions . snd) parents-        parentTables = map fst parents         parents = mapMaybe (getParents . rootLabel) forest         getParents (_, (tbl, Just rel@(Relation{relType=Parent}))) = Just (tbl, rel)         getParents _ = Nothing@@ -198,14 +194,14 @@     qi = QualifiedIdentifier (tblSchema mainTbl) mainTbl     toQi t = QualifiedIdentifier (tblSchema t) t     query = unwords [-      ("WITH " <> intercalate ", " withs) `emptyOnNull` withs,+      ("WITH " <> intercalate ", " (map fst withs)) `emptyOnNull` withs,       "SELECT ", intercalate ", " (map (pgFmtSelectItem qi) colSelects ++ selects),-      "FROM ", intercalate ", " (map (fromQi . toQi) tbls),+      "FROM ", intercalate ", " (map (fromQi . toQi) tbls ++ map snd withs),       ("WHERE " <> intercalate " AND " ( map (pgFmtCondition qi ) conditions )) `emptyOnNull` conditions,       orderF (fromMaybe [] ord)       ]     (withs, selects) = foldr getQueryParts ([],[]) forest-    getQueryParts :: Tree ReadNode -> ([SqlFragment], [SqlFragment]) -> ([SqlFragment], [SqlFragment])+    getQueryParts :: Tree ReadNode -> ([(SqlFragment, Text)], [SqlFragment]) -> ([(SqlFragment,Text)], [SqlFragment])     getQueryParts (Node n@(_, (table, Just (Relation {relType=Child}))) forst) (w,s) = (w,sel:s)       where         sel = "("@@ -216,7 +212,7 @@     getQueryParts (Node n@(_, (table, Just (Relation {relType=Parent}))) forst) (w,s) = (wit:w,sel:s)       where         sel = "row_to_json(" <> table <> ".*) AS "<>table --TODO must be singular-        wit = table <> " AS ( " <> subquery <> " )"+        wit = (table <> " AS ( " <> subquery <> " )", table)           where subquery = requestToQuery schema (DbRead (Node n forst))     getQueryParts (Node n@(_, (table, Just (Relation {relType=Many}))) forst) (w,s) = (w,sel:s)       where@@ -331,7 +327,7 @@     Parent -> zipWith (toFilter tN ftN) cols fcs     Many   -> zipWith (toFilter tN ltN) cols (fromMaybe [] lc1) ++ zipWith (toFilter ftN ltN) fcs (fromMaybe [] lc2)   where-    s = tableSchema t+    s = if typ == Parent then "" else tableSchema t     tN = tableName t     ftN = tableName ft     ltN = fromMaybe "" (tableName <$> lt)
test/Feature/QuerySpec.hs view
@@ -198,6 +198,10 @@       get "/projects?id=eq.1&select=id, name, clients{*}, tasks{id, name}" `shouldRespondWith`         "[{\"id\":1,\"name\":\"Windows 7\",\"clients\":{\"id\":1,\"name\":\"Microsoft\"},\"tasks\":[{\"id\":1,\"name\":\"Design w7\"},{\"id\":2,\"name\":\"Code w7\"}]}]" +    it "requesting parents and filtering parent columns" $+      get "/projects?id=eq.1&select=id, name, clients{id}" `shouldRespondWith`+        "[{\"id\":1,\"name\":\"Windows 7\",\"clients\":{\"id\":1}}]"+     it "requesting children 2 levels" $       get "/clients?id=eq.1&select=id,projects{id,tasks{id}}" `shouldRespondWith`         "[{\"id\":1,\"projects\":[{\"id\":1,\"tasks\":[{\"id\":1},{\"id\":2}]},{\"id\":2,\"tasks\":[{\"id\":3},{\"id\":4}]}]}]"