From b985020d1ff860f17e03ff73e1112cb0d75b54b7 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Wed, 7 May 2025 13:27:01 -0400 Subject: [PATCH] refactor: mv file graph model fns to their own ns All these fns are only used by file graphs. Most only act on file only attributes e.g. :block/file, :block/pre-block? and :block/namespace --- .clj-kondo/config.edn | 1 + .../graph-parser/src/logseq/graph_parser.cljs | 2 +- src/main/electron/listener.cljs | 4 +- src/main/frontend/components/block.cljs | 5 +- src/main/frontend/components/file.cljs | 3 +- .../components/file_based/hierarchy.cljs | 8 +- src/main/frontend/components/file_sync.cljs | 4 +- .../frontend/components/query/builder.cljs | 3 +- src/main/frontend/db.cljs | 16 +- src/main/frontend/db/async.cljs | 3 +- src/main/frontend/db/file_based/model.cljs | 223 +++++++++++++++++ src/main/frontend/db/model.cljs | 228 +----------------- src/main/frontend/db/query_custom.cljs | 4 +- src/main/frontend/db/query_dsl.cljs | 4 +- src/main/frontend/fs/diff_merge.cljs | 4 +- src/main/frontend/fs/watcher_handler.cljs | 5 +- src/main/frontend/handler/editor.cljs | 3 +- .../frontend/handler/file_based/editor.cljs | 4 +- .../frontend/handler/file_based/file.cljs | 3 +- .../frontend/handler/file_based/page.cljs | 7 +- .../handler/file_based/page_property.cljs | 3 +- .../frontend/handler/file_based/repo.cljs | 7 +- .../handler/file_based/reset_file.cljs | 3 +- src/main/logseq/api.cljs | 5 +- .../frontend/db/file_based/model_test.cljs | 33 +++ src/test/frontend/db/model_test.cljs | 26 -- 26 files changed, 311 insertions(+), 300 deletions(-) create mode 100644 src/main/frontend/db/file_based/model.cljs create mode 100644 src/test/frontend/db/file_based/model_test.cljs diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 1fa83083f3..ae8c2a06b7 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -85,6 +85,7 @@ frontend.config config frontend.date date frontend.db db + frontend.db.file-based.model file-model frontend.db-mixins db-mixins frontend.db.query-custom query-custom frontend.db.query-dsl query-dsl diff --git a/deps/graph-parser/src/logseq/graph_parser.cljs b/deps/graph-parser/src/logseq/graph_parser.cljs index 715a7c03f1..39f686cb86 100644 --- a/deps/graph-parser/src/logseq/graph_parser.cljs +++ b/deps/graph-parser/src/logseq/graph_parser.cljs @@ -19,7 +19,7 @@ blocks)) (defn- get-file-page - "Copy of db/get-file-page. Too basic to couple to main app" + "Copy of file-model/get-file-page. Too basic to couple to main app" [db file-path] (ffirst (d/q diff --git a/src/main/electron/listener.cljs b/src/main/electron/listener.cljs index 561ca84aa6..3f0d05331c 100644 --- a/src/main/electron/listener.cljs +++ b/src/main/electron/listener.cljs @@ -7,7 +7,7 @@ [electron.ipc :as ipc] [frontend.db :as db] [frontend.db.async :as db-async] - [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.fs.sync :as sync] [frontend.fs.watcher-handler :as watcher-handler] [frontend.handler.file-sync :as file-sync-handler] @@ -95,7 +95,7 @@ (notification/show! (str "Open link failed. Block-id `" block-id "` doesn't exist in the graph.") :error false))) file - (if-let [db-page-name (db-model/get-file-page file false)] + (if-let [db-page-name (file-model/get-file-page file false)] (route-handler/redirect-to-page! db-page-name) (notification/show! (str "Open link failed. File `" file "` doesn't exist in the graph.") :error false)))))) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 54600d27bf..1192f6c5f5 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -29,6 +29,7 @@ [frontend.db-mixins :as db-mixins] [frontend.db.async :as db-async] [frontend.db.model :as model] + [frontend.db.file-based.model :as file-model] [frontend.extensions.highlight :as highlight] [frontend.extensions.latex :as latex] [frontend.extensions.lightbox :as lightbox] @@ -1565,7 +1566,7 @@ config (assoc config :redirect-page-name redirect-page-name) label-text (get-label-text label) page (if (string/blank? label-text) - {:block/name (db/get-file-page (string/replace href "file:" "") false)} + {:block/name (file-model/get-file-page (string/replace href "file:" "") false)} (get-page label)) show-brackets? (state/show-brackets?)] (if (and page @@ -1856,7 +1857,7 @@ (let [namespace (first arguments)] (when-not (string/blank? namespace) (let [namespace (string/lower-case (page-ref/get-page-name! namespace)) - children (model/get-namespace-hierarchy (state/get-current-repo) namespace)] + children (file-model/get-namespace-hierarchy (state/get-current-repo) namespace)] (namespace-hierarchy config namespace children))))) (= name "youtube") diff --git a/src/main/frontend/components/file.cljs b/src/main/frontend/components/file.cljs index 666a487092..475a91caef 100644 --- a/src/main/frontend/components/file.cljs +++ b/src/main/frontend/components/file.cljs @@ -9,6 +9,7 @@ [frontend.date :as date] [frontend.db :as db] [frontend.db.async :as db-async] + [frontend.db.file-based.model :as file-model] [frontend.fs :as fs] [frontend.state :as state] [frontend.ui :as ui] @@ -103,7 +104,7 @@ (let [repo-dir (config/get-repo-dir (state/get-current-repo)) rel-path (when (string/starts-with? path repo-dir) (path/trim-dir-prefix repo-dir path)) - title (db/get-file-page (or path rel-path)) + title (file-model/get-file-page (or path rel-path)) in-db? (when-not (path/absolute? path) (boolean (db/get-file (or path rel-path)))) file-path (cond diff --git a/src/main/frontend/components/file_based/hierarchy.cljs b/src/main/frontend/components/file_based/hierarchy.cljs index dbf43770d5..6a1f92f359 100644 --- a/src/main/frontend/components/file_based/hierarchy.cljs +++ b/src/main/frontend/components/file_based/hierarchy.cljs @@ -2,7 +2,7 @@ (:require [clojure.string :as string] [frontend.components.block :as block] [frontend.db :as db] - [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.state :as state] [frontend.ui :as ui] [frontend.util :as util] @@ -23,15 +23,15 @@ (when-let [page (or (first (filter text/namespace-page? all-page-names)) (when (:block/_namespace (db/entity [:block/name (util/page-name-sanity-lc page)])) page))] - (let [namespace-pages (db/get-namespace-pages repo page) - parent-routes (db-model/get-page-namespace-routes repo page) + (let [namespace-pages (file-model/get-namespace-pages repo page) + parent-routes (file-model/get-page-namespace-routes repo page) pages (->> (concat namespace-pages parent-routes) (distinct) (sort-by :block/name) (map (fn [page] (or (:block/title page) (:block/name page)))) (map #(string/split % "/"))) - page-namespace (db-model/get-page-namespace repo page) + page-namespace (file-model/get-page-namespace repo page) page-namespace (util/get-page-title page-namespace)] (cond (seq pages) diff --git a/src/main/frontend/components/file_sync.cljs b/src/main/frontend/components/file_sync.cljs index 8ce9624b5a..100a7114e1 100644 --- a/src/main/frontend/components/file_sync.cljs +++ b/src/main/frontend/components/file_sync.cljs @@ -9,8 +9,8 @@ [frontend.components.onboarding.quick-tour :as quick-tour] [frontend.components.page :as page] [frontend.config :as config] - [frontend.db :as db] [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.fs :as fs] [frontend.fs.sync :as fs-sync] [frontend.handler.file-based.nfs :as nfs-handler] @@ -478,7 +478,7 @@ (map-indexed (fn [i f] (:time f) (when-let [path (:path f)] (let [full-path (util/node-path.join (config/get-repo-dir current-repo) path) - page-name (db/get-file-page full-path)] + page-name (file-model/get-file-page full-path)] {:title [:div.files-history.cursor-pointer {:key i :class (when (= i 0) "is-first") :on-click (fn [] diff --git a/src/main/frontend/components/query/builder.cljs b/src/main/frontend/components/query/builder.cljs index c74dda8a0b..844b5e3441 100644 --- a/src/main/frontend/components/query/builder.cljs +++ b/src/main/frontend/components/query/builder.cljs @@ -8,6 +8,7 @@ [frontend.db-mixins :as db-mixins] [frontend.db.async :as db-async] [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.db.query-dsl :as query-dsl] [frontend.handler.editor :as editor-handler] [frontend.handler.query.builder :as query-builder] @@ -321,7 +322,7 @@ [:div (case @*mode "namespace" - (let [items (sort (map :block/title (db-model/get-all-namespace-parents repo)))] + (let [items (sort (map :block/title (file-model/get-all-namespace-parents repo)))] (select items (fn [{:keys [value]}] (append-tree! *tree opts loc [:namespace value])))) diff --git a/src/main/frontend/db.cljs b/src/main/frontend/db.cljs index 6e00319349..a2814eda8b 100644 --- a/src/main/frontend/db.cljs +++ b/src/main/frontend/db.cljs @@ -25,21 +25,15 @@ entity pull pull-many] [frontend.db.model - delete-blocks get-pre-block - delete-files delete-pages-by-files - get-block-and-children get-block-by-uuid get-block-children sort-by-order + delete-files get-block-and-children get-block-by-uuid get-block-children sort-by-order get-block-parent get-block-parents parents-collapsed? get-block-referenced-blocks get-block-immediate-children get-block-page - get-custom-css - get-file get-file-page get-file-page-id file-exists? - get-files-blocks get-files-full get-journals-length + get-custom-css get-file file-exists? get-files-full get-journals-length get-latest-journals get-page get-case-page get-page-alias-names - get-page-blocks-count get-page-blocks-no-cache get-page-file get-page-format - get-referenced-blocks get-page-referenced-blocks-full - journal-page? page? page-alias-set sub-block sub-entity + get-page-blocks-count get-page-blocks-no-cache get-page-format + get-referenced-blocks journal-page? page? page-alias-set sub-block sub-entity page-empty? page-exists? get-alias-source-page - has-children? whiteboard-page? - get-namespace-pages get-all-namespace-relation] + has-children? whiteboard-page?] [frontend.db.react get-current-page diff --git a/src/main/frontend/db/async.cljs b/src/main/frontend/db/async.cljs index 3255cd4f7f..1122e4a75f 100644 --- a/src/main/frontend/db/async.cljs +++ b/src/main/frontend/db/async.cljs @@ -10,6 +10,7 @@ [frontend.db.async.util :as db-async-util] [frontend.db.file-based.async :as file-async] [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.db.react :as react] [frontend.db.utils :as db-utils] [frontend.handler.file-based.property.util :as property-util] @@ -251,7 +252,7 @@ [(>= ?d ?day)])] date future-day - db-model/file-graph-block-attrs))] + file-model/file-graph-block-attrs))] (->> result db-model/sort-by-order-recursive db-utils/group-by-page)))))) diff --git a/src/main/frontend/db/file_based/model.cljs b/src/main/frontend/db/file_based/model.cljs new file mode 100644 index 0000000000..41bff3350a --- /dev/null +++ b/src/main/frontend/db/file_based/model.cljs @@ -0,0 +1,223 @@ +(ns frontend.db.file-based.model + "Core db functions for file graphs" + (:require [clojure.string :as string] + [datascript.core :as d] + [frontend.common.file-based.db :as common-file-db] + [frontend.db.utils :as db-utils] + [frontend.db.conn :as conn] + [frontend.state :as state] + [frontend.util :as util] + [logseq.db :as ldb] + [logseq.graph-parser.db :as gp-db])) + +(def file-graph-block-attrs + "In file graphs, use it to replace '*' for datalog queries" + '[:db/id + :block/uuid + :block/parent + :block/order + :block/collapsed? + :block/format + :block/refs + :block/_refs + :block/path-refs + :block/tags + :block/link + :block/title + :block/marker + :block/priority + :block/properties + :block/properties-order + :block/properties-text-values + :block/pre-block? + :block/scheduled + :block/deadline + :block/repeated? + :block/created-at + :block/updated-at + ;; TODO: remove this in later releases + :block/heading-level + :block/file + :logseq.property/parent + {:block/page [:db/id :block/name :block/title :block/uuid :block/journal-day :block/type]} + {:block/_parent ...}]) + +;; File-based only +;; Diverged of get-sorted-page-block-ids +(defn get-sorted-page-block-ids-and-levels + "page-name: the page name, original name + return: a list with elements in: + :id - a list of block ids, sorted by :block/order + :level - the level of the block, 1 for root, 2 for children of root, etc." + [page-name] + {:pre [(string? page-name)]} + (let [root (ldb/get-page (conn/get-db) page-name)] + (loop [result [] + children (ldb/sort-by-order (:block/_parent root)) + ;; BFS log of walking depth + levels (repeat (count children) 1)] + (if (seq children) + (let [child (first children) + cur-level (first levels) + next-children (ldb/sort-by-order (:block/_parent child))] + (recur (conj result {:id (:db/id child) :level cur-level}) + (concat + next-children + (rest children)) + (concat + (repeat (count next-children) (inc cur-level)) + (rest levels)))) + result)))) + +(defn get-page-file + ([page-name] + (get-page-file (state/get-current-repo) page-name)) + ([repo page-name] + (when-let [db (conn/get-db repo)] + (gp-db/get-page-file db page-name)))) + +(defn get-block-file-path + [block] + (when-let [page-id (:db/id (:block/page block))] + (:file/path (:block/file (db-utils/entity page-id))))) + +(defn get-file-page-id + [file-path] + (when-let [repo (state/get-current-repo)] + (when-let [db (conn/get-db repo)] + (some-> + (d/q + '[:find ?page + :in $ ?path + :where + [?file :file/path ?path] + [?page :block/name] + [?page :block/file ?file]] + db file-path) + db-utils/seq-flatten + first)))) + +(defn- get-files-blocks + [repo-url paths] + (let [paths (set paths) + pred (fn [_db e] + (contains? paths e))] + (-> (d/q '[:find ?block + :in $ ?pred + :where + [?file :file/path ?path] + [(?pred $ ?path)] + [?p :block/file ?file] + [?block :block/page ?p]] + (conn/get-db repo-url) pred) + db-utils/seq-flatten))) + +(defn delete-blocks + [repo-url files _delete-page?] + (when (seq files) + (let [blocks (->> (get-files-blocks repo-url files) + (remove nil?))] + (mapv (fn [eid] [:db.fn/retractEntity eid]) blocks)))) + +(defn get-file-page + ([file-path] + (get-file-page file-path true)) + ([file-path title?] + (when-let [repo (state/get-current-repo)] + (when-let [db (conn/get-db repo)] + (some-> + (d/q + (if title? + '[:find ?page-name + :in $ ?path + :where + [?file :file/path ?path] + [?page :block/file ?file] + [?page :block/title ?page-name]] + '[:find ?page-name + :in $ ?path + :where + [?file :file/path ?path] + [?page :block/file ?file] + [?page :block/name ?page-name]]) + db file-path) + db-utils/seq-flatten + first))))) + +;; file-based only so it's safe to use :block/name lookup refs here +(defn delete-pages-by-files + [files] + (let [pages (->> (mapv get-file-page files) + (remove nil?))] + (when (seq pages) + (mapv (fn [page] [:db.fn/retractEntity [:block/name page]]) (map util/page-name-sanity-lc pages))))) + +;; TODO: check whether this works when adding pdf back on Web +(defn get-pre-block + [repo page-id] + (-> (d/q '[:find (pull ?b [*]) + :in $ ?page + :where + [?b :block/page ?page] + [?b :block/pre-block? true]] + (conn/get-db repo) + page-id) + ffirst)) + +(defn- get-all-namespace-relation + [repo] + (gp-db/get-all-namespace-relation (conn/get-db repo))) + +(defn get-all-namespace-parents + [repo] + (let [db (conn/get-db repo)] + (->> (get-all-namespace-relation repo) + (map (fn [[_ ?parent]] + (db-utils/entity db ?parent)))))) + +(defn get-namespace-pages + "Accepts both sanitized and unsanitized namespaces" + [repo namespace] + (common-file-db/get-namespace-pages (conn/get-db repo) namespace)) + +(defn- tree [flat-col root] + (let [sort-fn #(sort-by :block/name %) + children (group-by :block/namespace flat-col) + namespace-children (fn namespace-children [parent-id] + (map (fn [m] + (assoc m :namespace/children + (sort-fn (namespace-children {:db/id (:db/id m)})))) + (sort-fn (get children parent-id))))] + (namespace-children root))) + +(defn get-namespace-hierarchy + "Unsanitized namespaces" + [repo namespace] + (let [children (get-namespace-pages repo namespace) + namespace-id (:db/id (db-utils/entity [:block/name (util/page-name-sanity-lc namespace)])) + root {:db/id namespace-id} + col (conj children root)] + (tree col root))) + +(defn get-page-namespace + [repo page] + (:block/namespace (db-utils/entity repo [:block/name (util/page-name-sanity-lc page)]))) + +(defn get-page-namespace-routes + [repo page] + (assert (string? page)) + (when-let [db (conn/get-db repo)] + (when-not (string/blank? page) + (let [page (util/page-name-sanity-lc (string/trim page)) + page-exist? (db-utils/entity repo [:block/name page]) + ids (if page-exist? + '() + (->> (d/datoms db :aevt :block/name) + (filter (fn [datom] + (string/ends-with? (:v datom) (str "/" page)))) + (map :e)))] + (when (seq ids) + (db-utils/pull-many repo + '[:db/id :block/name :block/title + {:block/file [:db/id :file/path]}] + ids)))))) diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 055fb0b45b..2e496121c2 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -6,11 +6,11 @@ [clojure.string :as string] [clojure.walk :as walk] [datascript.core :as d] - [frontend.common.file-based.db :as common-file-db] [frontend.common.graph-view :as graph-view] [frontend.config :as config] [frontend.date :as date] [frontend.db.conn :as conn] + [frontend.db.file-based.model :as file-model] [frontend.db.react :as react] [frontend.db.utils :as db-utils] [frontend.state :as state] @@ -21,44 +21,11 @@ [logseq.db.frontend.class :as db-class] [logseq.db.frontend.content :as db-content] [logseq.db.frontend.rules :as rules] - [logseq.graph-parser.db :as gp-db] [logseq.shui.hooks :as hooks])) ;; TODO: extract to specific models and move data transform logic to the ;; corresponding handlers. -(def file-graph-block-attrs - "In file graphs, use it to replace '*' for datalog queries" - '[:db/id - :block/uuid - :block/parent - :block/order - :block/collapsed? - :block/format - :block/refs - :block/_refs - :block/path-refs - :block/tags - :block/link - :block/title - :block/marker - :block/priority - :block/properties - :block/properties-order - :block/properties-text-values - :block/pre-block? - :block/scheduled - :block/deadline - :block/repeated? - :block/created-at - :block/updated-at - ;; TODO: remove this in later releases - :block/heading-level - :block/file - :logseq.property/parent - {:block/page [:db/id :block/name :block/title :block/uuid :block/journal-day :block/type]} - {:block/_parent ...}]) - (def hidden-page? ldb/hidden?) (defn get-alias-source-page @@ -67,21 +34,6 @@ (when-let [db (conn/get-db repo)] (ldb/get-alias-source-page db alias-id))) -(defn get-files-blocks - [repo-url paths] - (let [paths (set paths) - pred (fn [_db e] - (contains? paths e))] - (-> (d/q '[:find ?block - :in $ ?pred - :where - [?file :file/path ?path] - [(?pred $ ?path)] - [?p :block/file ?file] - [?block :block/page ?p]] - (conn/get-db repo-url) pred) - db-utils/seq-flatten))) - (defn file-exists? [repo path] (when (and repo path) @@ -261,33 +213,6 @@ independent of format as format specific heading characters are stripped" f)) form)) -;; File-based only -;; Diverged of get-sorted-page-block-ids -(defn get-sorted-page-block-ids-and-levels - "page-name: the page name, original name - return: a list with elements in: - :id - a list of block ids, sorted by :block/order - :level - the level of the block, 1 for root, 2 for children of root, etc." - [page-name] - {:pre [(string? page-name)]} - (let [root (ldb/get-page (conn/get-db) page-name)] - (loop [result [] - children (sort-by-order (:block/_parent root)) - ;; BFS log of walking depth - levels (repeat (count children) 1)] - (if (seq children) - (let [child (first children) - cur-level (first levels) - next-children (sort-by-order (:block/_parent child))] - (recur (conj result {:id (:db/id child) :level cur-level}) - (concat - next-children - (rest children)) - (concat - (repeat (count next-children) (inc cur-level)) - (rest levels)))) - result)))) - (defn has-children? ([block-id] (has-children? (conn/get-db) block-id)) @@ -421,59 +346,6 @@ independent of format as format specific heading characters are stripped" (let [db (conn/get-db repo)] (ldb/get-block-and-children db block-uuid opts))) -(defn get-file-page - ([file-path] - (get-file-page file-path true)) - ([file-path title?] - (when-let [repo (state/get-current-repo)] - (when-let [db (conn/get-db repo)] - (some-> - (d/q - (if title? - '[:find ?page-name - :in $ ?path - :where - [?file :file/path ?path] - [?page :block/file ?file] - [?page :block/title ?page-name]] - '[:find ?page-name - :in $ ?path - :where - [?file :file/path ?path] - [?page :block/file ?file] - [?page :block/name ?page-name]]) - db file-path) - db-utils/seq-flatten - first))))) - -(defn get-page-file - ([page-name] - (get-page-file (state/get-current-repo) page-name)) - ([repo page-name] - (when-let [db (conn/get-db repo)] - (gp-db/get-page-file db page-name)))) - -(defn get-block-file-path - [block] - (when-let [page-id (:db/id (:block/page block))] - (:file/path (:block/file (db-utils/entity page-id))))) - -(defn get-file-page-id - [file-path] - (when-let [repo (state/get-current-repo)] - (when-let [db (conn/get-db repo)] - (some-> - (d/q - '[:find ?page - :in $ ?path - :where - [?file :file/path ?path] - [?page :block/name] - [?page :block/file ?file]] - db file-path) - db-utils/seq-flatten - first)))) - (defn get-page [page-id-name-or-uuid] (when page-id-name-or-uuid @@ -574,7 +446,7 @@ independent of format as format specific heading characters are stripped" [?block :block/path-refs ?ref-page]] db pages - (butlast file-graph-block-attrs)) + (butlast file-model/file-graph-block-attrs)) (remove (fn [block] (= page-id (:db/id (:block/page block))))) db-utils/group-by-page (map (fn [[k blocks]] @@ -635,37 +507,10 @@ independent of format as format specific heading characters are stripped" [?refed-b :block/uuid ?refed-uuid] [?referee-b :block/refs ?refed-b]] db))) -(defn delete-blocks - [repo-url files _delete-page?] - (when (seq files) - (let [blocks (->> (get-files-blocks repo-url files) - (remove nil?))] - (mapv (fn [eid] [:db.fn/retractEntity eid]) blocks)))) - (defn delete-files [files] (mapv (fn [path] [:db.fn/retractEntity [:file/path path]]) files)) -;; file-based only so it's safe to use :block/name lookup refs here -(defn delete-pages-by-files - [files] - (let [pages (->> (mapv get-file-page files) - (remove nil?))] - (when (seq pages) - (mapv (fn [page] [:db.fn/retractEntity [:block/name page]]) (map util/page-name-sanity-lc pages))))) - -;; TODO: check whether this works when adding pdf back on Web -(defn get-pre-block - [repo page-id] - (-> (d/q '[:find (pull ?b [*]) - :in $ ?page - :where - [?b :block/page ?page] - [?b :block/pre-block? true]] - (conn/get-db repo) - page-id) - ffirst)) - (defn whiteboard-page? "Given a page entity, page object or page name, check if it is a whiteboard page" [page] @@ -674,17 +519,6 @@ independent of format as format specific heading characters are stripped" page)] (ldb/whiteboard? page))) -(comment - (defn get-orphaned-pages - [opts] - (let [db (conn/get-db)] - (ldb/get-orphaned-pages db - (merge opts - {:built-in-pages-names - (if (config/db-based-graph? (state/get-current-repo)) - sqlite-create-graph/built-in-pages-names - gp-db/built-in-pages-names)}))))) - ;; FIXME: use `Untitled` instead of UUID for db based graphs (defn untitled-page? [page-name] @@ -771,64 +605,6 @@ independent of format as format specific heading characters are stripped" (:block/_tags class)) (remove ldb/hidden?)))) -(defn get-all-namespace-relation - [repo] - (gp-db/get-all-namespace-relation (conn/get-db repo))) - -(defn get-all-namespace-parents - [repo] - (let [db (conn/get-db repo)] - (->> (get-all-namespace-relation repo) - (map (fn [[_ ?parent]] - (db-utils/entity db ?parent)))))) - -(defn get-namespace-pages - "Accepts both sanitized and unsanitized namespaces" - [repo namespace] - (common-file-db/get-namespace-pages (conn/get-db repo) namespace)) - -(defn- tree [flat-col root] - (let [sort-fn #(sort-by :block/name %) - children (group-by :block/namespace flat-col) - namespace-children (fn namespace-children [parent-id] - (map (fn [m] - (assoc m :namespace/children - (sort-fn (namespace-children {:db/id (:db/id m)})))) - (sort-fn (get children parent-id))))] - (namespace-children root))) - -(defn get-namespace-hierarchy - "Unsanitized namespaces" - [repo namespace] - (let [children (get-namespace-pages repo namespace) - namespace-id (:db/id (db-utils/entity [:block/name (util/page-name-sanity-lc namespace)])) - root {:db/id namespace-id} - col (conj children root)] - (tree col root))) - -(defn get-page-namespace - [repo page] - (:block/namespace (db-utils/entity repo [:block/name (util/page-name-sanity-lc page)]))) - -(defn get-page-namespace-routes - [repo page] - (assert (string? page)) - (when-let [db (conn/get-db repo)] - (when-not (string/blank? page) - (let [page (util/page-name-sanity-lc (string/trim page)) - page-exist? (db-utils/entity repo [:block/name page]) - ids (if page-exist? - '() - (->> (d/datoms db :aevt :block/name) - (filter (fn [datom] - (string/ends-with? (:v datom) (str "/" page)))) - (map :e)))] - (when (seq ids) - (db-utils/pull-many repo - '[:db/id :block/name :block/title - {:block/file [:db/id :file/path]}] - ids)))))) - (comment ;; For debugging (defn get-all-blocks diff --git a/src/main/frontend/db/query_custom.cljs b/src/main/frontend/db/query_custom.cljs index db54b223d5..ae4a70bb4f 100644 --- a/src/main/frontend/db/query_custom.cljs +++ b/src/main/frontend/db/query_custom.cljs @@ -2,7 +2,7 @@ "Handles executing custom queries a.k.a. advanced queries" (:require [clojure.walk :as walk] [frontend.config :as config] - [frontend.db.model :as model] + [frontend.db.file-based.model :as file-model] [frontend.db.query-dsl :as query-dsl] [frontend.db.query-react :as query-react] [frontend.state :as state] @@ -13,7 +13,7 @@ ;; FIXME: what if users want to query other attributes than block-attrs? (defn- replace-star-with-block-attrs! [l] - (let [block-attrs (butlast model/file-graph-block-attrs)] + (let [block-attrs (butlast file-model/file-graph-block-attrs)] (walk/postwalk (fn [f] (if (and (list? f) diff --git a/src/main/frontend/db/query_dsl.cljs b/src/main/frontend/db/query_dsl.cljs index 327d7760f2..b1fc176164 100644 --- a/src/main/frontend/db/query_dsl.cljs +++ b/src/main/frontend/db/query_dsl.cljs @@ -8,7 +8,7 @@ [clojure.walk :as walk] [frontend.config :as config] [frontend.date :as date] - [frontend.db.model :as model] + [frontend.db.file-based.model :as file-model] [frontend.db.query-react :as query-react] [frontend.db.utils :as db-utils] [frontend.state :as state] @@ -707,7 +707,7 @@ Some bindings in this fn: (defn query-wrapper [where {:keys [blocks? block-attrs]}] - (let [block-attrs (or block-attrs (butlast model/file-graph-block-attrs)) + (let [block-attrs (or block-attrs (butlast file-model/file-graph-block-attrs)) q (if blocks? ; FIXME: it doesn't need to be either blocks or pages `[:find (~'pull ~'?b ~block-attrs) :in ~'$ ~'% diff --git a/src/main/frontend/fs/diff_merge.cljs b/src/main/frontend/fs/diff_merge.cljs index 57b05a4531..b27e389d59 100644 --- a/src/main/frontend/fs/diff_merge.cljs +++ b/src/main/frontend/fs/diff_merge.cljs @@ -2,7 +2,7 @@ "Implementation of text (file) based content diff & merge for conflict resolution" (:require ["@logseq/diff-merge" :refer [attach_uuids Differ Merger]] [cljs-bean.core :as bean] - [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.db.utils :as db-utils] [logseq.graph-parser.block :as gp-block] [logseq.graph-parser.mldoc :as gp-mldoc] @@ -29,7 +29,7 @@ page-name: string" [page-name] {:pre (string? page-name)} - (let [walked (db-model/get-sorted-page-block-ids-and-levels page-name) + (let [walked (file-model/get-sorted-page-block-ids-and-levels page-name) blocks (db-utils/pull-many [:block/uuid :block/title :block/level] (map :id walked)) levels (map :level walked) blocks (map (fn [block level] diff --git a/src/main/frontend/fs/watcher_handler.cljs b/src/main/frontend/fs/watcher_handler.cljs index c0b516daf1..e99506deca 100644 --- a/src/main/frontend/fs/watcher_handler.cljs +++ b/src/main/frontend/fs/watcher_handler.cljs @@ -6,6 +6,7 @@ [frontend.db :as db] [frontend.db.async :as db-async] [frontend.db.model :as model] + [frontend.db.file-based.model :as file-model] [frontend.fs :as fs] [frontend.handler.file-based.file :as file-handler] [frontend.handler.file-based.property :as file-property-handler] @@ -101,7 +102,7 @@ exists-in-db?) (p/let [dir-exists? (fs/file-exists? dir "")] (when dir-exists? - (when-let [page-name (db/get-file-page path)] + (when-let [page-name (file-model/get-file-page path)] (println "Delete page: " page-name ", file path: " path ".") (page-handler/> (concat delete-blocks - (db/delete-blocks repo-url modify-files false)) + (file-model/delete-blocks repo-url modify-files false)) (remove nil?)) delete-pages (if (seq remove-files) - (db/delete-pages-by-files remove-files) + (file-model/delete-pages-by-files remove-files) []) add-or-modify-files (some->> (concat modify-files add-files) diff --git a/src/main/frontend/handler/file_based/reset_file.cljs b/src/main/frontend/handler/file_based/reset_file.cljs index 8f207abc5c..aaaa469ce7 100644 --- a/src/main/frontend/handler/file_based/reset_file.cljs +++ b/src/main/frontend/handler/file_based/reset_file.cljs @@ -3,6 +3,7 @@ (:require [frontend.config :as config] [frontend.state :as state] [frontend.db :as db] + [frontend.db.file-based.model :as file-model] [logseq.graph-parser :as graph-parser] [logseq.common.util :as common-util] [frontend.fs.diff-merge :as diff-merge] @@ -17,7 +18,7 @@ "Conflict of files towards same page" [repo-url page file] (when-let [page-name (:block/name page)] - (let [current-file (:file/path (db/get-page-file repo-url page-name))] + (let [current-file (:file/path (file-model/get-page-file repo-url page-name))] (when (not= file current-file) current-file)))) diff --git a/src/main/logseq/api.cljs b/src/main/logseq/api.cljs index b4ce4333c4..e4ca930823 100644 --- a/src/main/logseq/api.cljs +++ b/src/main/logseq/api.cljs @@ -10,6 +10,7 @@ [frontend.db.async :as db-async] [frontend.db.conn :as conn] [frontend.db.model :as db-model] + [frontend.db.file-based.model :as file-model] [frontend.db.query-custom :as query-custom] [frontend.db.query-dsl :as query-dsl] [frontend.db.query-react :as query-react] @@ -1046,13 +1047,13 @@ (defn ^:export get_pages_from_namespace [ns] (when-let [repo (and ns (state/get-current-repo))] - (when-let [pages (db-model/get-namespace-pages repo ns)] + (when-let [pages (file-model/get-namespace-pages repo ns)] (bean/->js (sdk-utils/normalize-keyword-for-json pages))))) (defn ^:export get_pages_tree_from_namespace [ns] (when-let [repo (and ns (state/get-current-repo))] - (when-let [pages (db-model/get-namespace-hierarchy repo ns)] + (when-let [pages (file-model/get-namespace-hierarchy repo ns)] (bean/->js (sdk-utils/normalize-keyword-for-json pages))))) (defn- first-child-of-block diff --git a/src/test/frontend/db/file_based/model_test.cljs b/src/test/frontend/db/file_based/model_test.cljs new file mode 100644 index 0000000000..8b3c82962e --- /dev/null +++ b/src/test/frontend/db/file_based/model_test.cljs @@ -0,0 +1,33 @@ +(ns frontend.db.file-based.model-test + (:require [cljs.test :refer [use-fixtures deftest is]] + [frontend.db.file-based.model :as file-model] + [frontend.test.helper :as test-helper :refer [load-test-files]])) + +(use-fixtures :each {:before test-helper/start-test-db! + :after test-helper/destroy-test-db!}) + +(deftest get-namespace-pages + (load-test-files [{:file/path "pages/a.b.c.md" + :file/content "foo"} + {:file/path "pages/b.c.md" + :file/content "bar"} + {:file/path "pages/b.d.md" + :file/content "baz"}]) + + (is (= ["a/b" "a/b/c"] + (map :block/name (file-model/get-namespace-pages test-helper/test-db "a")))) + + (is (= ["b/c" "b/d"] + (map :block/name (file-model/get-namespace-pages test-helper/test-db "b"))))) + +(deftest get-page-namespace-routes + (load-test-files [{:file/path "pages/a.b.c.md" + :file/content "foo"} + {:file/path "pages/b.c.md" + :file/content "bar"} + {:file/path "pages/b.d.md" + :file/content "baz"}]) + + (is (= '() + (map :block/name (file-model/get-page-namespace-routes test-helper/test-db "b/c"))) + "Empty if page exists")) \ No newline at end of file diff --git a/src/test/frontend/db/model_test.cljs b/src/test/frontend/db/model_test.cljs index 7ff8945596..d7955380dc 100644 --- a/src/test/frontend/db/model_test.cljs +++ b/src/test/frontend/db/model_test.cljs @@ -9,32 +9,6 @@ (use-fixtures :each {:before test-helper/start-test-db! :after test-helper/destroy-test-db!}) -(deftest get-namespace-pages - (load-test-files [{:file/path "pages/a.b.c.md" - :file/content "foo"} - {:file/path "pages/b.c.md" - :file/content "bar"} - {:file/path "pages/b.d.md" - :file/content "baz"}]) - - (is (= ["a/b" "a/b/c"] - (map :block/name (model/get-namespace-pages test-helper/test-db "a")))) - - (is (= ["b/c" "b/d"] - (map :block/name (model/get-namespace-pages test-helper/test-db "b"))))) - -(deftest get-page-namespace-routes - (load-test-files [{:file/path "pages/a.b.c.md" - :file/content "foo"} - {:file/path "pages/b.c.md" - :file/content "bar"} - {:file/path "pages/b.d.md" - :file/content "baz"}]) - - (is (= '() - (map :block/name (model/get-page-namespace-routes test-helper/test-db "b/c"))) - "Empty if page exists")) - (deftest test-page-alias-with-multiple-alias (load-test-files [{:file/path "aa.md" :file/content "alias:: ab, ac"}