فهرست منبع

fix: build+export of closed :many property values

Gabriel Horner 6 ماه پیش
والد
کامیت
a1bd567906

+ 6 - 3
deps/db/src/logseq/db/sqlite/build.cljs

@@ -99,7 +99,10 @@
   "Provides the next temp :db/id to use in a create-graph transact!"
   #(swap! current-db-id dec))
 
-(defn- build-property-map-for-pvalue-tx [k v new-block properties-config all-idents]
+(defn- build-property-map-for-pvalue-tx
+  "Returns a property map if the given property pair should have a property value entity constructured
+   or nil if it should not. Property maps must at least contain the :db/ident and :logseq.property/type keys"
+  [k v new-block properties-config all-idents]
   (if-let [built-in-type (get-in db-property/built-in-properties [k :schema :type])]
     (if (and (db-property-type/value-ref-property-types built-in-type)
              ;; closed values are referenced by their :db/ident so no need to create values
@@ -113,8 +116,8 @@
         {:db/ident k
          :logseq.property/type built-in-type'}))
     (when (and (db-property-type/value-ref-property-types (get-in properties-config [k :logseq.property/type]))
-               ;; TODO: Support translate-property-value without this hack
-               (not (vector? v)))
+               ;; Don't build property value entity if values are :block/uuid refs
+               (if (set? v) (not (vector? (first v))) (not (vector? v))))
       (let [prop-type (get-in properties-config [k :logseq.property/type])]
         {:db/ident (get-ident all-idents k)
          :original-property-id k

+ 16 - 11
deps/db/src/logseq/db/sqlite/export.cljs

@@ -42,7 +42,7 @@
 
 (defn- buildable-property-value-entity
   "Converts property value to a buildable version"
-  [db property-ent pvalue {:keys [property-value-uuids?] :as options}]
+  [db property-ent pvalue properties-config {:keys [property-value-uuids?] :as options}]
   (cond (and (not property-value-uuids?) (ldb/internal-page? pvalue))
         ;; Should page properties be pulled here?
         [:build/page (cond-> (shallow-copy-page pvalue)
@@ -64,8 +64,7 @@
                                          ;; TODO: Allow user properties when sqlite.build supports it
                                          (medley/filter-keys db-property/internal-property?))
                     ent-properties (when (and (not (:block/closed-value-property pvalue)) (seq ent-properties*))
-                                     ;; TODO: Support closed values as needed
-                                     (buildable-properties db ent-properties* {} options))]
+                                     (buildable-properties db ent-properties* properties-config options))]
                 (if (or (seq ent-properties) (seq (:block/tags pvalue)))
                   (cond-> {:build/property-value :block
                            :block/title (or (block-title pvalue)
@@ -89,18 +88,24 @@
   (->> ent-properties
        (map (fn [[k v]]
               [k
-               (if (and (:block/closed-value-property v) (not (db-property/logseq-property? k)))
-                 (if-let [closed-uuid (some #(when (= (:value %) (db-property/property-value-content v))
-                                               (:uuid %))
-                                            (get-in properties-config [k :build/closed-values]))]
-                   [:block/uuid closed-uuid]
-                   (throw (ex-info (str "No closed value found for content: " (pr-str (db-property/property-value-content v))) {:properties properties-config})))
+               ;; handle user closed value properties. built-ins have idents and shouldn't be handled here
+               (if (and (not (db-property/logseq-property? k))
+                        (or (:block/closed-value-property v)
+                            (and (set? v) (:block/closed-value-property (first v)))))
+                 (let [find-closed-uuid (fn [val]
+                                          (or (some #(when (= (:value %) (db-property/property-value-content val))
+                                                       (:uuid %))
+                                                    (get-in properties-config [k :build/closed-values]))
+                                              (throw (ex-info (str "No closed value found for content: " (pr-str (db-property/property-value-content val))) {:properties properties-config}))))]
+                   (if (set? v)
+                     (set (map #(vector :block/uuid (find-closed-uuid %)) v))
+                     [:block/uuid (find-closed-uuid v)]))
                  (cond
                    (de/entity? v)
-                   (buildable-property-value-entity db (d/entity db k) v options)
+                   (buildable-property-value-entity db (d/entity db k) v properties-config options)
                    (and (set? v) (every? de/entity? v))
                    (let [property-ent (d/entity db k)]
-                     (set (map #(buildable-property-value-entity db property-ent % options) v)))
+                     (set (map #(buildable-property-value-entity db property-ent % properties-config options) v)))
                    :else
                    v))]))
        (into {})))

+ 2 - 1
deps/db/test/logseq/db/sqlite/export_test.cljs

@@ -558,6 +558,7 @@
                                                    :logseq.property/default-value 42})}
           :user.property/default-closed
           {:logseq.property/type :default
+           :db/cardinality :db.cardinality/many
            :build/closed-values [{:value "joy" :uuid closed-value-uuid}
                                  {:value "sad" :uuid (random-uuid)}]}
           :user.property/checkbox {:logseq.property/type :checkbox}
@@ -587,7 +588,7 @@
                                      :user.property/node #{[:block/uuid page-pvalue-uuid]}}}
            :blocks [{:block/title "b1"
                      :build/properties {:user.property/num 1
-                                        :user.property/default-closed [:block/uuid closed-value-uuid]
+                                        :user.property/default-closed #{[:block/uuid closed-value-uuid]}
                                         :user.property/date [:block/uuid journal-uuid]}}
                     {:block/title "b2" :build/properties {:user.property/node #{[:block/uuid page-object-uuid]}}}
                     {:block/title "b3" :build/properties {:user.property/node #{[:block/uuid page-object-uuid]}}}