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