diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 index 07e0097b7c2..356a2b688ec 100644 --- a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -234,7 +234,7 @@ export default Em.Component.extend({ const contain_all_tags = this.get('searchedTerms.special.all_tags'); if (match.length !== 0) { - const join_char = contain_all_tags ? ',' : '|'; + const join_char = contain_all_tags ? '+' : ','; const existingInput = _.isArray(tags) ? tags.join(join_char) : tags; const userInput = match[0].replace(REGEXP_TAGS_REPLACE, ''); @@ -376,7 +376,7 @@ export default Em.Component.extend({ const contain_all_tags = this.get('searchedTerms.special.all_tags'); if (tagFilter && tagFilter.length !== 0) { - const join_char = contain_all_tags ? ',' : '|'; + const join_char = contain_all_tags ? '+' : ','; const tags = tagFilter.join(join_char); if (match.length !== 0) { diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs index b83baf1cc4c..e3ac643ec64 100644 --- a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -49,7 +49,7 @@ {{/if}} -
contain_all_tags +
diff --git a/lib/search.rb b/lib/search.rb index e9c0984f726..c75a1f38995 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -445,20 +445,19 @@ class Search end end - advanced_filter(/tags?:([a-zA-Z0-9,\-_|]+)/) do |posts, match| - if match.include?(',') - tags = match.split(",") + advanced_filter(/tags?:([a-zA-Z0-9,\-_+]+)/) do |posts, match| + if match.include?('+') + tags = match.split('+') - # TODO use ts_query function posts.where("topics.id IN ( - SELECT DISTINCT(tt.topic_id) + SELECT tt.topic_id FROM topic_tags tt, tags WHERE tt.tag_id = tags.id GROUP BY tt.topic_id - HAVING to_tsvector('simple',array_to_string(array_agg(tags.name), ' ')) @@ to_tsquery('simple', ?) + HAVING to_tsvector(#{query_locale}, array_to_string(array_agg(tags.name), ' ')) @@ to_tsquery(#{query_locale}, ?) )", tags.join('&')) else - tags = match.split("|") + tags = match.split(",") posts.where("topics.id IN ( SELECT DISTINCT(tt.topic_id) diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 2dd921ffd99..5e74b614838 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -694,34 +694,32 @@ describe Search do expect(Search.execute('this is a test #beta').posts.size).to eq(0) end - it "can find with tag" do - topic1 = Fabricate(:topic, title: 'Could not, would not, on a boat') - topic1.tags = [Fabricate(:tag, name: 'eggs'), Fabricate(:tag, name: 'ham')] - Fabricate(:post, topic: topic1) - post2 = Fabricate(:post, topic: topic1, raw: "It probably doesn't help that they're green...") - - expect(Search.execute('green tags:eggs').posts.map(&:id)).to eq([post2.id]) - expect(Search.execute('green tags:plants').posts.size).to eq(0) - end - context 'tags' do let(:tag1) { Fabricate(:tag, name: 'lunch') } let(:tag2) { Fabricate(:tag, name: 'eggs') } let(:topic1) { Fabricate(:topic, tags: [tag2, Fabricate(:tag)]) } - let(:topic2) { Fabricate(:topic, tags: [tag1]) } + let(:topic2) { Fabricate(:topic, tags: [tag2]) } let(:topic3) { Fabricate(:topic, tags: [tag1, tag2]) } let!(:post1) { Fabricate(:post, topic: topic1)} let!(:post2) { Fabricate(:post, topic: topic2)} let!(:post3) { Fabricate(:post, topic: topic3)} + it 'can find posts with tag' do + post4 = Fabricate(:post, topic: topic3, raw: "It probably doesn't help that they're green...") + + expect(Search.execute('green tags:eggs').posts.map(&:id)).to eq([post4.id]) + expect(Search.execute('tags:plants').posts.size).to eq(0) + end + it 'can find posts with any tag from multiple tags' do Fabricate(:post) - expect(Search.execute('tags:eggs|lunch').posts.map(&:id).sort).to eq([post1.id, post2.id, post3.id].sort) + expect(Search.execute('tags:eggs,lunch').posts.map(&:id).sort).to eq([post1.id, post2.id, post3.id].sort) end it 'can find posts which contains all provided tags' do - expect(Search.execute('tags:lunch,eggs').posts.map(&:id)).to eq([post3.id]) + expect(Search.execute('tags:lunch+eggs').posts.map(&:id)).to eq([post3.id]) + expect(Search.execute('tags:eggs+lunch').posts.map(&:id)).to eq([post3.id]) end end