Просмотр исходного кода

Merge branch 'refactor/boolean-not-ref-type' into refactor/single-block-type

Tienson Qin 1 год назад
Родитель
Сommit
8bef1d7742

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

@@ -442,7 +442,7 @@
 (defn built-in?
   "Built-in page or block"
   [entity]
-  (db-property/property-value-content (:logseq.property/built-in? entity)))
+  (:logseq.property/built-in? entity))
 
 (defn built-in-class-property?
   "Whether property a built-in property for the specific class"

+ 3 - 8
deps/db/src/logseq/db/frontend/property/type.cljs

@@ -33,7 +33,7 @@
   "Property value ref types where the refed entity stores its value in
   :property.value/content e.g. :number is stored as a number. new value-ref-property-types
   should default to this as it allows for more querying power"
-  #{:number :url :checkbox})
+  #{:number :url})
 
 (def value-ref-property-types
   "Property value ref types where the refed entities either store their value in
@@ -105,10 +105,6 @@
     (when-let [entity (d/entity db id-or-value)]
       (number? (:property.value/content entity)))))
 
-(defn- checkbox-entity?
-  [db id]
-  (boolean? (:property.value/content (d/entity db id))))
-
 (defn- text-entity?
   [db s {:keys [new-closed-value?]}]
   (if new-closed-value?
@@ -128,7 +124,6 @@
     (and (some? (:block/title ent))
          (= (:block/type ent) "journal"))))
 
-
 (def built-in-validation-schemas
   "Map of types to malli validation schemas that validate a property value for that type"
   {:default  [:fn
@@ -140,7 +135,7 @@
    :date     [:fn
               {:error/message "should be a journal date"}
               date?]
-   :checkbox checkbox-entity?
+   :checkbox boolean?
    :url      [:fn
               {:error/message "should be a URL"}
               url-entity?]
@@ -165,7 +160,7 @@
 
 (def property-types-with-db
   "Property types whose validation fn requires a datascript db"
-  #{:default :checkbox :url :number :date :node :entity})
+  #{:default :url :number :date :node :entity})
 
 ;; Helper fns
 ;; ==========

+ 25 - 9
deps/db/src/logseq/db/frontend/rules.cljc

@@ -170,11 +170,19 @@
     :page-property
     '[(page-property ?p ?prop ?val)
       [?p :block/name]
-      [?p ?prop ?pv]
-      (or [?pv :block/title ?val]
-          [?pv :property.value/content ?val])
       [?prop-e :db/ident ?prop]
-      [?prop-e :block/type "property"]]
+      [?prop-e :block/type "property"]
+      [?p ?prop ?pv]
+      (or
+       ;; non-ref value
+       (and
+        [(missing? $ ?prop-e :db/valueType)]
+        [?p ?prop ?val])
+       ;; ref value
+       (and
+        [?prop-e :db/valueType :db.type/ref]
+        (or [?pv :block/title ?val]
+            [?pv :property.value/content ?val])))]
 
     :has-property
     '[(has-property ?b ?prop)
@@ -185,12 +193,20 @@
 
     :property
     '[(property ?b ?prop ?val)
-      [?b ?prop ?pv]
-      (or [?pv :block/title ?val]
-          [?pv :property.value/content ?val])
-      [(missing? $ ?b :block/name)]
       [?prop-e :db/ident ?prop]
-      [?prop-e :block/type "property"]]
+      [?prop-e :block/type "property"]
+      [?b ?prop ?pv]
+      (or
+       ;; non-ref value
+       (and
+        [(missing? $ ?prop-e :db/valueType)]
+        [?b ?prop ?val])
+       ;; ref value
+       (and
+        [?prop-e :db/valueType :db.type/ref]
+        (or [?pv :block/title ?val]
+            [?pv :property.value/content ?val])))
+      [(missing? $ ?b :block/name)]]
 
     :task
     '[(task ?b ?statuses)

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

@@ -2,7 +2,7 @@
   "Main datascript schemas for the Logseq app"
   (:require [clojure.set :as set]))
 
-(def version 10)
+(def version 11)
 ;; A page is a special block, a page can corresponds to multiple files with the same ":block/name".
 (def ^:large-vars/data-var schema
   {:db/ident        {:db/unique :db.unique/identity}

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

@@ -510,8 +510,8 @@
                                    [prop (infer-property-schema (get used-properties prop))]))
                             (into {}))
         properties' (merge new-properties properties)]
-    (when (seq new-properties) (prn :new-properties new-properties))
-    (when (seq new-classes) (prn :new-classes new-classes))
+    ;; (when (seq new-properties) (prn :new-properties new-properties))
+    ;; (when (seq new-classes) (prn :new-classes new-classes))
     {:classes classes' :properties properties'}))
 
 (defn- build-blocks-tx*

+ 1 - 4
deps/db/src/logseq/db/sqlite/common_db.cljs

@@ -254,8 +254,6 @@
         _ (when db-graph?
             (reset! db-order/*max-key (db-order/get-max-order db)))
         schema (:schema db)
-        built-in-value (when-let [id (:db/id (:logseq.property/built-in? (d/entity db :logseq.class/Root)))]
-                         (d/datoms db :eavt id))
         idents (mapcat (fn [id]
                          (when-let [e (d/entity db id)]
                            (d/datoms db :eavt (:db/id e))))
@@ -267,8 +265,7 @@
         all-pages (get-all-pages db)
         structured-datoms (when db-graph?
                             (get-structured-datoms db))
-        data (concat built-in-value
-                     idents
+        data (concat idents
                      all-pages
                      structured-datoms
                      favorites

+ 10 - 18
deps/db/src/logseq/db/sqlite/create_graph.cljs

@@ -10,8 +10,8 @@
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.sqlite.util :as sqlite-util]))
 
-(defn- mark-block-as-built-in [block built-in-prop-value]
-  (assoc block :logseq.property/built-in? [:block/uuid (:block/uuid built-in-prop-value)]))
+(defn- mark-block-as-built-in [block]
+  (assoc block :logseq.property/built-in? true))
 
 (defn build-initial-properties*
   [built-in-properties]
@@ -40,19 +40,13 @@
                            :logseq.property/built-in?
                            built-in-property-schema
                            {:title (name :logseq.property/built-in?)})
-        built-in-prop-value (db-property-build/build-property-value-block
-                             {:db/id [:block/uuid (:block/uuid built-in-property)]}
-                             {:db/ident :logseq.property/built-in?
-                              :block/schema built-in-property-schema}
-                             true)
         mark-block-as-built-in' (fn [block]
-                                  (mark-block-as-built-in {:block/uuid (:block/uuid block)} built-in-prop-value))
+                                  (mark-block-as-built-in {:block/uuid (:block/uuid block)}))
         properties (build-initial-properties* db-property/built-in-properties)
         ;; Tx order matters. built-in-property must come first as all properties depend on it.
         tx (concat [built-in-property]
                    properties
-                   [built-in-prop-value]
-                   ;; Adding built-ins must come after initial properties and built-in-prop-value
+                   ;; Adding built-ins must come after initial properties
                    [(mark-block-as-built-in' built-in-property)]
                    (map mark-block-as-built-in' properties)
                    (keep #(when (= "closed value" (:block/type %)) (mark-block-as-built-in' %))
@@ -62,8 +56,7 @@
         (assert (string/starts-with? (str block-uuid) "00000002") m)))
 
     {:tx tx
-     :properties (filter #(= (:block/type %) "property") properties)
-     :built-in-prop-value built-in-prop-value}))
+     :properties (filter #(= (:block/type %) "property") properties)}))
 
 (defn kv
   "Creates a key-value pair tx with the key and value respectively stored under
@@ -87,7 +80,7 @@
                          (vec conflicting-idents))
                     {:idents conflicting-idents}))))
 
-(defn- build-initial-classes [db-ident->properties built-in-prop-value]
+(defn- build-initial-classes [db-ident->properties]
   (map
    (fn [[db-ident {:keys [schema title]}]]
      (let [title' (or title (name db-ident))]
@@ -105,8 +98,7 @@
              :db/ident db-ident
              :block/uuid (common-uuid/gen-uuid :db-ident-block-uuid db-ident)}
              (seq properties)
-             (assoc :class/schema.properties properties))))
-        built-in-prop-value)))
+             (assoc :class/schema.properties properties)))))))
    db-class/built-in-classes))
 
 (defn build-db-initial-data
@@ -133,11 +125,11 @@
                         :file/content ""
                         :file/created-at (js/Date.)
                         :file/last-modified-at (js/Date.)}]
-        {properties-tx :tx :keys [built-in-prop-value properties]} (build-initial-properties)
+        {properties-tx :tx :keys [properties]} (build-initial-properties)
         db-ident->properties (zipmap (map :db/ident properties) properties)
-        default-classes (build-initial-classes db-ident->properties built-in-prop-value)
+        default-classes (build-initial-classes db-ident->properties)
         default-pages (->> (map sqlite-util/build-new-page built-in-pages-names)
-                           (map #(mark-block-as-built-in % built-in-prop-value)))
+                           (map mark-block-as-built-in))
         tx (vec (concat initial-data properties-tx default-classes
                         initial-files default-pages))]
     (validate-tx-for-duplicate-idents tx)

+ 1 - 3
deps/db/test/logseq/db/sqlite/create_graph_test.cljs

@@ -53,9 +53,7 @@
                     ;; they aren't user facing
                     (remove #(or (= "logseq.kv" (namespace (:db/ident %)))
                                  (= :logseq.property/empty-placeholder (:db/ident %)))))]
-    (is (= []
-           (remove #(->> % :logseq.property/built-in? (db-property/ref->property-value-content @conn))
-                   idents))
+    (is (= [] (remove :logseq.property/built-in? idents))
         "All entities with :db/ident have built-in property (except for kv idents)")))
 
 (deftest new-graph-creates-class

+ 1 - 1
deps/graph-parser/src/logseq/graph_parser/exporter.cljs

@@ -802,7 +802,7 @@
   pages that are now properties"
   [pages-tx old-properties existing-pages import-state]
   (let [new-properties (set/difference (set (keys @(:property-schemas import-state))) (set old-properties))
-        _ (when (seq new-properties) (prn :new-properties new-properties))
+        ;; _ (when (seq new-properties) (prn :new-properties new-properties))
         [properties-tx pages-tx'] ((juxt filter remove)
                                    #(contains? new-properties (keyword (:block/name %))) pages-tx)
         property-pages-tx (map (fn [{:block/keys [title uuid]}]

+ 1 - 1
deps/graph-parser/test/logseq/graph_parser/cli_test.cljs

@@ -28,4 +28,4 @@
                             ;; could also used common-config but API isn't public yet
                             (string/includes? (:file %) (str graph-dir "/logseq/")))
                           asts))
-          "Parsed files shouldn't have empty asts"))))
+          "Parsed files shouldn't have empty asts"))))

+ 11 - 9
deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs

@@ -122,14 +122,16 @@
   [db query-ent]
   (->> (db-property/properties query-ent)
        (map (fn [[k v]]
-              [k
-               (if-let [built-in-type (get-in db-property/built-in-properties [k :schema :type])]
-                 (if (= :block/tags k)
-                   (mapv #(:db/ident (d/entity db (:db/id %))) v)
-                   (if (db-property-type/ref-property-types built-in-type)
-                     (db-property/ref->property-value-contents db v)
-                     v))
-                 (db-property/ref->property-value-contents db v))]))
+              (if (boolean? v)
+                [k v]
+                [k
+                (if-let [built-in-type (get-in db-property/built-in-properties [k :schema :type])]
+                  (if (= :block/tags k)
+                    (mapv #(:db/ident (d/entity db (:db/id %))) v)
+                    (if (db-property-type/ref-property-types built-in-type)
+                      (db-property/ref->property-value-contents db v)
+                      v))
+                  (db-property/ref->property-value-contents db v))])))
        (into {})))
 
 ;; Tests
@@ -224,7 +226,7 @@
               :user.property/prop-num 5
               :user.property/prop-string "woot"}
              (update-vals (db-property/properties (find-block-by-content @conn "b1"))
-                          #(db-property/ref->property-value-content @conn %)))
+                          (fn [v] (if (map? v) (db-property/ref->property-value-content @conn v) v))))
           "Basic block has correct properties")
       (is (= #{"prop-num" "prop-string" "prop-bool"}
              (->> (d/entity @conn (:db/id (find-block-by-content @conn "b1")))

+ 2 - 3
deps/outliner/test/logseq/outliner/property_test.cljs

@@ -171,10 +171,9 @@
           block-uuid (:block/uuid (find-block-by-content conn "b2"))
           ;; Use same args as outliner.op
           _ (outliner-property/set-block-property! conn [:block/uuid block-uuid] :user.property/checkbox true)]
-      (is (some? (:db/id (:user.property/checkbox (find-block-by-content conn "b2"))))
+      (is (true? (:user.property/checkbox (find-block-by-content conn "b2")))
           "New block has property set")
-      (is (= (:db/id property-value)
-             (:db/id (:user.property/checkbox (find-block-by-content conn "b2"))))))))
+      (is (= property-value (:user.property/checkbox (find-block-by-content conn "b2")))))))
 
 (deftest remove-block-property!
   (let [conn (create-conn-with-blocks

+ 1 - 1
src/main/frontend/components/db_based/page.cljs

@@ -25,7 +25,7 @@
         configure-opts {:selected? false
                         :page-configure? configure?}
         has-viewable-properties? (outliner-property/block-has-viewable-properties? page)
-        hide-properties? (db-property/property-value-content (:logseq.property/hide-properties? page))]
+        hide-properties? (:logseq.property/hide-properties? page)]
     (when (or configure? (and (not hide-properties?) has-viewable-properties?))
       [:div.ls-page-properties
        {:class (util/classnames [{:no-properties (not has-viewable-properties?)}])}

+ 1 - 1
src/main/frontend/components/page_menu.cljs

@@ -100,7 +100,7 @@
           (when-not (or contents?
                         config/publishing?
                         (and db-based?
-                             (db-property/property-value-content (:logseq.property/built-in? page))))
+                             (:logseq.property/built-in? page)))
             {:title   (t :page/delete)
              :options {:on-click #(delete-page-confirm! page)}})
 

+ 3 - 5
src/main/frontend/components/property/value.cljs

@@ -758,14 +758,12 @@
           (property-value-date-picker block property value (merge opts {:editing? editing?}))
 
           :checkbox
-          (let [add-property! (fn []
-                                (<add-property! block (:db/ident property)
-                                                (boolean (not (db-property/property-value-content value)))))]
+          (let [add-property! (fn [] (<add-property! block (:db/ident property) (boolean (not value))))]
             [:label.flex.w-full.as-scalar-value-wrap.cursor-pointer
              (shui/checkbox {:class "jtrigger flex flex-row items-center"
                              :disabled config/publishing?
                              :auto-focus editing?
-                             :checked (db-property/property-value-content value)
+                             :checked value
                              :on-checked-change add-property!
                              :on-key-down (fn [e]
                                             (when (= (util/ekey e) "Enter")
@@ -862,7 +860,7 @@
              (first v)
              :else
              v)
-         empty-value? (= :logseq.property/empty-placeholder (:db/ident (first v)))
+         empty-value? (when (coll? v) (= :logseq.property/empty-placeholder (:db/ident (first v))))
          closed-values? (seq (:property/closed-values property))
          value-cp [:div.property-value-inner
                    {:data-type type

+ 2 - 4
src/main/frontend/handler/page.cljs

@@ -44,8 +44,7 @@
             [frontend.modules.outliner.ui :as ui-outliner-tx]
             [frontend.modules.outliner.op :as outliner-op]
             [frontend.handler.property.util :as pu]
-            [datascript.impl.entity :as de]
-            [logseq.db.frontend.property :as db-property]))
+            [datascript.impl.entity :as de]))
 
 (def <create! page-common-handler/<create!)
 (def <delete! page-common-handler/<delete!)
@@ -496,5 +495,4 @@
   (property-handler/set-block-property! (state/get-current-repo)
                                         (:block/uuid page-entity)
                                         :logseq.property/hide-properties?
-                                        (not
-                                         (db-property/property-value-content (:logseq.property/hide-properties? page-entity)))))
+                                        (not (:logseq.property/hide-properties? page-entity))))

+ 32 - 3
src/main/frontend/worker/db/migrate.cljs

@@ -43,6 +43,35 @@
   [{:db/id (:db/id (d/entity @conn :logseq.class/task))
     :db/ident :logseq.class/Task}])
 
+(defn- property-checkbox-type-non-ref
+  [conn _search-db]
+  (let [db @conn
+        properties (d/q
+                    '[:find [?ident ...]
+                      :where
+                      [?p :block/schema ?s]
+                      [(get ?s :type) ?t]
+                      [(= ?t :checkbox)]
+                      [?p :db/ident ?ident]]
+                    db)
+        datoms (mapcat #(d/datoms db :avet %) properties)
+        schema-tx-data (map
+                        (fn [ident]
+                          [:db/retract ident :db/valueType])
+                        properties)
+        value-tx-data (mapcat
+                       (fn [d]
+                         (let [e (:e d)
+                               a (:a d)
+                               v (:v d)
+                               ve (when (integer? v) (d/entity db v))
+                               ve-value (:property.value/content ve)]
+                           (when (some? ve-value)
+                             [[:db/add e a ve-value]
+                              [:db/retractEntity v]])))
+                       datoms)]
+    (concat schema-tx-data value-tx-data)))
+
 (defn- update-table-properties
   [conn _search-db]
   (let [old-new-props {:logseq.property/table-sorting :logseq.property.table/sorting
@@ -81,7 +110,8 @@
    [7 {:fix replace-original-name-content-with-title}]
    [8 {:fix replace-object-and-page-type-with-node}]
    [9 {:fix update-task-ident}]
-   [10 {:fix update-table-properties}]])
+   [10 {:fix update-table-properties}]
+   [11 {:fix property-checkbox-type-non-ref}]])
 
 (let [max-schema-version (apply max (map first schema-version->updates))]
   (assert (<= db-schema/version max-schema-version))
@@ -102,7 +132,6 @@
 
       (> db-schema/version version-in-db)
       (let [db-based? (ldb/db-based-graph? @conn)
-            built-in-value (:db/id (get (d/entity db :logseq.class/Root) :logseq.property/built-in?))
             updates (keep (fn [[v updates]]
                             (when (and (< version-in-db v) (<= v db-schema/version))
                               updates))
@@ -117,7 +146,7 @@
                                             (assert (str "DB migration: property already exists " k)))))
                                 (into {})
                                 sqlite-create-graph/build-initial-properties*
-                                (map (fn [b] (assoc b :logseq.property/built-in? built-in-value))))
+                                (map (fn [b] (assoc b :logseq.property/built-in? true))))
             fixes (mapcat
                    (fn [update]
                      (when-let [fix (:fix update)]

+ 0 - 11
src/test/frontend/db/db_based_model_test.cljs

@@ -20,17 +20,6 @@
 
 (use-fixtures :each start-and-destroy-db)
 
-;; (deftest get-db-property-values-test-with-pages
-;;   (let [opts {:redirect? false :create-first-block? false}
-;;         _ (test-helper/create-page! "page1" opts)
-;;         _ (test-helper/create-page! "page2" opts)
-;;         p1id (:block/uuid (db/get-page "page1"))
-;;         p2id (:block/uuid (db/get-page "page2"))]
-;;     (outliner-property/upsert-property! repo "property-1" {:type :node} {})
-;;     (outliner-property/set-block-property! repo fbid "property-1" p1id {})
-;;     (outliner-property/set-block-property! repo sbid "property-1" p2id {})
-;;     (is (= '("[[page1]]" "[[page2]]") (model/get-db-property-values repo "property-1")))))
-
 (deftest get-all-classes-test
   (let [opts {:redirect? false :create-first-block? false :class? true}
         _ (test-helper/create-page! "class1" opts)