package io.kaif.rank; import static java.lang.Math.abs; import static java.lang.Math.log10; import static java.lang.Math.max; import java.time.Duration; import java.time.Instant; /** * see schema.sql FUNCTION hotRanking * see http://amix.dk/blog/post/19588 */ public class HotRanking { //reddit: 1134028003 - Thu, 08 Dec 2005 07:46:43 GMT // our: 1420070400 - Thu, 01 Jan 2015 00:00:00 GMT private static final Instant BASE_TIME = Instant.ofEpochSecond(1420070400); private static long total(long upVoted, long downVoted) { return upVoted - downVoted; } /** * 10 up vote = 1 * 100 up vote = 2 * 24 hr score = 1.92 * <p> * so to keep an article on tomorrow, it has to be ~100 up voted * <p> * python: * <p> * <pre> * s = score(ups, downs) * order = log(max(abs(s), 1), 10) * sign = 1 if s > 0 else -1 if s < 0 else 0 * seconds = epoch_seconds(date) - 1134028003 * return round(sign * order + seconds / 45000, 7) * </pre> */ public static double score(long upVoted, long downVoted, Instant createTime) { long s = total(upVoted, downVoted); double order = log10(max(abs(s), 1)); double sign = Long.signum(s); long seconds = Duration.between(BASE_TIME, createTime).getSeconds(); return sign * order + seconds / 45000.0; } }