Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 31 additions & 16 deletions otus-16/src/otus_16/homework.clj
Original file line number Diff line number Diff line change
@@ -1,21 +1,36 @@
(ns otus-16.homework)
(ns otus-16.homework
(:require [clojure.string :as str]
[clojure.java.io :as io]))

(defn parse-line [line]
(let [reg #".+\] \".*?/(.*?) .*?\" \d+ (\d+) \"(.*?)\".+"
[_ url bytes referer] (re-matches reg line)]
{:url url
:bytes (if (str/blank? bytes) 0 (Integer/parseInt bytes))
:referer referer}))

; при вводе без ключей и с ключом url-requested читаем sum-bytes, c ключом referer-requested - count-url
(defn read-log [log-file & {:keys [url-requested referer-requested]}]
(with-open [rdr (io/reader log-file)]
(loop [rem-log (line-seq rdr)
acc {:count-url 0 :sum-bytes 0}]
(if-not (seq rem-log) acc
(recur (drop 2 rem-log)
(let [{:keys [url bytes referer]} (read-log-line (first rem-log))]
(if (or (= url url-requested)
(= referer referer-requested)
(every? nil? [url-requested referer-requested]))
(-> acc
(update :count-url inc)
(update :sum-bytes #(+ % bytes)))
acc)))))))

(defn solution [& {:keys [url referrer]
:or {url :all referrer :all}}]
(println "doing something")
{:total-bytes 12345
;; если указан параметр url, то в хэш-мапе будет только одно значение
:bytes-by-url {"some-url" 12345}
;; если указан параметр referrer, то в хэш-мапе будет только одно значение
:urls-by-referrer {"some-referrer" 12345}})


(defn read-logs [log-files & {:keys [url-requested referer-requested]}]
(->> (pmap #(read-log % :url-requested url-requested
:referer-requested referer-requested) log-files)
(apply merge-with +)))

(comment
;; возможные вызовы функции
(solution)
(solution :url "some-url")
(solution :referrer "some-referrer")
(solution :url "some-url" :referrer "some-referrer"))
(-> (map (partial str "resources/access.log.") (range 2 10))
read-logs))