Skip to content

Commit

Permalink
Improve statistics
Browse files Browse the repository at this point in the history
	Table data allowing copy/paste
	Plural
	More readable stats (expected)
	New stats: CC license, tags by users, comments by users
	Page for comments stats
  • Loading branch information
Oumph authored and nono committed Jan 8, 2012
1 parent bebab5c commit fd03deb
Show file tree
Hide file tree
Showing 11 changed files with 687 additions and 330 deletions.
4 changes: 4 additions & 0 deletions app/controllers/statistics_controller.rb
Expand Up @@ -30,4 +30,8 @@ def contents
@stats = Statistics::Contents.new
end

def comments
@stats = Statistics::Comments.new
end

end
56 changes: 56 additions & 0 deletions app/models/statistics/comments.rb
@@ -0,0 +1,56 @@
class Statistics::Comments < Statistics::Statistics

def comments_hash
h = Hash.new
Comment.descendants.each {|c| h[c.to_s] = 0 }
h
end

def comments
return @comments if @comments

@comments = comments_hash
by_type = select_all("SELECT content_type, COUNT(*) AS cnt FROM comments,nodes WHERE comments.node_id=nodes.id GROUP BY content_type")
by_type.each { |comment| @comments[comment["content_type"]] = comment["cnt"] }
@comments["Total"] = @comments.values.sum

@comments
end

def comments_by_year
return @comments_by_year if @comments_by_year

@comments_by_year = {}
$redis.keys("stats/comments/year/*").sort.each do |k|
_, _, _, year, type = k.split('/')
@comments_by_year[year] ||= comments_hash
@comments_by_year[year][type] = $redis.get(k).to_i
end

@comments_by_year
end

def comments_by_month
return @comments_by_month if @comments_by_month

@comments_by_month = {}
$redis.keys("stats/comments/month/*").sort.each do |k|
_, _, _, month, type = k.split('/')
@comments_by_month[month] ||= comments_hash
@comments_by_month[month][type] = $redis.get(k).to_i
end

@comments_by_month
end

def comments_by_day
return @comments_by_wday if @comments_by_wday

@comments_by_wday = {}
$redis.keys("stats/comments/wday/*").each do |k|
@comments_by_wday[k.split('/').last] = $redis.get(k).to_i
end

@comments_by_wday
end
end
51 changes: 8 additions & 43 deletions app/models/statistics/contents.rb
Expand Up @@ -69,51 +69,16 @@ def news_size
select_all "SELECT YEAR(created_at) AS year,ROUND(AVG(LENGTH(body)+LENGTH(second_part))) AS cnt FROM news GROUP BY year ORDER BY year"
end

def comments
return @comments if @comments
def contents_by_license
return @contents_by_license if @contents_by_license

@comments = contents_hash
by_type = select_all("SELECT content_type, COUNT(*) AS cnt FROM comments,nodes WHERE comments.node_id=nodes.id GROUP BY content_type")
by_type.each { |comment| @comments[comment["content_type"]] = comment["cnt"] }
@comments["Total"] = @comments.values.sum

@comments
end

def comments_by_year
return @comments_by_year if @comments_by_year

@comments_by_year = {}
$redis.keys("stats/comments/year/*").sort.each do |k|
_, _, _, year, type = k.split('/')
@comments_by_year[year] ||= contents_hash
@comments_by_year[year][type] = $redis.get(k).to_i
end

@comments_by_year
end

def comments_by_month
return @comments_by_month if @comments_by_month

@comments_by_month = {}
$redis.keys("stats/comments/month/*").sort.each do |k|
_, _, _, month, type = k.split('/')
@comments_by_month[month] ||= contents_hash
@comments_by_month[month][type] = $redis.get(k).to_i
end

@comments_by_month
end

def comments_by_day
return @comments_by_wday if @comments_by_wday

@comments_by_wday = {}
$redis.keys("stats/comments/wday/*").each do |k|
@comments_by_wday[k.split('/').last] = $redis.get(k).to_i
@contents_by_license = {}
entries = select_all "SELECT YEAR(created_at) AS year, content_type, ROUND(AVG(100*cc_licensed)) AS pct FROM nodes WHERE (content_type='News' OR content_type='Diary') GROUP BY year, content_type HAVING year>=2010 ORDER BY year, content_type;"
entries.each do |entry|
@contents_by_license[entry["year"]] ||= contents_hash
@contents_by_license[entry["year"]][entry["content_type"]] = entry["pct"]
end

@comments_by_wday
@contents_by_license
end
end
13 changes: 9 additions & 4 deletions app/models/statistics/moderation.rb
Expand Up @@ -45,24 +45,24 @@ def top_am
top_amr "AND (role='moderator' OR role='admin')"
end

def top_am_last_month
def top_am_x_days(nbdays)
select_all <<-EOS
SELECT login, user_id, cnt
FROM accounts
LEFT JOIN (
SELECT moderator_id, COUNT(*) AS cnt
FROM nodes
JOIN news ON nodes.content_id = news.id AND nodes.content_type='News'
WHERE nodes.created_at >= '#{31.days.ago.to_s :db}'
WHERE nodes.created_at >= '#{nbdays.days.ago.to_s :db}'
GROUP BY moderator_id
) AS j ON moderator_id = accounts.user_id
WHERE (role='moderator' OR role='admin')
ORDER BY LOWER(login) ASC
EOS
end

def nb_editions_last_month(user_id)
count "SELECT COUNT(*) AS cnt FROM news_versions WHERE user_id=#{user_id} AND created_at >= '#{31.days.ago.to_s :db}'"
def nb_editions_x_days(user_id,nbdays)
count "SELECT COUNT(*) AS cnt FROM news_versions WHERE user_id=#{user_id} AND created_at >= '#{nbdays.days.ago.to_s :db}'"
end

def nb_votes(login)
Expand All @@ -72,4 +72,9 @@ def nb_votes(login)
def nb_votes_last_month(login)
$redis.keys("users/#{login}/nb_votes/*").map {|k| $redis.get(k).to_i }.sum
end

def moderated_news(nbdays)
count "SELECT COUNT(*) AS cnt FROM news WHERE (state='published' OR state='refused') AND created_at >= '#{nbdays.days.ago.to_s :db}'"
end

end
10 changes: 9 additions & 1 deletion app/models/statistics/users.rb
Expand Up @@ -29,10 +29,18 @@ def no_visit
novisit = rows.first
end

def nb_authors
def nb_content_authors
select_all "SELECT COUNT(DISTINCT(accounts.user_id)) AS cnt, content_type FROM nodes JOIN accounts ON nodes.user_id = accounts.user_id WHERE current_sign_in_at > DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND role<>'inactive' GROUP BY content_type"
end

def nb_comment_authors
select_all "SELECT COUNT(DISTINCT(accounts.user_id)) AS cnt FROM comments JOIN accounts ON comments.user_id = accounts.user_id WHERE current_sign_in_at > DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND role<>'inactive';"
end

def nb_tag_authors
select_all "SELECT COUNT(DISTINCT(accounts.user_id)) AS cnt FROM taggings JOIN accounts ON taggings.user_id = accounts.user_id WHERE current_sign_in_at > DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND role<>'inactive';"
end

def filled(field)
count "SELECT COUNT(*) AS cnt FROM users JOIN accounts ON users.id = accounts.user_id WHERE #{field} IS NOT NULL AND #{field} != '' AND current_sign_in_at > DATE_SUB(CURDATE(),INTERVAL 90 DAY)"
end
Expand Down
84 changes: 84 additions & 0 deletions app/views/statistics/comments.html.haml
@@ -0,0 +1,84 @@
#comments.statistics
=h1 "Statistiques sur les commentaires"
- width_stats = 400

.body
%strong
Statistiques mises à jour le #{l Time.now}

- if @stats.comments["Total"] == 0
Aucun commentaire
- else
%ul
%li=link_to("par type","#type")
%li=link_to("par an","#annee")
%li=link_to("par mois","#mois")
%li=link_to("par jour de la semaine","#jour")

- if @stats.comments["Total"] > 1
%h2#type Répartition par type des #{@stats.comments["Total"]} commentaires
- else
%h2#type Répartition par type
%ul
%li #{@stats.comments["Diary"].to_i} dans les journaux
%li #{@stats.comments["Post"].to_i} dans les forums
%li #{@stats.comments["News"].to_i} dans les dépêches
%li #{@stats.comments["Tracker"].to_i} dans le système de suivi
%li #{@stats.comments["Poll"].to_i} dans les sondages
%li #{@stats.comments["WikiPage"].to_i} dans les pages de wiki

- if @stats.comments["Total"] > 1
%h2#annee Répartition annuelle des #{@stats.comments["Total"]} commentaires
- else
%h2#annee Répartition annuelle
%table
-maxval=@stats.comments_by_year.values.max {|a,b| a.values.max <=> b.values.max}.values.max
%tr
%th Année
%th Type
%th Commentaires
- @stats.comments_by_year.each do |year,comment|
- newyear=true
- comment.each do |type,cnt|
%tr
-if newyear==true
%td{'class'=>'stat','rowspan'=>comment.size()}= year
-newyear=false
%td
.stat(class="content#{type.downcase()}" style="width: 100px;") #{translate_content_type(type)}
%td
.stat(class="content#{type.downcase()}" style="width: #{(width_stats * cnt / maxval).to_i}px;")= cnt

- if @stats.comments["Total"] > 1
%h2#mois Répartition mensuelle des #{@stats.comments["Total"]} commentaires
- else
%h2#mois Répartition mensuelle
%table
-maxval=@stats.comments_by_month.values.max {|a,b| a.values.max <=> b.values.max}.values.max
%tr
%th Mois
%th Type
%th Commentaires
- @stats.comments_by_month.each do |month,comment|
- newyear=true
- comment.each do |type,cnt|
%tr
-if newyear==true
%td{'class'=>'stat','rowspan'=>comment.size()}= month.sub(/(\d{4})(\d{2})/, '\2 \1')
-newyear=false
%td
.stat(class="content#{type.downcase()}" style="width: 100px;") #{translate_content_type(type)}
%td
.stat(class="content#{type.downcase()}" style="width: #{(width_stats * cnt / maxval).to_i}px;")= cnt

%h2#jour Répartition des commentaires par jour de la semaine
- maxval = @stats.comments_by_day.values.max
%table
%tr
%th Jour
%th Nombre de commentaires
- @stats.comments_by_day.each do |day,cnt|
%tr
%td= day_name day
%td
.stat.misc(style="width: #{(width_stats * cnt / maxval).to_i}px;")= cnt

0 comments on commit fd03deb

Please sign in to comment.