class Statlysis::Cron

Attributes

clock[R]
multiple_dataset[R]
source_type[R]
time_column[R]
time_unit[R]
time_zone[R]

Public Class Methods

new(s, opts = {}) click to toggle source
# File lib/statlysis/cron.rb, line 9
def initialize s, opts = {}
  # setup data type related
  @source_type = ({Utils.is_activerecord?(s) => :activerecord, Utils.is_mongoid?(s) => :mongoid}.detect {|k, v| k } || {})[1] || :unknown

  @time_column      = opts[:time_column]
  @time_unit        = opts[:time_unit]
  @time_zone        = opts[:time_zone] || Statlysis.default_time_zone || Time.zone || Time.now.utc_offset

  # insert source as a dataset
  @multiple_dataset = (s.is_a?(ActiveRecordDataset) ? s : ActiveRecordDataset.new(cron).add_source(s)) if is_activerecord?
  @multiple_dataset = (s.is_a?(MongoidDataset) ? s : MongoidDataset.new(cron).add_source(s)) if is_mongoid?
  @multiple_dataset.instance_variable_set("@cron", cron) if is_orm? && @multiple_dataset.cron.nil?

  @stat_table_name = opts[:stat_table_name] if opts[:stat_table_name]

  cron
end

Public Instance Methods

_source() click to toggle source
# File lib/statlysis/cron.rb, line 33
def _source; cron.multiple_dataset.sources.first end
group_by_columns?() click to toggle source
# File lib/statlysis/cron.rb, line 75
def group_by_columns?; !!@group_by_columns.any? end
is_activerecord?() click to toggle source
# File lib/statlysis/cron.rb, line 30
def is_activerecord?; @source_type == :activerecord; end
is_mongoid?() click to toggle source
# File lib/statlysis/cron.rb, line 31
def is_mongoid?; @source_type == :mongoid; end
is_orm?() click to toggle source
# File lib/statlysis/cron.rb, line 32
def is_orm?; [:activerecord, :mongoid].include?(@source_type); end
is_time_column_integer?() click to toggle source

兼容采用整数类型作时间字段

# File lib/statlysis/cron.rb, line 67
def is_time_column_integer?
  if is_activerecord?
    _source.columns_hash[cron.time_column.to_s].type == :integer
  else
    false
  end
end
output() click to toggle source
# File lib/statlysis/cron.rb, line 26
def output; raise DefaultNotImplementWrongMessage end
reoutput() click to toggle source
# File lib/statlysis/cron.rb, line 27
def reoutput; @output = nil; output end
run() click to toggle source
# File lib/statlysis/cron.rb, line 29
def run; raise  DefaultNotImplementWrongMessage end
setup_stat_model() click to toggle source
# File lib/statlysis/cron.rb, line 28
def setup_stat_model; raise DefaultNotImplementWrongMessage end
source_where_array() click to toggle source
# File lib/statlysis/cron.rb, line 35
def source_where_array
  # TODO follow index seq
  a = _source.where("").where_values.map do |equality|
    # use full keyvalue index name
    equality.is_a?(String) ? equality.to_sym : "#{equality.operand1.name}#{equality.operand2}"
  end if is_activerecord?
  a = _source.all.selector.reject {|k, v| k == 't' } if is_mongoid?
  a.map {|s1| s1.to_s.split(//).select {|s2| s2.match(/[a-z0-9]/i) }.join }.sort.map(&:to_sym)
end
time_column?() click to toggle source
# File lib/statlysis/cron.rb, line 74
def time_column?; !!@time_column end
time_range() click to toggle source

automode or specify TIME_RANGE and TIME_UNIT in shell to run

# File lib/statlysis/cron.rb, line 48
def time_range
  return TimeSeries.parse(ENV['TIME_RANGE'], :unit => (ENV['TIME_UNIT'] || 'day'), :zone => cron.time_zone) if ENV['TIME_RANGE']
  # 选择开始时间。取出统计表的最后时间,和数据表的最先时间对比,哪个在后就选择哪个
  begin_day = DateTime.now.beginning_of_day
  st_timebegin = (a = cron.stat_model.order(:t).where("t >= ?", begin_day.yesterday).first) ? a[:t] : nil

  # TODO support multiple log
  cron.stat_model.where("t >= ?", begin_day.tomorrow).delete # 明天的数据没出来肯定统计不了
  timebegin = (multiple_dataset.first_time != DateTime1970) ? multiple_dataset.first_time : (DateTime.now - 1.second)
  timebegin = Time.at(timebegin) if is_time_column_integer?
  timebegin = (st_timebegin > timebegin) ? st_timebegin : timebegin if st_timebegin

  timeend = DateTime.now
  logger.info "#{multiple_dataset.name}'s range #{timebegin..timeend}"
  # 把统计表的最后时间点也包含进去重新计算下
  TimeSeries.parse(timebegin..timeend, :unit => cron.time_unit)
end