File tree Expand file tree Collapse file tree 5 files changed +346
-109
lines changed
src/Database/LSMTree/Internal
test/Test/Database/LSMTree/Internal Expand file tree Collapse file tree 5 files changed +346
-109
lines changed Original file line number Diff line number Diff line change @@ -470,7 +470,9 @@ combine new_ old = case new_ of
470
470
--
471
471
-- See 'MergeUnion'.
472
472
combineUnion :: Op -> Op -> Op
473
+ combineUnion Delete (Mupsert v) = Insert v Nothing
473
474
combineUnion Delete old = old
475
+ combineUnion (Mupsert u) Delete = Insert u Nothing
474
476
combineUnion new_ Delete = new_
475
477
combineUnion (Mupsert v') (Mupsert v ) = Insert (resolveValue v' v) Nothing
476
478
combineUnion (Mupsert v') (Insert v _) = Insert (resolveValue v' v) Nothing
Original file line number Diff line number Diff line change @@ -549,7 +549,7 @@ instance Arbitrary (Unsliced SerialisedKey) where
549
549
550
550
instance Arbitrary BlobSpan where
551
551
arbitrary = BlobSpan <$> arbitrary <*> arbitrary
552
- shrink (BlobSpan x y) = BlobSpan <$> shrink x <*> shrink y
552
+ shrink (BlobSpan x y) = [ BlobSpan x' y' | (x', y') <- shrink (x, y) ]
553
553
554
554
{- ------------------------------------------------------------------------------
555
555
Merge
Original file line number Diff line number Diff line change @@ -92,12 +92,11 @@ unNumEntries (NumEntries x) = x
92
92
Value resolution/merging
93
93
-------------------------------------------------------------------------------}
94
94
95
- -- | As long as values are a semigroup, an Entry is too
96
- instance Semigroup v => Semigroup (Entry v b ) where
97
- e1 <> e2 = combine (<>) e1 e2
98
-
99
95
-- | Given a value-merge function, combine entries. Only take a blob from the
100
96
-- left entry.
97
+ --
98
+ -- Note: 'Entry' is a semigroup with 'combine' if the @(v -> v -> v)@ argument
99
+ -- is associative.
101
100
combine :: (v -> v -> v ) -> Entry v b -> Entry v b -> Entry v b
102
101
combine _ e@ Delete _ = e
103
102
combine _ e@ Insert {} _ = e
@@ -111,10 +110,15 @@ combine f (Mupdate u) (Mupdate v) = Mupdate (f u v)
111
110
-- has a value, the result should have a value (represented by 'Insert'). If
112
111
-- both have a value, these values get combined monoidally. Only take a blob
113
112
-- from the left entry.
113
+ --
114
+ -- Note: 'Entry' is a semigroup with 'combineUnion' if the @(v -> v -> v)@
115
+ -- argument is associative.
114
116
combineUnion :: (v -> v -> v ) -> Entry v b -> Entry v b -> Entry v b
115
117
combineUnion f = go
116
118
where
119
+ go Delete (Mupdate v) = Insert v
117
120
go Delete e = e
121
+ go (Mupdate u) Delete = Insert u
118
122
go e Delete = e
119
123
go (Insert u) (Insert v) = Insert (f u v)
120
124
go (Insert u) (InsertWithBlob v _) = Insert (f u v)
You can’t perform that action at this time.
0 commit comments