module Pokan::CollectivePeerOperations
The CollectivePeerOperations
should be used when it is necessary to apply a operation over a undefined amount of peers
Public Instance Methods
Stores the keys-values-timestamps with timestamp greater than the peers’ timestamp
Usage¶ ↑
class Collective; include CollectivePeerOperations; end col = Collective.new col.merge({ id1: { key: { value: 'FAIL', timestamp: => 223412 } } }) # pair stored
# File lib/pokan/collective_peer_operations.rb, line 16 def merge(peers) query = Query.new(Peer) peers.each do |id, key_set| peer = query.where(id: id.to_s)[0] unless peer peer = Peer.new peer.id = id end key_set.keys.each do |key| value = key_set[key] value.keys.each { |k| value[k.to_sym] = value.delete(k) } key_set[key.to_sym] = key_set.delete(key) end peer.merge(key_set) peer.save end end
Returns all peers’ updated keys-values-timestamps in relation to a given digest in a Complete Structure
Given structure +{‘id1’ => {‘status’ => 3234124325.234323}}+
Return structure +{ peer_id => { key => {“value” => value, “timestamp” => timestamp}, …},…}+
# File lib/pokan/collective_peer_operations.rb, line 41 def newer(digest) query = Query.new(Peer) newer_keys = Hash.new digest.each do |id, keys| peer = query.where(id: id.to_s)[0] newer_keys[id] = peer ? peer.newer(keys) : {} end newer_keys end
Returns all peers’ outdated keys in relation to a given digest in a Old Key Structure
Given structure +{‘id1’ => {‘status’ => 3234124325.234323}}+
Return structure: +{peer_id => [old_key, …], …}+
# File lib/pokan/collective_peer_operations.rb, line 58 def older(data) query = Query.new(Peer) older_keys = Hash.new data.each do |id, dig| peer = query.where(id: id.to_s)[0] older_keys[id] = peer ? peer.older(dig) : dig.keys end older_keys end
Returns all the ids’ keys/values/timestamps for the keys in the given hash
Given structure +{id1: [:k1, :k2, :foo]}+
Return structure +{peer_id => { key => {“value” => value, “timestamp” => timestamp}, …},…}+
# File lib/pokan/collective_peer_operations.rb, line 76 def retrieve(req) query = Query.new(Peer) data = Hash.new req.each do |id, keys| peer = query.where(id: id.to_s, status:'alive')[0] data[id] = peer.values(keys) if peer end data end