lib/rico/array.rb in rico-0.0.1 vs lib/rico/array.rb in rico-0.1.0
- old
+ new
@@ -2,37 +2,37 @@
class Array
include Rico::Object
include Enumerable
extend Forwardable
- def_delegators :members, :each, :[]
+ def_delegators :members, :each, :[], :length, :count
public
# Adds the requested items to the array and stores the object
#
# items - items to be added to the array
#
# Returns the result of the store operation
def add(*items)
- mutate compute_add(items)
+ mutate build_map_add(items)
end
# Removes the requested items from the array and stores the object
#
# items - items to be removed from the array
#
# Returns the result of the store operation
def remove(*items)
- mutate compute_remove(items)
+ mutate build_map_remove(items)
end
# Obtains the items in the array
#
# Returns the data in the object as an array
def members
- Array(data)
+ Array((data || {})["_values"])
end
# Tests whether or not an item exists in the array
#
# item - item to test against
@@ -40,18 +40,40 @@
# Returns true or false
def member?(item)
members.include? item
end
- # Returns the number of items in the array
+ # Resolve conflict between one or more RObject siblings
#
- # Returns an Integer
- def length
- members.length
+ # robjects - array of RObjects to merge
+ #
+ # Returns a single RObject result or nil
+ def self.resolve(robject)
+ siblings = robject.siblings
+ values = siblings.map {|r| Array(r.data["_values"]) }
+ deletions = siblings.map {|r| Array(r.data["_deletes"]) }.flatten
+
+ result = []
+ values.each do |v|
+ result += (v - result)
+ end
+
+ result -= deletions
+
+ obj = Riak::RObject.new(robject.bucket, robject.key)
+ obj.data = { "_values" => result, "_deletes" => deletions }
+ obj
end
- alias_method :count, :length
protected
+
+ def build_map_add(items)
+ { "_type" => type_key, "_values" => compute_add(items) }
+ end
+
+ def build_map_remove(items)
+ { "_type" => type_key, "_values" => compute_remove(items), "_deletes" => items }
+ end
def compute_add(items)
members + items
end