summaryrefslogtreecommitdiff
path: root/src/redisload.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/redisload.clj')
-rw-r--r--src/redisload.clj100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/redisload.clj b/src/redisload.clj
new file mode 100644
index 0000000..31a25f0
--- /dev/null
+++ b/src/redisload.clj
@@ -0,0 +1,100 @@
+(ns redisload
+ (:use clojure.contrib.sql
+ clojure.contrib.str-utils
+ config
+ datalayer
+ utils)
+ (:require redis))
+
+(defn redis-days [n]
+ (* 24 60 60))
+
+(def tag-query "
+SELECT
+ u.nick as author,
+ u.user_id as author_id,
+ m.message_id as message_id,
+ m.content as message_content,
+ m.is_image as is_image,
+ m.created_on as message_ts,
+ r.key as room,
+ r.admin_only as admin_only,
+ t.created_on as tagged_on,
+ u2.nick as tagger,
+ u2.user_id as tagger_id
+FROM users u, messages m, rooms r, tags t, users u2
+WHERE
+ u.user_id = m.user_id AND
+ m.message_id = t.message_id AND
+ r.room_id = m.room_id AND
+ u2.user_id = t.user_id AND
+ r.admin_only = false
+")
+
+(def tag-counter (ref 0))
+
+(defn stream-tags [fs]
+ (with-connection *db*
+ (with-query-results rs [tag-query]
+ (doseq [r rs]
+ (if (:admin_only r)
+ (println r))
+ (dosync
+ (ref-set tag-counter (inc @tag-counter)))
+ (doseq [f fs]
+ (f r))))))
+
+(def hall-map (ref {}))
+(def popular-map (ref {}))
+(def score-map (ref {}))
+
+(defn update-popular [r]
+ (dosync
+ (let [author (:author r)
+ msg-id (:message_id r)
+ user-map (get @popular-map author {})
+ msg-cnt (get user-map msg-id 0)
+ hall-cnt (get @hall-map msg-id 0)
+ usr-cnt (get @score-map author 0)]
+ (alter score-map assoc author (inc usr-cnt))
+ (alter hall-map assoc msg-id (inc hall-cnt))
+ (if (:is_image r)
+ (alter popular-map assoc author
+ (assoc user-map msg-id (inc msg-cnt)))))))
+
+(defn transmit-popular []
+ (doseq [[nick msgs] @popular-map]
+ (let [sorted-msgs (sort #(>= (second %1) (second %2)) msgs)
+ userkey (str "popular:" nick)]
+ (redis/atomically
+ (redis/del key)
+ (doseq [[msg-id score] (take (* num-popular-dumps 2)
+ sorted-msgs)]
+ (redis/zadd userkey score msg-id)))))
+ (println "cached popular data for" (count @popular-map) "users"))
+
+(defn transmit-favscores []
+ (redis/atomically
+ (redis/del "favscores")
+ (doseq [[nick score] @score-map]
+ (redis/zadd "favscores" score (lower-case nick))))
+ (println "cached favscores for " (count @score-map) "users"))
+
+(defn transmit-hall []
+ (let [scores (take (* 2 num-hall-dumps)
+ (sort #(>= (second %1) (second %2)) @hall-map))]
+ (redis/atomically
+ (redis/del "hall")
+ (doseq [[msg-id score] scores]
+ (redis/zadd "hall" score msg-id)))))
+
+
+(println "streaming tags")
+(stream-tags [update-popular])
+(println (format "processed %s tags" @tag-counter))
+
+(redis/with-server redis-server
+ (transmit-favscores)
+ (transmit-popular)
+ (transmit-hall))
+