Во-первых, не устанавливайте правила для каждой книги. Установите правила для ограничений & ndash; здесь определено намного меньше ограничений, чем для книг. Это окажет огромное влияние на время работы и использование памяти.
Запуск тонны книг через механизм правил будет дорогостоящим. Тем более, что вы не будете показывать все результаты пользователю: всего 10-50 на страницу. Одна идея, которая приходит на ум, - это использовать механизм правил для построения набора критериев запроса. (Я бы на самом деле не делал этого - см. Ниже.)
Вот что я имею в виду:
rule "Only two books for networking"
when
Student($checkedOutBooks : checkedOutBooks),
Book(subjects contains "networking", $book1 : id) from $checkedOutBooks,
Book(subjects contains "networking", id != $book1) from $checkedOutBooks
then
criteria.add("subject is not 'networking'", PRIORITY.LOW);
end
rule "Books allowed for course"
when
$course : Course($textbooks : textbooks),
Student(enrolledCourses contains $course)
Book($book : id) from $textbooks,
then
criteria.add("book_id = " + $book, PRIORITY.HIGH);
end
Но я бы на самом деле этого не сделал!
Вот как бы я изменил проблему:
Не показывать книги пользователю - плохой опыт. Пользователь может захотеть просмотреть книги, чтобы увидеть, какие книги получить в следующий раз . Покажите книги, но запретите оформлять книги с ограниченным доступом. Таким образом, у вас есть только 1-50 книг для выполнения правил за раз на пользователя. Это будет довольно быстро. Вышеуказанные правила стали бы:
rule "Allowed for course"
activation-group "Only one rule is fired"
salience 10000
when
// This book is about to be displayed on the page, hence inserted into working memory
$book : Book(),
$course : Course(textbooks contains $book),
Student(enrolledCourses contains $course),
then
//Do nothing, allow the book
end
rule "Only two books for networking"
activation-group "Only one rule is fired"
salience 100
when
Student($checkedOutBooks : checkedOutBooks),
Book(subjects contains "networking", $book1 : id) from $checkedOutBooks,
Book(subjects contains "networking", id != $book1) from $checkedOutBooks,
// This book is about to be displayed on the page, hence inserted into working memory.
$book : Book(subjects contains "networking")
then
disallowedForCheckout.put($book, "Cannot have more than two networking books");
end
Когда я использую группу активации, чтобы убедиться, что запускается только одно правило, и то, чтобы убедиться, что они запускаются в том порядке, в котором я хочу их видеть.
Наконец, хранит правила в кэше . Drools разрешает & mdash; и предлагает & mdash; вы загружаете правила только один раз в базу знаний, а затем создаете из них сеансы. Базы знаний стоят дорого, сессии дешевы.