[jboss-jira] [JBoss JIRA] (DROOLS-579) Wrong doc for RuleRuntime.getQueryResults - throwing RuntimeException instead of empty results

Matteo Mortari (JIRA) issues at jboss.org
Tue Aug 26 06:13:59 EDT 2014


Matteo Mortari created DROOLS-579:
-------------------------------------

             Summary: Wrong doc for RuleRuntime.getQueryResults - throwing RuntimeException instead of empty results
                 Key: DROOLS-579
                 URL: https://issues.jboss.org/browse/DROOLS-579
             Project: Drools
          Issue Type: Bug
      Security Level: Public (Everyone can see)
    Affects Versions: 6.1.0.Final
            Reporter: Matteo Mortari
            Assignee: Mark Proctor


The [javadoc|http://docs.jboss.org/drools/release/6.1.0.Final/kie-api-javadoc/org/kie/api/runtime/rule/RuleRuntime.html#getQueryResults(java.lang.String, java.lang.Object...)] for public api {{RuleRuntime.getQueryResults}} mentions: _If the query does not exist or no results match the query it is empty_ ; however if query does not exist, actually RuntimeException is thrown instead. Details follows. I'm reporting this as I assume this will become even more relevant for the execution server, ref 2nd test below.

h5. Proposals 

My proposals are that either:
* javadoc shall be at least corrected - I know there is no obligation to document unchecked exceptions, but [here the doc is explicitly saying something different|http://docs.jboss.org/drools/release/6.1.0.Final/kie-api-javadoc/org/kie/api/runtime/rule/RuleRuntime.html#getQueryResults(java.lang.String, java.lang.Object...)] . I will attach pull request accordingly.
* the public api method shall reflect the doc and {{QueryResult}} returned should resemble Java 8's Optional then - if I understood some good api design styles to mitigate this scenario from Mario, instead of throwing the RuntimeException, the {{QueryResult}} returned could stand in place of Java 8's Optional. Without dependency on Java 8 API, the {{QueryResult}} in case 'query does not exist' could be empty, to guarantee retro-compatibility, and have specific methods to distinguish root cause of being empty between query-not-found or no-results-match-criteria.

... or possibly ack the former option for the time being, and welcome the latter option as a suggestion for enhancement on the new releases, please? Thanks

h5. Details

If you consider the following code
{code}
@Test
public void missingQueryViaApi() {
	String drl = 
			"query \"my query A\"\n" + 
			"	$r : String()\n" + 
			"end";
	
	KieHelper helper = new KieHelper();
	helper.addContent( drl, ResourceType.DRL );
	KieSession ksession = helper.build().newKieSession();
	
	// If ... no results match the query it is empty
	QueryResults validQueryNameResults = ksession.getQueryResults("my query A");
	assertNotNull("The query exists so result should NOT be null", validQueryNameResults);
	assertEquals("The query exists and result should be empty", 0, validQueryNameResults.size());
	
	// If the query does not exist ... it is empty
	boolean hasThrownRTE = false;
	try {
		ksession.getQueryResults("an non-existent query");
	} catch (RuntimeException e) {
		hasThrownRTE = true;
	}
	assertFalse("Should not throw RTE, should be sort-of 'empty' by doc", hasThrownRTE);
}
{code}

The test fails on the last assert, as accordingly to [javadoc|http://docs.jboss.org/drools/release/6.1.0.Final/kie-api-javadoc/org/kie/api/runtime/rule/RuleRuntime.html#getQueryResults(java.lang.String, java.lang.Object...)], but instead it actually throws the RuntimeException.

This becomes even more of an issue if you consider invoking via Commands:
{code}
@Test
public void missingQueryViaCommands() {
	String drl = 
			"query \"my query A\"\n" + 
			"	$r : String()\n" + 
			"end";
	
	String someText = "This is some text";
	
	KieHelper helper = new KieHelper();
	helper.addContent( drl, ResourceType.DRL );
	KieSession ksession = helper.build().newKieSession();

	List<Command<?>> cmds = new ArrayList<Command<?>>();
	cmds.add( CommandFactory.newInsert( someText ));
	cmds.add( CommandFactory.newQuery( "results A", "my query A" ));
	cmds.add( CommandFactory.newQuery( "results NE", "an non-existent query" ));
	
	ExecutionResults results = ksession.execute( CommandFactory.newBatchExecution( cmds ) );
	
	QueryResults queryResults = ( QueryResults ) results.getValue( "results A" );
	assertEquals(someText, queryResults.iterator().next().get("$r") );
}
{code}

The test fails on the {{ksession.execute()}} and that's why I wanted to report this I spotted, because I'm afraid might have more deep implications for the drools execution server. 



--
This message was sent by Atlassian JIRA
(v6.3.1#6329)


More information about the jboss-jira mailing list