Haskell Riak司机:做一个简单的' put'手术

时间:2014-04-22 04:09:47

标签: haskell riak

我试图用Haskell驱动程序向Riak介绍自己,并且我遇到了一个简单的put操作。我对put函数的签名感到困惑。那里的任何地方都没有一个例子。

所以有这个签名:

put :: (FromJSON c, ToJSON c, Resolvable c) => Connection -> Bucket 
       -> Key -> Maybe VClock -> c -> W -> DW -> IO (c, VClock)

我有几个问题。

什么是Maybe VClock?我是否必须以某种方式生成它或者只是在那里指定Nothing就足够了?为什么我在返回的元组中重新获得这个VClock?

我是否必须为每个简单的值编写FromJSON和ToJSON实例,即使它是一个简单的字符串值?就像我想用“名称”键设置值“Stitch”一样,我该怎么做?

什么是Resolvable个实例?如何使Text或String值可解析? 我知道我必须定义resolve函数,但我不明白它意味着什么以及如何做。

2 个答案:

答案 0 :(得分:4)

Maybe VClock是要更新的对象(Just vclock)或Nothing的VClock。如果数据库中已存在此密钥的对象,则可以在此处指定Nothing

包含在IO(VClock)中的IO (c, VClock)是从数据库返回的插入对象的VClock。

您的数据类型需要ToJSONFromJSON实例才能使用该put函数。 Aeson有自动编写此说明的说明。您可以使用Network.Riak.Value模块存储非JSON数据,但这更复杂。

Resolvable用于解析两个兄弟姐妹,abMyDataType的情况如下:

instance Resolvable MyDataType where resolve a b = a

理想情况下,您的解析功能比选择ab更智能,因为订单无法保证,如果有多个兄弟姐妹,可能会多次调用。

here是一些代码,用于创建您认为有用的Riak连接池。

你最终会得到这样的东西:

put conn bucket key Nothing value Quorum Quorum

其中value是您的数据。有关Quorum here的更多信息。

答案 1 :(得分:3)

我希望以下简单的put和get操作代码可以帮助你:

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE UndecidableInstances #-}

module Main where
import Data.Aeson
import qualified Network.Riak as Riak 
import Network.Riak.Types
import Data.ByteString.Char8 hiding (putStrLn)
import Data.ByteString.Lazy as L hiding (pack,putStrLn)
import GHC.Generics hiding (R)

-- convert String to lazy ByteString
toBS :: String -> L.ByteString
toBS str = L.fromChunks (pack (str):[])

putBucket :: Bucket
putBucket = toBS "Bucket"

putKey :: Key
putKey = toBS "key"

r :: R
r = Default

w :: W
w = Default

dw :: DW
dw = Default

rw :: RW
rw = Default 

-- declare a data and create its instances
data Coord = Coord { x :: Double, y :: Double } deriving (Generic, Show)

instance FromJSON Coord

instance ToJSON Coord

instance (Show Coord) => Riak.Resolvable Coord where
    resolve a b = a

value :: Coord
value = Coord {
  x = 2.2,
  y = 3.3
}


main :: IO ()
main = do
    -- establish a connection
    let client = Riak.defaultClient
    con <- Riak.connect client
    -- simple put operation
    put_ret <- (Riak.put con putBucket putKey Nothing value w dw)
    putStrLn (show put_ret)
    buckets <- Riak.listBuckets con
    print buckets
    -- simple get operation
    get_ret <- (Riak.get con putBucket putKey r) :: IO ( Maybe (Coord, VClock))
    putStrLn (show get_ret)
    -- delete a value
    Riak.delete con putBucket putKey rw
    -- if try to get that value we will find "Nothing"
    get_ret <- (Riak.get con putBucket putKey r) :: IO ( Maybe (Coord, VClock))
    putStrLn (show get_ret)
    -- print the final bucket list
    buckets <- Riak.listBuckets con
    print buckets