わかりました、あなたの説明に基づいて試してみる準備ができました。これがあなたが探していたものではない場合は、より適切なソリューションに向けて取り組むことができます. また、地理の私の限られたコマンドを許してください;)。
まず、データ モデルを定義します。場所をモデル化する次のファクト クラスがあります。
package de.jannik.locationrules;
public class VisitedLocation {
private String name;
public VisitedLocation(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
次に、ユーザーをモデル化するクラスがあります。これは、呼び出したいメソッドにのみ必要です。
package de.jannik.locationrules;
public class User {
public void handleVisitedContinent(String continentName) {
System.out.println("User has been to " + continentName + ".");
}
}
これで、これらのモデル クラスの観点からビジネス要件を説明できます。
package de.jannik.drltest
import de.jannik.locationrules.VisitedLocation;
import de.jannik.locationrules.User;
global User user;
rule "User has been to Europe"
when
exists VisitedLocation(name in ("Berlin", "Paris", "London", "Rome"))
then
user.handleVisitedContinent("Europe");
end
rule "User has been to Australia"
when
exists VisitedLocation(name in ("Melbourne", "Sydney"))
then
user.handleVisitedContinent("Australia");
end
rule "User has been to America"
when
exists VisitedLocation(name in ("San Francisco", "New York", "Buenos Aires"))
then
user.handleVisitedContinent("America");
end
ここでは、作業メモリに存在する sUser.handleVisitedContent(String)
に応じて異なる引数でメソッドを呼び出すいくつかのルールを定式化しました。VisitedLocation
ファクトではユーザーが明示的にモデル化されていないことに注意してください。代わりに、ユーザーの変更が必要になるたびに新しいセッションが作成されると想定しています。ビジネス要件とパフォーマンスの考慮事項に応じて、これを変更して、すべてのユーザーに対して単一のセッションのみを使用することができます。
定義したルールを実行するために使用するコードは次のとおりです。
...
@Test
public void testLocationRules() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("locations.drl"), ResourceType.DRL);
if (kbuilder.hasErrors()) {
KnowledgeBuilderErrors errors = kbuilder.getErrors();
System.out.println(errors.toString());
throw new RuntimeException(errors.toString());
}
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(kbuilder.getKnowledgePackages());
StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession();
session.setGlobal("user", new User());
List<VisitedLocation> facts = new ArrayList<VisitedLocation>();
facts.add(new VisitedLocation("Berlin"));
facts.add(new VisitedLocation("Paris"));
facts.add(new VisitedLocation("San Francisco"));
facts.add(new VisitedLocation("Saigon"));
session.execute(facts);
}
...
これにより、次の出力が得られます。
User has been to America.
User has been to Europe.
これがあなたが探していたものではない場合、またはさらに明確にする必要がある場合はお知らせください。また、Drools の概念の詳細については、 Drools Expert User Guideを参照してください。