From beeb073dbe0d95b0dd38c91f8b129fc0039bd3a0 Mon Sep 17 00:00:00 2001 From: Benjamin Neff <benjamin@coding4coffee.ch> Date: Fri, 16 Feb 2018 01:42:47 +0100 Subject: [PATCH] Fix followed tags posts in stream for posts with multiple tags When there were posts with many followed tags they were returned multiple times, resulting in less than 15 unique posts. That resulted in some posts to be missed in the stream. Fixes #4503 closes #7715 --- Changelog.md | 1 + app/models/status_message.rb | 2 +- spec/models/status_message_spec.rb | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index e96ed8bed5..a1c9a5496f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,6 +8,7 @@ * Prevent duplicate mention notifications when the post is received twice [#7721](https://github.com/diaspora/diaspora/pull/7721) * Fixed a compatiblitiy issue with non-diaspora\* webfingers [#7718](https://github.com/diaspora/diaspora/pull/7718) * Don't retry federation for accounts without a valid public key [#7717](https://github.com/diaspora/diaspora/pull/7717) +* Fix stream generation for tagged posts with many followed tags [#7715](https://github.com/diaspora/diaspora/pull/7715) ## Features * Add basic html5 audio/video embedding support [#6418](https://github.com/diaspora/diaspora/pull/6418) diff --git a/app/models/status_message.rb b/app/models/status_message.rb index a44afca90a..17d267797f 100644 --- a/app/models/status_message.rb +++ b/app/models/status_message.rb @@ -46,7 +46,7 @@ class StatusMessage < Post end def self.public_tag_stream(tag_ids) - all_public.tag_stream(tag_ids) + all_public.select("DISTINCT #{table_name}.*").tag_stream(tag_ids) end def self.tag_stream(tag_ids) diff --git a/spec/models/status_message_spec.rb b/spec/models/status_message_spec.rb index 8dfca6f67e..bd9d809ce4 100644 --- a/spec/models/status_message_spec.rb +++ b/spec/models/status_message_spec.rb @@ -51,6 +51,14 @@ describe StatusMessage, type: :model do it "returns public status messages tagged with the tag" do expect(StatusMessage.public_tag_stream([@tag_id])).to eq([@status_message_1]) end + + it "returns a post with two tags only once" do + status_message = FactoryGirl.create(:status_message, text: "#hashtag #test", public: true) + test_tag_id = ActsAsTaggableOn::Tag.where(name: "test").first.id + + expect(StatusMessage.public_tag_stream([@tag_id, test_tag_id])) + .to match_array([@status_message_1, status_message]) + end end describe ".user_tag_stream" do -- GitLab