Re: Re[2]: [drools-user] can your use fireAllRules(AgendaFilter) multiple times
Michael was not saying to modify the facts in the consequence. Instead, he was saying that you it would be _possible_ iterate through the facts after the rules had fired and modify them. You could do something like: memory.fireAllRules(agendaFilter1); // do something // modify all facts so that rules are re-added to agenda. List objects = memory.getObjects(); for (Object fact : objects ) { FactHandle factHandle = memory.getFactHandle(fact); memory.modifyObject(factHandle, fact); } memory.fireAllRules(agendaFilter2); On 3/8/06, Felipe Piccolini [EMAIL PROTECTED] wrote: Michael, But, how can you modify 'all' the objects on the working memory?.. when a consequence finds a drools.modifyObject(Fact) inside the .drl all the rulebase is checked again no matter the next line... I want to do: java:consequence drools.modifyObject (myFact1); drools.modifyObject(myFact2); /java:consequence But the matter is the second line is never executed. Monday, March 6, 2006, 10:51:29 PM, you wrote: no when its finished, the agenda is clear. I think what you really want is Agenda Groups where it is partioned based on some logic - but this is an upcoming drools 3 feature. in the meantime, you can also iterate through and modify all the objects that are already in working memory, causing rules to be put on the agenda again (possibly). However, I think the correct way is what you suggested, as you are talking about 2 different points in your applications workflow, hence 2 rulesets. The facts just happen to be the same. In any case, the cost is not so much in iterating and calling assertObject, but the work done to calculate what rules should fire, which in any case needs to happen twice. Someone may have another more efficient suggestion however. On 3/7/06, Lionel Port [EMAIL PROTECTED] wrote: When you use the fireAllRules(AgendaFilter) method on the WorkingMemory does it clear the Agenda when its done or can you fire different rules in the working memory at different points in time without modifying the facts in between. The rules I have can be broken into two distinct rulesets that need to be executed at different points but the conditions largely operate on the same facts, so I was trying to save time by asserting all the facts once and then doing something like: memory.fireAllRules(agendaFilter1); // do something not related to drools memory.fireAllRules(agendaFilter2); It doesn't seem to be working though. Should I just put the rules in different rule bases and assert the facts before I use it. -- Felipe Piccolini [EMAIL PROTECTED]
Re: Re[2]: [drools-user] can your use fireAllRules(AgendaFilter) multiple times
Felipe, Note that in this situation it seems a waste as your evaluating conditions for rules you have no intention of firing. Its better to do away with the agenda filters and have seperate rulebases and seperate working memories and just assert the same facts into both working memories. Lionel On 3/8/06, Lionel Port [EMAIL PROTECTED] wrote: Michael was not saying to modify the facts in the consequence. Instead, he was saying that you it would be _possible_ iterate through the facts after the rules had fired and modify them. You could do something like: memory.fireAllRules(agendaFilter1); // do something // modify all facts so that rules are re-added to agenda. List objects = memory.getObjects(); for (Object fact : objects ) { FactHandle factHandle = memory.getFactHandle(fact); memory.modifyObject(factHandle, fact); } memory.fireAllRules(agendaFilter2); On 3/8/06, Felipe Piccolini [EMAIL PROTECTED] wrote: Michael, But, how can you modify 'all' the objects on the working memory?.. when a consequence finds a drools.modifyObject(Fact) inside the .drl all the rulebase is checked again no matter the next line... I want to do: java:consequence drools.modifyObject (myFact1); drools.modifyObject(myFact2); /java:consequence But the matter is the second line is never executed. Monday, March 6, 2006, 10:51:29 PM, you wrote: no when its finished, the agenda is clear. I think what you really want is Agenda Groups where it is partioned based on some logic - but this is an upcoming drools 3 feature. in the meantime, you can also iterate through and modify all the objects that are already in working memory, causing rules to be put on the agenda again (possibly). However, I think the correct way is what you suggested, as you are talking about 2 different points in your applications workflow, hence 2 rulesets. The facts just happen to be the same. In any case, the cost is not so much in iterating and calling assertObject, but the work done to calculate what rules should fire, which in any case needs to happen twice. Someone may have another more efficient suggestion however. On 3/7/06, Lionel Port [EMAIL PROTECTED] wrote: When you use the fireAllRules(AgendaFilter) method on the WorkingMemory does it clear the Agenda when its done or can you fire different rules in the working memory at different points in time without modifying the facts in between. The rules I have can be broken into two distinct rulesets that need to be executed at different points but the conditions largely operate on the same facts, so I was trying to save time by asserting all the facts once and then doing something like: memory.fireAllRules(agendaFilter1); // do something not related to drools memory.fireAllRules(agendaFilter2); It doesn't seem to be working though. Should I just put the rules in different rule bases and assert the facts before I use it. -- Felipe Piccolini [EMAIL PROTECTED]
Re: Re[2]: [drools-user] can your use fireAllRules(AgendaFilter) multiple times
hmmm... well perhaps the rule needs to be broken down, so that in one consequence if modifies fact1, and in a different consequnce it modifies fact2. I am not sure how it can work otherwise. I assume there is more in your consequence then just the modifies? On 3/8/06, Felipe Piccolini [EMAIL PROTECTED] wrote: Michael, But, how can you modify 'all' the objects on the working memory?.. when a consequence finds a drools.modifyObject(Fact) inside the .drl all the rulebase is checked again no matter the next line... I want to do: java:consequence drools.modifyObject(myFact1); drools.modifyObject(myFact2); /java:consequence But the matter is the second line is never executed. Monday, March 6, 2006, 10:51:29 PM, you wrote: no when its finished, the agenda is clear. I think what you really want is Agenda Groups where it is partioned based on some logic - but this is an upcoming drools 3 feature. in the meantime, you can also iterate through and modify all the objects that are already in working memory, causing rules to be put on the agenda again (possibly). However, I think the correct way is what you suggested, as you are talking about 2 different points in your applications workflow, hence 2 rulesets. The facts just happen to be the same. In any case, the cost is not so much in iterating and calling assertObject, but the work done to calculate what rules should fire, which in any case needs to happen twice. Someone may have another more efficient suggestion however. On 3/7/06, Lionel Port [EMAIL PROTECTED] wrote: When you use the fireAllRules(AgendaFilter) method on the WorkingMemory does it clear the Agenda when its done or can you fire different rules in the working memory at different points in time without modifying the facts in between. The rules I have can be broken into two distinct rulesets that need to be executed at different points but the conditions largely operate on the same facts, so I was trying to save time by asserting all the facts once and then doing something like: memory.fireAllRules(agendaFilter1); // do something not related to drools memory.fireAllRules(agendaFilter2); It doesn't seem to be working though. Should I just put the rules in different rule bases and assert the facts before I use it. -- Felipe Piccolini [EMAIL PROTECTED]
[drools-user] can your use fireAllRules(AgendaFilter) multiple times
When you use the fireAllRules(AgendaFilter) method on the WorkingMemory does it clear the Agenda when its done or can you fire different rules in the working memory at different points in time without modifying the facts in between. The rules I have can be broken into two distinct rulesets that need to be executed at different points but the conditions largely operate on the same facts, so I was trying to save time by asserting all the facts once and then doing something like: memory.fireAllRules(agendaFilter1); // do something not related to drools memory.fireAllRules(agendaFilter2); It doesn't seem to be working though. Should I just put the rules in different rule bases and assert the facts before I use it.
Re: [drools-user] can your use fireAllRules(AgendaFilter) multiple times
no when its finished, the agenda is clear. I think what you really want is Agenda Groups where it is partioned based on some logic - but this is an upcoming drools 3 feature. in the meantime, you can also iterate through and modify all the objects that are already in working memory, causing rules to be put on the agenda again (possibly). However, I think the correct way is what you suggested, as you are talking about 2 different points in your applications workflow, hence 2 rulesets. The facts just happen to be the same. In any case, the cost is not so much in iterating and calling assertObject, but the work done to calculate what rules should fire, which in any case needs to happen twice. Someone may have another more efficient suggestion however. On 3/7/06, Lionel Port [EMAIL PROTECTED] wrote: When you use the fireAllRules(AgendaFilter) method on the WorkingMemory does it clear the Agenda when its done or can you fire different rules in the working memory at different points in time without modifying the facts in between. The rules I have can be broken into two distinct rulesets that need to be executed at different points but the conditions largely operate on the same facts, so I was trying to save time by asserting all the facts once and then doing something like: memory.fireAllRules(agendaFilter1); // do something not related to drools memory.fireAllRules(agendaFilter2); It doesn't seem to be working though. Should I just put the rules in different rule bases and assert the facts before I use it.