revert: remove :block/properties

pull/11177/head
Tienson Qin 2024-04-28 19:44:53 +08:00
parent d0e2a0991b
commit 5d4ae66d86
20 changed files with 118 additions and 200 deletions

View File

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

View File

@ -25,20 +25,13 @@
:block/raw-content
(lookup-entity e :block/content default-value)
:block/raw-properties
(lookup-entity e :block/properties default-value)
:block/properties
(let [db (.-db e)]
(if (db-based-graph? db)
(let [result (lookup-entity e k default-value)]
(->>
(keep (fn [pair-e]
(when pair-e
(if-let [pid (:db/ident (lookup-entity pair-e :property/pair-property nil))]
{pid (lookup-entity pair-e pid nil)}
(prn "Error: outdated property pair entity should be deleted: " pair-e)))) result)
(into {})))
(lookup-entity e :block/properties
(->> (into {} e)
(filter (fn [[k _]] (db-property/property? k)))
(into {})))
(lookup-entity e :block/properties nil)))
:block/content
@ -53,12 +46,7 @@
default-value)))
(or (get (.-kv e) k)
(if (and (not (db-property/db-attribute-properties k))
(db-property/property? k)
(db-based-graph? (.-db e))
(not (:property/pair-property e))) ; property pair will be direct access
(k (first (filter #(some? (k %)) (lookup-entity e :block/properties nil))))
(lookup-entity e k default-value))))))
(lookup-entity e k default-value)))))
#?(:org.babashka/nbb
nil

View File

@ -101,7 +101,7 @@
"Returns entity maps for given :eavt datoms indexed by db/id. Optional keys:
* :entity-fn - Optional fn that given an entity id, returns entity. Defaults
to just doing a lookup within entity-maps to be as performant as possible"
[datoms & {:keys [entity-fn]}]
[datoms & {:keys [_entity-fn]}]
(let [ent-maps
(reduce (fn [acc {:keys [a e v]}]
(if (contains? db-schema/card-many-attributes a)
@ -114,20 +114,23 @@
(update acc e assoc a v))))
{}
datoms)
entity-fn' (or entity-fn #(get ent-maps %))]
(-> ent-maps
(update-vals
(fn [v]
(let [pair-ent (when (:property/pair-property v) (entity-fn' (:property/pair-property v)))]
(if-let [prop-value
(and pair-ent
(= :db.cardinality/many (:db/cardinality pair-ent))
(get v (:db/ident pair-ent)))]
(if-not (set? prop-value)
;; Fix :many property values that only had one value
(assoc v (:db/ident pair-ent) #{prop-value})
v)
v)))))))
;; entity-fn' (or entity-fn #(get ent-maps %))
]
ent-maps
;; (-> ent-maps
;; (update-vals
;; (fn [v]
;; (let [pair-ent (when (:property/pair-property v) (entity-fn' (:property/pair-property v)))]
;; (if-let [prop-value
;; (and pair-ent
;; (= :db.cardinality/many (:db/cardinality pair-ent))
;; (get v (:db/ident pair-ent)))]
;; (if-not (set? prop-value)
;; ;; Fix :many property values that only had one value
;; (assoc v (:db/ident pair-ent) #{prop-value})
;; v)
;; v)))))
))
(defn datoms->entities
"Returns a vec of entity maps given :eavt datoms"
@ -145,7 +148,6 @@
[:block/created-at :int]
[:block/updated-at :int]
[:block/format [:enum :markdown]]
[:block/properties {:optional true} [:set :int]]
[:block/refs {:optional true} [:set :int]]
[:block/tags {:optional true} [:set :int]]
[:block/collapsed-properties {:optional true} [:set :int]]

View File

@ -237,26 +237,10 @@
"Returns a block's properties as a map indexed by property's db-ident.
Use this in deps because nbb can't use :block/properties from entity-plus"
[e]
(->> (:block/properties e)
(map (fn [pair-e]
(let [pid (:db/ident (:property/pair-property pair-e))]
{pid (pair-e pid)})))
(->> (into {} e)
(filter (fn [[k _]] (property? k)))
(into {})))
(defn get-pair-e
"Fetches a block's property pair entity given a property's db-ident. Iterates over a
block's property pairs until it finds the first match. This is nbb compatible"
[block db-ident]
(first (filter #(= (:db/ident (:property/pair-property %)) db-ident)
(or (:block/raw-properties block)
;; Fallback for nbb since it can't access :block/raw-properties
(:block/properties block)))))
(defn get-property-value
"Fetches a block's property value given a property's db-ident"
[block db-ident]
(get (get-pair-e block db-ident) db-ident))
(defn valid-property-name?
[s]
{:pre [(string? s)]}

View File

@ -11,7 +11,7 @@
:block/format :markdown
:block/uuid block-id
:block/page page-id
:block/properties [(sqlite-util/build-property-pair nil :logseq.property/created-from-property (:db/ident property))]
:logseq.property/created-from-property (:db/ident property)
:block/schema {:value value}
:block/parent page-id})
@ -25,7 +25,7 @@
(assoc :db/ident db-ident)
icon
(update :block/properties conj (sqlite-util/build-property-pair nil :logseq.property/icon icon))
(assoc :logseq.property/icon icon)
;; For now, only closed values with :db/ident are built-in?
(and db-ident (keyword? db-ident))

View File

@ -39,6 +39,7 @@
(zipmap closed-value-property-types (repeat #{:values}))
(zipmap #{:string :number :url} (repeat #{:position}))
{:default #{}
:string #{:cardinality}
:number #{:cardinality}
:date #{:cardinality}
:url #{:cardinality}

View File

@ -23,7 +23,7 @@
(when db
(let [block (or (d/entity db (:db/id block)) block)]
(if (sqlite-util/db-based-graph? repo)
(db-property/get-property-value block db-ident)
(get block db-ident)
(lookup repo (:block/properties block) db-ident)))))
(defn shape-block?

View File

@ -121,11 +121,8 @@
(merge
(dissoc schema
:block/namespace :block/properties-text-values :block/pre-block? :recent/pages :file/handle :block/file
:block/properties-order)
:block/properties :block/properties-order)
{:block/name {:db/index true} ; remove db/unique for :block/name
:block/properties {:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many}
:property/pair-property {:db/valueType :db.type/ref}
;; class properties
:class/parent {:db/valueType :db.type/ref
:db/index true}

View File

@ -89,42 +89,32 @@
[db block]
(when (entity-plus/db-based-graph? db)
(let [block (d/entity db (:db/id block))
block-properties (when (seq (:block/raw-properties block))
(let [pairs (d/pull-many db '[*] (map :db/id (:block/raw-properties block)))]
(mapcat
(fn [pair]
(let [property (d/entity db (:db/id (:property/pair-property pair)))
property-values (get pair (:db/ident property))
values (if (and (coll? property-values)
(map? (first property-values)))
property-values
#{property-values})
value-ids (when (every? map? values)
(->> (map :db/id values)
(filter (fn [id] (or (int? id) (keyword? id))))))
value-blocks (->>
(when (seq value-ids)
(mapcat
(fn [id]
(let [b (d/entity db id)]
(cons (d/pull db '[*] id)
(let [ids (map :db/id (:block/raw-properties b))]
(when (seq ids)
(d/pull-many db '[*] ids))))))
value-ids))
block-properties (when (seq (:block/properties block))
(mapcat
(fn [[_property-id property-values]]
(let [values (if (and (coll? property-values)
(map? (first property-values)))
property-values
#{property-values})
value-ids (when (every? map? values)
(->> (map :db/id values)
(filter (fn [id] (or (int? id) (keyword? id))))))
value-blocks (->>
(when (seq value-ids)
(map
(fn [id] (d/pull db '[*] id))
value-ids))
;; FIXME: why d/pull returns {:db/id db-ident} instead of {:db/id number-eid}?
(map (fn [block]
(let [from-property-id (get-in block [:logseq.property/created-from-property :db/id])]
(if (keyword? from-property-id)
(assoc-in block [:logseq.property/created-from-property :db/id] (:db/id (d/entity db from-property-id)))
block)))))
page (when (seq values)
(when-let [page-id (:db/id (:block/page (d/entity db (:db/id (first values)))))]
(d/pull db '[*] page-id)))]
(remove nil? (concat [page]
value-blocks
[pair]))))
pairs)))]
(map (fn [block]
(let [from-property-id (get-in block [:logseq.property/created-from-property :db/id])]
(if (keyword? from-property-id)
(assoc-in block [:logseq.property/created-from-property :db/id] (:db/id (d/entity db from-property-id)))
block)))))
page (when (seq values)
(when-let [page-id (:db/id (:block/page (d/entity db (:db/id (first values)))))]
(d/pull db '[*] page-id)))]
(remove nil? (concat [page] value-blocks))))
(:block/properties block)))]
block-properties)))
(defn get-block-children-ids
@ -171,7 +161,7 @@
(mapcat (fn [block]
(let [e (d/entity db (:db/id block))]
(conj
(if (seq (:block/raw-properties e))
(if (seq (:block/properties e))
(vec (property-with-values db e))
[])
block))))))))]

View File

@ -117,25 +117,7 @@
(and (:block/name block)
(nil? (:block/page block))))
(defn build-property-pair
[block db-ident value]
(assert (or (de/entity? block) (nil? block)) "build-property-pair `block` should be a db entity or nil")
(if-let [pair (when block (db-property/get-pair-e block db-ident))]
{:db/id (:db/id pair)
db-ident value
:block/updated-at (common-util/time-ms)}
(block-with-timestamps
{:property/pair-property {:db/ident db-ident}
db-ident value})))
(defn build-properties
[block properties-map]
(assert (or (de/entity? block) (nil? block)) "build-property-pair `block` should be a db entity or nil")
(mapv (fn [[db-ident value]] (build-property-pair block db-ident value)) properties-map))
(defn mark-block-as-built-in
"Marks built-in blocks as built-in? including pages, classes, properties and closed values"
[block]
(update block :block/properties conj
(let [e (when (de/entity? block) block)]
(build-property-pair e :logseq.property/built-in? true))))
(assoc block :logseq.property/built-in? true))

View File

@ -82,15 +82,13 @@
(defn shape->block [repo db shape page-id]
(let [block-uuid (if (uuid? (:id shape)) (:id shape) (uuid (:id shape)))
block (when block-uuid (d/entity db [:block/uuid block-uuid]))
properties-map {(db-property-util/get-pid repo :logseq.property/ls-type) :whiteboard-shape
(db-property-util/get-pid repo :logseq.property.tldraw/shape) shape}
properties (if (sqlite-util/db-based-graph? repo)
(sqlite-util/build-properties block properties-map)
properties-map)
properties {(db-property-util/get-pid repo :logseq.property/ls-type) :whiteboard-shape
(db-property-util/get-pid repo :logseq.property.tldraw/shape) shape}
block {:block/uuid block-uuid
:block/page page-id
:block/parent page-id}
block' (assoc block :block/properties properties)
block' (if (sqlite-util/db-based-graph? repo)
(merge block properties)
(assoc block :block/properties properties))
additional-props (with-whiteboard-block-props block' page-id)]
(merge block' additional-props)))

View File

@ -321,11 +321,9 @@
value (get-in value-e [:block/schema :value])]
(when (= (string/lower-case marker) (string/lower-case value))
(:db/id value-e)))))))]
(when-let [pair (and marker (db-property/get-pair-e block-entity :logseq.task/status))]
(swap! txs-state into [[:db/retractEntity (:db/id pair)]]))
(cond-> m
matched-status-id
(update :block/properties conj (sqlite-util/build-property-pair block-entity (:db/ident property) matched-status-id))
(assoc (:db/ident property) matched-status-id)
matched-status-id
(update :block/content (fn [content]
@ -652,7 +650,7 @@
list?
((fn [b]
(if db-based?
(update b :block/properties conj (sqlite-util/build-property-pair block :logseq.property/order-list-type list-type))
(assoc b :logseq.property/order-list-type list-type)
(update b :block/properties assoc (db-property-util/get-pid repo :logseq.property/order-list-type) list-type))))
(not db-based?)
@ -954,7 +952,7 @@
non-consecutive-blocks)))) page-blocks)
(remove nil?)))))
(defn- delete-block
(defn delete-block
[repo conn txs-state node {:keys [date-formatter]}]
(let [right-node (otree/-get-right node conn)]
(otree/-del node txs-state conn)

View File

@ -72,17 +72,17 @@
(or (get all-idents kw)
(throw (ex-info (str "No ident found for " kw) {}))))
(defn- ->block-properties-tx [properties uuid-maps all-idents]
(mapv
(fn [[prop-name val]]
(sqlite-util/build-property-pair
nil
(get-ident all-idents prop-name)
;; set indicates a :many value
(if (set? val)
(set (map #(translate-property-value % uuid-maps) val))
(translate-property-value val uuid-maps))))
properties))
(defn- ->block-properties [properties uuid-maps all-idents]
(->>
(map
(fn [[prop-name val]]
[(get-ident all-idents prop-name)
;; set indicates a :many value
(if (set? val)
(set (map #(translate-property-value % uuid-maps) val))
(translate-property-value val uuid-maps))])
properties)
(into {})))
(defn- create-uuid-maps
"Creates maps of unique page names, block contents and property names to their uuids"
@ -119,8 +119,8 @@
:block/left {:db/id (if last-block (block-id-fn last-block) page-id)}
:block/parent {:db/id page-id}})
(when (seq (:properties m))
{:block/properties (->block-properties-tx (:properties m) uuid-maps all-idents)
:block/refs (build-property-refs (:properties m) all-idents)})))
(merge (->block-properties (:properties m) uuid-maps all-idents)
{:block/refs (build-property-refs (:properties m) all-idents)}))))
(defn- build-properties-tx [properties uuid-maps all-idents]
(let [property-db-ids (->> (keys properties)
@ -145,8 +145,9 @@
{:db/id (or (property-db-ids (name prop-name))
(throw (ex-info "No :db/id for property" {:property prop-name})))}
(when-let [props (not-empty (:properties prop-m))]
{:block/properties (->block-properties-tx props uuid-maps all-idents)
:block/refs (build-property-refs props all-idents)}))]))
(merge
(->block-properties props uuid-maps all-idents)
{:block/refs (build-property-refs props all-idents)})))]))
properties))]
new-properties-tx))
@ -235,7 +236,7 @@
new-page
(dissoc page :properties)
(when (seq (:properties page))
{:block/properties (->block-properties-tx (:properties page) uuid-maps all-idents)})
(->block-properties (:properties page) uuid-maps all-idents))
(when (seq (:properties page))
{:block/refs (build-property-refs (:properties page) all-idents)
;; app doesn't do this yet but it should to link property to page

View File

@ -6,7 +6,6 @@
[cljs.core.async :as async]
[clojure.edn :as edn]
[clojure.string :as string]
[cognitect.transit :as transit]
[datascript.core :as d]
[datascript.storage :refer [IStorage]]
[frontend.worker.async-util :include-macros true :refer [<?] :as async-util]
@ -41,8 +40,6 @@
(defonce *opfs-pools worker-state/*opfs-pools)
(defonce *publishing? (atom false))
(defonce transit-w (transit/writer :json))
(defn- <get-opfs-pool
[graph]
(when-not @*publishing?

View File

@ -12,7 +12,6 @@
[frontend.modules.outliner.tree :as outliner-tree]
[frontend.state :as state]
[frontend.handler.db-based.property.util :as db-pu]
[logseq.db.frontend.property :as db-property]
[logseq.db :as ldb]))
(defn loaded? []
@ -21,7 +20,7 @@
(defn- with-properties
[m block]
(let [db-based? (config/db-based-graph? (state/get-current-repo))
properties (if db-based? (db-property/properties block) (:block/properties block))]
properties (:block/properties block)]
(if (seq properties)
(merge m
(update-keys

View File

@ -33,12 +33,12 @@
(build-property-value-tx-data block property-id value (= property-id :logseq.task/status)))
([block property-id value status?]
(when (some? value)
(let [property-tx-data {:db/id (:db/id block)
:block/properties (sqlite-util/build-property-pair block property-id value)}
block-tx-data (cond-> (outliner-core/block-with-updated-at {:db/id (:db/id block)})
status?
(let [block (assoc (outliner-core/block-with-updated-at {:db/id (:db/id block)})
property-id value)
block-tx-data (cond-> block
status?
(assoc :block/tags :logseq.class/task))]
[property-tx-data block-tx-data]))))
[block-tx-data]))))
(defn- get-property-value-schema
"Gets a malli schema to validate the property value for the given property type and builds
@ -203,10 +203,7 @@
(notification/show! msg' :warning))
(do
(upsert-property! repo property-id (assoc property-schema :type property-type) {})
(let [pair-id (:db/id (db-property/get-pair-e block property-id))
tx-data (concat
(when pair-id [[:db/retract pair-id property-id]])
(build-property-value-tx-data block property-id values' false))]
(let [tx-data (build-property-value-tx-data block property-id values' false)]
(db/transact! repo tx-data {:outliner-op :save-block})))))))))
(defn- resolve-tag
@ -260,7 +257,8 @@
(when (some? v'')
(let [infer-schema (when-not type (infer-schema-from-input-string v''))
property-type' (or type property-type infer-schema :default)
schema (get-property-value-schema property-type' property)
schema (get-property-value-schema property-type' (or property
{:block/schema {:type property-type'}}))
existing-value (when-let [id (:db/ident property)]
(get block id))
new-value* (if (= v'' :logseq.property/empty-placeholder)
@ -379,11 +377,9 @@
txs-state
(outliner-core/->Block property-block)
{:children? true})
@txs-state))
pair-id (:db/id (db-property/get-pair-e block property-id))]
@txs-state))]
(concat
(when pair-id
[[:db/retractEntity pair-id]])
[[:db/retract eid (:db/ident property)]]
retract-blocks-tx))))
block-eids)]
(when (seq txs)
@ -490,13 +486,10 @@
(-> (block/page-name->map page-name true)
(assoc :block/type #{"hidden"}
:block/format :markdown
:block/properties
(sqlite-util/build-property-pair nil :logseq.property/source-page (:db/id property)))))
:logseq.property/source-page (:db/id property))))
page-tx (when-not page-entity page)
page-id [:block/uuid (:block/uuid page)]
parent-id (db/new-block-id)
from-block-pair (when (:db/id block) (sqlite-util/build-property-pair block :logseq.property/created-from-block (:db/id block)))
from-property-pair (when (:db/id property) (sqlite-util/build-property-pair block :logseq.property/created-from-property (:db/id property)))
parent (-> {:block/uuid parent-id
:block/format :markdown
:block/content ""
@ -504,7 +497,8 @@
:block/parent page-id
:block/left (or (when page-entity (model/get-block-last-direct-child-id (db/get-db) (:db/id page-entity)))
page-id)
:block/properties (remove nil? [from-block-pair from-property-pair])}
:logseq.property/created-from-block (:db/id block)
:logseq.property/created-from-property (:db/id property)}
sqlite-util/block-with-timestamps)
child-1-id (db/new-block-id)
child-1 (-> {:block/uuid child-1-id
@ -545,8 +539,7 @@
(-> (block/page-name->map page-name true)
(assoc :block/type #{"hidden"}
:block/format :markdown
:block/properties
(sqlite-util/build-property-pair nil :logseq.property/source-page (:db/id property)))))
:logseq.property/source-page (:db/id property))))
page-tx (when-not page-entity page)
page-id [:block/uuid (:block/uuid page)]
block-id (db/new-block-id)
@ -558,11 +551,9 @@
:block/parent page-id
:block/left (or (when page-entity (model/get-block-last-direct-child-id (db/get-db) (:db/id page-entity)))
page-id)
:block/properties
(sqlite-util/build-properties nil
{:logseq.property/created-from-block [:block/uuid (:block/uuid block)]
:logseq.property/created-from-property (:db/id property)
:logseq.property/created-from-template [:block/uuid (:block/uuid template)]})}
:logseq.property/created-from-block [:block/uuid (:block/uuid block)]
:logseq.property/created-from-property (:db/id property)
:logseq.property/created-from-template [:block/uuid (:block/uuid template)]}
sqlite-util/block-with-timestamps)]
{:page page-tx
:blocks [new-block]}))

View File

@ -68,9 +68,8 @@
:block/name (util/page-name-sanity-lc page-name)
:block/type "whiteboard"
:block/format :markdown
:block/properties (sqlite-util/build-properties page-entity
{:logseq.property/ls-type :whiteboard-page
:logseq.property.tldraw/page tldraw-page})
:logseq.property/ls-type :whiteboard-page
:logseq.property.tldraw/page tldraw-page
:block/updated-at (util/time-ms)
:block/created-at (or (:block/created-at page-entity)
(util/time-ms))}))
@ -203,19 +202,19 @@
:bindings {},
:nonce 1,
:assets []}
properties-map {(pu/get-pid :logseq.property/ls-type) :whiteboard-page,
(pu/get-pid :logseq.property.tldraw/page) tldraw-page}
properties (if db-based?
(sqlite-util/build-properties nil properties-map)
properties-map)
properties {(pu/get-pid :logseq.property/ls-type) :whiteboard-page,
(pu/get-pid :logseq.property.tldraw/page) tldraw-page}
m #:block{:uuid id
:name (util/page-name-sanity-lc page-name),
:original-name page-name
:type "whiteboard",
:format :markdown
:updated-at (util/time-ms),
:created-at (util/time-ms)}]
[(assoc m :block/properties properties)]))
:created-at (util/time-ms)}
m' (if db-based?
(merge m properties)
(assoc m :block/properties properties))]
[m']))
(defn <create-new-whiteboard-page!
([]

View File

@ -239,6 +239,8 @@
[[:db.fn/retractEntity [:file/path file-path]]])
delete-page-tx (concat (db-refs->page repo page)
[[:db.fn/retractEntity (:db/id page)]])
;; TODO: is this still needed?
delete-property-pairs-tx (when property?
(map (fn [d] [:db.fn/retractEntity (:e d)]) (d/datoms db :avet (:db/ident page))))
tx-data (concat truncate-blocks-tx-data

View File

@ -10,7 +10,6 @@
[logseq.db.sqlite.util :as sqlite-util]
[logseq.outliner.datascript-report :as ds-report]
[logseq.outliner.pipeline :as outliner-pipeline]
[logseq.db.frontend.property :as db-property]
[logseq.outliner.core :as outliner-core]))
(defn- path-refs-need-recalculated?
@ -42,19 +41,11 @@
(mapcat (fn [b]
(let [created-from-block (get b :logseq.property/created-from-block)
created-from-property (get b :logseq.property/created-from-property)
created-block (d/entity after-db (:db/id created-from-block))
pair-e (db-property/get-pair-e created-from-block (:db/ident created-from-property))
tx-id (get-in tx-report [:tempids :db/current-tx])]
created-block (d/entity after-db (:db/id created-from-block))]
(when (and created-block created-from-property)
[[:db/retractEntity (:db/id b)]
(when pair-e
(outliner-core/block-with-updated-at
{:db/id (:db/id pair-e)
:block/tx-id tx-id}))
(when pair-e
(outliner-core/block-with-updated-at
{:db/id (:db/id created-block)
:block/tx-id tx-id}))])))
(outliner-core/block-with-updated-at
{:db/id (:db/id created-block)})])))
empty-property-parents)
(remove nil?)))))
@ -127,9 +118,8 @@
tx-id (get-in tx-report [:tempids :db/current-tx])]
(keep (fn [b]
(when-let [db-id (:db/id b)]
(when-not (:property/pair-property b)
{:db/id db-id
:block/tx-id tx-id}))) updated-blocks)))
{:db/id db-id
:block/tx-id tx-id})) updated-blocks)))
tx-report' (or
(when (seq replace-tx)
;; TODO: remove this since transact! is really slow

View File

@ -10,8 +10,7 @@
[frontend.worker.util :as worker-util]
[logseq.db.sqlite.util :as sqlite-util]
[logseq.common.util :as common-util]
[logseq.db :as ldb]
[cljs-bean.core :as bean]))
[logseq.db :as ldb]))
;; TODO: use sqlite for fuzzy search
(defonce indices (atom nil))