summaryrefslogtreecommitdiff
path: root/src/datalayer.clj
blob: 7086b126fcf54406beaea1182ed197ef83a08e7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
(ns datalayer
  (:require redis
            tags)
  (:use config
        utils))



;;;; Message lookup

(defn recent-posts-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.user_id = 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]
  (do-select [(recent-posts-query nil)
              (sql-array "int" user-ids)]))

(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
               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)]))))



;;;; Popular Posts

(def popular-dumps-qry "
select u.nick, u.avatar, r.key, m.message_id, m.content, m.created_on, count(*) as count,
               array_agg(u2.nick) as user_nicks
from users u, messages m, rooms r, tags t, users u2
where lower(u.nick) = lower(?)
and u.user_id = m.user_id and m.message_id = t.message_id
and m.room_id = r.room_id and m.is_image = true and r.admin_only = false
and t.tag = 'favorite'
and t.user_id = u2.user_id
group by u.nick, u.avatar, r.key, m.message_id, m.content, m.created_on
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)))]
      (assoc d
        :favers    favers
        :favorited (some #(= % viewer-nick) favers)))))

(defn fetch-popular-dumps-redis [nick viewer-nick]
  (let [rkey      (str "popular:" nick)
        msg-ids   (redis/with-server redis-server
                    (redis/zrevrange rkey 0 (dec num-popular-dumps)))
        msg-ids   (map maybe-parse-int msg-ids)]
    (tags/fetch-dumps-by-ids msg-ids viewer-nick)))