在 drools 中插入标志之前检查标志值
Checking flag value before inserting flag in drools
我制定了一条规则,它在会话中插入了一个问题。如果问题为真,则插入一个 FLAG,如果问题不为真,则删除问题并且不更新标志。在会话中插入问题之前,我需要检查标志的值。我已经尝试了几种方法来做到这一点,但没有得到流口水的东西来做到这一点。这是我的规则:
正在插入问题规则
rule "Threat: ATTACK_OTHER_USERS; insert question"
agenda-group "evaluate attack category"
dialect "mvel"
when
Threat(this == Threat.ATTACK_OTHER_USERS)
// $FLAGS(this == FLAGS.PUBLIC_READABLE) // i need the check here, the existing doesn't work
then
insertLogical(QRiskFactor.QRF1_S4_PUBLIC_READABLE);
end
问题正确
rule "Threat: Public Readable QRF_1.4 [true]"
agenda-group "evaluate attack category"
dialect "mvel"
when
$q1: QRiskFactor(this == QRiskFactor.QRF1_S4_PUBLIC_READABLE)
Application($rf : riskFactors[QRiskFactor.QRF1_S4_PUBLIC_READABLE.value], $rf!.factor == "true")
then
delete($q1);
insert(FLAGS.PUBLIC_READABLE);
end
问题是假的
rule "Threat: Public Readable -- QRF_1.4 [not true]"
agenda-group "evaluate attack category"
dialect "mvel"
when
$q1: QRiskFactor(this == QRiskFactor.QRF1_S4_PUBLIC_READABLE)
Application($rf : riskFactors[QRiskFactor.QRF1_S4_PUBLIC_READABLE.value], $rf!.factor != "true")
then
delete($q1);
end
您需要检查工作记忆中是否存在您的特定标志。你的规则中注释掉的语法几乎是正确的,除了你似乎有一个无关的 $
present.
由于您没有分享 FLAGS
是什么,因此很难具体回答您的问题。根据您制定 insert
语句的方式,我将假设它是一个像这样的枚举:
public enum FLAGS {
PUBLIC_READABLE,
// possibly other values
}
因此,如果您想验证 FLAGS.PUBLIC_READABLE
是否已插入工作内存,您的规则将包括:
when
exists(FLAGS( this == FLAGS.PUBLIC_READABLE ))
我使用 exists
是因为您没有表明需要对标志执行任何操作,所以我只是检查它是否存在。
请注意 insert
不会 re-execute 之前评估的规则。如果您需要重新评估所有工作内存,则应改用 update
。
根据评论,您可以通过以下方式实现简单的“测验”应用程序。用户给出问题的答案;如果用户回答正确,他们会看到下一个问题。如果用户回答错误,则对他们来说“游戏结束”,他们会得到他们做错的问题的正确答案。
我正在使用一些非常简单的模型:
class Question {
private int id;
private String questionText;
private String correctAnswer;
// getters and setters
}
class QuizUtils {
public static Question showNextQuestion();
public static void doGameOver(Question questionMissed);
}
用户的答案是一个直接输入工作记忆的字符串。
rule "User got the question right"
when
// the user's answer
$userAnswer: String()
// the current question
Question( correctAnswer == $userAnswer )
then
QuizUtils.showNextQuestion();
end
rule "User got the question wrong"
when
$userAnswer: String
$question: Question (correctAnswer != $userAnswer )
then
QuizUtils.doGameOver($question);
end
我制定了一条规则,它在会话中插入了一个问题。如果问题为真,则插入一个 FLAG,如果问题不为真,则删除问题并且不更新标志。在会话中插入问题之前,我需要检查标志的值。我已经尝试了几种方法来做到这一点,但没有得到流口水的东西来做到这一点。这是我的规则:
正在插入问题规则
rule "Threat: ATTACK_OTHER_USERS; insert question"
agenda-group "evaluate attack category"
dialect "mvel"
when
Threat(this == Threat.ATTACK_OTHER_USERS)
// $FLAGS(this == FLAGS.PUBLIC_READABLE) // i need the check here, the existing doesn't work
then
insertLogical(QRiskFactor.QRF1_S4_PUBLIC_READABLE);
end
问题正确
rule "Threat: Public Readable QRF_1.4 [true]"
agenda-group "evaluate attack category"
dialect "mvel"
when
$q1: QRiskFactor(this == QRiskFactor.QRF1_S4_PUBLIC_READABLE)
Application($rf : riskFactors[QRiskFactor.QRF1_S4_PUBLIC_READABLE.value], $rf!.factor == "true")
then
delete($q1);
insert(FLAGS.PUBLIC_READABLE);
end
问题是假的
rule "Threat: Public Readable -- QRF_1.4 [not true]"
agenda-group "evaluate attack category"
dialect "mvel"
when
$q1: QRiskFactor(this == QRiskFactor.QRF1_S4_PUBLIC_READABLE)
Application($rf : riskFactors[QRiskFactor.QRF1_S4_PUBLIC_READABLE.value], $rf!.factor != "true")
then
delete($q1);
end
您需要检查工作记忆中是否存在您的特定标志。你的规则中注释掉的语法几乎是正确的,除了你似乎有一个无关的 $
present.
由于您没有分享 FLAGS
是什么,因此很难具体回答您的问题。根据您制定 insert
语句的方式,我将假设它是一个像这样的枚举:
public enum FLAGS {
PUBLIC_READABLE,
// possibly other values
}
因此,如果您想验证 FLAGS.PUBLIC_READABLE
是否已插入工作内存,您的规则将包括:
when
exists(FLAGS( this == FLAGS.PUBLIC_READABLE ))
我使用 exists
是因为您没有表明需要对标志执行任何操作,所以我只是检查它是否存在。
请注意 insert
不会 re-execute 之前评估的规则。如果您需要重新评估所有工作内存,则应改用 update
。
根据评论,您可以通过以下方式实现简单的“测验”应用程序。用户给出问题的答案;如果用户回答正确,他们会看到下一个问题。如果用户回答错误,则对他们来说“游戏结束”,他们会得到他们做错的问题的正确答案。
我正在使用一些非常简单的模型:
class Question {
private int id;
private String questionText;
private String correctAnswer;
// getters and setters
}
class QuizUtils {
public static Question showNextQuestion();
public static void doGameOver(Question questionMissed);
}
用户的答案是一个直接输入工作记忆的字符串。
rule "User got the question right"
when
// the user's answer
$userAnswer: String()
// the current question
Question( correctAnswer == $userAnswer )
then
QuizUtils.showNextQuestion();
end
rule "User got the question wrong"
when
$userAnswer: String
$question: Question (correctAnswer != $userAnswer )
then
QuizUtils.doGameOver($question);
end