diff --git a/deps/db/src/logseq/db/sqlite/export.cljs b/deps/db/src/logseq/db/sqlite/export.cljs index ca6c57caaf..f8b74028e7 100644 --- a/deps/db/src/logseq/db/sqlite/export.cljs +++ b/deps/db/src/logseq/db/sqlite/export.cljs @@ -39,6 +39,27 @@ (or (block-title pvalue) (:logseq.property/value pvalue))) +(defn- referenced-property-value-contents + [db property] + (->> (d/datoms db :avet (:db/ident property)) + (keep (fn [datom] + (some->> (:v datom) + (d/entity db) + property-value-content))) + set)) + +(defn- closed-values-for-export + [db property] + (let [referenced-contents (referenced-property-value-contents db property)] + (->> (concat (entity-plus/lookup-kv-then-entity property :property/closed-values) + (filter #(contains? referenced-contents (property-value-content %)) + (:block/_closed-value-property property))) + (reduce (fn [closed-values value] + (assoc closed-values (:db/id value) value)) + {}) + vals + (sort-by :block/order)))) + (defn- shallow-copy-page "Given a page or journal entity, shallow copies it e.g. no properties or tags info included. Pages that are shallow copied are at the edges of export and help keep the export size reasonable and @@ -147,7 +168,7 @@ (->> user-property-idents (map (fn [ident] (let [property (d/entity db ident) - closed-values (entity-plus/lookup-kv-then-entity property :property/closed-values)] + closed-values (closed-values-for-export db property)] [property (cond-> (select-keys property (-> (disj db-property/schema-properties :logseq.property/classes) diff --git a/deps/db/test/logseq/db/sqlite/export_test.cljs b/deps/db/test/logseq/db/sqlite/export_test.cljs index c915416675..5c3998b74a 100644 --- a/deps/db/test/logseq/db/sqlite/export_test.cljs +++ b/deps/db/test/logseq/db/sqlite/export_test.cljs @@ -553,6 +553,43 @@ (get-in export-edn [:classes :user.class/MyClass :build/class-properties]))) (is (not (contains? (:properties export-edn) legacy-property))))) +(deftest graph-export-omits-legacy-plugin-property-schema-attrs + (let [plugin-property :plugin.property.degrande-colors/mugpet_degrande_colors_controls + conn (db-test/create-conn-with-import-map + {:properties {plugin-property {:logseq.property/type :json}} + :pages-and-blocks [{:page {:block/title "page1"} + :blocks [{:block/title "b1"}]}]}) + plugin-property-ent (d/entity @conn plugin-property) + _ (d/transact! conn [{:db/id (:db/id plugin-property-ent) + :hide? true + :public? false}]) + export-edn (sqlite-export/build-export @conn {:export-type :graph}) + validation (sqlite-export/validate-export export-edn)] + (is (nil? (:error validation))) + (is (= {:logseq.property/type :json + :db/cardinality :db.cardinality/one + :block/title "mugpet_degrande_colors_controls"} + (get-in export-edn [:properties plugin-property]))))) + +(deftest graph-export-keeps-referenced-recycled-closed-value-config + (let [property-id :plugin.property.degrande-colors/tldraw + closed-value-uuid (random-uuid) + conn (db-test/create-conn-with-import-map + {:properties {property-id {:logseq.property/type :default + :build/closed-values [{:value "tldraw" + :uuid closed-value-uuid}]}} + :pages-and-blocks [{:page {:block/title "page1"} + :blocks [{:block/title "b1" + :build/properties {property-id [:block/uuid closed-value-uuid]}}]}]}) + closed-value (d/entity @conn [:block/uuid closed-value-uuid]) + _ (d/transact! conn [{:db/id (:db/id closed-value) + :logseq.property/deleted-at 1}]) + export-edn (sqlite-export/build-export @conn {:export-type :graph}) + validation (sqlite-export/validate-export export-edn)] + (is (nil? (:error validation))) + (is (= [{:value "tldraw" :uuid closed-value-uuid}] + (get-in export-edn [:properties property-id :build/closed-values]))))) + (deftest import-view-blocks (let [original-data ;; Test a mix of page and block types