Skip to content

Commit cc02b3f

Browse files
authored
Merge pull request #178 from well-typed/optional-rdp
Make record-dot-preprocessor functionality optional (manual flag)
2 parents 5d91e9c + dcf75af commit cc02b3f

File tree

10 files changed

+186
-292
lines changed

10 files changed

+186
-292
lines changed

.github/workflows/haskell-ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ jobs:
238238
if [ $((HCNUMVER >= 90000 && HCNUMVER < 91000)) -ne 0 ] ; then echo "package beam-large-records" >> cabal.project ; fi
239239
if [ $((HCNUMVER >= 90000 && HCNUMVER < 91000)) -ne 0 ] ; then echo " ghc-options: -Werror=incomplete-patterns -Werror=incomplete-uni-patterns" >> cabal.project ; fi
240240
cat >> cabal.project <<EOF
241+
constraints: large-records -rdp
242+
241243
package typelet
242244
ghc-options: -Werror
243245

beam-large-records/beam-large-records.cabal

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ test-suite test-beam-large-records
8181
, beam-large-records
8282
, beam-sqlite
8383
, large-records
84-
, microlens
8584
, record-hasfield
8685
, sqlite-simple
8786
, tasty

beam-large-records/test/Test/Record/Beam/SimpleSQL.hs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
{-# LANGUAGE TypeFamilies #-}
1515
{-# LANGUAGE TypeOperators #-}
1616
{-# LANGUAGE UndecidableInstances #-}
17+
{-# LANGUAGE OverloadedLabels #-}
1718

18-
{-# OPTIONS_GHC -fplugin=Data.Record.Plugin.WithRDP #-}
19+
{-# OPTIONS_GHC -fplugin=Data.Record.Plugin #-}
1920

2021
-- | Simple but complete example that does an SQL INSERT and SELECT
2122
module Test.Record.Beam.SimpleSQL (
@@ -29,6 +30,7 @@ import Data.Int
2930
import Data.Kind
3031
import Data.Text (Text)
3132
import Database.Beam
33+
import Optics.Core ((^.))
3234

3335
import qualified Database.SQLite.Simple as SQLite
3436
import qualified GHC.Generics as GHC
@@ -61,7 +63,7 @@ instance Table LargeTable where
6163
deriving stock (GHC.Generic)
6264
deriving anyclass (Beamable)
6365

64-
primaryKey tbl = LargeTableKey tbl.largeTableId
66+
primaryKey tbl = LargeTableKey (tbl ^. #largeTableId)
6567

6668
{-------------------------------------------------------------------------------
6769
The full database
@@ -93,12 +95,12 @@ test_insert_select = runInMemory $ \conn -> do
9395
"CREATE TABLE db_large_table (table_id INT PRIMARY KEY NOT NULL, table_field VARCHAR NOT NULL);"
9496

9597
runInsert $
96-
insert exampleDb.exampleDbLargeTable $ insertValues [
98+
insert (exampleDb ^. #exampleDbLargeTable) $ insertValues [
9799
large1
98100
, large2
99101
]
100102

101103
allLarge <- runSelectReturningList $ select $
102-
orderBy_ (\x -> asc_ (x.largeTableId)) $ all_ exampleDb.exampleDbLargeTable
104+
orderBy_ (\x -> asc_ (x ^. #largeTableId)) $ all_ (exampleDb ^. #exampleDbLargeTable)
103105
liftIO $ assertEqual "allLarge" allLarge [large1, large2]
104106

beam-large-records/test/Test/Record/Beam/Tutorial1.hs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
{-# LANGUAGE TypeFamilies #-}
1616
{-# LANGUAGE TypeOperators #-}
1717
{-# LANGUAGE UndecidableInstances #-}
18+
{-# LANGUAGE OverloadedLabels #-}
1819

19-
{-# OPTIONS_GHC -fplugin=Data.Record.Plugin.WithRDP #-}
20+
{-# OPTIONS_GHC -fplugin=Data.Record.Plugin #-}
2021

2122
module Test.Record.Beam.Tutorial1 (
2223
tests
@@ -35,6 +36,7 @@ import Data.Record.Beam ()
3536
import Data.Text (Text)
3637
import Database.Beam hiding (Generic, countAll_)
3738
import Database.Beam.Schema.Tables
39+
import Optics.Core ((^.))
3840

3941
import qualified Data.List.NonEmpty as NE
4042
import qualified Database.SQLite.Simple as SQLite
@@ -79,11 +81,11 @@ sam2 = User "[email protected]" "Sam" "Sophitz" "332532dcfaa1cbf61e2a266bd723
7981
sam3 = User "[email protected]" "Sam" "Jely" "332532dcfaa1cbf61e2a266bd723612c"
8082

8183
instance Table UserT where
82-
data PrimaryKey UserT f = UserId (Columnar f Text)
84+
newtype PrimaryKey UserT f = UserId (Columnar f Text)
8385
deriving stock (GHC.Generic)
8486
deriving anyclass (Beamable)
8587

86-
primaryKey tbl = UserId tbl.userEmail
88+
primaryKey tbl = UserId (tbl ^. #userEmail)
8789

8890
deriving instance Show (Columnar f Text) => Show (PrimaryKey UserT f)
8991
deriving instance Eq (Columnar f Text) => Eq (PrimaryKey UserT f)
@@ -153,51 +155,51 @@ test_tutorial1_insertSelect = runInMemory $ \conn -> do
153155
liftIO $ SQLite.execute_ conn $
154156
"CREATE TABLE cart_users (email VARCHAR NOT NULL, first_name VARCHAR NOT NULL, last_name VARCHAR NOT NULL, password VARCHAR NOT NULL, PRIMARY KEY( email ));"
155157

156-
runInsert $ insert shoppingCartDb.shoppingCartUsers $ insertValues [
158+
runInsert $ insert (shoppingCartDb ^. #shoppingCartUsers) $ insertValues [
157159
james
158160
, betty
159161
, sam
160162
]
161163

162-
let allUsers = all_ (shoppingCartDb.shoppingCartUsers)
164+
let allUsers = all_ (shoppingCartDb ^. #shoppingCartUsers)
163165
users <- runSelectReturningList $ select allUsers
164166
liftIO $ assertEqual "users" [james, betty, sam] users
165167

166-
let sortUsersByFirstName = orderBy_ (\u -> (asc_ u.userFirstName, desc_ u.userLastName)) (all_ shoppingCartDb.shoppingCartUsers)
168+
let sortUsersByFirstName = orderBy_ (\u -> (asc_ $ u ^. #userFirstName, desc_ $ u ^. #userLastName)) (all_ $ shoppingCartDb ^. #shoppingCartUsers)
167169
sorted <- runSelectReturningList $ select sortUsersByFirstName
168170
liftIO $ assertEqual "sorted" [betty, james, sam] sorted
169171

170172
let boundedQuery = limit_ 1 $ offset_ 1 $
171-
orderBy_ (\u -> asc_ u.userFirstName) $
172-
all_ shoppingCartDb.shoppingCartUsers
173+
orderBy_ (\u -> asc_ (u ^. #userFirstName)) $
174+
all_ (shoppingCartDb ^. #shoppingCartUsers)
173175

174176
bounded <- runSelectReturningList (select boundedQuery)
175177
liftIO $ assertEqual "bounded" [james] bounded
176178

177179
-- Tutorial has Int32 here, but that doesn't typecheck
178180
-- Don't think that is related to beam-large-records though..?
179181
-- (Maybe due to beam version mismatch between tutorial and our beam branch.)
180-
let userCount = aggregate_ (\_u -> as_ @Int32 countAll_) (all_ shoppingCartDb.shoppingCartUsers)
182+
let userCount = aggregate_ (\_u -> as_ @Int32 countAll_) (all_ (shoppingCartDb ^. #shoppingCartUsers))
181183
Just c <- runSelectReturningOne $ select userCount
182184
liftIO $ assertEqual "userCount" 3 c
183185

184-
runInsert $ insert shoppingCartDb.shoppingCartUsers $ insertValues [
186+
runInsert $ insert (shoppingCartDb ^. #shoppingCartUsers) $ insertValues [
185187
james2
186188
, betty2
187189
, james3
188190
, sam2
189191
, sam3
190192
]
191-
let numberOfUsersByName = aggregate_ (\u -> (group_ u.userFirstName, as_ @Int32 countAll_)) $
192-
all_ shoppingCartDb.shoppingCartUsers
193+
let numberOfUsersByName = aggregate_ (\u -> (group_ (u ^. #userFirstName), as_ @Int32 countAll_)) $
194+
all_ (shoppingCartDb ^. #shoppingCartUsers)
193195
countedByName <- runSelectReturningList $ select numberOfUsersByName
194196
liftIO $ assertEqual "countedByName" [("Betty",2), ("James",3), ("Sam",3)] countedByName
195197

196198
-- Just a sanity check that RDS is working
197199
-- (NOTE: RDS gets confused by nested multiline comments.)
198200
test_tutorial1_recordDotSyntax :: Assertion
199201
test_tutorial1_recordDotSyntax =
200-
assertEqual "" "[email protected]" u.userEmail
202+
assertEqual "" "[email protected]" (u ^. #userEmail)
201203
where
202204
u :: User
203205
u = User {

0 commit comments

Comments
 (0)