use of org.drools.core.reteoo.RuleTerminalNodeLeftTuple in project drools by kiegroup.
the class PhreakRuleTerminalNode method doLeftTupleInsert.
public static void doLeftTupleInsert(TerminalNode rtnNode, RuleExecutor executor, InternalAgenda agenda, RuleAgendaItem ruleAgendaItem, int salienceInt, Salience salience, LeftTuple leftTuple) {
PropagationContext pctx = leftTuple.getPropagationContext();
pctx = RuleTerminalNode.findMostRecentPropagationContext(leftTuple, pctx);
if (rtnNode.getRule().isNoLoop() && rtnNode.equals(pctx.getTerminalNodeOrigin())) {
return;
}
InternalWorkingMemory wm = agenda.getWorkingMemory();
if (salience != null) {
salienceInt = salience.getValue(new DefaultKnowledgeHelper((AgendaItem) leftTuple, wm), rtnNode.getRule(), wm);
}
RuleTerminalNodeLeftTuple rtnLeftTuple = (RuleTerminalNodeLeftTuple) leftTuple;
agenda.createAgendaItem(rtnLeftTuple, salienceInt, pctx, ruleAgendaItem, ruleAgendaItem.getAgendaGroup());
EventSupport es = (EventSupport) wm;
es.getAgendaEventSupport().fireActivationCreated(rtnLeftTuple, wm);
if (rtnNode.getRule().isLockOnActive() && leftTuple.getPropagationContext().getType() != PropagationContext.Type.RULE_ADDITION) {
long handleRecency = pctx.getFactHandle().getRecency();
InternalAgendaGroup agendaGroup = executor.getRuleAgendaItem().getAgendaGroup();
if (blockedByLockOnActive(rtnNode.getRule(), pctx, handleRecency, agendaGroup)) {
es.getAgendaEventSupport().fireActivationCancelled(rtnLeftTuple, wm, MatchCancelledCause.FILTER);
return;
}
}
if (agenda.getActivationsFilter() != null && !agenda.getActivationsFilter().accept(rtnLeftTuple, wm, rtnNode)) {
// only relevant for seralization, to not refire Matches already fired
return;
}
agenda.addItemToActivationGroup(rtnLeftTuple);
executor.addLeftTuple(leftTuple);
// increased here, decreased in Agenda's cancelActivation and fireActivation
leftTuple.increaseActivationCountForEvents();
if (!rtnNode.isFireDirect() && executor.isDeclarativeAgendaEnabled()) {
agenda.insertAndStageActivation(rtnLeftTuple);
}
}
Aggregations