Слюни правят, чтобы связать два факта без оценки - PullRequest
1 голос
/ 05 февраля 2020

Так что я все еще относительно новичок в слюнях. Я знаю, как использовать eval для сравнения фактов, но у меня сложилось впечатление, что я смогу написать правила без утверждения eval. Я надеялся получить некоторую помощь в понимании того, как я это сделаю в следующей ситуации?

У меня есть факт, что у администратора запрашивается адрес электронной почты данного пользователя:

declare SupervisorRequested
    email : String
end

и карта от пользователей к их супервизору (потенциально - у некоторых пользователей нет супервизоров)

// Map<String, User>
knowledgeResources.add(supervisors);

Итак, я написал следующее правило:

rule "Supervisor Inclusion Requested"
    when
        request : SupervisorRequested()
        supervisors : Map()
        eval(supervisors.get(request.email) != null)
    then
        ...
end

Итак, вопрос в том, как я мог написать это, не прибегая к использованию eval?

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Приведенное ниже правило будет срабатывать для всех случаев, когда карта (предположительно находящаяся в рабочей памяти) содержит пользователя, сопоставленного с электронной почтой, и не будет срабатывать, если $supervisors.get($email) вернет ноль. Одно из самых больших удобств работы с Drools в MVEL заключается в том, что нам редко приходится делать нулевые проверки.

rule "Supervisor Inclusion Requested"
    when
        $request : SupervisorRequested($email: email)
        $supervisors: Map()
        $supervisorWithEmail : User() from $supervisors.get($email)
    then
        ...
end

Надеюсь, что это помогает, ура.

0 голосов
/ 21 февраля 2020

Вы можете использовать синтаксис this, так как это псевдоним для get(...). Например: Map( $value: this["foo"]) функционально совпадает с $value = map.get("foo").

Имея это в виду, вы можете написать свое правило следующим образом:

rule "Supervisor Inclusion Requested"
when
  SupervisorRequested( $email: email ) // gets the email 
  Map( this[$email] != null ) // checks that the map contains the email
then
 // omitted
end
0 голосов
/ 10 февраля 2020

Попробуйте следующее правило, чтобы получить желаемую проверку условия:

rule "Supervisor Inclusion Requested"
when
    request : SupervisorRequested()
    map : HashMap(this.get(request.getEmail())  != null)
then
    // .............
end
...