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

merge(peers) click to toggle source

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
newer(digest) click to toggle source

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
older(data) click to toggle source

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
retrieve(req) click to toggle source

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