mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-12-23 03:11:32 +00:00
Change 'Scaled' sort to use total interactions instead of monthly users
This commit is contained in:
parent
a2a5cb091a
commit
c5dfc80535
3 changed files with 25 additions and 17 deletions
|
@ -33,16 +33,16 @@ now() - published) < '7 days' THEN
|
||||||
0.0
|
0.0
|
||||||
END;
|
END;
|
||||||
|
|
||||||
CREATE FUNCTION r.scaled_rank (score numeric, published timestamp with time zone, users_active_month numeric)
|
CREATE FUNCTION r.scaled_rank (score numeric, published timestamp with time zone, interactions_month numeric)
|
||||||
RETURNS double precision
|
RETURNS double precision
|
||||||
LANGUAGE sql
|
LANGUAGE sql
|
||||||
IMMUTABLE PARALLEL SAFE
|
IMMUTABLE PARALLEL SAFE
|
||||||
-- Add 2 to avoid divide by zero errors
|
-- Add 2 to avoid divide by zero errors
|
||||||
-- Default for score = 1, active users = 1, and now, is (0.1728 / log(2 + 1)) = 0.3621
|
-- Default for score = 1, active users = 1, and now, is (0.1728 / log(2 + 1)) = 0.3621
|
||||||
-- There may need to be a scale factor multiplied to users_active_month, to make
|
-- There may need to be a scale factor multiplied to interactions_month, to make
|
||||||
-- the log curve less pronounced. This can be tuned in the future.
|
-- the log curve less pronounced. This can be tuned in the future.
|
||||||
RETURN (
|
RETURN (
|
||||||
r.hot_rank (score, published) / log(2 + users_active_month)
|
r.hot_rank (score, published) / log(2 + interactions_month)
|
||||||
);
|
);
|
||||||
|
|
||||||
-- For tables with `deleted` and `removed` columns, this function determines which rows to include in a count.
|
-- For tables with `deleted` and `removed` columns, this function determines which rows to include in a count.
|
||||||
|
|
|
@ -531,7 +531,7 @@ pub mod functions {
|
||||||
|
|
||||||
define_sql_function! {
|
define_sql_function! {
|
||||||
#[sql_name = "r.scaled_rank"]
|
#[sql_name = "r.scaled_rank"]
|
||||||
fn scaled_rank(score: BigInt, time: Timestamptz, users_active_month: BigInt) -> Double;
|
fn scaled_rank(score: BigInt, time: Timestamptz, interactions_month: BigInt) -> Double;
|
||||||
}
|
}
|
||||||
|
|
||||||
define_sql_function! {
|
define_sql_function! {
|
||||||
|
|
|
@ -233,14 +233,22 @@ async fn process_post_aggregates_ranks_in_batches(conn: &mut AsyncPgConnection)
|
||||||
AND (pa.hot_rank != 0 OR pa.hot_rank_active != 0)
|
AND (pa.hot_rank != 0 OR pa.hot_rank_active != 0)
|
||||||
ORDER BY pa.published
|
ORDER BY pa.published
|
||||||
LIMIT $2
|
LIMIT $2
|
||||||
FOR UPDATE SKIP LOCKED)
|
FOR UPDATE SKIP LOCKED),
|
||||||
|
community_interactions AS (
|
||||||
|
SELECT community_id,
|
||||||
|
SUM(comments + upvotes + downvotes) as total_interactions
|
||||||
|
FROM post_aggregates
|
||||||
|
WHERE published >= date_trunc('month', CURRENT_TIMESTAMP - interval '1 month')
|
||||||
|
GROUP BY community_id)
|
||||||
UPDATE post_aggregates pa
|
UPDATE post_aggregates pa
|
||||||
SET hot_rank = r.hot_rank(pa.score, pa.published),
|
SET hot_rank = r.hot_rank(pa.score, pa.published),
|
||||||
hot_rank_active = r.hot_rank(pa.score, pa.newest_comment_time_necro),
|
hot_rank_active = r.hot_rank(pa.score, pa.newest_comment_time_necro),
|
||||||
scaled_rank = r.scaled_rank(pa.score, pa.published, ca.users_active_month)
|
scaled_rank = r.scaled_rank(pa.score, pa.published, ci.total_interactions)
|
||||||
FROM batch, community_aggregates ca
|
FROM batch, community_interactions ci
|
||||||
WHERE pa.post_id = batch.post_id and pa.community_id = ca.community_id RETURNING pa.published;
|
WHERE pa.post_id = batch.post_id
|
||||||
"#,
|
AND pa.community_id = ci.community_id
|
||||||
|
RETURNING pa.published;
|
||||||
|
"#,
|
||||||
)
|
)
|
||||||
.bind::<Timestamptz, _>(previous_batch_last_published)
|
.bind::<Timestamptz, _>(previous_batch_last_published)
|
||||||
.bind::<Integer, _>(update_batch_size)
|
.bind::<Integer, _>(update_batch_size)
|
||||||
|
|
Loading…
Reference in a new issue