class MerryGoRound::Query

Attributes

granularity[RW]
keys[RW]
max[RW]
min[RW]

Public Class Methods

new(params = {}) click to toggle source
# File lib/merry_go_round/query.rb, line 7
def initialize(params = {})
  self.granularity = params[:granularity] || :hour
  self.keys = [params[:keys]].flatten.compact
  parse_max(params)
  parse_min(params)
end

Public Instance Methods

execute() click to toggle source
# File lib/merry_go_round/query.rb, line 14
def execute
  query = MerryGoRound::Aggregation
  if keys && keys.length > 0
    query = query.where('key in (?)', keys)
  end
  query = query.where('granularity = ? and timestamp >= ? and timestamp <= ?', granularity, min, max)
  query = query.order('key, timestamp')

  records = query.all
  keys = records.map(&:key).uniq

  results = keys.inject({}) do |out, current_key|
    out[current_key] = records.select{|record| record.key == current_key }.map do |item|
      {
        id: item.id,
        parent_id: item.parent_id,
        timestamp: item.timestamp,
        value: item.value,
        granularity: item.granularity
      }
    end

    out
  end

  {
    results: results,
    query: self.as_json
  }
end

Private Instance Methods

parse_max(params) click to toggle source
# File lib/merry_go_round/query.rb, line 47
def parse_max(params)
  max = Time.at((params[:max] || Time.now).to_i).utc
  # remove seconds
  self.max = max - max.sec
end
parse_min(params) click to toggle source
# File lib/merry_go_round/query.rb, line 53
def parse_min(params)
  if params[:min]
    min = Time.at(params[:min].to_i).utc
  else
    current_granularity = MerryGoRound.granularities.index(granularity)

    unless less_granularity = MerryGoRound.granularities[current_granularity + 1]
      less_granularity = query.granularity
    end

    min = Time.now.utc - seconds(less_granularity)
  end

  # remove seconds
  self.min = min - min.sec
end