|
@@ -96,19 +96,11 @@
|
|
|
[(>= ?d ?start)]
|
|
[(>= ?d ?start)]
|
|
|
[(<= ?d ?end)]]
|
|
[(<= ?d ?end)]]
|
|
|
|
|
|
|
|
- :existing-property-value
|
|
|
|
|
- '[;; non-ref value
|
|
|
|
|
- [(existing-property-value ?b ?prop ?val)
|
|
|
|
|
- [?prop-e :db/ident ?prop]
|
|
|
|
|
- [(missing? $ ?prop-e :db/valueType)]
|
|
|
|
|
- [?b ?prop ?val]]
|
|
|
|
|
- ;; ref value
|
|
|
|
|
- [(existing-property-value ?b ?prop ?val)
|
|
|
|
|
- [?prop-e :db/ident ?prop]
|
|
|
|
|
- [?prop-e :db/valueType :db.type/ref]
|
|
|
|
|
- [?b ?prop ?pv]
|
|
|
|
|
- (or [?pv :block/title ?val]
|
|
|
|
|
- [?pv :logseq.property/value ?val])]]
|
|
|
|
|
|
|
+ :ref->val
|
|
|
|
|
+ '[[(ref->val ?pv ?val)
|
|
|
|
|
+ [?pv :block/title ?val]]
|
|
|
|
|
+ [(ref->val ?pv ?val)
|
|
|
|
|
+ [?pv :logseq.property/value ?val]]]
|
|
|
|
|
|
|
|
:property-missing-value
|
|
:property-missing-value
|
|
|
'[(property-missing-value ?b ?prop-e ?default-p ?default-v)
|
|
'[(property-missing-value ?b ?prop-e ?default-p ?default-v)
|
|
@@ -121,31 +113,30 @@
|
|
|
[(= ?prop-v "N/A")]
|
|
[(= ?prop-v "N/A")]
|
|
|
[?prop-e ?default-p ?default-v]]
|
|
[?prop-e ?default-p ?default-v]]
|
|
|
|
|
|
|
|
- :property-scalar-default-value
|
|
|
|
|
- '[(property-scalar-default-value ?b ?prop-e ?default-p ?val)
|
|
|
|
|
- (property-missing-value ?b ?prop-e ?default-p ?default-v)
|
|
|
|
|
- [(missing? $ ?prop-e :db/valueType)]
|
|
|
|
|
- [?prop-e ?default-p ?val]]
|
|
|
|
|
|
|
+ :scalar-property-value
|
|
|
|
|
+ '[[(scalar-property-value ?b ?prop-e ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ [?b ?prop ?val]]]
|
|
|
|
|
|
|
|
- :property-default-value
|
|
|
|
|
- '[(property-default-value ?b ?prop-e ?default-p ?val)
|
|
|
|
|
- (property-missing-value ?b ?prop-e ?default-p ?default-v)
|
|
|
|
|
- (or
|
|
|
|
|
- [?default-v :block/title ?val]
|
|
|
|
|
- [?default-v :logseq.property/value ?val])]
|
|
|
|
|
|
|
+ :scalar-property-value-with-default
|
|
|
|
|
+ '[[(scalar-property-value-with-default ?b ?prop-e ?val)
|
|
|
|
|
+ (scalar-property-value ?b ?prop-e ?val)]
|
|
|
|
|
+
|
|
|
|
|
+ [(scalar-property-value-with-default ?b ?prop-e ?val)
|
|
|
|
|
+ (property-missing-value ?b ?prop-e :logseq.property/scalar-default-value ?val)]]
|
|
|
|
|
|
|
|
- :property-value
|
|
|
|
|
- '[[(property-value ?b ?prop-e ?val)
|
|
|
|
|
|
|
+ :ref-property-value
|
|
|
|
|
+ '[[(ref-property-value ?b ?prop-e ?val)
|
|
|
[?prop-e :db/ident ?prop]
|
|
[?prop-e :db/ident ?prop]
|
|
|
- (existing-property-value ?b ?prop ?val)]
|
|
|
|
|
- [(property-value ?b ?prop-e ?val)
|
|
|
|
|
- (or
|
|
|
|
|
- (and
|
|
|
|
|
- [(missing? $ ?prop-e :db/valueType)]
|
|
|
|
|
- (property-scalar-default-value ?b ?prop-e :logseq.property/scalar-default-value ?val))
|
|
|
|
|
- (and
|
|
|
|
|
- [?prop-e :db/valueType :db.type/ref]
|
|
|
|
|
- (property-default-value ?b ?prop-e :logseq.property/default-value ?val)))]]
|
|
|
|
|
|
|
+ [?b ?prop ?pv]
|
|
|
|
|
+ (ref->val ?pv ?val)]]
|
|
|
|
|
+
|
|
|
|
|
+ :ref-property-value-with-default
|
|
|
|
|
+ '[[(ref-property-value-with-default ?b ?prop-e ?val)
|
|
|
|
|
+ (ref-property-value ?b ?prop-e ?val)]
|
|
|
|
|
+ [(ref-property-value-with-default ?b ?prop-e ?val)
|
|
|
|
|
+ (property-missing-value ?b ?prop-e :logseq.property/default-value ?pv)
|
|
|
|
|
+ (ref->val ?pv ?val)]]
|
|
|
|
|
|
|
|
:object-has-class-property
|
|
:object-has-class-property
|
|
|
'[(object-has-class-property? ?b ?prop)
|
|
'[(object-has-class-property? ?b ?prop)
|
|
@@ -190,7 +181,65 @@
|
|
|
[(missing? $ ?prop-e :logseq.property/public?)]
|
|
[(missing? $ ?prop-e :logseq.property/public?)]
|
|
|
[?prop-e :logseq.property/public? true])]
|
|
[?prop-e :logseq.property/public? true])]
|
|
|
|
|
|
|
|
- ;; Checks if a property has a value for any features that are not simple queries
|
|
|
|
|
|
|
+ ;; Checks if a property has a value for simple queries. Supports default values
|
|
|
|
|
+ :scalar-property
|
|
|
|
|
+ '[(scalar-property ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ (scalar-property-value ?b ?prop-e ?val)
|
|
|
|
|
+ (or
|
|
|
|
|
+ [(missing? $ ?prop-e :logseq.property/public?)]
|
|
|
|
|
+ [?prop-e :logseq.property/public? true])]
|
|
|
|
|
+
|
|
|
|
|
+ :scalar-property-with-default
|
|
|
|
|
+ '[(scalar-property-with-default ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ (scalar-property-value-with-default ?b ?prop-e ?val)
|
|
|
|
|
+ (or
|
|
|
|
|
+ [(missing? $ ?prop-e :logseq.property/public?)]
|
|
|
|
|
+ [?prop-e :logseq.property/public? true])]
|
|
|
|
|
+
|
|
|
|
|
+ :ref-property
|
|
|
|
|
+ '[(ref-property ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ (ref-property-value ?b ?prop-e ?val)
|
|
|
|
|
+ (or
|
|
|
|
|
+ [(missing? $ ?prop-e :logseq.property/public?)]
|
|
|
|
|
+ [?prop-e :logseq.property/public? true])]
|
|
|
|
|
+
|
|
|
|
|
+ :ref-property-with-default
|
|
|
|
|
+ '[(ref-property-with-default ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ (ref-property-value-with-default ?b ?prop-e ?val)
|
|
|
|
|
+ (or
|
|
|
|
|
+ [(missing? $ ?prop-e :logseq.property/public?)]
|
|
|
|
|
+ [?prop-e :logseq.property/public? true])]
|
|
|
|
|
+
|
|
|
|
|
+ ;; Same as ref-property/scalar-property except it returns public and private properties like :block/title
|
|
|
|
|
+ :private-scalar-property
|
|
|
|
|
+ '[(private-scalar-property ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ [?prop-e :block/tags :logseq.class/Property]
|
|
|
|
|
+ (scalar-property-value ?b ?prop-e ?val)]
|
|
|
|
|
+
|
|
|
|
|
+ :private-scalar-property-with-default
|
|
|
|
|
+ '[(private-scalar-property-with-default ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ [?prop-e :block/tags :logseq.class/Property]
|
|
|
|
|
+ (scalar-property-value-with-default ?b ?prop-e ?val)]
|
|
|
|
|
+
|
|
|
|
|
+ :private-ref-property
|
|
|
|
|
+ '[(private-ref-property ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ [?prop-e :block/tags :logseq.class/Property]
|
|
|
|
|
+ (ref-property-value ?b ?prop-e ?val)]
|
|
|
|
|
+
|
|
|
|
|
+ :private-ref-property-with-default
|
|
|
|
|
+ '[(private-ref-property-with-default ?b ?prop ?val)
|
|
|
|
|
+ [?prop-e :db/ident ?prop]
|
|
|
|
|
+ [?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
|
|
:property
|
|
|
'[(property ?b ?prop ?val)
|
|
'[(property ?b ?prop ?val)
|
|
|
[?prop-e :db/ident ?prop]
|
|
[?prop-e :db/ident ?prop]
|
|
@@ -210,23 +259,6 @@
|
|
|
(or [?pv :block/title ?val]
|
|
(or [?pv :block/title ?val]
|
|
|
[?pv :logseq.property/value ?val])))]
|
|
[?pv :logseq.property/value ?val])))]
|
|
|
|
|
|
|
|
- ;; Checks if a property has a value for simple queries. Supports default values
|
|
|
|
|
- :simple-query-property
|
|
|
|
|
- '[(simple-query-property ?b ?prop ?val)
|
|
|
|
|
- [?prop-e :db/ident ?prop]
|
|
|
|
|
- [?prop-e :block/tags :logseq.class/Property]
|
|
|
|
|
- (or
|
|
|
|
|
- [(missing? $ ?prop-e :logseq.property/public?)]
|
|
|
|
|
- [?prop-e :logseq.property/public? true])
|
|
|
|
|
- (property-value ?b ?prop-e ?val)]
|
|
|
|
|
-
|
|
|
|
|
- ;; Same as property except it returns public and private properties like :block/title
|
|
|
|
|
- :private-simple-query-property
|
|
|
|
|
- '[(private-simple-query-property ?b ?prop ?val)
|
|
|
|
|
- [?prop-e :db/ident ?prop]
|
|
|
|
|
- [?prop-e :block/tags :logseq.class/Property]
|
|
|
|
|
- (property-value ?b ?prop-e ?val)]
|
|
|
|
|
-
|
|
|
|
|
:tags
|
|
:tags
|
|
|
'[(tags ?b ?tags)
|
|
'[(tags ?b ?tags)
|
|
|
[?b :block/tags ?tag]
|
|
[?b :block/tags ?tag]
|
|
@@ -235,15 +267,13 @@
|
|
|
|
|
|
|
|
:task
|
|
:task
|
|
|
'[(task ?b ?statuses)
|
|
'[(task ?b ?statuses)
|
|
|
- ;; and needed to avoid binding error
|
|
|
|
|
- (and (simple-query-property ?b :logseq.property/status ?val)
|
|
|
|
|
- [(contains? ?statuses ?val)])]
|
|
|
|
|
|
|
+ (ref-property-with-default ?b :logseq.property/status ?val)
|
|
|
|
|
+ [(contains? ?statuses ?val)]]
|
|
|
|
|
|
|
|
:priority
|
|
:priority
|
|
|
'[(priority ?b ?priorities)
|
|
'[(priority ?b ?priorities)
|
|
|
- ;; and needed to avoid binding error
|
|
|
|
|
- (and (simple-query-property ?b :logseq.property/priority ?priority)
|
|
|
|
|
- [(contains? ?priorities ?priority)])]}))
|
|
|
|
|
|
|
+ (ref-property-with-default ?b :logseq.property/priority ?priority)
|
|
|
|
|
+ [(contains? ?priorities ?priority)]]}))
|
|
|
|
|
|
|
|
(def rules-dependencies
|
|
(def rules-dependencies
|
|
|
"For db graphs, a map of rule names and the rules they depend on. If this map
|
|
"For db graphs, a map of rule names and the rules they depend on. If this map
|
|
@@ -251,18 +281,26 @@
|
|
|
like find-rules-in-where"
|
|
like find-rules-in-where"
|
|
|
{:has-ref #{:parent}
|
|
{:has-ref #{:parent}
|
|
|
:page-ref #{:has-ref}
|
|
:page-ref #{:has-ref}
|
|
|
- :task #{:simple-query-property}
|
|
|
|
|
- :priority #{:simple-query-property}
|
|
|
|
|
- :property-missing-value #{:object-has-class-property}
|
|
|
|
|
|
|
+
|
|
|
|
|
+ ;; simple query helpers
|
|
|
|
|
+ :task #{:ref-property-with-default}
|
|
|
|
|
+ :priority #{:ref-property-with-default}
|
|
|
:has-property-or-object-property #{:object-has-class-property}
|
|
:has-property-or-object-property #{:object-has-class-property}
|
|
|
:object-has-class-property #{:class-extends}
|
|
:object-has-class-property #{:class-extends}
|
|
|
:has-simple-query-property #{:has-property-or-object-property}
|
|
:has-simple-query-property #{:has-property-or-object-property}
|
|
|
:has-private-simple-query-property #{:has-property-or-object-property}
|
|
:has-private-simple-query-property #{:has-property-or-object-property}
|
|
|
- :property-default-value #{:existing-property-value :property-missing-value}
|
|
|
|
|
- :property-scalar-default-value #{:existing-property-value :property-missing-value}
|
|
|
|
|
- :property-value #{:property-default-value :property-scalar-default-value}
|
|
|
|
|
- :simple-query-property #{:property-value}
|
|
|
|
|
- :private-simple-query-property #{:property-value}})
|
|
|
|
|
|
|
+ :property-missing-value #{:object-has-class-property}
|
|
|
|
|
+ :ref-property-value #{:ref->val}
|
|
|
|
|
+ :scalar-property #{:scalar-property-value}
|
|
|
|
|
+ :scalar-property-with-default #{:scalar-property-value-with-default}
|
|
|
|
|
+ :scalar-property-value-with-default #{:scalar-property-value :property-missing-value}
|
|
|
|
|
+ :ref-property #{:ref-property-value}
|
|
|
|
|
+ :ref-property-value-with-default #{:ref-property-value :property-missing-value}
|
|
|
|
|
+ :ref-property-with-default #{:ref-property-value-with-default}
|
|
|
|
|
+ :private-scalar-property #{:scalar-property-value}
|
|
|
|
|
+ :private-scalar-property-with-default #{:scalar-property-value-with-default}
|
|
|
|
|
+ :private-ref-property #{:ref-property-value}
|
|
|
|
|
+ :private-ref-property-with-default #{:ref-property-value-with-default}})
|
|
|
|
|
|
|
|
(defn- get-full-deps
|
|
(defn- get-full-deps
|
|
|
[deps rules-deps]
|
|
[deps rules-deps]
|