2016-05-02 7 views
1

Wie würde man eine einfache Riak CRDT Map mit einem Register Namen username und Wert test erstellen? Ich sehe das documentation here aber verstehe nicht, wie XPath und Name des Registers in einer Karte verbunden sind.CRDT ops für Karte in Haskell Riak Client

Hier ist, was ich tun werde wie: erstellen/aktualisieren ein Map mit Register Namen username und Wert test (unter Kübeln mapbucket, Eimer uinfo, Schlüssel test1). Hier ist, wie Erlang-Client wird das tun (nicht getestet - modifizierte Kopie-Paste aus einem anderen Code, den ich schrieb):

Map = riakc_map:new(), 
    Map1 = riakc_map:update({<<"username">>, register}, 
         fun(R) -> riakc_register:set(<<"test">>, R) end, 
         Map), 
    {ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 
    riakc_pb_socket:update_type(Pid,{<<"mapbucket">>,<<"uinfo">>},"test1",riakc_map:to_op(Map1)) 

I Github-Repository gesucht, aber kein Beispiel, es zu tun in Haskell Riak Client finden konnte, . Ich werde es sehr schätzen, wenn jemand mit der Vertrautheit mit Haskell Riak Client und CRDT Ops könnte Zeiger auf, wie etwas wie oben zu tun bieten.

Antwort

1

Ich habe herausgefunden, wie das geht. xpath in Map scheint ein rekursiver Selektor zu sein, um auf Felder zuzugreifen, die tief in einer anderen Karte in der Karte vergraben sind. Für das oberste Feld innerhalb einer Karte ist also xpath genau dieser Feldname. Somit wird die Lösung zu:

-- get the connection to 127.0.0.1:8087 
conn <- connect defaultClient 

-- xpath here is just "username" fieldname - we use RegisterSet operation 
-- Alternatively, for xpath value, you can do: ("username" :| []), especially, if 
-- passing it as argument in a function 
let op = "username" `mapUpdate` RegisterSet "test" 


-- send off the above operation to create/update the map 
sendModify conn "mapbucket" "uinfo" "test1" [op]