diff options
Diffstat (limited to 'src/datalayer.clj')
| -rw-r--r-- | src/datalayer.clj | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/src/datalayer.clj b/src/datalayer.clj index 38a597e..0d328b6 100644 --- a/src/datalayer.clj +++ b/src/datalayer.clj @@ -2,6 +2,7 @@ (:require redis tags) (:use config + jedis utils)) @@ -28,14 +29,42 @@ WHERE u.user_id = ANY(?)" user-id) ", false AS favorited"))) +(defn recent-posts-nick-query [user-id] + (format " +SELECT u.user_id, u.nick, u.avatar, + m.content, m.message_id%s +FROM users u +LEFT JOIN messages m on m.message_id = + (SELECT message_id FROM messages + WHERE user_id = u.user_id + AND is_image + AND room_id IN (SELECT room_id from rooms where admin_only = false) + ORDER BY created_on desc LIMIT 1) +WHERE u.nick = ANY(?)" + (if user-id + (format + ", + EXISTS (SELECT 1 FROM tags + WHERE tag = 'favorite' AND user_id = %s AND message_id = m.message_id) AS favorited" + user-id) + ", false AS favorited"))) + (defn lookup-recent-posts [user-tag-id user-ids] (do-select [(recent-posts-query user-tag-id) (sql-array "int" user-ids)])) -(defn lookup-recent-posts-tagless [user-tag-id user-ids] +(defn lookup-recent-posts-tagless [user-ids] (do-select [(recent-posts-query nil) (sql-array "int" user-ids)])) +(defn lookup-recent-posts-by-nicks [user-tag-id nicks] + (do-select [(recent-posts-nick-query user-tag-id) + (sql-array "varchar" nicks)])) + +(defn lookup-recent-posts-tagless-by-nicks [nicks] + (do-select [(recent-posts-nick-query nil) + (sql-array "text" nicks)])) + (defn fetch-message-by-id [m-id] (let [query "SELECT m.message_id, m.content, m.created_on, m.user_id, u.nick, u.avatar, r.key, r.admin_only @@ -63,7 +92,7 @@ order by count desc limit ? offset ?") (defn fetch-popular-dumps [nick viewer-nick] (for [d (do-select [popular-dumps-qry nick 40 0])] - (let [favers (vec (.getArray (:user_nicks d)))] + (let [favers (.getArray (:user_nicks d))] (assoc d :favers favers :favorited (some #(= % viewer-nick) favers))))) @@ -75,3 +104,38 @@ order by count desc limit ? offset ?") msg-ids (map maybe-parse-int msg-ids)] (if-not (empty? msg-ids) (tags/fetch-dumps-by-ids msg-ids viewer-nick)))) + + +;;;; Redis Favscores + +(defn fetch-redis-directory [offset num] + (vec + (for [t (with-jedis + #(.zrevrangeWithScores % "favscores" offset (dec num)))] + {:nick (.getElement t) + :score (int (.getScore t))}))) + +(defn fetch-redis-favscore [nick] + (maybe-parse-int + (redis/with-server redis-server + (redis/zscore "favscores" (lower-case nick))) + 0)) + +(defn incrby-redis-favscore! [nick msg-id inc] + (let [msg-id (str msg-id) + inc (double inc)] + (with-jedis + #(doto % + (.zincrby "favscores" inc (lower-case nick)) + (.zincrby (str "popular:" nick) inc msg-id) + (.zincrby "hall" inc msg-id))))) + + +;;;; Redis Hall of Fame + +(defn fetch-redis-hall [viewer-nick] + (let [ids (map maybe-parse-int + (redis/with-server redis-server + (redis/zrevrange "hall" 0 (dec num-hall-dumps))))] + (if-not (empty? ids) + (tags/fetch-dumps-by-ids ids viewer-nick)))) |
