Skip to content

Commit 083d89b

Browse files
committed
Update to/from binary for latest
Also move to `dict` from `orddict` for better performance in larger sets. Retain `orddict` for EQC for ease of reading.
1 parent 7b2e98f commit 083d89b

File tree

1 file changed

+42
-17
lines changed

1 file changed

+42
-17
lines changed

src/riak_dt_lwwset.erl

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@
5050
-export([new/0, value/1, value/2]).
5151
-export([update/3, update/4, merge/2, equal/2]).
5252
-export([to_binary/1, from_binary/1]).
53+
-export([to_binary/2]).
5354
-export([stats/1, stat/2]).
5455
-export([parent_clock/2]).
56+
-export([to_version/2]).
5557

5658
%% EQC API
5759
-ifdef(EQC).
@@ -79,17 +81,23 @@
7981
-type add() :: ?ADD.
8082
-type remove() :: ?REM.
8183

84+
-ifdef(EQC).
85+
-define(DICT, orddict).
86+
-else.
87+
-define(DICT, dict).
88+
-endif.
89+
8290
-spec new() -> lwwset().
8391
new() ->
84-
orddict:new().
92+
?DICT:new().
8593

8694
-spec parent_clock(riak_dt_vclock:vclock(), lwwset()) -> lwwset().
8795
parent_clock(_Clock, LWWSet) ->
8896
LWWSet.
8997

9098
-spec value(lwwset()) -> [member()].
9199
value(LWWSet) ->
92-
[K || {K, {_TS, Status}} <- orddict:to_list(LWWSet), Status == 1].
100+
[K || {K, {_TS, Status}} <- ?DICT:to_list(LWWSet), Status == 1].
93101

94102
value(size, LWWSet) ->
95103
length(value(LWWSet));
@@ -108,27 +116,27 @@ update(Op, Actor, Set, _Ctx) ->
108116
%% Private
109117
-spec add_elem(member(), ts(), lwwset()) -> lwwset().
110118
add_elem(Elem, TS, LWWSet) ->
111-
case orddict:find(Elem, LWWSet) of
119+
case ?DICT:find(Elem, LWWSet) of
112120
error ->
113-
orddict:store(Elem, {TS, ?ADD}, LWWSet);
121+
?DICT:store(Elem, {TS, ?ADD}, LWWSet);
114122
{ok, {TS, ?REM}} ->
115-
orddict:store(Elem, {TS, ?ADD}, LWWSet);
123+
?DICT:store(Elem, {TS, ?ADD}, LWWSet);
116124
{ok, {TS0, _}} when TS0 < TS ->
117-
orddict:store(Elem, {TS, ?ADD}, LWWSet);
125+
?DICT:store(Elem, {TS, ?ADD}, LWWSet);
118126
_ ->
119127
LWWSet
120128
end.
121129

122130
%% @doc warning, allows doomstoning.
123131
-spec remove_elem(member(), ts(), lwwset()) -> lwwset().
124132
remove_elem(Elem, TS, LWWSet) ->
125-
case orddict:find(Elem, LWWSet) of
133+
case ?DICT:find(Elem, LWWSet) of
126134
error ->
127-
orddict:store(Elem, {TS, ?REM}, LWWSet);
135+
?DICT:store(Elem, {TS, ?REM}, LWWSet);
128136
{ok, {TS, ?ADD}} ->
129137
LWWSet;
130138
{ok, {TS0, _}} when TS0 < TS ->
131-
orddict:store(Elem, {TS, ?REM}, LWWSet);
139+
?DICT:store(Elem, {TS, ?REM}, LWWSet);
132140
_ ->
133141
LWWSet
134142
end.
@@ -137,7 +145,7 @@ remove_elem(Elem, TS, LWWSet) ->
137145
merge(LWWSet, LWWSet) ->
138146
LWWSet;
139147
merge(LWWSet1, LWWSet2) ->
140-
orddict:merge(fun lww/3, LWWSet1, LWWSet2).
148+
?DICT:merge(fun lww/3, LWWSet1, LWWSet2).
141149

142150
lww(_Key, {TS, ?ADD}, {TS, ?REM}) ->
143151
{TS, ?ADD};
@@ -160,7 +168,7 @@ stats(LWWSet) ->
160168

161169
-spec stat(atom(), lwwset()) -> number() | undefined.
162170
stat(element_count, LWWSet) ->
163-
orddict:size(LWWSet);
171+
?DICT:size(LWWSet);
164172
stat(_,_) -> undefined.
165173

166174
-include("riak_dt_tags.hrl").
@@ -177,15 +185,32 @@ stat(_,_) -> undefined.
177185
%% @see `from_binary/1'
178186
-spec to_binary(lwwset()) -> binary_lwwset().
179187
to_binary(S) ->
180-
<<?TAG:8/integer, ?V1_VERS:8/integer, (riak_dt:to_binary(S))/binary>>.
181-
182-
%% @doc When the argument is a `binary_orswot()' produced by
183-
%% `to_binary/1' will return the original `orswot()'.
188+
{ok, B} = to_binary(?V1_VERS, S),
189+
B.
190+
191+
%% @doc encode set to target version. The first argument is the target
192+
%% binary type.
193+
-spec to_binary(Vers :: pos_integer(), lwwset()) -> {ok, binary_lwwset()} | ?UNSUPPORTED_VERSION.
194+
to_binary(?V1_VERS, S) ->
195+
{ok, <<?TAG:8/integer, ?V1_VERS:8/integer, (riak_dt:to_binary(S))/binary>>};
196+
to_binary(Vers, _S) ->
197+
?UNSUPPORTED_VERSION(Vers).
198+
199+
%% @doc When the argument is a `binary_lwwset()' produced by
200+
%% `to_binary/1' will return the original `lwwset()'.
184201
%%
185202
%% @see `to_binary/1'
186-
-spec from_binary(binary_lwwset()) -> lwwset().
203+
-spec from_binary(binary_lwwset()) -> {ok, lwwset()} | ?UNSUPPORTED_VERSION | ?INVALID_BINARY.
187204
from_binary(<<?TAG:8/integer, ?V1_VERS:8/integer, B/binary>>) ->
188-
riak_dt:from_binary(B).
205+
{ok, riak_dt:from_binary(B)};
206+
from_binary(<<?TAG:8/integer, Vers:8/integer, _B/binary>>) ->
207+
?UNSUPPORTED_VERSION(Vers);
208+
from_binary(_B) ->
209+
?INVALID_BINARY.
210+
211+
-spec to_version(pos_integer(), lwwset()) -> lwwset().
212+
to_version(_Version, Set) ->
213+
Set.
189214

190215
%% ===================================================================
191216
%% EUnit tests

0 commit comments

Comments
 (0)