2010-04-20 23:05:11 +00:00
module Report
2010-10-15 01:50:03 +00:00
def usage_by_user ( table_name , start , stop , limit , level , conds = [ ] , params = [ ] , column = " created_at " )
conds << [ " #{ table_name } . #{ column } BETWEEN ? AND ? " ]
2010-04-20 23:05:11 +00:00
params << start
params << stop
2010-10-15 01:50:03 +00:00
if level && level != 0
conds << " users.level = ? "
params << level
end
2010-04-20 23:05:11 +00:00
2010-10-15 01:50:03 +00:00
users = ActiveRecord :: Base . select_all_sql ( " SELECT users.id, COUNT(*) as change_count FROM #{ table_name } JOIN users ON users.id = #{ table_name } .user_id WHERE " + conds . join ( " AND " ) + " GROUP BY users.id ORDER BY change_count DESC LIMIT #{ limit } " , * params )
2010-04-20 23:05:11 +00:00
2010-10-15 01:50:03 +00:00
conds << " users.id NOT IN (?) "
params << users . map { | x | x [ " id " ] }
other_count = ActiveRecord :: Base . connection . select_value ( ActiveRecord :: Base . sanitize_sql ( [ " SELECT COUNT(*) FROM #{ table_name } JOIN users ON users.id = #{ table_name } .user_id WHERE " + conds . join ( " AND " ) , * params ] ) ) . to_i
users << { " id " = > nil , " change_count " = > other_count }
2010-04-20 23:05:11 +00:00
users . each do | user |
2010-09-07 04:48:43 +00:00
user [ " change_count " ] = user [ " change_count " ] . to_i
2010-10-15 01:50:03 +00:00
if user [ " id " ]
user [ " user " ] = User . find ( user [ " id " ] )
2010-04-20 23:05:11 +00:00
user [ " name " ] = user [ " user " ] . name
else
user [ " name " ] = " Other "
end
end
2010-09-07 02:38:29 +00:00
return add_sum ( users )
2010-04-20 23:05:11 +00:00
end
2010-10-15 01:50:03 +00:00
def tag_updates ( start , stop , limit , level )
users = usage_by_user ( " post_tag_histories " , start , stop , limit , level )
2010-09-07 02:38:29 +00:00
users . each do | user |
2010-09-07 02:42:53 +00:00
user [ " change_count " ] = user [ " change_count " ] - Post . count ( :all , :conditions = > [ " created_at BETWEEN ? AND ? AND user_id =? " , start , stop , user [ " user_id " ] ] )
2010-09-07 02:38:29 +00:00
end
2010-09-07 02:42:53 +00:00
bottom = users . pop
users . sort! { | a , b | b [ " change_count " ] < = > a [ " change_count " ] }
users . push ( bottom )
2010-09-07 02:38:29 +00:00
users
end
2010-10-15 01:50:03 +00:00
def post_uploads ( start , stop , limit , level )
usage_by_user ( " posts " , start , stop , limit , level )
2010-09-07 02:38:29 +00:00
end
2010-10-15 01:50:03 +00:00
def wiki_updates ( start , stop , limit , level )
usage_by_user ( " wiki_page_versions " , start , stop , limit , level )
2010-09-07 02:38:29 +00:00
end
2010-10-15 01:50:03 +00:00
def note_updates ( start , stop , limit , level )
usage_by_user ( " note_versions " , start , stop , limit , level )
2010-09-07 02:38:29 +00:00
end
def add_sum ( users )
sum = 0
users . each do | user |
2010-09-07 04:48:43 +00:00
sum += user [ " change_count " ]
2010-09-07 02:38:29 +00:00
end
users . each do | user |
user [ " sum " ] = sum . to_f
end
end
2010-04-20 23:05:11 +00:00
module_function :usage_by_user
2010-09-07 02:38:29 +00:00
module_function :tag_updates
module_function :post_uploads
module_function :wiki_updates
module_function :note_updates
module_function :add_sum
2010-04-20 23:05:11 +00:00
end