Skip to content

Commit 78996cd

Browse files
authored
Merge pull request #701 from basho/rdb/bet365/gsets-develop
Add gset support
2 parents 356c9bb + 8c0001e commit 78996cd

File tree

5 files changed

+42
-1
lines changed

5 files changed

+42
-1
lines changed

priv/default_schema.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
<field name="counter" type="int" indexed="true" stored="true" multiValued="false" />
9898
<field name="set" type="string" indexed="true" stored="true" multiValued="true" />
9999
<field name="hll" type="int" indexed="true" stored="true" multiValued="false" />
100+
<field name="gset" type="string" indexed="true" stored="true" multiValued="true" />
100101

101102
<!-- Riak datatypes embedded fields -->
102103
<dynamicField name="*_flag" type="boolean" indexed="true" stored="true" multiValued="false" />

riak_test/yz_dt_test.erl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
-define(COUNTER, <<"counters">>).
99
-define(SET, <<"sets">>).
1010
-define(HLL, <<"hlls">>).
11+
-define(GSET, <<"gsets">>).
1112
-define(MAP, <<"maps">>).
1213
-define(TYPES,
1314
[{?COUNTER, counter},
1415
{?SET, set},
1516
{?HLL, hll},
17+
{?GSET, gset},
1618
{?MAP, map}]).
1719

1820
-import(yz_rt, [create_index/2,
@@ -40,12 +42,14 @@ confirm() ->
4042
counter_update(PB),
4143
set_update(PB),
4244
hll_update(PB),
45+
gset_update(PB),
4346
map_update(PB),
4447

4548
%% Search the index for the types
4649
counter_search(ANode),
4750
set_search(ANode),
4851
hll_search(ANode),
52+
gset_search(ANode),
4953
map_search(ANode),
5054

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

76+
gset_update(PB) ->
77+
Dynamos = lists:foldl(fun riakc_gset:add_element/2, riakc_gset:new(), [<<"Riak">>, <<"Cassandra">>, <<"Voldemort">>, <<"Couchbase">>]),
78+
Erlangs = lists:foldl(fun riakc_gset:add_element/2, riakc_gset:new(), [<<"Riak">>, <<"Couchbase">>, <<"CouchDB">>]),
79+
?assertEqual(ok, riakc_pb_socket:update_type(PB, {?GSET, <<"databass">>}, <<"dynamo">>, riakc_gset:to_op(Dynamos))),
80+
?assertEqual(ok, riakc_pb_socket:update_type(PB, {?GSET, <<"databass">>}, <<"erlang">>, riakc_gset:to_op(Erlangs))).
81+
7282
set_search(Node) ->
7383
?assertSearch(Node, ?SET, "set", "Riak", 2),
7484
?assertSearch(Node, ?SET, "set", "CouchDB", 1),
@@ -103,6 +113,12 @@ hll_search(Node) ->
103113
?assertSearch(Node, ?HLL, "hll", "[5 TO 1000]", 0),
104114
?assertSearch(Node, ?HLL, "hll", "[0 TO 2]", 0).
105115

116+
gset_search(Node) ->
117+
?assertSearch(Node, ?GSET, "gset", "Riak", 2),
118+
?assertSearch(Node, ?GSET, "gset", "CouchDB", 1),
119+
?assertSearch(Node, ?GSET, "gset", "Voldemort", 1),
120+
?assertSearch(Node, ?GSET, "gset", "C*", 2).
121+
106122
map_update(PB) ->
107123
Sam = lists:foldl(fun({Key, Fun}, Map) ->
108124
riakc_map:update(Key, Fun, Map)

src/yz_dt_extractor.erl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
}).
7777
-type state() :: #state{}.
7878
-type field_path_name() :: undefined | {binary() | undefined, binary()}.
79-
-type datatype() :: map | set | counter | register | flag | hll.
79+
-type datatype() :: map | gset | set | counter | register | flag | hll.
8080
-spec extract(binary()) -> fields() | {error, any()}.
8181
extract(Value) ->
8282
extract(Value, ?NO_OPTIONS).
@@ -103,6 +103,9 @@ extract_fields(Name0, map, Pairs, #state{field_separator=Sep}=State) ->
103103
extract_fields(Name0, set, Entries, #state{field_separator=Sep}=State) ->
104104
Name = field_name(Name0, set, Sep),
105105
lists:foldl(extract_set(Name), State, Entries);
106+
extract_fields(Name0, gset, Entries, #state{field_separator=Sep}=State) ->
107+
Name = field_name(Name0, gset, Sep),
108+
lists:foldl(extract_gset(Name), State, Entries);
106109
extract_fields(Name, counter, Value, #state{fields=Fields, field_separator=Sep}=State) ->
107110
FieldName = field_name(Name, counter, Sep),
108111
State#state{fields=[{FieldName, ?INT_TO_BIN(Value)}|Fields]};
@@ -136,6 +139,12 @@ extract_set(Name) ->
136139
Acc#state{fields=[{Name, Elem}|Fields]}
137140
end.
138141

142+
-spec extract_gset(binary()) -> fun((binary(), state()) -> state()).
143+
extract_gset(Name) ->
144+
fun(Elem, #state{fields=Fields}=Acc) ->
145+
Acc#state{fields=[{Name, Elem}|Fields]}
146+
end.
147+
139148
-spec extract_map(field_path_name()) -> fun(({{binary(), module()}, term()}, state()) -> state()).
140149
extract_map(Prefix) ->
141150
fun({{FieldName, Mod}, Value}, Acc) ->

src/yz_extractor.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
-define(DEFAULT_MAP, [{default, yz_noop_extractor},
3232
{"application/json",yz_json_extractor},
3333
{"application/riak_counter", yz_dt_extractor},
34+
{"application/riak_gset", yz_dt_extractor},
3435
{"application/riak_hll", yz_dt_extractor},
3536
{"application/riak_map", yz_dt_extractor},
3637
{"application/riak_set", yz_dt_extractor},

test/yz_dt_extractor_tests.erl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,21 @@ set_test() ->
2222

2323
valid_extraction(Result, Expect).
2424

25+
2526
%% Test hll extract
2627
hll_test() ->
2728
HllBin = binary_crdt(hll),
2829
Result = yz_dt_extractor:extract(HllBin),
2930
Expect = [{<<"hll">>, <<"9">>}],
31+
valid_extraction(Result, Expect).
3032

33+
%% Test gset extract
34+
gset_test() ->
35+
SetBin = binary_crdt(gset),
36+
Result = yz_dt_extractor:extract(SetBin),
37+
Expect = [{<<"gset">>, <<"Dublin">>},
38+
{<<"gset">>, <<"Tel Aviv">>},
39+
{<<"gset">>, <<"Stoke-on-Trent">>}],
3140
valid_extraction(Result, Expect).
3241

3342
%% Test map extract
@@ -88,6 +97,11 @@ raw_type(set) ->
8897
element(2,?SET_TYPE:update({add_all, [<<"Riak">>, <<"Cassandra">>, <<"Voldemort">>]},
8998
<<0>>, ?SET_TYPE:new()))
9099
);
100+
raw_type(gset) ->
101+
?GSET_TYPE(
102+
element(2,?GSET_TYPE:update({add_all, [<<"Dublin">>, <<"Tel Aviv">>, <<"Stoke-on-Trent">>]},
103+
nil, ?GSET_TYPE:new()))
104+
);
91105
raw_type(counter) ->
92106
?COUNTER_TYPE(
93107
element(2,?COUNTER_TYPE:update({increment, 10}, <<0>>, ?COUNTER_TYPE:new())));

0 commit comments

Comments
 (0)