{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Database.Redis.ManualCommands.BF where
import Data.ByteString (ByteString)
import Data.List.NonEmpty (NonEmpty(..))
import qualified Data.List.NonEmpty as NE
import Database.Redis.Core
import Database.Redis.Types
import Database.Redis.Protocol
data BFInfo = BFInfo
{ BFInfo -> Integer
bfInfoCapacity :: Integer
, BFInfo -> Integer
bfInfoSize :: Integer
, BFInfo -> Integer
bfInfoFilters :: Integer
, BFInfo -> Integer
bfInfoItems :: Integer
, BFInfo -> Integer
bfInfoExpansion :: Integer
} deriving (Int -> BFInfo -> ShowS
[BFInfo] -> ShowS
BFInfo -> String
(Int -> BFInfo -> ShowS)
-> (BFInfo -> String) -> ([BFInfo] -> ShowS) -> Show BFInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BFInfo -> ShowS
showsPrec :: Int -> BFInfo -> ShowS
$cshow :: BFInfo -> String
show :: BFInfo -> String
$cshowList :: [BFInfo] -> ShowS
showList :: [BFInfo] -> ShowS
Show, BFInfo -> BFInfo -> Bool
(BFInfo -> BFInfo -> Bool)
-> (BFInfo -> BFInfo -> Bool) -> Eq BFInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BFInfo -> BFInfo -> Bool
== :: BFInfo -> BFInfo -> Bool
$c/= :: BFInfo -> BFInfo -> Bool
/= :: BFInfo -> BFInfo -> Bool
Eq)
instance RedisResult BFInfo where
decode :: Reply -> Either Reply BFInfo
decode Reply
r = do
fields <- Reply -> Either Reply [(ByteString, Integer)]
forall a. RedisResult a => Reply -> Either Reply a
decode Reply
r :: Either Reply [(ByteString, Integer)]
bfInfoCapacity <- decodeField "Capacity" fields
bfInfoSize <- decodeField "Size" fields
bfInfoFilters <- decodeField "Number of filters" fields
bfInfoItems <- decodeField "Number of items inserted" fields
bfInfoExpansion <- decodeField "Expansion rate" fields
pure BFInfo{..}
where
decodeField :: a -> [(a, b)] -> Either Reply b
decodeField a
key [(a, b)]
fields = Either Reply b
-> (b -> Either Reply b) -> Maybe b -> Either Reply b
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Reply -> Either Reply b
forall a b. a -> Either a b
Left Reply
r) b -> Either Reply b
forall a b. b -> Either a b
Right (a -> [(a, b)] -> Maybe b
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup a
key [(a, b)]
fields)
data BFReserveOpts = BFReserveOpts
{ BFReserveOpts -> Maybe Integer
bfReserveExpansion :: Maybe Integer
, BFReserveOpts -> Bool
bfReserveNonScaling :: Bool
} deriving (Int -> BFReserveOpts -> ShowS
[BFReserveOpts] -> ShowS
BFReserveOpts -> String
(Int -> BFReserveOpts -> ShowS)
-> (BFReserveOpts -> String)
-> ([BFReserveOpts] -> ShowS)
-> Show BFReserveOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BFReserveOpts -> ShowS
showsPrec :: Int -> BFReserveOpts -> ShowS
$cshow :: BFReserveOpts -> String
show :: BFReserveOpts -> String
$cshowList :: [BFReserveOpts] -> ShowS
showList :: [BFReserveOpts] -> ShowS
Show, BFReserveOpts -> BFReserveOpts -> Bool
(BFReserveOpts -> BFReserveOpts -> Bool)
-> (BFReserveOpts -> BFReserveOpts -> Bool) -> Eq BFReserveOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BFReserveOpts -> BFReserveOpts -> Bool
== :: BFReserveOpts -> BFReserveOpts -> Bool
$c/= :: BFReserveOpts -> BFReserveOpts -> Bool
/= :: BFReserveOpts -> BFReserveOpts -> Bool
Eq)
defaultBFReserveOpts :: BFReserveOpts
defaultBFReserveOpts :: BFReserveOpts
defaultBFReserveOpts = BFReserveOpts
{ bfReserveExpansion :: Maybe Integer
bfReserveExpansion = Maybe Integer
forall a. Maybe a
Nothing
, bfReserveNonScaling :: Bool
bfReserveNonScaling = Bool
False
}
data BFInsertOpts = BFInsertOpts
{ BFInsertOpts -> Maybe Integer
bfInsertCapacity :: Maybe Integer
, BFInsertOpts -> Maybe Double
bfInsertError :: Maybe Double
, BFInsertOpts -> Maybe Integer
bfInsertExpansion :: Maybe Integer
, BFInsertOpts -> Bool
bfInsertNoCreate :: Bool
, BFInsertOpts -> Bool
bfInsertNonScaling :: Bool
} deriving (Int -> BFInsertOpts -> ShowS
[BFInsertOpts] -> ShowS
BFInsertOpts -> String
(Int -> BFInsertOpts -> ShowS)
-> (BFInsertOpts -> String)
-> ([BFInsertOpts] -> ShowS)
-> Show BFInsertOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BFInsertOpts -> ShowS
showsPrec :: Int -> BFInsertOpts -> ShowS
$cshow :: BFInsertOpts -> String
show :: BFInsertOpts -> String
$cshowList :: [BFInsertOpts] -> ShowS
showList :: [BFInsertOpts] -> ShowS
Show, BFInsertOpts -> BFInsertOpts -> Bool
(BFInsertOpts -> BFInsertOpts -> Bool)
-> (BFInsertOpts -> BFInsertOpts -> Bool) -> Eq BFInsertOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BFInsertOpts -> BFInsertOpts -> Bool
== :: BFInsertOpts -> BFInsertOpts -> Bool
$c/= :: BFInsertOpts -> BFInsertOpts -> Bool
/= :: BFInsertOpts -> BFInsertOpts -> Bool
Eq)
defaultBFInsertOpts :: BFInsertOpts
defaultBFInsertOpts :: BFInsertOpts
defaultBFInsertOpts = BFInsertOpts
{ bfInsertCapacity :: Maybe Integer
bfInsertCapacity = Maybe Integer
forall a. Maybe a
Nothing
, bfInsertError :: Maybe Double
bfInsertError = Maybe Double
forall a. Maybe a
Nothing
, bfInsertExpansion :: Maybe Integer
bfInsertExpansion = Maybe Integer
forall a. Maybe a
Nothing
, bfInsertNoCreate :: Bool
bfInsertNoCreate = Bool
False
, bfInsertNonScaling :: Bool
bfInsertNonScaling = Bool
False
}
bfReserveOptsToArgs :: BFReserveOpts -> [ByteString]
bfReserveOptsToArgs :: BFReserveOpts -> [ByteString]
bfReserveOptsToArgs BFReserveOpts{Bool
Maybe Integer
bfReserveExpansion :: BFReserveOpts -> Maybe Integer
bfReserveNonScaling :: BFReserveOpts -> Bool
bfReserveExpansion :: Maybe Integer
bfReserveNonScaling :: Bool
..} =
[ByteString]
expansionArg [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ [ByteString]
nonScalingArg
where
expansionArg :: [ByteString]
expansionArg = [ByteString]
-> (Integer -> [ByteString]) -> Maybe Integer -> [ByteString]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Integer
expansion -> [ByteString
"EXPANSION", Integer -> ByteString
forall a. RedisArg a => a -> ByteString
encode Integer
expansion]) Maybe Integer
bfReserveExpansion
nonScalingArg :: [ByteString]
nonScalingArg = [ByteString
"NONSCALING" | Bool
bfReserveNonScaling]
bfInsertOptsToArgs :: BFInsertOpts -> [ByteString]
bfInsertOptsToArgs :: BFInsertOpts -> [ByteString]
bfInsertOptsToArgs BFInsertOpts{Bool
Maybe Double
Maybe Integer
bfInsertCapacity :: BFInsertOpts -> Maybe Integer
bfInsertError :: BFInsertOpts -> Maybe Double
bfInsertExpansion :: BFInsertOpts -> Maybe Integer
bfInsertNoCreate :: BFInsertOpts -> Bool
bfInsertNonScaling :: BFInsertOpts -> Bool
bfInsertCapacity :: Maybe Integer
bfInsertError :: Maybe Double
bfInsertExpansion :: Maybe Integer
bfInsertNoCreate :: Bool
bfInsertNonScaling :: Bool
..} =
[ByteString]
capacityArg [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ [ByteString]
errorArg [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ [ByteString]
expansionArg [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ [ByteString]
noCreateArg [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ [ByteString]
nonScalingArg
where
capacityArg :: [ByteString]
capacityArg = [ByteString]
-> (Integer -> [ByteString]) -> Maybe Integer -> [ByteString]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Integer
capacity -> [ByteString
"CAPACITY", Integer -> ByteString
forall a. RedisArg a => a -> ByteString
encode Integer
capacity]) Maybe Integer
bfInsertCapacity
errorArg :: [ByteString]
errorArg = [ByteString]
-> (Double -> [ByteString]) -> Maybe Double -> [ByteString]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Double
err -> [ByteString
"ERROR", Double -> ByteString
forall a. RedisArg a => a -> ByteString
encode Double
err]) Maybe Double
bfInsertError
expansionArg :: [ByteString]
expansionArg = [ByteString]
-> (Integer -> [ByteString]) -> Maybe Integer -> [ByteString]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Integer
expansion -> [ByteString
"EXPANSION", Integer -> ByteString
forall a. RedisArg a => a -> ByteString
encode Integer
expansion]) Maybe Integer
bfInsertExpansion
noCreateArg :: [ByteString]
noCreateArg = [ByteString
"NOCREATE" | Bool
bfInsertNoCreate]
nonScalingArg :: [ByteString]
nonScalingArg = [ByteString
"NONSCALING" | Bool
bfInsertNonScaling]
bfadd
:: (RedisCtx m f)
=> ByteString
-> ByteString
-> m (f Bool)
bfadd :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> ByteString -> m (f Bool)
bfadd ByteString
key ByteString
item = [ByteString] -> m (f Bool)
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.ADD", ByteString
key, ByteString
item]
bfcard
:: (RedisCtx m f)
=> ByteString
-> m (f Integer)
bfcard :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f Integer)
bfcard ByteString
key = [ByteString] -> m (f Integer)
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.CARD", ByteString
key]
bfexists
:: (RedisCtx m f)
=> ByteString
-> ByteString
-> m (f Bool)
bfexists :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> ByteString -> m (f Bool)
bfexists ByteString
key ByteString
item = [ByteString] -> m (f Bool)
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.EXISTS", ByteString
key, ByteString
item]
bfinfo
:: (RedisCtx m f)
=> ByteString
-> m (f BFInfo)
bfinfo :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f BFInfo)
bfinfo ByteString
key = [ByteString] -> m (f BFInfo)
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.INFO", ByteString
key]
bfinfoCapacity
:: (RedisCtx m f)
=> ByteString
-> m (f [Integer])
bfinfoCapacity :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f [Integer])
bfinfoCapacity ByteString
key = [ByteString] -> m (f [Integer])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.INFO", ByteString
key, ByteString
"CAPACITY"]
bfinfoSize
:: (RedisCtx m f)
=> ByteString
-> m (f [Integer])
bfinfoSize :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f [Integer])
bfinfoSize ByteString
key = [ByteString] -> m (f [Integer])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.INFO", ByteString
key, ByteString
"SIZE"]
bfinfoFilters
:: (RedisCtx m f)
=> ByteString
-> m (f [Integer])
bfinfoFilters :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f [Integer])
bfinfoFilters ByteString
key = [ByteString] -> m (f [Integer])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.INFO", ByteString
key, ByteString
"FILTERS"]
bfinfoItems
:: (RedisCtx m f)
=> ByteString
-> m (f [Integer])
bfinfoItems :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f [Integer])
bfinfoItems ByteString
key = [ByteString] -> m (f [Integer])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.INFO", ByteString
key, ByteString
"ITEMS"]
bfinfoExpansion
:: (RedisCtx m f)
=> ByteString
-> m (f [Maybe Integer])
bfinfoExpansion :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> m (f [Maybe Integer])
bfinfoExpansion ByteString
key = [ByteString] -> m (f [Maybe Integer])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest [ByteString
"BF.INFO", ByteString
key, ByteString
"EXPANSION"]
bfinsert
:: (RedisCtx m f)
=> ByteString
-> NonEmpty ByteString
-> m (f [Bool])
bfinsert :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> NonEmpty ByteString -> m (f [Bool])
bfinsert ByteString
key NonEmpty ByteString
items = ByteString -> NonEmpty ByteString -> BFInsertOpts -> m (f [Bool])
forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> NonEmpty ByteString -> BFInsertOpts -> m (f [Bool])
bfinsertOpts ByteString
key NonEmpty ByteString
items BFInsertOpts
defaultBFInsertOpts
bfinsertOpts
:: (RedisCtx m f)
=> ByteString
-> NonEmpty ByteString
-> BFInsertOpts
-> m (f [Bool])
bfinsertOpts :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> NonEmpty ByteString -> BFInsertOpts -> m (f [Bool])
bfinsertOpts ByteString
key NonEmpty ByteString
items BFInsertOpts
opts =
[ByteString] -> m (f [Bool])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest ([ByteString] -> m (f [Bool])) -> [ByteString] -> m (f [Bool])
forall a b. (a -> b) -> a -> b
$ [ByteString
"BF.INSERT", ByteString
key] [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ BFInsertOpts -> [ByteString]
bfInsertOptsToArgs BFInsertOpts
opts [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ [ByteString
"ITEMS"] [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ NonEmpty ByteString -> [ByteString]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty ByteString
items
bfmadd
:: (RedisCtx m f)
=> ByteString
-> NonEmpty ByteString
-> m (f [Bool])
bfmadd :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> NonEmpty ByteString -> m (f [Bool])
bfmadd ByteString
key NonEmpty ByteString
items = [ByteString] -> m (f [Bool])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest ([ByteString] -> m (f [Bool])) -> [ByteString] -> m (f [Bool])
forall a b. (a -> b) -> a -> b
$ [ByteString
"BF.MADD", ByteString
key] [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ NonEmpty ByteString -> [ByteString]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty ByteString
items
bfmexists
:: (RedisCtx m f)
=> ByteString
-> NonEmpty ByteString
-> m (f [Bool])
bfmexists :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> NonEmpty ByteString -> m (f [Bool])
bfmexists ByteString
key NonEmpty ByteString
items = [ByteString] -> m (f [Bool])
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest ([ByteString] -> m (f [Bool])) -> [ByteString] -> m (f [Bool])
forall a b. (a -> b) -> a -> b
$ [ByteString
"BF.MEXISTS", ByteString
key] [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ NonEmpty ByteString -> [ByteString]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty ByteString
items
bfreserve
:: (RedisCtx m f)
=> ByteString
-> Double
-> Integer
-> m (f Status)
bfreserve :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> Double -> Integer -> m (f Status)
bfreserve ByteString
key Double
errorRate Integer
capacity = ByteString -> Double -> Integer -> BFReserveOpts -> m (f Status)
forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> Double -> Integer -> BFReserveOpts -> m (f Status)
bfreserveOpts ByteString
key Double
errorRate Integer
capacity BFReserveOpts
defaultBFReserveOpts
bfreserveOpts
:: (RedisCtx m f)
=> ByteString
-> Double
-> Integer
-> BFReserveOpts
-> m (f Status)
bfreserveOpts :: forall (m :: * -> *) (f :: * -> *).
RedisCtx m f =>
ByteString -> Double -> Integer -> BFReserveOpts -> m (f Status)
bfreserveOpts ByteString
key Double
errorRate Integer
capacity BFReserveOpts
opts =
[ByteString] -> m (f Status)
forall (m :: * -> *) (f :: * -> *) a.
(RedisCtx m f, RedisResult a) =>
[ByteString] -> m (f a)
sendRequest ([ByteString] -> m (f Status)) -> [ByteString] -> m (f Status)
forall a b. (a -> b) -> a -> b
$ [ByteString
"BF.RESERVE", ByteString
key, Double -> ByteString
forall a. RedisArg a => a -> ByteString
encode Double
errorRate, Integer -> ByteString
forall a. RedisArg a => a -> ByteString
encode Integer
capacity] [ByteString] -> [ByteString] -> [ByteString]
forall a. [a] -> [a] -> [a]
++ BFReserveOpts -> [ByteString]
bfReserveOptsToArgs BFReserveOpts
opts