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