Skip to content

Commit

Permalink
Merge pull request #701 from basho/rdb/bet365/gsets-develop
Browse files Browse the repository at this point in the history
Add gset support
  • Loading branch information
russelldb authored Nov 15, 2016
2 parents 356c9bb + 8c0001e commit 78996cd
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 1 deletion.
1 change: 1 addition & 0 deletions priv/default_schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
<field name="counter" type="int" indexed="true" stored="true" multiValued="false" />
<field name="set" type="string" indexed="true" stored="true" multiValued="true" />
<field name="hll" type="int" indexed="true" stored="true" multiValued="false" />
<field name="gset" type="string" indexed="true" stored="true" multiValued="true" />

<!-- Riak datatypes embedded fields -->
<dynamicField name="*_flag" type="boolean" indexed="true" stored="true" multiValued="false" />
Expand Down
16 changes: 16 additions & 0 deletions riak_test/yz_dt_test.erl
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
-define(COUNTER, <<"counters">>).
-define(SET, <<"sets">>).
-define(HLL, <<"hlls">>).
-define(GSET, <<"gsets">>).
-define(MAP, <<"maps">>).
-define(TYPES,
[{?COUNTER, counter},
{?SET, set},
{?HLL, hll},
{?GSET, gset},
{?MAP, map}]).

-import(yz_rt, [create_index/2,
Expand Down Expand Up @@ -40,12 +42,14 @@ confirm() ->
counter_update(PB),
set_update(PB),
hll_update(PB),
gset_update(PB),
map_update(PB),

%% Search the index for the types
counter_search(ANode),
set_search(ANode),
hll_search(ANode),
gset_search(ANode),
map_search(ANode),

pass.
Expand All @@ -69,6 +73,12 @@ set_update(PB) ->
?assertEqual(ok, riakc_pb_socket:update_type(PB, {?SET, <<"databass">>}, <<"dynamo">>, riakc_set:to_op(Dynamos))),
?assertEqual(ok, riakc_pb_socket:update_type(PB, {?SET, <<"databass">>}, <<"erlang">>, riakc_set:to_op(Erlangs))).

gset_update(PB) ->
Dynamos = lists:foldl(fun riakc_gset:add_element/2, riakc_gset:new(), [<<"Riak">>, <<"Cassandra">>, <<"Voldemort">>, <<"Couchbase">>]),
Erlangs = lists:foldl(fun riakc_gset:add_element/2, riakc_gset:new(), [<<"Riak">>, <<"Couchbase">>, <<"CouchDB">>]),
?assertEqual(ok, riakc_pb_socket:update_type(PB, {?GSET, <<"databass">>}, <<"dynamo">>, riakc_gset:to_op(Dynamos))),
?assertEqual(ok, riakc_pb_socket:update_type(PB, {?GSET, <<"databass">>}, <<"erlang">>, riakc_gset:to_op(Erlangs))).

set_search(Node) ->
?assertSearch(Node, ?SET, "set", "Riak", 2),
?assertSearch(Node, ?SET, "set", "CouchDB", 1),
Expand Down Expand Up @@ -103,6 +113,12 @@ hll_search(Node) ->
?assertSearch(Node, ?HLL, "hll", "[5 TO 1000]", 0),
?assertSearch(Node, ?HLL, "hll", "[0 TO 2]", 0).

gset_search(Node) ->
?assertSearch(Node, ?GSET, "gset", "Riak", 2),
?assertSearch(Node, ?GSET, "gset", "CouchDB", 1),
?assertSearch(Node, ?GSET, "gset", "Voldemort", 1),
?assertSearch(Node, ?GSET, "gset", "C*", 2).

map_update(PB) ->
Sam = lists:foldl(fun({Key, Fun}, Map) ->
riakc_map:update(Key, Fun, Map)
Expand Down
11 changes: 10 additions & 1 deletion src/yz_dt_extractor.erl
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
}).
-type state() :: #state{}.
-type field_path_name() :: undefined | {binary() | undefined, binary()}.
-type datatype() :: map | set | counter | register | flag | hll.
-type datatype() :: map | gset | set | counter | register | flag | hll.
-spec extract(binary()) -> fields() | {error, any()}.
extract(Value) ->
extract(Value, ?NO_OPTIONS).
Expand All @@ -103,6 +103,9 @@ extract_fields(Name0, map, Pairs, #state{field_separator=Sep}=State) ->
extract_fields(Name0, set, Entries, #state{field_separator=Sep}=State) ->
Name = field_name(Name0, set, Sep),
lists:foldl(extract_set(Name), State, Entries);
extract_fields(Name0, gset, Entries, #state{field_separator=Sep}=State) ->
Name = field_name(Name0, gset, Sep),
lists:foldl(extract_gset(Name), State, Entries);
extract_fields(Name, counter, Value, #state{fields=Fields, field_separator=Sep}=State) ->
FieldName = field_name(Name, counter, Sep),
State#state{fields=[{FieldName, ?INT_TO_BIN(Value)}|Fields]};
Expand Down Expand Up @@ -136,6 +139,12 @@ extract_set(Name) ->
Acc#state{fields=[{Name, Elem}|Fields]}
end.

-spec extract_gset(binary()) -> fun((binary(), state()) -> state()).
extract_gset(Name) ->
fun(Elem, #state{fields=Fields}=Acc) ->
Acc#state{fields=[{Name, Elem}|Fields]}
end.

-spec extract_map(field_path_name()) -> fun(({{binary(), module()}, term()}, state()) -> state()).
extract_map(Prefix) ->
fun({{FieldName, Mod}, Value}, Acc) ->
Expand Down
1 change: 1 addition & 0 deletions src/yz_extractor.erl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
-define(DEFAULT_MAP, [{default, yz_noop_extractor},
{"application/json",yz_json_extractor},
{"application/riak_counter", yz_dt_extractor},
{"application/riak_gset", yz_dt_extractor},
{"application/riak_hll", yz_dt_extractor},
{"application/riak_map", yz_dt_extractor},
{"application/riak_set", yz_dt_extractor},
Expand Down
14 changes: 14 additions & 0 deletions test/yz_dt_extractor_tests.erl
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,21 @@ set_test() ->

valid_extraction(Result, Expect).


%% Test hll extract
hll_test() ->
HllBin = binary_crdt(hll),
Result = yz_dt_extractor:extract(HllBin),
Expect = [{<<"hll">>, <<"9">>}],
valid_extraction(Result, Expect).

%% Test gset extract
gset_test() ->
SetBin = binary_crdt(gset),
Result = yz_dt_extractor:extract(SetBin),
Expect = [{<<"gset">>, <<"Dublin">>},
{<<"gset">>, <<"Tel Aviv">>},
{<<"gset">>, <<"Stoke-on-Trent">>}],
valid_extraction(Result, Expect).

%% Test map extract
Expand Down Expand Up @@ -88,6 +97,11 @@ raw_type(set) ->
element(2,?SET_TYPE:update({add_all, [<<"Riak">>, <<"Cassandra">>, <<"Voldemort">>]},
<<0>>, ?SET_TYPE:new()))
);
raw_type(gset) ->
?GSET_TYPE(
element(2,?GSET_TYPE:update({add_all, [<<"Dublin">>, <<"Tel Aviv">>, <<"Stoke-on-Trent">>]},
nil, ?GSET_TYPE:new()))
);
raw_type(counter) ->
?COUNTER_TYPE(
element(2,?COUNTER_TYPE:update({increment, 10}, <<0>>, ?COUNTER_TYPE:new())));
Expand Down

0 comments on commit 78996cd

Please sign in to comment.