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 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.



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_to_redis(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