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()
|