Работа с типами данных riak в зацепках postcommit

Я хочу реализовать хук postcommit для riak, который уменьшает счетчик на карте в другом ведре. Однако у меня возникли некоторые проблемы с типами данных riak.

Вот меня пытаются riak console:

(riak@127.0.0.1)9>{ok, C} = riak:local_client().
{ok,{riak_client,['riak@127.0.0.1',undefined]}}
(riak@127.0.0.1)10>{ok, Obj} = C:get({<<"product">>, <<"default">>}, <<"1">>).
{ok,{r_object,{<<"product">>,<<"default">>},
          <<"1">>,
          [{r_content,{dict,5,16,16,8,80,48,
                            {[],[],[],[],[],[],[],[],[],[],[],[],...},
                            {{[],[],[],[],
                              [[<<"dot">>|{<<"#\tþù"...>>,{...}}]],
                              [],[],[],[],[],...}}},
                      <<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112,
                        77,1,...>>}],
          [{<<35,9,254,249,108,41,151,242>>,{1,63593788980}}],
          {dict,1,16,16,8,80,48,
                {[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                {{[],[],[],[],[],[],[],[],[],[],[],...}}},
          undefined}}
(riak@127.0.0.1)11> Mp = riak_object:get_value(O3).
<<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112,
  77,1,131,80,0,0,0,206,120,1,203,96,...>>
(riak@127.0.0.1)12> MpP = riak_dt_map:from_binary(Mp).
{error,invalid_binary}

product Тип данных Bucket установлен на map, Каждый сохраненный объект должен иметь счетчик quantity который я хотел бы уменьшить.

Однако я не могу найти какую-либо документацию или пример кода, относящиеся к типам данных в контексте до или после фиксации. (на самом деле примеров любого рода немного). Я читал источник riak_client и riak_dt_map, но я новичок в erlang, поэтому я делаю медленный прогресс и был бы признателен за некоторую помощь.

1 ответ

Решение

R_object, который у вас есть, не содержит непосредственно riak_dt_map, скорее он содержит riak_kv_crdt, который содержит riak_dt_map, который, в свою очередь, содержит ваш счетчик.

Чтобы обновить счетчик, вам сначала нужно получить контекст карты:

{{Context,_},_}=riak_kv_crdt:value(Obj,riak_dt_map).

Затем создайте операцию для увеличения счетчика с именем << "name" >> на карте, содержащейся в CRDT:

Op = {crdt_op,riak_dt_map,{update,[{update,{<<"name">>,riak_dt_emcntr},increment}]},Context}.

И затем примените эту операцию к CRDT, предоставив ID актера, который вы хотите использовать для обновления вектора vclock/version:

NewObj = riak_kv_crdt:update(Obj,Actor,Op).

Результатом должен быть другой r_object, который готов к отправке обратно на хранение.

Другие вопросы по тегам