Collapse duplication in tag cloud model

This commit is contained in:
Katrina Owen 2013-02-28 21:30:36 -05:00
parent edc793e703
commit 447178bd7d
2 changed files with 27 additions and 39 deletions

View file

@ -552,15 +552,18 @@ class StatsController < ApplicationController
end end
def get_stats_tags def get_stats_tags
cloud = Stats::TagCloud.new(current_user, @cut_off_3months) cloud = Stats::TagCloud.new(current_user)
cloud.compute cloud.compute
@tags_for_cloud = cloud.tags @tags_for_cloud = cloud.tags
@tags_min = cloud.min @tags_min = cloud.min
@tags_divisor = cloud.divisor @tags_divisor = cloud.divisor
@tags_for_cloud_90days = cloud.tags_90days
@tags_min_90days = cloud.min_90days cloud = Stats::TagCloud.new(current_user, @cut_off_3months)
@tags_divisor_90days = cloud.divisor_90days cloud.compute
@tags_for_cloud_90days = cloud.tags
@tags_min_90days = cloud.min
@tags_divisor_90days = cloud.divisor
end end
def get_ids_from (actions, week_from, week_to, at_end) def get_ids_from (actions, week_from, week_to, at_end)

View file

@ -3,62 +3,47 @@
module Stats module Stats
class TagCloud class TagCloud
attr_reader :user, :cutoff, attr_reader :user, :cutoff, :levels,
:tags, :min, :divisor, :tags, :min, :divisor
:tags_90days, :min_90days, :divisor_90days def initialize(user, cutoff = nil)
def initialize(user, cutoff)
@user = user @user = user
@cutoff = cutoff @cutoff = cutoff
@levels = 10
end end
def compute def compute
levels=10 @tags = top_tags
# TODO: parameterize limit
# Get the tag cloud for all tags for actions
query = "SELECT tags.id, name, count(*) AS count"
query << " FROM taggings, tags, todos"
query << " WHERE tags.id = tag_id"
query << " AND taggings.taggable_id = todos.id"
query << " AND todos.user_id="+user.id.to_s+" "
query << " AND taggings.taggable_type='Todo' "
query << " GROUP BY tags.id, tags.name"
query << " ORDER BY count DESC, name"
query << " LIMIT 100"
@tags = Tag.find_by_sql(query).sort_by { |tag| tag.name.downcase }
max, @min = 0, 0 max, @min = 0, 0
@tags.each { |t| @tags.each { |t|
max = [t.count.to_i, max].max max = [t.count.to_i, max].max
@min = [t.count.to_i, @min].min @min = [t.count.to_i, @min].min
} }
@divisor = ((max - @min) / levels) + 1 @divisor = ((max - @min) / levels) + 1
end
# Get the tag cloud for all tags for actions private
def top_tags
params = [sql, user.id]
params += [cutoff, cutoff] if cutoff
Tag.find_by_sql(params).sort_by { |tag| tag.name.downcase }
end
def sql
# TODO: parameterize limit
query = "SELECT tags.id, tags.name AS name, count(*) AS count" query = "SELECT tags.id, tags.name AS name, count(*) AS count"
query << " FROM taggings, tags, todos" query << " FROM taggings, tags, todos"
query << " WHERE tags.id = tag_id" query << " WHERE tags.id = tag_id"
query << " AND todos.user_id=? " query << " AND todos.user_id=? "
query << " AND taggings.taggable_type='Todo' " query << " AND taggings.taggable_type='Todo' "
query << " AND taggings.taggable_id=todos.id " query << " AND taggings.taggable_id=todos.id "
if cutoff
query << " AND (todos.created_at > ? OR " query << " AND (todos.created_at > ? OR "
query << " todos.completed_at > ?) " query << " todos.completed_at > ?) "
end
query << " GROUP BY tags.id, tags.name" query << " GROUP BY tags.id, tags.name"
query << " ORDER BY count DESC, name" query << " ORDER BY count DESC, name"
query << " LIMIT 100" query << " LIMIT 100"
@tags_90days = Tag.find_by_sql(
[query, user.id, cutoff, cutoff]
).sort_by { |tag| tag.name.downcase }
max_90days, @min_90days = 0, 0
@tags_90days.each { |t|
max_90days = [t.count.to_i, max_90days].max
@min_90days = [t.count.to_i, @min_90days].min
}
@divisor_90days = ((max_90days - @min_90days) / levels) + 1
end end
end end