Module: Pokan::CollectivePeerOperations

Included in:
RequestHandler
Defined in:
lib/pokan/collective_peer_operations.rb

Overview

The CollectivePeerOperations should be used when it is necessary to apply a operation over a undefined amount of peers

Instance Method Summary collapse

Instance Method Details

#merge(peers) ⇒ Object

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


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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) ⇒ Object

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}, …},…}



41
42
43
44
45
46
47
48
49
50
# 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) ⇒ Object

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, …], …}



58
59
60
61
62
63
64
65
66
67
68
# 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) ⇒ Object

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}, …},…}



76
77
78
79
80
81
82
83
84
85
86
# 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