2012-02-11 1 views
1

내 요구 사항은 태그를 일치시키는 것입니다. 예에서이 특정 HourConstraintHour(23)에 할당 된 TeacherHour을 확인합니다.(태그의) 목록을 다른 태그와 일치시키고 공통 요소의 존재를 감지하십시오.

구체적으로는 값 ["asst_ct","teacher_john_smith"]위한 TeacherHour.attributes["tags"]을 검사하고,이 경우 ("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"] 

질문 : 어떻게 공통 요소의 (true 또는 false) 존재 두 목록 사이를 감지합니까?

Drools Expert는 memberOf과 을 가지고 있지만 스칼라와 컬렉션을 비교하고 컬렉션과 컬렉션을 비교하지는 않습니다.

  1. 기능 boolean isIntersecting(list,list)을 소개하고 일치시킬 수 있습니다 정규 표현식으로 대신 목록의 문자열과 HourConstraint.valueslistTeacherHour.attributes[]를 구현
  2. 을 확인 진리를 그 사용 Drools가 알려주기 :

    나는 두 가지 잠재적 인 방법을 참조 그 목록

답변

2

몇 가지 옵션이 있습니다. 이것은 당신이 규칙에서 자주 사용하는 무언가가 그때 Drools가 지원하는 플러그 연산자에서 그 기능을 포장하는 것이 좋습니다 인 경우

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

: 대부분의 정직하고 당신을 위해 그렇게 컬렉션을 클래스를 사용하는 것입니다. 당신은 다음과 같은 규칙을 작성할 수 있습니다, 당신은 운영자 "교차을"이름을 말할 수 있습니다 :

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

세 번째 옵션 "에서"사용하는 것입니다,하지만이에 반복의 원인으로 그 실행에 효율성이 떨어집니다 첫 번째 목록 :

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

나는 Collections.disjoint와 함께 갈 것이다. 오히려 설정된 데이터 형식을 사용해야합니까? 또한 나를 "플러그 형 운영자"라고 부를 수 있습니까? – aitchnyu

+1

사용해보기 : http://blog.athico.com/2010/06/creating-pluggable-oprators.html. 또는 필요에 따라이 클래스를 복사하여 붙여 넣으십시오. https://github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java –

관련 문제