From 627df9343b60bbae4c6774b6c887e1349874dc85 Mon Sep 17 00:00:00 2001
From: jsalyers <jsalyers@syncad.com>
Date: Thu, 12 Nov 2020 16:02:04 -0500
Subject: [PATCH] [JES] One more test, but I think this is what I was needing
 to keep the query from slowing down while checking mutes

---
 hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql | 2 +-
 hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql | 3 ++-
 hive/server/bridge_api/methods.py                      | 8 ++++----
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql b/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql
index 7ec629d6d..bc6975480 100644
--- a/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql
+++ b/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql
@@ -56,7 +56,7 @@ BEGIN
       LIMIT _limit
   ) as created
   JOIN hive_posts_view hp ON hp.id = created.id
-  WHERE (CASE WHEN _observer <> '' THEN hp.author NOT IN (SELECT muted FROM muted_accounts_view WHERE observer = _observer) ELSE True END)
+  WHERE (CASE WHEN _observer <> '' THEN NOT EXISTS (SELECT 1 FROM muted_accounts_view WHERE observer = _observer AND muted = hp.author) ELSE True END)
   ORDER BY created.id DESC
   LIMIT _limit;
 END
diff --git a/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql b/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql
index ddbea0528..ef70f48d6 100644
--- a/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql
+++ b/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql
@@ -1,5 +1,5 @@
 DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_created_for_tag;
-CREATE FUNCTION bridge_get_ranked_post_by_created_for_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+CREATE FUNCTION bridge_get_ranked_post_by_created_for_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _observer VARCHAR )
 RETURNS SETOF bridge_api_post
 AS
 $function$
@@ -56,6 +56,7 @@ BEGIN
           JOIN hive_posts hp1 ON hp1.id = hpt.post_id
           JOIN hive_accounts_view ha ON hp1.author_id = ha.id
       WHERE hpt.tag_id = __hive_tag AND hp1.counter_deleted = 0 AND hp1.depth = 0 AND NOT ha.is_grayed AND ( __post_id = 0 OR hp1.id < __post_id )
+      AND (CASE WHEN _observer <> '' THEN NOT EXISTS (SELECT 1 FROM muted_accounts_view WHERE observer = _observer AND muted = hp.author) ELSE true END
       --ORDER BY hp1.id + 0 DESC -- this workaround helped the query to better choose indexes, but after some time it started to significally slow down
       ORDER BY hp1.id DESC
       LIMIT _limit
diff --git a/hive/server/bridge_api/methods.py b/hive/server/bridge_api/methods.py
index 6f65769a3..9d9583df5 100644
--- a/hive/server/bridge_api/methods.py
+++ b/hive/server/bridge_api/methods.py
@@ -151,9 +151,9 @@ async def _get_ranked_posts_for_communities( db, sort:str, community, start_auth
 
 
 @return_error_info
-async def _get_ranked_posts_for_tag( db, sort:str, tag, start_author:str, start_permlink:str, limit):
+async def _get_ranked_posts_for_tag( db, sort:str, tag, start_author:str, start_permlink:str, limit, observer:str=None):
     async def execute_tags_query(db, sql, limit):
-        return await db.query_all(sql, tag=tag, author=start_author, permlink=start_permlink, limit=limit )
+        return await db.query_all(sql, tag=tag, author=start_author, permlink=start_permlink, limit=limit, observer=observer )
 
     if sort == 'hot':
         sql = "SELECT * FROM bridge_get_ranked_post_by_hot_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
@@ -180,7 +180,7 @@ async def _get_ranked_posts_for_tag( db, sort:str, tag, start_author:str, start_
         return await execute_tags_query(db, sql, limit)
 
     if sort == 'created':
-        sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, (:observer)::VARCHAR )"
         return await execute_tags_query(db, sql, limit)
 
     assert False, "Unknown sort order"
@@ -256,7 +256,7 @@ async def get_ranked_posts(context, sort:str, start_author:str='', start_permlin
         return await process_query_results(result)
 
     if ( tag and tag != "all" ):
-        result = await _get_ranked_posts_for_tag(db, sort, tag, start_author, start_permlink, limit)
+        result = await _get_ranked_posts_for_tag(db, sort, tag, start_author, start_permlink, limit, observer)
         return await process_query_results(result)
 
     result = await _get_ranked_posts_for_all(db, sort, start_author, start_permlink, limit, observer)
-- 
GitLab