Like you wish wolfgang. The complete Rule is:
rule "Generate Finding_ConceptId"
no-loop
when
$a1:ODMAnswer(
q1:QuestionId,
q1.toLowerCase.contains("diagnose") ||
q1.toLowerCase.contains("indication"),
q1.toLowerCase.contains("sections"),
a1_begin:begin,
label1:ResponseAttribute)
$a2:ODMAnswer(
ResponseAttribute.contains(label1),
QuestionId.contains("sectionheader"),
comesBefore($a1,$a2));
$a3:ODMAnswer(
q3:QuestionId,
!q3.contains("finding.conceptId"),
!q3.contains("itemGroup"),
!q3.contains("section"),
a3_begin:begin,
a3_end:end,
label2:ResponseAttribute,
isInAnnotation($a1,$a3))
$a4:ODMAnswer(
q4:QuestionId.contains("finding.conceptId"),
a4_begin:begin,
comesAfter($a2,$a4),
isBetween($a2,$a3,$a4),
isInAnnotation($a1,$a4))
not $a5:ODMAnswer(
isInAnnotation($a1,$a5),
isBigger($a3,$a5),
!isEqual($a3,$a4,$a5))
then
String questionId = "finding.conceptId";
String attribute = label1 +" "+ label2;
int begin = a4_begin;
int ende = a3_end;
boolean addToIndexes = true;
insert(annotate(aJCas, questionId, attribute, begin, ende, addToIndexes));
end
The functions are in a seperate FactChecker class, because the
"incode-comparison"
was too much of a chaos. So I wrote functions which explains themselves what they do:
==================================================================
public static boolean isInAnnotation(Annotation a, Annotation b){
if(isNull(a,b)){
return false;
}
if(b.getBegin() > a.getBegin() && b.getEnd() < a.getEnd()){
return true;
}
if(a.getBegin() > b.getBegin() && a.getEnd() < b.getEnd()){
return true;
}
return false;
}
==================================================================
public static boolean isInAnnotation(Annotation... a){
for (int i = 0; i < a.length; i++){
if(i+1 == a.length){
return false;
}
if(isInAnnotation(a[i], a[i+1])){
return true;
}
}
return false;
}
==================================================================
public static boolean comesBefore(Annotation a, Annotation b){
if(isNull(a,b)){
return false;
}
if(b.getEnd() <= a.getBegin()){
return true;
}
return false;
}
==================================================================
public static boolean comesAfter(Annotation a, Annotation b){
if(isNull(a,b)){
return false;
}
if(a.getEnd() <= b.getBegin()){
return true;
}
return false;
}
==================================================================
public static boolean isEqual(Annotation a, Annotation b){
if(isNull(a,b)){
return false;
}
if(a.equals(b)){
return true;
}
return false;
}
==================================================================
public static boolean isEqual(Annotation... a){
ArrayList<Annotation> outLoop = new ArrayList<Annotation>(Arrays.asList(a));
ArrayList<Annotation> inLoop = new ArrayList<Annotation>(Arrays.asList(a));
for (Annotation anno1 : outLoop) {
if(anno1 == null){
}
inLoop.remove(anno1);
for (Annotation anno2 : inLoop) {
if(isEqual(anno1,anno2)){
return true;
}
}
}
return false;
}
==================================================================
public static boolean isNull(Annotation... a){
for (Annotation annotation : a) {
if(annotation == null){
return true;
}
}
return false;
}
==================================================================
public static boolean isBigger(Annotation a, Annotation b){
if(isNull(a,b)){
return false;
}
if(a.getBegin() == b.getBegin() && a.getEnd() < b.getEnd()){
return true;
}
if(b.getBegin() < a.getBegin() && a.getEnd() == b.getEnd()){
return true;
}
if(b.getBegin() < a.getBegin() && a.getEnd() < b.getEnd()){
return true;
}
return false;
}
==================================================================
public static boolean isBetween(Annotation a, Annotation b, Annotation c){
if(isNull(a,b,c)){
return false;
}
Annotation min = getMin(a,b);
Annotation max = getMax(a,b);
if(isOverlapping(a,c) || isOverlapping(b,c)){
return true;
}
if(c.getBegin() > min.getEnd() && c.getEnd() < max.getBegin()){
return true;
}
return false;
}
==================================================================
public static Annotation getMax(Annotation a, Annotation b){
isNull(a,b);
if(a.getBegin() >= b.getBegin()){
return a;
}
return b;
}
==================================================================
public static Annotation getMin(Annotation a, Annotation b){
isNull(a,b);
if(a.getEnd() <= b.getEnd()){
return a;
}
return b;
}
==================================================================
I've posted all functions that are used by the rule. Actually it crushes
if I use more than 2 statements in the isEqual() call in $a5.
It works with !isEqual($a3,$a4) && !isEqual($a3,$a5) && !isEqual($a4,$a5)
but not with !isEqual($a3,$a4,$a5).
So do you got an idea where the problem comes from?
JB
----- Ursprüngliche Mail -----
Von: "Wolfgang Laun" <wolfgang.laun(a)gmail.com>
An: "Rules Users List" <rules-users(a)lists.jboss.org>
Gesendet: Mittwoch, 6. März 2013 15:09:47
Betreff: Re: [rules-users] Cannot invoke method because of ArrayIndexOutOfBoundsException
Nice try - but, please, don't. Kindly post the code that actually
causes your problem.
-W
On 06/03/2013, Bojan Janisch <bojan.janisch(a)scai.fraunhofer.de> wrote:
Hello Guys,
sorry to bother you with this problem, but I'm out of ideas.
I'm using Drools in textmining-context and in basic I have
a function that checks 2 named entites for equality to
ensure that the entities are all different and that the rules
do work only on different named entity objects:
public static boolean isEqual(Annotation a, Annotation b){
if(a.equals(b)){
return true;
}
return false;
}
Sometimes there are conditions that need tests of more than
2 named entites. For this I've written a super method that
calls the isEqual method in a loop:
public static boolean isEqual(Annotation... a){
ArrayList<Annotation> outLoop = new
ArrayList<Annotation>(Arrays.asList(a));
ArrayList<Annotation> inLoop = new ArrayList<Annotation>(Arrays.asList(a));
for (Annotation anno1 : outLoop) {
inLoop.remove(anno1);
for (Annotation anno2 : inLoop) {
if(isEqual(anno1,anno2)){
return true;
}
}
}
return false;
}
My rules could (theoretically) now call the function
eval(isEqual($ne1,$ne2)) or
eval(isEqual($ne1,$ne2,$ne3) or even
eval(isEqual($ne1,$ne2,$ne3,$ne4,$ne5)) and so on.
So there starts my problem:
Each time I'm getting an ArrayIndexOutOfBounds Exception from the second
method that looks like this:
java.lang.RuntimeException: cannot invoke method: isEqual
...
at java.lang.Thread.dispatchUncaughtException(Thread.java:1888)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 3
at
org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.executeAll(MethodAccessor.java:149)
at
org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.getValue(MethodAccessor.java:48)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
at
org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
...
Could someone explain me what's wrong with my code? Thanks for any help.
Greetings
JB
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users