Skip to content

Commit

Permalink
partial refactor of big reaction query op
Browse files Browse the repository at this point in the history
  • Loading branch information
milt committed Jan 23, 2024
1 parent c64ecea commit 668c0d4
Showing 1 changed file with 84 additions and 59 deletions.
143 changes: 84 additions & 59 deletions src/main/lrsql/ops/query/reaction.clj
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,85 @@
"ReactionTemplateError"
(ex-message ex))])))

(defn- check-reaction-query
[bk tx
{:keys [statement trigger-id statement-identity]
:as _opts}
{:keys [ruleset]
reaction-id :id
:as _reaction}]
(let [{:keys [template]} ruleset
stored (u/str->time (get statement "stored"))
[q-success ?q-result-or-error]
(reaction-query
bk tx ruleset reaction-id trigger-id stored
statement-identity)]
(if (false? q-success)
;; Query Error
[?q-result-or-error]
(for [ruleset-match ?q-result-or-error
:let
[[t-success ?t-result-or-error]
(generate-statement
reaction-id trigger-id ruleset-match template)]]
(if (false? t-success)
;; Template Error
?t-result-or-error
(let [new-statement ?t-result-or-error
valid? (s/valid? ::xs/statement
new-statement)]
(if-not valid?
;; Invalid Statement Error
(let [explanation
(s/explain-str ::xs/statement new-statement)]
(log/errorf
"Reaction Invalid Statement Error - Reaction ID: %s Spec Error: %s"
reaction-id
explanation)
(reaction-error-response
reaction-id
trigger-id
"ReactionInvalidStatementError"
(format "Reaction Invalid Statement Error - Spec Error: %s"
explanation)))
;; Success Response
{:reaction-id reaction-id
:trigger-id trigger-id
:statement (ru/add-reaction-metadata
new-statement
reaction-id
trigger-id)
;; Use a custom authority from the template or use
;; the trigger statement's authority
:authority (or (get new-statement "authority")
(get statement "authority"))})))))))

(defn- check-reaction [bk tx
{:keys [s-reactions
statement
trigger-id]
:as opts}
{:keys [ruleset]
reaction-id :id
:as reaction}]
;; Cycle Check
(if (contains? s-reactions reaction-id)
(do
(log/warnf
"Reaction %s found in statement %s history, ignoring!"
reaction-id trigger-id)
[]) ;; ignore
;; Identity check
(let [{:keys [identityPaths]} ruleset
statement-identity (ru/statement-identity
identityPaths statement)]
(if-not statement-identity
[] ;; ignore
(check-reaction-query
bk tx
(assoc opts :statement-identity statement-identity)
reaction)))))

(defn query-statement-reactions
"Given a statement ID, produce any reactions to that statement."
[bk tx {:keys [trigger-id]}]
Expand All @@ -101,63 +180,9 @@
(into
[]
(mapcat
(fn [{:keys [ruleset]
reaction-id :id}]
;; Cycle Check
(if (contains? s-reactions reaction-id)
(do
(log/warnf
"Reaction %s found in statement %s history, ignoring!"
reaction-id trigger-id)
[]) ;; ignore
(let [{:keys [identityPaths
template]} ruleset
statement-identity (ru/statement-identity
identityPaths statement)]
(if-not statement-identity
[] ;; ignore
(let [stored (u/str->time (get statement "stored"))
[q-success ?q-result-or-error]
(reaction-query
bk tx ruleset reaction-id trigger-id stored
statement-identity)]
(if (false? q-success)
;; Query Error
[?q-result-or-error]
(for [ruleset-match ?q-result-or-error
:let
[[t-success ?t-result-or-error]
(generate-statement
reaction-id trigger-id ruleset-match template)]]
(if (false? t-success)
;; Template Error
?t-result-or-error
(let [new-statement ?t-result-or-error
valid? (s/valid? ::xs/statement
new-statement)]
(if-not valid?
;; Invalid Statement Error
(let [explanation
(s/explain-str ::xs/statement new-statement)]
(log/errorf
"Reaction Invalid Statement Error - Reaction ID: %s Spec Error: %s"
reaction-id
explanation)
(reaction-error-response
reaction-id
trigger-id
"ReactionInvalidStatementError"
(format "Reaction Invalid Statement Error - Spec Error: %s"
explanation)))
;; Success Response
{:reaction-id reaction-id
:trigger-id trigger-id
:statement (ru/add-reaction-metadata
new-statement
reaction-id
trigger-id)
;; Use a custom authority from the template or use
;; the trigger statement's authority
:authority (or (get new-statement "authority")
(get statement "authority"))}))))))))))
(partial check-reaction
bk tx
{:statement statement
:trigger-id trigger-id
:s-reactions s-reactions})
active-reactions))}))))

0 comments on commit 668c0d4

Please sign in to comment.