[jboss-svn-commits] JBL Code SVN: r12157 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/base/mvel and 6 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri May 25 20:11:56 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-05-25 20:11:56 -0400 (Fri, 25 May 2007)
New Revision: 12157
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SalienceInteger.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Salience.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DepthConflictResolver.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/SalienceConflictResolver.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Activation.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java
Log:
JBRULES-875 Dynamic salience
-MVEL is now integrated for dynamic salience expressions
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SalienceInteger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SalienceInteger.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SalienceInteger.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -0,0 +1,24 @@
+package org.drools.base;
+
+import org.drools.WorkingMemory;
+import org.drools.spi.Salience;
+import org.drools.spi.Tuple;
+
+public class SalienceInteger
+ implements
+ Salience {
+
+ public static final Salience DEFAULT_SALIENCE = new SalienceInteger( 0 );
+
+ private final int value;
+
+ public SalienceInteger(int value) {
+ this.value = value;
+ }
+
+ public int getValue(final Tuple tuple,
+ final WorkingMemory workingMemory) {
+ return this.value;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -0,0 +1,34 @@
+package org.drools.base.mvel;
+
+import java.io.Serializable;
+
+import org.drools.WorkingMemory;
+import org.drools.spi.Salience;
+import org.drools.spi.Tuple;
+import org.mvel.MVEL;
+
+public class MVELSalienceExpression implements
+ Salience {
+
+ private static final long serialVersionUID = 320L;
+
+ private final Serializable expr;
+ private final DroolsMVELFactory factory;
+
+ public MVELSalienceExpression(final Serializable expr,
+ final DroolsMVELFactory factory) {
+ this.expr = expr;
+ this.factory = factory;
+ }
+
+ public int getValue(final Tuple tuple,
+ final WorkingMemory workingMemory) {
+ this.factory.setContext( tuple,
+ null,
+ workingMemory );
+ return ((Integer) MVEL.executeExpression( this.expr,
+ this.factory )).intValue();
+ }
+
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -53,6 +53,9 @@
/** The rule. */
private final Rule rule;
+
+ /** The salience */
+ private final int salience;
/** The subrule */
private final GroupElement subrule;
@@ -92,14 +95,16 @@
*/
public AgendaItem(final long activationNumber,
final Tuple tuple,
+ final int salience,
final PropagationContext context,
final Rule rule,
final GroupElement subrule) {
this.tuple = tuple;
this.context = context;
this.rule = rule;
+ this.salience = salience;
this.subrule = subrule;
- this.activationNumber = activationNumber;
+ this.activationNumber = activationNumber;
}
// ------------------------------------------------------------
@@ -126,6 +131,10 @@
public Tuple getTuple() {
return this.tuple;
}
+
+ public int getSalience() {
+ return this.salience;
+ }
/*
* (non-Javadoc)
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -104,6 +104,10 @@
public PropagationContext getPropagationContext() {
return this.context;
}
+
+ public int getSalience() {
+ throw new UnsupportedOperationException( "salience is now application to scheduled activations" );
+ }
/**
* Retrieve the rule.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DepthConflictResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DepthConflictResolver.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/DepthConflictResolver.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -27,8 +27,8 @@
public int compare(final Activation lhs,
final Activation rhs) {
- final int s1 = lhs.getRule().getSalience();
- final int s2 = rhs.getRule().getSalience();
+ final int s1 = lhs.getSalience();
+ final int s2 = rhs.getSalience();
if ( s1 != s2 ) {
return s2 - s1;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/SalienceConflictResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/SalienceConflictResolver.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/conflict/SalienceConflictResolver.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -75,6 +75,6 @@
*/
public int compare(final Activation lhs,
final Activation rhs) {
- return rhs.getRule().getSalience() - lhs.getRule().getSalience();
+ return rhs.getSalience() - lhs.getSalience();
}
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -146,10 +146,10 @@
// if the current Rule is no-loop and the origin rule is the same and its the same set of facts (tuple) then return
if ( context.getType() == PropagationContext.MODIFICATION ) {
- if ( this.rule.getNoLoop() && this.rule.equals( context.getRuleOrigin() ) && context.getActivationOrigin().getTuple().equals( tuple ) ) {
+ if ( this.rule.isNoLoop() && this.rule.equals( context.getRuleOrigin() ) && context.getActivationOrigin().getTuple().equals( tuple ) ) {
return;
}
- } else if ( this.rule.getNoLoop() && this.rule.equals( context.getRuleOrigin() ) ) {
+ } else if ( this.rule.isNoLoop() && this.rule.equals( context.getRuleOrigin() ) ) {
return;
}
@@ -218,6 +218,7 @@
final AgendaItem item = new AgendaItem( context.getPropagationNumber(),
cloned,
+ rule.getSalience().getValue( tuple, workingMemory ),
context,
this.rule,
this.subrule );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -21,9 +21,11 @@
import java.util.Iterator;
import java.util.Map;
+import org.drools.base.SalienceInteger;
import org.drools.spi.AgendaGroup;
import org.drools.spi.Consequence;
import org.drools.spi.Duration;
+import org.drools.spi.Salience;
/**
* A <code>Rule</code> contains a set of <code>Test</code>s and a
@@ -58,8 +60,9 @@
private final String name;
/** Salience value. */
- private int salience;
+ private Salience salience;
+ /** The Rule is dirty after patterns have been added */
private boolean dirty;
private Map declarations;
private Declaration[] declarationArray;
@@ -122,6 +125,7 @@
this.lhsRoot = GroupElementFactory.newAndInstance();
this.semanticallyValid = true;
this.enabled = true;
+ this.salience = SalienceInteger.DEFAULT_SALIENCE;
}
/**
@@ -240,7 +244,7 @@
*
* @return The salience.
*/
- public int getSalience() {
+ public Salience getSalience() {
return this.salience;
}
@@ -249,7 +253,7 @@
*
* @param salience The salience.
*/
- public void setSalience(final int salience) {
+ public void setSalience(final Salience salience) {
this.salience = salience;
}
@@ -261,7 +265,7 @@
this.agendaGroup = agendaGroup;
}
- public boolean getNoLoop() {
+ public boolean isNoLoop() {
return this.noLoop;
}
@@ -288,7 +292,6 @@
}
}
-
}
public void setNoLoop(final boolean noLoop) {
@@ -337,6 +340,11 @@
return (Declaration) this.declarations.get( identifier );
}
+ /**
+ * This field is updated at runtime, when the first logical assertion is done. I'm currently not too happy about having this determine at runtime
+ * but its currently easier than trying to do this at compile time, although eventually this should be changed
+ * @return
+ */
public boolean hasLogicalDependency() {
return this.hasLogicalDependency;
}
@@ -521,11 +529,24 @@
public void setDateExpires(final Calendar expiresDate) {
this.dateExpires = expiresDate;
}
+
+ public Calendar getDateEffective() {
+ return this.dateEffective;
+ }
+
+ public Calendar getDateExpires() {
+ return this.dateExpires;
+ }
+
/**
* A rule is enabled by default. This can explicitly disable it in which case it will never activate.
*/
public void setEnabled(final boolean b) {
this.enabled = b;
}
+
+ public boolean isEnabled() {
+ return this.enabled;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Activation.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Activation.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Activation.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -43,6 +43,8 @@
* @return The rule.
*/
Rule getRule();
+
+ int getSalience();
/**
* Retrieve the subrule that was activated.
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Salience.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Salience.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Salience.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -0,0 +1,10 @@
+package org.drools.spi;
+
+import java.io.Serializable;
+
+import org.drools.WorkingMemory;
+
+public interface Salience extends Serializable {
+ public int getValue(final Tuple tuple,
+ final WorkingMemory workingMemory);
+}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -26,6 +26,7 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
+import org.drools.base.SalienceInteger;
import org.drools.common.AgendaGroupImpl;
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalAgenda;
@@ -779,7 +780,7 @@
final Rule rule2 = new Rule( "test-rule2" );
rule2.setRuleFlowGroup( "rule-flow-group-2" );
rule2.setConsequence( consequence );
- rule2.setSalience( 10 );
+ rule2.setSalience( new SalienceInteger( 10 ) );
final RuleTerminalNode node2 = new RuleTerminalNode( 5,
new MockTupleSource( 2 ),
@@ -1035,7 +1036,7 @@
final Rule rule0 = new Rule( "test-rule0" );
rule0.setRuleFlowGroup( "rule-flow-group-0" );
rule0.setConsequence( consequence0 );
- rule0.setSalience( 10 );
+ rule0.setSalience( new SalienceInteger( 10 ) );
final RuleTerminalNode node0 = new RuleTerminalNode( 3,
new MockTupleSource( 2 ),
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java 2007-05-26 00:11:43 UTC (rev 12156)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java 2007-05-26 00:11:56 UTC (rev 12157)
@@ -23,6 +23,7 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
+import org.drools.base.SalienceInteger;
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalAgenda;
import org.drools.common.PropagationContextImpl;
@@ -101,7 +102,7 @@
final Rule rule2 = new Rule( "test-rule2" );
rule2.setRuleFlowGroup( "rule-flow-group-2" );
rule2.setConsequence( consequence );
- rule2.setSalience( 10 );
+ rule2.setSalience( new SalienceInteger( 10 ) );
final RuleTerminalNode node2 = new RuleTerminalNode( 5,
new MockTupleSource( 2 ),
@@ -343,7 +344,7 @@
final Rule rule2 = new Rule( "test-rule2" );
rule2.setRuleFlowGroup( "rule-flow-group-2" );
rule2.setConsequence( consequence );
- rule2.setSalience( 10 );
+ rule2.setSalience( new SalienceInteger( 10 ) );
final RuleTerminalNode node2 = new RuleTerminalNode( 5,
new MockTupleSource( 2 ),
More information about the jboss-svn-commits
mailing list