package org.drools.chance.reteoo.nodes;
import org.drools.chance.evaluation.Evaluation;
import org.drools.chance.reteoo.ChanceActivation;
import org.drools.chance.reteoo.ChanceFactHandle;
import org.drools.chance.reteoo.tuples.ImperfectRuleTerminalNodeLeftTuple;
import org.drools.chance.reteoo.tuples.ImperfectTuple;
import org.drools.common.AgendaItem;
import org.drools.common.InternalAgenda;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.*;
import org.drools.reteoo.builder.BuildContext;
import org.drools.rule.GroupElement;
import org.drools.rule.Rule;
import org.drools.spi.PropagationContext;
public class ChanceRuleTerminalNode extends RuleTerminalNode {
public ChanceRuleTerminalNode() {
}
public ChanceRuleTerminalNode(int id, LeftTupleSource source, Rule rule, GroupElement subrule, int subruleIndex, BuildContext context) {
super(id, source, rule, subrule, subruleIndex, context);
}
@Override
public LeftTuple createLeftTuple( InternalFactHandle factHandle, LeftTupleSink sink, boolean leftTupleMemoryEnabled ) {
ImperfectRuleTerminalNodeLeftTuple tuple = new ImperfectRuleTerminalNodeLeftTuple( factHandle, sink, leftTupleMemoryEnabled );
int src = ( (LeftInputAdapterNode) this.getLeftTupleSource() ).getParentObjectSource().getId();
tuple.setEvaluation( ((ChanceFactHandle) factHandle ).getCachedEvaluation( src ) );
return tuple;
}
@Override
public LeftTuple createLeftTuple( LeftTuple leftTuple, LeftTupleSink sink, boolean leftTupleMemoryEnabled ) {
ImperfectRuleTerminalNodeLeftTuple tuple = new ImperfectRuleTerminalNodeLeftTuple(leftTuple, sink, leftTupleMemoryEnabled);
tuple.setEvaluation( ((ImperfectTuple) leftTuple ).getEvaluation( ) );
return tuple;
}
@Override
public LeftTuple createLeftTuple( LeftTuple leftTuple, RightTuple rightTuple, LeftTupleSink sink ) {
// ImperfectRuleTerminalNodeLeftTuple tuple = new ImperfectRuleTerminalNodeLeftTuple(leftTuple, rightTuple, sink);
//
// tuple.setEvaluation( ((ImperfectTuple) leftTuple ).getEvaluation( ) );
//
// return tuple;
throw new IllegalStateException( " Chance rule terminal nodes should not be called this way ! ");
}
@Override
public LeftTuple createLeftTuple(LeftTuple leftTuple, RightTuple rightTuple, LeftTuple currentLeftChild, LeftTuple currentRightChild, LeftTupleSink sink, boolean leftTupleMemoryEnabled) {
// ImperfectRuleTerminalNodeLeftTuple tuple = new ImperfectRuleTerminalNodeLeftTuple(leftTuple, rightTuple, currentLeftChild, currentRightChild, sink, leftTupleMemoryEnabled);
//
// tuple.setEvaluation( ((ImperfectTuple) leftTuple).getEvaluation( ) );
//
// return tuple;
throw new IllegalStateException( " Chance rule terminal nodes should not be called this way ! ");
}
public void assertLeftTuple(final LeftTuple leftTuple,
final PropagationContext context,
final InternalWorkingMemory workingMemory) {
if ( leftTuple instanceof ImperfectTuple ) {
Evaluation eval = ((ImperfectTuple) leftTuple).getEvaluation();
if ( eval != null && ! eval.getDegree().toBoolean() ) {
return;
}
}
super.assertLeftTuple( leftTuple, context, workingMemory );
}
public void modifyLeftTuple(LeftTuple leftTuple,
PropagationContext context,
InternalWorkingMemory workingMemory) {
Object o = leftTuple.getObject();
if ( o instanceof ChanceActivation ) {
((ChanceActivation) o ).setEvaluation( ((ImperfectTuple) leftTuple).getEvaluation() );
}
super.modifyLeftTuple( leftTuple, context, workingMemory );
}
// public LeftTupleSource unwrapTupleSource() {
// LeftTupleSource src = tupleSource;
// if ( tupleSource instanceof LogicalBetaOperatorNode ) {
// return ((LogicalBetaOperatorNode) src).getLeftTupleSource();
// }
// if ( tupleSource instanceof FromNode ) {
// return ((FromNode) src).getLeftTupleSource();
// }
// return src;
// }
}