diff --git a/hive/db/schema.py b/hive/db/schema.py index c1388fdead1f655dcd59baab755f6fee2a4b8402..08718053185e5aa3c4db9912fca57d0a518fed8e 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -588,14 +588,10 @@ def setup(db): "condenser_api_post_ex_type.sql", "condenser_get_blog.sql", "condenser_get_content.sql", - "condenser_get_discussions_by_created.sql", "condenser_get_discussions_by_blog.sql", + "condenser_tags.sql", + "condenser_follows.sql", "hot_and_trends.sql", - "condenser_get_discussions_by_trending.sql", - "condenser_get_discussions_by_hot.sql", - "condenser_get_discussions_by_promoted.sql", - "condenser_get_post_discussions_by_payout.sql", - "condenser_get_comment_discussions_by_payout.sql", "update_hive_posts_children_count.sql", "update_hive_posts_api_helper.sql", "database_api_list_comments.sql", @@ -608,9 +604,6 @@ def setup(db): "condenser_get_by_feed_with_reblog.sql", "condenser_get_by_blog.sql", "bridge_get_account_posts_by_blog.sql", - "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_discussions_by_comments.sql", "condenser_get_account_reputations.sql" 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 556749d787afac9ff0467144e644a1aae32b5e2d..39585907eb734b6d9ef9b39e1544d7048b57ce4e 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 @@ -270,7 +270,7 @@ $function$ language plpgsql STABLE; DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout; -CREATE FUNCTION bridge_get_ranked_post_by_payout( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT ) +CREATE FUNCTION bridge_get_ranked_post_by_payout( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN ) RETURNS SETOF bridge_api_post AS $function$ @@ -328,7 +328,8 @@ BEGIN , ( hp1.payout + hp1.pending_payout ) as all_payout FROM hive_posts hp1 - WHERE hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours' + WHERE hp1.counter_deleted = 0 AND NOT hp1.is_paidout + AND ( ( NOT _bridge_api AND hp1.depth = 0 ) OR ( _bridge_api AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours' ) ) AND ( __post_id = 0 OR ( hp1.payout + hp1.pending_payout ) < __payout_limit OR ( ( hp1.payout + hp1.pending_payout ) = __payout_limit AND hp1.id < __post_id ) ) ORDER BY ( hp1.payout + hp1.pending_payout ) DESC, hp1.id DESC LIMIT _limit diff --git a/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql b/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql index 58a167d8cfb6a44f6d5eee79f43aa966a52db4b3..147377f89dba7dbae03f9361ede4c8f9796fa430 100644 --- a/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql +++ b/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql @@ -50,7 +50,7 @@ $function$ language sql STABLE; DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_trends_for_community; -CREATE FUNCTION bridge_get_ranked_post_by_trends_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT ) +CREATE FUNCTION bridge_get_ranked_post_by_trends_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN ) RETURNS SETOF bridge_api_post AS $function$ @@ -107,7 +107,8 @@ BEGIN FROM hive_posts hp1 JOIN hive_communities hc ON hp1.community_id = hc.id - WHERE hc.name = _community AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.depth = 0 AND NOT hp1.is_pinned -- concatenated with bridge_get_ranked_post_pinned_for_community + WHERE hc.name = _community AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.depth = 0 + AND ( NOT _bridge_api OR NOT hp1.is_pinned ) -- concatenated with bridge_get_ranked_post_pinned_for_community when called for bridge_api AND ( __post_id = 0 OR hp1.sc_trend < __trending_limit OR ( hp1.sc_trend = __trending_limit AND hp1.id < __post_id ) ) ORDER BY hp1.sc_trend DESC, hp1.id DESC LIMIT _limit @@ -473,7 +474,7 @@ $function$ language plpgsql STABLE; DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_created_for_community; -CREATE FUNCTION bridge_get_ranked_post_by_created_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT ) +CREATE FUNCTION bridge_get_ranked_post_by_created_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN ) RETURNS SETOF bridge_api_post AS $function$ @@ -526,7 +527,8 @@ BEGIN hive_posts hp1 JOIN hive_communities hc ON hp1.community_id = hc.id JOIN hive_accounts_view ha ON hp1.author_id = ha.id - WHERE hc.name = _community AND hp1.counter_deleted = 0 AND hp1.depth = 0 AND NOT hp1.is_pinned -- concatenated with bridge_get_ranked_post_pinned_for_community + WHERE hc.name = _community AND hp1.counter_deleted = 0 AND hp1.depth = 0 + AND ( NOT _bridge_api OR NOT hp1.is_pinned ) -- concatenated with bridge_get_ranked_post_pinned_for_community when called for bridge_api AND NOT ha.is_grayed AND ( __post_id = 0 OR hp1.id < __post_id ) ORDER BY hp1.id DESC LIMIT _limit 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 820f36aeae22f8020241218e96059a10a92359bc..bb8b49d344fe469d530e9078c34eae3080568a5b 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 @@ -283,7 +283,7 @@ $function$ language plpgsql STABLE; DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_for_category; -CREATE FUNCTION bridge_get_ranked_post_by_payout_for_category( in _category VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT ) +CREATE FUNCTION bridge_get_ranked_post_by_payout_for_category( in _category VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN ) RETURNS SETOF bridge_api_post AS $function$ @@ -343,7 +343,8 @@ BEGIN , ( hp1.payout + hp1.pending_payout ) as all_payout FROM hive_posts hp1 - WHERE hp1.category_id = __hive_category AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours' + WHERE hp1.category_id = __hive_category AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout + AND ( ( NOT _bridge_api AND hp1.depth = 0 ) OR ( _bridge_api AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours' ) ) AND ( __post_id = 0 OR ( hp1.payout + hp1.pending_payout ) < __payout_limit OR ( ( hp1.payout + hp1.pending_payout ) = __payout_limit AND hp1.id < __post_id ) ) ORDER BY ( hp1.payout + hp1.pending_payout ) DESC, hp1.id DESC LIMIT _limit diff --git a/hive/db/sql_scripts/condenser_follows.sql b/hive/db/sql_scripts/condenser_follows.sql new file mode 100644 index 0000000000000000000000000000000000000000..fbfa033f28006311dca9c04c508d6e21a2d61994 --- /dev/null +++ b/hive/db/sql_scripts/condenser_follows.sql @@ -0,0 +1,71 @@ +DROP FUNCTION IF EXISTS condenser_get_follow_count; +CREATE FUNCTION condenser_get_follow_count( in _account VARCHAR, + out following hive_accounts.following%TYPE, out followers hive_accounts.followers%TYPE ) +AS +$function$ +DECLARE + __account_id INT; +BEGIN + __account_id = find_account_id( _account, True ); + SELECT ha.following, ha.followers INTO following, followers FROM hive_accounts ha WHERE ha.id = __account_id; + -- following equals (SELECT COUNT(*) FROM hive_follows WHERE state = 1 AND following = __account_id) + -- followers equals (SELECT COUNT(*) FROM hive_follows WHERE state = 1 AND follower = __account_id) +END +$function$ +language plpgsql STABLE; + +DROP FUNCTION IF EXISTS condenser_get_followers; +-- list of account names that follow/ignore given account +CREATE FUNCTION condenser_get_followers( in _account VARCHAR, in _start VARCHAR, in _type INT, in _limit INT ) +RETURNS SETOF hive_accounts.name%TYPE +AS +$function$ +DECLARE + __account_id INT; + __start_id INT; +BEGIN + __account_id = find_account_id( _account, True ); + __start_id = find_account_id( _start, _start <> '' ); + IF __start_id <> 0 THEN + SELECT INTO __start_id COALESCE( ( SELECT id FROM hive_follows WHERE following = __account_id AND follower = __start_id ), 0 ); + END IF; + RETURN QUERY SELECT + ha.name + FROM + hive_follows hf + JOIN hive_accounts ha ON hf.follower = ha.id + WHERE + hf.following = __account_id AND hf.state = _type AND ( __start_id = 0 OR hf.id < __start_id ) + ORDER BY hf.id DESC + LIMIT _limit; +END +$function$ +language plpgsql STABLE; + +DROP FUNCTION IF EXISTS condenser_get_following; +-- list of account names followed/ignored by given account +CREATE FUNCTION condenser_get_following( in _account VARCHAR, in _start VARCHAR, in _type INT, in _limit INT ) +RETURNS SETOF hive_accounts.name%TYPE +AS +$function$ +DECLARE + __account_id INT; + __start_id INT; +BEGIN + __account_id = find_account_id( _account, True ); + __start_id = find_account_id( _start, _start <> '' ); + IF __start_id <> 0 THEN + SELECT INTO __start_id COALESCE( ( SELECT id FROM hive_follows WHERE follower = __account_id AND following = __start_id ), 0 ); + END IF; + RETURN QUERY SELECT + ha.name + FROM + hive_follows hf + JOIN hive_accounts ha ON hf.following = ha.id + WHERE + hf.follower = __account_id AND hf.state = _type AND ( __start_id = 0 OR hf.id < __start_id ) + ORDER BY hf.id DESC + LIMIT _limit; +END +$function$ +language plpgsql STABLE; diff --git a/hive/db/sql_scripts/condenser_get_comment_discussions_by_payout.sql b/hive/db/sql_scripts/condenser_get_comment_discussions_by_payout.sql deleted file mode 100644 index 4052a096594f89fd37a5ad3d7d013da13dba8ac2..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_comment_discussions_by_payout.sql +++ /dev/null @@ -1,55 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_comment_discussions_by_payout; - -CREATE FUNCTION condenser_get_comment_discussions_by_payout( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT ) -RETURNS SETOF bridge_api_post -AS -$function$ -DECLARE - __post_id INT; - __category_id INT; -BEGIN - __post_id = find_comment_id( _author, _permlink, True ); - __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 hp.depth > 0 AND ( __category_id = 0 OR hp.category_id = __category_id ) - ORDER BY (hp.payout+hp.pending_payout) DESC, hp.id DESC LIMIT _limit; -END -$function$ -language plpgsql STABLE; diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_created.sql b/hive/db/sql_scripts/condenser_get_discussions_by_created.sql deleted file mode 100644 index c3a1d6c543e6549962f24b39d8485c73fce83f86..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_discussions_by_created.sql +++ /dev/null @@ -1,126 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_discussions_by_created; - -CREATE FUNCTION condenser_get_discussions_by_created( 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; - __tag_id INT; - __category_id INT; -BEGIN - - __post_id = find_comment_id( _author, _permlink, True ); - __community = ( SELECT substring(_tag from '^hive-') ); - - __tag_id = ( SELECT id FROM hive_tag_data WHERE tag = _tag ); - __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 ( __tag_id = 0 OR hpt.tag_id = __tag_id ) 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.id DESC LIMIT _limit; -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 deleted file mode 100644 index 981ff24fdb70f8bed492f210231f2340ccfc90dd..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql +++ /dev/null @@ -1,126 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_discussions_by_hot; - -CREATE FUNCTION condenser_get_discussions_by_hot( 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; - __tag_id INT; - __category_id INT; -BEGIN - - __post_id = find_comment_id( _author, _permlink, True ); - __community = ( SELECT substring(_tag from '^hive-') ); - - __tag_id = ( SELECT id FROM hive_tag_data WHERE tag = _tag ); - __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.is_paidout = '0' AND ( __tag_id = 0 OR hpt.tag_id = __tag_id ) 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; - -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 deleted file mode 100644 index d9afedb60212cfeab6ee78d59427bc2a2ae9db22..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql +++ /dev/null @@ -1,127 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_discussions_by_promoted; - -CREATE FUNCTION condenser_get_discussions_by_promoted( 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; - __tag_id INT; - __category_id INT; -BEGIN - - __post_id = find_comment_id( _author, _permlink, True ); - __community = ( SELECT substring(_tag from '^hive-') ); - - __tag_id = ( SELECT id FROM hive_tag_data WHERE tag = _tag ); - __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 ( __tag_id = 0 OR hpt.tag_id = __tag_id ) 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; - -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 deleted file mode 100644 index 277e845083349a2c11365d2937fba8880e10aa33..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql +++ /dev/null @@ -1,126 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_discussions_by_trending; - -CREATE FUNCTION condenser_get_discussions_by_trending( 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; - __tag_id INT; - __category_id INT; -BEGIN - - __post_id = find_comment_id( _author, _permlink, True ); - __community = ( SELECT substring(_tag from '^hive-') ); - - __tag_id = ( SELECT id FROM hive_tag_data WHERE tag = _tag ); - __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.is_paidout = '0' AND ( __tag_id = 0 OR hpt.tag_id = __tag_id ) 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; - -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/db/sql_scripts/condenser_get_follow_counts.sql b/hive/db/sql_scripts/condenser_get_follow_counts.sql deleted file mode 100644 index b6db581b5842c595ff8b04cc5070e12c838b4b63..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_follow_counts.sql +++ /dev/null @@ -1,20 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_follow_counts; - -CREATE FUNCTION condenser_get_follow_counts( in _account VARCHAR ) -RETURNS TABLE( - following hive_accounts.following%TYPE, - followers hive_accounts.followers%TYPE -) -AS -$function$ -DECLARE -BEGIN - - RETURN QUERY SELECT - ha.following, ha.followers - FROM hive_accounts ha - WHERE ha.name = _account; - -END -$function$ -language plpgsql STABLE; diff --git a/hive/db/sql_scripts/condenser_get_names_by_followers.sql b/hive/db/sql_scripts/condenser_get_names_by_followers.sql deleted file mode 100644 index 530a06c5c6550ceb22d43cca608a969c8587002c..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_names_by_followers.sql +++ /dev/null @@ -1,38 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_names_by_followers; - -CREATE FUNCTION condenser_get_names_by_followers( in _account VARCHAR, in _start_account VARCHAR, in _state SMALLINT, _limit SMALLINT ) -RETURNS TABLE( - names hive_accounts.name%TYPE -) -AS -$function$ -DECLARE - __account_id INT := find_account_id( _account, True ); - __start_account_id INT := 0; - __created_at TIMESTAMP; -BEGIN - - IF _start_account <> '' THEN - __start_account_id = find_account_id( _start_account, True ); - END IF; - - IF __start_account_id <> 0 THEN - SELECT hf.created_at - INTO __created_at - FROM hive_follows hf - WHERE hf.following = __account_id AND hf.follower = __start_account_id; - END IF; - - RETURN QUERY SELECT - name - FROM hive_follows hf - LEFT JOIN hive_accounts ha ON hf.follower = ha.id - WHERE hf.following = __account_id - AND state = _state - AND ( __start_account_id = 0 OR hf.created_at <= __created_at ) - ORDER BY hf.created_at DESC - LIMIT _limit; - -END -$function$ -language plpgsql STABLE; diff --git a/hive/db/sql_scripts/condenser_get_names_by_following.sql b/hive/db/sql_scripts/condenser_get_names_by_following.sql deleted file mode 100644 index 1b7f48a00e6f6532ce016185899622938060162c..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_names_by_following.sql +++ /dev/null @@ -1,38 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_names_by_following; - -CREATE FUNCTION condenser_get_names_by_following( in _account VARCHAR, in _start_account VARCHAR, in _state SMALLINT, _limit SMALLINT ) -RETURNS TABLE( - names hive_accounts.name%TYPE -) -AS -$function$ -DECLARE - __account_id INT := find_account_id( _account, True ); - __start_account_id INT := 0; - __created_at TIMESTAMP; -BEGIN - - IF _start_account <> '' THEN - __start_account_id = find_account_id( _start_account, True ); - END IF; - - IF __start_account_id <> 0 THEN - SELECT hf.created_at - INTO __created_at - FROM hive_follows hf - WHERE hf.follower = __account_id AND hf.following = __start_account_id; - END IF; - - RETURN QUERY SELECT - name - FROM hive_follows hf - LEFT JOIN hive_accounts ha ON hf.following = ha.id - WHERE hf.follower = __account_id - AND state = _state - AND ( __start_account_id = 0 OR hf.created_at <= __created_at ) - ORDER BY hf.created_at DESC - LIMIT _limit; - -END -$function$ -language plpgsql STABLE; diff --git a/hive/db/sql_scripts/condenser_get_post_discussions_by_payout.sql b/hive/db/sql_scripts/condenser_get_post_discussions_by_payout.sql deleted file mode 100644 index 4996aaa81a78874cede434a1db0a0f0e2d80af62..0000000000000000000000000000000000000000 --- a/hive/db/sql_scripts/condenser_get_post_discussions_by_payout.sql +++ /dev/null @@ -1,55 +0,0 @@ -DROP FUNCTION IF EXISTS condenser_get_post_discussions_by_payout; - -CREATE FUNCTION condenser_get_post_discussions_by_payout( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT ) -RETURNS SETOF bridge_api_post -AS -$function$ -DECLARE - __post_id INT; - __category_id INT; -BEGIN - __post_id = find_comment_id( _author, _permlink, True ); - __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 hp.depth = 0 AND ( __category_id = 0 OR hp.category_id = __category_id ) - ORDER BY (hp.payout+hp.pending_payout) DESC, hp.id DESC LIMIT _limit; -END -$function$ -language plpgsql STABLE; diff --git a/hive/db/sql_scripts/condenser_tags.sql b/hive/db/sql_scripts/condenser_tags.sql new file mode 100644 index 0000000000000000000000000000000000000000..0812832b4b04ef8eccef4f6aed217d057a893915 --- /dev/null +++ b/hive/db/sql_scripts/condenser_tags.sql @@ -0,0 +1,50 @@ +DROP FUNCTION IF EXISTS condenser_get_top_trending_tags_summary; +CREATE FUNCTION condenser_get_top_trending_tags_summary( in _limit INT ) +RETURNS SETOF VARCHAR +AS +$function$ +BEGIN + RETURN QUERY SELECT + hcd.category + FROM + hive_category_data hcd + JOIN hive_posts hp ON hp.category_id = hcd.id + WHERE hp.counter_deleted = 0 AND NOT hp.is_paidout + GROUP BY hcd.category + ORDER BY SUM(hp.payout + hp.pending_payout) DESC + LIMIT _limit; +END +$function$ +language plpgsql STABLE; + +DROP FUNCTION IF EXISTS condenser_get_trending_tags; +CREATE FUNCTION condenser_get_trending_tags( in _category VARCHAR, in _limit INT ) +RETURNS TABLE( category VARCHAR, total_posts BIGINT, top_posts BIGINT, total_payouts hive_posts.payout%TYPE ) +AS +$function$ +DECLARE + __category_id INT; + __payout_limit hive_posts.payout%TYPE; +BEGIN + __category_id = find_category_id( _category, _category <> '' ); + IF __category_id <> 0 THEN + SELECT SUM(hp.payout + hp.pending_payout) INTO __payout_limit + FROM hive_posts hp + WHERE hp.category_id = __category_id AND hp.counter_deleted = 0 AND NOT hp.is_paidout; + END IF; + RETURN QUERY SELECT + hcd.category, + COUNT(*) AS total_posts, + SUM(CASE WHEN hp.depth = 0 THEN 1 ELSE 0 END) AS top_posts, + SUM(hp.payout + hp.pending_payout) AS total_payouts + FROM + hive_posts hp + JOIN hive_category_data hcd ON hcd.id = hp.category_id + WHERE NOT hp.is_paidout AND counter_deleted = 0 + GROUP BY hcd.category + HAVING __category_id = 0 OR SUM(hp.payout + hp.pending_payout) < __payout_limit OR ( SUM(hp.payout + hp.pending_payout) = __payout_limit AND hcd.category > _category ) + ORDER BY SUM(hp.payout + hp.pending_payout) DESC, hcd.category ASC + LIMIT _limit; +END +$function$ +language plpgsql STABLE; diff --git a/hive/db/sql_scripts/db_upgrade.sh b/hive/db/sql_scripts/db_upgrade.sh index 0bb9b175945e852fda8d4bfa5c59d717bd113689..f88a769c622f83d501424d99230b333955cb194a 100755 --- a/hive/db/sql_scripts/db_upgrade.sh +++ b/hive/db/sql_scripts/db_upgrade.sh @@ -41,14 +41,10 @@ for sql in postgres_handle_view_changes.sql \ condenser_api_post_ex_type.sql \ condenser_get_blog.sql \ condenser_get_content.sql \ - condenser_get_discussions_by_created.sql \ condenser_get_discussions_by_blog.sql \ + condenser_tags.sql \ + condenser_follows.sql \ hot_and_trends.sql \ - condenser_get_discussions_by_trending.sql \ - condenser_get_discussions_by_hot.sql \ - condenser_get_discussions_by_promoted.sql \ - condenser_get_post_discussions_by_payout.sql \ - condenser_get_comment_discussions_by_payout.sql \ update_hive_posts_children_count.sql \ update_hive_posts_api_helper.sql \ database_api_list_comments.sql \ @@ -61,14 +57,13 @@ for sql in postgres_handle_view_changes.sql \ condenser_get_by_feed_with_reblog.sql \ condenser_get_by_blog.sql \ bridge_get_account_posts_by_blog.sql \ - 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 \ + condenser_get_account_reputations.sql do - echo Executing psql -U $1 -d $2 -f $sql - time psql -1 -v "ON_ERROR_STOP=1" -U $1 -d $2 -c '\timing' -f $sql 2>&1 | tee -a -i upgrade.log + echo Executing psql -U $1 -d $2 -f $sql + time psql -1 -v "ON_ERROR_STOP=1" -U $1 -d $2 -c '\timing' -f $sql 2>&1 | tee -a -i upgrade.log echo $? done diff --git a/hive/server/bridge_api/methods.py b/hive/server/bridge_api/methods.py index 839720f3c5ea33b3f1f3e0f001555a3c7bb8380c..ea8bd756708d6b6d6a48abfe0715b5cd078a170b 100644 --- a/hive/server/bridge_api/methods.py +++ b/hive/server/bridge_api/methods.py @@ -117,7 +117,7 @@ async def _get_ranked_posts_for_communities( db, sort:str, community, start_auth if sort == 'trending': result_with_pinned_posts = [] - sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )" result_with_pinned_posts = await execute_community_query(db, pinned_sql, limit) limit -= len(result_with_pinned_posts) if limit > 0: @@ -129,7 +129,7 @@ async def _get_ranked_posts_for_communities( db, sort:str, community, start_auth return await execute_community_query(db, sql, limit) if sort == 'created': - sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )" result_with_pinned_posts = await execute_community_query(db, pinned_sql, limit) limit -= len(result_with_pinned_posts) if limit > 0: @@ -165,7 +165,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 == 'payout': - sql = "SELECT * FROM bridge_get_ranked_post_by_payout_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_payout_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )" return await execute_tags_query(db, sql, limit) if sort == 'payout_comments': @@ -208,7 +208,7 @@ async def _get_ranked_posts_for_all( db, sort:str, start_author:str, start_perml return await execute_query(db, sql, limit) if sort == 'payout': - sql = "SELECT * FROM bridge_get_ranked_post_by_payout( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_payout( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )" return await execute_query(db, sql, limit) if sort == 'payout_comments': diff --git a/hive/server/common/helpers.py b/hive/server/common/helpers.py index 14feebb189fd21c95e7a4fd0ef654265862cf3dc..973246279726048958c56ef038243dd994bc685b 100644 --- a/hive/server/common/helpers.py +++ b/hive/server/common/helpers.py @@ -155,8 +155,10 @@ def valid_offset(offset, ubound=None): def valid_follow_type(follow_type: str): """Ensure follow type is valid steemd type.""" - assert follow_type in ['blog', 'ignore'], 'invalid follow_type `%s`' % follow_type - return follow_type + # ABW: should be extended with blacklists etc. (and those should be implemented as next 'state' values) + supported_follow_types = dict(blog=1, ignore=2) + assert follow_type in supported_follow_types, "Unsupported follow type, valid types: {}".format(", ".join(supported_follow_types.keys())) + return supported_follow_types[follow_type] def valid_date(date, allow_empty=False): """ Ensure that date is in correct format """ diff --git a/hive/server/condenser_api/cursor.py b/hive/server/condenser_api/cursor.py index 585c74bc268522d5023c22209d7b5d2da279a39d..f93c46d9401f83bd3bbab324651efd37a508de53 100644 --- a/hive/server/condenser_api/cursor.py +++ b/hive/server/condenser_api/cursor.py @@ -7,24 +7,16 @@ from hive.server.database_api.methods import find_votes_impl, VotesPresentation # pylint: disable=too-many-lines -async def get_followers(db, account: str, start: str, follow_type: str, limit: int): - """Get a list of accounts following by a given account.""" - state = 2 if follow_type == 'ignore' else 1 - sql = " SELECT * FROM condenser_get_names_by_followers( '{}', '{}', {}::SMALLINT, {}::SMALLINT ) ".format( account, start, state, limit ) +async def get_followers(db, account: str, start: str, state: int, limit: int): + """Get a list of accounts following given account.""" + sql = "SELECT * FROM condenser_get_followers( (:account)::VARCHAR, (:start)::VARCHAR, :type, :limit )" + return await db.query_col(sql, account=account, start=start, type=state, limit=limit) - return await db.query_col(sql) - -async def get_following(db, account: str, start: str, follow_type: str, limit: int): +async def get_following(db, account: str, start: str, state: int, limit: int): """Get a list of accounts followed by a given account.""" - state = 2 if follow_type == 'ignore' else 1 - sql = " SELECT * FROM condenser_get_names_by_following( '{}', '{}', {}::SMALLINT, {}::SMALLINT ) ".format( account, start, state, limit ) - - return await db.query_col(sql) + sql = "SELECT * FROM condenser_get_following( (:account)::VARCHAR, (:start)::VARCHAR, :type, :limit )" + return await db.query_col(sql, account=account, start=start, type=state, limit=limit) -async def get_follow_counts(db, account: str): - """Return following/followers count for `account`.""" - sql = "SELECT * FROM condenser_get_follow_counts( '{}' )".format( account ) - return dict (await db.query_row(sql) ) async def get_reblogged_by(db, author: str, permlink: str): """Return all rebloggers of a post.""" diff --git a/hive/server/condenser_api/methods.py b/hive/server/condenser_api/methods.py index ebde88edb669fa6f155962e0dd77d3bea13d39af..b79a8206603151bb017cdf6806ba4c120d9c8eb4 100644 --- a/hive/server/condenser_api/methods.py +++ b/hive/server/condenser_api/methods.py @@ -33,8 +33,8 @@ def _legacy_follower(follower, following, follow_type): return dict(follower=follower, following=following, what=[follow_type]) @return_error_info -async def get_followers(context, account: str, start: str, follow_type: str = None, - limit: int = None, **kwargs): +async def get_followers(context, account: str, start: str = '', follow_type: str = None, + limit: int = 1000, **kwargs): """Get all accounts following `account`. (EOL)""" # `type` reserved word workaround if not follow_type and 'type' in kwargs: @@ -46,12 +46,12 @@ async def get_followers(context, account: str, start: str, follow_type: str = No valid_account(account), valid_account(start, allow_empty=True), valid_follow_type(follow_type), - valid_limit(limit, 1000, None)) + valid_limit(limit, 1000, 1000)) return [_legacy_follower(name, account, follow_type) for name in followers] @return_error_info -async def get_following(context, account: str, start: str, follow_type: str = None, - limit: int = None, **kwargs): +async def get_following(context, account: str, start: str = '', follow_type: str = None, + limit: int = 1000, **kwargs): """Get all accounts `account` follows. (EOL)""" # `type` reserved word workaround if not follow_type and 'type' in kwargs: @@ -63,18 +63,19 @@ async def get_following(context, account: str, start: str, follow_type: str = No valid_account(account), valid_account(start, allow_empty=True), valid_follow_type(follow_type), - valid_limit(limit, 1000, None)) + valid_limit(limit, 1000, 1000)) return [_legacy_follower(account, name, follow_type) for name in following] @return_error_info async def get_follow_count(context, account: str): """Get follow count stats. (EOL)""" - count = await cursor.get_follow_counts( - context['db'], - valid_account(account)) + db = context['db'] + account = valid_account(account) + sql = "SELECT * FROM condenser_get_follow_count( (:account)::VARCHAR )" + counters = await db.query_row(sql, account=account) return dict(account=account, - following_count=count['following'], - follower_count=count['followers']) + following_count=counters[0], + follower_count=counters[1]) @return_error_info async def get_reblogged_by(context, author: str, permlink: str): @@ -91,7 +92,8 @@ async def get_account_reputations(context, account_lower_bound: str = None, limi async def _get_account_reputations_impl(db, fat_node_style, account_lower_bound, limit): """Enumerate account reputations.""" - limit = valid_limit(limit, 1000, None) + assert isinstance(account_lower_bound, str), "invalid account_lower_bound type" + limit = valid_limit(limit, 1000, 1000) sql = "SELECT * FROM condenser_get_account_reputations( '{}', {}, {} )".format( account_lower_bound, account_lower_bound is None, limit ) rows = await db.query_all(sql, start=account_lower_bound, limit=limit) @@ -193,39 +195,56 @@ async def get_posts_by_given_sort(context, sort: str, start_author: str = '', st tag = valid_tag(tag, allow_empty=True) posts = [] + is_community = tag[:5] == 'hive-' if sort == 'created': - if tag == '': - sql = "SELECT * FROM condenser_get_discussions_by_created_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + if is_community: + sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )" + elif tag == '': + sql = "SELECT * FROM bridge_get_ranked_post_by_created( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" else: - sql = "SELECT * FROM condenser_get_discussions_by_created( (: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 )" elif sort == 'trending': - if tag == '': - sql = "SELECT * FROM condenser_get_discussions_by_trending_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + if is_community: + sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )" + elif tag == '': + sql = "SELECT * FROM bridge_get_ranked_post_by_trends( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" else: - sql = "SELECT * FROM condenser_get_discussions_by_trending( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" elif sort == 'hot': - if tag == '': - sql = "SELECT * FROM condenser_get_discussions_by_hot_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + if is_community: + sql = "SELECT * FROM bridge_get_ranked_post_by_hot_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + elif tag == '': + sql = "SELECT * FROM bridge_get_ranked_post_by_hot( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" else: - sql = "SELECT * FROM condenser_get_discussions_by_hot( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_hot_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" elif sort == 'promoted': - if tag == '': - sql = "SELECT * FROM condenser_get_discussions_by_promoted_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + if is_community: + sql = "SELECT * FROM bridge_get_ranked_post_by_promoted_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + elif tag == '': + sql = "SELECT * FROM bridge_get_ranked_post_by_promoted( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" else: - sql = "SELECT * FROM condenser_get_discussions_by_promoted( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + sql = "SELECT * FROM bridge_get_ranked_post_by_promoted_for_tag( (: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 )" + if tag == '': + sql = "SELECT * FROM bridge_get_ranked_post_by_payout( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )" + else: + sql = "SELECT * FROM bridge_get_ranked_post_by_payout_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )" elif sort == 'comment_by_payout': - sql = "SELECT * FROM condenser_get_comment_discussions_by_payout( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + if tag == '': + sql = "SELECT * FROM bridge_get_ranked_post_by_payout_comments( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" + else: + sql = "SELECT * FROM bridge_get_ranked_post_by_payout_comments_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )" else: return posts sql_result = await db.query_all(sql, tag=tag, author=start_author, permlink=start_permlink, limit=limit ) + muted_accounts = Mutes.all() for row in sql_result: post = _condenser_post_object(row, truncate_body) post['active_votes'] = await find_votes_impl(db, row['author'], row['permlink'], VotesPresentation.CondenserApi) + post['active_votes'] = _mute_votes(post['active_votes'], muted_accounts) posts.append(post) return posts diff --git a/hive/server/condenser_api/tags.py b/hive/server/condenser_api/tags.py index 0e6535888dfb9bc37d41dbb1117aa61c34e96e99..d6f05ca2b8d58a55ebf3a0367f6226deb016a039 100644 --- a/hive/server/condenser_api/tags.py +++ b/hive/server/condenser_api/tags.py @@ -7,16 +7,7 @@ from hive.server.common.helpers import (return_error_info, valid_tag, valid_limi @cached(ttl=7200, timeout=1200) async def get_top_trending_tags_summary(context): """Get top 50 trending tags among pending posts.""" - # Same results, more overhead: - #return [tag['name'] for tag in await get_trending_tags('', 50)] - sql = """ - SELECT (SELECT category FROM hive_category_data WHERE id = category_id) as category - FROM hive_posts - WHERE counter_deleted = 0 AND NOT is_paidout - GROUP BY category - ORDER BY SUM(payout + pending_payout) DESC - LIMIT 50 - """ + sql = "SELECT condenser_get_top_trending_tags_summary(50)" return await context['db'].query_col(sql) @return_error_info @@ -27,32 +18,10 @@ async def get_trending_tags(context, start_tag: str = '', limit: int = 250): limit = valid_limit(limit, 250, 250) start_tag = valid_tag(start_tag or '', allow_empty=True) - if start_tag: - seek = """ - HAVING SUM(payout + pending_payout) <= ( - SELECT SUM(payout + pending_payout) - FROM hive_posts hp - JOIN hive_category_data hcd ON hcd.id = hp.category_id - WHERE NOT is_paidout AND counter_deleted = 0 AND hcd.category = :start_tag) - """ - else: - seek = '' - - sql = """ - SELECT hcd.category, - COUNT(*) AS total_posts, - SUM(CASE WHEN hp.depth = 0 THEN 1 ELSE 0 END) AS top_posts, - SUM(hp.payout + hp.pending_payout) AS total_payouts - FROM hive_posts hp - JOIN hive_category_data hcd ON hcd.id = hp.category_id - WHERE NOT hp.is_paidout AND counter_deleted = 0 - GROUP BY hcd.category %s - ORDER BY SUM(hp.payout + hp.pending_payout) DESC, hcd.category ASC - LIMIT :limit - """ % seek + sql = "SELECT * FROM condenser_get_trending_tags( (:tag)::VARCHAR, :limit )" out = [] - for row in await context['db'].query_all(sql, limit=limit, start_tag=start_tag): + for row in await context['db'].query_all(sql, limit=limit, tag=start_tag): out.append({ 'name': row['category'], 'comments': row['total_posts'] - row['top_posts'], diff --git a/hive/server/hive_api/public.py b/hive/server/hive_api/public.py index f6415604c1f6b8ee3cc63565d9852b203ecf9bd5..8119a99c963ae61e60a08759aba28b635955b424 100644 --- a/hive/server/hive_api/public.py +++ b/hive/server/hive_api/public.py @@ -44,7 +44,8 @@ async def list_followers(context, account:str, start:str='', limit:int=50, obser context['db'], valid_account(account), valid_account(start, allow_empty=True), - 'blog', valid_limit(limit, 100, 50)) + 1, # blog + valid_limit(limit, 100, 50)) return await accounts_by_name(context['db'], followers, observer, lite=True) async def list_following(context, account:str, start:str='', limit:int=50, observer:str=None): @@ -53,7 +54,8 @@ async def list_following(context, account:str, start:str='', limit:int=50, obser context['db'], valid_account(account), valid_account(start, allow_empty=True), - 'blog', valid_limit(limit, 100, 50)) + 1, # blog + valid_limit(limit, 100, 50)) return await accounts_by_name(context['db'], following, observer, lite=True) async def list_all_muted(context, account): diff --git a/tests/tests_api b/tests/tests_api index 1ae2a4b1367139e7954b31596eaa4bf65e6aa68e..1cb3c40848344e3f143528c0d4127cd68c2029dd 160000 --- a/tests/tests_api +++ b/tests/tests_api @@ -1 +1 @@ -Subproject commit 1ae2a4b1367139e7954b31596eaa4bf65e6aa68e +Subproject commit 1cb3c40848344e3f143528c0d4127cd68c2029dd