-
Notifications
You must be signed in to change notification settings - Fork 7
/
adapter.rb
73 lines (59 loc) · 1.89 KB
/
adapter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
module DataMapper::Adapters
class RiakAdapter < AbstractAdapter
def initialize(name, options)
super
@riak = Riak::Client.new(:prefix => options[:prefix] || 'riak')
@namespace = options[:namespace] ? options[:namespace] + ':' : ''
end
def create(resources)
objects = objects_for(resources.first.model)
resources.each {|r| initialize_serial(r, objects.size.succ)}
create_objects(resources)
end
def read(query)
query.filter_records(objects_for(query.model)).each do |object|
query.fields.each do |property|
object[property.name.to_s] = property.typecast(object[property.name.to_s])
end
end
end
def update(attributes, collection)
attributes = attributes_as_fields(attributes)
objects_for(collection.query.model).each {|r| r.update(attributes)}
update_objects(collection)
end
def delete(collection)
delete_objects(collection)
end
def flush(model)
bucket(model).keys.each {|key| bucket(model)[key].delete}
end
private
def bucket(model)
@riak.bucket(@namespace + model.storage_name)
end
def objects_for(model)
bucket(model).keys.map {|key| bucket(model)[key].data}
end
def create_objects(resources)
resources.each do |resource|
object = bucket(resource.model).new(resource.id.to_s)
object.data = resource.attributes(:field)
object.store
end
end
def update_objects(resources)
resources.each do |resource|
object = bucket(resource.model)[resource.id.to_s]
object.data = resource.attributes(:field)
object.store
end
end
def delete_objects(resources)
resources.each do |resource|
bucket(resource.model)[resource.id.to_s].delete
end
end
end
const_added(:RiakAdapter)
end