fix ref-property tests pointing to property rule

Also add back property tests as it is still a useful rule
This commit is contained in:
Gabriel Horner
2026-01-05 14:44:48 -05:00
parent 6ba05ad2cc
commit 5748905057
2 changed files with 93 additions and 1 deletions

View File

@@ -239,7 +239,8 @@
[?prop-e :block/tags :logseq.class/Property]
(ref-property-value-with-default ?b ?prop-e ?val)]
;; `property` is slow, don't use it for user-facing queries
;; `property` is slow so don't use it for user-facing queries.
;; However this is still useful as it is the only self-contained way to query properties
:property
'[(property ?b ?prop ?val)
[?prop-e :db/ident ?prop]

View File

@@ -111,6 +111,97 @@
(map (comp :block/title first))))
"property returns no result when page doesn't have property value"))
(testing "bindings with property value"
(is (= #{:user.property/foo :user.property/number-many :user.property/page-many :block/tags}
(->> (q-with-rules '[:find [?p ...]
:where (ref-property ?b ?p _) [?b :block/title "Page1"]]
@conn)
set))
"property can bind to property arg with unbound property value")
(is (= #{[:user.property/number-many 10]
[:user.property/number-many 5]
[:user.property/foo "bar"]
[:user.property/page-many "Page A"]
[:block/tags "Page"]}
(->> (q-with-rules '[:find ?p ?val
:where (ref-property ?b ?p ?val) [?b :block/title "Page1"]]
@conn)
set))
"property can bind to property and property value args")
(is (= #{"Page1"}
(->> (q-with-rules '[:find (pull ?b [:block/title])
:where
[?b :user.property/page-many ?pv]
(ref-property ?pv :user.property/foo "bar A")]
@conn)
(map (comp :block/title first))
set))
"property can be used multiple times to query a property value's property"))))
(deftest property-rule
(let [conn (db-test/create-conn-with-blocks
{:properties {:foo {:logseq.property/type :default}
:foo2 {:logseq.property/type :default}
:number-many {:logseq.property/type :number
:db/cardinality :many}
:page-many {:logseq.property/type :node
:db/cardinality :many}}
:pages-and-blocks
[{:page {:block/title "Page1"
:build/properties {:foo "bar" :number-many #{5 10} :page-many #{[:build/page {:block/title "Page A"}]}}}}
{:page {:block/title "Page A"
:build/properties {:foo "bar A"}}}]})]
(testing "cardinality :one property"
(is (= ["Page1"]
(->> (q-with-rules '[:find (pull ?b [:block/title]) :where (property ?b :user.property/foo "bar")]
@conn)
(map (comp :block/title first))))
"property returns result when page has property")
(is (= []
(->> (q-with-rules '[:find (pull ?b [:block/title]) :where (property ?b :user.property/foo "baz")]
@conn)
(map (comp :block/title first))))
"property returns no result when page doesn't have property value")
(is (= #{:user.property/foo}
(->> (q-with-rules '[:find [?p ...]
:where (property ?b ?p "bar") [?b :block/title "Page1"]]
@conn)
set))
"property can bind to property arg with bound property value"))
(testing "cardinality :many property"
(is (= ["Page1"]
(->> (q-with-rules '[:find (pull ?b [:block/title]) :where (property ?b :user.property/number-many 5)]
@conn)
(map (comp :block/title first))))
"property returns result when page has property")
(is (= []
(->> (q-with-rules '[:find (pull ?b [:block/title]) :where (property ?b :user.property/number-many 20)]
@conn)
(map (comp :block/title first))))
"property returns no result when page doesn't have property value")
(is (= #{:user.property/number-many}
(->> (q-with-rules '[:find [?p ...]
:where (property ?b ?p 5) [?b :block/title "Page1"]]
@conn)
set))
"property can bind to property arg with bound property value"))
;; NOTE: Querying a ref's name is different than before and requires more than just the rule
(testing ":ref property"
(is (= ["Page1"]
(->> (q-with-rules '[:find (pull ?b [:block/title])
:where (property ?b :user.property/page-many "Page A")]
@conn)
(map (comp :block/title first))))
"property returns result when page has property")
(is (= []
(->> (q-with-rules '[:find (pull ?b [:block/title])
:where [?b :user.property/page-many ?pv] [?pv :block/title "Page B"]]
@conn)
(map (comp :block/title first))))
"property returns no result when page doesn't have property value"))
(testing "bindings with property value"
(is (= #{:user.property/foo :user.property/number-many :user.property/page-many :block/tags}
(->> (q-with-rules '[:find [?p ...]