|
@@ -1,7 +1,6 @@
|
|
|
(ns logseq.db.common.initial-data
|
|
|
"Provides db helper fns for graph initialization and lazy loading entities"
|
|
|
- (:require [clojure.set :as set]
|
|
|
- [datascript.core :as d]
|
|
|
+ (:require [datascript.core :as d]
|
|
|
[datascript.impl.entity :as de]
|
|
|
[logseq.common.config :as common-config]
|
|
|
[logseq.common.util :as common-util]
|
|
@@ -86,10 +85,6 @@
|
|
|
(update block :block/link (fn [link] (d/pull db '[*] (:db/id link))))
|
|
|
block)))
|
|
|
|
|
|
-(defn- mark-block-fully-loaded
|
|
|
- [b]
|
|
|
- (assoc b :block.temp/fully-loaded? true))
|
|
|
-
|
|
|
(comment
|
|
|
(defn- property-without-db-attrs
|
|
|
[property]
|
|
@@ -132,27 +127,30 @@
|
|
|
|
|
|
(defn get-block-children-ids
|
|
|
"Returns children UUIDs"
|
|
|
- [db block-uuid]
|
|
|
+ [db block-uuid & {:keys [include-collapsed-children?]
|
|
|
+ :or {include-collapsed-children? true}}]
|
|
|
(when-let [eid (:db/id (d/entity db [:block/uuid block-uuid]))]
|
|
|
- (let [seen (volatile! [])]
|
|
|
- (loop [steps 100 ;check result every 100 steps
|
|
|
- eids-to-expand [eid]]
|
|
|
+ (let [seen (volatile! #{})]
|
|
|
+ (loop [eids-to-expand [eid]]
|
|
|
(when (seq eids-to-expand)
|
|
|
- (let [eids-to-expand*
|
|
|
- (mapcat (fn [eid] (map first (d/datoms db :avet :block/parent eid))) eids-to-expand)
|
|
|
- uuids-to-add (remove nil? (map #(:block/uuid (d/entity db %)) eids-to-expand*))]
|
|
|
- (when (and (zero? steps)
|
|
|
- (seq (set/intersection (set @seen) (set uuids-to-add))))
|
|
|
- (throw (ex-info "bad outliner data, need to re-index to fix"
|
|
|
- {:seen @seen :eids-to-expand eids-to-expand})))
|
|
|
+ (let [children
|
|
|
+ (mapcat (fn [eid]
|
|
|
+ (let [e (d/entity db eid)]
|
|
|
+ (when (or include-collapsed-children?
|
|
|
+ (not (:block/collapsed? e))
|
|
|
+ (common-entity-util/page? e))
|
|
|
+
|
|
|
+ (:block/_parent e)))) eids-to-expand)
|
|
|
+ uuids-to-add (keep :block/uuid children)]
|
|
|
(vswap! seen (partial apply conj) uuids-to-add)
|
|
|
- (recur (if (zero? steps) 100 (dec steps)) eids-to-expand*))))
|
|
|
+ (recur (keep :db/id children)))))
|
|
|
@seen)))
|
|
|
|
|
|
(defn get-block-children
|
|
|
"Including nested children."
|
|
|
- [db block-uuid]
|
|
|
- (let [ids (get-block-children-ids db block-uuid)]
|
|
|
+ {:arglists '([db block-uuid & {:keys [include-collapsed-children?]}])}
|
|
|
+ [db block-uuid & {:as opts}]
|
|
|
+ (let [ids (get-block-children-ids db block-uuid opts)]
|
|
|
(when (seq ids)
|
|
|
(map (fn [id] (d/entity db [:block/uuid id])) ids))))
|
|
|
|
|
@@ -163,10 +161,36 @@
|
|
|
m))
|
|
|
|
|
|
(defn- entity->map
|
|
|
- [entity]
|
|
|
- (-> (into {} entity)
|
|
|
- (with-raw-title entity)
|
|
|
- (assoc :db/id (:db/id entity))))
|
|
|
+ [entity & {:keys [level]
|
|
|
+ :or {level 0}}]
|
|
|
+ (let [opts {:level (inc level)}
|
|
|
+ f (if (> level 0)
|
|
|
+ identity
|
|
|
+ (fn [e]
|
|
|
+ (keep (fn [[k v]]
|
|
|
+ (when-not (contains? #{:block/path-refs} k)
|
|
|
+ (let [v' (cond
|
|
|
+ (= k :block/parent)
|
|
|
+ (:db/id v)
|
|
|
+ (= k :block/tags)
|
|
|
+ (set (map :db/id v))
|
|
|
+ (= k :logseq.property/created-by-ref)
|
|
|
+ (:db/id v)
|
|
|
+ (= k :block/refs)
|
|
|
+ (map #(select-keys % [:db/id :block/uuid :block/title]) v)
|
|
|
+ (de/entity? v)
|
|
|
+ (entity->map v opts)
|
|
|
+ (and (coll? v) (every? de/entity? v))
|
|
|
+ (map #(entity->map % opts) v)
|
|
|
+ :else
|
|
|
+ v)]
|
|
|
+ [k v'])))
|
|
|
+ e)))
|
|
|
+ m (->> (f entity)
|
|
|
+ (into {}))]
|
|
|
+ (-> m
|
|
|
+ (with-raw-title entity)
|
|
|
+ (assoc :db/id (:db/id entity)))))
|
|
|
|
|
|
(defn hidden-ref?
|
|
|
"Whether ref-block (for block with the `id`) should be hidden."
|
|
@@ -202,19 +226,9 @@
|
|
|
count))
|
|
|
0))
|
|
|
|
|
|
-(defn- update-entity->map
|
|
|
- [m]
|
|
|
- (update-vals m (fn [v]
|
|
|
- (cond
|
|
|
- (de/entity? v)
|
|
|
- (entity->map v)
|
|
|
- (and (coll? v) (every? de/entity? v))
|
|
|
- (map entity->map v)
|
|
|
- :else
|
|
|
- v))))
|
|
|
-
|
|
|
(defn ^:large-vars/cleanup-todo get-block-and-children
|
|
|
- [db id-or-page-name {:keys [children? children-only? nested-children? properties children-props]}]
|
|
|
+ [db id-or-page-name {:keys [children? properties include-collapsed-children?]
|
|
|
+ :or {include-collapsed-children? false}}]
|
|
|
(let [block (let [eid (cond (uuid? id-or-page-name)
|
|
|
[:block/uuid id-or-page-name]
|
|
|
(integer? id-or-page-name)
|
|
@@ -227,60 +241,29 @@
|
|
|
(d/entity db (get-first-page-by-name db (name id-or-page-name)))
|
|
|
:else
|
|
|
nil))
|
|
|
- block-refs-count? (some #{:block.temp/refs-count} properties)
|
|
|
- whiteboard? (common-entity-util/whiteboard? block)]
|
|
|
+ block-refs-count? (some #{:block.temp/refs-count} properties)]
|
|
|
(when block
|
|
|
- (let [children (when (or children? children-only?)
|
|
|
- (let [page? (common-entity-util/page? block)
|
|
|
- children (->>
|
|
|
- (cond
|
|
|
- (and nested-children? (not page?))
|
|
|
- (get-block-children db (:block/uuid block))
|
|
|
- nested-children?
|
|
|
- (:block/_page block)
|
|
|
- :else
|
|
|
- (let [short-page? (when page?
|
|
|
- (<= (count (:block/_page block)) 100))]
|
|
|
- (if short-page?
|
|
|
- (:block/_page block)
|
|
|
- (:block/_parent block))))
|
|
|
- (remove (fn [e] (or (:logseq.property/created-from-property e)
|
|
|
- (:block/closed-value-property e)))))
|
|
|
- children-props (if whiteboard?
|
|
|
- '[*]
|
|
|
- (or children-props
|
|
|
- [:db/id :block/uuid :block/parent :block/order :block/collapsed? :block/title
|
|
|
- ;; pre-loading feature-related properties to avoid UI refreshing
|
|
|
- :logseq.property/status :logseq.property.node/display-type :block/refs]))]
|
|
|
+ (let [children (when children?
|
|
|
+ (let [children (let [children (get-block-children db (:block/uuid block) {:include-collapsed-children? include-collapsed-children?})
|
|
|
+ children' (if (>= (count children) 100)
|
|
|
+ (:block/_parent block)
|
|
|
+ children)]
|
|
|
+ (->> children'
|
|
|
+ (remove (fn [e] (:block/closed-value-property e)))))]
|
|
|
(map
|
|
|
(fn [block]
|
|
|
- (-> (if (= children-props '[*])
|
|
|
- block
|
|
|
- (-> (select-keys block children-props)
|
|
|
- (with-raw-title block)
|
|
|
- (assoc :block.temp/has-children? (some? (:block/_parent block)))))
|
|
|
- update-entity->map
|
|
|
- (dissoc :block/path-refs)))
|
|
|
- children)))]
|
|
|
- (if children-only?
|
|
|
- {:children children}
|
|
|
- (let [block' (if (seq properties)
|
|
|
- (-> (select-keys block properties)
|
|
|
- (with-raw-title block)
|
|
|
- (assoc :db/id (:db/id block)))
|
|
|
- (entity->map block))
|
|
|
- block' (cond->
|
|
|
- (mark-block-fully-loaded block')
|
|
|
- true
|
|
|
- update-entity->map
|
|
|
- true
|
|
|
- (dissoc :block/path-refs)
|
|
|
- block-refs-count?
|
|
|
- (assoc :block.temp/refs-count (get-block-refs-count db (:db/id block))))]
|
|
|
- (cond->
|
|
|
- {:block block'}
|
|
|
- children?
|
|
|
- (assoc :children children))))))))
|
|
|
+ (-> block
|
|
|
+ (assoc :block.temp/has-children? (some? (:block/_parent block)))
|
|
|
+ (dissoc :block/tx-id :block/created-at :block/updated-at)
|
|
|
+ entity->map))
|
|
|
+ children)))
|
|
|
+ block' (cond-> (entity->map block)
|
|
|
+ block-refs-count?
|
|
|
+ (assoc :block.temp/refs-count (get-block-refs-count db (:db/id block))))]
|
|
|
+ (cond->
|
|
|
+ {:block block'}
|
|
|
+ children?
|
|
|
+ (assoc :children children))))))
|
|
|
|
|
|
(defn get-latest-journals
|
|
|
[db]
|