luis@970: # this script will get stats from the repo and print them to stdout luis@970: luis@970: # USAGE: luis@970: luis@970: # ./script/runner -e production extra/soundsoftware/get-statistics.rb luis@970: # luis@970: Chris@1002: d1 = Date.parse("20100701") # => 1 Jul 2010 luis@970: d2 = Date.today luis@970: Chris@1002: def delta_array (iarray) Chris@1002: # returns an array with the deltas Chris@1002: ## prepends a zero and drops the last element Chris@1002: deltas = [0] + iarray Chris@1002: deltas = deltas.first(deltas.size - 1) Chris@1002: Chris@1002: return iarray.zip(deltas).map { |x, y| x - y } Chris@1002: Chris@1002: end Chris@1002: luis@970: def months_between(d1, d2) luis@970: months = [] luis@970: start_date = Date.civil(d1.year, d1.month, 1) luis@970: end_date = Date.civil(d2.year, d2.month, 1) luis@970: luis@970: raise ArgumentError unless d1 <= d2 luis@970: luis@970: while (start_date < end_date) luis@970: months << start_date luis@970: start_date = start_date >>1 luis@970: end luis@970: luis@970: months << end_date luis@970: end luis@970: luis@970: def weeks_between(d1, d2) luis@970: weeks = [] luis@976: start_date = Date.civil(d1.year, d1.month, d1.day) luis@976: end_date = Date.civil(d2.year, d2.month, d2.day) luis@970: luis@970: raise ArgumentError unless d1 <= d2 luis@970: luis@970: while (start_date < end_date) luis@970: weeks << start_date Chris@1002: start_date = start_date + 2.week luis@970: end luis@970: luis@970: weeks << end_date luis@970: end luis@970: Chris@1002: def get_user_project_evol_stats() Chris@1002: # dates = months_between(d1, d2) Chris@1002: dates = months_between(d1, d2) Chris@1002: Chris@1002: # number of users Chris@1002: n_users = [] Chris@1002: n_projects = [] Chris@1002: qm_users = [] Chris@1002: Chris@1002: dates.each do |date| Chris@1002: users = User.find_by_sql ["SELECT * FROM users WHERE users.status = '1' AND users.created_on <= ?;", date] Chris@1002: projects = Project.find_by_sql ["SELECT * FROM projects WHERE projects.created_on <= ?;", date] Chris@1002: Chris@1002: qm_users_list = User.find_by_sql ["SELECT * FROM users,ssamr_user_details WHERE users.status = '1' AND ssamr_user_details.user_id = users.id AND (users.mail like '%qmul%' OR ssamr_user_details.institution_id = '99') AND users.created_on <= ?;", date ] Chris@1002: Chris@1002: qm_users << qm_users_list.count Chris@1002: n_users << users.count Chris@1002: n_projects << projects.count Chris@1002: Chris@1002: # private_projects = Project.find(:all, :conditions => {:created_on => d1..date, is_public => false}) Chris@1002: end Chris@1002: Chris@1002: user_deltas = delta_array(n_users) Chris@1002: proj_deltas = delta_array(n_projects) Chris@1002: qm_user_deltas = delta_array(qm_users) Chris@1002: Chris@1002: puts "Date Users D_Users QM_Users D_QM_users Projects D_Projects" Chris@1002: Chris@1002: dates.zip(n_users, user_deltas, qm_users, qm_user_deltas, n_projects, proj_deltas).each do |a, b, c, d, e, f, g| Chris@1002: puts "#{a} #{b} #{c} #{d} #{e} #{f} #{g}" Chris@1002: end Chris@1002: Chris@1002: end luis@970: luis@970: Chris@1002: def get_project_status() Chris@1002: date = "20121101" Chris@1002: Chris@1002: all_projects = Project.find(:all, :conditions => ["created_on < ?", date]) Chris@1002: # all_projects = Project.find(:all, :conditions => ["is_public = ? AND created_on < ?", true, date]) Chris@1002: # all_projects = Project.find(:all, :conditions => ["is_public = ? AND created_on < ?", false, date]) Chris@1002: Chris@1002: collab = [] Chris@1002: users_per_proj = [] Chris@1002: Chris@1002: # puts "Public Users Institutions" Chris@1002: Chris@1002: all_projects.each do |proj| Chris@1002: insts = [] Chris@1002: Chris@1002: proj.users.each do |u| Chris@1002: if u.institution == "" || u.institution == "No Institution Set" Chris@1002: if u.mail.include?("qmul.ac.uk") || u.mail.include?("andrewrobertson77") Chris@1002: insts << "Queen Mary, University of London" Chris@1002: else Chris@1002: insts << u.mail Chris@1002: end Chris@1002: else Chris@1002: insts << u.institution Chris@1002: end Chris@1002: end Chris@1002: Chris@1002: users_per_proj << proj.users.count Chris@1002: collab << insts.uniq.count Chris@1002: end Chris@1002: Chris@1002: Chris@1002: # freq = collab.inject(Hash.new(0)) { |h,v| h[v] += 1; h } Chris@1002: # freq = freq.sort_by {|key, value| value} Chris@1002: # puts freq.inspect.sort Chris@1002: Chris@1002: puts "Projects: #{all_projects.count} UpP: #{users_per_proj.sum / users_per_proj.size.to_f} Users1+: #{users_per_proj.count{|x| x> 1}} Users2+: #{users_per_proj.count{|x| x> 2}} Collab1+: #{collab.count{|x| x > 1}} Collab2+: #{collab.count{|x| x > 2}} IpP: #{collab.sum / collab.size.to_f}" Chris@1002: end Chris@1002: Chris@1002: def get_user_projects_ratios() Chris@1002: user_projects = User.find(:all, :conditions=> {:status => 1}) Chris@1002: pub_proj_user = user_projects.map{|u| u.projects.find(:all, :conditions=>{:is_public => true}).count} Chris@1002: Chris@1002: user_projects.zip(pub_proj_user).each do |u, pub| Chris@1002: puts "#{u.projects.count} #{pub}" Chris@1002: end luis@970: luis@970: end luis@970: Chris@1002: def get_inst_list() Chris@1002: users = User.find(:all, :conditions => {:status => 1}) Chris@1002: inst_list = users.map{|user| user.institution} Chris@1002: Chris@1002: freq = inst_list.inject(Hash.new(0)) { |h,v| h[v] += 1; h } Chris@1002: Chris@1002: end luis@970: luis@970: Chris@1002: # get_user_projects_ratios() Chris@1002: # get_user_project_evol_stats() luis@970: Chris@1002: get_project_status()