Advertisement
Guest User

Untitled

a guest
May 7th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns filter.core
  2.   (:require [clojure.string :as s]))
  3.  
  4.  
  5. ; Написать HTTP сервис позволяющий фильтровать сообщения из Kafka. Пользователь может добавить фильтр и система начинает запоминать все новые сообщения, которые подходят под фильтр (регистронезависимое вхождение строки) и потом отдавать по запросу.
  6.  
  7. ; API должно поддерживать такие операции:
  8.  
  9. ; Добавление нового фильтра для топика
  10. ; POST /filter
  11. ; {"topic": "books",
  12. ;  "q": "sicp"}
  13. ; Получение списка фильтров
  14. ; GET /filter
  15. ; Получение сообщений, накопленных фильтром со времени его создания
  16. ; GET /filter?id=1
  17. ; Удаление фильтра
  18. ; DELETE /filter
  19. ; {"id": 1}
  20. ; Для упрощения локального тестирования и разработки можно запускать зукипер и кафку прямо в процессе сервиса. Это можно сделать так.
  21.  
  22. (def datas (atom ()))
  23.  
  24. (defn filter-find [id]
  25.   (fn [row] (= (:id row) id)))
  26.  
  27. (defn add-filter [id filter]
  28.   (swap! datas conj {:id id :data filter}))
  29.  
  30. (defn remove-filter [id]
  31.   (swap! datas (fn [fs] (remove (filter-find id) fs))))
  32.  
  33. (defn filter-by [id]
  34.   (->> @datas
  35.        (filter (filter-find id))
  36.        (first)
  37.        :data))
  38.  
  39. (defn all-filters []
  40.   @datas)
  41.  
  42. (add-filter 1 {:topic "books"})
  43. (add-filter 2 {:topic "shops"})
  44.  
  45. (remove-filter 2)
  46.  
  47. (filter-by 2)
  48.  
  49. (def kafka-msg-1 {:topic "books", :name "Clojure", :author "Rich Hickey"})
  50. (def kafka-msg-2 {:topic "books", :name "F#", :author "Done Syme"})
  51.  
  52. (def filter-sample {:topic "books" :name "b" :author "rich"})
  53.  
  54. (into [] kafka-msg-1)
  55. (into [] filter-sample)
  56.  
  57. (defn pair-check [msg-pair filter-pair]
  58.   (let [[_ msg-value] msg-pair
  59.         [_ filter-value] filter-pair]
  60.     (and (and (string? msg-value) (string? filter-value)) (s/includes? msg-value filter-value))))
  61.  
  62. (defn find [item coll]
  63.   (->> coll
  64.        (filter #(= (first %) (first item)))
  65.        (first)))
  66.  
  67. (defn left-join-map [left-map right-map]
  68.   (let [left-vector (into [] left-map)
  69.         right-vector (into [] right-map)]
  70.     (map #(->> right-vector
  71.                (find %)
  72.                (pair-check %)) left-vector)))
  73.  
  74. (defn check-filter [msg filter is-strict]
  75.   (let [results (left-join-map msg filter)]
  76.     (if (true? is-strict)
  77.       (every? true? results)
  78.       (some true? results))))
  79.  
  80. (check-filter kafka-msg-1 filter-sample false)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement