[jboss-svn-commits] JBL Code SVN: r13178 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 6 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Jul 6 14:35:40 EDT 2007
Author: tirelli
Date: 2007-07-06 14:35:40 -0400 (Fri, 06 Jul 2007)
New Revision: 13178
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
Log:
JBRULES-261: fixing ClassCastException and improving automatic conversions when constraining char attributes
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -28,6 +28,7 @@
private float floatPrimitive;
private float doublePrimitive;
+ private String stringAttribute;
private Object[] arrayAttribute;
private int[] primitiveArrayAttribute;
private String[] stringArray;
@@ -126,4 +127,12 @@
this.stringArray = stringArray;
}
+ public String getStringAttribute() {
+ return stringAttribute;
+ }
+
+ public void setStringAttribute(String stringAttribute) {
+ this.stringAttribute = stringAttribute;
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -3109,5 +3109,38 @@
}
+ public void testCharComparisons() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_charComparisons.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+ final List results = new ArrayList();
+ workingMemory.setGlobal( "results",
+ results );
+
+ Primitives p1 = new Primitives();
+ p1.setCharPrimitive( 'a' );
+ p1.setStringAttribute( "b" );
+ Primitives p2 = new Primitives();
+ p2.setCharPrimitive( 'b' );
+ p2.setStringAttribute( "a" );
+
+ workingMemory.insert( p1 );
+ workingMemory.insert( p2 );
+
+ workingMemory.fireAllRules();
+
+ assertEquals( 3, results.size() );
+ assertEquals( "1", results.get( 0 ));
+ assertEquals( "2", results.get( 1 ));
+ assertEquals( "3", results.get( 2 ));
+
+ }
+
+
}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_charComparisons.drl 2007-07-06 18:35:40 UTC (rev 13178)
@@ -0,0 +1,30 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "test chars 1"
+ salience 100
+when
+ Primitives( charPrimitive == 'a' )
+then
+ results.add( "1" );
+end
+
+rule "test chars 2"
+ salience 90
+when
+ Primitives( $c1: charPrimitive == 'a' )
+ Primitives( charPrimitive != $c1 )
+then
+ results.add( "2" );
+end
+
+rule "test chars 3"
+ salience 80
+when
+ Primitives( $c1: stringAttribute == 'a' )
+ Primitives( charPrimitive == $c1 )
+then
+ results.add( "3" );
+end
+
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -19,7 +19,7 @@
import org.drools.base.BaseEvaluator;
import org.drools.base.ValueType;
import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
+import org.drools.rule.VariableRestriction.CharVariableContextEntry;
import org.drools.rule.VariableRestriction.VariableContextEntry;
import org.drools.spi.Evaluator;
import org.drools.spi.Extractor;
@@ -97,7 +97,7 @@
return false;
}
- return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
+ return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((CharVariableContextEntry) context).right;
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -108,7 +108,7 @@
return false;
}
- return ((LongVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
+ return ((CharVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -161,7 +161,7 @@
return true;
}
- return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
+ return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((CharVariableContextEntry) context).right;
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -172,7 +172,7 @@
return true;
}
- return ((LongVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
+ return ((CharVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -219,7 +219,7 @@
if( context.rightNull ) {
return false;
}
- return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
+ return ((CharVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -227,7 +227,7 @@
if( context.extractor.isNullValue( workingMemory, right ) ) {
return false;
}
- return context.extractor.getCharValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
+ return context.extractor.getCharValue( workingMemory, right ) < ((CharVariableContextEntry) context).left;
}
public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -271,7 +271,7 @@
if( context.rightNull ) {
return false;
}
- return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
+ return ((CharVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -279,7 +279,7 @@
if( context.extractor.isNullValue( workingMemory, right ) ) {
return false;
}
- return context.extractor.getCharValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
+ return context.extractor.getCharValue( workingMemory, right ) <= ((CharVariableContextEntry) context).left;
}
public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -323,7 +323,7 @@
if( context.rightNull ) {
return false;
}
- return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
+ return ((CharVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -331,7 +331,7 @@
if( context.extractor.isNullValue( workingMemory, right ) ) {
return false;
}
- return context.extractor.getCharValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
+ return context.extractor.getCharValue( workingMemory, right ) > ((CharVariableContextEntry) context).left;
}
public boolean evaluate(InternalWorkingMemory workingMemory,
@@ -375,7 +375,7 @@
if( context.rightNull ) {
return false;
}
- return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
+ return ((CharVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
@@ -383,7 +383,7 @@
if( context.extractor.isNullValue( workingMemory, right ) ) {
return false;
}
- return context.extractor.getCharValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
+ return context.extractor.getCharValue( workingMemory, right ) >= ((CharVariableContextEntry) context).left;
}
public boolean evaluate(InternalWorkingMemory workingMemory,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -33,7 +33,7 @@
}
public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
- return new Long( getCharValue( workingMemory, object ) );
+ return new Character( getCharValue( workingMemory, object ) );
}
public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -56,6 +56,8 @@
if ( value instanceof Character ) {
return ((Character) value).charValue();
+ } else if( value instanceof String && ((String)value).length() == 1 ) {
+ return ((String)value).charAt( 0 );
}
throw new RuntimeDroolsException( "Conversion to char not supported from " + value.getClass().getName() );
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -125,6 +125,9 @@
} else if ( fieldExtractor.getValueType().isIntegerNumber() ) {
return new LongVariableContextEntry( fieldExtractor,
this.declaration );
+ } else if ( fieldExtractor.getValueType().isChar() ) {
+ return new CharVariableContextEntry( fieldExtractor,
+ this.declaration );
} else {
return new ObjectVariableContextEntry( fieldExtractor,
this.declaration );
@@ -256,6 +259,46 @@
}
}
+ public static class CharVariableContextEntry extends VariableContextEntry {
+
+ private static final long serialVersionUID = -5316792696755228175L;
+
+ public char left;
+ public char right;
+
+ public CharVariableContextEntry(final FieldExtractor extractor,
+ final Declaration declaration) {
+ super( extractor,
+ declaration );
+ }
+
+ public void updateFromTuple(final InternalWorkingMemory workingMemory,
+ final ReteTuple tuple) {
+ this.reteTuple = tuple;
+ this.workingMemory = workingMemory;
+ this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory, tuple.get( this.declaration ).getObject() );
+
+ if (!leftNull) {
+ this.left = this.declaration.getExtractor().getCharValue( workingMemory, tuple.get( this.declaration ).getObject() );
+ } else {
+ this.left = 0;
+ }
+ }
+
+ public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
+ final InternalFactHandle handle) {
+ this.object = handle.getObject();
+ this.workingMemory = workingMemory;
+ this.rightNull = this.extractor.isNullValue( workingMemory, handle.getObject() );
+
+ if ( !rightNull ) { // avoid a NullPointerException
+ this.right = this.extractor.getCharValue( workingMemory, handle.getObject() );
+ } else {
+ this.right = 0;
+ }
+ }
+ }
+
public static class DoubleVariableContextEntry extends VariableContextEntry {
private static final long serialVersionUID = 400L;
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -33,6 +33,7 @@
import org.drools.common.InternalWorkingMemory;
import org.drools.rule.Declaration;
import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
+import org.drools.rule.VariableRestriction.CharVariableContextEntry;
import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
import org.drools.rule.VariableRestriction.LongVariableContextEntry;
import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
@@ -735,36 +736,38 @@
return context;
} else {
- if ( valueType.isIntegerNumber() || valueType.isChar() ) {
+ if ( valueType.isIntegerNumber() ) {
final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
declaration );
- if ( valueType.isChar() ) {
- 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();
- }
+ if (row[2] == null) {
+ context.leftNull = true;
} else {
- 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();
- }
+ 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 );
+
+ 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 );
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java 2007-07-06 18:19:51 UTC (rev 13177)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java 2007-07-06 18:35:40 UTC (rev 13178)
@@ -91,7 +91,7 @@
public void testGetValue() {
try {
Assert.assertEquals( 'a',
- ((Number) this.extractor.getValue( null, this.bean )).intValue() );
+ ((Character) this.extractor.getValue( null, this.bean )).charValue() );
} catch ( final Exception e ) {
fail( "Should not throw an exception" );
}
More information about the jboss-svn-commits
mailing list