Skip to content

Commit

Permalink
minor performances improvements (#5487)
Browse files Browse the repository at this point in the history
* minor performances improvements

* wip

* wip

* wip

* wip
  • Loading branch information
mariofusco committed Aug 25, 2023
1 parent 977bcfb commit 3de05e0
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,29 @@

package org.drools.core.common;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collections;
import java.util.List;

import org.drools.base.base.ClassObjectType;
import org.drools.base.base.ObjectType;
import org.drools.base.definitions.InternalKnowledgePackage;
import org.drools.base.definitions.rule.impl.RuleImpl;
import org.drools.core.marshalling.MarshallerReaderContext;
import org.drools.base.reteoo.PropertySpecificUtil;
import org.drools.core.reteoo.TerminalNode;
import org.drools.base.rule.EntryPointId;
import org.drools.base.rule.TypeDeclaration;
import org.drools.base.base.ObjectType;
import org.drools.core.marshalling.MarshallerReaderContext;
import org.drools.core.reteoo.TerminalNode;
import org.drools.core.util.bitmask.BitMask;
import org.kie.api.runtime.rule.FactHandle;

import static org.drools.base.reteoo.PropertySpecificUtil.*;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collections;
import java.util.List;

import static org.drools.base.reteoo.PropertySpecificUtil.allSetBitMask;
import static org.drools.base.reteoo.PropertySpecificUtil.getEmptyPropertyReactiveMask;
import static org.drools.base.reteoo.PropertySpecificUtil.isAllSetPropertyReactiveMask;
import static org.drools.base.reteoo.PropertySpecificUtil.isPropertySetOnMask;
import static org.drools.base.reteoo.PropertySpecificUtil.setPropertyOnMask;

public class PhreakPropagationContext
implements
Expand Down Expand Up @@ -208,10 +212,6 @@ public BitMask getModificationMask() {
return modificationMask;
}

public void setModificationMask( BitMask modificationMask ) {
this.modificationMask = modificationMask;
}

public PropagationContext adaptModificationMaskForObjectType(ObjectType type, ReteEvaluator reteEvaluator) {
if (isAllSetPropertyReactiveMask(originalMask) || originalMask.isSet(PropertySpecificUtil.TRAITABLE_BIT) || !(type instanceof ClassObjectType)) {
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,16 @@

package org.drools.core.common;

import java.io.Externalizable;

import org.drools.base.base.ObjectType;
import org.drools.base.definitions.rule.impl.RuleImpl;
import org.drools.base.rule.EntryPointId;
import org.drools.core.marshalling.MarshallerReaderContext;
import org.drools.core.reteoo.TerminalNode;
import org.drools.base.rule.EntryPointId;
import org.drools.base.base.ObjectType;
import org.drools.core.util.bitmask.BitMask;
import org.kie.api.runtime.rule.FactHandle;

import java.io.Externalizable;

public interface PropagationContext extends Externalizable {

enum Type {
Expand All @@ -50,7 +50,6 @@ enum Type {

BitMask getModificationMask();
PropagationContext adaptModificationMaskForObjectType(ObjectType type, ReteEvaluator reteEvaluator);
void setModificationMask(BitMask mask);

MarshallerReaderContext getReaderContext();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,14 @@ public static void doLeftTupleInsert(TerminalNode rtnNode, RuleExecutor executor
return;
}

PropagationContext pctx = leftTuple.findMostRecentPropagationContext();

if ( rtnNode.getRule().isNoLoop() && sameRules(rtnNode, pctx.getTerminalNodeOrigin()) ) {
return;
PropagationContext pctx;
if ( rtnNode.getRule().isNoLoop() ) {
pctx = leftTuple.findMostRecentPropagationContext();
if ( sameRules(rtnNode, pctx.getTerminalNodeOrigin()) ) {
return;
}
} else {
pctx = leftTuple.getPropagationContext();
}

int salienceInt = getSalienceValue(rtnNode, ruleAgendaItem, (InternalMatch) leftTuple, reteEvaluator);
Expand All @@ -111,8 +115,8 @@ public static void doLeftTupleInsert(TerminalNode rtnNode, RuleExecutor executor

activationsManager.getAgendaEventSupport().fireActivationCreated(rtnLeftTuple, activationsManager.getReteEvaluator());

if ( rtnNode.getRule().isLockOnActive() &&
leftTuple.getPropagationContext().getType() != PropagationContext.Type.RULE_ADDITION ) {
if ( rtnNode.getRule().isLockOnActive() && pctx.getType() != PropagationContext.Type.RULE_ADDITION ) {
pctx = leftTuple.findMostRecentPropagationContext();
InternalAgendaGroup agendaGroup = executor.getRuleAgendaItem().getAgendaGroup();
if (blockedByLockOnActive(rtnNode.getRule(), pctx, agendaGroup)) {
activationsManager.getAgendaEventSupport().fireActivationCancelled(rtnLeftTuple, reteEvaluator, MatchCancelledCause.FILTER );
Expand Down Expand Up @@ -179,15 +183,18 @@ public static void doLeftTupleUpdate(TerminalNode rtnNode, RuleExecutor executor
return;
}

PropagationContext pctx = leftTuple.findMostRecentPropagationContext();
PropagationContext pctx = leftTuple.getPropagationContext();

boolean blocked = false;
if( executor.isDeclarativeAgendaEnabled() ) {
if ( executor.isDeclarativeAgendaEnabled() ) {
if ( rtnLeftTuple.hasBlockers() ) {
blocked = true; // declarativeAgenda still blocking LeftTuple, so don't add back ot list
}
} else {
blocked = rtnNode.getRule().isNoLoop() && rtnNode.equals(pctx.getTerminalNodeOrigin());
if (rtnNode.getRule().isNoLoop()) {
pctx = leftTuple.findMostRecentPropagationContext();
blocked = rtnNode.equals(pctx.getTerminalNodeOrigin());
}
}

int salienceInt = getSalienceValue(rtnNode, executor.getRuleAgendaItem(), (InternalMatch) leftTuple, reteEvaluator);
Expand All @@ -199,9 +206,8 @@ public static void doLeftTupleUpdate(TerminalNode rtnNode, RuleExecutor executor

if ( !blocked ) {
boolean addToExector = true;
if ( rtnNode.getRule().isLockOnActive() &&
pctx.getType() != PropagationContext.Type.RULE_ADDITION ) {

if ( rtnNode.getRule().isLockOnActive() && pctx.getType() != PropagationContext.Type.RULE_ADDITION ) {
pctx = leftTuple.findMostRecentPropagationContext();
InternalAgendaGroup agendaGroup = executor.getRuleAgendaItem().getAgendaGroup();
if (blockedByLockOnActive(rtnNode.getRule(), pctx, agendaGroup)) {
addToExector = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@

package org.drools.core.phreak;

import java.util.Date;
import java.util.List;

import org.drools.base.common.NetworkNode;
import org.drools.base.time.JobHandle;
import org.drools.base.time.Trigger;
import org.drools.base.time.impl.Timer;
import org.drools.core.common.ActivationsManager;
import org.drools.core.common.InternalFactHandle;
import org.drools.base.common.NetworkNode;
import org.drools.core.common.PropagationContext;
import org.drools.core.common.ReteEvaluator;
import org.drools.core.common.TupleSets;
Expand All @@ -36,11 +36,8 @@
import org.drools.core.reteoo.Tuple;
import org.drools.core.time.Job;
import org.drools.core.time.JobContext;
import org.drools.base.time.JobHandle;
import org.drools.core.time.TimerService;
import org.drools.base.time.Trigger;
import org.drools.core.time.impl.DefaultJobHandle;
import org.drools.base.time.impl.Timer;
import org.drools.core.util.LinkedList;
import org.drools.core.util.index.TupleList;
import org.kie.api.definition.rule.Rule;
Expand All @@ -49,6 +46,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.List;

import static org.drools.core.phreak.BuildtimeSegmentUtilities.nextNodePosMask;
import static org.drools.core.phreak.RuleNetworkEvaluator.normalizeStagedTuples;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,10 @@ private boolean haltRuleFiring(int fireCount,
activationsManager.evaluateEagerList();

RuleAgendaItem nextRule = activationsManager.peekNextRule();
return nextRule != null && (!ruleAgendaItem.getAgendaGroup().equals( nextRule.getAgendaGroup() ) || !isHigherSalience(nextRule));
if (nextRule == ruleAgendaItem || nextRule == null) {
return false;
}
return !ruleAgendaItem.getAgendaGroup().equals( nextRule.getAgendaGroup() ) || !isHigherSalience(nextRule);
}

private boolean isHigherSalience(RuleAgendaItem nextRule) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -665,8 +665,4 @@ public Collection<Object> getAccumulatedObjects() {
}
return result;
}

public InternalFactHandle getFactHandle() {
return (InternalFactHandle) super.getFactHandle();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,33 @@

package org.drools.core.reteoo;

import java.util.List;

import org.drools.base.definitions.rule.impl.QueryImpl;
import org.drools.base.definitions.rule.impl.RuleImpl;
import org.drools.base.reteoo.NodeTypeEnums;
import org.drools.base.rule.Declaration;
import org.drools.base.rule.QueryArgument;
import org.drools.base.rule.QueryElement;
import org.drools.core.RuleBaseConfiguration;
import org.drools.core.base.DroolsQueryImpl;
import org.drools.core.base.InternalViewChangedEventListener;
import org.drools.core.common.InternalFactHandle;
import org.drools.core.common.Memory;
import org.drools.core.common.MemoryFactory;
import org.drools.core.common.PropagationContext;
import org.drools.core.common.QueryElementFactHandle;
import org.drools.core.common.ReteEvaluator;
import org.drools.core.common.TupleSets;
import org.drools.core.common.TupleSetsImpl;
import org.drools.core.common.UpdateContext;
import org.drools.base.definitions.rule.impl.RuleImpl;
import org.drools.core.phreak.BuildtimeSegmentUtilities;
import org.drools.core.phreak.StackEntry;
import org.drools.core.reteoo.builder.BuildContext;
import org.drools.base.rule.Declaration;
import org.drools.base.rule.QueryArgument;
import org.drools.base.rule.QueryElement;
import org.drools.base.definitions.rule.impl.QueryImpl;
import org.drools.core.rule.consequence.InternalMatch;
import org.drools.core.common.PropagationContext;
import org.drools.core.util.AbstractBaseLinkedListNode;
import org.kie.api.runtime.rule.FactHandle;

import java.util.List;

public class QueryElementNode extends LeftTupleSource implements LeftTupleSinkNode, MemoryFactory<QueryElementNode.QueryElementNodeMemory> {

private LeftTupleSinkNode previousTupleSinkNode;
Expand Down Expand Up @@ -268,7 +268,7 @@ public void rowAdded(RuleImpl rule, LeftTuple resultLeftTuple, ReteEvaluator ret
objects[variable] = decl.getValue(reteEvaluator, resultLeftTuple);
}

QueryElementFactHandle resultHandle = createQueryResultHandle(leftTuple.findMostRecentPropagationContext(),
QueryElementFactHandle resultHandle = createQueryResultHandle(leftTuple.getPropagationContext(),
reteEvaluator,
objects);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public class RuleTerminalNodeLeftTuple extends LeftTuple implements InternalMatc
private Runnable callback;

private RuleImpl rule;
private Consequence consequence;

public RuleTerminalNodeLeftTuple() {
// constructor needed for serialisation
Expand Down Expand Up @@ -138,7 +139,12 @@ public void update(final int salience,
@Override
protected void setSink(Sink sink) {
super.setSink(sink);
this.rule = getTerminalNode().getRule();
TerminalNode terminalNode = (TerminalNode) sink;
this.rule = terminalNode.getRule();
if (this.rule != null && terminalNode instanceof RuleTerminalNode) {
String consequenceName = ((RuleTerminalNode)terminalNode).getConsequenceName();
this.consequence = consequenceName.equals(RuleImpl.DEFAULT_CONSEQUENCE_NAME) ? rule.getConsequence() : rule.getNamedConsequence(consequenceName);
}
}

/**
Expand All @@ -151,8 +157,7 @@ public RuleImpl getRule() {
}

public Consequence getConsequence() {
String consequenceName = ((RuleTerminalNode) getTerminalNode()).getConsequenceName();
return consequenceName.equals(RuleImpl.DEFAULT_CONSEQUENCE_NAME) ? getRule().getConsequence() : getRule().getNamedConsequence(consequenceName);
return consequence;
}

/**
Expand Down

0 comments on commit 3de05e0

Please sign in to comment.