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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
(ns views.base-subscribed-views-test (ns views.base-subscribed-views-test
(:require (:require
[views.base-subscribed-views :as bsv] ; :refer [BaseSubscribedViews]] [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.subscriptions :as vs :refer [subscribed-to?]]
[views.fixtures :as vf] [views.fixtures :as vf]
[clojure.test :refer [use-fixtures deftest is]] [clojure.test :refer [use-fixtures deftest is]]

View file

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