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