Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix merge to properly operate over dict. #723

Merged
merged 1 commit into from
Nov 9, 2013
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions src/riak_object.erl
Original file line number Diff line number Diff line change
Expand Up @@ -244,13 +244,31 @@ compare_content_dates(C1,C2) ->
-spec merge(riak_object(), riak_object()) -> riak_object().
merge(OldObject, NewObject) ->
NewObj1 = apply_updates(NewObject),
OldObject#r_object{contents=lists:umerge(lists:usort(NewObject#r_object.contents),
lists:usort(OldObject#r_object.contents)),
OldObject#r_object{contents=merge_contents(NewObject#r_object.contents,
OldObject#r_object.contents),
vclock=vclock:merge([OldObject#r_object.vclock,
NewObj1#r_object.vclock]),
updatemetadata=dict:store(clean, true, dict:new()),
updatevalue=undefined}.

%% @doc Merge the r_objects contents by converting the inner dict to
%% a list, ensuring a sane order, and merging into a unique list.
merge_contents(NewContents, OldContents) ->
OldContents1 = lists:map(fun convert_to_dict_list/1, OldContents),
NewContents1 = lists:map(fun convert_to_dict_list/1, NewContents),
Result = lists:umerge(lists:usort(NewContents1),
lists:usort(OldContents1)),
lists:map(fun convert_from_dict_list/1, Result).

%% @doc Convert a r_content's inner dictionary to a list, and sort it to
%% ensure we can do comparsions between r_contents.
convert_to_dict_list({r_content, Dict, Value}) ->
{r_content, lists:usort(dict:to_list(Dict)), Value}.

%% @doc Convert a r_content's inner dictionary from a list to a dict.
convert_from_dict_list({r_content, Dict, Value}) ->
{r_content, dict:from_list(Dict), Value}.

%% @doc Promote pending updates (made with the update_value() and
%% update_metadata() calls) to this riak_object.
-spec apply_updates(riak_object()) -> riak_object().
Expand Down