openstreetmap-website/script/statistics
Tom Hughes f29300bf1a Stop trying to report on the number of ways with tags because (a) almost all
ways have tags so it isn't very interesting and (b) it locks up the API every
night as it involved a join to a MyISAM table.
2008-01-07 00:33:54 +00:00

99 lines
3.9 KiB
Ruby
Executable file

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'
require 'generator'
start_time = Time.now
puts "<html>"
puts "<head>"
puts "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"
puts "<title>OpenStreetMap Statistics</title>"
puts "<style>th { text-align: left }</style>"
puts "</head>"
puts "<body>"
puts "<h2>OpenStreetMap stats report run at #{start_time.to_s}</h2>"
begin
user_count = User.count(:conditions => "active = true")
tracepoint_count = Tracepoint.count()
node_count = Node.count(:conditions => "visible = true")
way_count = Way.count(:conditions => "visible = true")
relation_count = Relation.count(:conditions => "visible = true")
puts "<table>"
puts "<tr><td>Number of users</td><td>#{user_count}</td></tr>"
puts "<tr><td>Number of uploaded GPS points</td><td>#{tracepoint_count}</td></tr>"
puts "<tr><td>Number of nodes</td><td>#{node_count}</td></tr>"
puts "<tr><td>Number of ways</td><td>#{way_count}</td></tr>"
puts "<tr><td>Number of relations</td><td>#{relation_count}</td></tr>"
puts "</table>"
puts "<h2>Top 50 users for uploads of GPS data</h2>"
puts "<table>"
puts "<tr><th>User</th><th>Number of Points</th></tr>"
Trace.sum(:size, :group => :user_id, :order => "sum_size DESC", :limit => 50).each do |user, count|
display_name = User.find(user).display_name.gsub('@', ' at ').gsub('.', ' dot ')
puts "<tr><td>#{display_name}</td><td>#{count}</td></tr>"
end
puts "</table>"
puts "<h2>Number of users editing over the past...</h2>"
puts "<table>"
puts "<tr><th>Data Type</th><th>Day</th><th>Week</th><th>Month</th></tr>"
day_count = Trace.count(:user_id, :distinct => true,
:conditions => "timestamp > NOW() - INTERVAL 1 DAY")
week_count = Trace.count(:user_id, :distinct => true,
:conditions => "timestamp > NOW() - INTERVAL 7 DAY")
month_count = Trace.count(:user_id, :distinct => true,
:conditions => "timestamp > NOW() - INTERVAL 28 DAY")
puts "<tr><th>GPX Files</th><td>#{day_count}</td><td>#{week_count}</td><td>#{month_count}</td></tr>"
day_count = OldNode.count(:user_id, :distinct => true,
:conditions => "timestamp > NOW() - INTERVAL 1 DAY")
week_count = OldNode.count(:user_id, :distinct => true,
:conditions => "timestamp > NOW() - INTERVAL 7 DAY")
month_count = OldNode.count(:user_id, :distinct => true,
:conditions => "timestamp > NOW() - INTERVAL 28 DAY")
puts "<tr><th>Nodes</th><td>#{day_count}</td><td>#{week_count}</td><td>#{month_count}</td></tr>"
puts "</table>"
puts "<h2>Top users editing over the past...</h2>"
puts "<table>"
puts "<tr><th>Day</th><th>Week</th><th>Month</th></tr>"
day_users = OldNode.count(:conditions => "timestamp > NOW() - INTERVAL 1 DAY",
:group => :user_id, :order => "count_all DESC")
week_users = OldNode.count(:conditions => "timestamp > NOW() - INTERVAL 7 DAY",
:group => :user_id, :order => "count_all DESC", :limit => 60)
month_users = OldNode.count(:conditions => "timestamp > NOW() - INTERVAL 28 DAY",
:group => :user_id, :order => "count_all DESC", :limit => 60)
SyncEnumerator.new(day_users, week_users, month_users).each do |row|
puts "<tr>"
row.each do |column|
if column.nil?
puts "<td></td>"
else
display_name = User.find(column[0]).display_name.gsub('@', ' at ').gsub('.', ' dot ')
count = column[1]
puts "<td>#{count} #{display_name}</td>"
end
end
puts "</tr>"
end
puts "</table>"
rescue Exception => e
puts "<p><em>Exception: #{e.to_s}</em><br />#{e.backtrace.join('<br />')}</p>"
end
puts "<p>Report took #{(Time.new - start_time).to_s} seconds to run</p>"
puts "</body>"
puts "</html>"