class DataStore::AverageCalculator

Constants

TIMESTAMP_CORRECTION_FACTOR

Attributes

base[R]
identifier[R]
table[R]
table_index[R]

Public Class Methods

new(table) click to toggle source
# File lib/data_store/average_calculator.rb, line 9
def initialize(table)
  @table       = table
  @identifier  = table.identifier
  @table_index = table.table_index
  @base        = Base.find(identifier: identifier)
end

Public Instance Methods

perform() click to toggle source

Calculate average value if needed Average value is store through an add call by a Table object So the average calculator is called again recursively

# File lib/data_store/average_calculator.rb, line 19
def perform
  if calculation_needed?
    average = previous_average_record ? calculate! : dataset.avg(:value)
    table.add(average, table_index: table_index + 1, created: last[:created], type: :gauge)
  end
end

Private Instance Methods

calculate!() click to toggle source
# File lib/data_store/average_calculator.rb, line 28
def calculate!
  last_time = previous_average_record[:created] + TIMESTAMP_CORRECTION_FACTOR
  dataset.where{created > last_time}.avg(:value)
end
calculation_needed?() click to toggle source
# File lib/data_store/average_calculator.rb, line 33
def calculation_needed?
  return false if compression_finished
  if previous_average_record
    tolerance = DataStore.configuration.frequency_tolerance
    time_difference_since_last_calculation >= (time_resolution - (time_resolution * tolerance)) 
  else
    dataset.count >= base.compression_schema[table_index]
  end
end
compression_factors() click to toggle source
# File lib/data_store/average_calculator.rb, line 51
def compression_factors
  array, factor = [], 1
  base.compression_schema.each do |compression|
    factor = (factor * compression)
    array << factor
  end
  array
end
compression_finished() click to toggle source
# File lib/data_store/average_calculator.rb, line 64
def compression_finished
  table_index == base.compression_schema.size
end
dataset() click to toggle source
# File lib/data_store/average_calculator.rb, line 72
def dataset
  base.db[table_name]
end
last() click to toggle source
# File lib/data_store/average_calculator.rb, line 68
def last
  dataset.order(:created).last
end
next_table() click to toggle source
# File lib/data_store/average_calculator.rb, line 84
def next_table
  (prefix + compression_factors[table_index].to_s).to_sym
end
prefix() click to toggle source
# File lib/data_store/average_calculator.rb, line 88
def prefix
  DataStore.configuration.prefix + identifier.to_s + '_'
end
previous_average_record() click to toggle source
# File lib/data_store/average_calculator.rb, line 60
def previous_average_record
  base.db[next_table].order(:created).last
end
table_name() click to toggle source
# File lib/data_store/average_calculator.rb, line 76
def table_name
  if table_index == 0
    prefix.chop.to_sym
  else
    (prefix + compression_factors[table_index - 1].to_s).to_sym
  end
end
time_difference_since_last_calculation() click to toggle source
# File lib/data_store/average_calculator.rb, line 43
def time_difference_since_last_calculation
  last[:created].round - previous_average_record[:created].round
end
time_resolution() click to toggle source
# File lib/data_store/average_calculator.rb, line 47
def time_resolution
  table.parent.frequency * compression_factors[table_index]
end