From 512c5774ce8950bf0fd00a6d7d1019352a597451 Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Tue, 20 Jun 2023 11:12:40 +0200 Subject: [PATCH 1/7] First step of replacing options --- .../drools/core/RuleSessionConfiguration.java | 44 +++++++++---------- .../core/common/AgendaGroupQueueImpl.java | 3 +- .../core/common/InternalWorkingMemory.java | 3 +- .../core/phreak/PhreakAccumulateNode.java | 3 +- .../core/phreak/PhreakRuleTerminalNode.java | 5 ++- .../drools/core/phreak/PhreakTimerNode.java | 5 ++- .../org/drools/core/phreak/RuleExecutor.java | 3 +- .../kiesession/agenda/DefaultAgenda.java | 5 ++- .../entrypoints/NamedEntryPoint.java | 3 +- .../session/StatefulKnowledgeSessionImpl.java | 5 ++- .../consequence/LambdaConsequence.java | 5 ++- .../integrationtests/AccumulateTest.java | 3 +- 12 files changed, 49 insertions(+), 38 deletions(-) diff --git a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java index ac7b3617558..dbaeb53d986 100644 --- a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java +++ b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java @@ -99,51 +99,60 @@ private void init() { setQueryListenerOption( QueryListenerOption.determineQueryListenerClassOption( getPropertyValue( QueryListenerOption.PROPERTY_NAME, QueryListenerOption.STANDARD.getAsString() ) ) ); } - public void setDirectFiring(boolean directFiring) { + private void setDirectFiring(boolean directFiring) { checkCanChange(); // throws an exception if a change isn't possible; this.directFiring = directFiring; } - public boolean isDirectFiring() { + private boolean isDirectFiring() { return this.directFiring; } - public void setThreadSafe(boolean threadSafe) { + private void setThreadSafe(boolean threadSafe) { checkCanChange(); // throws an exception if a change isn't possible; this.threadSafe = threadSafe; } - public boolean isThreadSafe() { + private boolean isThreadSafe() { return this.threadSafe; } - public void setAccumulateNullPropagation(boolean accumulateNullPropagation) { + private void setAccumulateNullPropagation(boolean accumulateNullPropagation) { checkCanChange(); // throws an exception if a change isn't possible; this.accumulateNullPropagation = accumulateNullPropagation; } - public boolean isAccumulateNullPropagation() { + private boolean isAccumulateNullPropagation() { return this.accumulateNullPropagation; } - public void setForceEagerActivationFilter(ForceEagerActivationFilter forceEagerActivationFilter) { - checkCanChange(); // throws an exception if a change isn't possible; - this.forceEagerActivationFilter = forceEagerActivationFilter; + private QueryListenerOption getQueryListenerOption() { + return this.queryListener; } - public ForceEagerActivationFilter getForceEagerActivationFilter() { - return this.forceEagerActivationFilter; + private void setQueryListenerOption( QueryListenerOption queryListener ) { + checkCanChange(); + this.queryListener = queryListener; } - public void setTimedRuleExecutionFilter(TimedRuleExecutionFilter timedRuleExecutionFilter) { + private void setTimedRuleExecutionFilter(TimedRuleExecutionFilter timedRuleExecutionFilter) { checkCanChange(); // throws an exception if a change isn't possible; this.timedRuleExecutionFilter = timedRuleExecutionFilter; } - public TimedRuleExecutionFilter getTimedRuleExecutionFilter() { + private TimedRuleExecutionFilter getTimedRuleExecutionFilter() { return this.timedRuleExecutionFilter; } + private void setForceEagerActivationFilter(ForceEagerActivationFilter forceEagerActivationFilter) { + checkCanChange(); // throws an exception if a change isn't possible; + this.forceEagerActivationFilter = forceEagerActivationFilter; + } + + public ForceEagerActivationFilter getForceEagerActivationFilter() { + return this.forceEagerActivationFilter; + } + public BeliefSystemType getBeliefSystemType() { return this.beliefSystemType; } @@ -153,15 +162,6 @@ public void setBeliefSystemType(BeliefSystemType beliefSystemType) { this.beliefSystemType = beliefSystemType; } - public QueryListenerOption getQueryListenerOption() { - return this.queryListener; - } - - public void setQueryListenerOption( QueryListenerOption queryListener ) { - checkCanChange(); - this.queryListener = queryListener; - } - public final void setOption(T option) { switch (option.propertyName()) { diff --git a/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java b/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java index 99aa7325c81..92a37f52d68 100644 --- a/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java +++ b/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java @@ -30,6 +30,7 @@ import org.drools.core.util.ArrayQueue; import org.drools.core.util.Queue; import org.drools.core.util.QueueFactory; +import org.kie.api.runtime.conf.DirectFiringOption; /** * AgendaGroup implementation that uses a PriorityQueue to prioritise the evaluation of added @@ -89,7 +90,7 @@ public String getName() { public void setReteEvaluator(ReteEvaluator reteEvaluator) { this.reteEvaluator = reteEvaluator; // workingMemory can be null during deserialization - if (reteEvaluator != null && reteEvaluator.getRuleSessionConfiguration().isDirectFiring()) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { this.priorityQueue = new ArrayQueue<>(); } else { this.priorityQueue = QueueFactory.createQueue(RuleAgendaConflictResolver.INSTANCE); diff --git a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java index af13b91d4b5..f8670a7361b 100644 --- a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java +++ b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java @@ -29,6 +29,7 @@ import org.drools.core.runtime.process.InternalProcessRuntime; import org.drools.core.rule.consequence.InternalMatch; import org.kie.api.runtime.Channel; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.EntryPoint; public interface InternalWorkingMemory @@ -121,6 +122,6 @@ default FactHandleClassStore getStoreForClass(Class clazz) { void cancelActivation(InternalMatch internalMatch, boolean declarativeAgenda); default boolean isThreadSafe() { - return getRuleSessionConfiguration().isThreadSafe(); + return getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES; } } diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java index df200e51249..e3c479ebb6c 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java @@ -37,6 +37,7 @@ import org.drools.core.reteoo.Tuple; import org.drools.core.util.AbstractHashTable; import org.drools.core.util.FastIterator; +import org.kie.api.runtime.conf.AccumulateNullPropagationOption; import org.kie.api.runtime.rule.FactHandle; import static org.drools.core.phreak.RuleNetworkEvaluator.normalizeStagedTuples; @@ -633,7 +634,7 @@ protected void evaluateResultConstraints(final AccumulateNode accNode, Object result = accumulate.getResult(memory.workingMemoryContext, accctx, leftTuple, reteEvaluator); propagateResult( accNode, sink, leftTuple, context, reteEvaluator, memory, trgLeftTuples, stagedLeftTuples, - null, result, (AccumulateContextEntry) accctx, propagationContext, reteEvaluator.getRuleSessionConfiguration().isAccumulateNullPropagation()); + null, result, (AccumulateContextEntry) accctx, propagationContext, reteEvaluator.getRuleSessionConfiguration().getOption(AccumulateNullPropagationOption.KEY) == AccumulateNullPropagationOption.YES); } protected final void propagateResult(AccumulateNode accNode, LeftTupleSink sink, LeftTuple leftTuple, PropagationContext context, diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java index 2ae181fb55e..10991abdf9c 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java @@ -32,6 +32,7 @@ import org.drools.core.rule.consequence.InternalMatch; import org.kie.api.definition.rule.Rule; import org.kie.api.event.rule.MatchCancelledCause; +import org.kie.api.runtime.conf.DirectFiringOption; /** * Created with IntelliJ IDEA. @@ -93,7 +94,7 @@ public static void doLeftTupleInsert(TerminalNode rtnNode, RuleExecutor executor ActivationsManager activationsManager, RuleAgendaItem ruleAgendaItem, LeftTuple leftTuple) { ReteEvaluator reteEvaluator = activationsManager.getReteEvaluator(); - if ( reteEvaluator.getRuleSessionConfiguration().isDirectFiring() ) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { executor.addLeftTuple(leftTuple); return; } @@ -172,7 +173,7 @@ public static void doLeftTupleUpdate(TerminalNode rtnNode, RuleExecutor executor RuleTerminalNodeLeftTuple rtnLeftTuple = (RuleTerminalNodeLeftTuple) leftTuple; ReteEvaluator reteEvaluator = activationsManager.getReteEvaluator(); - if ( reteEvaluator.getRuleSessionConfiguration().isDirectFiring() ) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { if (!rtnLeftTuple.isQueued() ) { executor.addLeftTuple( leftTuple ); reteEvaluator.getRuleEventSupport().onUpdateMatch( rtnLeftTuple ); diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java index 44a295b41c4..45d473adf17 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java @@ -46,6 +46,7 @@ import org.kie.api.definition.rule.Rule; import org.kie.api.runtime.Calendars; import org.kie.api.runtime.conf.TimedRuleExecutionFilter; +import org.kie.api.runtime.conf.TimedRuleExecutionOption; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -376,7 +377,7 @@ private TimerAction( TimerNodeJobContext timerJobCtx ) { @Override public boolean requiresImmediateFlushing() { - return timerJobCtx.getReteEvaluator().getRuleSessionConfiguration().getTimedRuleExecutionFilter() != null; + return timerJobCtx.getReteEvaluator().getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY) != null; } @Override @@ -404,7 +405,7 @@ public void execute( final ReteEvaluator reteEvaluator, boolean needEvaluation ) timerJobCtx.getTimerNodeMemory().setNodeDirtyWithoutNotify(); - TimedRuleExecutionFilter filter = reteEvaluator.getRuleSessionConfiguration().getTimedRuleExecutionFilter(); + TimedRuleExecutionFilter filter = (TimedRuleExecutionFilter) reteEvaluator.getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY); needEvaluation &= filter != null; for (final PathMemory pmem : timerJobCtx.getPathMemories()) { diff --git a/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java b/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java index c41174eae9f..e91c079928c 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java +++ b/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java @@ -39,6 +39,7 @@ import org.drools.core.util.index.TupleList; import org.kie.api.event.rule.BeforeMatchFiredEvent; import org.kie.api.event.rule.MatchCancelledCause; +import org.kie.api.runtime.conf.DirectFiringOption; import org.kie.api.runtime.rule.AgendaFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,7 +89,7 @@ public int evaluateNetworkAndFire( ActivationsManager activationsManager, reEvaluateNetwork( activationsManager ); - if ( reteEvaluator.getRuleSessionConfiguration().isDirectFiring() ) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { RuleTerminalNode rtn = (RuleTerminalNode) pmem.getPathEndNode(); RuleImpl rule = rtn.getRule(); int directFirings = tupleList.size(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java index df8599620f4..ab1e5422157 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java @@ -71,6 +71,7 @@ import org.drools.wiring.api.ComponentsFactory; import org.kie.api.conf.EventProcessingOption; import org.kie.api.event.rule.MatchCancelledCause; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.AgendaFilter; import org.kie.api.runtime.rule.AgendaGroup; import org.slf4j.Logger; @@ -209,7 +210,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { this.workingMemory = workingMemory; this.agendaGroupsManager.setReteEvaluator( workingMemory ); - if ( !workingMemory.getRuleSessionConfiguration().isThreadSafe() ) { + if (workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.NO) { executionStateMachine = new UnsafeExecutionStateMachine(); } @@ -218,7 +219,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { } protected PropagationList createPropagationList() { - if (!workingMemory.getRuleSessionConfiguration().isThreadSafe()) { + if (workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.NO) { return new ThreadUnsafePropagationList( workingMemory ); } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java index ef9c6ef273b..2b0cbc1b8f7 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java @@ -48,6 +48,7 @@ import org.drools.core.util.bitmask.AllSetBitMask; import org.drools.core.util.bitmask.BitMask; import org.kie.api.conf.KieBaseMutabilityOption; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.FactHandle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,7 +108,7 @@ public NamedEntryPoint(EntryPointId entryPoint, this.entryPointNode = entryPointNode; this.reteEvaluator = reteEvaluator; this.ruleBase = this.reteEvaluator.getKnowledgeBase(); - this.lock = reteEvaluator.getRuleSessionConfiguration().isThreadSafe() ? new ReentrantLock() : null; + this.lock = reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES ? new ReentrantLock() : null; this.handleFactory = this.reteEvaluator.getFactHandleFactory(); RuleBaseConfiguration conf = this.ruleBase.getRuleBaseConfiguration(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java index d9536eba62e..de4f7e8691d 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java @@ -124,6 +124,7 @@ import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.runtime.RequestContext; import org.kie.api.runtime.conf.QueryListenerOption; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.process.ProcessInstance; import org.kie.api.runtime.process.WorkItemHandler; import org.kie.api.runtime.process.WorkItemManager; @@ -1508,7 +1509,7 @@ public long getTotalFactCount() { */ @Override public void startOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().isThreadSafe() && this.opCounter.getAndIncrement() == 0 ) { + if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES && this.opCounter.getAndIncrement() == 0 ) { // means the engine was idle, reset the timestamp this.lastIdleTimestamp.set(-1); } @@ -1530,7 +1531,7 @@ public void setEndOperationListener(EndOperationListener listener) { */ @Override public void endOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().isThreadSafe() && this.opCounter.decrementAndGet() == 0 ) { + if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES && this.opCounter.decrementAndGet() == 0 ) { // means the engine is idle, so, set the timestamp if (this.timerService != null) { this.lastIdleTimestamp.set(this.timerService.getCurrentTime()); diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java index b881816b9be..f84e896330f 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java @@ -30,6 +30,7 @@ import org.drools.core.reteoo.RuleTerminalNode; import org.drools.core.rule.consequence.KnowledgeHelper; import org.drools.model.Variable; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.FactHandle; public class LambdaConsequence implements Consequence { @@ -124,7 +125,7 @@ private Object[] fetchFacts( KnowledgeHelper knowledgeHelper, ValueResolver valu Object[] facts; FactHandleLookup fhLookup = null; - if (reteEvaluator.getRuleSessionConfiguration().isThreadSafe()) { + if (reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES) { if ( consequence.isUsingDrools() ) { facts = new Object[consequence.getVariables().length + 1]; fhLookup = FactHandleLookup.create( factSuppliers.length ); @@ -216,7 +217,7 @@ private Object[] initConsequence( KnowledgeHelper knowledgeHelper, ReteEvaluator this.globalSuppliers = globalSuppliers.isEmpty() ? null : globalSuppliers.toArray( new GlobalSupplier[globalSuppliers.size()] ); this.factSuppliers = factSuppliers.toArray( new TupleFactSupplier[factSuppliers.size()] ); - if (!reteEvaluator.getRuleSessionConfiguration().isThreadSafe()) { + if (reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.NO) { this.facts = facts; this.fhLookup = fhLookup; } diff --git a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java index c4428b9775a..ea8d1f53ec7 100644 --- a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java +++ b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java @@ -57,6 +57,7 @@ import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.KieSessionConfiguration; +import org.kie.api.runtime.conf.AccumulateNullPropagationOption; import org.kie.api.runtime.rule.AccumulateFunction; import org.kie.api.runtime.rule.FactHandle; import org.kie.api.runtime.rule.Match; @@ -3674,7 +3675,7 @@ public void testAverageWithNoFacts() throws Exception { kieSession.delete( fh ); // changed by DROOLS-6064 - if ((kieSession.getSessionConfiguration().as(RuleSessionConfiguration.KEY)).isAccumulateNullPropagation()) { + if (kieSession.getSessionConfiguration().as(RuleSessionConfiguration.KEY).getOption(AccumulateNullPropagationOption.KEY) == AccumulateNullPropagationOption.YES) { assertThat(kieSession.fireAllRules()).isEqualTo(1); assertThat(list.size()).isEqualTo(1); assertThat(list.get(0)).isNull(); From aad0773c1d2fd2b13e307259e3683843f04a01bb Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Fri, 23 Jun 2023 10:50:31 +0200 Subject: [PATCH 2/7] Fix for TimedRuleExecutionOption --- .../drools/core/RuleSessionConfiguration.java | 23 +++++++++++-------- .../drools/core/phreak/PhreakTimerNode.java | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java index dbaeb53d986..3a7e9affa04 100644 --- a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java +++ b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java @@ -34,7 +34,6 @@ import org.kie.api.runtime.conf.QueryListenerOption; import org.kie.api.runtime.conf.SingleValueKieSessionOption; import org.kie.api.runtime.conf.ThreadSafeOption; -import org.kie.api.runtime.conf.TimedRuleExecutionFilter; import org.kie.api.runtime.conf.TimedRuleExecutionOption; import org.kie.internal.conf.CompositeConfiguration; import org.kie.internal.conf.InternalPropertiesConfiguration; @@ -54,11 +53,12 @@ public class RuleSessionConfiguration extends BaseConfiguration void setOption(T option) { break; } case TimedRuleExecutionOption.PROPERTY_NAME: { - setTimedRuleExecutionFilter(((TimedRuleExecutionOption) option).getFilter()); + setTimedRuleExecutionFilter(((TimedRuleExecutionOption) option)); break; } case QueryListenerOption.PROPERTY_NAME: { @@ -210,6 +210,9 @@ public final T getOption(OptionKey op case AccumulateNullPropagationOption.PROPERTY_NAME: { return (T) (isAccumulateNullPropagation() ? AccumulateNullPropagationOption.YES : AccumulateNullPropagationOption.NO); } + case TimedRuleExecutionOption.PROPERTY_NAME: { + return (T) getTimedRuleExecutionOption(); + } case QueryListenerOption.PROPERTY_NAME: { return (T) getQueryListenerOption(); } @@ -250,7 +253,7 @@ public boolean setInternalProperty(String name, String value) { break; } case TimedRuleExecutionOption.PROPERTY_NAME: { - setTimedRuleExecutionFilter(TimedRuleExecutionOption.resolve(StringUtils.isEmpty(value) ? "false" : value).getFilter()); + setTimedRuleExecutionFilter(TimedRuleExecutionOption.resolve(StringUtils.isEmpty(value) ? "false" : value)); break; } case QueryListenerOption.PROPERTY_NAME: { diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java index 45d473adf17..94f4ee09dc8 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakTimerNode.java @@ -377,7 +377,7 @@ private TimerAction( TimerNodeJobContext timerJobCtx ) { @Override public boolean requiresImmediateFlushing() { - return timerJobCtx.getReteEvaluator().getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY) != null; + return timerJobCtx.getReteEvaluator().getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY).getFilter() != null; } @Override @@ -405,7 +405,7 @@ public void execute( final ReteEvaluator reteEvaluator, boolean needEvaluation ) timerJobCtx.getTimerNodeMemory().setNodeDirtyWithoutNotify(); - TimedRuleExecutionFilter filter = (TimedRuleExecutionFilter) reteEvaluator.getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY); + TimedRuleExecutionFilter filter = reteEvaluator.getRuleSessionConfiguration().getOption(TimedRuleExecutionOption.KEY).getFilter(); needEvaluation &= filter != null; for (final PathMemory pmem : timerJobCtx.getPathMemories()) { From ef5203cd605853aa166c7ef736d357b9b78d7c6b Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Fri, 23 Jun 2023 13:46:52 +0200 Subject: [PATCH 3/7] Fixed ThreadSafeOption usage --- .../drools/core/RuleSessionConfiguration.java | 31 +++++++++---------- .../core/common/InternalWorkingMemory.java | 2 +- .../kiesession/agenda/DefaultAgenda.java | 4 +-- .../entrypoints/NamedEntryPoint.java | 2 +- .../session/StatefulKnowledgeSessionImpl.java | 4 +-- .../visitor/accumulate/AccumulateVisitor.java | 27 +++++++++++----- .../consequence/LambdaConsequence.java | 4 +-- .../api/runtime/conf/ThreadSafeOption.java | 4 +++ 8 files changed, 45 insertions(+), 33 deletions(-) diff --git a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java index 3a7e9affa04..0b6bc759cc8 100644 --- a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java +++ b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java @@ -48,8 +48,6 @@ public class RuleSessionConfiguration extends BaseConfiguration void setOption(T option) { break; } case ThreadSafeOption.PROPERTY_NAME: { - setThreadSafe(((ThreadSafeOption) option).isThreadSafe()); + setThreadSafeOption(((ThreadSafeOption) option)); break; } case AccumulateNullPropagationOption.PROPERTY_NAME: { @@ -198,14 +189,20 @@ public final void setOption(T option) { } } - @SuppressWarnings("unchecked") + private void setThreadSafeOption(ThreadSafeOption threadSafeOption) { + checkCanChange(); + this.threadSafeOption = threadSafeOption; + + } + + @SuppressWarnings("unchecked") public final T getOption(OptionKey option) { switch (option.name()) { case DirectFiringOption.PROPERTY_NAME: { return (T) (isDirectFiring() ? DirectFiringOption.YES : DirectFiringOption.NO); } case ThreadSafeOption.PROPERTY_NAME: { - return (T) (isThreadSafe() ? ThreadSafeOption.YES : ThreadSafeOption.NO); + return (T) threadSafeOption; } case AccumulateNullPropagationOption.PROPERTY_NAME: { return (T) (isAccumulateNullPropagation() ? AccumulateNullPropagationOption.YES : AccumulateNullPropagationOption.NO); @@ -241,7 +238,7 @@ public boolean setInternalProperty(String name, String value) { break; } case ThreadSafeOption.PROPERTY_NAME: { - setThreadSafe(StringUtils.isEmpty(value) || Boolean.parseBoolean(value)); + setThreadSafeOption(ThreadSafeOption.resolve(value)); break; } case AccumulateNullPropagationOption.PROPERTY_NAME: { @@ -278,7 +275,7 @@ public String getInternalProperty(String name) { case DirectFiringOption.PROPERTY_NAME: { return Boolean.toString(isDirectFiring()); } case ThreadSafeOption.PROPERTY_NAME: { - return Boolean.toString(isThreadSafe()); + return Boolean.toString(threadSafeOption.isThreadSafe()); } case AccumulateNullPropagationOption.PROPERTY_NAME: { return Boolean.toString(isAccumulateNullPropagation()); } case QueryListenerOption.PROPERTY_NAME: { diff --git a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java index f8670a7361b..96c7b183bd7 100644 --- a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java +++ b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java @@ -122,6 +122,6 @@ default FactHandleClassStore getStoreForClass(Class clazz) { void cancelActivation(InternalMatch internalMatch, boolean declarativeAgenda); default boolean isThreadSafe() { - return getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES; + return getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe(); } } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java index ab1e5422157..7b713f17a02 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java @@ -210,7 +210,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { this.workingMemory = workingMemory; this.agendaGroupsManager.setReteEvaluator( workingMemory ); - if (workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.NO) { + if (!workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { executionStateMachine = new UnsafeExecutionStateMachine(); } @@ -219,7 +219,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { } protected PropagationList createPropagationList() { - if (workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.NO) { + if (!workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { return new ThreadUnsafePropagationList( workingMemory ); } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java index 2b0cbc1b8f7..e98a5524cce 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java @@ -108,7 +108,7 @@ public NamedEntryPoint(EntryPointId entryPoint, this.entryPointNode = entryPointNode; this.reteEvaluator = reteEvaluator; this.ruleBase = this.reteEvaluator.getKnowledgeBase(); - this.lock = reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES ? new ReentrantLock() : null; + this.lock = reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe() ? new ReentrantLock() : null; this.handleFactory = this.reteEvaluator.getFactHandleFactory(); RuleBaseConfiguration conf = this.ruleBase.getRuleBaseConfiguration(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java index de4f7e8691d..31e7bf02aa7 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java @@ -1509,7 +1509,7 @@ public long getTotalFactCount() { */ @Override public void startOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES && this.opCounter.getAndIncrement() == 0 ) { + if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe() && this.opCounter.getAndIncrement() == 0 ) { // means the engine was idle, reset the timestamp this.lastIdleTimestamp.set(-1); } @@ -1531,7 +1531,7 @@ public void setEndOperationListener(EndOperationListener listener) { */ @Override public void endOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES && this.opCounter.decrementAndGet() == 0 ) { + if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe() && this.opCounter.decrementAndGet() == 0 ) { // means the engine is idle, so, set the timestamp if (this.timerService != null) { this.lastIdleTimestamp.set(this.timerService.getCurrentTime()); diff --git a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java index ca6f7522eb9..0faa6e45735 100644 --- a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java +++ b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/accumulate/AccumulateVisitor.java @@ -260,14 +260,25 @@ private Optional methodCallExprParameter(PatternDescr basePattern, B String rootNodeName = getRootNodeName(methodCallWithoutRootNode); Optional decl = context.getDeclarationById(rootNodeName); - Class clazz = decl.map(DeclarationSpec::getDeclarationClass) - .orElseGet( () -> { - try { - return context.getTypeResolver().resolveType(rootNodeName); - } catch (ClassNotFoundException e) { - throw new RuntimeException( e ); - } - } ); + Class clazz = null; + if (decl.isPresent()) { + clazz = decl.get().getDeclarationClass(); + } else { + try { + clazz= context.getTypeResolver().resolveType(rootNodeName); + } catch (ClassNotFoundException e) { + throw new RuntimeException( e ); + } + + } +// decl.map(DeclarationSpec::getDeclarationClass) +// .orElseGet( () -> { +// try { +// return context.getTypeResolver().resolveType(rootNodeName); +// } catch (ClassNotFoundException e) { +// throw new RuntimeException( e ); +// } +// } ); final ExpressionTyperContext expressionTyperContext = new ExpressionTyperContext(); final ExpressionTyper expressionTyper = new ExpressionTyper(context, clazz, bindingId, false, expressionTyperContext); diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java index f84e896330f..16e5e5e010c 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java @@ -125,7 +125,7 @@ private Object[] fetchFacts( KnowledgeHelper knowledgeHelper, ValueResolver valu Object[] facts; FactHandleLookup fhLookup = null; - if (reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.YES) { + if (reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { if ( consequence.isUsingDrools() ) { facts = new Object[consequence.getVariables().length + 1]; fhLookup = FactHandleLookup.create( factSuppliers.length ); @@ -217,7 +217,7 @@ private Object[] initConsequence( KnowledgeHelper knowledgeHelper, ReteEvaluator this.globalSuppliers = globalSuppliers.isEmpty() ? null : globalSuppliers.toArray( new GlobalSupplier[globalSuppliers.size()] ); this.factSuppliers = factSuppliers.toArray( new TupleFactSupplier[factSuppliers.size()] ); - if (reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY) == ThreadSafeOption.NO) { + if (!reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { this.facts = facts; this.fhLookup = fhLookup; } diff --git a/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java b/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java index 23f6d51cdc0..9cb62503ad1 100644 --- a/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java +++ b/kie-api/src/main/java/org/kie/api/runtime/conf/ThreadSafeOption.java @@ -61,5 +61,9 @@ public String getPropertyName() { public boolean isThreadSafe() { return threadSafe; } + + public static ThreadSafeOption resolve(String value) { + return Boolean.valueOf( value ) ? YES : NO; + } } \ No newline at end of file From a3e158510704eded583bd647e78046f1293e3309 Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Fri, 23 Jun 2023 15:08:55 +0200 Subject: [PATCH 4/7] More options migration --- .../drools/core/RuleSessionConfiguration.java | 54 ++++++++----------- .../core/common/AgendaGroupQueueImpl.java | 2 +- .../core/phreak/PhreakAccumulateNode.java | 2 +- .../core/phreak/PhreakRuleTerminalNode.java | 4 +- .../org/drools/core/phreak/RuleExecutor.java | 2 +- .../integrationtests/AccumulateTest.java | 2 +- .../conf/AccumulateNullPropagationOption.java | 6 +++ .../api/runtime/conf/DirectFiringOption.java | 4 ++ 8 files changed, 39 insertions(+), 37 deletions(-) diff --git a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java index 0b6bc759cc8..ddc8ed6d67e 100644 --- a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java +++ b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java @@ -46,15 +46,15 @@ public class RuleSessionConfiguration extends BaseConfiguration void setOption(T option) { switch (option.propertyName()) { case DirectFiringOption.PROPERTY_NAME: { - setDirectFiring(((DirectFiringOption) option).isDirectFiring()); + setDirectFiringOption(((DirectFiringOption) option)); break; } case ThreadSafeOption.PROPERTY_NAME: { @@ -165,7 +157,7 @@ public final void setOption(T option) { break; } case AccumulateNullPropagationOption.PROPERTY_NAME: { - setAccumulateNullPropagation(((AccumulateNullPropagationOption) option).isAccumulateNullPropagation()); + setAccumulateNullPropagation(((AccumulateNullPropagationOption) option)); break; } case ForceEagerActivationOption.PROPERTY_NAME: { @@ -198,20 +190,20 @@ private void setThreadSafeOption(ThreadSafeOption threadSafeOption) { @SuppressWarnings("unchecked") public final T getOption(OptionKey option) { switch (option.name()) { + case AccumulateNullPropagationOption.PROPERTY_NAME: { + return (T) accumulateNullPropagation; + } case DirectFiringOption.PROPERTY_NAME: { - return (T) (isDirectFiring() ? DirectFiringOption.YES : DirectFiringOption.NO); + return (T) directFiringOption; } case ThreadSafeOption.PROPERTY_NAME: { return (T) threadSafeOption; } - case AccumulateNullPropagationOption.PROPERTY_NAME: { - return (T) (isAccumulateNullPropagation() ? AccumulateNullPropagationOption.YES : AccumulateNullPropagationOption.NO); - } case TimedRuleExecutionOption.PROPERTY_NAME: { return (T) getTimedRuleExecutionOption(); } case QueryListenerOption.PROPERTY_NAME: { - return (T) getQueryListenerOption(); + return (T) this.queryListener; } case BeliefSystemTypeOption.PROPERTY_NAME: { return (T) BeliefSystemTypeOption.get( this.getBeliefSystemType().getId() ); @@ -234,7 +226,7 @@ public Set getOptionSubKeys(Optio public boolean setInternalProperty(String name, String value) { switch(name) { case DirectFiringOption.PROPERTY_NAME: { - setDirectFiring(!StringUtils.isEmpty(value) && Boolean.parseBoolean(value)); + setDirectFiringOption(DirectFiringOption.resolve(value)); break; } case ThreadSafeOption.PROPERTY_NAME: { @@ -242,7 +234,7 @@ public boolean setInternalProperty(String name, String value) { break; } case AccumulateNullPropagationOption.PROPERTY_NAME: { - setAccumulateNullPropagation(!StringUtils.isEmpty(value) && Boolean.parseBoolean(value)); + setAccumulateNullPropagation(AccumulateNullPropagationOption.resolve(value)); break; } case ForceEagerActivationOption.PROPERTY_NAME: { @@ -273,13 +265,13 @@ public boolean setInternalProperty(String name, String value) { public String getInternalProperty(String name) { switch(name) { case DirectFiringOption.PROPERTY_NAME: { - return Boolean.toString(isDirectFiring()); + return Boolean.toString(directFiringOption.isDirectFiring()); } case ThreadSafeOption.PROPERTY_NAME: { return Boolean.toString(threadSafeOption.isThreadSafe()); } case AccumulateNullPropagationOption.PROPERTY_NAME: { - return Boolean.toString(isAccumulateNullPropagation()); + return Boolean.toString(accumulateNullPropagation.isAccumulateNullPropagation()); } case QueryListenerOption.PROPERTY_NAME: { - return getQueryListenerOption().getAsString(); + return this.queryListener.getAsString(); } case BeliefSystemTypeOption.PROPERTY_NAME: { return getBeliefSystemType().getId(); } diff --git a/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java b/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java index 92a37f52d68..2d952785537 100644 --- a/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java +++ b/drools-core/src/main/java/org/drools/core/common/AgendaGroupQueueImpl.java @@ -90,7 +90,7 @@ public String getName() { public void setReteEvaluator(ReteEvaluator reteEvaluator) { this.reteEvaluator = reteEvaluator; // workingMemory can be null during deserialization - if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { this.priorityQueue = new ArrayQueue<>(); } else { this.priorityQueue = QueueFactory.createQueue(RuleAgendaConflictResolver.INSTANCE); diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java index e3c479ebb6c..c271be3f7cd 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakAccumulateNode.java @@ -634,7 +634,7 @@ protected void evaluateResultConstraints(final AccumulateNode accNode, Object result = accumulate.getResult(memory.workingMemoryContext, accctx, leftTuple, reteEvaluator); propagateResult( accNode, sink, leftTuple, context, reteEvaluator, memory, trgLeftTuples, stagedLeftTuples, - null, result, (AccumulateContextEntry) accctx, propagationContext, reteEvaluator.getRuleSessionConfiguration().getOption(AccumulateNullPropagationOption.KEY) == AccumulateNullPropagationOption.YES); + null, result, (AccumulateContextEntry) accctx, propagationContext, reteEvaluator.getRuleSessionConfiguration().getOption(AccumulateNullPropagationOption.KEY).isAccumulateNullPropagation()); } protected final void propagateResult(AccumulateNode accNode, LeftTupleSink sink, LeftTuple leftTuple, PropagationContext context, diff --git a/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java b/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java index 10991abdf9c..51c816254b8 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java +++ b/drools-core/src/main/java/org/drools/core/phreak/PhreakRuleTerminalNode.java @@ -94,7 +94,7 @@ public static void doLeftTupleInsert(TerminalNode rtnNode, RuleExecutor executor ActivationsManager activationsManager, RuleAgendaItem ruleAgendaItem, LeftTuple leftTuple) { ReteEvaluator reteEvaluator = activationsManager.getReteEvaluator(); - if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { executor.addLeftTuple(leftTuple); return; } @@ -173,7 +173,7 @@ public static void doLeftTupleUpdate(TerminalNode rtnNode, RuleExecutor executor RuleTerminalNodeLeftTuple rtnLeftTuple = (RuleTerminalNodeLeftTuple) leftTuple; ReteEvaluator reteEvaluator = activationsManager.getReteEvaluator(); - if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { if (!rtnLeftTuple.isQueued() ) { executor.addLeftTuple( leftTuple ); reteEvaluator.getRuleEventSupport().onUpdateMatch( rtnLeftTuple ); diff --git a/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java b/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java index e91c079928c..12bee318f76 100644 --- a/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java +++ b/drools-core/src/main/java/org/drools/core/phreak/RuleExecutor.java @@ -89,7 +89,7 @@ public int evaluateNetworkAndFire( ActivationsManager activationsManager, reEvaluateNetwork( activationsManager ); - if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY) == DirectFiringOption.YES) { + if ( reteEvaluator.getRuleSessionConfiguration().getOption(DirectFiringOption.KEY).isDirectFiring()) { RuleTerminalNode rtn = (RuleTerminalNode) pmem.getPathEndNode(); RuleImpl rule = rtn.getRule(); int directFirings = tupleList.size(); diff --git a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java index ea8d1f53ec7..453322dca71 100644 --- a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java +++ b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java @@ -3675,7 +3675,7 @@ public void testAverageWithNoFacts() throws Exception { kieSession.delete( fh ); // changed by DROOLS-6064 - if (kieSession.getSessionConfiguration().as(RuleSessionConfiguration.KEY).getOption(AccumulateNullPropagationOption.KEY) == AccumulateNullPropagationOption.YES) { + if (kieSession.getSessionConfiguration().as(RuleSessionConfiguration.KEY).getOption(AccumulateNullPropagationOption.KEY).isAccumulateNullPropagation()) { assertThat(kieSession.fireAllRules()).isEqualTo(1); assertThat(list.size()).isEqualTo(1); assertThat(list.get(0)).isNull(); diff --git a/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java b/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java index 89abf9ed369..1ca37143173 100644 --- a/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java +++ b/kie-api/src/main/java/org/kie/api/runtime/conf/AccumulateNullPropagationOption.java @@ -61,4 +61,10 @@ public boolean isAccumulateNullPropagation() { return accumulateNullPropagation; } + + + public static AccumulateNullPropagationOption resolve(String value) { + return Boolean.valueOf( value ) ? YES : NO; + } + } diff --git a/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java b/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java index 448a2427a41..0a6d09b7991 100644 --- a/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java +++ b/kie-api/src/main/java/org/kie/api/runtime/conf/DirectFiringOption.java @@ -62,4 +62,8 @@ public boolean isDirectFiring() { return directFiring; } + public static DirectFiringOption resolve(String value) { + return Boolean.valueOf( value ) ? YES : NO; + } + } \ No newline at end of file From 38405af11fea36074566dfc69af2907ddd212097 Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Tue, 27 Jun 2023 16:49:22 +0200 Subject: [PATCH 5/7] More cleanup --- .../drools/core/RuleSessionConfiguration.java | 68 +++++++++---------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java index ddc8ed6d67e..2542d90d44b 100644 --- a/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java +++ b/drools-core/src/main/java/org/drools/core/RuleSessionConfiguration.java @@ -54,7 +54,7 @@ public class RuleSessionConfiguration extends BaseConfiguration void setOption(T option) { switch (option.propertyName()) { - case DirectFiringOption.PROPERTY_NAME: { - setDirectFiringOption(((DirectFiringOption) option)); - break; - } - case ThreadSafeOption.PROPERTY_NAME: { - setThreadSafeOption(((ThreadSafeOption) option)); + case AccumulateNullPropagationOption.PROPERTY_NAME: { + setAccumulateNullPropagation(((AccumulateNullPropagationOption) option)); + break; + } + case BeliefSystemTypeOption.PROPERTY_NAME: { + setBeliefSystemType(((BeliefSystemType.resolveBeliefSystemType(((BeliefSystemTypeOption) option).getBeliefSystemType())))); break; } - case AccumulateNullPropagationOption.PROPERTY_NAME: { - setAccumulateNullPropagation(((AccumulateNullPropagationOption) option)); + case DirectFiringOption.PROPERTY_NAME: { + setDirectFiringOption(((DirectFiringOption) option)); break; } case ForceEagerActivationOption.PROPERTY_NAME: { setForceEagerActivationFilter(((ForceEagerActivationOption) option).getFilter()); break; } - case TimedRuleExecutionOption.PROPERTY_NAME: { - setTimedRuleExecutionFilter(((TimedRuleExecutionOption) option)); - break; - } case QueryListenerOption.PROPERTY_NAME: { setQueryListenerOption((QueryListenerOption) option); break; } - case BeliefSystemTypeOption.PROPERTY_NAME: { - setBeliefSystemType(((BeliefSystemType.resolveBeliefSystemType(((BeliefSystemTypeOption) option).getBeliefSystemType())))); + case ThreadSafeOption.PROPERTY_NAME: { + setThreadSafeOption(((ThreadSafeOption) option)); + break; + } + case TimedRuleExecutionOption.PROPERTY_NAME: { + setTimedRuleExecutionFilter(((TimedRuleExecutionOption) option)); break; } default: @@ -193,20 +189,20 @@ public final T getOption(OptionKey op case AccumulateNullPropagationOption.PROPERTY_NAME: { return (T) accumulateNullPropagation; } + case BeliefSystemTypeOption.PROPERTY_NAME: { + return (T) BeliefSystemTypeOption.get( this.getBeliefSystemType().getId() ); + } case DirectFiringOption.PROPERTY_NAME: { return (T) directFiringOption; } + case QueryListenerOption.PROPERTY_NAME: { + return (T) queryListenerOption; + } case ThreadSafeOption.PROPERTY_NAME: { return (T) threadSafeOption; } case TimedRuleExecutionOption.PROPERTY_NAME: { - return (T) getTimedRuleExecutionOption(); - } - case QueryListenerOption.PROPERTY_NAME: { - return (T) this.queryListener; - } - case BeliefSystemTypeOption.PROPERTY_NAME: { - return (T) BeliefSystemTypeOption.get( this.getBeliefSystemType().getId() ); + return (T) timedRuleExecutionOption; } default: return compConfig.getOption(option); @@ -271,7 +267,7 @@ public String getInternalProperty(String name) { } case AccumulateNullPropagationOption.PROPERTY_NAME: { return Boolean.toString(accumulateNullPropagation.isAccumulateNullPropagation()); } case QueryListenerOption.PROPERTY_NAME: { - return this.queryListener.getAsString(); + return this.queryListenerOption.getAsString(); } case BeliefSystemTypeOption.PROPERTY_NAME: { return getBeliefSystemType().getId(); } From 5847a88bcb12513df582a0655047d837002faa7f Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Fri, 30 Jun 2023 15:12:22 +0200 Subject: [PATCH 6/7] Using isThreadSafe at creation time of reteevaluator --- .../org/drools/core/common/InternalWorkingMemory.java | 4 ---- .../java/org/drools/core/common/ReteEvaluator.java | 6 +++--- .../consequence/StatefulKnowledgeSessionForRHS.java | 4 ++++ .../session/StatefulKnowledgeSessionImpl.java | 10 ++++++++++ .../org/drools/modelcompiler/KiePackagesBuilder.java | 2 ++ .../ruleunits/impl/sessions/RuleUnitExecutorImpl.java | 5 +++++ 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java index 96c7b183bd7..e52344f7134 100644 --- a/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java +++ b/drools-core/src/main/java/org/drools/core/common/InternalWorkingMemory.java @@ -29,7 +29,6 @@ import org.drools.core.runtime.process.InternalProcessRuntime; import org.drools.core.rule.consequence.InternalMatch; import org.kie.api.runtime.Channel; -import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.EntryPoint; public interface InternalWorkingMemory @@ -121,7 +120,4 @@ default FactHandleClassStore getStoreForClass(Class clazz) { void cancelActivation(InternalMatch internalMatch, boolean declarativeAgenda); - default boolean isThreadSafe() { - return getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe(); - } } diff --git a/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java b/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java index bcad264fc93..58895531e01 100644 --- a/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java +++ b/drools-core/src/main/java/org/drools/core/common/ReteEvaluator.java @@ -94,9 +94,7 @@ default Collection getTimerJobInstances(long id) { long getNextPropagationIdCounter(); - default boolean isThreadSafe() { - return true; - } + boolean isThreadSafe(); default FactHandleClassStore getStoreForClass(Class clazz) { return getDefaultEntryPoint().getObjectStore().getStoreForClass(clazz); @@ -137,6 +135,8 @@ default KnowledgeHelper createKnowledgeHelper() { int fireAllRules(int max); int fireAllRules(AgendaFilter agendaFilter); int fireAllRules(AgendaFilter agendaFilter, int max); + + default void setWorkingMemoryActionListener(Consumer listener) { throw new UnsupportedOperationException(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java index 84b61b23bd9..34667e78c57 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/consequence/StatefulKnowledgeSessionForRHS.java @@ -735,4 +735,8 @@ public SessionClock getSessionClock() { public ProcessInstance startProcessFromNodeIds(String processId, Map params, String... nodeIds) { return delegate.startProcessFromNodeIds(processId, params, nodeIds); } + + public boolean isThreadSafe() { + return delegate.isThreadSafe(); + } } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java index 31e7bf02aa7..20225854cba 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java @@ -244,6 +244,8 @@ public class StatefulKnowledgeSessionImpl extends AbstractRuntime private Consumer workingMemoryActionListener; + private boolean isThreadSafe; + // ------------------------------------------------------------ // Constructors // ------------------------------------------------------------ @@ -349,6 +351,8 @@ private StatefulKnowledgeSessionImpl(final long id, if (initInitFactHandle) { this.initialFactHandle = initInitialFact(null); } + + isThreadSafe = getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe(); } public StatefulKnowledgeSessionImpl setStateless( boolean stateless ) { @@ -518,6 +522,10 @@ public boolean isAlive() { public void destroy() { dispose(); } + + public boolean isThreadSafe() { + return isThreadSafe; + } public void update(FactHandle factHandle) { this.update(factHandle, @@ -1755,4 +1763,6 @@ public ProcessInstance startProcessFromNodeIds(String processId, Map params, String... nodeIds) { return getProcessRuntime().startProcessFromNodeIds(processId, key, params, nodeIds); } + + } diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java index def38ba6d76..8d76967db1e 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java @@ -148,6 +148,7 @@ import org.kie.api.definition.rule.Direct; import org.kie.api.definition.rule.Propagation; import org.kie.api.definition.type.Role; +import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.internal.builder.KnowledgeBuilderConfiguration; import org.kie.internal.builder.conf.PropertySpecificOption; @@ -391,6 +392,7 @@ private void processConsequence( RuleContext ctx, Consequence consequence, Strin // This is changed, because we must use the Declarations provided by the RTN, otherwise tuple indexes are not set. Declaration[] requiredDeclarations = getRequiredDeclarationsIfPossible( ctx, consequence, name ); boolean enabledTupleOptimization = requiredDeclarations != null && requiredDeclarations.length > 0; + if ( name.equals( RuleImpl.DEFAULT_CONSEQUENCE_NAME ) ) { if ("java".equals(consequence.getLanguage())) { diff --git a/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java b/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java index 889bcd13fde..8850491eef8 100644 --- a/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java +++ b/drools-ruleunits/drools-ruleunits-impl/src/main/java/org/drools/ruleunits/impl/sessions/RuleUnitExecutorImpl.java @@ -300,6 +300,11 @@ public void dispose() { this.timerService.shutdown(); } + + @Override + public boolean isThreadSafe() { + return true; + } @Override public QueryResults getQueryResults(String queryName, Object... arguments) { From 98daf4f776a0c2a9b0f91425c33d8d947fc84883 Mon Sep 17 00:00:00 2001 From: Paolo Bizzarri Date: Fri, 30 Jun 2023 16:05:27 +0200 Subject: [PATCH 7/7] Encapsulated configuration option --- .../java/org/drools/kiesession/agenda/DefaultAgenda.java | 4 ++-- .../drools/kiesession/entrypoints/NamedEntryPoint.java | 3 +-- .../kiesession/session/StatefulKnowledgeSessionImpl.java | 8 +++++--- .../modelcompiler/consequence/LambdaConsequence.java | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java index 7b713f17a02..fa0cbfe425f 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/agenda/DefaultAgenda.java @@ -210,7 +210,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { this.workingMemory = workingMemory; this.agendaGroupsManager.setReteEvaluator( workingMemory ); - if (!workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { + if (!workingMemory.isThreadSafe()) { executionStateMachine = new UnsafeExecutionStateMachine(); } @@ -219,7 +219,7 @@ public void setWorkingMemory(final InternalWorkingMemory workingMemory) { } protected PropagationList createPropagationList() { - if (!workingMemory.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { + if (!workingMemory.isThreadSafe()) { return new ThreadUnsafePropagationList( workingMemory ); } diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java index e98a5524cce..ce8a51e67ab 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/entrypoints/NamedEntryPoint.java @@ -48,7 +48,6 @@ import org.drools.core.util.bitmask.AllSetBitMask; import org.drools.core.util.bitmask.BitMask; import org.kie.api.conf.KieBaseMutabilityOption; -import org.kie.api.runtime.conf.ThreadSafeOption; import org.kie.api.runtime.rule.FactHandle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -108,7 +107,7 @@ public NamedEntryPoint(EntryPointId entryPoint, this.entryPointNode = entryPointNode; this.reteEvaluator = reteEvaluator; this.ruleBase = this.reteEvaluator.getKnowledgeBase(); - this.lock = reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe() ? new ReentrantLock() : null; + this.lock = reteEvaluator.isThreadSafe() ? new ReentrantLock() : null; this.handleFactory = this.reteEvaluator.getFactHandleFactory(); RuleBaseConfiguration conf = this.ruleBase.getRuleBaseConfiguration(); diff --git a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java index 20225854cba..1c97f9cdfcc 100644 --- a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java +++ b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatefulKnowledgeSessionImpl.java @@ -324,6 +324,9 @@ private StatefulKnowledgeSessionImpl(final long id, this.propagationIdCounter = new AtomicLong(propagationContext); this.config = config; this.ruleSessionConfig = config.as(RuleSessionConfiguration.KEY); + + isThreadSafe = ruleSessionConfig.getOption(ThreadSafeOption.KEY).isThreadSafe(); + this.environment = environment; this.propagationIdCounter = new AtomicLong( propagationContext); @@ -352,7 +355,6 @@ private StatefulKnowledgeSessionImpl(final long id, this.initialFactHandle = initInitialFact(null); } - isThreadSafe = getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe(); } public StatefulKnowledgeSessionImpl setStateless( boolean stateless ) { @@ -1517,7 +1519,7 @@ public long getTotalFactCount() { */ @Override public void startOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe() && this.opCounter.getAndIncrement() == 0 ) { + if (isThreadSafe() && this.opCounter.getAndIncrement() == 0 ) { // means the engine was idle, reset the timestamp this.lastIdleTimestamp.set(-1); } @@ -1539,7 +1541,7 @@ public void setEndOperationListener(EndOperationListener listener) { */ @Override public void endOperation(InternalOperationType operationType) { - if (getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe() && this.opCounter.decrementAndGet() == 0 ) { + if (isThreadSafe() && this.opCounter.decrementAndGet() == 0 ) { // means the engine is idle, so, set the timestamp if (this.timerService != null) { this.lastIdleTimestamp.set(this.timerService.getCurrentTime()); diff --git a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java index 16e5e5e010c..f97cccd8da2 100644 --- a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java +++ b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/consequence/LambdaConsequence.java @@ -125,7 +125,7 @@ private Object[] fetchFacts( KnowledgeHelper knowledgeHelper, ValueResolver valu Object[] facts; FactHandleLookup fhLookup = null; - if (reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { + if (reteEvaluator.isThreadSafe()) { if ( consequence.isUsingDrools() ) { facts = new Object[consequence.getVariables().length + 1]; fhLookup = FactHandleLookup.create( factSuppliers.length ); @@ -217,7 +217,7 @@ private Object[] initConsequence( KnowledgeHelper knowledgeHelper, ReteEvaluator this.globalSuppliers = globalSuppliers.isEmpty() ? null : globalSuppliers.toArray( new GlobalSupplier[globalSuppliers.size()] ); this.factSuppliers = factSuppliers.toArray( new TupleFactSupplier[factSuppliers.size()] ); - if (!reteEvaluator.getRuleSessionConfiguration().getOption(ThreadSafeOption.KEY).isThreadSafe()) { + if (!reteEvaluator.isThreadSafe()) { this.facts = facts; this.fhLookup = fhLookup; }