|
96 | 96 | [(>= ?d ?start)] |
97 | 97 | [(<= ?d ?end)]] |
98 | 98 |
|
99 | | - :existing-property-value |
100 | | - '[;; non-ref value |
101 | | - [(existing-property-value ?b ?prop ?val) |
102 | | - [?prop-e :db/ident ?prop] |
103 | | - [(missing? $ ?prop-e :db/valueType)] |
104 | | - [?b ?prop ?val]] |
105 | | - ;; ref value |
106 | | - [(existing-property-value ?b ?prop ?val) |
107 | | - [?prop-e :db/ident ?prop] |
108 | | - [?prop-e :db/valueType :db.type/ref] |
109 | | - [?b ?prop ?pv] |
110 | | - (or [?pv :block/title ?val] |
111 | | - [?pv :logseq.property/value ?val])]] |
| 99 | + :ref->val |
| 100 | + '[[(ref->val ?pv ?val) |
| 101 | + [?pv :block/title ?val]] |
| 102 | + [(ref->val ?pv ?val) |
| 103 | + [?pv :logseq.property/value ?val]]] |
112 | 104 |
|
113 | 105 | :property-missing-value |
114 | 106 | '[(property-missing-value ?b ?prop-e ?default-p ?default-v) |
|
121 | 113 | [(= ?prop-v "N/A")] |
122 | 114 | [?prop-e ?default-p ?default-v]] |
123 | 115 |
|
124 | | - :property-scalar-default-value |
125 | | - '[(property-scalar-default-value ?b ?prop-e ?default-p ?val) |
126 | | - (property-missing-value ?b ?prop-e ?default-p ?default-v) |
127 | | - [(missing? $ ?prop-e :db/valueType)] |
128 | | - [?prop-e ?default-p ?val]] |
| 116 | + :scalar-property-value |
| 117 | + '[[(scalar-property-value ?b ?prop-e ?val) |
| 118 | + [?prop-e :db/ident ?prop] |
| 119 | + [?b ?prop ?val]]] |
129 | 120 |
|
130 | | - :property-default-value |
131 | | - '[(property-default-value ?b ?prop-e ?default-p ?val) |
132 | | - (property-missing-value ?b ?prop-e ?default-p ?default-v) |
133 | | - (or |
134 | | - [?default-v :block/title ?val] |
135 | | - [?default-v :logseq.property/value ?val])] |
| 121 | + :scalar-property-value-with-default |
| 122 | + '[[(scalar-property-value-with-default ?b ?prop-e ?val) |
| 123 | + (scalar-property-value ?b ?prop-e ?val)] |
| 124 | + |
| 125 | + [(scalar-property-value-with-default ?b ?prop-e ?val) |
| 126 | + (property-missing-value ?b ?prop-e :logseq.property/scalar-default-value ?val)]] |
136 | 127 |
|
137 | | - :property-value |
138 | | - '[[(property-value ?b ?prop-e ?val) |
| 128 | + :ref-property-value |
| 129 | + '[[(ref-property-value ?b ?prop-e ?val) |
139 | 130 | [?prop-e :db/ident ?prop] |
140 | | - (existing-property-value ?b ?prop ?val)] |
141 | | - [(property-value ?b ?prop-e ?val) |
142 | | - (or |
143 | | - (and |
144 | | - [(missing? $ ?prop-e :db/valueType)] |
145 | | - (property-scalar-default-value ?b ?prop-e :logseq.property/scalar-default-value ?val)) |
146 | | - (and |
147 | | - [?prop-e :db/valueType :db.type/ref] |
148 | | - (property-default-value ?b ?prop-e :logseq.property/default-value ?val)))]] |
| 131 | + [?b ?prop ?pv] |
| 132 | + (ref->val ?pv ?val)]] |
| 133 | + |
| 134 | + :ref-property-value-with-default |
| 135 | + '[[(ref-property-value-with-default ?b ?prop-e ?val) |
| 136 | + (ref-property-value ?b ?prop-e ?val)] |
| 137 | + [(ref-property-value-with-default ?b ?prop-e ?val) |
| 138 | + (property-missing-value ?b ?prop-e :logseq.property/default-value ?pv) |
| 139 | + (ref->val ?pv ?val)]] |
149 | 140 |
|
150 | 141 | :object-has-class-property |
151 | 142 | '[(object-has-class-property? ?b ?prop) |
|
190 | 181 | [(missing? $ ?prop-e :logseq.property/public?)] |
191 | 182 | [?prop-e :logseq.property/public? true])] |
192 | 183 |
|
193 | | - ;; Checks if a property has a value for any features that are not simple queries |
| 184 | + ;; Checks if a property has a value for simple queries. Supports default values |
| 185 | + :scalar-property |
| 186 | + '[(scalar-property ?b ?prop ?val) |
| 187 | + [?prop-e :db/ident ?prop] |
| 188 | + (scalar-property-value ?b ?prop-e ?val) |
| 189 | + (or |
| 190 | + [(missing? $ ?prop-e :logseq.property/public?)] |
| 191 | + [?prop-e :logseq.property/public? true])] |
| 192 | + |
| 193 | + :scalar-property-with-default |
| 194 | + '[(scalar-property-with-default ?b ?prop ?val) |
| 195 | + [?prop-e :db/ident ?prop] |
| 196 | + (scalar-property-value-with-default ?b ?prop-e ?val) |
| 197 | + (or |
| 198 | + [(missing? $ ?prop-e :logseq.property/public?)] |
| 199 | + [?prop-e :logseq.property/public? true])] |
| 200 | + |
| 201 | + :ref-property |
| 202 | + '[(ref-property ?b ?prop ?val) |
| 203 | + [?prop-e :db/ident ?prop] |
| 204 | + (ref-property-value ?b ?prop-e ?val) |
| 205 | + (or |
| 206 | + [(missing? $ ?prop-e :logseq.property/public?)] |
| 207 | + [?prop-e :logseq.property/public? true])] |
| 208 | + |
| 209 | + :ref-property-with-default |
| 210 | + '[(ref-property-with-default ?b ?prop ?val) |
| 211 | + [?prop-e :db/ident ?prop] |
| 212 | + (ref-property-value-with-default ?b ?prop-e ?val) |
| 213 | + (or |
| 214 | + [(missing? $ ?prop-e :logseq.property/public?)] |
| 215 | + [?prop-e :logseq.property/public? true])] |
| 216 | + |
| 217 | + ;; Same as ref-property/scalar-property except it returns public and private properties like :block/title |
| 218 | + :private-scalar-property |
| 219 | + '[(private-scalar-property ?b ?prop ?val) |
| 220 | + [?prop-e :db/ident ?prop] |
| 221 | + [?prop-e :block/tags :logseq.class/Property] |
| 222 | + (scalar-property-value ?b ?prop-e ?val)] |
| 223 | + |
| 224 | + :private-scalar-property-with-default |
| 225 | + '[(private-scalar-property-with-default ?b ?prop ?val) |
| 226 | + [?prop-e :db/ident ?prop] |
| 227 | + [?prop-e :block/tags :logseq.class/Property] |
| 228 | + (scalar-property-value-with-default ?b ?prop-e ?val)] |
| 229 | + |
| 230 | + :private-ref-property |
| 231 | + '[(private-ref-property ?b ?prop ?val) |
| 232 | + [?prop-e :db/ident ?prop] |
| 233 | + [?prop-e :block/tags :logseq.class/Property] |
| 234 | + (ref-property-value ?b ?prop-e ?val)] |
| 235 | + |
| 236 | + :private-ref-property-with-default |
| 237 | + '[(private-ref-property-with-default ?b ?prop ?val) |
| 238 | + [?prop-e :db/ident ?prop] |
| 239 | + [?prop-e :block/tags :logseq.class/Property] |
| 240 | + (ref-property-value-with-default ?b ?prop-e ?val)] |
| 241 | + |
| 242 | + ;; `property` is slow, don't use it for user-facing queries |
194 | 243 | :property |
195 | 244 | '[(property ?b ?prop ?val) |
196 | 245 | [?prop-e :db/ident ?prop] |
|
210 | 259 | (or [?pv :block/title ?val] |
211 | 260 | [?pv :logseq.property/value ?val])))] |
212 | 261 |
|
213 | | - ;; Checks if a property has a value for simple queries. Supports default values |
214 | | - :simple-query-property |
215 | | - '[(simple-query-property ?b ?prop ?val) |
216 | | - [?prop-e :db/ident ?prop] |
217 | | - [?prop-e :block/tags :logseq.class/Property] |
218 | | - (or |
219 | | - [(missing? $ ?prop-e :logseq.property/public?)] |
220 | | - [?prop-e :logseq.property/public? true]) |
221 | | - (property-value ?b ?prop-e ?val)] |
222 | | - |
223 | | - ;; Same as property except it returns public and private properties like :block/title |
224 | | - :private-simple-query-property |
225 | | - '[(private-simple-query-property ?b ?prop ?val) |
226 | | - [?prop-e :db/ident ?prop] |
227 | | - [?prop-e :block/tags :logseq.class/Property] |
228 | | - (property-value ?b ?prop-e ?val)] |
229 | | - |
230 | 262 | :tags |
231 | 263 | '[(tags ?b ?tags) |
232 | 264 | [?b :block/tags ?tag] |
|
235 | 267 |
|
236 | 268 | :task |
237 | 269 | '[(task ?b ?statuses) |
238 | | - ;; and needed to avoid binding error |
239 | | - (and (simple-query-property ?b :logseq.property/status ?val) |
240 | | - [(contains? ?statuses ?val)])] |
| 270 | + (ref-property-with-default ?b :logseq.property/status ?val) |
| 271 | + [(contains? ?statuses ?val)]] |
241 | 272 |
|
242 | 273 | :priority |
243 | 274 | '[(priority ?b ?priorities) |
244 | | - ;; and needed to avoid binding error |
245 | | - (and (simple-query-property ?b :logseq.property/priority ?priority) |
246 | | - [(contains? ?priorities ?priority)])]})) |
| 275 | + (ref-property-with-default ?b :logseq.property/priority ?priority) |
| 276 | + [(contains? ?priorities ?priority)]]})) |
247 | 277 |
|
248 | 278 | (def rules-dependencies |
249 | 279 | "For db graphs, a map of rule names and the rules they depend on. If this map |
250 | 280 | becomes long or brittle, we could do scan rules for their deps with something |
251 | 281 | like find-rules-in-where" |
252 | 282 | {:has-ref #{:parent} |
253 | 283 | :page-ref #{:has-ref} |
254 | | - :task #{:simple-query-property} |
255 | | - :priority #{:simple-query-property} |
256 | | - :property-missing-value #{:object-has-class-property} |
| 284 | + |
| 285 | + ;; simple query helpers |
| 286 | + :task #{:ref-property-with-default} |
| 287 | + :priority #{:ref-property-with-default} |
257 | 288 | :has-property-or-object-property #{:object-has-class-property} |
258 | 289 | :object-has-class-property #{:class-extends} |
259 | 290 | :has-simple-query-property #{:has-property-or-object-property} |
260 | 291 | :has-private-simple-query-property #{:has-property-or-object-property} |
261 | | - :property-default-value #{:existing-property-value :property-missing-value} |
262 | | - :property-scalar-default-value #{:existing-property-value :property-missing-value} |
263 | | - :property-value #{:property-default-value :property-scalar-default-value} |
264 | | - :simple-query-property #{:property-value} |
265 | | - :private-simple-query-property #{:property-value}}) |
| 292 | + :property-missing-value #{:object-has-class-property} |
| 293 | + :ref-property-value #{:ref->val} |
| 294 | + :scalar-property #{:scalar-property-value} |
| 295 | + :scalar-property-with-default #{:scalar-property-value-with-default} |
| 296 | + :scalar-property-value-with-default #{:scalar-property-value :property-missing-value} |
| 297 | + :ref-property #{:ref-property-value} |
| 298 | + :ref-property-value-with-default #{:ref-property-value :property-missing-value} |
| 299 | + :ref-property-with-default #{:ref-property-value-with-default} |
| 300 | + :private-scalar-property #{:scalar-property-value} |
| 301 | + :private-scalar-property-with-default #{:scalar-property-value-with-default} |
| 302 | + :private-ref-property #{:ref-property-value} |
| 303 | + :private-ref-property-with-default #{:ref-property-value-with-default}}) |
266 | 304 |
|
267 | 305 | (defn- get-full-deps |
268 | 306 | [deps rules-deps] |
|
0 commit comments