Last active
October 6, 2024 10:54
-
-
Save dacr/39a769215d16359be1bbe303c51b166f to your computer and use it in GitHub Desktop.
Drools advanced understanding rules knowledge base / published by https://github.com/dacr/code-examples-manager #21020062-7fe7-49e3-bc21-1c3bd2599ebb/4ec41b10cb40c8a1b589c7e9b9ad82afbc5330
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// summary : Drools advanced understanding rules knowledge base | |
// keywords : scala, drools, mvel, scalatest, ai, knowledgebase, @testable | |
// publish : gist | |
// authors : David Crosson | |
// license : Apache NON-AI License Version 2.0 (https://raw.githubusercontent.com/non-ai-licenses/non-ai-licenses/main/NON-AI-APACHE2) | |
// id : 21020062-7fe7-49e3-bc21-1c3bd2599ebb | |
// execution : scala ammonite script (http://ammonite.io/) - run as follow 'amm scriptname.sc' | |
// created-on : 2019-10-14T10:19:41+02:00 | |
// managed-by : https://github.com/dacr/code-examples-manager | |
// run-with : scala-cli $file | |
// --------------------- | |
//> using scala "3.5.1" | |
//> using dep "fr.janalyse::drools-scripting:1.2.0" | |
//> using dep "org.scalatest::scalatest:3.2.19" | |
// --------------------- | |
import fr.janalyse.droolscripting.*, org.scalatest.*, flatspec.*, matchers.*, OptionValues.* | |
import scala.jdk.CollectionConverters.* | |
object AdvancedUnderstandingRules extends AnyFlatSpec with should.Matchers { | |
override def suiteName: String = "AdvancedUnderstandingRules" | |
def checkOK(drl:String):Unit = { | |
val engine = DroolsEngine(drl, DroolsEngineConfig.configWithIdentity) | |
engine.fireAllRules() | |
engine.strings shouldBe List("OK") | |
} | |
def checkAllOf(that:String*)(drl:String):Unit = { | |
val engine = DroolsEngine(drl, DroolsEngineConfig.configWithIdentity) | |
engine.fireAllRules() | |
engine.strings.sorted shouldBe that.toList.sorted | |
} | |
def checkAllOfWithEquality(that:String*)(drl:String):Unit = { | |
val engine = DroolsEngine(drl, DroolsEngineConfig.configWithEquality) | |
engine.fireAllRules() | |
engine.strings.sorted shouldBe that.toList.sorted | |
} | |
val config = DroolsEngineConfig.configWithEquality | |
// ====================================================================== | |
"DROOLS" should "support meta data - #AEX0" in { | |
val drl = | |
"""package test //#AEX0 | |
|declare A @persistable | |
| txt:String @validateWith(\w+-\d+) | |
|end | |
|rule "that" | |
| @risk(0) | |
| @category(truc) | |
|when then | |
| insert(new A("answer-42")); | |
|end | |
|""".stripMargin | |
val engine = DroolsEngine(drl, DroolsEngineConfig.configWithEquality) | |
// list all rules | |
val rules = engine.session.getKieBase.getKiePackage("test").getRules | |
//val rule = rules.asScala.headOption.value | |
val rule = engine.session.getKieBase.getRule("test", "that") | |
// rules meta-data | |
rule.getMetaData.get("category") shouldBe "truc" | |
rule.getMetaData.get("risk").asInstanceOf[Int] shouldBe 0 | |
// facts meta-data | |
val factType = engine.session.getKieBase.getFactType("test", "A") | |
factType.getMetaData.containsKey("persistable") shouldBe true | |
val txtRE = factType.getField("txt").getMetaData.get("validateWith") | |
txtRE shouldBe """\w+-\d+""" | |
val newAValue = "truc-32" | |
if (txtRE.toString.r.findFirstMatchIn(newAValue).isDefined ) { // just to check if every was fine with KB embedded RE | |
val newA = factType.newInstance() | |
factType.set(newA, "txt", newAValue) | |
engine.insert(newA) | |
} else fail() | |
} | |
// ====================================================================== | |
it should "support agenda group control - #AEX1" in | |
checkAllOf("from first agenda", "from default agenda") { | |
info("""The default Agenda Group is "MAIN".""") | |
info("""In this example B2 is never executed as second didn't get the focus""") | |
"""package test //#AEX1 | |
|declare A txt:String end | |
|rule "init" when then | |
| insert(new A("init")); | |
| kcontext.getKnowledgeRuntime().getAgenda().getAgendaGroup("first").setFocus(); | |
|end | |
|//----------------- | |
|rule "B0" when A() then insert("from default agenda"); end | |
|rule "B1" agenda-group "first" when A() then insert("from first agenda"); end | |
|rule "B2" agenda-group "second" when A() then insert("from second agenda"); end | |
|""".stripMargin | |
} | |
// ====================================================================== | |
it should "support agenda group stacking - #AEX2" in { | |
val drl = | |
"""package test //#AEX2 | |
|declare A txt:String end | |
|//----------------- | |
|rule "B0" when A() then insert("from MAIN"); end | |
|rule "B1" agenda-group "first" when A() then insert("from first"); end | |
|rule "B2-1" agenda-group "second" when A() then insert("from second1"); end | |
|rule "B2-2" agenda-group "second" when A() then insert("from second2"); end | |
|rule "B3" agenda-group "somegroup" when A() then insert("from an other agenda"); end | |
|""".stripMargin | |
val engine = DroolsEngine(drl, DroolsEngineConfig.configWithEquality) | |
info("agenda group setFocus are stacked, last focused, first executed") | |
info("All fireable rule on a given agenda-group are fired up before the group is unstacked") | |
engine.session.getAgenda().getAgendaGroup("second").setFocus() | |
engine.session.getAgenda().getAgendaGroup("first").setFocus() | |
engine.insertJson("""{"txt":"0"}""", "test.A") | |
engine.fireAllRules() | |
engine.strings.sorted shouldBe List("from MAIN", "from first", "from second1", "from second2").sorted | |
} | |
// ====================================================================== | |
it should "support rule flow - #AEX3" ignore { // To be continued | |
val drl = | |
"""package test //#AEX3 | |
| | |
|declare CheckOrder id:String end | |
|declare ProcessOrder id:String end | |
|declare UpdateOrder id:String end | |
| | |
|rule "r1" | |
| ruleflow-group "group1" | |
|when | |
| CheckOrder($id:id) | |
|then | |
| insertLogical("OK"); | |
|end | |
| | |
|""".stripMargin | |
val engine = DroolsEngine(drl, DroolsEngineConfig.configWithEquality) | |
engine.session.startProcess("group1") | |
} | |
} | |
AdvancedUnderstandingRules.execute() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment