[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