em-riak 0.2.0 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +47 -13
- data/Rakefile +34 -0
- data/em-riak.gemspec +40 -40
- data/lib/em-riak/basic.rb +363 -315
- data/lib/em-riak/configurations.rb +1 -1
- data/lib/em-riak/grapher.rb +49 -49
- data/lib/em-riak/map_reduce.rb +44 -33
- data/lib/em-riak/model.rb +7 -0
- data/lib/em-riak/secondary_index.rb +68 -62
- data/lib/em-riak/utils.rb +20 -20
- data/lib/em-riak/version.rb +1 -1
- data/spec/unit/all.rb +0 -0
- data/spec/unit/basic.rb +81 -0
- data/spec/unit/core.rb +70 -0
- data/spec/unit/map_reduce.rb +64 -0
- data/spec/unit/secondary_index.rb +46 -0
- metadata +26 -20
data/lib/em-riak/grapher.rb
CHANGED
@@ -1,58 +1,58 @@
|
|
1
1
|
module EmRiak
|
2
|
-
|
3
|
-
|
2
|
+
module Grapher
|
3
|
+
extend self
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
5
|
+
class LinkWalk
|
6
|
+
def add_link(key,*opts)
|
7
|
+
data={}
|
8
|
+
data[:head], data[:query] = EmRiak.handle_options("add_link",opts)
|
9
|
+
data[:query]= data[:query] && data[:query].length>0 ? data[:query]+"&returnbody=true" : "?returnbody=true"
|
10
|
+
|
11
|
+
url="/buckets/#{EmRiak.bucket}/keys/#{key}"
|
12
|
+
|
13
|
+
response=open("#{RIAKHOST[rand(RIAKHOST.count)]}/buckets/#{EmRiak.bucket}/keys/#{key}?returnbody=true")
|
14
|
+
body,links = rehandle_link_and_params(response)
|
15
|
+
|
16
|
+
data[:head]['Link'].each{|link| links=links.gsub(link+", ","") }
|
17
|
+
data[:head]['Link']=data[:head]['Link'].join(", ")+", "+links if data[:head]['Link'].count>0
|
18
|
+
data[:body]=body
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
EmRiak.http("put",key,url,data)
|
21
|
+
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
def remove_link(key,*opts)
|
24
|
+
data={}
|
25
|
+
data[:head], data[:query] = EmRiak.handle_options("add_link",opts)
|
26
|
+
data[:query]= data[:query] && data[:query].length>0 ? data[:query]+"&returnbody=true" : "?returnbody=true"
|
27
|
+
|
28
|
+
url="/buckets/#{EmRiak.bucket}/keys/#{key}"
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
response=open("#{RIAKHOST[rand(RIAKHOST.count)]}/buckets/#{EmRiak.bucket}/keys/#{key}?returnbody=true")
|
31
|
+
body,links = rehandle_link_and_params(response)
|
32
|
+
|
33
33
|
|
34
|
-
|
34
|
+
data[:body]=body
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
data[:head]['Link'].each{|link| links=links.gsub(link+", ","") }
|
37
|
+
data[:head]['Link']=links
|
38
|
+
EmRiak.http("put",key,url,data)
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
41
|
+
private
|
42
|
+
def rehandle_link_and_params(response,body={},links=[])
|
43
|
+
response.read.split("&").each{|params|
|
44
|
+
key=params.split("=")[0]
|
45
|
+
value=params.split("=")[1]
|
46
|
+
body[key.to_sym]=value
|
47
|
+
}
|
48
|
+
links=response.meta["link"]#.split(",")
|
49
|
+
#.each{|link|
|
50
|
+
#key=link.split(";")[0].split("/").last.gsub(">","")
|
51
|
+
#tag=link.split(";")[1].split("").gsub("\"","").gsub("\"","").gsub(" ","")
|
52
|
+
#links << {:target=>"key",:tag=>tag}
|
53
|
+
#}
|
54
|
+
[body,links]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
58
|
end
|
data/lib/em-riak/map_reduce.rb
CHANGED
@@ -1,39 +1,50 @@
|
|
1
1
|
MRMAPPER={
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
]}"
|
2
|
+
:secondary_index_single_query=>"{\"inputs\" => {\"bucket\"=> \"@!bucket!@\",\"index\"=> \"@!index!@\", \"key\"=>\"@!value!@\"},
|
3
|
+
\"query\" => [{\"map\"=> {\"language\"=> \"javascript\",\"source\"=>\"function(riakObject){ var body={}; var body_arrays=riakObject.values[0].data.split('&head')[0].split('&'); for(i=0;i<body_arrays.length;i++){ body[body_arrays[i].split('=')[0]]=body_arrays[i].split('=')[1];}; return [[riakObject.key, body]]; }\"} },
|
4
|
+
{\"reduce\"=> {\"language\"=> \"erlang\", \"module\"=>\"riak_kv_mapreduce\", \"function\"=>\"reduce_identity\", \"keep\"=>true} }
|
5
|
+
]}",
|
6
|
+
:secondary_index_range_query=>"",
|
7
|
+
:secondary_index_multiple_query=>"{\"inputs\"=> {\"bucket\"=>\"@!bucket!@\",\"index\"=> \"@!index!@\",\"key_filters\"=>[[\"greater_than\",0]]},
|
8
|
+
\"query\" => [{\"map\"=> {\"language\"=>\"javascript\", \"source\"=>\"function(riakObject){var search_string='@!value!@';var search_values=search_string.split(',');var metadata=riakObject.values[0].metadata; var indexes=null; var match=false; if(metadata){ if(metadata.index){ indexes=metadata.index.@!index!@; var temp_index=indexes; if(typeof(indexes)!='object') indexes=[indexes];} if(indexes){ for(i=0;i<search_values.length; i++){if(indexes.indexOf(search_values[i])>0){match=true;break;};};};}; return (indexes && match) ? [[riakObject.bucket,riakObject.key]] : [[false,false]];}\" }},
|
9
|
+
{\"reduce\"=> {\"language\"=> \"erlang\", \"module\"=>\"riak_kv_mapreduce\", \"function\"=>\"reduce_set_union\", \"keep\"=>true} }
|
10
|
+
]}",
|
11
|
+
:clean_bucket=>"{\"inputs\"=> {\"bucket\"=>\"@!bucket!@\",\"key_filters\"=>[[\"greater_than\",0]]},
|
12
|
+
\"query\" => [{\"map\"=> {\"language\"=>\"javascript\", \"source\"=>\"function(riakObject){return [[riakObject.key]];}\" }}
|
13
|
+
]}"
|
15
14
|
}
|
16
15
|
|
17
16
|
module EmRiak
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
17
|
+
module MapReduce
|
18
|
+
extend self
|
19
|
+
def submit(*args)
|
20
|
+
mode_or_string,params,result_handler,callback,callback_proc=args.first
|
21
|
+
if mode_or_string.class==Hash
|
22
|
+
submit_work=mode_or_string
|
23
|
+
elsif mode_or_string.class==Symbol
|
24
|
+
map_reduce_work=MRMAPPER[mode_or_string]
|
25
|
+
submit_work=map_reduce_work.gsub(/@!(.{1,}?)!@/){|m| params[$1] }
|
26
|
+
submit_work=eval(submit_work)
|
27
|
+
end
|
28
|
+
url="/mapred"
|
29
|
+
map_reduce_json=EmRiak.json_encode(submit_work)
|
30
|
+
data={:head=>{"Content-Type"=>"application/json"},:body=>map_reduce_json}
|
31
|
+
|
32
|
+
callback_proc=Proc.new{|results| callback.call(callback_handler(results,result_handler)) } if callback
|
33
|
+
res=EmRiak.http("post","mapred",url,data,callback_proc)
|
34
|
+
res=callback_handler(res,result_handler) if !callback_proc
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
res
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def callback_handler(res,result_handler)
|
41
|
+
if res.class==String
|
42
|
+
res=EscapeUtils.unescape_url(res.encode('UTF-8').gsub("(","\(").gsub(")","\)").gsub("+","").gsub("=>",":").gsub("\"{","{").gsub("}\"","}").gsub("%20"," ").gsub("%22","@!quote!@")).gsub("@!quote!@","\\\"")
|
43
|
+
res=EmRiak.json_decode(res)
|
44
|
+
end
|
45
|
+
res=EmRiak.convert_params_layers(res,:to_sym) if res.class==Hash
|
46
|
+
res=result_handler.call(res,{}) if result_handler
|
47
|
+
res
|
48
|
+
end
|
49
|
+
end
|
39
50
|
end
|
@@ -1,68 +1,74 @@
|
|
1
1
|
module EmRiak
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
module SecondaryIndex
|
3
|
+
extend self
|
4
|
+
def add_tag(data_self,args)
|
5
|
+
data,opts=handle_data_and_options(data_self,args)
|
6
|
+
submit_work("add",data_self,data,opts)
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove_tag(data_self,args)
|
10
|
+
data,opts=handle_data_and_options(data_self,args)
|
11
|
+
submit_work("remove",data_self,data,opts)
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
protected
|
15
|
+
def submit_work(submit_mode,data_self,data,opts,res={:status=>"success"})
|
16
|
+
self.send "#{submit_mode}_as_index",data_self,data,opts
|
17
|
+
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
19
|
+
def handle_data_and_options(data_self,args)
|
20
|
+
data={:head=>data_self[:head],:body=>data_self,:query=>{}}
|
21
|
+
data[:body].delete(:head)
|
22
|
+
args=args[0] if args[0].class==Array
|
23
|
+
opts={:bin=>args[0]}
|
24
|
+
opts[:secondary_index]= if args[1] && args[1].class==Hash
|
25
|
+
args[1].each{|key,value| opts[key]=value }
|
26
|
+
args[2..args.count]
|
27
|
+
else
|
28
|
+
args[1..args.count]
|
29
|
+
end
|
30
|
+
[data, opts]
|
31
|
+
end
|
32
|
+
def merge_tag(new_heads,old_heads,res={})
|
33
|
+
return new_heads if !old_heads
|
34
|
+
new_heads.each do |key,value|
|
35
|
+
res[key]= key.match(/x-riak-index-/) && old_heads[key] ? value.split(", ").concat(old_heads[key].split(", ")).uniq.join(", ") : value
|
36
|
+
end
|
37
|
+
res
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
def add_as_index(data_self,data,opts)
|
41
|
+
temp_head, data[:query] = EmRiak.handle_options("post",opts)
|
42
|
+
data[:head]=merge_tag(temp_head,data[:head])
|
43
|
+
data_self[:head]=data[:head]
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
45
|
+
url="/buckets/#{EmRiak.bucket}/keys/#{data_self[:riak_key]}"
|
46
|
+
EmRiak.http("post","2i",url,data)
|
47
|
+
end
|
48
|
+
def destroy_tag(new_heads,old_heads)
|
49
|
+
return new_heads if !old_heads
|
50
|
+
new_heads.each do |key,value|
|
51
|
+
new_value= (value.class==String && value.split(", ").count>1) ? value.split(", ") : value
|
52
|
+
if key.match(/x-riak-index-/) && old_heads[key]
|
53
|
+
temp_head=old_heads[key].split(", ")
|
54
|
+
if new_value.class==Array
|
55
|
+
new_value.each{|v| temp_head.delete(v) }
|
56
|
+
else
|
57
|
+
temp_head.delete(new_value)
|
58
|
+
end
|
59
|
+
old_heads[key]=temp_head.uniq.join(", ")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
old_heads
|
63
|
+
end
|
64
|
+
def remove_as_index(data_self,data,opts)
|
65
|
+
temp_head, data[:query] = EmRiak.handle_options("post",opts)
|
66
|
+
data[:head]=destroy_tag(temp_head,data[:head])
|
67
|
+
data_self[:head]=data[:head]
|
68
|
+
|
69
|
+
url="/buckets/#{EmRiak.bucket}/keys/#{data_self[:riak_key]}"
|
70
|
+
p "remove data #{data}"
|
71
|
+
EmRiak.http("post","2i",url,data)
|
72
|
+
end
|
73
|
+
end
|
68
74
|
end
|
data/lib/em-riak/utils.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
module EmRiak
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
2
|
+
module Util
|
3
|
+
extend self
|
4
|
+
def clean_bucket(bucket_name)
|
5
|
+
keys=EmRiak::MapReduce.submit(:clean_bucket,{"bucket"=>bucket_name})
|
6
|
+
if keys
|
7
|
+
if !(keys.class==Hash && keys[:error])
|
8
|
+
keys=keys[0] if keys.class==Array && keys.count==1
|
9
|
+
keys.each{|key|
|
10
|
+
key=key[0].gsub("\\","\/")
|
11
|
+
EmRiak.destroy(URI.escape(key[0]).to_s)
|
12
|
+
}
|
13
|
+
puts "clean done"
|
14
|
+
else
|
15
|
+
puts "Something went wrong." if EmRiak.debug
|
16
|
+
end
|
17
|
+
else
|
18
|
+
puts "key empty"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
22
|
end
|
data/lib/em-riak/version.rb
CHANGED
data/spec/unit/all.rb
ADDED
File without changes
|
data/spec/unit/basic.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'em-http-request'
|
5
|
+
require 'httpi'
|
6
|
+
require 'yajl'
|
7
|
+
require 'em-riak'
|
8
|
+
TEST_RIAK_HOSTS=["http://127.0.0.1:8091","http://127.0.0.1:8092","http://127.0.0.1:8093","http://127.0.0.1:8094"]
|
9
|
+
require File.expand_path('../../../lib/em-riak', __FILE__)
|
10
|
+
gem 'minitest'
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
|
14
|
+
class TestDirectCRUD < MiniTest::Unit::TestCase
|
15
|
+
def setup
|
16
|
+
EmRiak::Connection.new({:bucket=>"test-member",:async=>false,:hosts=>TEST_RIAK_HOSTS})
|
17
|
+
@data={:name=>"5",:riak_key=>"member5"}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_direct_create
|
21
|
+
member=EmRiak.create("member5",{:name=>5})
|
22
|
+
@data.each{|k,v| raise "error" if !member.send(k) || member.send(k)!=v }
|
23
|
+
rescue Exception => e
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_direct_find
|
28
|
+
EmRiak.create("member5",{:name=>5})
|
29
|
+
member=EmRiak.find("member5")
|
30
|
+
assert_equal @data, member
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_direct_destroy
|
34
|
+
assert_equal nil,EmRiak.destroy("member5")
|
35
|
+
assert_equal nil,EmRiak.find("member5")
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_direct_create_and_find
|
39
|
+
member=EmRiak.create("member5",{:name=>5})
|
40
|
+
@data.each{|k,v| raise "error" if !member.send(k) || member.send(k)!=v }
|
41
|
+
assert_equal @data, EmRiak.find("member5")
|
42
|
+
rescue Exception => e
|
43
|
+
false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class TestAsyncCRUD < MiniTest::Unit::TestCase
|
48
|
+
def setup
|
49
|
+
EmRiak::Connection.new({:bucket=>"test-member",:async=>false,:hosts=>TEST_RIAK_HOSTS})
|
50
|
+
@data={:name=>"5",:riak_key=>"member5"}
|
51
|
+
end
|
52
|
+
def test_async_find
|
53
|
+
EM.run do
|
54
|
+
EmRiak.find("member5"){|result|
|
55
|
+
assert_equal @data, result
|
56
|
+
EM.stop
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
def test_async_create
|
61
|
+
EM.run do
|
62
|
+
EmRiak.create("member5",@data){|member|
|
63
|
+
assert_equal nil,member # Because Riak does not response data when create, so it's nil. Will response data with next release.
|
64
|
+
member=EmRiak.find("member5")
|
65
|
+
assert_equal @data, member
|
66
|
+
EM.stop
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_async_destroy
|
72
|
+
EM.run do
|
73
|
+
EmRiak.destroy("member5",@data){|member|
|
74
|
+
assert_equal nil,member
|
75
|
+
member=EmRiak.find("member5")
|
76
|
+
assert_equal nil,member
|
77
|
+
EM.stop
|
78
|
+
}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/spec/unit/core.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'em-http-request'
|
5
|
+
require 'httpi'
|
6
|
+
require 'yajl'
|
7
|
+
require 'em-riak'
|
8
|
+
TEST_RIAK_HOSTS=["http://127.0.0.1:8091","http://127.0.0.1:8092","http://127.0.0.1:8093","http://127.0.0.1:8094"]
|
9
|
+
require File.expand_path('../../../lib/em-riak', __FILE__)
|
10
|
+
gem 'minitest'
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
|
14
|
+
class TestEmRiakCoreFunctions < MiniTest::Unit::TestCase
|
15
|
+
def setup
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_hosts_weight
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_consist_get_and_post
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_vector_clock
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_sibling
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_key_handler
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_convert_params_layers
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_json_coder
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class TestEmRiakStorageObjcetFunctionality < MiniTest::Unit::TestCase
|
41
|
+
def setup
|
42
|
+
EmRiak::Connection.new({:bucket=>"test-member",:async=>false,:hosts=>TEST_RIAK_HOSTS})
|
43
|
+
EmRiak.create("member5",{:name=>5})
|
44
|
+
@member=EmRiak.find("member5",{:name=>5})
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_self_data
|
48
|
+
assert_equal "5",@member.name
|
49
|
+
assert_equal "member5", @member.riak_key
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_self_update
|
53
|
+
@member.name="10"
|
54
|
+
@member.gender="male"
|
55
|
+
@member.save
|
56
|
+
|
57
|
+
assert_equal "10",@member.name
|
58
|
+
assert_equal "male",@member.gender
|
59
|
+
|
60
|
+
member=EmRiak.find("member5")
|
61
|
+
assert_equal "male",member.gender
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_self_destroy
|
65
|
+
response=@member.destroy
|
66
|
+
member=EmRiak.find("member5")
|
67
|
+
assert_equal nil,response
|
68
|
+
assert_equal nil,member
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'em-http-request'
|
5
|
+
require 'httpi'
|
6
|
+
require 'yajl'
|
7
|
+
require 'em-riak'
|
8
|
+
TEST_RIAK_HOSTS=["http://127.0.0.1:8091","http://127.0.0.1:8092","http://127.0.0.1:8093","http://127.0.0.1:8094"]
|
9
|
+
require File.expand_path('../../../lib/em-riak', __FILE__)
|
10
|
+
gem 'minitest'
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
class TestMapReduce < MiniTest::Unit::TestCase
|
14
|
+
def setup
|
15
|
+
EmRiak::Connection.new({:bucket=>"test-member",:async=>false,:hosts=>TEST_RIAK_HOSTS})
|
16
|
+
@mrwork={"inputs"=> {"bucket"=>"test-member","index"=> "likes_bin","key_filters"=>[["greater_than",0]]},
|
17
|
+
"query" => [{"map"=> {"language"=>"javascript", "source"=>"function(riakObject){var search_string='cool,ruby,social,天天開心,寫程式好Happy';var search_values=search_string.split(',');var metadata=riakObject.values[0].metadata; var indexes=null; var match=false; if(metadata){ if(metadata.index){ indexes=metadata.index.likes_bin; var temp_index=indexes; if(typeof(indexes)!='object') indexes=[indexes];} if(indexes){ for(i=0;i<search_values.length; i++){if(indexes.indexOf(search_values[i])>0){match=true;break;};};};}; return (indexes && match) ? [[riakObject.bucket,riakObject.key]] : [[false,false]];}" }},
|
18
|
+
{"reduce"=> {"language"=> "erlang", "module"=>"riak_kv_mapreduce", "function"=>"reduce_set_union", "keep"=>true} }
|
19
|
+
]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_sumbit_map_reduce
|
24
|
+
EmRiak.create("member8",{:name=>"Tester"})
|
25
|
+
@member=EmRiak.find("member8")
|
26
|
+
|
27
|
+
@member.add_tag(:likes,["cool","ruby","social","天天開心","寫程式好Happy"])
|
28
|
+
@member=EmRiak.find("member8")
|
29
|
+
EmRiak.search(:secondary_index,{:bin=>:likes},["cool","ruby","social","天天開心","寫程式好Happy"]).reject{|ary| ary==[false,false]}
|
30
|
+
|
31
|
+
data=EmRiak::MapReduce.submit(@mrwork).reject{|ary| ary==[false,false]}
|
32
|
+
assert_operator 0, :<, data.count
|
33
|
+
|
34
|
+
has_member=false
|
35
|
+
data.each{|ary| has_member=true if "member8"==ary[1] }
|
36
|
+
assert_equal true,has_member
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_async_callback
|
40
|
+
EM.run do
|
41
|
+
callback=Proc.new{|data|
|
42
|
+
assert_operator 0, :<, data.count
|
43
|
+
has_member=false
|
44
|
+
data.each{|ary| has_member=true if "member8"==ary[1] }
|
45
|
+
assert_equal true,has_member
|
46
|
+
EM.stop
|
47
|
+
}
|
48
|
+
EmRiak::MapReduce.submit([@mrwork, nil, nil, callback])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_result_handler_callback
|
53
|
+
result_handler=Proc.new{|data|
|
54
|
+
data=data.reject{|ary| ary==[false,false]}
|
55
|
+
assert_operator 0, :<, data.count
|
56
|
+
|
57
|
+
has_member=false
|
58
|
+
data.each{|ary| has_member=true if "member8"==ary[1] }
|
59
|
+
assert_equal true,has_member
|
60
|
+
assert_equal true,true
|
61
|
+
}
|
62
|
+
EmRiak::MapReduce.submit([@mrwork, nil, result_handler])
|
63
|
+
end
|
64
|
+
end
|