Сопоставление списка (тегов) с другим и обнаружение наличия общих элементов - PullRequest
1 голос
/ 11 февраля 2012

Мое требование - соответствовать тегам. В данном примере этот конкретный HourConstraint проверяет TeacherHour, присвоенный Hour(23).

В частности, он проверяет TeacherHour.attributes["tags"] на значения ["asst_ct","teacher_john_smith"] и обнаруживает, по крайней мере, одно совпадение , два в этом случае (оба "asst_ct" и "teacher_john_smith").

TeacherHour:
  id: 47
  assigned_hour: Null
  attributes:Map<List<String>>
    "tags":["asst_ct","no_strenuous_duties","kinda_boring","teacher_john_smith"]
    "another_attribute":[...]

HourConstraint:
   hour: Hour(23)
   attribute: "tags"
   values_list: ["asst_ct","teacher_john_smith"]

Вопрос: Как определить наличие (истина или ложь) общих элементов между двумя списками?

У Drools Expert есть memberOf и contains, но они проверяют скаляр против коллекции, а не коллекцию против коллекции.

Я вижу два возможных пути:

  1. представьте функцию boolean isIntersecting(list,list) и попросите Drools использовать ее для проверки правды
  2. Реализация TeacherHour.attributes[] в виде строки вместо списка и HourConstraint.valueslist в качестве регулярного выражения, которое может соответствовать этому списку

1 Ответ

2 голосов
/ 11 февраля 2012

Есть несколько вариантов. Самое простое - использовать класс Collections, чтобы сделать это для вас:

rule X
when
    $t: TeacherHour( )
    HourConstraint( Collections.disjoint( $t.attributes["tags"], values_list ) == false )
...

Если это то, что вы часто используете в своих правилах, то я рекомендую поместить эту функцию в подключаемый оператор, поддерживаемый Drools. Допустим, вы называете оператор «пересечение», тогда вы можете написать свои правила так:

rule X
when
    $t: TeacherHour( )
    HourConstraint( values_list intersect $t.attributes["tags"] )
...

Третий вариант - использовать from, но он менее эффективен во время выполнения, поскольку вызывает итерации в первом списке:

rule X
when
    $t: TeacherHour( )
    $tag : String() from $t.attributes["tags"]
    exists( HourConstraint( values_list contains $tag ) )
...
...