@@ -1,181 +0,0 @@
10−module Squeal.PostgreSQL.QuerySpec where
13−import Generics.SOP hiding (from)
16−import Squeal.PostgreSQL
21− qry `queryRenders` str =
22− renderManipulation (queryStatement qry) `shouldBe` str
23− it "correctly renders a simple SELECT query" $ do
25− statement :: Query Tables '[] SumAndCol1
27− select ((#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
28− (from (Table (#table1 `As` #table1)) & where_ (#col1 .> #col2))
29− statement `queryRenders`
30− "SELECT (col1 + col2) AS sum, col1 AS col1\
31− \ FROM table1 AS table1 WHERE (col1 > col2);"
32− it "combines WHEREs using AND" $ do
34− statement :: Query Tables '[] SumAndCol1
36− select ((#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
37− (from (Table (#table1 `As` #table1)) & where_ true & where_ false)
38− statement `queryRenders`
39− "SELECT (col1 + col2) AS sum, col1 AS col1\
40− \ FROM table1 AS table1 WHERE (TRUE AND FALSE);"
41− it "performs sub SELECTs" $ do
43− statement :: Query Tables '[] SumAndCol1
45− selectStar (from (Subquery
46− (select ((#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
47− (from (Table (#table1 `As` #table1))) `As` #sub)))
48− statement `queryRenders`
50− \ (SELECT (col1 + col2) AS sum, col1 AS col1\
51− \ FROM table1 AS table1) AS sub;"
52− it "does LIMIT clauses" $ do
54− statement :: Query Tables '[] Columns
55− statement = selectStar (from (Table (#table1 `As` #table1)) & limit 1)
56− statement `queryRenders` "SELECT * FROM table1 AS table1 LIMIT 1;"
57− it "should use the minimum of given LIMITs" $ do
59− statement :: Query Tables '[] Columns
61− selectStar (from (Table (#table1 `As` #table1)) & limit 1 & limit 2)
62− statement `queryRenders` "SELECT * FROM table1 AS table1 LIMIT 1;"
63− it "should render parameters using $ signs" $ do
65− statement :: Query Tables '[ 'Required ('NotNull 'PGbool)] Columns
66− statement = selectStar
67− (from (Table (#table1 `As` #table1)) & where_ (param @1))
68− statement `queryRenders`
69− "SELECT * FROM table1 AS table1 WHERE ($1 :: bool);"
70− it "does OFFSET clauses" $ do
72− statement :: Query Tables '[] Columns
74− selectStar (from (Table (#table1 `As` #table1)) & offset 1)
75− statement `queryRenders` "SELECT * FROM table1 AS table1 OFFSET 1;"
76− it "should use the sum of given OFFSETs" $ do
78− statement :: Query Tables '[] Columns
79− statement = selectStar
80− (from (Table (#table1 `As` #table1)) & offset 1 & offset 2)
81− statement `queryRenders` "SELECT * FROM table1 AS table1 OFFSET 3;"
82− it "should render GROUP BY and HAVING clauses" $ do
84− statement :: Query Tables '[] SumAndCol1
86− select (sum_ #col2 `As` #sum :* #col1 `As` #col1 :* Nil)
87− ( from (Table (#table1 `As` #table1))
88− & group (By #col1 :* Nil)
89− & having (#col1 + sum_ #col2 .> 1) )
90− statement `queryRenders`
91− "SELECT sum(col2) AS sum, col1 AS col1\
92− \ FROM table1 AS table1\
94− \ HAVING ((col1 + sum(col2)) > 1);"
95− describe "JOINs" $ do
96− it "should render CROSS JOINs" $ do
98− statement :: Query JoinTables '[] ValueColumns
100− ( #orders ! #orderVal `As` #orderVal :*
101− #customers ! #customerVal `As` #customerVal :*
102− #shippers ! #shipperVal `As` #shipperVal :* Nil )
103− ( from (Table (#orders `As` #orders)
104− & CrossJoin (Table (#customers `As` #customers))
105− & CrossJoin (Table (#shippers `As` #shippers))) )
106− statement `queryRenders`
108− \ orders.orderVal AS orderVal,\
109− \ customers.customerVal AS customerVal,\
110− \ shippers.shipperVal AS shipperVal\
111− \ FROM orders AS orders\
112− \ CROSS JOIN customers AS customers\
113− \ CROSS JOIN shippers AS shippers;"
114− it "should render INNER JOINs" $ do
116− statement :: Query JoinTables '[] ValueColumns
118− ( (#orders ! #orderVal) `As` #orderVal
119− :* (#customers ! #customerVal) `As` #customerVal
120− :* (#shippers ! #shipperVal) `As` #shipperVal :* Nil)
121− ( from (Table (#orders `As` #orders)
122− & InnerJoin (Table (#customers `As` #customers))
123− ((#orders ! #customerID) .== (#customers ! #customerID))
124− & InnerJoin (Table (#shippers `As` #shippers))
125− ((#orders ! #shipperID) .== (#shippers ! #shipperID))))
126− statement `queryRenders`
128− \ orders.orderVal AS orderVal,\
129− \ customers.customerVal AS customerVal,\
130− \ shippers.shipperVal AS shipperVal\
131− \ FROM orders AS orders\
132− \ INNER JOIN customers AS customers\
133− \ ON (orders.customerID = customers.customerID)\
134− \ INNER JOIN shippers AS shippers\
135− \ ON (orders.shipperID = shippers.shipperID);"
136− it "should render self JOINs" $ do
138− statement :: Query JoinTables '[] OrderColumns
139− statement = selectDotStar #orders1
140− (from (Table (#orders `As` #orders1)
141− & CrossJoin (Table (#orders `As` #orders2))))
142− statement `queryRenders`
144− \ FROM orders AS orders1\
145− \ CROSS JOIN orders AS orders2;"
148− '[ "col1" ::: 'Required ('NotNull 'PGint4)
149− , "col2" ::: 'Required ('NotNull 'PGint4)
151−type Tables = '[ "table1" ::: Columns ]
153− '[ "sum" ::: 'Required ('NotNull 'PGint4)
154− , "col1" ::: 'Required ('NotNull 'PGint4)
156−type StudentsColumns = '["name" ::: 'Required ('NotNull 'PGtext)]
157−type StudentsTable = '["students" ::: StudentsColumns]
159− '[ "orderID" ::: 'Required ('NotNull 'PGint4)
160− , "orderVal" ::: 'Required ('NotNull 'PGtext)
161− , "customerID" ::: 'Required ('NotNull 'PGint4)
162− , "shipperID" ::: 'Required ('NotNull 'PGint4)
164−type CustomerColumns =
165− '[ "customerID" ::: 'Required ('NotNull 'PGint4)
166− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
168−type ShipperColumns =
169− '[ "shipperID" ::: 'Required ('NotNull 'PGint4)
170− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
173− '[ "orders" ::: OrderColumns
174− , "customers" ::: CustomerColumns
175− , "shippers" ::: ShipperColumns
178− '[ "orderVal" ::: 'Required ('NotNull 'PGtext)
179− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
180− , "shipperVal" ::: 'Required ('NotNull 'PGbool)