This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-10-26
Channels
- # announcements (7)
- # babashka (6)
- # beginners (41)
- # clara (27)
- # clerk (2)
- # cljs-dev (6)
- # clojure (121)
- # clojure-europe (31)
- # clojure-nl (2)
- # clojure-norway (98)
- # clojure-uk (12)
- # clojuredesign-podcast (7)
- # conjure (5)
- # cursive (22)
- # holy-lambda (22)
- # hoplon (9)
- # hyperfiddle (19)
- # leiningen (9)
- # malli (4)
- # music (1)
- # nbb (6)
- # off-topic (10)
- # podcasts-discuss (1)
- # polylith (4)
- # re-frame (2)
- # reitit (2)
- # releases (1)
- # sci (1)
- # shadow-cljs (59)
- # sql (9)
- # vim (41)
- # xtdb (23)
The rule works, but the query does not, how do I get the same thing to work from the defquery
?
(r/defrule rules-fired
"Rule that gets the rules fired."
[?rules <- (acc/all) :from [RuleFired]]
=>
(prn "RULES" (->> ?rules (mapv :rule) (mapv :name))))
(r/defquery get-rules-fired
"Query to retrieve the fired rules."
[]
[?rules <- (acc/all) :from [RuleFired]])
This makes it work, but it seems wrong to me. I don’t think I should need to specify a condition. (some? rule)
[?rules <- (acc/all) :from [RuleFired (some? rule)]]
@UH13Y2FSA how were you trying it?
(-> (r/mk-session :fact-type-fn #(or (:type %) (type %)))
(r/insert (assoc example-context-map :type :context))
(r/fire-rules))
rules-fired (-> session (r/query get-rules-fired) first)]
I guess the main thing here is, I want to make sure you are doing r/fire-rules
before doing any r/query
Yes, the only change I’m making is adding/removing (some? rule)
and it works/doesn’t work.
Remember the session is immutable too, so you have to bind to the results of r/fire-rules
.
(let [session (-> (r/mk-session :fact-type-fn #(or (:type %) (type %)))
(r/insert (assoc example-context-map :type :context))
(r/fire-rules))
rules-fired (-> session (r/query get-rules-fired) first)]
...)
(let [session
(-> (r/mk-session :fact-type-fn #(or (:type %) (type %)))
(r/insert (assoc example-context-map :type :context))
(r/fire-rules))
rules-fired (-> session (r/query get-rules-fired) first)]
(clojure.pprint/pprint (ir/inspect session))
(prn "Fired Rules: " (mapv #(get-in % [:rule :name]) (:?rules rules-fired))))
Yes, but when you do not do r/fire-rules
there could be some amount of unevaluated query behavior - so I’m just ruling out that that is the difference when you add a constraint.
I don’t see the problem otherwise. I’m curious if this can be trivially recreated with a mini example rules or if it only works this way for you.
If not, you could do something with (acc/all)
since it always causes the RHS to fire - just with empty coll.
(require '[clara.rules :as r])
(require '[clara.rules.accumulators :as acc])
(defrecord RuleFired [])
(defrecord RuleFiredRes [])
(r/defrule rules-fired
"Rule that gets the rules fired."
[?rules <- (acc/all) :from [RuleFired]]
=>
(prn "Fired!")
(r/insert! (->RuleFiredRes)))
(r/defquery get-rules-fired
"Query to retrieve the fired rules."
[]
[?rules <- (acc/all) :from [RuleFired]])
(let [session (-> (r/mk-session)
(r/insert (->RuleFired))
(r/fire-rules))]
(r/query session get-rules-fired))
;; "Fired!"
;;= ({:?rules [#user.RuleFired{}]})
This works for me. So if there are issues, perhaps the :fact-type-fn
is to blameStill works if I add that:
(let [session (-> (r/mk-session :fact-type-fn #(or (:type %) (type %)))
(r/insert (->RuleFired))
(r/fire-rules))]
(r/query session get-rules-fired))
;; "Fired!"
;;= ({:?rules [#user.RuleFired{}]})
hmm, wonder if i have some repl issue going on. i did see it just work without the condition.
(defrecord RuleFired [rule])
(r/defquery get-rules-fired
"Query to retrieve the fired rules."
[]
[?rules <- (acc/all) :from [RuleFired (some? rule)]])
(r/defrule this-rule-is-on-fire
=> (r/insert! (->RuleFired (meta (resolve 'this-rule-is-on-fire)))))
(-> (r/mk-session [this-rule-is-on-fire get-rules-fired])
(r/fire-rules)
(r/query get-rules-fired)
(prn "<---"))