mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-12-22 10:51:29 +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
|
||||
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
|
||||
LANGUAGE sql
|
||||
IMMUTABLE PARALLEL SAFE
|
||||
-- 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
|
||||
-- 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.
|
||||
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.
|
||||
|
|
|
@ -531,7 +531,7 @@ pub mod functions {
|
|||
|
||||
define_sql_function! {
|
||||
#[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! {
|
||||
|
|
|
@ -228,19 +228,27 @@ async fn process_post_aggregates_ranks_in_batches(conn: &mut AsyncPgConnection)
|
|||
while let Some(previous_batch_last_published) = previous_batch_result {
|
||||
let result = sql_query(
|
||||
r#"WITH batch AS (SELECT pa.post_id
|
||||
FROM post_aggregates pa
|
||||
WHERE pa.published > $1
|
||||
AND (pa.hot_rank != 0 OR pa.hot_rank_active != 0)
|
||||
ORDER BY pa.published
|
||||
LIMIT $2
|
||||
FOR UPDATE SKIP LOCKED)
|
||||
UPDATE post_aggregates pa
|
||||
SET hot_rank = r.hot_rank(pa.score, pa.published),
|
||||
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)
|
||||
FROM batch, community_aggregates ca
|
||||
WHERE pa.post_id = batch.post_id and pa.community_id = ca.community_id RETURNING pa.published;
|
||||
"#,
|
||||
FROM post_aggregates pa
|
||||
WHERE pa.published > $1
|
||||
AND (pa.hot_rank != 0 OR pa.hot_rank_active != 0)
|
||||
ORDER BY pa.published
|
||||
LIMIT $2
|
||||
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
|
||||
SET hot_rank = r.hot_rank(pa.score, pa.published),
|
||||
hot_rank_active = r.hot_rank(pa.score, pa.newest_comment_time_necro),
|
||||
scaled_rank = r.scaled_rank(pa.score, pa.published, ci.total_interactions)
|
||||
FROM batch, community_interactions ci
|
||||
WHERE pa.post_id = batch.post_id
|
||||
AND pa.community_id = ci.community_id
|
||||
RETURNING pa.published;
|
||||
"#,
|
||||
)
|
||||
.bind::<Timestamptz, _>(previous_batch_last_published)
|
||||
.bind::<Integer, _>(update_batch_size)
|
||||
|
|
Loading…
Reference in a new issue