From ee3ad0a6e91d727b12a383d84bb0ce17bcb681c4 Mon Sep 17 00:00:00 2001 From: Felisp Date: Fri, 13 Sep 2024 21:18:23 +0200 Subject: [PATCH] Initial filter implementation attempt --- src/rss_thread_watch/feed_generator.clj | 51 ++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/src/rss_thread_watch/feed_generator.clj b/src/rss_thread_watch/feed_generator.clj index 6f34a62..89aeb3f 100644 --- a/src/rss_thread_watch/feed_generator.clj +++ b/src/rss_thread_watch/feed_generator.clj @@ -20,7 +20,8 @@ [clojure.string :as s] [rss-thread-watch.watcher :as watcher] [rss-thread-watch.utils :as ut] - [rss-thread-watch.config :as conf]) + [rss-thread-watch.config :as conf] + [rss-thread-watch.filters :as f]) (:gen-class)) (def boards-enabled-cache @@ -56,12 +57,48 @@ (:last-modified thread) (:chod thread)))) +(defn make-filters + "Creates map of functions and filters from query string" + ;; In future predicates could return matched parts of string instead of + ;; t/nil values which could be used for coloring of results + [query-map] + (let [filtering-params '("q" "Q") ;Later add "r" for regex + filter-map (select-keys query-map filtering-params)] + (ut/fkmap (fn [k v] + {(case k + ;; regex filter here + "q" f/case-insensitive-filter + "Q" f/case-sensitive-filter) v}) + filter-map))) + + +(defn x [cache filters] + ;;must return fitlered cache + ;; {fun [key dfe dw kwd"]} + (filter + (fn [thread] + ;; run every function for each thread + (let [title (get thread :title)] + (some (fn [filter] + (let [queries (get filters filter)] + (some (fn [q] + (filter title queries)) + queries) + ;; some again? + ;; try some-map? + )) + (keys filters))) + ;;RESUME + ) cache + )) + + + (defn filter-chod-posts "Return list of all threads with equal or higher ChoD than requested - + ;;resume READS FROM GLOBALS: watcher.time-of-cache" [query-vec chod-treshold repeat? board-cache] - (let [{time-of-generation :time cache :data} board-cache guid-fn (case repeat? @@ -72,6 +109,7 @@ cache)) ;; So we don't have to search thru everything we have cached needed-cache-part (subvec cache cache-start-index) + ;; Here we gonna run fmap but not really actuall-matches (keep (fn [t] (let [title (:title t)] ;; Todo: Man, wouldn't it be cool to know which querry matched the thread? @@ -130,10 +168,11 @@ query :query-string scheme :scheme server-name :server-name} rqst - qrs (prms "q") + filters (make-filters prms) + ;; qrs (prms "q") self-uri (str (s/replace-first scheme ":" "") "://" server-name uri "?" query) - queries (if (vector? qrs) qrs [qrs]) ; to always return vector + ;; queries (if (vector? qrs) qrs [qrs]) ; to always return vector real-chod (if-let [ch (or (and (vector? chod) (first chod)) chod)] @@ -167,7 +206,7 @@ (when-not (prms "q") (throw (ex-info "400" {:status 400 :header {"Content-Type" "text/plain"} - :body (str "400 You MUST specify query with one OR more'q=searchTerm' url parameter(s)\n\n\n" + :body (str "400 You MUST specify query with one OR more'q=searchTerm' (or 'Q=SeARChteRm' for case sensitive) url parameter(s)\n\n\n" "Exmple: '" served-filename "?q=pony&q=IWTCIRD' will show in your feed all threads with 'pony' or 'IWTCIRD'" " in their title that are about to die.")}))) ;; Whether cache has been generated yet