[jboss-svn-commits] JBL Code SVN: r17156 - in labs/jbossrules/branches/temporal_rete/drools-core/src: main/java/org/drools/rule and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Dec 10 08:21:37 EST 2007


Author: tirelli
Date: 2007-12-10 08:21:37 -0500 (Mon, 10 Dec 2007)
New Revision: 17156

Modified:
   labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java
   labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/branches/temporal_rete/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
Log:
JBRULES-1374: adding support to 'not after' operator

Modified: labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java	2007-12-10 11:45:08 UTC (rev 17155)
+++ labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java	2007-12-10 13:21:37 UTC (rev 17156)
@@ -24,12 +24,9 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseEvaluator;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.MatchesEvaluatorsDefinition.StringMatchesEvaluator;
-import org.drools.base.evaluators.MatchesEvaluatorsDefinition.StringNotMatchesEvaluator;
 import org.drools.common.EventFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
@@ -45,15 +42,15 @@
     implements
     EvaluatorDefinition {
 
-    public static final Operator  AFTER       = Operator.addOperatorToRegistry( "after",
-                                                                                  false );
-    public static final Operator  NOT_AFTER   = Operator.addOperatorToRegistry( "after",
-                                                                                  true );
-    
-    private static final String[] SUPPORTED_IDS = { AFTER.getOperatorString() };
-    
-    private Map<String, AfterEvaluator> cache        = Collections.emptyMap();
+    public static final Operator   AFTER         = Operator.addOperatorToRegistry( "after",
+                                                                                   false );
+    public static final Operator   NOT_AFTER     = Operator.addOperatorToRegistry( "after",
+                                                                                   true );
 
+    private static final String[]  SUPPORTED_IDS = {AFTER.getOperatorString()};
+
+    private Map<String, Evaluator> cache         = Collections.emptyMap();
+
     /**
      * @inheridDoc
      */
@@ -85,14 +82,20 @@
                                   final boolean isNegated,
                                   final String parameterText) {
         if ( this.cache == Collections.EMPTY_MAP ) {
-            this.cache = new HashMap<String, AfterEvaluator>();
+            this.cache = new HashMap<String, Evaluator>();
         }
         String key = isNegated + ":" + parameterText;
-        AfterEvaluator eval = this.cache.get( key );
+        Evaluator eval = this.cache.get( key );
         if ( eval == null ) {
-            eval = new AfterEvaluator( type,
-                                       isNegated,
-                                       parameterText );
+            if ( isNegated ) {
+                eval = new NotAfterEvaluator( type,
+                                              isNegated,
+                                              parameterText );
+            } else {
+                eval = new AfterEvaluator( type,
+                                           isNegated,
+                                           parameterText );
+            }
             this.cache.put( key,
                             eval );
         }
@@ -133,10 +136,10 @@
      * Implements the 'after' evaluator itself
      */
     public static class AfterEvaluator extends BaseEvaluator {
-        private static final long     serialVersionUID = -4833205637340977934L;
+        private static final long serialVersionUID = -4833205637340977934L;
 
-        private long                  initRange;
-        private long                  finalRange;
+        private long              initRange;
+        private long              finalRange;
 
         public AfterEvaluator(final ValueType type,
                               final boolean isNegated,
@@ -145,12 +148,12 @@
                    isNegated ? NOT_AFTER : AFTER );
             this.parseParameters( parameters );
         }
-        
+
         @Override
         public Object prepareObject(InternalFactHandle handle) {
             return handle;
         }
-        
+
         public boolean evaluate(InternalWorkingMemory workingMemory,
                                 final Extractor extractor,
                                 final Object object1,
@@ -164,8 +167,7 @@
             if ( context.rightNull ) {
                 return false;
             }
-            long dist = ((EventFactHandle)((ObjectVariableContextEntry) context).right).getStartTimestamp() - 
-                        ((EventFactHandle) left ).getEndTimestamp();
+            long dist = ((EventFactHandle) ((ObjectVariableContextEntry) context).right).getStartTimestamp() - ((EventFactHandle) left).getEndTimestamp();
             return dist >= this.initRange && dist <= this.finalRange;
         }
 
@@ -176,8 +178,7 @@
                                                 right ) ) {
                 return false;
             }
-            long dist = ((EventFactHandle) right ).getStartTimestamp() - 
-                        ((EventFactHandle) ((ObjectVariableContextEntry) context).left).getEndTimestamp();
+            long dist = ((EventFactHandle) right).getStartTimestamp() - ((EventFactHandle) ((ObjectVariableContextEntry) context).left).getEndTimestamp();
 
             return dist >= this.initRange && dist <= this.finalRange;
         }
@@ -191,7 +192,7 @@
                                          object1 ) ) {
                 return false;
             }
-            long dist = ((EventFactHandle) object1 ).getStartTimestamp() - ((EventFactHandle) object2 ).getEndTimestamp();
+            long dist = ((EventFactHandle) object1).getStartTimestamp() - ((EventFactHandle) object2).getEndTimestamp();
             return dist >= this.initRange && dist <= this.finalRange;
         }
 
@@ -258,4 +259,131 @@
 
     }
 
+    /**
+     * Implements the 'after' evaluator itself
+     */
+    public static class NotAfterEvaluator extends BaseEvaluator {
+        private static final long serialVersionUID = -4833205637340977934L;
+
+        private long              initRange;
+        private long              finalRange;
+
+        public NotAfterEvaluator(final ValueType type,
+                                 final boolean isNegated,
+                                 final String parameters) {
+            super( type,
+                   isNegated ? NOT_AFTER : AFTER );
+            this.parseParameters( parameters );
+        }
+
+        @Override
+        public Object prepareObject(InternalFactHandle handle) {
+            return handle;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            throw new RuntimeDroolsException( "The 'after' operator can only be used to compare one event to another, and never to compare to literal constraints." );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            if ( context.rightNull ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) ((ObjectVariableContextEntry) context).right).getStartTimestamp() - ((EventFactHandle) left).getEndTimestamp();
+            return dist < this.initRange || dist > this.finalRange;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            if ( context.extractor.isNullValue( workingMemory,
+                                                right ) ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) right).getStartTimestamp() - ((EventFactHandle) ((ObjectVariableContextEntry) context).left).getEndTimestamp();
+
+            return dist < this.initRange || dist > this.finalRange;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            if ( extractor1.isNullValue( workingMemory,
+                                         object1 ) ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) object1).getStartTimestamp() - ((EventFactHandle) object2).getEndTimestamp();
+            return dist < this.initRange || dist > this.finalRange;
+        }
+
+        public String toString() {
+            return "not after[" + initRange + ", " + finalRange + "]";
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            final int PRIME = 31;
+            int result = super.hashCode();
+            result = PRIME * result + (int) (finalRange ^ (finalRange >>> 32));
+            result = PRIME * result + (int) (initRange ^ (initRange >>> 32));
+            return result;
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if ( this == obj ) return true;
+            if ( !super.equals( obj ) ) return false;
+            if ( getClass() != obj.getClass() ) return false;
+            final NotAfterEvaluator other = (NotAfterEvaluator) obj;
+            return finalRange == other.finalRange && initRange == other.initRange;
+        }
+
+        /**
+         * This methods tries to parse the string of parameters to customize 
+         * the evaluator.
+         * 
+         * @param parameters
+         */
+        private void parseParameters(String parameters) {
+            if ( parameters == null || parameters.trim().length() == 0 ) {
+                // open bounded range
+                this.initRange = 1;
+                this.finalRange = Long.MAX_VALUE;
+                return;
+            }
+
+            try {
+                String[] ranges = parameters.split( "," );
+                if ( ranges.length == 1 ) {
+                    // deterministic point in time
+                    this.initRange = Long.parseLong( ranges[0] );
+                    this.finalRange = this.initRange;
+                } else if ( ranges.length == 2 ) {
+                    // regular range
+                    this.initRange = Long.parseLong( ranges[0] );
+                    this.finalRange = Long.parseLong( ranges[1] );
+                } else {
+                    throw new RuntimeDroolsException( "[Not After Evaluator]: Not possible to parse parameters: '" + parameters + "'" );
+                }
+            } catch ( NumberFormatException e ) {
+                throw new RuntimeDroolsException( "[Not After Evaluator]: Not possible to parse parameters: '" + parameters + "'",
+                                                  e );
+            }
+        }
+
+    }
+
 }

Modified: labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-12-10 11:45:08 UTC (rev 17155)
+++ labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-12-10 13:21:37 UTC (rev 17156)
@@ -19,7 +19,6 @@
 import java.util.Arrays;
 
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.Operator;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;

Modified: labs/jbossrules/branches/temporal_rete/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-12-10 11:45:08 UTC (rev 17155)
+++ labs/jbossrules/branches/temporal_rete/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-12-10 13:21:37 UTC (rev 17156)
@@ -727,110 +727,91 @@
         final Declaration declaration = new Declaration( "test",
                                                    extractor,
                                                    null );
+        final ValueType coerced = evaluator.getCoercedValueType();
+        
+        if ( coerced.isIntegerNumber() ) {
+            final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
+                                                                             declaration,
+                                                                             evaluator );
 
-        if( "memberOf".equals( evaluator.getOperator().getOperatorString() ) ) {
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Number) row[2]).longValue();
+            }
 
-            final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
-                                                                                       declaration,
-                                                                                       evaluator );
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Number) row[0]).longValue();
+            }
+            return context;
+        } else if ( coerced.isChar() ) {
+            final CharVariableContextEntry context = new CharVariableContextEntry( extractor,
+                                                                                   declaration,
+                                                                                   evaluator );
+
             if (row[2] == null) {
-               context.leftNull = true;
+                context.leftNull = true;
             } else {
-               context.left = row[2];
+                context.left = ((Character) row[2]).charValue();
             }
 
             if (row[0] == null) {
-               context.rightNull = true;
+                context.rightNull = true;
             } else {
-               context.right = row[0];
+                context.right = ((Character) row[0]).charValue();
             }
             return context;
+        } else if ( coerced.isBoolean() ) {
+            final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
+                                                                                   declaration,
+                                                                                   evaluator );
 
-        } else {
-            if ( valueType.isIntegerNumber() ) {
-                final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Boolean) row[2]).booleanValue();
+            }
+
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Boolean) row[0]).booleanValue();
+            }
+            return context;
+        } else if ( coerced.isFloatNumber() ) {
+            final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
                                                                                  declaration,
                                                                                  evaluator );
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Number) row[2]).doubleValue();
+            }
 
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Number) row[2]).longValue();
-                }
-
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Number) row[0]).longValue();
-                }
-                return context;
-            } else if ( valueType.isChar() ) {
-                final CharVariableContextEntry context = new CharVariableContextEntry( extractor,
-                                                                                       declaration,
-                                                                                       evaluator );
-
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Character) row[2]).charValue();
-                }
-
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Character) row[0]).charValue();
-                }
-                return context;
-            } else if ( valueType.isBoolean() ) {
-                final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
-                                                                                       declaration,
-                                                                                       evaluator );
-
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Boolean) row[2]).booleanValue();
-                }
-
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Boolean) row[0]).booleanValue();
-                }
-                return context;
-            } else if ( valueType.isFloatNumber() ) {
-                final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
-                                                                                     declaration,
-                                                                                     evaluator );
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Number) row[2]).doubleValue();
-                }
-
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Number) row[0]).doubleValue();
-                }
-                return context;
+            if (row[0] == null) {
+                context.rightNull = true;
             } else {
-                final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
-                                                                                     declaration,
-                                                                                     evaluator );
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = row[2];
-                }
+                context.right = ((Number) row[0]).doubleValue();
+            }
+            return context;
+        } else {
+            final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
+                                                                                 declaration,
+                                                                                 evaluator );
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = row[2];
+            }
 
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = row[0];
-                }
-                return context;
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = row[0];
             }
+            return context;
         }
     }
 




More information about the jboss-svn-commits mailing list