[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