Browse Source

refactor: extends support multiple tags

Tienson Qin 4 tháng trước cách đây
mục cha
commit
cc39c1c1fb

+ 16 - 9
deps/db/src/logseq/db/frontend/db.cljs

@@ -3,12 +3,14 @@
   (:require [clojure.set :as set]
             [clojure.string :as string]
             [datascript.core :as d]
+            [datascript.impl.entity :as de]
             [logseq.common.config :as common-config]
             [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]))
+            [logseq.db.frontend.property :as db-property]
+            [logseq.db.frontend.rules :as rules]))
 
 (defn built-in-class-property?
   "Whether property a built-in property for the specific class"
@@ -46,14 +48,19 @@
 (defn get-class-extends
   "Returns all parents of a class"
   [node]
-  (when-let [parent (:logseq.property.class/extends node)]
-    (loop [current-parent parent
-           parents' []]
-      (if (and current-parent
-               (not (contains? parents' current-parent)))
-        (recur (:logseq.property.class/extends current-parent)
-               (conj parents' current-parent))
-        (vec (reverse parents'))))))
+  (assert (de/entity? node) "get-class-extends `node` should be an entity")
+  (let [db (.-db node)
+        eid (:db/id node)]
+    (->>
+     (d/q '[:find [?p ...]
+            :in $ ?c %
+            :where
+            (class-extends ?p ?c)]
+          db
+          eid
+          (:class-extends rules/rules))
+     (remove #{eid})
+     (map (fn [id] (d/entity db id))))))
 
 (defn get-page-parents
   [node]

+ 1 - 1
deps/db/src/logseq/db/frontend/malli_schema.cljs

@@ -301,7 +301,7 @@
     (concat
      [:map
       [:db/ident class-ident]
-      [:logseq.property.class/extends :int]]
+      [:logseq.property.class/extends [:set :int]]]
      page-attrs
      page-or-block-attrs))
    (vec

+ 1 - 1
deps/db/src/logseq/db/frontend/property.cljs

@@ -158,9 +158,9 @@
                                                      :public? false
                                                      :hide? true
                                                      :view-context :property}}
-     ;; TODO: support cardinality many for extends
      :logseq.property.class/extends {:title "Extends"
                                      :schema {:type :class
+                                              :cardinality :many
                                               :public? true
                                               :view-context :class}
                                      :queryable? true

+ 2 - 2
deps/db/src/logseq/db/sqlite/export.cljs

@@ -190,9 +190,9 @@
     ;; It's caller's responsibility to ensure parent is included in final export
     (and (not shallow-copy?)
          (:logseq.property.class/extends class-ent)
-         (not= :logseq.class/Root (:db/ident (:logseq.property.class/extends class-ent))))
+         (not ((set (map :db/ident (:logseq.property.class/extends class-ent))) :logseq.class/Root)))
     (assoc :build/class-parent
-           (:db/ident (:logseq.property.class/extends class-ent)))))
+           (:db/ident (first (:logseq.property.class/extends class-ent))))))
 
 (defn- build-node-classes
   [db build-block block-tags properties]