[JAVA] Le monde de Clara-Rules (4)

Dernière fois

Il existe une fonction de requête pour vérifier le contenu de la session clara-rules de l'extérieur, j'ai donc essayé de savoir comment l'utiliser.

Différence de rôle avec les règles

Exemple de code


(ns  clara-rules.join
  (:require [clara.rules :refer [defrule fire-rules insert
                                 mk-session query defquery]]))

(defrecord TypeA [attr-a join-key])

(defrecord TypeB [attr-b join-key])

;;Queries
(defquery find-all-As
  [];;parameters
  [?a <- TypeA];;Matching condition
  )

(defquery find-As-by-attr
  [:?value];; Parameter needs to be a keyword
  [?a <- TypeA (= attr-a ?value)])

(defquery find-join-key-of-As
  []
  [TypeA (= ?jk join-key)])

(defquery find-A-and-B-pair-by-join-key
  [:?value]
  [?a <- TypeA (= join-key ?value)]
  [?b <- TypeB (= join-key ?value)])

(def sess (-> (mk-session)
              (insert (->TypeA "a1" :foo)
                      (->TypeA "a2" :bar)
                      (->TypeA "a3" :baz)
                      (->TypeB "b1" :foo)
                      (->TypeB "b2" :bar)
                      (->TypeB "b3" :baz)
                      (->TypeB "b4" :qux))
              (fire-rules)))

(query sess find-all-As)
;; ({:?a {:attr-a "a1", :join-key :foo}}
;;  {:?a {:attr-a "a2", :join-key :bar}}
;;  {:?a {:attr-a "a3", :join-key :baz}})

(query sess find-As-by-attr :?value "a1")
;; => ({:?a #clara_rules.join.TypeA{:attr-a "a1", :join-key :foo}, :?value "a1"})

(query sess find-join-key-of-As)
;; => ({:?jk :foo} {:?jk :bar} {:?jk :baz})

(query sess find-A-and-B-pair-by-join-key :?value :foo)
;; => ({:?a {:attr-a "a1", :join-key :foo},
;;      :?value :foo,
;;      :?b {:attr-b "b1", :join-key :foo}})

Points d'intérêt dans le code ci-dessus

--defquery peut être écrit de la même manière que le côté gauche de defrule, sauf que les paramètres peuvent être reçus en externe.

Impressions

Dans les exemples précédents, la seule façon de voir le résultat était d'utiliser l'effet secondaire (println) sur le côté droit de la règle. Je suis heureux d'avoir pu résoudre l'une des questions que je me posais depuis que je voulais savoir s'il y avait un moyen de vérifier les résultats sans utiliser d'effets secondaires.

La prochaine fois

Recommended Posts

Le monde de Clara-Rules (2)
Le monde de Clara-Rules (4)
Le monde de Clara-Rules (1)
Le monde de Clara-Rules (3)
Le monde de Clara-Rules (5)
Jugement du calendrier
L'idée du tri rapide
L'idée de jQuery
À propos de la gestion de Null
Surveillance Docker-expliquant les bases des bases-
Le jeu d'instancier java.lang.Void
Valeur médiane de trois valeurs
L'illusion de l'orientation objet
À propos du comportement de ruby Hash # ==
[Java] Supprimer les éléments de la liste
Suite: La parabole de la POO (omise)
Comprendre le mécanisme de base de log4j2.xml
À propos des bases du développement Android
[Rails] Vérifiez le contenu de l'objet
Remplacez le contenu du fichier Jar
[Édition Java] Histoire de la sérialisation
Vérifiez la version de Cent OS
Explication de l'ordre des itinéraires ferroviaires
J'ai lu la source de ArrayList que j'ai lu
Remarque sur le chemin de request.getRequestDispatcher
J'ai lu la source d'Integer
Ceci et cela de JDK
Vérifier l'état de migration des rails
L'histoire de @ViewScoped dévore la mémoire
Filtrer les fluctuations des données brutes
Expliquer les colonnes de Spree :: Taxonomie
Un mémorandum du problème FizzBuzz
J'ai lu la source de Long
Expliquez la colonne de Spree :: Product
Diverses méthodes de la classe String
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
Obtenez l'ID de la numérotation automatique
J'ai lu la source de Short
J'ai lu la source de Byte
Ordre de traitement dans le programme
J'ai lu la source de String
L'origine des expressions Java lambda
[Ruby] Afficher le contenu des variables
Filtrer le résultat de BindingResult [Spring]
Débogage à distance du SDK Cognos
À propos du niveau de journalisation de java.util.logging.Logger
Obtenez l'accélération et l'orientation du système de coordonnées mondial sur Android
L'histoire de la rencontre avec l'annotation personnalisée Spring
Afficher le texte en haut de l'image
Essayez d'utiliser || au lieu de l'opérateur ternaire