ObjectTypeNodes are responsible for filtering and propagating the matching fact assertions propagated from the Rete
node using ObjectType
interface. The assert and retract methods do not attempt to filter as this is the role of the Rete
node which builds up a cache of matching ObjectTypdeNodes
s for each asserted object, using the matches(Object object)
method. Incorrect propagation in these methods is not checked and will result in ClassCastExpcections
later on in the network.
Filters Objects
coming from the Rete
using a ObjectType
semantic module.
@see ObjectType
@see Rete
str += "ObjectTypeNode :\n";
str += "otn1, java.lang.Integer;\n";
NodeTestResult result = executeTest( str );
ObjectTypeNode otn1 = (ObjectTypeNode) result.context.get( "otn1" );
assertNotNull( otn1 );
assertEquals( new ClassObjectType( Integer.class ),
otn1.getObjectType() );
}
str += "LeftInputAdapterNode:\n";
str += " lian0, otn1;";
NodeTestResult result = executeTest( str );
ObjectTypeNode otn1 = (ObjectTypeNode) result.context.get( "otn1" );
LeftInputAdapterNode lian0 = (LeftInputAdapterNode) result.context.get( "lian0" );
assertNotNull( lian0 );
assertSame( lian0,
otn1.getSinkPropagator().getSinks()[0] );
}
} else {
epn.attach();
}
}
ObjectTypeNode otn = new ObjectTypeNode( context.getNextId(),
epn,
objectType,
context );
long expirationOffset = getExpiratioOffsetForType( context,
objectType );
otn.setExpirationOffset( expirationOffset );
if ( wms.length > 0 ) {
otn.attach( wms );
} else {
otn.attach();
}
return otn;
} finally {
ruleBase.readUnlock();
context.setObjectTypeNodeMemoryEnabled( false );
context.setAlphaNodeMemoryAllowed( false );
}
}
ObjectTypeNode otn = new ObjectTypeNode( context.getNextId(),
(EntryPointNode) context.getObjectSource(),
objectType,
context );
if ( objectType.isEvent() && EventProcessingOption.STREAM.equals( context.getRuleBase().getConfiguration().getEventProcessingMode() ) ) {
long expirationOffset = getExpiratioOffsetForType( context,
objectType );
if( expirationOffset != -1 ) {
// expiration policy is set, so use it
otn.setExpirationOffset( expirationOffset );
} else {
// otherwise calculate it based on behaviours and temporal constraints
for ( Behavior behavior : pattern.getBehaviors() ) {
if ( behavior.getExpirationOffset() != -1 ) {
expirationOffset = Math.max( behavior.getExpirationOffset(),
expirationOffset );
}
}
long distance = context.getTemporalDistance().getExpirationOffset( pattern );
if( distance == -1 ) {
// it means the rules have no temporal constraints, or
// the constraints require events to be hold forever. In this
// case, we allow type declarations to override the implicit
// expiration offset by defining an expiration policy with the
// @expires tag
otn.setExpirationOffset( expirationOffset );
} else {
otn.setExpirationOffset( Math.max( distance, expirationOffset ) );
}
}
}
context.setObjectSource( (ObjectSource) utils.attachNode( context,
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
List<ObjectTypeNode> nodes = ((InternalRuleBase)((KnowledgeBaseImpl)kbase).ruleBase).getRete().getObjectTypeNodes();
ObjectTypeNode node = null;
for ( ObjectTypeNode n : nodes ) {
if ( ((ClassObjectType)n.getObjectType()).getClassType() == Person.class ) {
node = n;
break;
}
}
ReteooWorkingMemory wm = ((StatefulKnowledgeSessionImpl)kbase.newStatefulKnowledgeSession()).session;
LeftInputAdapterNode liaNode = (LeftInputAdapterNode) node.getSinkPropagator().getSinks()[0];
JoinNode j2 = ( JoinNode ) liaNode.getSinkPropagator().getSinks()[0]; // $p2
JoinNode j3 = ( JoinNode ) j2.getSinkPropagator().getSinks()[0]; // $p3
SingleBetaConstraints c = ( SingleBetaConstraints ) j2.getRawConstraints();
assertEquals( "$name", ((VariableConstraint)c.getConstraint()).getRequiredDeclarations()[0].getIdentifier() );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
List<ObjectTypeNode> nodes = ((InternalRuleBase)((KnowledgeBaseImpl)kbase).ruleBase).getRete().getObjectTypeNodes();
ObjectTypeNode node = null;
for ( ObjectTypeNode n : nodes ) {
if ( ((ClassObjectType)n.getObjectType()).getClassType() == DroolsQuery.class ) {
node = n;
break;
}
}
ReteooWorkingMemory wm = ((StatefulKnowledgeSessionImpl)kbase.newStatefulKnowledgeSession()).session;
AlphaNode alphanode = ( AlphaNode ) node.getSinkPropagator().getSinks()[0];
LeftInputAdapterNode liaNode = (LeftInputAdapterNode) alphanode.getSinkPropagator().getSinks()[0];
JoinNode j = ( JoinNode ) liaNode.getSinkPropagator().getSinks()[0]; // $p2
TripleNonIndexSkipBetaConstraints c = ( TripleNonIndexSkipBetaConstraints ) j.getRawConstraints();
//assertEquals( "$name", ((VariableConstraint)c.getConstraint()).getRequiredDeclarations()[0].getIdentifier() );
str += "ObjectTypeNode :\n";
str += "otn1, java.lang.Integer;\n";
NodeTestResult result = executeTest( str );
ObjectTypeNode otn1 = (ObjectTypeNode) result.context.get( "otn1" );
assertNotNull( otn1 );
assertEquals( new ClassObjectType( Integer.class ),
otn1.getObjectType() );
}
str += "LeftInputAdapterNode:\n";
str += " lian0, otn1;";
NodeTestResult result = executeTest( str );
ObjectTypeNode otn1 = (ObjectTypeNode) result.context.get( "otn1" );
LeftInputAdapterNode lian0 = (LeftInputAdapterNode) result.context.get( "lian0" );
assertNotNull( lian0 );
assertSame( lian0,
otn1.getSinkPropagator().getSinks()[0] );
}
assertEquals( "r1", list.get(0) );
// Check it was built with MVELReturnValueExpression constraint
List<ObjectTypeNode> nodes = ((InternalRuleBase)((KnowledgeBaseImpl)kbase).ruleBase).getRete().getObjectTypeNodes();
ObjectTypeNode node = null;
for ( ObjectTypeNode n : nodes ) {
if ( ((ClassObjectType)n.getObjectType()).getClassType() == Person.class ) {
node = n;
break;
}
}
AlphaNode alphanode = (AlphaNode) node.getSinkPropagator().getSinks()[0];
assertTrue( (( VariableConstraint ) alphanode.getConstraint()).getFieldExtractor() instanceof ClassFieldReader );
ReturnValueRestriction r = (ReturnValueRestriction) (( VariableConstraint ) alphanode.getConstraint()).getRestriction();
assertTrue( r.getExpression() instanceof ReturnValueExpression );
assertTrue( r.getExpression() instanceof MVELReturnValueExpression );
assertEquals( "r1", list.get(0) );
// Check it was built with MVELReturnValueExpression constraint
List<ObjectTypeNode> nodes = ((InternalRuleBase)((KnowledgeBaseImpl)kbase).ruleBase).getRete().getObjectTypeNodes();
ObjectTypeNode node = null;
for ( ObjectTypeNode n : nodes ) {
if ( ((ClassObjectType)n.getObjectType()).getClassType() == Person.class ) {
node = n;
break;
}
}
AlphaNode alphanode = (AlphaNode) node.getSinkPropagator().getSinks()[0];
assertTrue( (( VariableConstraint ) alphanode.getConstraint()).getFieldExtractor() instanceof MVELClassFieldReader );
ReturnValueRestriction r = (ReturnValueRestriction) (( VariableConstraint ) alphanode.getConstraint()).getRestriction();
assertTrue( r.getExpression() instanceof ReturnValueExpression );
assertTrue( r.getExpression() instanceof MVELReturnValueExpression );
Related Classes of org.drools.reteoo.ObjectTypeNode$ExpireJobContextTimerOutputMarshaller
Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.