diff --git a/project.clj b/project.clj index 18cfb7c5..7d62c1b5 100644 --- a/project.clj +++ b/project.clj @@ -9,6 +9,7 @@ [datascript "0.15.1"] [honeysql "0.8.0"] [com.datomic/datomic-free "0.9.5359"] + [com.taoensso/tufte "1.0.2"] [jamesmacaulay/cljs-promises "0.1.0"]] :cljsbuild {:builds {:release { diff --git a/src/datomish/db.cljc b/src/datomish/db.cljc index 8762c448..3b59a884 100644 --- a/src/datomish/db.cljc +++ b/src/datomish/db.cljc @@ -14,10 +14,13 @@ [datomish.query.source :as source] [datomish.query :as query] [datomish.datom :as dd :refer [datom datom? #?@(:cljs [Datom])]] - [datomish.util :as util #?(:cljs :refer-macros :clj :refer) [raise raise-str cond-let]] + [datomish.util :as util + #?(:cljs :refer-macros :clj :refer) [raise raise-str cond-let]] [datomish.schema :as ds] [datomish.sqlite :as s] [datomish.sqlite-schema :as sqlite-schema] + [taoensso.tufte :as tufte + #?(:cljs :refer-macros :clj :refer) [defnp p profiled profile]] #?@(:clj [[datomish.pair-chan :refer [go-pair !]]]) #?@(:cljs [[datomish.pair-chan] @@ -91,19 +94,13 @@ (> - {:select [:e :a :v :tx [1 :added]] - :from [:all_datoms] - :where [:and [:= :e e] [:= :a a]]} - (s/format) ;; TODO: format these statements only once. - - (s/all-rows (:sqlite-connection db)) - (Datom (.-schema db)))))) - - (SQLite schema a v)] - (go-pair - (->> - {:select [:e :a :v :tx [1 :added]] ;; TODO: generalize columns. - :from [:all_datoms] - :where [:and [:= :e e] [:= :a a] [:= :value_type_tag tag] [:= :v v]]} - (s/format) ;; TODO: format these statements only once. - - (s/all-rows (:sqlite-connection db)) - (Datom (.-schema db))))))) ;; TODO: understand why (schema db) fails. - (SQLite schema a v)] (go-pair @@ -246,39 +215,6 @@ (mapv (partial row->Datom (.-schema db))))))) ;; TODO: understand why (schema db) fails. - (SQLite schema a v) - fulltext? (ds/fulltext? schema a)] - ;; Append to transaction log. - (SQLite schema a v) + fulltext? (ds/fulltext? schema a)] + (cond + (= op :db/add) + (let [v (if fulltext? + (> + (s/all-rows (:sqlite-connection db) ["SELECT * FROM transactions WHERE tx = ?" tx]) + (Datom schema))))] + tx-data)))) + (!]]]) #?@(:cljs [[datomish.pair-chan] @@ -334,124 +337,35 @@ (ds/ensure-valid-value schema a v))) report)) -(defn- datom. - (doseq [[e a v tx added :as datom] (:tx-data report)] - - (when added - ;; Check for violated :db/unique constraint between datom and existing store. - (when (ds/unique? schema a) - (when-let [found (first (tx-data [db report] - {:pre [(db/db? db) (report? report)]} - (go-pair - (let [initial-report report - {tx :tx} report - schema (db/schema db)] - (loop [report initial-report - es (:entities initial-report)] - (let [[[op e a v :as entity] & entities] es] - (cond - (nil? entity) - report - - (= op :db/add) - (if (ds/multival? schema a) - (if (empty? ( report - (transact-report (datom e a (.-v old-datom) tx false)) - (transact-report (datom e a v tx true))) - entities)) - (recur (transact-report report (datom e a v tx true)) entities))) - - (= op :db/retract) - (if (first (> - report - (preprocess db) + (let [> + report + (preprocess db) - (tx-data db) - ( - db + (collect-db-install-assertions db) + (p :collect-db-install-assertions)) - (db/ + db - (db/> (p :apply-db-ident-assertions)) - (db/> (p :apply-db-install-assertions))) + ] (-> report (assoc-in [:db-after] db-after))))) diff --git a/test/datomish/db_test.cljc b/test/datomish/db_test.cljc index 2433fd1d..8f875dcd 100644 --- a/test/datomish/db_test.cljc +++ b/test/datomish/db_test.cljc @@ -412,32 +412,48 @@ tx0 (:tx (