[drools-planner] eval check doesn't provide the expected output
by Joshua Daniel
Hi,
I have the following rule and roomCurriculumCode and currCode are of type
String. If the check is equals "insertLogical" never happens, but if the the
codes are not equal as expressed below the "insertLogical" is performed even
if the strings are equal. What am I missing here
rule "RoomAndCurriculum"
when
$room : Room($roomCode : code, $roomCapacity : capacity,
$roomCurriculumCode : curriculumCode);
$curriculum : Curriculum($currCode : code);
eval($roomCurriculumCode != $currCode)
then
insertLogical(new IntConstraintOccurrence("RoomAndCurriculum",
ConstraintType.NEGATIVE_HARD, 1, $roomCapacity, $room, $currCode,
$roomCurriculumCode));
end
-jd
15 years, 6 months
Re: [rules-users] fireUntilHalt and timing of rule activations
by Greg Barton
The entire purpose of fireUntilHalt is to do exactly the opposite of what you describe. :) Is there any compelling reason you're using it as opposed to just calling fireAllRules?
GreG
On Oct 5, 2010, at 16:34, Norman C <rent_my_time(a)yahoo.com> wrote:
Thanks for the suggestions. They all look like good ways to handle the situation I described. However, they require modifying all of the rules to check for the latch object and its state, which I would prefer not to do and doesn't seem like would be necessary.
It seems to me that this is something that Drools can handle internally without the rules having to be written this way. Since the rules engine processes rules in a single thread, it's a concurrency issue. fireUntilHalt should be blocked when a fact is inserted/updated/retracted, until all activations as a result of that change in working memory are completed.
Thoughts?
Norman
From: Wolfgang Laun <wolfgang.laun(a)gmail.com>
To: Rules Users List <rules-users(a)lists.jboss.org>
Sent: Sun, October 3, 2010 10:51:08 PM
Subject: Re: [rules-users] fireUntilHalt and timing of rule activations
2010/10/4 Greg Barton <greg_barton(a)yahoo.com>
If you don't have some way of associating the data with a particular Latch it's easy to get overlap when processing datasets. In general you need some way to group the data together. You can avoid a back reference to the Latch by having a Set of some sort in the Latch to which you add all data in the batch.
Which burdens all inserts and retracts to be accompanied by correpsonding updates of the Set/Map.
If you use a Set backed by an IdentityHashMap the overhead is pretty small, and rules look like this:
rule "CountAs"
dialect "java"
salience -1
when
l : Latch()
a : A( this memberOf l.dataSet )
then
retract(a);
l.incACount();
System.out.println("Found an A in " + l);
end
See attached project.
THough I like the cleverness of using the "data in matched objects alters rule properties" trick, you could have just as easily had a "Latch(value == true)" conditional, and that would be more clear,
It was meant to emphasize the role of Latch.value as an enabler for the rule in contrast to a regular constraint being part of the application logic. YMMV ;-)
IMO. I'm curious to see of the enabled trick would perform better, though.
Whichever way, there is a considerable burden associated with writing the rules and, possibly, inserts and retracts. I wonder what the benefits of having the session run all the time are as opposed to simply let it fire until it stops; then do the inserts and then fireUntilHalt again? If there is, I'd opt for the addition of an atomic insertAll(Object... objects) and then none of this hocus-pocus would be necessary.
-W
GreG
--- On Sun, 10/3/10, Wolfgang Laun <wolfgang.laun(a)gmail.com> wrote:
From: Wolfgang Laun <wolfgang.laun(a)gmail.com>
Subject: Re: [rules-users] fireUntilHalt and timing of rule activations
To: "Rules Users List" <rules-users(a)lists.jboss.org>
Date: Sunday, October 3, 2010, 4:23 AM
There is another way of associating a Latch object with rules, without having to store a reference to a Latch in objects:
rule "CountAs"
enabled ( $v )
when
Latch( $v : value )
X( ... )
then ... end
At the beginning, insert Latch( false ), which blocks all rules with this construction, or modify the Latch object to false before inserting more facts. Then, insert the facts, and, at the end, modify Latch to true.
Latch latch = new Latch( true );
FactHandle fh = kSession.insert( latch );
kSession.fireAllRules();
latch.setValue( false );
kSession.update( fh, latch );
Of course, you can use multiple Latch objects, adding a name field with a specific value, so that a latch applies to a subset of rules only:
rule "CountAs"
enabled ( $v )
when
Latch( name == "CountAs", $v : value )
...
But be aware that changes to Latch objects will retrigger rules that have fired previously; so with this approach you'll have to make sure to retract facts when they have been processed.
-W
2010/10/3 Greg Barton <greg_barton(a)yahoo.com>
Nope, you're not missing anything. What you need is a control object of some sort thst's inserted after all of the "real" data is inserted. (See attached project for an example.) Rules will look like this, if the control object is called BatchLatch and data objects A:
rule "CountAs"
dialect "java"
salience -1
when
l : Latch()
a : A( latch == l )
then
retract(a);
l.incACount();
System.out.println("Found an A in " + bl);
end
Note that the A object being processed is tied back to the latch. This is so multiple latches can be processed simultaneously and their processing won't be intermingled. This is necessary because there's no guarantee that two Latch objects aren't in working memory at once. (Though you could create a rule that enforces this.)
GreG
--- On Sat, 10/2/10, Norman C <rent_my_time(a)yahoo.com> wrote:
> From: Norman C <rent_my_time(a)yahoo.com>
> Subject: [rules-users] fireUntilHalt and timing of rule activations
> To: rules-users(a)lists.jboss.org
> Date: Saturday, October 2, 2010, 10:22 AM
> Hi All,
>
> In my app, I have a separate thread calling fireUntilHalt()
> continuously. I
> have quite a few rules, and I am using salience extensively
> to control the order
>
> in which rules are executed. What I have seen (by adding
> an event listener) is
> that as a new fact is inserted, various rules are
> activated. Often, the
> fireUntilHalt will start executing fireNextItem in
> DefaultAgenda before all of
> the activations are complete. So if the rule with the
> highest salience
> value hasn't been activated at this point, then the first
> rule to be fired isn't
>
> the correct one.
>
> This can be worked around by waiting for insert to return
> and then calling
> fireAllRules(). But it seems like the session should
> block fireUntilHalt from
> trying to execute activated rules until all activations are
> complete. Or am I
> missing something here?
>
> thanks,
> Norman
>
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
-----Inline Attachment Follows-----
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
15 years, 6 months
Get instance from working memory and update it in the flow
by Yaniv Itzhaki
Hi,
I need to update an instance from the working memory in my Action/Script
node in process flow.
I have an instance in the working memory which I updating inside my rules,
furthermoreת I need to update it inside my action node.
Is there an option to retrieve this object instance during the flow? I have
a constrain at the beginning of the flow which filter out all other
instances of this object and leaves only the relevant instance.
I am using the context.getVariable("instName") and
context.setVariable("instName", object), but my problem is to get the
specific instance because the constrain component doesnt allow me to use the
setVariable...
Thanks
Yaniv
15 years, 6 months
Error in named query: ProcessInstancesWaitingForEvent
by Eugenio Abello
Hi, I'm using drools 5.1.1 with persistent flow and Human Task. In orm.xml
are queries Flow and HT. But among this error initializing JPA:
ERROR 24-09 17:20:36,375 - Error in named query:
ProcessInstancesWaitingForEvent
org.hibernate.QueryException: cannot dereference scalar collection element:
name [select processInstanceInfo.processInstanceId from
org.drools.persistence.processinstance.ProcessInstanceInfo
processInstanceInfo where :type in
(processInstanceInfo.eventTypes.name<http://processinstanceinfo.eventtypes.name/>
)]
thanks
15 years, 6 months
performing math function in drools
by Kripa Nathwani
Hi,
I need to know how can we perform math operations in drools.
For eg: I have a rule which calculates tax and I have a function in which I have to perform power operation i.e. (1+r)^n
Best Regards,
Kripa
________________________________
This Email may contain confidential or privileged information for the intended recipient (s) If you are not the intended recipient, please do not use or disseminate the information, notify the sender and delete it from your system.
______________________________________________________________________
15 years, 6 months
Drools with Spring Batch
by Manav
Hi,
I am trying to integrate Drools with Spring Batch. Is there some documentation
that could throw some light on the configuration involved in the same.
Regards,
Manav
15 years, 6 months
Why are my auto focus agenda group rules with high salience not executed right away?
by H.C.
I have a ruleflow with several rule task and a couple of sub-flows. I also
have many rules in a "maintenance" agenda group with auto-focus and salience
100 (highest of all my rules) without a ruleflow-group. The purpose of these
maintenance rules is to jump in anywhere across the ruleflow as needed to
perform...well...maintenance tasks.
I guess I made the assumption that these rules would immediately execute (on
the spot), ahead of any other rules due to their high salience and auto
focus when activated.
I see however a case where a rule causes one of these maintenance rules to
activate, but before it is executed, the ruleflow task is first deactivated,
then several subsequent ruleflow tasks activate and deactivate (all empty,
size = 0) and then my maintenance rule fires ahead of the next scheduled
ruleflow group rules.
Is there anything I can do to get the maintenance rule to execute right
after the rule that activated it and before the ruleflow task deactivates?
--
View this message in context: http://drools-java-rules-engine.46999.n3.nabble.com/Why-are-my-auto-focus...
Sent from the Drools - User mailing list archive at Nabble.com.
15 years, 6 months
Rules and process variables...
by bob.breitling
How do you or, even, can you access process variables in rules?
I did this sort of thing in my rules consequences:
ProcessInstance pi = drools.getWorkingMemory().getProcessInstance(1);
((VariableScopeInstance)
pi.getContextInstance("VariableScope")).setVariable("x", x);
In my test, the process id of 1 is a bit of a kludge. Is there a good way
to find that id?
This looks pretty ugly.
Is the right way to do this to create a subprocess and map the variable into
the subprocesses' working memory as facts with <mapping> tags?
Bob
--
View this message in context: http://drools-java-rules-engine.46999.n3.nabble.com/Rules-and-process-var...
Sent from the Drools - User mailing list archive at Nabble.com.
15 years, 6 months
Drools and Unidata
by Dean Whisnant
Do you know of anyone using Drools with Unidata, Universe, or other Pick style database? I'm interested in sharing experiences.
Thank you!
Dean
15 years, 6 months