Hmm … so the use of batch execution instead of InsertObjectCommand improved things. However I have noticed that although rules are activating as expected, and facts are being inserted, my queries don’t seem to get any results. For instance with the following code:
Based on a stateless session: List<Command> cmds = new ArrayList<Command>(); cmds.add(CommandFactory.newInsert(new IbanValidationRequest(iban), "request")); cmds.add(CommandFactory.newQuery("annotations", "annotations")); ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(cmds)); QueryResults queryResults = ( QueryResults ) results.getValue( "annotations" ); System.out.println("Found [" + queryResults.size() + "]"); Based on a stateful session: statefulSession.insert(new IbanValidationRequest(iban)); statefulSession.fireAllRules(); QueryResults queryResults = statefulSession.getQueryResults("annotations"); System.out.println("Found [" + queryResults.size() + "]"); What I’m finding is that if I invoke a query against a stateful session, I get a result. However, with stateless sessions, I am examining the ExecutionResults, and finding that they do contain a reference to an “annotations” QueryResults. However that collection of query results is empty. btw - I’m also noticing that the code example in the user guide for batch executions with queries doesn’t use the current syntax for adding a query command. I’m guessing this syntax changed without an associated update to the user guide. Steve On 11 Dec 2013, at 11:49, Wolfgang Laun <wolfgang.l...@gmail.com> wrote: > The mean thing is that the code > org.drools.command.CommandFactory > uses the generic interface > org.drools.command.Command<T> > for all commands without specifying the generic parameter with the many > newXyz methods. If it were written well, it would tell you what to > expect from the command execution, since interface > org.drools.runtime.CommandExecutor > has the generic > <T> T execute(Command<T> command) > > So you dig around in the code and may detect that ksession.execute( > cmd ) with cmd being made by newInsertElements(...) returns a > Collection<FactHandle>. Mighty helpful. > > Fixing the Experts would help a little, avoiding utter stupefaction. > > Cheers > -W > > > > On 11/12/2013, Stephen Masters <stephen.mast...@me.com> wrote: >> Thanks for that, Wolfgang. I have been working on something else for a few >> days, but just switched over to batch execution, and that is giving me some >> appropriate results (my tests are passing). >> >> Which leads me to the question ... >> >> Given that Example 3.4.1 in the Drools 5.5.0.Final user guide does not >> compile, is that because there is a bug in the implementation of command >> execution? Or is it a bug in the example. i.e. >> The results should just not be assigned to anything? >> The results (an ArrayList containing the facts which were just inserted) >> should be assigned to a List of Object? >> The example should just be removed from the user guide, as it is no longer a >> valid/recommended approach? >> >> Anybody with thoughts on that? Assuming that the answer is a documentation >> fix, I’ll be happy to correct it appropriately and submit a pull request. >> >> Cheers, >> >> Steve >> >> >> >> >> On 4 Dec 2013, at 12:24, Wolfgang Laun <wolfgang.l...@gmail.com> wrote: >> >>> I think you have to put your insert command into a list >>> List<Command<?>> cmds = new ArrayList(); >>> and pass this via batch execution >>> CommandFactory.newBatchExecution( cmds ) >>> >>> -W >>> >>> On 04/12/2013, Stephen Masters <stephen.mast...@me.com> wrote: >>>> Hi folks, >>>> >>>> Can anyone explain how stateless session execution results should work? >>>> Working through the docs and tracing the code, it’s getting a bit >>>> confusing. >>>> >>>> Firstly, according to the user manual, one should be able to insert a >>>> list >>>> of facts as a Command, and get an instance of ExecutionResults back, >>>> which >>>> can then be queried. Here’s the example code: >>>> StatelessKnowledgeSession ksession = >>>> kbase.newStatelessKnowledgeSession(); >>>> >>>> Command cmd = CommandFactory.newInsertElements( Arrays.asList( Object[] >>>> { >>>> >>>> new Cheese( "stilton" ), >>>> >>>> new Cheese( "brie" ), >>>> >>>> new Cheese( "cheddar" ), >>>> >>>> }); >>>> >>>> ExecutionResults bresults = ksession.execute( cmd ); >>>> >>>> That doesn’t compile, so I fixed it as follows: >>>> >>>> Command cmd = CommandFactory.newInsertElements( Arrays.asList( >>>> new Cheese( "stilton" ), >>>> new Cheese( "brie" ), >>>> new Cheese( "cheddar" ) >>>> )); >>>> ExecutionResults bresults = ksession.execute( cmd ); >>>> >>>> This does now compile, but running it throws a ClassCastException: >>>> java.lang.ClassCastException: java.util.ArrayList cannot be cast to >>>> org.drools.runtime.ExecutionResults >>>> >>>> Taking a look through the Drools code, it would appear that Command has >>>> a >>>> generic type, which in the case of an InsertElementsCommand is: >>>> GenericCommand<Collection<FactHandle>> >>>> >>>> In turn, the execute command in StatelessKnowledgeSessionImpl casts its >>>> result to that generic type: >>>> public <T> T execute(Command<T> command) { >>>> Object o = ((GenericCommand) command).execute( context ); >>>> ... >>>> return (T) o; >>>> >>>> So the ClassCastException is because the execute method returns an >>>> ArrayList >>>> of FactHandle instead of an ExecutionResults. >>>> >>>> I’m assuming that I must have got the wrong end of the stick somewhere, >>>> so >>>> what should I be doing to get an ExecutionResults from a stateless >>>> session, >>>> which I can then query? >>>> >>>> Cheers, >>>> >>>> Steve >>> >>> _______________________________________________ >>> rules-users mailing list >>> rules-users@lists.jboss.org >>> https://lists.jboss.org/mailman/listinfo/rules-users >> >> > > _______________________________________________ > rules-users mailing list > rules-users@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users