[
https://issues.jboss.org/browse/JBRULES-3622?page=com.atlassian.jira.plug...
]
Julian Klein updated JBRULES-3622:
----------------------------------
Description:
When trying to determine if two dates overlap using the "overlappedby" keyword
with parameters in a rule, Drools throws a ClassCastException. If I use another temporal
keyword such as "coincides" with parameters, the rule works as expected. I am
using a StatefulKnowledgeSession and this occurs after I insert facts into the session.
The facts I insert are of a different type than TimeBoxedFact. The LHS is as follows:
{code}
$encD : TimeBoxedFact(yearRecorded == durationCycleYear )
$encN : TimeBoxedFact( ID != $encD.ID, datetimeRecorded overlappedby[1ms,90d]
$encD.datetimeRecorded )
{code}
durationCycleYear is a global Integer equal to the four digit year (e.g. 2012 or 1998;
declared as follows "global Integer durationCycleYear;")
Here is what the TimeBoxedFact object looks like:
{code}
package com.company;
import java.io.Serializable;
import java.sql.Timestamp;
public class TimeBoxedFact implements Serializable{
protected Timestamp datetime = null;
protected int ID;
private static final long serialVersionUID = -7640003804511140444L;
public int getID() {
return this.ID;
}
public void setID(int id) {
this.ID = id;
}
public Timestamp getDatetimeRecorded() {
return this.datetime;
}
public java.util.Date getDateRecorded(){
return new java.util.Date(this.datetime.getTime());
}
public int getYearRecorded(){
return calendarDateRecorded.get(Calendar.YEAR);
}
public void setDatetimeRecorded(Timestamp dt) {
this.datetime = dt;
//create the calendar object
calendarDateRecorded = Calendar.getInstance();
calendarDateRecorded.setTimeInMillis(datetime.getTime());
}
}
{code}
The stack trace is as follows:
{code}
java.lang.ClassCastException: org.drools.common.DefaultFactHandle cannot be cast to
com.company.TimeBoxedFact
at
org.drools.base.com.company.TimeBoxedFact1639733674$getDatetimeRecorded.getValue(Unknown
Source)
at
org.drools.base.extractors.BaseObjectClassFieldReader.isNullValue(BaseObjectClassFieldReader.java:179)
at org.drools.base.ClassFieldReader.isNullValue(ClassFieldReader.java:179)
at
org.drools.rule.VariableRestriction$ObjectVariableContextEntry.updateFromTuple(VariableRestriction.java:327)
at
org.drools.common.DoubleBetaConstraints.updateFromTuple(DoubleBetaConstraints.java:137)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:84)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:71)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:98)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:145)
at org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:154)
at
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:364)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:337)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:298)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:888)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:847)
at
org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:269)
at com.company.RulesRunner.persistAndInsertBRE(RulesRunner.java:267)
at com.company.RulesRunner.runRules(RulesRunner.java:249)
at com.company.testProtocol_0_In90Days(Test025.java:205)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)
at
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
{code}
was:
When trying to determine if two dates overlap using the "overlappedby" keyword
with parameters in a rule, Drools throws a ClassCastException. If I use another temporal
keyword such as "coincides" with parameters, the rule works as expected. I am
using a StatefulKnowledgeSession and this occurs after I insert facts into the session.
The facts I insert are of a different type than TimeBoxedFact. The LHS is as follows:
{code}
$encD : TimeBoxedFact(yearRecorded == durationCycleYear )
$encN : TimeBoxedFact( ID != $encD.ID, datetimeRecorded coincides[1ms,90d]
$encD.datetimeRecorded )
{code}
durationCycleYear is a global Integer equal to the four digit year (e.g. 2012 or 1998;
declared as follows "global Integer durationCycleYear;")
Here is what the TimeBoxedFact object looks like:
{code}
package com.company;
import java.io.Serializable;
import java.sql.Timestamp;
public class TimeBoxedFact implements Serializable{
protected Timestamp datetime = null;
protected int ID;
private static final long serialVersionUID = -7640003804511140444L;
public int getID() {
return this.ID;
}
public void setID(int id) {
this.ID = id;
}
public Timestamp getDatetimeRecorded() {
return this.datetime;
}
public java.util.Date getDateRecorded(){
return new java.util.Date(this.datetime.getTime());
}
public int getYearRecorded(){
return calendarDateRecorded.get(Calendar.YEAR);
}
public void setDatetimeRecorded(Timestamp dt) {
this.datetime = dt;
//create the calendar object
calendarDateRecorded = Calendar.getInstance();
calendarDateRecorded.setTimeInMillis(datetime.getTime());
}
}
{code}
The stack trace is as follows:
{code}
java.lang.ClassCastException: org.drools.common.DefaultFactHandle cannot be cast to
com.company.TimeBoxedFact
at
org.drools.base.com.company.TimeBoxedFact1639733674$getDatetimeRecorded.getValue(Unknown
Source)
at
org.drools.base.extractors.BaseObjectClassFieldReader.isNullValue(BaseObjectClassFieldReader.java:179)
at org.drools.base.ClassFieldReader.isNullValue(ClassFieldReader.java:179)
at
org.drools.rule.VariableRestriction$ObjectVariableContextEntry.updateFromTuple(VariableRestriction.java:327)
at
org.drools.common.DoubleBetaConstraints.updateFromTuple(DoubleBetaConstraints.java:137)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:84)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:71)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:98)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:145)
at org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:154)
at
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:364)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:337)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:298)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:888)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:847)
at
org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:269)
at com.company.RulesRunner.persistAndInsertBRE(RulesRunner.java:267)
at com.company.RulesRunner.runRules(RulesRunner.java:249)
at com.company.testProtocol_0_In90Days(Test025.java:205)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)
at
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
{code}
ClassCastException When Using Temporal Operator overlappedby
------------------------------------------------------------
Key: JBRULES-3622
URL:
https://issues.jboss.org/browse/JBRULES-3622
Project: Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: drools-core (expert)
Affects Versions: 5.4.0.Final
Environment: Mac OSX 10.6.8, Java 6
Reporter: Julian Klein
Assignee: Mark Proctor
When trying to determine if two dates overlap using the "overlappedby" keyword
with parameters in a rule, Drools throws a ClassCastException. If I use another temporal
keyword such as "coincides" with parameters, the rule works as expected. I am
using a StatefulKnowledgeSession and this occurs after I insert facts into the session.
The facts I insert are of a different type than TimeBoxedFact. The LHS is as follows:
{code}
$encD : TimeBoxedFact(yearRecorded == durationCycleYear )
$encN : TimeBoxedFact( ID != $encD.ID, datetimeRecorded overlappedby[1ms,90d]
$encD.datetimeRecorded )
{code}
durationCycleYear is a global Integer equal to the four digit year (e.g. 2012 or 1998;
declared as follows "global Integer durationCycleYear;")
Here is what the TimeBoxedFact object looks like:
{code}
package com.company;
import java.io.Serializable;
import java.sql.Timestamp;
public class TimeBoxedFact implements Serializable{
protected Timestamp datetime = null;
protected int ID;
private static final long serialVersionUID = -7640003804511140444L;
public int getID() {
return this.ID;
}
public void setID(int id) {
this.ID = id;
}
public Timestamp getDatetimeRecorded() {
return this.datetime;
}
public java.util.Date getDateRecorded(){
return new java.util.Date(this.datetime.getTime());
}
public int getYearRecorded(){
return calendarDateRecorded.get(Calendar.YEAR);
}
public void setDatetimeRecorded(Timestamp dt) {
this.datetime = dt;
//create the calendar object
calendarDateRecorded = Calendar.getInstance();
calendarDateRecorded.setTimeInMillis(datetime.getTime());
}
}
{code}
The stack trace is as follows:
{code}
java.lang.ClassCastException: org.drools.common.DefaultFactHandle cannot be cast to
com.company.TimeBoxedFact
at
org.drools.base.com.company.TimeBoxedFact1639733674$getDatetimeRecorded.getValue(Unknown
Source)
at
org.drools.base.extractors.BaseObjectClassFieldReader.isNullValue(BaseObjectClassFieldReader.java:179)
at org.drools.base.ClassFieldReader.isNullValue(ClassFieldReader.java:179)
at
org.drools.rule.VariableRestriction$ObjectVariableContextEntry.updateFromTuple(VariableRestriction.java:327)
at
org.drools.common.DoubleBetaConstraints.updateFromTuple(DoubleBetaConstraints.java:137)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:84)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:71)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:98)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
at
org.drools.reteoo.SingleLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:145)
at org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:154)
at
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:364)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:337)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:298)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:888)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:847)
at
org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:269)
at com.company.RulesRunner.persistAndInsertBRE(RulesRunner.java:267)
at com.company.RulesRunner.runRules(RulesRunner.java:249)
at com.company.testProtocol_0_In90Days(Test025.java:205)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)
at
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira