mirror of
https://github.com/TracksApp/tracks.git
synced 2026-03-01 18:40:15 +01:00
Separate query from cloud
This will make testing easier
This commit is contained in:
parent
8f42b25e68
commit
a81f5b76f3
3 changed files with 46 additions and 38 deletions
|
|
@ -3,11 +3,10 @@
|
|||
module Stats
|
||||
class TagCloud
|
||||
|
||||
attr_reader :user, :cutoff, :levels
|
||||
def initialize(user, cutoff = nil)
|
||||
@user = user
|
||||
@cutoff = cutoff
|
||||
attr_reader :levels, :tags
|
||||
def initialize(tags)
|
||||
@levels = 10
|
||||
@tags = tags.sort_by { |tag| tag.name.downcase }
|
||||
end
|
||||
|
||||
def empty?
|
||||
|
|
@ -18,10 +17,6 @@ module Stats
|
|||
(9 + 2*(tag.count.to_i-min)/divisor)
|
||||
end
|
||||
|
||||
def tags
|
||||
@tags ||= top_tags
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def max
|
||||
|
|
@ -39,33 +34,5 @@ module Stats
|
|||
def counts
|
||||
@counts ||= tags.map {|t| t.count.to_i}
|
||||
end
|
||||
|
||||
def top_tags
|
||||
Tag.find_by_sql(query_options).sort_by { |tag| tag.name.downcase }
|
||||
end
|
||||
|
||||
def query_options
|
||||
options = [sql, user.id]
|
||||
options += [cutoff, cutoff] if cutoff
|
||||
options
|
||||
end
|
||||
|
||||
def sql
|
||||
# TODO: parameterize limit
|
||||
query = "SELECT tags.id, tags.name AS name, count(*) AS count"
|
||||
query << " FROM taggings, tags, todos"
|
||||
query << " WHERE tags.id = tag_id"
|
||||
query << " AND todos.user_id=? "
|
||||
query << " AND taggings.taggable_type='Todo' "
|
||||
query << " AND taggings.taggable_id=todos.id "
|
||||
if cutoff
|
||||
query << " AND (todos.created_at > ? OR "
|
||||
query << " todos.completed_at > ?) "
|
||||
end
|
||||
query << " GROUP BY tags.id, tags.name"
|
||||
query << " ORDER BY count DESC, name"
|
||||
query << " LIMIT 100"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
|||
38
app/models/stats/tag_cloud_query.rb
Normal file
38
app/models/stats/tag_cloud_query.rb
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
module Stats
|
||||
class TagCloudQuery
|
||||
|
||||
attr_reader :user, :cutoff
|
||||
def initialize(user, cutoff = nil)
|
||||
@user = user
|
||||
@cutoff = cutoff
|
||||
end
|
||||
|
||||
def result
|
||||
Tag.find_by_sql(query_options)
|
||||
end
|
||||
|
||||
def query_options
|
||||
options = [sql, user.id]
|
||||
options += [cutoff, cutoff] if cutoff
|
||||
options
|
||||
end
|
||||
|
||||
def sql
|
||||
# TODO: parameterize limit
|
||||
query = "SELECT tags.id, tags.name AS name, count(*) AS count"
|
||||
query << " FROM taggings, tags, todos"
|
||||
query << " WHERE tags.id = tag_id"
|
||||
query << " AND todos.user_id=? "
|
||||
query << " AND taggings.taggable_type='Todo' "
|
||||
query << " AND taggings.taggable_id=todos.id "
|
||||
if cutoff
|
||||
query << " AND (todos.created_at > ? OR "
|
||||
query << " todos.completed_at > ?) "
|
||||
end
|
||||
query << " GROUP BY tags.id, tags.name"
|
||||
query << " ORDER BY count DESC, name"
|
||||
query << " LIMIT 100"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue