diff options
Diffstat (limited to 'src/datalayer.clj')
| -rw-r--r-- | src/datalayer.clj | 106 |
1 files changed, 71 insertions, 35 deletions
diff --git a/src/datalayer.clj b/src/datalayer.clj index 8590a7d..c74315a 100644 --- a/src/datalayer.clj +++ b/src/datalayer.clj @@ -5,6 +5,7 @@ (:use clojure.contrib.sql clojure.contrib.json.write clojure.contrib.json.read + multikey-cache config jedis message @@ -69,14 +70,28 @@ WHERE u.nick = ANY(?)" (do-select [(recent-posts-nick-query nil) (sql-array "text" nicks)])) +(defn fetch-messages-by-id-uncached [m-ids] + (when-not (empty? m-ids) + (let [query "SELECT m.message_id, m.content, m.created_on, m.user_id, + m.is_image, u.nick, u.avatar, r.key, r.admin_only + FROM messages m, users u, rooms r + WHERE m.user_id = u.user_id + AND r.room_id = m.room_id + AND m.message_id = ANY(?)" + res (do-select [query + (sql-array "int" m-ids)])] + (sort-by-index-in res m-ids :message_id)))) + +(def message-cache-size 50000) +(def message-cache (multikey-lru-cache + fetch-messages-by-id-uncached + message-cache-size)) + +(defn fetch-messages-by-id [m-ids] + (get-keys message-cache m-ids)) + (defn fetch-message-by-id [m-id] - (let [query "SELECT m.message_id, m.content, m.created_on, m.user_id, - m.is_image, u.nick, u.avatar, r.key, r.admin_only - FROM messages m, users u, rooms r - WHERE m.user_id = u.user_id - AND r.room_id = m.room_id - AND m.message_id = ?"] - (first (do-select [query (maybe-parse-int m-id -1)])))) + (get-key message-cache m-id)) ;;;; Popular Posts @@ -95,7 +110,18 @@ WHERE u.nick = ANY(?)" (tags/fetch-dumps-by-ids msg-ids viewer-nick))))) -;;;; Redis Favscores +;;;; Redis Favscores and Hall + +(def redis-hall-key "hall") + +(defn fetch-redis-hall [viewer-nick] + (let [ids (map maybe-parse-int + (redis/with-server redis-server + (redis/zrevrange redis-hall-key 0 (dec num-hall-dumps))))] + (if-not (empty? ids) + (sort-by + #(* -1 (:count %)) + (tags/fetch-dumps-by-ids ids viewer-nick))))) (def score-piece-map (zipmap @@ -115,15 +141,34 @@ WHERE u.nick = ANY(?)" (def redis-favscores-key "favscores") +(defn redis-daily-hall-key [date-str] + (str "hall:daily:" date-str)) + +(defn fetch-redis-zset [key symbol offset num] + (for [t (with-jedis + #(.zrevrangeWithScores % + key + offset + (+ offset num 1))) + :when (> (int (.getScore t)) 0)] + {symbol (.getElement t) + :score (int (.getScore t))})) + +(defn fetch-redis-daily-hall [date-str offset num] + (let [msg-ids (fetch-redis-zset (redis-daily-hall-key date-str) + :message_id + offset + num) + full-msgs (fetch-messages-by-id (map :message_id msg-ids))] + (for [[info full] (map list msg-ids full-msgs)] + (assoc full :score (:score info))))) + (defn fetch-redis-directory [page num] (vec - (for [t (with-jedis - #(.zrevrangeWithScores % - redis-favscores-key - (* page num) - (dec (* (inc page) num))))] - {:nick (.getElement t) - :score (int (.getScore t))}))) + (fetch-redis-zset redis-favscores-key + :nick + (* page num) + (dec (* (inc page) num))))) (defn fetch-redis-favscore [nick] (if (= (lower-case nick) "scottbot") @@ -133,29 +178,20 @@ WHERE u.nick = ANY(?)" (redis/zscore "favscores" (lower-case nick))) 0))) -(defn incrby-redis-favscore! [nick msg-id inc is-image] - (let [msg-id (str msg-id) - inc (double inc)] +(defn incrby-redis-favscore! [msg incr] + (let [msg-id (str (:message_id msg)) + is-image? (:is_image msg) + nick (lower-case (:nick msg)) + incr (double incr)] (with-jedis #(do - (.zincrby % "favscores" inc (lower-case nick)) - (when is-image - (.zincrby % (str "popular:" nick) inc msg-id) - (.zincrby % "hall" inc msg-id)))))) - - -;;;; Redis Hall of Fame + (.zincrby % "favscores" incr nick) + (when is-image? + (let [date-str (format-yyyymmdd (:created_on msg))] + (.zincrby % (redis-daily-hall-key date-str) incr msg-id) + (.zincrby % (redis-popular-key nick) incr msg-id) + (.zincrby % redis-hall-key incr msg-id))))))) -(def redis-hall-key "hall") - -(defn fetch-redis-hall [viewer-nick] - (let [ids (map maybe-parse-int - (redis/with-server redis-server - (redis/zrevrange redis-hall-key 0 (dec num-hall-dumps))))] - (if-not (empty? ids) - (sort-by - #(* -1 (:count %)) - (tags/fetch-dumps-by-ids ids viewer-nick))))) ;;;; Message insertion |
