Skip to content

Commit d2d60a2

Browse files
authored
Merge pull request #486 from IntersectMBO/jdral/unified-class-tests
Unify class-based tests
2 parents 645248e + 0dec722 commit d2d60a2

File tree

18 files changed

+191
-1524
lines changed

18 files changed

+191
-1524
lines changed

lsm-tree.cabal

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -345,17 +345,12 @@ test-suite lsm-tree-test
345345
other-modules:
346346
Database.LSMTree.Class
347347
Database.LSMTree.Class.Common
348-
Database.LSMTree.Class.Monoidal
349-
Database.LSMTree.Class.Normal
350348
Database.LSMTree.Model
351349
Database.LSMTree.Model.IO
352-
Database.LSMTree.Model.IO.Monoidal
353-
Database.LSMTree.Model.IO.Normal
354350
Database.LSMTree.Model.Session
355351
Database.LSMTree.Model.Table
356352
Test.Data.Arena
357-
Test.Database.LSMTree.Class.Monoidal
358-
Test.Database.LSMTree.Class.Normal
353+
Test.Database.LSMTree.Class
359354
Test.Database.LSMTree.Generators
360355
Test.Database.LSMTree.Internal
361356
Test.Database.LSMTree.Internal.BloomFilter

src-control/Control/Concurrent/Class/MonadSTM/RWVar.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ unsafeAcquireWriteAccess rw@(RWVar !var) = do
117117

118118
{-# SPECIALISE unsafeReleaseWriteAccess :: RWVar IO a -> a -> STM IO () #-}
119119
unsafeReleaseWriteAccess :: MonadSTM m => RWVar m a -> a -> STM m ()
120-
unsafeReleaseWriteAccess (RWVar !var) x = do
120+
unsafeReleaseWriteAccess (RWVar !var) !x = do
121121
readTVar var >>= \case
122122
Reading _ _ -> error "releasing a writer without write access (Reading)"
123123
WaitingToWrite _ _ -> error "releasing a writer without write access (WaitingToWrite)"

src-extras/Database/LSMTree/Extras/NoThunks.hs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -548,28 +548,19 @@ instance (NoThunks a, Typeable s, Typeable a) => NoThunks (MutableHeap s a) wher
548548
-- Some constraints, like @NoThunks (MutVar s a)@ and @NoThunks (StrictTVar m
549549
-- a)@, can not be satisfied for arbitrary @m@\/@s@, and must be instantiated
550550
-- for a concrete @m@\/@s@, like @IO@\/@RealWorld@.
551-
class ( forall a. NoThunks a => NoThunks (StrictTVar m a)
551+
class ( forall a. (NoThunks a, Typeable a) => NoThunks (StrictTVar m a)
552552
, forall a. (NoThunks a, Typeable a) => NoThunks (StrictMVar m a)
553553
) => NoThunksIOLike' m s
554554

555555
instance NoThunksIOLike' IO RealWorld
556556

557557
type NoThunksIOLike m = NoThunksIOLike' m (PrimState m)
558558

559-
-- TODO: on ghc-9.4, a check on StrictTVar IO (RWState (TableContent IO h))
560-
-- fails, but we have not yet found out why so we simply disable NoThunks checks
561-
-- for StrictTVars on ghc-9.4
562-
instance NoThunks a => NoThunks (StrictTVar IO a) where
563-
showTypeOf (_ :: Proxy (StrictTVar IO a)) = "StrictTVar IO"
559+
instance (NoThunks a, Typeable a) => NoThunks (StrictTVar IO a) where
560+
showTypeOf (p :: Proxy (StrictTVar IO a)) = show $ typeRep p
564561
wNoThunks _ctx _var = do
565-
#if defined(MIN_VERSION_GLASGOW_HASKELL)
566-
#if MIN_VERSION_GLASGOW_HASKELL(9,4,0,0) && !MIN_VERSION_GLASGOW_HASKELL(9,6,0,0)
567-
pure Nothing
568-
#else
569562
x <- readTVarIO _var
570563
noThunks _ctx x
571-
#endif
572-
#endif
573564

574565
-- TODO: in some cases, strict-mvar functions leave thunks behind, in particular
575566
-- modifyMVarMasked and modifyMVarMasked_. So in some specific cases we evaluate

src/Database/LSMTree/Monoidal.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ lookups (Internal.MonoidalTable t) ks =
241241
where
242242
toLookupResult (Just e) = case e of
243243
Entry.Insert v -> Found (Internal.deserialiseValue v)
244-
Entry.InsertWithBlob _ _ -> error "Monoidal.lookups: unexpected InsertWithBlob"
244+
Entry.InsertWithBlob v _ -> Found (Internal.deserialiseValue v)
245245
Entry.Mupdate v -> Found (Internal.deserialiseValue v)
246246
Entry.Delete -> NotFound
247247
toLookupResult Nothing = NotFound

src/Database/LSMTree/Normal.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ lookups (Internal.NormalTable t) ks =
332332
Entry.Insert v -> Found (Internal.deserialiseValue v)
333333
Entry.InsertWithBlob v br -> FoundWithBlob (Internal.deserialiseValue v)
334334
(BlobRef br)
335-
Entry.Mupdate _ -> error "Normal.lookups: unexpected Mupdate"
335+
Entry.Mupdate v -> Found (Internal.deserialiseValue v)
336336
Entry.Delete -> NotFound
337337
toLookupResult Nothing = NotFound
338338

test/Database/LSMTree/Class.hs

Lines changed: 16 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Database.LSMTree.Class (
77
, withTableNew
88
, withTableFromSnapshot
99
, withTableDuplicate
10+
, withTableUnion
1011
, withCursor
1112
, module Common
1213
, module Types
@@ -17,7 +18,8 @@ import Data.Kind (Constraint, Type)
1718
import Data.Typeable (Proxy (..))
1819
import qualified Data.Vector as V
1920
import Database.LSMTree as Types (LookupResult (..), QueryResult (..),
20-
ResolveValue, Update (..))
21+
ResolveAsFirst (..), ResolveValue (..), Update (..),
22+
resolveDeserialised)
2123
import qualified Database.LSMTree as R
2224
import Database.LSMTree.Class.Common as Common
2325

@@ -47,9 +49,6 @@ class (IsSession (Session h)) => IsTable h where
4749

4850
lookups ::
4951
( IOLike m
50-
, SerialiseKey k
51-
, SerialiseValue v
52-
, ResolveValue v
5352
, C k v b
5453
)
5554
=> h m k v b
@@ -58,9 +57,6 @@ class (IsSession (Session h)) => IsTable h where
5857

5958
rangeLookup ::
6059
( IOLike m
61-
, SerialiseKey k
62-
, SerialiseValue v
63-
, ResolveValue v
6460
, C k v b
6561
)
6662
=> h m k v b
@@ -69,7 +65,6 @@ class (IsSession (Session h)) => IsTable h where
6965

7066
newCursor ::
7167
( IOLike m
72-
, SerialiseKey k
7368
, C k v b
7469
)
7570
=> Maybe k
@@ -86,9 +81,6 @@ class (IsSession (Session h)) => IsTable h where
8681

8782
readCursor ::
8883
( IOLike m
89-
, SerialiseKey k
90-
, SerialiseValue v
91-
, ResolveValue v
9284
, C k v b
9385
)
9486
=> proxy h
@@ -98,8 +90,7 @@ class (IsSession (Session h)) => IsTable h where
9890

9991
retrieveBlobs ::
10092
( IOLike m
101-
, SerialiseValue b
102-
, C_ b
93+
, CB b
10394
)
10495
=> proxy h
10596
-> Session h m
@@ -108,10 +99,6 @@ class (IsSession (Session h)) => IsTable h where
10899

109100
updates ::
110101
( IOLike m
111-
, SerialiseKey k
112-
, SerialiseValue v
113-
, SerialiseValue b
114-
, ResolveValue v
115102
, C k v b
116103
)
117104
=> h m k v b
@@ -120,10 +107,6 @@ class (IsSession (Session h)) => IsTable h where
120107

121108
inserts ::
122109
( IOLike m
123-
, SerialiseKey k
124-
, SerialiseValue v
125-
, SerialiseValue b
126-
, ResolveValue v
127110
, C k v b
128111
)
129112
=> h m k v b
@@ -132,10 +115,6 @@ class (IsSession (Session h)) => IsTable h where
132115

133116
deletes ::
134117
( IOLike m
135-
, SerialiseKey k
136-
, SerialiseValue v
137-
, SerialiseValue b
138-
, ResolveValue v
139118
, C k v b
140119
)
141120
=> h m k v b
@@ -144,10 +123,6 @@ class (IsSession (Session h)) => IsTable h where
144123

145124
mupserts ::
146125
( IOLike m
147-
, SerialiseKey k
148-
, SerialiseValue v
149-
, SerialiseValue b
150-
, ResolveValue v
151126
, C k v b
152127
)
153128
=> h m k v b
@@ -156,10 +131,6 @@ class (IsSession (Session h)) => IsTable h where
156131

157132
createSnapshot ::
158133
( IOLike m
159-
, SerialiseKey k
160-
, SerialiseValue v
161-
, SerialiseValue b
162-
, ResolveValue v
163134
, C k v b
164135
)
165136
=> SnapshotLabel
@@ -169,10 +140,6 @@ class (IsSession (Session h)) => IsTable h where
169140

170141
openSnapshot ::
171142
( IOLike m
172-
, SerialiseKey k
173-
, SerialiseValue v
174-
, ResolveValue v
175-
, SerialiseValue b
176143
, C k v b
177144
)
178145
=> Session h m
@@ -189,30 +156,22 @@ class (IsSession (Session h)) => IsTable h where
189156

190157
union ::
191158
( IOLike m
192-
, ResolveValue v
193-
, SerialiseValue v
194159
, C k v b
195160
)
196161
=> h m k v b
197162
-> h m k v b
198163
-> m (h m k v b)
199164

200165
withTableNew :: forall h m k v b a.
201-
( IOLike m
202-
, IsTable h
203-
, C k v b
204-
)
166+
(IOLike m, IsTable h, C k v b)
205167
=> Session h m
206168
-> TableConfig h
207169
-> (h m k v b -> m a)
208170
-> m a
209171
withTableNew sesh conf = bracket (new sesh conf) close
210172

211173
withTableFromSnapshot :: forall h m k v b a.
212-
( IOLike m, IsTable h
213-
, SerialiseKey k, SerialiseValue v, SerialiseValue b, ResolveValue v
214-
, C k v b
215-
)
174+
(IOLike m, IsTable h, C k v b)
216175
=> Session h m
217176
-> SnapshotLabel
218177
-> SnapshotName
@@ -221,21 +180,22 @@ withTableFromSnapshot :: forall h m k v b a.
221180
withTableFromSnapshot sesh label snap = bracket (openSnapshot sesh label snap) close
222181

223182
withTableDuplicate :: forall h m k v b a.
224-
( IOLike m
225-
, IsTable h
226-
, C k v b
227-
)
183+
(IOLike m, IsTable h, C k v b)
228184
=> h m k v b
229185
-> (h m k v b -> m a)
230186
-> m a
231187
withTableDuplicate table = bracket (duplicate table) close
232188

189+
withTableUnion :: forall h m k v b a.
190+
(IOLike m, IsTable h, C k v b)
191+
=> h m k v b
192+
-> h m k v b
193+
-> (h m k v b -> m a)
194+
-> m a
195+
withTableUnion table1 table2 = bracket (table1 `union` table2) close
196+
233197
withCursor :: forall h m k v b a.
234-
( IOLike m
235-
, IsTable h
236-
, SerialiseKey k
237-
, C k v b
238-
)
198+
(IOLike m, IsTable h, C k v b)
239199
=> Maybe k
240200
-> h m k v b
241201
-> (Cursor h m k v b -> m a)

test/Database/LSMTree/Class/Common.hs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
{-# LANGUAGE TypeFamilies #-}
22

33
module Database.LSMTree.Class.Common (
4-
C
5-
, C_
4+
C, CK, CV, CB, C_
65
, IsSession (..)
76
, SessionArgs (..)
87
, withSession
@@ -13,17 +12,37 @@ import Control.Monad.Class.MonadThrow (MonadThrow (..))
1312
import Control.Tracer (nullTracer)
1413
import Data.Kind (Constraint, Type)
1514
import Data.Typeable (Typeable)
15+
import Database.LSMTree (ResolveValue)
1616
import Database.LSMTree.Common as Types (IOLike, Range (..),
1717
SerialiseKey, SerialiseValue, SnapshotLabel (..),
1818
SnapshotName)
1919
import qualified Database.LSMTree.Common as R
2020
import System.FS.API (FsPath, HasFS)
2121
import System.FS.BlockIO.API (HasBlockIO)
2222

23-
-- | Model-specific constraints
24-
type C k v b = (C_ k, C_ v, C_ b)
23+
{-------------------------------------------------------------------------------
24+
Constraints
25+
-------------------------------------------------------------------------------}
26+
27+
-- | Constraints for keys, values, and blobs
28+
type C k v b = (CK k, CV v, CB b)
29+
30+
-- | Constaints for keys
31+
type CK k = (C_ k, SerialiseKey k)
32+
33+
-- | Constraints for values
34+
type CV v = (C_ v, SerialiseValue v, ResolveValue v)
35+
36+
-- | Constraints for blobs
37+
type CB b = (C_ b, SerialiseValue b)
38+
39+
-- | Model-specific constraints for keys, values, and blobs
2540
type C_ a = (Show a, Eq a, Typeable a)
2641

42+
{-------------------------------------------------------------------------------
43+
Session
44+
-------------------------------------------------------------------------------}
45+
2746
-- | Class abstracting over session operations.
2847
--
2948
type IsSession :: ((Type -> Type) -> Type) -> Constraint

0 commit comments

Comments
 (0)