packages feed

leveldb-haskell-0.1.1: examples/filterpolicy.hs

{-# LANGUAGE OverloadedStrings #-}

-- | Demo filter policy / bloom filter

module Main where

import Control.Monad.IO.Class (liftIO)
import Data.BloomFilter
import Data.BloomFilter.Easy  (easyList)
import Data.BloomFilter.Hash  (cheapHashes)
import Data.ByteString.Char8  (take)
import Data.Default

import Database.LevelDB

import qualified Data.Serialize as S


builtinBloom :: IO ()
builtinBloom = runResourceT $ do
    bloom <- bloomFilter 10
    db <- open "/tmp/lvlbloomtest"
               defaultOptions { createIfMissing = True
                              , filterPolicy    = Just . Left $ bloom
                              }

    put db def "zzz" "zzz"
    put db def "yyy" "yyy"
    put db def "xxx" "xxx"

    get db def "yyy" >>= liftIO . print
    get db def "xxx" >>= liftIO . print

    return ()

customFilterPolicy :: IO ()
customFilterPolicy = runResourceT $ do
    let create bs     = S.encode . bitArrayB $ easyList 0.01 bs
        maymatch k bs = False
        fp = FilterPolicy
               { fpName = "custom.filter.policy"
               , createFilter = create
               , keyMayMatch  = maymatch
               }

    db <- open "/tmp/lvlfptest"
               defaultOptions { createIfMissing = True
                              , filterPolicy    = Just . Right $ fp
                              }

    put db def "zzz" "zzz"
    put db def "yyy" "yyy"
    put db def "xxx" "xxx"

    get db def "yyy" >>= liftIO . print
    get db def "xxx" >>= liftIO . print

    return ()


main :: IO ()
main = do
    builtinBloom
    customFilterPolicy