Как применить правила ко всем атрибутам объекта в сеансе? - PullRequest
0 голосов
/ 13 октября 2011

Я использовал проприетарный механизм правил и сейчас пытаюсь использовать Drools, я довольно новичок в Drools.

При использовании предыдущего механизма правил правило запускалось для всех экземпляров существующего объекта, даже если они были атрибутом другого объекта.

У меня есть набор правил, которые применяются к данному типу объекта O. Я добавляю в свой сеанс и объект O ', имеющий O в качестве атрибута. Но поскольку правила не применяются к O ', они не будут применяться к атрибуту O of O'.

Я проиллюстрирую это на примере слова HEllo:

Я добавил к основному примеру drool следующий класс:

 public static class Email {

        private Message message ;


        public void setMessage(Message message) {
            this.message = message;
        }

        public Message getMessage() {
            return message;
        }
}

Адрес электронной почты - O ', а Сообщение - O.

Моя сессия «работает» следующим образом:

            ...
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            Email email = new Email();
            email.setMessage(message);
            ksession.insert(email);
            ksession.fireAllRules();
            logger.close();
            ...

и у меня есть образец файла слюни:

rule "Hello World"
    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        update( m );
end

Правило применяется только к сообщению.

Если я начну сеанс таким, какой он есть, правило не будет запущено. Чтобы правила сработали, мне нужно добавить правило:

rule "email"
    when 
        e : Email( message != null)
    then 
        insert(e.getMessage());
end

Работает нормально, но мой вопрос: есть ли более простой способ запуска правила для каждого экземпляра объекта, даже если это атрибут другого объекта?

1 Ответ

1 голос
/ 14 октября 2011

Да, вы можете сделать что-то вроде:

rule "Hello World"
    when
        $email: Email(message.status ==  Message.HELLO, $myMessage: message.message )

    then
        System.out.println( $myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        update( m );
end

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

Rule "insert message"
   when 
      Email ($message: message)
   then
      insert($message);
end

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

Приветствия

...