summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/site.clj94
1 files changed, 41 insertions, 53 deletions
diff --git a/src/site.clj b/src/site.clj
index ceea48b..b4adfdf 100644
--- a/src/site.clj
+++ b/src/site.clj
@@ -418,59 +418,48 @@
;; Directory
-(def *directory-agent* (agent nil))
-(def *directory-listing* (ref []))
(def *per-directory-page* 25)
-(def *run-update-directory* true)
-(def *update-directory-sleep* (minutes 15))
+(def *directory-refresh-period-sec* 60)
-(defn directory-search [offset]
- (let [directory @*directory-listing*
- users (subvec directory
- (min (count directory)
- (* offset *per-directory-page*))
- (min (count directory)
- (* (inc offset) *per-directory-page*)))
- user-ids (apply str (interpose ", " (map #(%1 :user_id) users)))
- qry (str "SELECT u.user_id, u.nick, u.avatar, m.content, m.message_id
- FROM users u, messages m
- WHERE u.user_id in (" user-ids ")
- AND m.user_id = u.user_id
- AND m.message_id = (SELECT message_id FROM messages
- WHERE user_id = u.user_id
- AND room_id = 1
- AND is_image = true
- ORDER BY created_on DESC LIMIT 1)")]
- (when (> (count user-ids) 0)
- (let [res (do-select [qry])
- keys (map :user_id res)
- res-dict (zipmap keys res)]
- (map (fn [u]
- (let [u-id (u :user_id)]
- (process-directory-listing (merge u (res-dict u-id)))))
- users)))))
+(def *directory-update-query* "
+SELECT m.user_id,
+ u.nick,
+ u.avatar,
+ message_id,
+ m.created_on,
+ msg_count,
+ content
+FROM (SELECT user_id,
+ created_on,
+ message_id,
+ content,
+ MAX(created_on) OVER (PARTITION BY user_id) max_created_on,
+ COUNT(*) OVER (PARTITION BY user_id) msg_count
+ FROM messages
+ WHERE room_id = 1
+ AND is_image = true) AS m,
+ users u
+WHERE m.created_on = max_created_on
+ AND m.user_id = u.user_id
+ORDER BY msg_count DESC")
-(defn update-directory! []
- (let [qry "SELECT u.user_id, COUNT(m) as cnt
- FROM users u, messages m
- WHERE u.user_id = m.user_id
- AND m.room_id = 1
- AND m.is_image = true
- GROUP BY u.user_id
- ORDER BY COUNT(m) DESC"
- res (vec (do-select [qry]))]
- (dosync (ref-set *directory-listing* res))
- res))
+(defn fetch-directory []
+ (vec (do-select [*directory-update-query*])))
-(defn update-directory-agent-func [x]
- (update-directory!)
- (Thread/sleep *update-directory-sleep*)
- (when *run-update-directory*
- (send *directory-agent* #'update-directory-agent-func))
- x)
+(def *directory-list*
+ (scheduled-agent (no-args-adaptor fetch-directory)
+ *directory-refresh-period-sec*
+ []))
-(defn start-directory-updater! []
- (send *directory-agent* update-directory-agent-func))
+(defn directory-search [offset]
+ (let [directory (poll *directory-list*)
+ users (subvec directory
+ (min (count directory)
+ (* offset *per-directory-page*))
+ (min (count directory)
+ (* (inc offset) *per-directory-page*)))]
+ (when (> (count users) 0)
+ (map process-directory-listing users))))
(defn directory [session offset]
(let [st (fetch-template "directory" session)
@@ -482,7 +471,7 @@
(if (> offset 0)
(.setAttribute st "cur" offset))
(.setAttribute st "next" (str "/" (inc offset)))
- (if (zero? (count @*directory-listing*))
+ (if (zero? (count (poll *directory-list*)))
(.setAttribute st "notloaded" true))
(.toString st)))
@@ -512,10 +501,10 @@
(defn topic-map-from-room [r]
(let [topic (or @(r :topic) {})]
- {"key" (r :key)
- "topic" (topic :topic)
+ {"key" (r :key)
+ "topic" (topic :topic)
"deadline" (topic :deadline)
- "maker" (topic :maker)}))
+ "maker" (topic :maker)}))
(defn validate-topic-list [session]
(if (is-vip? session)
@@ -1085,4 +1074,3 @@
(start-server (options :port))
(start-user-flusher!)
(start-session-pruner!)
-(start-directory-updater!)