Skip to content

Commit 1d978a9

Browse files
committed
feat: message stats and user stats
1 parent b7f5546 commit 1d978a9

File tree

4 files changed

+40
-12
lines changed

4 files changed

+40
-12
lines changed

src/clojurians_log/db/queries.clj

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,16 +137,23 @@
137137
[?emoji :emoji/url ?url]]
138138
db)))
139139

140-
(defn message-stats-between-days [db from-date to-date]
141-
(d/q '[:find ?msg ?day
142-
:in $ ?from-date ?to-date
140+
(defn unique-users-between-days [db from-day to-day]
141+
(d/q '[:find (count ?user)
142+
:in $ ?from-day ?to-day
143143
:where
144+
[?msg :message/user ?user]
144145
[?msg :message/day ?day]
145-
[(> ?day ?from-date)]
146-
[(< ?day ?to-date)]]
146+
[(> ?day ?from-day)]
147+
[(< ?day ?to-day)]]
147148
db
148-
from-date
149-
to-date))
149+
from-day
150+
to-day))
151+
152+
(defn message-stats-between-days [from-day to-day]
153+
(letfn [(day-chan-cnt [] (:day-chan-cnt @!indexes))
154+
(day-total [day] (apply + (vals (get (day-chan-cnt) day))))
155+
(days-total [days] (transduce (map day-total) + 0 days))]
156+
(mapv #(hash-map :day % :msg-count (day-total %)) (time-util/range-of-days from-day to-day))))
150157

151158
#_
152159
(doseq [v [#'clojurians-log.db.queries/user-names

src/clojurians_log/routes.clj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,11 @@
145145
response/xml-render)))
146146

147147
(defn message-stats-route [{:keys [endpoint] :as request}]
148-
(let [config @(get-in endpoint [:config :value])
149-
db (db-from-endpoint endpoint)
148+
(let [config @(get-in endpoint [:config :value])
150149
{:keys [from-date to-date]} (:path-params request)]
151150
(-> request
152151
make-context
153-
(assoc :data/message-stats (queries/message-stats-between-days db from-date to-date))
152+
(assoc :data/message-stats (queries/message-stats-between-days from-date to-date))
154153
views/message-stats-page
155154
response/render)))
156155

src/clojurians_log/time_util.clj

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
(:require [java-time :as jt]
33
[java-time.local :as jt.l]
44
[clojure.string :as str])
5-
(:import [java.time Instant]
5+
(:import [java.time Instant LocalDate]
66
[java.time.format DateTimeFormatter]))
77

88
(defn ts->inst
@@ -81,3 +81,14 @@
8181
ret# ~expr]
8282
(prn (str ~label ": " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs"))
8383
ret#))
84+
85+
(defn range-of-local-dates [^LocalDate ld1 ^LocalDate ld2]
86+
(when (.isBefore ld1 (.plusDays ld2 1))
87+
(cons ld1 (lazy-seq (range-of-local-dates (.plusDays ld1 1) ld2)))))
88+
89+
(defn range-of-days
90+
"Takes 2 day values as a strings and returns range of all days between them inclusive of both"
91+
[from-day to-day]
92+
(let [ld1 (java.time.LocalDate/parse from-day)
93+
ld2 (java.time.LocalDate/parse to-day)]
94+
(map str (range-of-local-dates ld1 ld2))))

src/clojurians_log/views.clj

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,18 @@
288288

289289
(defn- message-stats-page-html [{:data/keys [message-stats] :as context}]
290290
[:div
291-
(for [[a b] message-stats] [:p a b])])
291+
[:h3 (str "Showing message stats between "
292+
(:day (first message-stats))
293+
" to "
294+
(:day (last message-stats)))]
295+
[:table
296+
[:thead
297+
[:tr
298+
[:th "Day"]
299+
[:th "Message count"]]]
300+
[:tbody
301+
(for [day-stat message-stats] [:tr [:td (:day day-stat)] [:td (:msg-count day-stat)]])]]
302+
[:h4 "Total message count: " (reduce #(+ %1 (:msg-count %2)) 0 message-stats)]])
292303

293304
(defn log-page [context]
294305
(assoc context :response/html (log-page-html context)))

0 commit comments

Comments
 (0)