On 11/19/2012 02:01 PM, Alexander Klenner wrote:
Hi Yason, Roberto and others,
we ran into the same problem after one day of using Drools. Using an artificial
index however doesn't work for us since we have many Annotations and a complex
TypeSystem, we had to retouch all our AEs to get this index working - not
possible for us.
What do you think about an ArrayList, where all Annotations of one Type are
stored in their order of appearance (e.g. sorted by Begin). Instead of only
adding all Annotationen classes to Drools we now also add this ArrayList, which
we create in our Drools AE? Does such an approach make sense? We can ask for
their respective ordering by using indexOf(Object).
This would work in Drools but it looks quite time consuming (if you have
a lot of annotations, you would have a linear scan of your ArrayList for
each /indexOf/ call).
I would try one of this:
*1.* use a /Map/ instead of an /ArrayList/ with /key = annotationId/ (or
whatever else can identify one of your annotations) and /value =
position/ in the list
This is quite simple to create and position values can be retrieved more
efficiently
*2.* use a /wrapper bean/ around your annotation so you can write your
drools rules without using "external" info (from a /list/ or /map/)
e.g.
if you have a bean like AnnotationWrapper --> { int position,
Annotation annot }
then you can write something like
/when
$t1: AnnotationWrapper (annot.text = "Mr.", $pos:position)
$t2: AnnotationWrapper (annot.ortho = "capitalized", position ==
($pos + 1))
then
create NE($t1.annot.start, $t2.annot.end)
end
/
I think that solution *2* is more "drools friendly" (because it can use
direct "match" on a bean property instead of calling methods on an
/array/ or a /map/, so it should be more efficient for RETE algorithm).
Hope it helps,
/Raf/