|
@@ -5,23 +5,80 @@
|
|
|
;; Disable clj linters since we don't support clj
|
|
|
#?(:clj {:clj-kondo/config {:linters {:unresolved-namespace {:level :off}
|
|
|
:unresolved-symbol {:level :off}}}})
|
|
|
- (:require [cljs.core]
|
|
|
- #?(:org.babashka/nbb [datascript.db])
|
|
|
+ (:require #?(:org.babashka/nbb [datascript.db])
|
|
|
+ [cljs.core]
|
|
|
+ [datascript.core :as d]
|
|
|
[datascript.impl.entity :as entity :refer [Entity]]
|
|
|
- [logseq.db.frontend.content :as db-content]
|
|
|
- [logseq.db.frontend.property :as db-property]
|
|
|
- [logseq.db.frontend.entity-util :as entity-util]
|
|
|
+ [frontend.common.missionary-util :as c.m]
|
|
|
+ [frontend.flows :as flows]
|
|
|
[logseq.common.util.date-time :as date-time-util]
|
|
|
- [datascript.core :as d]))
|
|
|
-
|
|
|
-(def db-based-graph? entity-util/db-based-graph?)
|
|
|
-
|
|
|
-(def lookup-entity @#'entity/lookup-entity)
|
|
|
+ [logseq.db.frontend.entity-util :as entity-util]
|
|
|
+ [logseq.db.frontend.property :as db-property]
|
|
|
+ [missionary.core :as m]))
|
|
|
+
|
|
|
+(def immutable-db-idents
|
|
|
+ "These db-ident entities are immutable,
|
|
|
+ it means `(db/entity :block/title)` always return same result"
|
|
|
+ #{:block/created-at :block/updated-at
|
|
|
+ :block/uuid :block/title :block/tags :block/name :block/format
|
|
|
+ :block/schema :block/path-refs :block/refs :block/tx-id :block/type
|
|
|
+ :block/page :block/parent :block/order :block/journal-day :block/closed-value-property
|
|
|
+ :block/link :block/marker :block/warning :block/collapsed? :block/deadline :block/scheduled :block/level
|
|
|
+ :block/pre-block? :block/heading-level
|
|
|
+
|
|
|
+ :block/_refs :logseq.property/_query
|
|
|
+
|
|
|
+ :block.temp/search? :block.temp/ast-title :block.temp/ast-body
|
|
|
+ :block.temp/fully-loaded? :block.temp/top? :block.temp/bottom?
|
|
|
+
|
|
|
+ :db/cardinality :db/ident :db/index :db/valueType
|
|
|
+
|
|
|
+ :logseq.kv/db-type
|
|
|
+
|
|
|
+ :logseq.property.node/display-type :logseq.property/icon
|
|
|
+ :logseq.property.asset/type :logseq.property.asset/checksum
|
|
|
+ :logseq.property/created-from-property
|
|
|
+
|
|
|
+ :logseq.class/Query :logseq.class/Journal :logseq.class/Cards :logseq.class/Task})
|
|
|
+
|
|
|
+(def ^:private lookup-entity @#'entity/lookup-entity)
|
|
|
+
|
|
|
+(def ^:private *seen-immutable-entities (volatile! {}))
|
|
|
+
|
|
|
+(defn reset-immutable-entities-cache!
|
|
|
+ []
|
|
|
+ (vreset! *seen-immutable-entities {}))
|
|
|
+
|
|
|
+(c.m/run-background-task
|
|
|
+ ::reset-immutable-entities-cache!
|
|
|
+ (m/reduce
|
|
|
+ (fn [_ repo]
|
|
|
+ (when (some? repo)
|
|
|
+ (prn :reset-immutable-entities-cache!)
|
|
|
+ (reset-immutable-entities-cache!)))
|
|
|
+ flows/current-repo-flow))
|
|
|
+
|
|
|
+(defn entity-memoized
|
|
|
+ [db eid]
|
|
|
+ (if (and (qualified-keyword? eid)
|
|
|
+ (contains? immutable-db-idents eid))
|
|
|
+ (if-let [e (find @*seen-immutable-entities eid)]
|
|
|
+ (val e)
|
|
|
+ (let [r (d/entity db eid)]
|
|
|
+ (vswap! *seen-immutable-entities assoc eid r)
|
|
|
+ r))
|
|
|
+ (d/entity db eid)))
|
|
|
+
|
|
|
+(defn db-based-graph?
|
|
|
+ "Whether the current graph is db-only"
|
|
|
+ [db]
|
|
|
+ (when db
|
|
|
+ (= "db" (:kv/value (entity-memoized db :logseq.kv/db-type)))))
|
|
|
|
|
|
(defn- get-journal-title
|
|
|
[db e]
|
|
|
(date-time-util/int->journal-title (:block/journal-day e)
|
|
|
- (:logseq.property.journal/title-format (d/entity db :logseq.class/Journal))))
|
|
|
+ (:logseq.property.journal/title-format (entity-memoized db :logseq.class/Journal))))
|
|
|
|
|
|
(defn- get-block-title
|
|
|
[^Entity e k default-value]
|
|
@@ -36,7 +93,7 @@
|
|
|
(let [result (lookup-entity e k default-value)
|
|
|
refs (:block/refs e)
|
|
|
result' (if (and (string? result) refs)
|
|
|
- (db-content/id-ref->title-ref result refs search?)
|
|
|
+ ((resolve 'logseq.db.frontend.content/id-ref->title-ref) result refs search?)
|
|
|
result)]
|
|
|
(or result' default-value)))))))
|
|
|
|
|
@@ -51,7 +108,7 @@
|
|
|
result
|
|
|
;; property default value
|
|
|
(when (qualified-keyword? k)
|
|
|
- (when-let [property (d/entity db k)]
|
|
|
+ (when-let [property (entity-memoized db k)]
|
|
|
(let [schema (lookup-entity property :block/schema nil)]
|
|
|
(if (= :checkbox (:type schema))
|
|
|
(lookup-entity property :logseq.property/scalar-default-value nil)
|
|
@@ -107,7 +164,9 @@
|
|
|
[^js this]
|
|
|
(let [v @(.-cache this)
|
|
|
v' (if (:block/title v)
|
|
|
- (assoc v :block/title (db-content/id-ref->title-ref (:block/title v) (:block/refs this) (:block.temp/search? this)))
|
|
|
+ (assoc v :block/title
|
|
|
+ ((resolve 'logseq.db.frontend.content/id-ref->title-ref)
|
|
|
+ (:block/title v) (:block/refs this) (:block.temp/search? this)))
|
|
|
v)]
|
|
|
(concat (seq v')
|
|
|
(seq (.-kv this)))))
|