annotate extra/soundsoftware/get-statistics.rb @ 1469:c77ab1edff6b bug_563

Close obsolete branch bug_563
author Chris Cannam
date Wed, 23 Jan 2013 14:12:47 +0000
parents f6ede18f3e6e
children b554eb79ec7b
rev   line source
luis@970 1 # this script will get stats from the repo and print them to stdout
luis@970 2
luis@970 3 # USAGE:
luis@970 4
luis@970 5 # ./script/runner -e production extra/soundsoftware/get-statistics.rb
luis@970 6 #
luis@970 7
Chris@1002 8 d1 = Date.parse("20100701") # => 1 Jul 2010
luis@970 9 d2 = Date.today
luis@970 10
Chris@1002 11 def delta_array (iarray)
Chris@1002 12 # returns an array with the deltas
Chris@1002 13 ## prepends a zero and drops the last element
Chris@1002 14 deltas = [0] + iarray
Chris@1002 15 deltas = deltas.first(deltas.size - 1)
Chris@1002 16
Chris@1002 17 return iarray.zip(deltas).map { |x, y| x - y }
Chris@1002 18
Chris@1002 19 end
Chris@1002 20
luis@970 21 def months_between(d1, d2)
luis@970 22 months = []
luis@970 23 start_date = Date.civil(d1.year, d1.month, 1)
luis@970 24 end_date = Date.civil(d2.year, d2.month, 1)
luis@970 25
luis@970 26 raise ArgumentError unless d1 <= d2
luis@970 27
luis@970 28 while (start_date < end_date)
luis@970 29 months << start_date
luis@970 30 start_date = start_date >>1
luis@970 31 end
luis@970 32
luis@970 33 months << end_date
luis@970 34 end
luis@970 35
luis@970 36 def weeks_between(d1, d2)
luis@970 37 weeks = []
luis@976 38 start_date = Date.civil(d1.year, d1.month, d1.day)
luis@976 39 end_date = Date.civil(d2.year, d2.month, d2.day)
luis@970 40
luis@970 41 raise ArgumentError unless d1 <= d2
luis@970 42
luis@970 43 while (start_date < end_date)
luis@970 44 weeks << start_date
Chris@1002 45 start_date = start_date + 2.week
luis@970 46 end
luis@970 47
luis@970 48 weeks << end_date
luis@970 49 end
luis@970 50
Chris@1002 51 def get_user_project_evol_stats()
Chris@1002 52 # dates = months_between(d1, d2)
Chris@1002 53 dates = months_between(d1, d2)
Chris@1002 54
Chris@1002 55 # number of users
Chris@1002 56 n_users = []
Chris@1002 57 n_projects = []
Chris@1002 58 qm_users = []
Chris@1002 59
Chris@1002 60 dates.each do |date|
Chris@1002 61 users = User.find_by_sql ["SELECT * FROM users WHERE users.status = '1' AND users.created_on <= ?;", date]
Chris@1002 62 projects = Project.find_by_sql ["SELECT * FROM projects WHERE projects.created_on <= ?;", date]
Chris@1002 63
Chris@1002 64 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 65
Chris@1002 66 qm_users << qm_users_list.count
Chris@1002 67 n_users << users.count
Chris@1002 68 n_projects << projects.count
Chris@1002 69
Chris@1002 70 # private_projects = Project.find(:all, :conditions => {:created_on => d1..date, is_public => false})
Chris@1002 71 end
Chris@1002 72
Chris@1002 73 user_deltas = delta_array(n_users)
Chris@1002 74 proj_deltas = delta_array(n_projects)
Chris@1002 75 qm_user_deltas = delta_array(qm_users)
Chris@1002 76
Chris@1002 77 puts "Date Users D_Users QM_Users D_QM_users Projects D_Projects"
Chris@1002 78
Chris@1002 79 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 80 puts "#{a} #{b} #{c} #{d} #{e} #{f} #{g}"
Chris@1002 81 end
Chris@1002 82
Chris@1002 83 end
luis@970 84
luis@970 85
Chris@1002 86 def get_project_status()
Chris@1002 87 date = "20121101"
Chris@1002 88
Chris@1002 89 all_projects = Project.find(:all, :conditions => ["created_on < ?", date])
Chris@1002 90 # all_projects = Project.find(:all, :conditions => ["is_public = ? AND created_on < ?", true, date])
Chris@1002 91 # all_projects = Project.find(:all, :conditions => ["is_public = ? AND created_on < ?", false, date])
Chris@1002 92
Chris@1002 93 collab = []
Chris@1002 94 users_per_proj = []
Chris@1002 95
Chris@1002 96 # puts "Public Users Institutions"
Chris@1002 97
Chris@1002 98 all_projects.each do |proj|
Chris@1002 99 insts = []
Chris@1002 100
Chris@1002 101 proj.users.each do |u|
Chris@1002 102 if u.institution == "" || u.institution == "No Institution Set"
Chris@1002 103 if u.mail.include?("qmul.ac.uk") || u.mail.include?("andrewrobertson77")
Chris@1002 104 insts << "Queen Mary, University of London"
Chris@1002 105 else
Chris@1002 106 insts << u.mail
Chris@1002 107 end
Chris@1002 108 else
Chris@1002 109 insts << u.institution
Chris@1002 110 end
Chris@1002 111 end
Chris@1002 112
Chris@1002 113 users_per_proj << proj.users.count
Chris@1002 114 collab << insts.uniq.count
Chris@1002 115 end
Chris@1002 116
Chris@1002 117
Chris@1002 118 # freq = collab.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
Chris@1002 119 # freq = freq.sort_by {|key, value| value}
Chris@1002 120 # puts freq.inspect.sort
Chris@1002 121
Chris@1002 122 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 123 end
Chris@1002 124
Chris@1002 125 def get_user_projects_ratios()
Chris@1002 126 user_projects = User.find(:all, :conditions=> {:status => 1})
Chris@1002 127 pub_proj_user = user_projects.map{|u| u.projects.find(:all, :conditions=>{:is_public => true}).count}
Chris@1002 128
Chris@1002 129 user_projects.zip(pub_proj_user).each do |u, pub|
Chris@1002 130 puts "#{u.projects.count} #{pub}"
Chris@1002 131 end
luis@970 132
luis@970 133 end
luis@970 134
Chris@1002 135 def get_inst_list()
Chris@1002 136 users = User.find(:all, :conditions => {:status => 1})
Chris@1002 137 inst_list = users.map{|user| user.institution}
Chris@1002 138
Chris@1002 139 freq = inst_list.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
Chris@1002 140
Chris@1002 141 end
luis@970 142
luis@970 143
Chris@1002 144 # get_user_projects_ratios()
Chris@1002 145 # get_user_project_evol_stats()
luis@970 146
Chris@1002 147 get_project_status()