From f16f90dd12174909c1f6337d1a9c766179060166 Mon Sep 17 00:00:00 2001
From: Bartek Wrona <wrona@syncad.com>
Date: Thu, 15 Oct 2020 22:31:08 +0200
Subject: [PATCH] Changes incorporated by
 https://gitlab.syncad.com/hive/hivemind/-/merge_requests/297 to develop,
 prepared to deployed branch.

---
 .../condenser_get_discussions_by_created.sql  | 62 ++++++++++++++++++
 .../condenser_get_discussions_by_hot.sql      | 62 ++++++++++++++++++
 .../condenser_get_discussions_by_promoted.sql | 63 +++++++++++++++++++
 .../condenser_get_discussions_by_trending.sql | 62 ++++++++++++++++++
 hive/server/condenser_api/get_state.py        |  2 +-
 hive/server/condenser_api/methods.py          | 20 ++++--
 6 files changed, 266 insertions(+), 5 deletions(-)

diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_created.sql b/hive/db/sql_scripts/condenser_get_discussions_by_created.sql
index 16d4b648a..c3a1d6c54 100644
--- a/hive/db/sql_scripts/condenser_get_discussions_by_created.sql
+++ b/hive/db/sql_scripts/condenser_get_discussions_by_created.sql
@@ -62,3 +62,65 @@ BEGIN
 END
 $function$
 language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_discussions_by_created_with_empty_tag;
+
+CREATE FUNCTION condenser_get_discussions_by_created_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+RETURNS SETOF bridge_api_post
+AS
+$function$
+DECLARE
+  __post_id INT;
+  __community VARCHAR;
+  __category_id INT;
+BEGIN
+
+  __post_id     = find_comment_id( _author, _permlink, True );
+  __community   = ( SELECT substring(_tag from '^hive-') );
+
+  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
+
+  RETURN QUERY SELECT
+      hp.id,
+      hp.author,
+      hp.parent_author,
+      hp.author_rep,
+      hp.root_title,
+      hp.beneficiaries,
+      hp.max_accepted_payout,
+      hp.percent_hbd,
+      hp.url,
+      hp.permlink,
+      hp.parent_permlink_or_category,
+      hp.title,
+      hp.body,
+      hp.category,
+      hp.depth,
+      hp.promoted,
+      hp.payout,
+      hp.pending_payout,
+      hp.payout_at,
+      hp.is_paidout,
+      hp.children,
+      hp.votes,
+      hp.created_at,
+      hp.updated_at,
+      hp.rshares,
+      hp.abs_rshares,
+      hp.json,
+      hp.is_hidden,
+      hp.is_grayed,
+      hp.total_votes,
+      hp.sc_trend,
+      hp.role_title,
+      hp.community_title,
+      hp.role_id,
+      hp.is_pinned,
+      hp.curator_payout_value
+    FROM hive_posts_view hp
+    WHERE ( __post_id = 0 OR hp.id < __post_id )
+          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( __category_id = 0 OR hp.category_id = __category_id ) ) )
+    ORDER BY hp.id DESC LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql b/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql
index 6e1dfb7de..981ff24fd 100644
--- a/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql
+++ b/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql
@@ -62,3 +62,65 @@ BEGIN
 END
 $function$
 language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_discussions_by_hot_with_empty_tag;
+
+CREATE FUNCTION condenser_get_discussions_by_hot_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+RETURNS SETOF bridge_api_post
+AS
+$function$
+DECLARE
+  __post_id INT;
+  __community VARCHAR;
+  __category_id INT;
+BEGIN
+
+  __post_id     = find_comment_id( _author, _permlink, True );
+  __community   = ( SELECT substring(_tag from '^hive-') );
+
+  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
+
+  RETURN QUERY SELECT
+      hp.id,
+      hp.author,
+      hp.parent_author,
+      hp.author_rep,
+      hp.root_title,
+      hp.beneficiaries,
+      hp.max_accepted_payout,
+      hp.percent_hbd,
+      hp.url,
+      hp.permlink,
+      hp.parent_permlink_or_category,
+      hp.title,
+      hp.body,
+      hp.category,
+      hp.depth,
+      hp.promoted,
+      hp.payout,
+      hp.pending_payout,
+      hp.payout_at,
+      hp.is_paidout,
+      hp.children,
+      hp.votes,
+      hp.created_at,
+      hp.updated_at,
+      hp.rshares,
+      hp.abs_rshares,
+      hp.json,
+      hp.is_hidden,
+      hp.is_grayed,
+      hp.total_votes,
+      hp.sc_trend,
+      hp.role_title,
+      hp.community_title,
+      hp.role_id,
+      hp.is_pinned,
+      hp.curator_payout_value
+    FROM hive_posts_view hp
+    WHERE hp.is_paidout = '0' AND ( __post_id = 0 OR hp.id < __post_id )
+          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( ( __category_id = 0 OR hp.category_id = __category_id ) AND hp.depth = 0 ) ) )
+    ORDER BY hp.sc_hot DESC, hp.id DESC LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql b/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql
index 8a4f4086f..d9afedb60 100644
--- a/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql
+++ b/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql
@@ -62,3 +62,66 @@ BEGIN
 END
 $function$
 language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_discussions_by_promoted_with_empty_tag;
+
+CREATE FUNCTION condenser_get_discussions_by_promoted_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+RETURNS SETOF bridge_api_post
+AS
+$function$
+DECLARE
+  __post_id INT;
+  __community VARCHAR;
+  __category_id INT;
+BEGIN
+
+  __post_id     = find_comment_id( _author, _permlink, True );
+  __community   = ( SELECT substring(_tag from '^hive-') );
+
+  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
+
+  RETURN QUERY SELECT
+      hp.id,
+      hp.author,
+      hp.parent_author,
+      hp.author_rep,
+      hp.root_title,
+      hp.beneficiaries,
+      hp.max_accepted_payout,
+      hp.percent_hbd,
+      hp.url,
+      hp.permlink,
+      hp.parent_permlink_or_category,
+      hp.title,
+      hp.body,
+      hp.category,
+      hp.depth,
+      hp.promoted,
+      hp.payout,
+      hp.pending_payout,
+      hp.payout_at,
+      hp.is_paidout,
+      hp.children,
+      hp.votes,
+      hp.created_at,
+      hp.updated_at,
+      hp.rshares,
+      hp.abs_rshares,
+      hp.json,
+      hp.is_hidden,
+      hp.is_grayed,
+      hp.total_votes,
+      hp.sc_trend,
+      hp.role_title,
+      hp.community_title,
+      hp.role_id,
+      hp.is_pinned,
+      hp.curator_payout_value
+    FROM hive_posts_view hp
+    INNER JOIN hive_post_tags hpt ON hpt.post_id = hp.id
+    WHERE hp.promoted > 0 AND ( __post_id = 0 OR hp.id < __post_id )
+          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( __category_id = 0 OR hp.category_id = __category_id ) ) )
+    ORDER BY hp.promoted DESC, hp.id DESC LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql b/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql
index 400837597..277e84508 100644
--- a/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql
+++ b/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql
@@ -62,3 +62,65 @@ BEGIN
 END
 $function$
 language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_discussions_by_trending_with_empty_tag;
+
+CREATE FUNCTION condenser_get_discussions_by_trending_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+RETURNS SETOF bridge_api_post
+AS
+$function$
+DECLARE
+  __post_id INT;
+  __community VARCHAR;
+  __category_id INT;
+BEGIN
+
+  __post_id     = find_comment_id( _author, _permlink, True );
+  __community   = ( SELECT substring(_tag from '^hive-') );
+
+  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
+
+  RETURN QUERY SELECT
+      hp.id,
+      hp.author,
+      hp.parent_author,
+      hp.author_rep,
+      hp.root_title,
+      hp.beneficiaries,
+      hp.max_accepted_payout,
+      hp.percent_hbd,
+      hp.url,
+      hp.permlink,
+      hp.parent_permlink_or_category,
+      hp.title,
+      hp.body,
+      hp.category,
+      hp.depth,
+      hp.promoted,
+      hp.payout,
+      hp.pending_payout,
+      hp.payout_at,
+      hp.is_paidout,
+      hp.children,
+      hp.votes,
+      hp.created_at,
+      hp.updated_at,
+      hp.rshares,
+      hp.abs_rshares,
+      hp.json,
+      hp.is_hidden,
+      hp.is_grayed,
+      hp.total_votes,
+      hp.sc_trend,
+      hp.role_title,
+      hp.community_title,
+      hp.role_id,
+      hp.is_pinned,
+      hp.curator_payout_value
+    FROM hive_posts_view hp
+    WHERE hp.is_paidout = '0' AND ( __post_id = 0 OR hp.id < __post_id )
+          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( ( __category_id = 0 OR hp.category_id = __category_id ) AND hp.depth = 0 ) ) )
+    ORDER BY hp.sc_trend DESC, hp.id DESC LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/server/condenser_api/get_state.py b/hive/server/condenser_api/get_state.py
index c4454d50d..269b59455 100644
--- a/hive/server/condenser_api/get_state.py
+++ b/hive/server/condenser_api/get_state.py
@@ -138,7 +138,7 @@ async def get_state(context, path: str):
         sort = valid_sort(part[0])
         tag = valid_tag(part[1].lower(), allow_empty=True)
         pids = await get_posts_by_given_sort(context, sort, '', '', 20, tag)
-        state['content'] = _keyed_posts(await load_posts(db, pids))
+        state['content'] = _keyed_posts(pids)
         state['discussion_idx'] = {tag: {sort: list(state['content'].keys())}}
         state['tag_idx'] = {'trending': await get_top_trending_tags_summary(context)}
 
diff --git a/hive/server/condenser_api/methods.py b/hive/server/condenser_api/methods.py
index 10b6b053e..f2e717d86 100644
--- a/hive/server/condenser_api/methods.py
+++ b/hive/server/condenser_api/methods.py
@@ -247,13 +247,25 @@ async def get_posts_by_given_sort(context, sort: str, start_author: str = '', st
     posts = []
    
     if sort == 'created':
-      sql = "SELECT * FROM condenser_get_discussions_by_created( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if tag == '':
+        sql = "SELECT * FROM condenser_get_discussions_by_created_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      else:
+        sql = "SELECT * FROM condenser_get_discussions_by_created( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'trending':
-      sql = "SELECT * FROM condenser_get_discussions_by_trending( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if tag == '':
+        sql = "SELECT * FROM condenser_get_discussions_by_trending_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      else:
+        sql = "SELECT * FROM condenser_get_discussions_by_trending( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'hot':
-      sql = "SELECT * FROM condenser_get_discussions_by_hot( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if tag == '':
+        sql = "SELECT * FROM condenser_get_discussions_by_hot_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      else:
+        sql = "SELECT * FROM condenser_get_discussions_by_hot( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'promoted':
-      sql = "SELECT * FROM condenser_get_discussions_by_promoted( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if tag == '':
+        sql = "SELECT * FROM condenser_get_discussions_by_promoted_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      else:
+        sql = "SELECT * FROM condenser_get_discussions_by_promoted( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'post_by_payout':
       sql = "SELECT * FROM condenser_get_post_discussions_by_payout( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'comment_by_payout':
-- 
GitLab