From 5a25838a690967010502659dc32faece4ec9d2da Mon Sep 17 00:00:00 2001 From: Dave Della Costa Date: Tue, 10 Jun 2014 20:34:36 +0900 Subject: [PATCH] got vexec! partially working --- src/views/base_subscribed_views.clj | 14 ++++++----- src/views/core.clj | 13 ++++++---- src/views/db/core.clj | 30 ++++++++++++----------- src/views/persistor.clj | 9 ++++--- src/views/subscribed_views.clj | 4 +-- src/views/subscriptions.clj | 4 +++ test/views/base_subscribed_views_test.clj | 2 +- test/views/core_test.clj | 7 +++--- 8 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/views/base_subscribed_views.clj b/src/views/base_subscribed_views.clj index b4c07bf..959ad5f 100644 --- a/src/views/base_subscribed_views.clj +++ b/src/views/base_subscribed_views.clj @@ -1,7 +1,7 @@ (ns views.base-subscribed-views (:require - [views.persistor :refer [subscribe-to-view! unsubscribe-from-view! unsubscribe-from-all-views!]] - [views.subscribed-views :refer [SubscribedViews]] + [views.persistor :refer [subscribe-to-view! unsubscribe-from-view! unsubscribe-from-all-views! get-subscribed-views]] + [views.subscribed-views :refer [ISubscribedViews]] [views.subscriptions :refer [default-ns]] [views.filters :refer [view-filter]] [clojure.tools.logging :refer [debug info warn error]] @@ -22,7 +22,7 @@ (if namespace-fn (namespace-fn msg) default-ns)) (deftype BaseSubscribedViews [opts] - SubscribedViews + ISubscribedViews (subscribe-views [this {db :db :as msg}] (let [{:keys [persistor templates send-fn subscriber-key-fn namespace-fn unsafe?]} opts @@ -34,6 +34,7 @@ (info "Subscribing views: " view-sigs " for subscriber " subscriber-key ", in namespace " namespace) (when (seq view-sigs) (thread + (println "WTF") (doseq [vs view-sigs] (send-fn* send-fn subscriber-key (subscribe-to-view! persistor db vs popts))))))) @@ -52,7 +53,8 @@ namespace (namespace-fn* namespace-fn msg)] (unsubscribe-from-all-views! persistor subscriber-key namespace))) - ;; DB interaction - (subscribed-views [this]) + (subscribed-views [this args] + (get-subscribed-views (:persistor opts) (namespace-fn* (:namespace-fn opts) args))) - (broadcast-deltas [this fdb views-with-deltas])) + (broadcast-deltas [this fdb views-with-deltas] + (println "broadcasting 1 2 3"))) diff --git a/src/views/core.clj b/src/views/core.clj index 9012efa..91a9357 100644 --- a/src/views/core.clj +++ b/src/views/core.clj @@ -1,9 +1,12 @@ (ns views.core (:require - [views.base-subscribed-views]) - (:import - [views.base_subscribed_views BaseSubscribedViews])) + [views.base-subscribed-views :as bsv]; :refer [BaseSubscribedViews]] + [views.persistor :as vp])); :refer [InMemoryPersistor]])) + ;; (:import + ;; [views.persistor InMemoryPersistor] + ;; [views.base_subscribed_views BaseSubscribedViews])) (defmacro config - [{:keys [db schema] :as opts}] - {:db db :schema schema :subscribed-views (BaseSubscribedViews. opts)}) + [{:keys [db schema persistor] :as opts}] + (let [opts (if persistor opts (assoc opts :persistor (vp/->InMemoryPersistor)))] + {:db db :schema schema :base-subscribed-views (bsv/->BaseSubscribedViews opts)})) diff --git a/src/views/db/core.clj b/src/views/db/core.clj index dc94e6d..cad43e1 100644 --- a/src/views/db/core.clj +++ b/src/views/db/core.clj @@ -449,7 +449,7 @@ "Used to perform arbitrary insert/update/delete actions on the database, while ensuring that view deltas are appropriately checked and calculated for the currently registered views as reported by a type implementing - the SubscribedViews protocol. + the ISubscribedViews protocol. Arguments are: @@ -459,22 +459,24 @@ - action-map: the HoneySQL map for the insert/update/delete action - - subscribed-views: an implementation of SubscribedViews implementing + - subscribed-views: an implementation of ISubscribedViews implementing the follow functions: - - get-subscribed-views takes a database connection. It should return + - subscribed-views takes a ... . It should return a collection of view-maps. - - send-deltas takes a db connection, and the views which have had deltas + - broadcast-deltas takes a db connection, and the views which have had deltas calculate for them and associated with the hash-maps (appropriately called views-with-deltas)." - [schema db action-map subscribed-views] - (let [subbed-views (subscribed-views subscribed-views db) - transaction-fn #(do-view-transaction schema db subbed-views action-map)] - (if-let [deltas (:deltas db)] ;; inside a transaction we just collect deltas and do not retry - (let [{:keys [views-with-deltas result-set]} (transaction-fn)] - (swap! deltas into views-with-deltas) - result-set) - (let [{:keys [views-with-deltas result-set]} (do-transaction-fn-with-retries transaction-fn)] - (broadcast-deltas subscribed-views db views-with-deltas) - result-set)))) + ([action-map opts] + (vexec! (:db opts) action-map opts)) + ([db action-map {:keys [schema base-subscribed-views]}] + (let [subbed-views (subscribed-views base-subscribed-views db) + transaction-fn #(do-view-transaction schema db subbed-views action-map)] + (if-let [deltas (:deltas db)] ;; inside a transaction we just collect deltas and do not retry + (let [{:keys [views-with-deltas result-set]} (transaction-fn)] + (swap! deltas into views-with-deltas) + result-set) + (let [{:keys [views-with-deltas result-set]} (do-transaction-fn-with-retries transaction-fn)] + (broadcast-deltas base-subscribed-views db views-with-deltas) + result-set))))) diff --git a/src/views/persistor.clj b/src/views/persistor.clj index 46f9a8e..d768682 100644 --- a/src/views/persistor.clj +++ b/src/views/persistor.clj @@ -1,13 +1,14 @@ (ns views.persistor (:require [clojure.java.jdbc :as j] - [views.subscriptions :refer [add-subscription! remove-subscription! compiled-view-for subscriptions-for]] + [views.subscriptions :refer [add-subscription! remove-subscription! compiled-view-for compiled-views-for subscriptions-for]] [views.db.load :refer [initial-view]])) (defprotocol IPersistor (subscribe-to-view! [this db view-sig opts]) (unsubscribe-from-view! [this view-sig subscriber-key namespace]) - (unsubscribe-from-all-views! [this subscriber-key namespace])) + (unsubscribe-from-all-views! [this subscriber-key namespace]) + (get-subscribed-views [this namespace])) (deftype InMemoryPersistor [] IPersistor @@ -24,4 +25,6 @@ (unsubscribe-from-all-views! [this subscriber-key namespace] (doseq [vs (subscriptions-for subscriber-key namespace)] - (remove-subscription! vs subscriber-key namespace)))) + (remove-subscription! vs subscriber-key namespace))) + + (get-subscribed-views [this namespace] (compiled-views-for namespace))) diff --git a/src/views/subscribed_views.clj b/src/views/subscribed_views.clj index 2b88b65..46ebbe9 100644 --- a/src/views/subscribed_views.clj +++ b/src/views/subscribed_views.clj @@ -1,6 +1,6 @@ (ns views.subscribed-views) -(defprotocol SubscribedViews +(defprotocol ISubscribedViews ;; Subscription and Delta routing (subscribe-views [this sub-request]) (unsubscribe-views [this unsub-request]) @@ -8,4 +8,4 @@ ;; DB interaction (broadcast-deltas [this db views-with-deltas]) - (subscribed-views [this])) + (subscribed-views [this args])) diff --git a/src/views/subscriptions.clj b/src/views/subscriptions.clj index 6a6c41d..2f88f42 100644 --- a/src/views/subscriptions.clj +++ b/src/views/subscriptions.clj @@ -77,3 +77,7 @@ ([view-sig] (compiled-view-for view-sig default-ns)) ([view-sig namespace] (get-in @subscribed-views [namespace view-sig :view-data]))) + +(defn compiled-views-for + [namespace] + (get @subscribed-views namespace)) diff --git a/test/views/base_subscribed_views_test.clj b/test/views/base_subscribed_views_test.clj index 7b26b4e..98f45c6 100644 --- a/test/views/base_subscribed_views_test.clj +++ b/test/views/base_subscribed_views_test.clj @@ -2,7 +2,7 @@ (:require [views.base-subscribed-views :as bsv] ; :refer [BaseSubscribedViews]] [views.persistor];; :refer [InMemoryPersistor]] - [views.subscribed-views :refer [SubscribedViews subscribe-views unsubscribe-views disconnect]] + [views.subscribed-views :refer [subscribe-views unsubscribe-views disconnect]] [views.subscriptions :as vs :refer [subscribed-to?]] [views.fixtures :as vf] [clojure.test :refer [use-fixtures deftest is]] diff --git a/test/views/core_test.clj b/test/views/core_test.clj index c310138..371b418 100644 --- a/test/views/core_test.clj +++ b/test/views/core_test.clj @@ -3,13 +3,12 @@ [clojure.test :refer [use-fixtures deftest is]] [edl.core :refer [defschema]] [views.fixtures :as vf] - [views.subscribed-views :as vs] ;; :refer [SubscribedViews]] + [views.subscribed-views :as vs] [views.core :refer [config]])) (defschema schema vf/db "public") (deftest configures-views (let [conf (config {:db vf/db :schema schema :templates vf/templates :unsafe? true})] - (println (satisfies? views.subscribed-views/SubscribedViews (:subscribed-views conf))) ; wtf?! - ;; (is (satisfies? views.subscribed-views/SubscribedViews (:subscribed-views conf))))) - )) + ;; wtf is this false?! + (is (satisfies? views.subscribed-views/ISubscribedViews (:subscribed-views conf)))))