From 04a93f66135ebc85cc990da8479433a813f8c2ed Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Tue, 15 Apr 2025 22:43:28 -0400 Subject: [PATCH] chore: mv db or file graph specific ldb fns to db or file graph namespaces. Follow up to https://github.com/logseq/logseq/pull/11774#discussion_r2035354875 to help avoid bugs that are hard to spot b/c of no organization --- .clj-kondo/config.edn | 1 + deps/db/.clj-kondo/config.edn | 1 + deps/db/src/logseq/db.cljs | 130 +++--------------- deps/db/src/logseq/db/frontend/db.cljs | 113 +++++++++++++++ .../src/logseq/graph_parser/db.cljs | 7 + src/main/frontend/common/graph_view.cljs | 6 +- src/main/frontend/db/model.cljs | 2 +- 7 files changed, 143 insertions(+), 117 deletions(-) create mode 100644 deps/db/src/logseq/db/frontend/db.cljs diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 79bc386151..7b7f19d53c 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -182,6 +182,7 @@ logseq.db.file-based.entity-util file-entity-util logseq.db.frontend.class db-class logseq.db.frontend.content db-content + logseq.db.frontend.db db-db logseq.db.frontend.db-ident db-ident logseq.db.frontend.entity-plus entity-plus logseq.db.frontend.entity-util entity-util diff --git a/deps/db/.clj-kondo/config.edn b/deps/db/.clj-kondo/config.edn index c05ef9884c..53cd1bd430 100644 --- a/deps/db/.clj-kondo/config.edn +++ b/deps/db/.clj-kondo/config.edn @@ -16,6 +16,7 @@ logseq.db.common.view db-view logseq.db.frontend.content db-content logseq.db.frontend.class db-class + logseq.db.frontend.db db-db logseq.db.frontend.db-ident db-ident logseq.db.frontend.inputs db-inputs logseq.db.frontend.property db-property diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 75448218e6..80508c3514 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -1,19 +1,19 @@ (ns logseq.db - "Main namespace for public db fns. For DB and file graphs. - For shared file graph only fns, use logseq.graph-parser.db" + "Main namespace for db fns that handles DB and file graphs. For db graph only + fns, use logseq.db.frontend.db and for file graph only fns, use + logseq.graph-parser.db" (:require [clojure.set :as set] [clojure.string :as string] [clojure.walk :as walk] [datascript.core :as d] [datascript.impl.entity :as de] [logseq.common.util :as common-util] - [logseq.common.util.namespace :as ns-util] - [logseq.common.util.page-ref :as page-ref] [logseq.common.uuid :as common-uuid] [logseq.db.common.delete-blocks :as delete-blocks] ;; Load entity extensions [logseq.db.common.entity-util :as common-entity-util] [logseq.db.common.sqlite :as sqlite-common-db] [logseq.db.frontend.class :as db-class] + [logseq.db.frontend.db :as db-db] [logseq.db.frontend.entity-plus :as entity-plus] [logseq.db.frontend.entity-util :as entity-util] [logseq.db.frontend.property :as db-property] @@ -412,11 +412,6 @@ [] (common-uuid/gen-uuid)) -(defn get-classes-with-property - "Get classes which have given property as a class property" - [db property-id] - (:logseq.property.class/_properties (d/entity db property-id))) - (defn get-alias-source-page "return the source page (page-name) of an alias" [db alias-id] @@ -492,37 +487,13 @@ e)))))) (def built-in? entity-util/built-in?) - -(defn built-in-class-property? - "Whether property a built-in property for the specific class" - [class-entity property-entity] - (and (built-in? class-entity) - (class? class-entity) - (built-in? property-entity) - (contains? (set (get-in (db-class/built-in-classes (:db/ident class-entity)) [:schema :properties])) - (:db/ident property-entity)))) - -(defn private-built-in-page? - "Private built-in pages should not be navigable or searchable by users. Later it - could be useful to use this for the All Pages view" - [page] - (cond (property? page) - (not (public-built-in-property? page)) - (or (class? page) (internal-page? page)) - false - ;; Default to true for closed value and future internal types. - ;; Other types like whiteboard are not considered because they aren't built-in - :else - true)) +(def get-classes-with-property db-db/get-classes-with-property) +(def built-in-class-property? db-db/built-in-class-property?) +(def private-built-in-page? db-db/private-built-in-page?) (def write-transit-str sqlite-util/write-transit-str) (def read-transit-str sqlite-util/read-transit-str) - -(defn build-favorite-tx - "Builds tx for a favorite block in favorite page" - [favorite-uuid] - {:block/link [:block/uuid favorite-uuid] - :block/title ""}) +(def build-favorite-tx db-db/build-favorite-tx) (defn get-key-value [db key-ident] @@ -544,87 +515,20 @@ [db] (when db (get-key-value db :logseq.kv/remote-schema-version))) -(defn get-all-properties - [db] - (->> (d/datoms db :avet :block/tags :logseq.class/Property) - (map (fn [d] - (d/entity db (:e d)))))) - -(defn get-page-parents - [node & {:keys [node-class?]}] - (when-let [parent (:logseq.property/parent node)] - (loop [current-parent parent - parents' []] - (if (and - current-parent - (if node-class? (class? current-parent) true) - (not (contains? parents' current-parent))) - (recur (:logseq.property/parent current-parent) - (conj parents' current-parent)) - (vec (reverse parents')))))) - -(defn get-title-with-parents - [entity] - (if (or (entity-util/class? entity) (entity-util/internal-page? entity)) - (let [parents' (->> (get-page-parents entity) - (remove (fn [e] (= :logseq.class/Root (:db/ident e)))) - vec)] - (string/join - ns-util/parent-char - (map :block/title (conj (vec parents') entity)))) - (:block/title entity))) - -(defn get-classes-parents - [tags] - (let [tags' (filter class? tags) - result (mapcat #(get-page-parents % {:node-class? true}) tags')] - (set result))) - -(defn class-instance? - "Whether `object` is an instance of `class`" - [class object] - (let [tags (:block/tags object) - tags-ids (set (map :db/id tags))] - (or - (contains? tags-ids (:db/id class)) - (let [class-parent-ids (set (map :db/id (get-classes-parents tags)))] - (contains? (set/union class-parent-ids tags-ids) (:db/id class)))))) - -(defn inline-tag? - [block-raw-title tag] - (assert (string? block-raw-title) "block-raw-title should be a string") - (string/includes? block-raw-title (str "#" (page-ref/->page-ref (:block/uuid tag))))) - -(defonce node-display-type-classes - #{:logseq.class/Code-block :logseq.class/Math-block :logseq.class/Quote-block}) - -(defn get-class-ident-by-display-type - [display-type] - (case display-type - :code :logseq.class/Code-block - :math :logseq.class/Math-block - :quote :logseq.class/Quote-block - nil)) - -(defn get-display-type-by-class-ident - [class-ident] - (case class-ident - :logseq.class/Code-block :code - :logseq.class/Math-block :math - :logseq.class/Quote-block :quote - nil)) +(def get-all-properties db-db/get-all-properties) +(def get-page-parents db-db/get-page-parents) +(def get-classes-parents db-db/get-classes-parents) +(def get-title-with-parents db-db/get-title-with-parents) +(def class-instance? db-db/class-instance?) +(def inline-tag? db-db/inline-tag?) +(def node-display-type-classes db-db/node-display-type-classes) +(def get-class-ident-by-display-type db-db/get-class-ident-by-display-type) +(def get-display-type-by-class-ident db-db/get-display-type-by-class-ident) (def get-recent-updated-pages sqlite-common-db/get-recent-updated-pages) (def get-latest-journals sqlite-common-db/get-latest-journals) -(defn get-all-namespace-relation - [db] - (d/q '[:find ?page ?parent - :where - [?page :block/namespace ?parent]] - db)) - (defn get-pages-relation [db with-journal?] (if (entity-plus/db-based-graph? db) diff --git a/deps/db/src/logseq/db/frontend/db.cljs b/deps/db/src/logseq/db/frontend/db.cljs new file mode 100644 index 0000000000..5d83ec31f0 --- /dev/null +++ b/deps/db/src/logseq/db/frontend/db.cljs @@ -0,0 +1,113 @@ +(ns logseq.db.frontend.db + "DB graph fns commonly used outside db dep" + (:require [clojure.set :as set] + [clojure.string :as string] + [datascript.core :as d] + [logseq.common.util.namespace :as ns-util] + [logseq.common.util.page-ref :as page-ref] + [logseq.db.frontend.class :as db-class] + [logseq.db.frontend.entity-util :as entity-util] + [logseq.db.frontend.property :as db-property])) + +(defn get-classes-with-property + "Get classes which have given property as a class property" + [db property-id] + (:logseq.property.class/_properties (d/entity db property-id))) + +(defn built-in-class-property? + "Whether property a built-in property for the specific class" + [class-entity property-entity] + (and (entity-util/built-in? class-entity) + (entity-util/class? class-entity) + (entity-util/built-in? property-entity) + (contains? (set (get-in (db-class/built-in-classes (:db/ident class-entity)) [:schema :properties])) + (:db/ident property-entity)))) + +(defn private-built-in-page? + "Private built-in pages should not be navigable or searchable by users. Later it + could be useful to use this for the All Pages view" + [page] + (cond (entity-util/property? page) + (not (db-property/public-built-in-property? page)) + (or (entity-util/class? page) (entity-util/internal-page? page)) + false + ;; Default to true for closed value and future internal types. + ;; Other types like whiteboard are not considered because they aren't built-in + :else + true)) + +(defn build-favorite-tx + "Builds tx for a favorite block in favorite page" + [favorite-uuid] + {:block/link [:block/uuid favorite-uuid] + :block/title ""}) + +(defn get-all-properties + [db] + (->> (d/datoms db :avet :block/tags :logseq.class/Property) + (map (fn [d] + (d/entity db (:e d)))))) + +(defn get-page-parents + [node & {:keys [node-class?]}] + (when-let [parent (:logseq.property/parent node)] + (loop [current-parent parent + parents' []] + (if (and + current-parent + (if node-class? (entity-util/class? current-parent) true) + (not (contains? parents' current-parent))) + (recur (:logseq.property/parent current-parent) + (conj parents' current-parent)) + (vec (reverse parents')))))) + +(defn get-title-with-parents + [entity] + (if (or (entity-util/class? entity) (entity-util/internal-page? entity)) + (let [parents' (->> (get-page-parents entity) + (remove (fn [e] (= :logseq.class/Root (:db/ident e)))) + vec)] + (string/join + ns-util/parent-char + (map :block/title (conj (vec parents') entity)))) + (:block/title entity))) + +(defn get-classes-parents + [tags] + (let [tags' (filter entity-util/class? tags) + result (mapcat #(get-page-parents % {:node-class? true}) tags')] + (set result))) + +(defn class-instance? + "Whether `object` is an instance of `class`" + [class object] + (let [tags (:block/tags object) + tags-ids (set (map :db/id tags))] + (or + (contains? tags-ids (:db/id class)) + (let [class-parent-ids (set (map :db/id (get-classes-parents tags)))] + (contains? (set/union class-parent-ids tags-ids) (:db/id class)))))) + +(defn inline-tag? + [block-raw-title tag] + (assert (string? block-raw-title) "block-raw-title should be a string") + (string/includes? block-raw-title (str "#" (page-ref/->page-ref (:block/uuid tag))))) + +(defonce node-display-type-classes + #{:logseq.class/Code-block :logseq.class/Math-block :logseq.class/Quote-block}) + +(defn get-class-ident-by-display-type + [display-type] + (case display-type + :code :logseq.class/Code-block + :math :logseq.class/Math-block + :quote :logseq.class/Quote-block + nil)) + +(defn get-display-type-by-class-ident + [class-ident] + (case class-ident + :logseq.class/Code-block :code + :logseq.class/Math-block :math + :logseq.class/Quote-block :quote + nil)) diff --git a/deps/graph-parser/src/logseq/graph_parser/db.cljs b/deps/graph-parser/src/logseq/graph_parser/db.cljs index 5dd1b7740b..52782b90b5 100644 --- a/deps/graph-parser/src/logseq/graph_parser/db.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/db.cljs @@ -59,3 +59,10 @@ [db page-name] (some-> (ldb/get-page db page-name) :block/file)) + +(defn get-all-namespace-relation + [db] + (d/q '[:find ?page ?parent + :where + [?page :block/namespace ?parent]] + db)) diff --git a/src/main/frontend/common/graph_view.cljs b/src/main/frontend/common/graph_view.cljs index 4a6cecd43c..d677f4aa52 100644 --- a/src/main/frontend/common/graph_view.cljs +++ b/src/main/frontend/common/graph_view.cljs @@ -79,7 +79,7 @@ (let [dark? (= "dark" theme) relation (ldb/get-pages-relation db journal?) tagged-pages (ldb/get-all-tagged-pages db) - namespaces (ldb/get-all-namespace-relation db) + namespaces (gp-db/get-all-namespace-relation db) tags (set (map second tagged-pages)) full-pages (ldb/get-all-pages db) db-based? (entity-plus/db-based-graph? db) @@ -178,7 +178,7 @@ tags (set (remove #(= page-id %) tags)) ref-pages (get-page-referenced-pages db page-id) mentioned-pages (get-pages-that-mentioned-page db page-id show-journal) - namespaces (ldb/get-all-namespace-relation db) + namespaces (gp-db/get-all-namespace-relation db) links (concat namespaces (map (fn [ref-page] @@ -216,7 +216,7 @@ (if (ldb/page? b) b (:block/page b)))) (remove (fn [node] (= (:db/id block) (:db/id node)))) (common-util/distinct-by :db/id)) - namespaces (ldb/get-all-namespace-relation db) + namespaces (gp-db/get-all-namespace-relation db) links (->> (concat namespaces (map (fn [p] [(:db/id block) (:db/id p)]) ref-blocks)) diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 683d58202f..1bccc4325c 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -793,7 +793,7 @@ independent of format as format specific heading characters are stripped" (defn get-all-namespace-relation [repo] - (ldb/get-all-namespace-relation (conn/get-db repo))) + (gp-db/get-all-namespace-relation (conn/get-db repo))) (defn get-all-namespace-parents [repo]