diff options
Diffstat (limited to 'src/site.clj')
| -rw-r--r-- | src/site.clj | 94 |
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!) |
