2014-04-22 8 views
6

Próbuję przedstawić się Riakowi ze sterownikiem Haskell i utknąłem w prostej operacji put. Jestem zdezorientowany podpisem funkcji put. i nigdzie nie ma ani jednego przykładu.Sterownik Haskell Riak: Wykonanie prostej operacji "włóż"

Więc z tego podpisu:

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

Mam kilka pytań.

Co to jest być może VClock? Czy muszę to w jakiś sposób wygenerować, czy wystarczy tylko określić Nic? I dlaczego otrzymam ten VClock z powrotem w zwróconej krotce?

Czy muszę pisać instancje FromJSON i ToJSON dla każdej prostej wartości, którą wstawiam, nawet jeśli jest to prosta wartość ciągu? Na przykład, jeśli chcę wstawić wartość "Stitch" za pomocą klucza "Name", jak mam to zrobić?

Co to jest instancja Resolvable? Jak utworzyć rozpoznawalną wartość tekstową lub łańcuchową? Rozumiem, że muszę zdefiniować funkcję resolve, ale nie rozumiem, co to znaczy i jak to zrobić.

Odpowiedz

3

Mam nadzieję, że poniższy kod prostego put i dostać operacja może pomóc:

{-# 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 
4

Maybe VClock to VClock aktualizowanego obiektu (Just vclock) lub . Możesz podać tutaj Nothing, jeśli w bazie danych nie ma już obiektu dla tego klucza.

VClock zawinięty w IO (IO (c, VClock)) to VClock wstawionego obiektu, zwrócony z bazy danych.

Twój typ danych będzie wymagał instancji ToJSON i FromJSON do korzystania z tej funkcji put. Aeson ma instrukcje dotyczące automatycznego zapisywania tego. Można przechowywać dane inne niż JSON przy użyciu modułów Network.Riak.Value, ale jest to bardziej skomplikowane.

rozpoznawana jest używana do rozwiązywania dwoje rodzeństwa i wygląda to gdzie a i bMyDataType s:

instance Resolvable MyDataType where resolve a b = a

Idealnie czynność postanowienie ma coś bardziej inteligentny niż tylko zbieranie a lub b jako Zamawiający nie jest gwarantowane i może być wywołane wiele razy, jeśli istnieje wiele rodzeństwa.

here to kod do tworzenia puli połączeń Riak, które mogą okazać się przydatne.

Będziesz skończyć z czymś, co wygląda tak:

put conn bucket key Nothing value Quorum Quorum

gdzie value jest dane. Więcej na temat Quorumhere.

+0

Dziękuję za answer.I rodzaj dostał VClock. Mam tę wartość musi być JSON. Rozumiem też Kworum.Ale nie dostałem strony "Rozstrzygalny". Więc za każdym razem, gdy wstawiam wartość, muszę uczynić ją instancją 'Resolvable' i implementować funkcję' resolve', czy to jest poprawne? Jak więc napisać tę funkcję 'rozwiązać'? Czy możesz pokazać prosty przykład? –