FIX: Tags used only on deleted topics could not be used again

This commit is contained in:
Neil Lalonde 2016-10-28 15:11:43 -04:00
parent 1e4a56fe14
commit 8c9d390cac
3 changed files with 17 additions and 18 deletions

View File

@ -16,12 +16,12 @@ class TagsController < ::ApplicationController
.where("id in (?)", guardian.allowed_category_ids) .where("id in (?)", guardian.allowed_category_ids)
.preload(:tags) .preload(:tags)
category_tag_counts = categories.map do |c| category_tag_counts = categories.map do |c|
h = Tag.category_tags_by_count_query(c, limit: 300).count h = Tag.category_tags_by_count_query(c, limit: 300).count(Tag::COUNT_ARG)
h.merge!(c.tags.where.not(name: h.keys).inject({}) { |sum,t| sum[t.name] = 0; sum }) # unused tags h.merge!(c.tags.where.not(name: h.keys).inject({}) { |sum,t| sum[t.name] = 0; sum }) # unused tags
{id: c.id, tags: self.class.tag_counts_json(h)} {id: c.id, tags: self.class.tag_counts_json(h)}
end end
tag_counts = self.class.tags_by_count(guardian, limit: 300).count tag_counts = self.class.tags_by_count(guardian, limit: 300).count(Tag::COUNT_ARG)
@tags = self.class.tag_counts_json(tag_counts) @tags = self.class.tag_counts_json(tag_counts)
@description_meta = I18n.t("tags.title") @description_meta = I18n.t("tags.title")
@ -145,17 +145,7 @@ class TagsController < ::ApplicationController
} }
) )
tags = tags_with_counts.count.map {|t, c| { id: t, text: t, count: c } } tags = tags_with_counts.count(Tag::COUNT_ARG).map {|t, c| { id: t, text: t, count: c } }
unused_tags = DiscourseTagging.filter_allowed_tags(
Tag.where(topic_count: 0),
guardian,
{ for_input: params[:filterForInput], term: params[:q], category: category, selected_tags: params[:selected_tags] }
)
unused_tags.each do |t|
tags << { id: t.name, text: t.name, count: 0 }
end
json_response = { results: tags } json_response = { results: tags }

View File

@ -12,8 +12,17 @@ class Tag < ActiveRecord::Base
has_many :tag_group_memberships has_many :tag_group_memberships
has_many :tag_groups, through: :tag_group_memberships has_many :tag_groups, through: :tag_group_memberships
COUNT_ARG = "topic_tags.id"
# Apply more activerecord filters to the tags_by_count_query, and then
# fetch the result with .count(Tag::COUNT_ARG).
#
# e.g., Tag.tags_by_count_query.where("topics.category_id = ?", category.id).count(Tag::COUNT_ARG)
def self.tags_by_count_query(opts={}) def self.tags_by_count_query(opts={})
q = TopicTag.joins(:tag, :topic).group("topic_tags.tag_id, tags.name").order('count_all DESC') q = Tag.joins("LEFT JOIN topic_tags ON tags.id = topic_tags.tag_id")
.joins("LEFT JOIN topics ON topics.id = topic_tags.topic_id")
.group("tags.id, tags.name")
.order('count_topic_tags_id DESC')
q = q.limit(opts[:limit]) if opts[:limit] q = q.limit(opts[:limit]) if opts[:limit]
q q
end end
@ -37,7 +46,7 @@ class Tag < ActiveRecord::Base
category: category category: category
) )
tags.count.map {|name, _| name} tags.count(COUNT_ARG).map {|name, _| name}
end end
def self.include_tags? def self.include_tags?

View File

@ -17,7 +17,7 @@ describe Tag do
describe '#tags_by_count_query' do describe '#tags_by_count_query' do
it "returns empty hash if nothing is tagged" do it "returns empty hash if nothing is tagged" do
expect(described_class.tags_by_count_query.count).to eq({}) expect(described_class.tags_by_count_query.count(Tag::COUNT_ARG)).to eq({})
end end
context "with some tagged topics" do context "with some tagged topics" do
@ -31,13 +31,13 @@ describe Tag do
end end
it "returns tag names with topic counts in a hash" do it "returns tag names with topic counts in a hash" do
counts = described_class.tags_by_count_query.count counts = described_class.tags_by_count_query.count(Tag::COUNT_ARG)
expect(counts[@tags[0].name]).to eq(2) expect(counts[@tags[0].name]).to eq(2)
expect(counts[@tags[1].name]).to eq(1) expect(counts[@tags[1].name]).to eq(1)
end end
it "can be used to filter before doing the count" do it "can be used to filter before doing the count" do
counts = described_class.tags_by_count_query.where("topics.id = ?", @topics[1].id).count counts = described_class.tags_by_count_query.where("topics.id = ?", @topics[1].id).count(Tag::COUNT_ARG)
expect(counts).to eq({@tags[0].name => 1}) expect(counts).to eq({@tags[0].name => 1})
end end
end end