Module: PulseMeter::Sensor::TimelineReduce

Included in:
Timeline
Defined in:
lib/pulse-meter/sensor/timeline_reduce.rb

Overview

Methods for reducing raw data to single values

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

MAX_INTERVALS =
100

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



6
7
8
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 6

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#collect_ids_to_reduce(time, time_from, time_to) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 40

def collect_ids_to_reduce(time, time_from, time_to)
  ids = []
  while (time > time_from) # go backwards
    time -= interval
    interval_id = get_interval_id(time)
    next if Time.at(interval_id) > time_to

    reduced_key = data_key(interval_id)
    raw_key = raw_data_key(interval_id)
    break if redis.exists(reduced_key)
    ids << interval_id
  end
  ids
end

#reduce(interval_id) ⇒ Object

Note:

Interval id is just unixtime of its lower bound. Ruduction is a process of ‘compressing’ all interval’s raw data to a single value. When reduction is done summarized data is saved to Redis separately with expiration time taken from sensor configuration.

Parameters:

  • interval_id (Fixnum)


18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 18

def reduce(interval_id)
  interval_raw_data_key = raw_data_key(interval_id)
  return unless redis.exists(interval_raw_data_key)
  value = summarize(interval_raw_data_key)
  interval_data_key = data_key(interval_id)
  multi do
    redis.del(interval_raw_data_key)
    if redis.setnx(interval_data_key, value)
      redis.expire(interval_data_key, ttl)
    end
  end
end

#reduce_all_rawObject

Reduces data in all raw intervals



32
33
34
35
36
37
38
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 32

def reduce_all_raw
  time = Time.now
  min_time = time - reduce_delay  - interval
  max_depth = time - reduce_delay - interval * MAX_INTERVALS
  ids = collect_ids_to_reduce(time, max_depth, min_time)
  ids.reverse.each {|id| reduce(id)}
end