prefix -> namespace, created default-ns namespace for subscriptions

This commit is contained in:
Dave Della Costa 2014-06-10 13:02:00 +09:00
parent e263ed10c6
commit 99f2ba61a4
5 changed files with 55 additions and 62 deletions

View file

@ -1,7 +1,7 @@
(ns views.base-subscribed-views
(:require
[views.db.load :refer [initial-views]]
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn prefix-fn]]
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn namespace-fn]]
[views.subscriptions :as vs :refer [add-subscriptions! remove-subscription! subscriptions-for]]
[clojure.tools.logging :refer [debug info warn error]]
[clojure.core.async :refer [put! <! go thread]]))
@ -51,8 +51,8 @@
view-sigs (view-filter sub-req (:views sub-req) templates opts)] ; this is where security comes in.
(info "Subscribing views: " view-sigs " for subscriber " subscriber-key)
(when (seq view-sigs)
(let [subbed-views (if-let [prefix (prefix-fn this sub-req)]
(add-subscriptions! subscriber-key view-sigs templates prefix)
(let [subbed-views (if-let [namespace (namespace-fn this sub-req)]
(add-subscriptions! subscriber-key view-sigs templates namespace)
(add-subscriptions! subscriber-key view-sigs templates))]
(thread
(->> (initial-views db view-sigs templates subbed-views)
@ -63,21 +63,21 @@
(let [subscriber-key (subscriber-key-fn this unsub-req)
view-sigs (:views unsub-req)]
(info "Unsubscribing views: " view-sigs " for subscriber " subscriber-key)
(if-let [prefix (prefix-fn this unsub-req)]
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs prefix))
(if-let [namespace (namespace-fn this unsub-req)]
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs namespace))
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs)))))
(disconnect [this disconnect-req]
(let [subscriber-key (:subscriber-key disconnect-req)
prefix (prefix-fn this disconnect-req)
view-sigs (if prefix (subscriptions-for subscriber-key prefix) (subscriptions-for subscriber-key))]
(if prefix
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs prefix))
namespace (namespace-fn this disconnect-req)
view-sigs (if namespace (subscriptions-for subscriber-key namespace) (subscriptions-for subscriber-key))]
(if namespace
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs namespace))
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs)))))
(subscriber-key-fn [this msg] (:subscriber-key msg))
(prefix-fn [this msg] nil)
(namespace-fn [this msg] nil)
;; DB interaction
(subscribed-views [this] @vs/compiled-views)

View file

@ -6,7 +6,7 @@
(unsubscribe-views [this unsub-request])
(disconnect [this disconnect-request])
(subscriber-key-fn [this msg])
(prefix-fn [this msg])
(namespace-fn [this msg])
;; DB interaction
(broadcast-deltas [this db views-with-deltas])

View file

@ -7,12 +7,14 @@
;;
;; or
;;
;; {prefix {[:view-sig 1 "arg2"] {:keys [1 2 3 4 ... ] :view-map {:view ...}}}}
;; {namespace {[:view-sig 1 "arg2"] {:keys [1 2 3 4 ... ] :view-map {:view ...}}}}
;;
(def subscribed-views (atom {}))
(def compiled-views (atom {}))
(def default-ns :default-ns)
(defn- add-subscriber-key
[subscriber-key]
(fn [view-subs]
@ -26,59 +28,50 @@
(defn add-subscription!
([subscriber-key view-sig templates]
(swap! subscribed-views #(update-in % [view-sig] (add-subscriber-key subscriber-key)))
(add-compiled-view! view-sig templates))
([subscriber-key view-sig templates prefix]
(swap! subscribed-views #(update-in % [prefix view-sig] (add-subscriber-key subscriber-key)))
(add-subscription! subscriber-key view-sig templates default-ns))
([subscriber-key view-sig templates namespace]
(swap! subscribed-views #(update-in % [namespace view-sig] (add-subscriber-key subscriber-key)))
(add-compiled-view! view-sig templates)))
(defn add-subscriptions!
([subscriber-key view-sigs templates]
(add-subscriptions! subscriber-key view-sigs templates nil))
([subscriber-key view-sigs templates prefix]
(last (mapv
#(if prefix
(add-subscription! subscriber-key % templates prefix)
(add-subscription! subscriber-key % templates))
view-sigs))))
(add-subscriptions! subscriber-key view-sigs templates default-ns))
([subscriber-key view-sigs templates namespace]
(last (mapv #(add-subscription! subscriber-key % templates namespace) view-sigs))))
(defn subscriptions-for
([subscriber-key]
(reduce #(if (contains? (second %2) subscriber-key) (conj %1 (first %2)) %1) [] @subscribed-views))
([subscriber-key prefix]
(reduce #(if (contains? (second %2) subscriber-key) (conj %1 (first %2)) %1) [] (get @subscribed-views prefix))))
([subscriber-key] (subscriptions-for subscriber-key default-ns))
([subscriber-key namespace]
(reduce #(if (contains? (second %2) subscriber-key) (conj %1 (first %2)) %1) [] (get @subscribed-views namespace))))
(defn subscribed-to
([view-sig]
(get @subscribed-views view-sig))
([view-sig prefix]
(get-in @subscribed-views [prefix view-sig])))
([view-sig] (subscribed-to view-sig default-ns))
([view-sig namespace]
(get-in @subscribed-views [namespace view-sig])))
(defn subscribed-to?
([subscriber-key view-sig]
(subscribed-to? subscriber-key view-sig nil))
([subscriber-key view-sig prefix]
(if-let [view-subs (if prefix (subscribed-to view-sig prefix) (subscribed-to view-sig))]
(subscribed-to? subscriber-key view-sig default-ns))
([subscriber-key view-sig namespace]
(if-let [view-subs (subscribed-to view-sig namespace)]
(view-subs subscriber-key))))
(defn- remove-key-or-view
[subscriber-key view-sig prefix]
[subscriber-key view-sig namespace]
(fn [subbed-views]
(let [path (if prefix [prefix view-sig] [view-sig])
(let [path [namespace view-sig]
updated (update-in subbed-views path disj subscriber-key)]
(if (seq (get-in updated path))
updated
(do (swap! compiled-views dissoc view-sig) ; remove the compiled view as well
(if prefix
(update-in updated [prefix] dissoc view-sig)
(dissoc updated view-sig)))))))
(update-in updated [namespace] dissoc view-sig))))))
(defn remove-subscription!
([subscriber-key view-sig]
(remove-subscription! subscriber-key view-sig nil))
([subscriber-key view-sig prefix]
(when (subscribed-to? subscriber-key view-sig (if prefix prefix))
(swap! subscribed-views (remove-key-or-view subscriber-key view-sig prefix)))))
(remove-subscription! subscriber-key view-sig default-ns))
([subscriber-key view-sig namespace]
(when (subscribed-to? subscriber-key view-sig namespace)
(swap! subscribed-views (remove-key-or-view subscriber-key view-sig namespace)))))
(defn compiled-view-for
[view-sig]

View file

@ -1,7 +1,7 @@
(ns views.base-subscribed-views-test
(:require
[views.base-subscribed-views :as bsv] ; :refer [BaseSubscribedViews]]
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn prefix-fn subscribe-views unsubscribe-views disconnect]]
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn namespace-fn subscribe-views unsubscribe-views disconnect]]
[views.subscriptions :as vs :refer [subscribed-to?]]
[views.fixtures :as vf]
[clojure.test :refer [use-fixtures deftest is]]

View file

@ -16,12 +16,12 @@
(vs/add-subscription! key view-sig templates)
(is (vs/subscribed-to? key view-sig))))
(deftest can-use-prefix
(let [prefix1 1, prefix2 2, key 1, view-sig [:user-posts 1]]
(vs/add-subscription! key view-sig templates prefix1)
(vs/add-subscription! key view-sig templates prefix2)
(is (vs/subscribed-to? key view-sig prefix1))
(is (vs/subscribed-to? key view-sig prefix2))))
(deftest can-use-namespace
(let [namespace1 1, namespace2 2, key 1, view-sig [:user-posts 1]]
(vs/add-subscription! key view-sig templates namespace1)
(vs/add-subscription! key view-sig templates namespace2)
(is (vs/subscribed-to? key view-sig namespace1))
(is (vs/subscribed-to? key view-sig namespace2))))
(deftest removes-a-subscription
(let [key 1, view-sig [:user-posts 1]]
@ -33,19 +33,19 @@
(vs/remove-subscription! 1 [:user-posts 1])
(is (= {} @vs/subscribed-views)))
(deftest removes-a-subscription-with-prefix
(let [prefix1 1, prefix2 2, key 1, view-sig [:user-posts 1]]
(vs/add-subscription! key view-sig templates prefix1)
(vs/add-subscription! key view-sig templates prefix2)
(vs/remove-subscription! key view-sig prefix1)
(is (not (vs/subscribed-to? key view-sig prefix1)))
(is (vs/subscribed-to? key view-sig prefix2))))
(deftest removes-a-subscription-with-namespace
(let [namespace1 1, namespace2 2, key 1, view-sig [:user-posts 1]]
(vs/add-subscription! key view-sig templates namespace1)
(vs/add-subscription! key view-sig templates namespace2)
(vs/remove-subscription! key view-sig namespace1)
(is (not (vs/subscribed-to? key view-sig namespace1)))
(is (vs/subscribed-to? key view-sig namespace2))))
(deftest removes-unsubscribed-to-view-from-subscribed-views
(let [key 1, view-sig [:user-posts 1]]
(vs/add-subscription! key view-sig templates)
(vs/remove-subscription! key view-sig)
(is (= {} @vs/subscribed-views))))
(is (= {:default-ns {}} @vs/subscribed-views))))
(deftest adds-multiple-views-at-a-time
(let [key 1, view-sigs [[:user-posts 1] [:user-posts 2]]]
@ -70,7 +70,7 @@
(vs/add-subscriptions! key view-sigs templates)
(is (= (set (vs/subscriptions-for 1)) (set view-sigs)))))
(deftest retrieves-subscriptions-for-subscriber-with-prefix
(let [key 1, view-sigs [[:users][:user-posts 1]] prefix 1]
(vs/add-subscriptions! key view-sigs templates prefix)
(is (= (set (vs/subscriptions-for 1 prefix)) (set view-sigs)))))
(deftest retrieves-subscriptions-for-subscriber-with-namespace
(let [key 1, view-sigs [[:users][:user-posts 1]] namespace 1]
(vs/add-subscriptions! key view-sigs templates namespace)
(is (= (set (vs/subscriptions-for 1 namespace)) (set view-sigs)))))