From 6619ece6176271d7fa2c6782b97d9901223dcea5 Mon Sep 17 00:00:00 2001
From: mtrela <mtrela@syncad.com>
Date: Tue, 3 Nov 2020 11:26:07 +0100
Subject: [PATCH] Introduced `condenser_get_discussions_by_comments` SQL
 function

---
 hive/db/schema.py                             |  3 +-
 .../condenser_get_discussions_by_comments.sql | 64 ++++++++++++++++++
 hive/server/condenser_api/methods.py          | 66 +------------------
 hive/server/hive_api/public.py                |  2 +-
 4 files changed, 70 insertions(+), 65 deletions(-)
 create mode 100644 hive/db/sql_scripts/condenser_get_discussions_by_comments.sql

diff --git a/hive/db/schema.py b/hive/db/schema.py
index 40460ad3d..6ec207788 100644
--- a/hive/db/schema.py
+++ b/hive/db/schema.py
@@ -589,7 +589,8 @@ def setup(db):
       "condenser_get_follow_counts.sql",
       "condenser_get_names_by_followers.sql",
       "condenser_get_names_by_following.sql",
-      "condenser_get_names_by_reblogged.sql"
+      "condenser_get_names_by_reblogged.sql",
+      "condenser_get_discussions_by_comments.sql"
 
     ]
     from os.path import dirname, realpath
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_comments.sql b/hive/db/sql_scripts/condenser_get_discussions_by_comments.sql
new file mode 100644
index 000000000..2da2db5b8
--- /dev/null
+++ b/hive/db/sql_scripts/condenser_get_discussions_by_comments.sql
@@ -0,0 +1,64 @@
+DROP FUNCTION IF EXISTS condenser_get_discussions_by_comments;
+
+CREATE OR REPLACE FUNCTION condenser_get_discussions_by_comments(
+  in _author VARCHAR,
+  in _permlink VARCHAR,
+  in _limit INTEGER
+)
+RETURNS SETOF bridge_api_post
+AS
+$function$
+DECLARE
+  __post_id INTEGER := 0;
+BEGIN
+
+  IF _permlink <> '' THEN
+    __post_id = find_comment_id( _author, _permlink, True );
+  END IF;
+
+  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.author = _author AND hp.depth > 0 AND ( ( __post_id = 0 ) OR ( hp.id <= __post_id ) )
+    ORDER BY hp.id DESC, hp.depth
+    LIMIT _limit;
+
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/server/condenser_api/methods.py b/hive/server/condenser_api/methods.py
index 1afd95d41..6d1a8e22d 100644
--- a/hive/server/condenser_api/methods.py
+++ b/hive/server/condenser_api/methods.py
@@ -20,51 +20,6 @@ from hive.server.hive_api.public import get_by_feed_with_reblog_impl
 
 # pylint: disable=too-many-arguments,line-too-long,too-many-lines
 
-SQL_TEMPLATE = """
-    SELECT
-        hp.id,
-        hp.author,
-        hp.permlink,
-        hp.author_rep,
-        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.net_votes,
-        hp.total_vote_weight,
-        hp.parent_author,
-        hp.parent_permlink_or_category,
-        hp.curator_payout_value,
-        hp.root_author,
-        hp.root_permlink,
-        hp.max_accepted_payout,
-        hp.percent_hbd,
-        hp.allow_replies,
-        hp.allow_votes,
-        hp.allow_curation_rewards,
-        hp.beneficiaries,
-        hp.url,
-        hp.root_title,
-        hp.active,
-        hp.author_rewards
-    FROM hive_posts_view hp
-"""
-
 @return_error_info
 async def get_account_votes(context, account):
     """Return an info message about get_acccount_votes being unsupported."""
@@ -370,7 +325,6 @@ async def get_discussions_by_feed(context, tag: str = None, start_author: str =
         valid_limit(limit, 100, 20),
         truncate_body)
 
-
 @return_error_info
 @nested_query_compat
 async def get_discussions_by_comments(context, start_author: str = None, start_permlink: str = '',
@@ -383,25 +337,11 @@ async def get_discussions_by_comments(context, start_author: str = None, start_p
     valid_permlink(start_permlink, allow_empty=True)
     valid_limit(limit, 100, 20)
 
-    #force copy
-    sql = str(SQL_TEMPLATE)
-    sql += """
-        WHERE
-            hp.author = :start_author AND hp.depth > 0
-    """
-
-    if start_permlink:
-        sql += """
-            AND hp.id <= (SELECT hive_posts.id FROM  hive_posts WHERE author_id = (SELECT id FROM hive_accounts WHERE name = :start_author) AND permlink_id = (SELECT id FROM hive_permlink_data WHERE permlink = :start_permlink))
-        """
-
-    sql += """
-        ORDER BY hp.id DESC, hp.depth LIMIT :limit
-    """
-
     posts = []
     db = context['db']
-    result = await db.query_all(sql, start_author=start_author, start_permlink=start_permlink, limit=limit)
+
+    sql = " SELECT * FROM condenser_get_discussions_by_comments( '{}', '{}', {} ) ".format( start_author, start_permlink, limit )
+    result = await db.query_all(sql)
 
     for row in result:
         row = dict(row)
diff --git a/hive/server/hive_api/public.py b/hive/server/hive_api/public.py
index bdbdd95d8..f6415604c 100644
--- a/hive/server/hive_api/public.py
+++ b/hive/server/hive_api/public.py
@@ -83,7 +83,7 @@ async def get_info(context):
 
 async def get_by_feed_with_reblog_impl(db, account: str, start_author: str = '',
                                    start_permlink: str = '', limit: int = 20, truncate_body: int = 0):
-    """Get a list of [post_id, reblogged_by_str] for an account's feed."""
+    """Get a list of posts for an account's feed."""
     sql = " SELECT * FROM condenser_get_by_feed_with_reblog( '{}', '{}', '{}', {} ) ".format( account, start_author, start_permlink, limit )
     result = await db.query_all(sql)
 
-- 
GitLab