[jboss-jira] [JBoss JIRA] (DROOLS-574) str operator in 'accumulate', with operand from 'from', results in NPE at KB build

Matteo Mortari (JIRA) issues at jboss.org
Wed Aug 13 08:20:30 EDT 2014


Matteo Mortari created DROOLS-574:
-------------------------------------

             Summary: str operator in 'accumulate', with operand from 'from', results in NPE at KB build
                 Key: DROOLS-574
                 URL: https://issues.jboss.org/browse/DROOLS-574
             Project: Drools
          Issue Type: Bug
      Security Level: Public (Everyone can see)
    Affects Versions: 6.1.0.Final
            Reporter: Matteo Mortari
            Assignee: Mark Proctor


This is an exercise for "group by" words.

Consider the following pattern for realizing a "group by" by means of from/accumulate/count : the goal is to count Messages which starts with preferred keyword, if the count for a keyword is >= 2, then rule should fire.
{code}
declare GroupByString
	groupId : String
	groups : String[]
end

rule "init words of my interest"
no-loop
when
then
	GroupByString grp = new GroupByString();
	grp.setGroupId("wordGroup");
	grp.setGroups(new String[]{"ciao", "bella"});
	insert(grp);
end

rule "group by word and count if >=2 then "
no-loop
when
	$group : GroupByString( groupId == "wordGroup")
	$word : String() from $group.groups
	accumulate ( $msg : Message( text str[startsWith] $word ) over window:time( 5m ) ;
				 $list : collectList( $msg ),
				 $count : count( $msg );
				 $count >= 2
				 ) 				 
then
	System.out.println("group by " + $word + " count is "+ $count + " list: " + $list);
	insert(new Integer($count.intValue()));
end
{code}

However trying to compile the KB with the kie-maven-plugin fails with this NPE and stacktrace (snippet):
{noformat}
java.lang.NullPointerException
	at org.drools.compiler.rule.builder.dialect.java.JavaAccumulateBuilder.buildExternalFunctionCall(JavaAccumulateBuilder.java:182)
	at org.drools.compiler.rule.builder.dialect.java.JavaAccumulateBuilder.build(JavaAccumulateBuilder.java:101)
	at org.drools.compiler.rule.builder.dialect.java.JavaAccumulateBuilder.build(JavaAccumulateBuilder.java:66)
	at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:320)
	at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:138)
	at org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:66)
	at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:89)
	at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addRule(KnowledgeBuilderImpl.java:1652)
	at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileRules(KnowledgeBuilderImpl.java:968)
{noformat}

I've also noticed the following 2 aspects:

1-/ If you use another operator instead of {{str startsWith}}, for instance you replace with the {{contains}} operators, it does compile the KB successfully. In this scenario would change the exercise to "count Messages which _contains_ the preferred keyword", but it works:
{code}
rule "group by word and count if >=2 then "
no-loop
when
	$group : GroupByString( groupId == "wordGroup")
	$word : String() from $group.groups
	accumulate ( $msg : Message( text contains $word ) over window:time( 5m ) ;
				 $list : collectList( $msg ),
				 $count : count( $msg );
				 $count >= 2
				 ) 				 
then
	System.out.println("group by " + $word + " count is "+ $count + " list: " + $list);
	insert(new Integer($count.intValue()));
end
{code}

2-/ If you use an hard-coded operand in the {{str startsWith}}, it works too. For instance if you hard-code the rule as:
{code}
rule "group by word and count if >=2 then "
no-loop
when
	accumulate ( $msg : Message( text str[startsWith] "ciao" ) over window:time( 5m ) ;
				 $list : collectList( $msg ),
				 $count : count( $msg );
				 $count >= 2
				 ) 				 
then
	insert(new Integer($count.intValue()));
end
{code}

It does not give NPE at KB build and executes as expected.


For my application it's okay to deal with the first option above, but anyway I thought worthy to report a JIRA. I will attach reproducer. Ciao



--
This message was sent by Atlassian JIRA
(v6.2.6#6264)


More information about the jboss-jira mailing list