use of org.drools.core.spi.Tuple in project drools by kiegroup.
the class PhreakQueryTerminalNode method doLeftInserts.
public void doLeftInserts(QueryTerminalNode qtnNode, InternalAgenda agenda, TupleSets<LeftTuple> srcLeftTuples, LinkedList<StackEntry> stack) {
for (LeftTuple leftTuple = srcLeftTuples.getInsertFirst(); leftTuple != null; ) {
LeftTuple next = leftTuple.getStagedNext();
// qtnNode.assertLeftTuple( leftTuple, leftTuple.getPropagationContext(), wm );
PropagationContext pCtx = RuleTerminalNode.findMostRecentPropagationContext(leftTuple, leftTuple.getPropagationContext());
// find the DroolsQuery object
Tuple rootEntry = leftTuple.getRootTuple();
DroolsQuery dquery = (DroolsQuery) rootEntry.getFactHandle().getObject();
dquery.setQuery(qtnNode.getQuery());
if (dquery.getStackEntry() != null) {
checkAndTriggerQueryReevaluation(agenda, stack, rootEntry, dquery);
}
// Add results to the adapter
dquery.getQueryResultCollector().rowAdded(qtnNode.getQuery(), leftTuple, pCtx, agenda.getWorkingMemory());
leftTuple.clearStaged();
leftTuple = next;
}
}
use of org.drools.core.spi.Tuple in project drools by kiegroup.
the class ReactiveList method set.
@Override
public T set(int index, T element) {
T previous = wrapped.set(index, element);
if (previous != element) {
// this is indeed intended != to check by reference
ReactiveObjectUtil.notifyModification(element, getLeftTuples(), ModificationType.ADD);
if (element instanceof ReactiveObject) {
for (Tuple lts : getLeftTuples()) {
((ReactiveObject) element).addLeftTuple(lts);
}
}
if (previous instanceof ReactiveObject) {
for (Tuple lts : getLeftTuples()) {
((ReactiveObject) previous).removeLeftTuple(lts);
}
}
ReactiveObjectUtil.notifyModification(previous, getLeftTuples(), ModificationType.REMOVE);
}
return previous;
}
use of org.drools.core.spi.Tuple in project drools by kiegroup.
the class ReactiveList method add.
@Override
public void add(int index, T element) {
wrapped.add(index, element);
ReactiveObjectUtil.notifyModification(element, getLeftTuples(), ModificationType.ADD);
if (element instanceof ReactiveObject) {
for (Tuple lts : getLeftTuples()) {
((ReactiveObject) element).addLeftTuple(lts);
}
}
}
use of org.drools.core.spi.Tuple in project drools by kiegroup.
the class ReactiveList method remove.
@Override
public T remove(int index) {
T result = wrapped.remove(index);
if (result instanceof ReactiveObject) {
for (Tuple lts : getLeftTuples()) {
((ReactiveObject) result).removeLeftTuple(lts);
}
}
ReactiveObjectUtil.notifyModification(result, getLeftTuples(), ModificationType.REMOVE);
return result;
}
use of org.drools.core.spi.Tuple in project drools by kiegroup.
the class RuleExecutor method fire.
private int fire(InternalWorkingMemory wm, InternalAgenda agenda, AgendaFilter filter, int fireCount, int fireLimit) {
int localFireCount = 0;
if (!tupleList.isEmpty()) {
if (!fireExitedEarly && isDeclarativeAgendaEnabled()) {
// Network Evaluation can notify meta rules, which should be given a chance to fire first
RuleAgendaItem nextRule = agenda.peekNextRule();
if (!isHigherSalience(nextRule)) {
fireExitedEarly = true;
return localFireCount;
}
}
RuleTerminalNode rtn = (RuleTerminalNode) pmem.getPathEndNode();
RuleImpl rule = rtn.getRule();
Tuple tuple = getNextTuple();
if (rule.isAllMatches()) {
fireConsequenceEvent(wm, agenda, (AgendaItem) tuple, DefaultAgenda.ON_BEFORE_ALL_FIRES_CONSEQUENCE_NAME);
}
Tuple lastTuple = null;
for (; tuple != null; lastTuple = tuple, tuple = getNextTuple()) {
// if the current Rule is no-loop and the origin rule is the same then return
if (cancelAndContinue(wm, rtn, rule, tuple, filter)) {
continue;
}
AgendaItem item = (AgendaItem) tuple;
if (agenda.getActivationsFilter() != null && !agenda.getActivationsFilter().accept(item, wm, rtn)) {
// only relevant for seralization, to not refire Matches already fired
continue;
}
fireActivation(wm, agenda, item);
localFireCount++;
if (rtn.getLeftTupleSource() == null) {
// The activation firing removed this rule from the rule base
break;
}
agenda.flushPropagations();
// dyanmic salience may have updated it, so get again.
int salience = ruleAgendaItem.getSalience();
if (queue != null && !queue.isEmpty() && salience != queue.peek().getSalience()) {
ruleAgendaItem.dequeue();
ruleAgendaItem.setSalience(queue.peek().getSalience());
ruleAgendaItem.getAgendaGroup().add(ruleAgendaItem);
}
if (!rule.isAllMatches()) {
// if firing rule is @All don't give way to other rules
if (haltRuleFiring(fireCount, fireLimit, localFireCount, agenda)) {
// another rule has high priority and is on the agenda, so evaluate it first
break;
}
if (!wm.isSequential()) {
reEvaluateNetwork(agenda);
}
}
}
if (rule.isAllMatches()) {
fireConsequenceEvent(wm, agenda, (AgendaItem) lastTuple, DefaultAgenda.ON_AFTER_ALL_FIRES_CONSEQUENCE_NAME);
}
}
removeRuleAgendaItemWhenEmpty(wm);
fireExitedEarly = false;
return localFireCount;
}
Aggregations