class Statlysis::Configuration

Constants

DelegateMethods

Attributes

database_opts[RW]

variables

default_time_columns[RW]

variables

default_time_zone[RW]

variables

is_skip_database_index[RW]
sequel[RW]

variables

tablename_default_pre[RW]

variables

Public Instance Methods

always(source, opts = {}) click to toggle source
# File lib/statlysis/configuration.rb, line 71
def always source, opts = {}; timely source, {:time_unit => false, :time_column => false}.merge(opts) end
check_set_database() click to toggle source
# File lib/statlysis/configuration.rb, line 67
def check_set_database; raise "Please setup database first" if sequel.nil?  end
daily(source, opts = {}) click to toggle source
# File lib/statlysis/configuration.rb, line 69
def daily  source, opts = {}; timely source, {:time_unit => :day}.merge(opts) end
hotest_items(key, id_to_score_and_time_hash = {}) { |id_to_score_and_time_hash| ... } click to toggle source

TODO 为什么一层proc的话会直接执行的

# File lib/statlysis/configuration.rb, line 81
def hotest_items key, id_to_score_and_time_hash = {}
  _p = proc { if block_given?
    (proc do
      id_to_score_and_time_hash = Hash.new
      yield id_to_score_and_time_hash
      id_to_score_and_time_hash
    end)
  else
    (proc { id_to_score_and_time_hash })
  end}

  self.hotest_crons.push HotestItems.new(key, _p)
end
hourly(source, opts = {}) click to toggle source
# File lib/statlysis/configuration.rb, line 70
def hourly source, opts = {}; timely source, {:time_unit => :hour}.merge(opts) end
lastest_visits(source, opts) click to toggle source

the real requirement is to compute lastest items group by special pattens, like user_id, url prefix, …

# File lib/statlysis/configuration.rb, line 74
def lastest_visits source, opts
  self.check_set_database
  opts.reverse_merge! :time_column => :created_at
  self.realtime_crons.push LastestVisits.new(source, opts)
end
set_database(obj) click to toggle source
# File lib/statlysis/configuration.rb, line 34
def set_database obj
  self.database_opts = case obj
                       when Hash
                         obj
                       when Symbol, String
                         YAML.load_file(Rails.root.join("config/database.yml"))[Rails.env].merge('database' => obj.to_s)
                       else
                         raise "Statlysis#set_database only support symbol or hash params"
                       end

  raise "database_opts should not be blank" if self.database_opts.blank?

  # sqlite dont support regular creating database in mysql style
  self.sequel = if (self.database_opts['adapter'].match(/sqlite/) && self.database_opts['database'].match(/\A:memory:\Z/)) # only for test envrionment
    Sequel.sqlite
  else
    # create database, copied from http://stackoverflow.com/a/14435522/595618
    require 'mysql2'
    mysql2_client = Mysql2::Client.new(self.database_opts.except('database'))
    mysql2_client.query("CREATE DATABASE IF NOT EXISTS #{self.database_opts['database']}")
    Sequel.connect(self.database_opts)
  end

  # 初始化键值model
  ["#{self.tablename_default_pre}_single_kvs", "#{self.tablename_default_pre}_single_kv_histories"].each do |tn|
    Utils.setup_pattern_table_and_model tn
  end

  return self
end
set_default_time_zone(zone;) click to toggle source
# File lib/statlysis/configuration.rb, line 65
def set_default_time_zone zone; self.default_time_zone = zone; return self; end
set_tablename_default_pre(str;) click to toggle source
# File lib/statlysis/configuration.rb, line 66
def set_tablename_default_pre str; self.tablename_default_pre = str.to_s; return self end
similar_items(model_name, id_to_text_hash = {}) { |id_to_text_hash| ... } click to toggle source

TODO support mongoid

# File lib/statlysis/configuration.rb, line 96
def similar_items model_name, id_to_text_hash = {}
  _p = if block_given?
    (proc do
      id_to_text_hash = Hash.new {|hash, key| hash[key] = "" }
      yield id_to_text_hash
      id_to_text_hash
    end)
  else
    (proc { id_to_text_hash })
  end

  self.similar_crons.push Similar.new(model_name, _p)
end
update_time_columns(*columns) click to toggle source

会在自动拼接统计数据库表名时去除这些时间字段

# File lib/statlysis/configuration.rb, line 28
def update_time_columns *columns
  self.default_time_columns ||= [:created_at, :updated_at]
  columns.each {|column| self.default_time_columns.push column }
  self.default_time_columns = self.default_time_columns.uniq
end

Private Instance Methods

timely(source, opts) click to toggle source
# File lib/statlysis/configuration.rb, line 112
def timely source, opts
  self.check_set_database

  opts.reverse_merge! :time_column => :created_at,
                      :time_unit => :day,
                      :sum_columns => [],
                      :group_by_columns => [],
                      :group_concat_columns => []

  opts.each {|k, v| opts[k] = v.map(&:to_sym) if (Timely::SqlColumns - [:group_by_columns]).include?(k) } # Sequel use symbol as column names

  # e.g. convert [:user_id] to [{:column_name => :user_id, :type => :integer}]
  if (opts[:group_by_columns].first || {})[:type].blank?
    opts[:group_by_columns] = opts[:group_by_columns].map {|i| {:column_name => i.to_sym, :type => :integer} }
  end

  t = Timely.new source, opts
  self.send("#{opts[:time_unit] || 'always'}_crons").push t
end