Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • hive/hivemind
1 result
Select Git revision
Show changes
Commits on Source (38)
Showing
with 1543 additions and 1141 deletions
......@@ -5,7 +5,7 @@ ENV ENVIRONMENT DEV
ENV LOG_LEVEL INFO
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV PIPENV_VENV_IN_PROJECT 1
#ENV PIPENV_VENV_IN_PROJECT 1
ARG SOURCE_COMMIT
ENV SOURCE_COMMIT ${SOURCE_COMMIT}
ARG SCHEMA_HASH
......@@ -39,10 +39,11 @@ RUN \
runit \
s3cmd \
libpcre3 \
libpcre3-dev
libpcre3-dev \
git
RUN \
pip3 install --upgrade pip setuptools
#RUN \
# pip3 install --upgrade pip setuptools
ADD . /app
......@@ -56,7 +57,7 @@ RUN chmod +x /usr/local/bin/hivesync.sh
RUN chmod +x /usr/local/bin/hivesynccontinue.sh
RUN \
pip3 install . && \
python3 setup.py build && python3 setup.py install && \
apt-get remove -y \
build-essential \
libffi-dev \
......
......@@ -52,6 +52,7 @@ class Conf():
add('--test-max-block', type=int, env_var='TEST_MAX_BLOCK', help='(debug) only sync to given block, for running sync test', default=None)
add('--exit-after-sync', help='exit when sync is completed', action='store_true')
add('--test-profile', type=strtobool, env_var='TEST_PROFILE', help='(debug) profile execution', default=False)
add('--log-virtual-op-calls', type=strtobool, env_var='LOG_VIRTUAL_OP_CALLS', help='(debug) log virtual op calls and responses', default=False)
add('--pid-file', type=str, env_var='PID_FILE', help='Allows to dump current process pid into specified file', default=None)
......
......@@ -16,6 +16,7 @@ from hive.db.adapter import Db
from hive.utils.trends import update_hot_and_tranding_for_block_range
from hive.utils.post_active import update_active_starting_from_posts_on_block
from hive.utils.communities_rank import update_communities_posts_and_rank
from hive.server.common.payout_stats import PayoutStats
......@@ -124,7 +125,9 @@ class DbState:
'hive_post_tags_tag_id_idx',
'hive_votes_voter_id_post_id_idx',
'hive_votes_post_id_voter_id_idx'
'hive_votes_post_id_voter_id_idx',
'hive_reputation_data_block_num_idx'
]
to_return = []
......@@ -310,6 +313,19 @@ class DbState:
time_end = perf_counter()
log.info("[INIT] filling payout_stats_view executed in %fs", time_end - time_start)
time_start = perf_counter()
sql = """
SELECT update_account_reputations({}, {});
""".format(last_imported_block, current_imported_block)
DbState.db().query_no_return(sql)
time_end = perf_counter()
log.info("[INIT] update_account_reputations executed in %fs", time_end - time_start)
time_start = perf_counter()
update_communities_posts_and_rank()
time_end = perf_counter()
log.info("[INIT] update_communities_posts_and_rank executed in %fs", time_end - time_start)
# Update a block num immediately
DbState.db().query_no_return("UPDATE hive_state SET block_num = :block_num", block_num = current_imported_block)
......
......@@ -39,7 +39,7 @@ def build_metadata():
sa.Column('name', VARCHAR(16, collation='C'), nullable=False),
sa.Column('created_at', sa.DateTime, nullable=False),
#sa.Column('block_num', sa.Integer, nullable=False),
sa.Column('reputation', sa.Float(precision=6), nullable=False, server_default='25'),
sa.Column('reputation', sa.BigInteger, nullable=False, server_default='0'),
sa.Column('followers', sa.Integer, nullable=False, server_default='0'),
sa.Column('following', sa.Integer, nullable=False, server_default='0'),
......@@ -54,6 +54,12 @@ def build_metadata():
sa.Index('hive_accounts_ix6', 'reputation')
)
sa.Table(
'hive_account_reputation_status', metadata,
sa.Column('account_id', sa.Integer, primary_key=True),
sa.Column('reputation', sa.BigInteger, nullable=False),
sa.Column('is_implicit', sa.Boolean, nullable=False)
)
sa.Table(
'hive_reputation_data', metadata,
......@@ -64,7 +70,8 @@ def build_metadata():
sa.Column('rshares', sa.BigInteger, nullable=False),
sa.Column('block_num', sa.Integer, nullable=False),
sa.Index('hive_reputation_data_author_permlink_voter_idx', 'author_id', 'permlink', 'voter_id')
sa.Index('hive_reputation_data_author_permlink_voter_idx', 'author_id', 'permlink', 'voter_id'),
sa.Index('hive_reputation_data_block_num_idx', 'block_num')
)
sa.Table(
......@@ -310,15 +317,17 @@ def build_metadata():
sa.Table(
'hive_mentions', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('post_id', sa.Integer, nullable=False),
sa.Column('account_id', sa.Integer, nullable=False),
sa.Column('block_num', sa.Integer, nullable=False),
sa.PrimaryKeyConstraint('account_id', 'post_id', name='hive_mentions_pk'),
sa.ForeignKeyConstraint(['post_id'], ['hive_posts.id'], name='hive_mentions_fk1'),
sa.ForeignKeyConstraint(['account_id'], ['hive_accounts.id'], name='hive_mentions_fk2'),
sa.Index('hive_mentions_post_id_idx', 'post_id'),
sa.Index('hive_mentions_account_id_idx', 'account_id')
sa.Index('hive_mentions_account_id_idx', 'account_id'),
sa.UniqueConstraint('post_id', 'account_id', 'block_num', name='hive_mentions_ux1')
)
metadata = build_metadata_community(metadata)
......@@ -481,16 +490,19 @@ def setup(db):
AS
$function$
DECLARE
post_id INT;
post_id INT = 0;
BEGIN
SELECT INTO post_id COALESCE( (SELECT hp.id
FROM hive_posts hp
JOIN hive_accounts ha ON ha.id = hp.author_id
JOIN hive_permlink_data hpd ON hpd.id = hp.permlink_id
WHERE ha.name = _author AND hpd.permlink = _permlink AND hp.counter_deleted = 0
), 0 );
IF _check AND (_author <> '' OR _permlink <> '') AND post_id = 0 THEN
RAISE EXCEPTION 'Post %/% does not exist', _author, _permlink;
IF (_author <> '' OR _permlink <> '') THEN
SELECT INTO post_id COALESCE( (
SELECT hp.id
FROM hive_posts hp
JOIN hive_accounts ha ON ha.id = hp.author_id
JOIN hive_permlink_data hpd ON hpd.id = hp.permlink_id
WHERE ha.name = _author AND hpd.permlink = _permlink AND hp.counter_deleted = 0
), 0 );
IF _check AND post_id = 0 THEN
RAISE EXCEPTION 'Post %/% does not exist', _author, _permlink;
END IF;
END IF;
RETURN post_id;
END
......@@ -917,7 +929,7 @@ def setup(db):
ha_a.name as author,
hpd.permlink as permlink,
vote_percent as percent,
ha_a.reputation as reputation,
ha_v.reputation as reputation,
rshares,
last_update,
ha_v.name as voter,
......@@ -948,7 +960,7 @@ def setup(db):
percent INT,
last_update TIMESTAMP,
num_changes INT,
reputation FLOAT4
reputation BIGINT
);
DROP FUNCTION IF EXISTS find_votes( character varying, character varying )
......@@ -1685,64 +1697,6 @@ def setup(db):
"""
db.query_no_return(sql)
sql = """
DROP FUNCTION IF EXISTS process_reputation_data(in _block_num hive_blocks.num%TYPE, in _author hive_accounts.name%TYPE,
in _permlink hive_permlink_data.permlink%TYPE, in _voter hive_accounts.name%TYPE, in _rshares hive_votes.rshares%TYPE)
;
CREATE OR REPLACE FUNCTION process_reputation_data(in _block_num hive_blocks.num%TYPE,
in _author hive_accounts.name%TYPE, in _permlink hive_permlink_data.permlink%TYPE,
in _voter hive_accounts.name%TYPE, in _rshares hive_votes.rshares%TYPE)
RETURNS void
LANGUAGE sql
VOLATILE
AS $BODY$
WITH __insert_info AS (
INSERT INTO hive_reputation_data
(author_id, voter_id, permlink, block_num, rshares)
--- Warning DISTINCT is needed here since we have to strict join to hv table and there is really made a CROSS JOIN
--- between ha and hv records (producing 2 duplicated records)
SELECT DISTINCT ha.id as author_id, hv.id as voter_id, _permlink, _block_num, _rshares
FROM hive_accounts ha
JOIN hive_accounts hv ON hv.name = _voter
JOIN hive_posts hp ON hp.author_id = ha.id
JOIN hive_permlink_data hpd ON hp.permlink_id = hpd.id
WHERE hpd.permlink = _permlink
AND ha.name = _author
AND NOT hp.is_paidout --- voting on paidout posts shall have no effect
AND hv.reputation >= 0 --- voter's negative reputation eliminates vote from processing
AND (_rshares >= 0
OR (hv.reputation >= (ha.reputation - COALESCE((SELECT (hrd.rshares >> 6) -- if previous vote was a downvote we need to correct author reputation before current comparison to voter's reputation
FROM hive_reputation_data hrd
WHERE hrd.author_id = ha.id
AND hrd.voter_id=hv.id
AND hrd.permlink=_permlink
AND hrd.rshares < 0), 0)))
)
ON CONFLICT ON CONSTRAINT hive_reputation_data_uk DO
UPDATE SET
rshares = EXCLUDED.rshares
RETURNING (xmax = 0) AS is_new_vote,
(SELECT hrd.rshares
FROM hive_reputation_data hrd
--- Warning we want OLD row here, not both, so we're using old ID to select old one (new record has different value) !!!
WHERE hrd.id = hive_reputation_data.id AND hrd.author_id = author_id and hrd.voter_id=voter_id and hrd.permlink=_permlink) AS old_rshares, author_id, voter_id
)
UPDATE hive_accounts uha
SET reputation = CASE __insert_info.is_new_vote
WHEN true THEN ha.reputation + (_rshares >> 6)
ELSE ha.reputation - (__insert_info.old_rshares >> 6) + (_rshares >> 6)
END
FROM hive_accounts ha
JOIN __insert_info ON ha.id = __insert_info.author_id
WHERE uha.id = __insert_info.author_id
;
$BODY$;
"""
# db.query_no_return(sql)
sql = """
DROP FUNCTION IF EXISTS public.calculate_notify_vote_score(_payout hive_posts.payout%TYPE, _abs_rshares hive_posts_view.abs_rshares%TYPE, _rshares hive_votes.rshares%TYPE) CASCADE
;
......@@ -1993,7 +1947,7 @@ def setup(db):
WHERE scores.score > 0
UNION ALL
SELECT --persistent notifs
hn.block_num
hn.block_num
, notification_id(hn.block_num, hn.type_id, CAST( hn.id as INT) ) as id
, hp.id as post_id
, hn.type_id as type_id
......@@ -2239,7 +2193,13 @@ def setup(db):
"bridge_get_ranked_post_for_communities.sql",
"bridge_get_ranked_post_for_observer_communities.sql",
"bridge_get_ranked_post_for_tag.sql",
"bridge_get_ranked_post_for_all.sql"
"bridge_get_ranked_post_for_all.sql",
"calculate_account_reputations.sql",
"update_communities_rank.sql",
"delete_hive_posts_mentions.sql",
"head_block_time.sql",
"notifications_view.sql",
"get_number_of_unreaded_notifications.sql"
]
from os.path import dirname, realpath
dir_path = dirname(realpath(__file__))
......
......@@ -4,11 +4,9 @@ RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__post_id INT;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
END IF;
__post_id = find_comment_id( _author, _permlink, True );
RETURN QUERY SELECT
hp.id,
hp.author,
......@@ -49,32 +47,32 @@ BEGIN
FROM
(
SELECT
hp1.id
FROM hive_posts hp1 WHERE hp1.depth = 0 AND NOT hp1.is_grayed AND ( __post_id = -1 OR hp1.id < __post_id )
hp1.id
FROM hive_posts hp1 WHERE hp1.depth = 0 AND NOT hp1.is_grayed AND ( __post_id = 0 OR hp1.id < __post_id )
ORDER BY hp1.id DESC
LIMIT _limit
) as created
JOIN hive_posts_view hp ON hp.id = created.id
ORDER BY created.id DESC LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY created.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_hot;
CREATE FUNCTION bridge_get_ranked_post_by_hot( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__hot_limit FLOAT = -1.0;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.sc_hot INTO __hot_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_hot;
CREATE FUNCTION bridge_get_ranked_post_by_hot( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__hot_limit FLOAT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.sc_hot INTO __hot_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -113,39 +111,37 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.sc_hot as hot
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = -1 OR hp1.sc_hot < __hot_limit OR ( hp1.sc_hot = __hot_limit AND hp1.id < __post_id ) )
ORDER BY hp1.sc_hot DESC
LIMIT _limit
SELECT
hp1.id
, hp1.sc_hot as hot
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = 0 OR hp1.sc_hot < __hot_limit OR ( hp1.sc_hot = __hot_limit AND hp1.id < __post_id ) )
ORDER BY hp1.sc_hot DESC, hp1.id DESC
LIMIT _limit
) as hot
JOIN hive_posts_view hp ON hp.id = hot.id
ORDER BY hot.hot DESC, hot.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY hot.hot DESC, hot.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_muted;
CREATE FUNCTION bridge_get_ranked_post_by_muted( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_muted;
CREATE FUNCTION bridge_get_ranked_post_by_muted( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -184,39 +180,37 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.is_grayed AND hp1.payout > 0
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.is_grayed AND ( hp1.payout + hp1.pending_payout ) > 0
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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_comments;
CREATE FUNCTION bridge_get_ranked_post_by_payout_comments( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_comments;
CREATE FUNCTION bridge_get_ranked_post_by_payout_comments( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -255,39 +249,39 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth > 0
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth > 0
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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$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 )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RETURN QUERY SELECT
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 )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -326,37 +320,37 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours'
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout 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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_promoted;
CREATE FUNCTION bridge_get_ranked_post_by_promoted( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__promoted_limit hive_posts.promoted%TYPE = -1.0;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.promoted INTO __promoted_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_promoted;
CREATE FUNCTION bridge_get_ranked_post_by_promoted( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__promoted_limit hive_posts.promoted%TYPE;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.promoted INTO __promoted_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -395,37 +389,37 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.promoted as promoted
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth > 0 AND hp1.promoted > 0
AND ( __post_id = -1 OR hp1.promoted < __promoted_limit OR ( hp1.promoted = __promoted_limit AND hp1.id < __post_id ) )
ORDER BY hp1.promoted DESC
LIMIT _limit
SELECT
hp1.id
, hp1.promoted as promoted
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.promoted > 0
AND ( __post_id = 0 OR hp1.promoted < __promoted_limit OR ( hp1.promoted = __promoted_limit AND hp1.id < __post_id ) )
ORDER BY hp1.promoted DESC, hp1.id DESC
LIMIT _limit
) as promoted
JOIN hive_posts_view hp ON hp.id = promoted.id
ORDER BY promoted.promoted DESC, promoted.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY promoted.promoted DESC, promoted.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_trends;
CREATE FUNCTION bridge_get_ranked_post_by_trends( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__trending_limit FLOAT = -1.0;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.sc_trend INTO __trending_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_trends;
CREATE FUNCTION bridge_get_ranked_post_by_trends( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__trending_limit FLOAT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.sc_trend INTO __trending_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -464,18 +458,19 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.sc_trend as trend
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = -1 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
SELECT
hp1.id
, hp1.sc_trend as trend
FROM
hive_posts hp1
WHERE NOT hp1.is_paidout AND hp1.depth = 0
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
) as trends
JOIN hive_posts_view hp ON hp.id = trends.id
ORDER BY trends.trend DESC, trends.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY trends.trend DESC, trends.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_pinned_for_community;
CREATE FUNCTION bridge_get_ranked_post_pinned_for_community( in _community VARCHAR )
CREATE FUNCTION bridge_get_ranked_post_pinned_for_community( in _community VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
......@@ -41,27 +41,28 @@ $function$
hp.is_pinned,
hp.curator_payout_value
FROM
hive_posts_view hp
JOIN hive_communities hc ON hc.id = hp.community_id
WHERE hc.name = _community AND hp.is_pinned
ORDER BY hp.id DESC;
$function$
language sql STABLE;
hive_posts_view hp
JOIN hive_communities hc ON hc.id = hp.community_id
WHERE hc.name = _community AND hp.is_pinned
ORDER BY hp.id DESC
LIMIT _limit;
$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 )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__trending_limit FLOAT = -1.0;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.sc_trend INTO __trending_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
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 )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__trending_limit FLOAT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.sc_trend INTO __trending_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -100,38 +101,38 @@ $function$
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.sc_trend as trend
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = -1 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
SELECT
hp1.id
, hp1.sc_trend as trend
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth = 0
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
) as trends
JOIN hive_posts_view hp ON hp.id = trends.id
ORDER BY trends.trend DESC, trends.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY trends.trend DESC, trends.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_promoted_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_promoted_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__promoted_limit hive_posts.promoted%TYPE = -1.0;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.promoted INTO __promoted_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_promoted_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_promoted_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__promoted_limit hive_posts.promoted%TYPE;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.promoted INTO __promoted_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -170,42 +171,40 @@ $function$
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.promoted as promoted
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth > 0 AND hp1.promoted > 0
AND ( __post_id = -1 OR hp1.promoted < __promoted_limit OR ( hp1.promoted = __promoted_limit AND hp1.id < __post_id ) )
ORDER BY hp1.promoted DESC
LIMIT _limit
SELECT
hp1.id
, hp1.promoted as promoted
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.promoted > 0
AND ( __post_id = 0 OR hp1.promoted < __promoted_limit OR ( hp1.promoted = __promoted_limit AND hp1.id < __post_id ) )
ORDER BY hp1.promoted DESC, hp1.id DESC
LIMIT _limit
) as promoted
JOIN hive_posts_view hp ON hp.id = promoted.id
ORDER BY promoted.promoted DESC, promoted.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY promoted.promoted DESC, promoted.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_payout_for_community(in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RAISE NOTICE 'post_id=%',__post_id;
RAISE NOTICE 'payout_limit=%',__payout_limit;
RAISE NOTICE 'time=%',__head_block_time;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_payout_for_community(in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -244,40 +243,38 @@ $function$
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours'
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC, hp1.id DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout 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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id DESC LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_comments_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_payout_comments_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_comments_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_payout_comments_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -316,39 +313,38 @@ $function$
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth > 0
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC, hp1.id DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth > 0
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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id DESC LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_muted_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_muted_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_muted_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_muted_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -387,37 +383,38 @@ $function$
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.is_grayed AND hp1.payout > 0
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.is_grayed AND ( hp1.payout + hp1.pending_payout ) > 0
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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_hot_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_hot_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__hot_limit FLOAT = -1.0;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.sc_hot INTO __hot_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_hot_for_community;
CREATE FUNCTION bridge_get_ranked_post_by_hot_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__hot_limit FLOAT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.sc_hot INTO __hot_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -456,85 +453,84 @@ $function$
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.sc_hot as hot
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = -1 OR hp1.sc_hot < __hot_limit OR ( hp1.sc_hot = __hot_limit AND hp1.id < __post_id ) )
ORDER BY hp1.sc_hot DESC, hp1.id DESC
LIMIT _limit
SELECT
hp1.id
, hp1.sc_hot as hot
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = 0 OR hp1.sc_hot < __hot_limit OR ( hp1.sc_hot = __hot_limit AND hp1.id < __post_id ) )
ORDER BY hp1.sc_hot DESC, hp1.id DESC
LIMIT _limit
) as hot
JOIN hive_posts_view hp ON hp.id = hot.id
ORDER BY hot.hot DESC, hot.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY hot.hot DESC, hot.id DESC
LIMIT _limit;
END
$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 )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
BEGIN
IF _author <> '' 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
(
SELECT
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 )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
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
(
SELECT
hp1.id
, hp1.created_at as created_at
FROM
FROM
hive_posts hp1
JOIN hive_communities hc ON hp1.community_id = hc.id
WHERE hc.name = _community AND hp1.depth = 0 AND NOT hp1.is_grayed AND ( __post_id = -1 OR hp1.id < __post_id )
ORDER BY hp1.id DESC
LIMIT _limit
) as created
JOIN hive_posts_view hp ON hp.id = created.id
ORDER BY created.created_at DESC, created.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
WHERE hc.name = _community AND hp1.depth = 0 AND NOT hp1.is_grayed AND ( __post_id = 0 OR hp1.id < __post_id )
ORDER BY hp1.id DESC
LIMIT _limit
) as created
JOIN hive_posts_view hp ON hp.id = created.id
ORDER BY created.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
......@@ -4,12 +4,10 @@ RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__hive_tag INTEGER = -1;
__post_id INT;
__hive_tag INT;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
END IF;
__post_id = find_comment_id( _author, _permlink, True );
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
......@@ -51,37 +49,37 @@ BEGIN
FROM
(
SELECT
hp1.id
, hp1.created_at as created_at
hp1.id
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND hp1.depth = 0 AND NOT hp1.is_grayed AND ( __post_id = -1 OR hp1.id < __post_id )
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND hp1.depth = 0 AND NOT hp1.is_grayed AND ( __post_id = 0 OR hp1.id < __post_id )
ORDER BY hp1.id DESC
LIMIT _limit
) as created
JOIN hive_posts_view hp ON hp.id = created.id
ORDER BY created.created_at DESC, created.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY created.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_hot_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_hot_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__hot_limit FLOAT = -1.0;
__hive_tag INTEGER = -1;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.sc_hot INTO __hot_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_hot_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_hot_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__hot_limit FLOAT;
__hive_tag INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.sc_hot INTO __hot_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -120,40 +118,40 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.sc_hot as hot
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = -1 OR hp1.sc_hot < __hot_limit OR ( hp1.sc_hot = __hot_limit AND hp1.id < __post_id ) )
ORDER BY hp1.sc_hot DESC, hp1.id DESC
LIMIT _limit
SELECT
hp1.id
, hp1.sc_hot as hot
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = 0 OR hp1.sc_hot < __hot_limit OR ( hp1.sc_hot = __hot_limit AND hp1.id < __post_id ) )
ORDER BY hp1.sc_hot DESC, hp1.id DESC
LIMIT _limit
) as hot
JOIN hive_posts_view hp ON hp.id = hot.id
ORDER BY hot.hot DESC, hot.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY hot.hot DESC, hot.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_muted_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_muted_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__hive_tag INTEGER = -1;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_muted_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_muted_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
__hive_tag INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -192,41 +190,39 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.is_grayed AND hp1.payout > 0
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.is_grayed AND ( hp1.payout + hp1.pending_payout ) > 0
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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_comments_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_payout_comments_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
__hive_tag INTEGER = -1;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
__hive_tag = find_tag_id( tag, True );
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_comments_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_payout_comments_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
__hive_tag INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
hp.author,
......@@ -266,41 +262,42 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth > 0
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth > 0
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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_payout_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
__hive_tag INTEGER = -1;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.payout INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_payout_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__payout_limit hive_posts.payout%TYPE;
__head_block_time TIMESTAMP;
__hive_tag INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT ( hp.payout + hp.pending_payout ) INTO __payout_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
SELECT blck.created_at INTO __head_block_time FROM hive_blocks blck ORDER BY blck.num DESC LIMIT 1;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -339,40 +336,40 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.payout as payout
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours'
AND ( __post_id = -1 OR hp1.payout < __payout_limit OR ( hp1.payout = __payout_limit AND hp1.id < __post_id ) )
ORDER BY hp1.payout DESC
LIMIT _limit
SELECT
hp1.id
, ( hp1.payout + hp1.pending_payout ) as all_payout
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout 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
) as payout
JOIN hive_posts_view hp ON hp.id = payout.id
ORDER BY payout.payout DESC, payout.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY payout.all_payout DESC, payout.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_promoted_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_promoted_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__promoted_limit hive_posts.promoted%TYPE = -1.0;
__hive_tag INTEGER = -1;
BEGIN
RAISE NOTICE 'author=%',_author;
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.promoted INTO __promoted_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_promoted_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_promoted_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__promoted_limit hive_posts.promoted%TYPE;
__hive_tag INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.promoted INTO __promoted_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -411,39 +408,40 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.promoted as promoted
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth > 0 AND hp1.promoted > 0
AND ( __post_id = -1 OR hp1.promoted < __promoted_limit OR ( hp1.promoted = __promoted_limit AND hp1.id < __post_id ) )
ORDER BY hp1.promoted DESC
LIMIT _limit
SELECT
hp1.id
, hp1.promoted as promoted
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.promoted > 0
AND ( __post_id = 0 OR hp1.promoted < __promoted_limit OR ( hp1.promoted = __promoted_limit AND hp1.id < __post_id ) )
ORDER BY hp1.promoted DESC, hp1.id DESC
LIMIT _limit
) as promoted
JOIN hive_posts_view hp ON hp.id = promoted.id
ORDER BY promoted.promoted DESC, promoted.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY promoted.promoted DESC, promoted.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_trends_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_trends_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INTEGER = -1;
__trending_limit FLOAT = -1.0;
__hive_tag INTEGER = -1;
BEGIN
IF _author <> '' THEN
__post_id = find_comment_id( _author, _permlink, True );
SELECT hp.sc_trend INTO __trending_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_trends_for_tag;
CREATE FUNCTION bridge_get_ranked_post_by_trends_for_tag( in tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
RETURNS SETOF bridge_api_post
AS
$function$
DECLARE
__post_id INT;
__trending_limit FLOAT;
__hive_tag INT;
BEGIN
__post_id = find_comment_id( _author, _permlink, True );
IF __post_id <> 0 THEN
SELECT hp.sc_trend INTO __trending_limit FROM hive_posts hp WHERE hp.id = __post_id;
END IF;
__hive_tag = find_tag_id( tag, True );
RETURN QUERY SELECT
hp.id,
hp.author,
hp.parent_author,
......@@ -482,19 +480,20 @@ BEGIN
hp.curator_payout_value
FROM
(
SELECT
hp1.id
, hp1.sc_trend as trend
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth = 0
AND ( __post_id = -1 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
SELECT
hp1.id
, hp1.sc_trend as trend
FROM
hive_post_tags hpt
JOIN hive_posts hp1 ON hp1.id = hpt.post_id
WHERE hpt.tag_id = __hive_tag AND NOT hp1.is_paidout AND hp1.depth = 0
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
) as trends
JOIN hive_posts_view hp ON hp.id = trends.id
ORDER BY trends.trend DESC, trends.id LIMIT _limit;
END
$function$
language plpgsql STABLE;
ORDER BY trends.trend DESC, trends.id DESC
LIMIT _limit;
END
$function$
language plpgsql STABLE;
......@@ -3,7 +3,7 @@ CREATE TYPE bridge_api_post AS (
id INTEGER,
author VARCHAR,
parent_author VARCHAR,
author_rep FLOAT4,
author_rep BIGINT,
root_title VARCHAR,
beneficiaries JSON,
max_accepted_payout VARCHAR,
......
DROP TYPE IF EXISTS AccountReputation CASCADE;
CREATE TYPE AccountReputation AS (id int, reputation bigint, is_implicit boolean);
DROP FUNCTION IF EXISTS public.calculate_account_reputations;
CREATE OR REPLACE FUNCTION public.calculate_account_reputations(
_first_block_num integer,
_last_block_num integer,
_tracked_account character varying DEFAULT NULL::character varying)
RETURNS SETOF accountreputation
LANGUAGE 'plpgsql'
COST 100
STABLE
ROWS 1000
AS $BODY$
DECLARE
__vote_data RECORD;
__account_reputations AccountReputation[];
__author_rep bigint;
__new_author_rep bigint;
__voter_rep bigint;
__implicit_voter_rep boolean;
__implicit_author_rep boolean;
__rshares bigint;
__prev_rshares bigint;
__rep_delta bigint;
__prev_rep_delta bigint;
__traced_author int;
__account_name varchar;
BEGIN
SELECT INTO __account_reputations ARRAY(SELECT ROW(a.account_id, a.reputation, a.is_implicit)::AccountReputation
FROM hive_account_reputation_status a
WHERE a.account_id != 0
ORDER BY a.account_id);
SELECT COALESCE((SELECT ha.id FROM hive_accounts ha WHERE ha.name = _tracked_account), 0) INTO __traced_author;
FOR __vote_data IN
SELECT rd.id, rd.author_id, rd.voter_id, rd.rshares,
COALESCE((SELECT prd.rshares
FROM hive_reputation_data prd
WHERE prd.author_id = rd.author_id and prd.voter_id = rd.voter_id
and prd.permlink = rd.permlink and prd.id < rd.id
ORDER BY prd.id DESC LIMIT 1), 0) as prev_rshares
FROM hive_reputation_data rd
WHERE (_first_block_num IS NULL AND _last_block_num IS NULL) OR (rd.block_num BETWEEN _first_block_num AND _last_block_num)
ORDER BY rd.id
LOOP
__voter_rep := __account_reputations[__vote_data.voter_id - 1].reputation;
__implicit_author_rep := __account_reputations[__vote_data.author_id - 1].is_implicit;
IF __vote_data.author_id = __traced_author THEN
raise notice 'Processing vote <%> rshares: %, prev_rshares: %', __vote_data.id, __vote_data.rshares, __vote_data.prev_rshares;
select ha.name into __account_name from hive_accounts ha where ha.id = __vote_data.voter_id;
raise notice 'Voter `%` (%) reputation: %', __account_name, __vote_data.voter_id, __voter_rep;
END IF;
CONTINUE WHEN __voter_rep < 0;
__implicit_voter_rep := __account_reputations[__vote_data.voter_id - 1].is_implicit;
__author_rep := __account_reputations[__vote_data.author_id - 1].reputation;
__rshares := __vote_data.rshares;
__prev_rshares := __vote_data.prev_rshares;
__prev_rep_delta := (__prev_rshares >> 6)::bigint;
IF NOT __implicit_author_rep AND --- Author must have set explicit reputation to allow its correction
(__prev_rshares > 0 OR
--- Voter must have explicitly set reputation to match hived old conditions
(__prev_rshares < 0 AND NOT __implicit_voter_rep AND __voter_rep > __author_rep - __prev_rep_delta)) THEN
__author_rep := __author_rep - __prev_rep_delta;
__implicit_author_rep := __author_rep = 0;
__account_reputations[__vote_data.author_id - 1] := ROW(__vote_data.author_id, __author_rep, __implicit_author_rep)::AccountReputation;
IF __vote_data.author_id = __traced_author THEN
raise notice 'Corrected author_rep by prev_rep_delta: % to have reputation: %', __prev_rep_delta, __author_rep;
END IF;
END IF;
__implicit_voter_rep := __account_reputations[__vote_data.voter_id - 1].is_implicit;
--- reread voter's rep. since it can change above if author == voter
__voter_rep := __account_reputations[__vote_data.voter_id - 1].reputation;
IF __rshares > 0 OR
(__rshares < 0 AND NOT __implicit_voter_rep AND __voter_rep > __author_rep) THEN
__rep_delta := (__rshares >> 6)::bigint;
__new_author_rep = __author_rep + __rep_delta;
__account_reputations[__vote_data.author_id - 1] := ROW(__vote_data.author_id, __new_author_rep, False)::AccountReputation;
IF __vote_data.author_id = __traced_author THEN
raise notice 'Changing account: <%> reputation from % to %', __vote_data.author_id, __author_rep, __new_author_rep;
END IF;
ELSE
IF __vote_data.author_id = __traced_author THEN
raise notice 'Ignoring reputation change due to unmet conditions... Author_rep: %, Voter_rep: %', __author_rep, __voter_rep;
END IF;
END IF;
END LOOP;
RETURN QUERY
SELECT id, Reputation, is_implicit
FROM unnest(__account_reputations)
WHERE Reputation IS NOT NULL
;
END
$BODY$
;
DROP FUNCTION IF EXISTS public.update_account_reputations;
CREATE OR REPLACE FUNCTION public.update_account_reputations(
in _first_block_num INTEGER,
in _last_block_num INTEGER)
RETURNS VOID
LANGUAGE 'plpgsql'
VOLATILE
AS $BODY$
BEGIN
--- At first step update hive_account_reputation_status table with new accounts.
INSERT INTO hive_account_reputation_status
(account_id, reputation, is_implicit)
SELECT ha.id, 0, True
FROM hive_accounts ha
WHERE ha.id != 0
AND NOT EXISTS (SELECT NULL
FROM hive_account_reputation_status rs
WHERE rs.account_id = ha.id)
;
UPDATE hive_account_reputation_status urs
SET reputation = ds.reputation,
is_implicit = ds.is_implicit
FROM
(
SELECT p.id as account_id, p.reputation, p.is_implicit
FROM calculate_account_reputations(_first_block_num, _last_block_num) p
) ds
WHERE urs.account_id = ds.account_id AND (urs.reputation != ds.reputation OR urs.is_implicit != ds.is_implicit)
;
UPDATE hive_accounts uha
SET reputation = rs.reputation
FROM hive_account_reputation_status rs
WHERE uha.id = rs.account_id AND uha.reputation != rs.reputation
;
END
$BODY$
;
DROP FUNCTION IF EXISTS delete_hive_posts_mentions();
CREATE OR REPLACE FUNCTION delete_hive_posts_mentions()
RETURNS VOID
LANGUAGE 'plpgsql'
AS
$function$
DECLARE
LAST_BLOCK_TIME TIMESTAMP;
BEGIN
LAST_BLOCK_TIME = ( SELECT created_at FROM hive_blocks ORDER BY num DESC LIMIT 1 );
DELETE FROM hive_mentions hm
WHERE post_id in
(
SELECT id
FROM hive_posts
WHERE created_at < ( LAST_BLOCK_TIME - '90 days'::interval )
);
END
$function$
;
......@@ -4,22 +4,18 @@ RETURNS SETOF INTEGER
AS
$function$
DECLARE
__post_id INTEGER = -1;
__account_id INTEGER;
__post_id INT;
__account_id INT;
BEGIN
IF start_author <> '' THEN
__post_id = find_comment_id( start_author, start_permlink, True );
END IF;
__account_id = find_account_id(_account, False);
IF __account_id = 0 THEN
RETURN;
END IF;
RETURN QUERY SELECT
hpr.id as id
FROM hive_posts hpr
JOIN hive_posts hp ON hp.id = hpr.parent_id
WHERE hp.author_id = __account_id AND hp.counter_deleted = 0 AND hpr.counter_deleted = 0 AND ( __post_id = -1 OR hpr.id < __post_id )
ORDER BY hpr.id DESC LIMIT _limit;
__post_id = find_comment_id( start_author, start_permlink, True );
__account_id = find_account_id( _account, True );
RETURN QUERY SELECT
hpr.id as id
FROM hive_posts hpr
JOIN hive_posts hp ON hp.id = hpr.parent_id
WHERE hp.author_id = __account_id AND hp.counter_deleted = 0 AND hpr.counter_deleted = 0 AND ( __post_id = 0 OR hpr.id < __post_id )
ORDER BY hpr.id DESC
LIMIT _limit;
END
$function$
LANGUAGE plpgsql STABLE
DROP FUNCTION IF EXISTS get_number_of_unreaded_notifications;
CREATE OR REPLACE FUNCTION get_number_of_unreaded_notifications(in _account VARCHAR, in _minimum_score SMALLINT)
RETURNS TABLE( lastread_at TIMESTAMP, unread BIGINT )
LANGUAGE 'sql' STABLE
AS
$BODY$
SELECT
ha.lastread_at as lastread_at,
COUNT(1) as unread
FROM
hive_notifications_view hnv
JOIN hive_accounts ha
ON ha.name = hnv.dst
WHERE hnv.created_at > ha.lastread_at AND hnv.score >= _minimum_score AND hnv.dst = _account
GROUP BY ha.lastread_at
$BODY$
;
DROP FUNCTION IF EXISTS head_block_time;
CREATE OR REPLACE FUNCTION head_block_time()
RETURNS TIMESTAMP
LANGUAGE 'sql' STABLE
AS
$BODY$
SELECT hb.created_at FROM hive_blocks hb ORDER BY hb.num DESC LIMIT 1
$BODY$
;
DROP FUNCTION IF EXISTS block_before_head;
CREATE OR REPLACE FUNCTION block_before_head( in _time INTERVAL )
RETURNS hive_blocks.num%TYPE
LANGUAGE 'sql' STABLE
AS
$BODY$
SELECT MAX(hb1.num) - CAST( extract(epoch from _time)/3 as INTEGER ) FROM hive_blocks hb1
$BODY$
DROP VIEW IF EXISTS hive_notifications_view
;
CREATE VIEW hive_notifications_view
AS
SELECT
*
FROM
(
SELECT --replies
posts_and_scores.block_num as block_num
, posts_and_scores.id as id
, posts_and_scores.post_id as post_id
, posts_and_scores.type_id as type_id
, posts_and_scores.created_at as created_at
, posts_and_scores.author as src
, posts_and_scores.parent_author as dst
, posts_and_scores.parent_author as author
, posts_and_scores.parent_permlink as permlink
, ''::VARCHAR as community
, ''::VARCHAR as community_title
, ''::VARCHAR as payload
, posts_and_scores.score as score
FROM
(
SELECT
hpv.block_num as block_num
, notification_id(
hpv.block_num
, CASE ( hpv.depth )
WHEN 1 THEN 12 --replies
ELSE 13 --comment replies
END
, hpv.id ) as id
, CASE ( hpv.depth )
WHEN 1 THEN 12 --replies
ELSE 13 --comment replies
END as type_id
, hpv.created_at
, hpv.author
, hpv.parent_id as post_id
, hpv.parent_author as parent_author
, hpv.parent_permlink_or_category as parent_permlink
, hpv.depth
, hpv.parent_author_id
, hpv.author_id
, harv.score as score
FROM
hive_posts_view hpv
JOIN hive_accounts_rank_view harv ON harv.id = hpv.author_id
WHERE hpv.depth > 0
) as posts_and_scores
WHERE NOT EXISTS(
SELECT 1
FROM
hive_follows hf
WHERE hf.follower = posts_and_scores.parent_author_id AND hf.following = posts_and_scores.author_id AND hf.state = 2
)
UNION ALL
SELECT --follows
hf.block_num as block_num
, notifs_id.notif_id as id
, 0 as post_id
, 15 as type_id
, hf.created_at as created_at
, followers_scores.follower_name as src
, ha2.name as dst
, ''::VARCHAR as author
, ''::VARCHAR as permlink
, ''::VARCHAR as community
, ''::VARCHAR as community_title
, ''::VARCHAR as payload
, followers_scores.score as score
FROM
hive_follows hf
JOIN hive_accounts ha2 ON hf.following = ha2.id
JOIN (
SELECT
ha.id as follower_id
, ha.name as follower_name
, harv.score as score
FROM hive_accounts ha
JOIN hive_accounts_rank_view harv ON harv.id = ha.id
) as followers_scores ON followers_scores.follower_id = hf.follower
JOIN (
SELECT
hf2.id as id
, notification_id(hf2.block_num, 15, hf2.id) as notif_id
FROM hive_follows hf2
) as notifs_id ON notifs_id.id = hf.id
UNION ALL
SELECT --reblogs
hr.block_num as block_num
, hr_scores.notif_id as id
, hp.id as post_id
, 14 as type_id
, hr.created_at as created_at
, ha_hr.name as src
, ha.name as dst
, ha.name as author
, hpd.permlink as permlink
, ''::VARCHAR as community
, ''::VARCHAR as community_title
, ''::VARCHAR as payload
, hr_scores.score as score
FROM
hive_reblogs hr
JOIN hive_posts hp ON hr.post_id = hp.id
JOIN hive_permlink_data hpd ON hp.permlink_id = hpd.id
JOIN hive_accounts ha_hr ON hr.blogger_id = ha_hr.id
JOIN (
SELECT
hr2.id as id
, notification_id(hr2.block_num, 14, hr2.id) as notif_id
, harv.score as score
FROM hive_reblogs hr2
JOIN hive_accounts_rank_view harv ON harv.id = hr2.blogger_id
) as hr_scores ON hr_scores.id = hr.id
JOIN hive_accounts ha ON hp.author_id = ha.id
UNION ALL
SELECT --subscriptions
hs.block_num as block_num
, hs_scores.notif_id as id
, 0 as post_id
, 11 as type_id
, hs.created_at as created_at
, hs_scores.src as src
, ha_com.name as dst
, ''::VARCHAR as author
, ''::VARCHAR as permlink
, hc.name as community
, hc.title as community_title
, ''::VARCHAR as payload
, hs_scores.score
FROM
hive_subscriptions hs
JOIN hive_communities hc ON hs.community_id = hc.id
JOIN (
SELECT
hs2.id as id
, notification_id(hs2.block_num, 11, hs2.id) as notif_id
, harv.score as score
, ha.name as src
FROM hive_subscriptions hs2
JOIN hive_accounts ha ON hs2.account_id = ha.id
JOIN hive_accounts_rank_view harv ON harv.id = ha.id
) as hs_scores ON hs_scores.id = hs.id
JOIN hive_accounts ha_com ON hs.community_id = ha_com.id
UNION ALL
SELECT -- new community
hc.block_num as block_num
, hc_id.notif_id as id
, 0 as post_id
, 1 as type_id
, hc.created_at as created_at
, ''::VARCHAR as src
, ha.name as dst
, ''::VARCHAR as author
, ''::VARCHAR as permlink
, hc.name as community
, ''::VARCHAR as community_title
, ''::VARCHAR as payload
, 35 as score
FROM
hive_communities hc
JOIN hive_accounts ha ON ha.id = hc.id
JOIN (
SELECT
hc2.id as id
, notification_id(hc2.block_num, 11, hc2.id) as notif_id
FROM hive_communities hc2
) as hc_id ON hc_id.id = hc.id
UNION ALL
SELECT --votes
scores.block_num as block_num
, scores.notif_id as id
, scores.post_id as post_id
, 17 as type_id
, scores.last_update as created_at
, scores.src as src
, scores.dst as dst
, scores.dst as author
, scores.permlink as permlink
, ''::VARCHAR as community
, ''::VARCHAR as community_title
, ''::VARCHAR as payload
, scores.score as score
FROM
(
SELECT
hv1.block_num
, hv1.id as id
, hpv.id as post_id
, notification_id(hv1.block_num, 17, CAST( hv1.id as INT) ) as notif_id
, calculate_notify_vote_score( (hpv.payout + hpv.pending_payout), hpv.abs_rshares, hv1.rshares ) as score
, hpv.author as dst
, ha.name as src
, hpv.permlink as permlink
, hv1.last_update
FROM hive_votes hv1
JOIN hive_posts_view hpv ON hv1.post_id = hpv.id
JOIN hive_accounts ha ON ha.id = hv1.voter_id
WHERE hv1.rshares >= 10e9 AND hpv.abs_rshares != 0
) as scores
WHERE scores.score > 0
UNION ALL
SELECT --persistent notifs
hn.block_num
, notification_id(hn.block_num, hn.type_id, CAST( hn.id as INT) ) as id
, hp.id as post_id
, hn.type_id as type_id
, hn.created_at as created_at
, ha_src.name as src
, ha_dst.name as dst
, ha_pst.name as author
, hpd.permlink as permlink
, hc.name as community
, hc.title as community_title
, hn.payload as payload
, hn.score as score
FROM hive_notifs hn
JOIN hive_accounts ha_dst ON hn.dst_id = ha_dst.id
LEFT JOIN hive_accounts ha_src ON hn.src_id = ha_src.id
LEFT JOIN hive_communities hc ON hn.community_id = hc.id
LEFT JOIN hive_posts hp ON hn.post_id = hp.id
LEFT JOIN hive_accounts ha_pst ON ha_pst.id = hp.author_id
LEFT JOIN hive_permlink_data hpd ON hpd.id = hp.permlink_id
) as notifs
WHERE notifs.block_num >= block_before_head( '90 days' );
DROP FUNCTION IF EXISTS update_communities_posts_data_and_rank;
CREATE FUNCTION update_communities_posts_data_and_rank()
RETURNS void
AS
$function$
UPDATE hive_communities hc SET
num_pending = cr.posts,
sum_pending = cr.payouts,
num_authors = cr.authors,
rank = cr.rank
FROM
(
SELECT
c.id as id,
ROW_NUMBER() OVER ( ORDER BY COALESCE(p.payouts, 0) DESC, COALESCE(p.authors, 0) DESC, COALESCE(p.posts, 0) DESC, c.subscribers DESC, (CASE WHEN c.title = '' THEN 1 ELSE 0 END), c.id DESC ) as rank,
COALESCE(p.posts, 0) as posts,
COALESCE(p.payouts, 0) as payouts,
COALESCE(p.authors, 0) as authors
FROM hive_communities c
LEFT JOIN (
SELECT hp.community_id,
COUNT(*) posts,
ROUND(SUM(hp.pending_payout)) payouts,
COUNT(DISTINCT hp.author_id) authors
FROM hive_posts hp
WHERE community_id IS NOT NULL
AND NOT hp.is_paidout
AND hp.counter_deleted = 0
GROUP BY hp.community_id
) p
ON p.community_id = c.id
) as cr
WHERE hc.id = cr.id;
$function$
language sql;
......@@ -17,25 +17,25 @@ BEGIN
FIRST_BLOCK_TIME = LAST_BLOCK_TIME - '90 days'::interval;
END IF;
INSERT INTO hive_mentions( post_id, account_id )
SELECT DISTINCT T.id_post, ha.id
INSERT INTO hive_mentions( post_id, account_id, block_num )
SELECT DISTINCT T.id_post, ha.id, T.block_num
FROM
hive_accounts ha
INNER JOIN
(
SELECT T.id_post, LOWER( ( SELECT trim( T.mention::text, '{""}') ) ) mention, T.author_id
SELECT T.id_post, LOWER( ( SELECT trim( T.mention::text, '{""}') ) ) mention, T.author_id, T.block_num
FROM
(
SELECT
hp.id, REGEXP_MATCHES( hpd.body, '(?:^|[^a-zA-Z0-9_!#$%&*@\\/])(?:@)([a-zA-Z0-9\\.-]{1,16}[a-zA-Z0-9])(?![a-z])', 'g') mention, hp.author_id
hp.id, REGEXP_MATCHES( hpd.body, '(?:^|[^a-zA-Z0-9_!#$%&*@\\/])(?:@)([a-zA-Z0-9\\.-]{1,16}[a-zA-Z0-9])(?![a-z])', 'g') mention, hp.author_id, hp.block_num
FROM hive_posts hp
INNER JOIN hive_post_data hpd ON hp.id = hpd.id
WHERE
(
hp.created_at >= FIRST_BLOCK_TIME
)
)T( id_post, mention, author_id )
)T( id_post, mention, author_id ) ON ha.name = T.mention
)T( id_post, mention, author_id, block_num )
)T( id_post, mention, author_id, block_num ) ON ha.name = T.mention
WHERE ha.id != T.author_id
ON CONFLICT DO NOTHING;
......
......@@ -25,6 +25,7 @@ from hive.utils.trends import update_hot_and_tranding_for_block_range
from hive.utils.post_active import update_active_starting_from_posts_on_block
from hive.server.common.payout_stats import PayoutStats
from hive.server.common.mentions import Mentions
log = logging.getLogger(__name__)
......@@ -76,6 +77,7 @@ class Blocks:
Notify.setup_own_db_access(sharedDbAdapter)
Accounts.setup_own_db_access(sharedDbAdapter)
PayoutStats.setup_own_db_access(sharedDbAdapter)
Mentions.setup_own_db_access(sharedDbAdapter)
@classmethod
def setup_shared_db_access(cls, sharedDbAdapter):
......@@ -468,3 +470,5 @@ class Blocks:
DB.query_no_return("SELECT update_hive_posts_api_helper({},{})".format(first_block, last_block))
DB.query_no_return("SELECT update_feed_cache({}, {})".format(first_block, last_block))
DB.query_no_return("SELECT update_hive_posts_mentions({}, {})".format(first_block, last_block))
DB.query_no_return("SELECT update_account_reputations({}, {})".format(first_block, last_block))
......@@ -219,42 +219,6 @@ class Community:
return role >= Role.member
return role >= Role.guest # or at least not muted
@classmethod
def recalc_pending_payouts(cls):
"""Update all pending payout and rank fields."""
sql = """SELECT id,
COALESCE(posts, 0),
COALESCE(payouts, 0),
COALESCE(authors, 0)
FROM hive_communities c
LEFT JOIN (
SELECT community_id,
COUNT(*) posts,
ROUND(SUM(payout)) payouts,
COUNT(DISTINCT author_id) authors
FROM hive_posts
WHERE community_id IS NOT NULL
AND is_paidout = '0'
AND counter_deleted = 0
GROUP BY community_id
) p
ON community_id = id
ORDER BY COALESCE(payouts, 0) DESC,
COALESCE(authors, 0) DESC,
COALESCE(posts, 0) DESC,
subscribers DESC,
(CASE WHEN c.title = '' THEN 1 ELSE 0 END)
"""
for rank, row in enumerate(DB.query_all(sql)):
cid, posts, payouts, authors = row
sql = """UPDATE hive_communities
SET sum_pending = :payouts, num_pending = :posts,
num_authors = :authors, rank = :rank
WHERE id = :id"""
DB.query(sql, id=cid, payouts=payouts, posts=posts,
authors=authors, rank=rank+1)
class CommunityOp:
"""Handles validating and processing of community custom_json ops."""
#pylint: disable=too-many-instance-attributes
......
......@@ -27,7 +27,6 @@ def _get_auth(op):
`required_active_auths` in the future. For now, these are ignored.
"""
if op['required_auths']:
log.warning("unexpected active auths: %s", op)
return None
if len(op['required_posting_auths']) != 1:
log.warning("unexpected auths: %s", op)
......