[
http://jira.jboss.com/jira/browse/JBRULES-812?page=comments#action_12360244 ]
Pierre Paysant-Le Roux commented on JBRULES-812:
------------------------------------------------
The revision #11167 introduced a bug. Skipping indexed constraints in
DefaultBetaConstaints is not complete. If I understoud, you have to skip the contexts of
indexed constaints to. Else, the "isAllowedCachedRight" (line 141) is made with
the wrong context.
Here is a patch with the changes I made, that fixes the problem in my case :
Index: drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java (revision
11243)
+++ drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java (working
copy)
@@ -105,6 +105,14 @@
}
return current;
}
+
+ private ContextEntry findContext(final int pos) {
+ ContextEntry current = this.contexts;
+ for( int i = 0 ; i < pos ; i++) {
+ current = current.getNext();
+ }
+ return current;
+ }
private boolean isIndexable(final BetaNodeFieldConstraint constraint) {
if ( constraint instanceof VariableConstraint ) {
@@ -144,7 +152,7 @@
// skip the indexed constraints
LinkedListEntry entry = (LinkedListEntry) findNode( this.indexed );
- ContextEntry context = this.contexts;
+ ContextEntry context = findContext(this.indexed);
while ( entry != null ) {
if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedLeft(
context,
object ) ) {
@@ -163,7 +171,7 @@
// skip the indexed constraints
LinkedListEntry entry = (LinkedListEntry) findNode( this.indexed );
- ContextEntry context = this.contexts;
+ ContextEntry context = findContext( this.indexed );
while ( entry != null ) {
if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedRight(
tuple,
context ) ) {
There is also a problem with the DefaultBetaConstraints constructor. If the first
constraint is indexable, it is inserted in the empty LinkedList with the insertAfter
method. That throws a NullPointerException (See ticket 722).
Indexing failing when more than 3 indexable constraints are
specified
---------------------------------------------------------------------
Key: JBRULES-812
URL:
http://jira.jboss.com/jira/browse/JBRULES-812
Project: JBoss Rules
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: Reteoo
Affects Versions: 3.1-m1
Reporter: Edson Tirelli
Assigned To: Edson Tirelli
Fix For: 3.1-m2
Guys, repeating a query from someone who perhaps didn't write it that clearly
(chinese):
If they try the following condition:
varclu : cluster(clusterid==v_cluster
_id, transitionid==v_transition, stateid==v_state,ruleid==v_rule_id, v_evtid : evtid,
v_evttype : evttype, v_srcaddress : srcaddress, v_destaddress : destaddress, v_timestamp :
timestamp, v_alertid : alertid)" .
It blows up with "There cannot be more than 3 indexes"
Which is due to QuadroupleBetaConstraints not dealing with that many indexes.
When he deletes one equality ,such as "ruleid==v_rule_id", and then add
"eval(varclu.getRuleid()==v_rule_id)", it works - so it looks like a
bug/limitation to the current approach.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira