Skip to content

Commit bcfa79d

Browse files
authored
Add option to disable history persistence when executing DMN execution (#4102)
1 parent d07d70c commit bcfa79d

17 files changed

+1065
-10
lines changed

modules/flowable-dmn-api/src/main/java/org/flowable/dmn/api/ExecuteDecisionBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ public interface ExecuteDecisionBuilder {
7878
**/
7979
ExecuteDecisionBuilder variable(String variableName, Object value);
8080

81+
/**
82+
* Disable history persistence for this execution.
83+
*/
84+
ExecuteDecisionBuilder disableHistory();
85+
8186
/**
8287
* Executes a decision returning one or more output results with variables
8388
*

modules/flowable-dmn-api/src/main/java/org/flowable/dmn/api/ExecuteDecisionContext.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class ExecuteDecisionContext {
3131
protected String tenantId;
3232
protected boolean fallbackToDefaultTenant;
3333
protected boolean forceDMN11;
34+
protected boolean disableHistory;
3435
protected DmnElement dmnElement;
3536
protected DecisionExecutionAuditContainer decisionExecution;
3637

@@ -112,6 +113,12 @@ public boolean isForceDMN11() {
112113
public void setForceDMN11(boolean forceDMN11) {
113114
this.forceDMN11 = forceDMN11;
114115
}
116+
public boolean isDisableHistory() {
117+
return disableHistory;
118+
}
119+
public void setDisableHistory(boolean disableHistory) {
120+
this.disableHistory = disableHistory;
121+
}
115122
public DmnElement getDmnElement() {
116123
return dmnElement;
117124
}

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/DmnDecisionServiceImpl.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public List<Map<String, Object>> executeDecision(ExecuteDecisionBuilder builder)
5959

6060
List<Map<String, Object>> decisionResult = composeDecisionResult(executeDecisionContext);
6161

62-
persistDecisionAudit(executeDecisionContext);
62+
finalizeDecisionExecutionAudit(executeDecisionContext);
6363

6464
return decisionResult;
6565
}
@@ -72,7 +72,7 @@ public Map<String, List<Map<String, Object>>> executeDecisionService(ExecuteDeci
7272

7373
Map<String, List<Map<String, Object>>> decisionResult = composeDecisionServiceResult(executeDecisionContext);
7474

75-
persistDecisionAudit(executeDecisionContext);
75+
finalizeDecisionExecutionAudit(executeDecisionContext);
7676

7777
return decisionResult;
7878
}
@@ -86,7 +86,7 @@ public Map<String, Object> executeWithSingleResult(ExecuteDecisionBuilder builde
8686
Map<String, Object> singleDecisionResult = null;
8787
Map<String, List<Map<String, Object>>> decisionResult = composeEvaluateDecisionResult(executeDecisionContext);
8888

89-
persistDecisionAudit(executeDecisionContext);
89+
finalizeDecisionExecutionAudit(executeDecisionContext);
9090

9191
for (Map.Entry<String, List<Map<String, Object>>> entry : decisionResult.entrySet()) {
9292
List<Map<String, Object>> decisionResults = entry.getValue();
@@ -113,7 +113,7 @@ public Map<String, Object> executeDecisionWithSingleResult(ExecuteDecisionBuilde
113113
Map<String, Object> singleDecisionResult = null;
114114
List<Map<String, Object>> decisionResult = composeDecisionResult(executeDecisionContext);
115115

116-
persistDecisionAudit(executeDecisionContext);
116+
finalizeDecisionExecutionAudit(executeDecisionContext);
117117

118118
if (decisionResult != null && !decisionResult.isEmpty()) {
119119
if (decisionResult.size() > 1) {
@@ -134,7 +134,7 @@ public Map<String, Object> executeDecisionServiceWithSingleResult(ExecuteDecisio
134134
Map<String, Object> singleDecisionResult = new HashMap<>();
135135
Map<String, List<Map<String, Object>>> decisionResult = composeDecisionServiceResult(executeDecisionContext);
136136

137-
persistDecisionAudit(executeDecisionContext);
137+
finalizeDecisionExecutionAudit(executeDecisionContext);
138138

139139
for (Map.Entry<String, List<Map<String, Object>>> entry : decisionResult.entrySet()) {
140140
List<Map<String, Object>> decisionResults = entry.getValue();
@@ -157,7 +157,7 @@ public DecisionExecutionAuditContainer executeWithAuditTrail(ExecuteDecisionBuil
157157

158158
composeEvaluateDecisionResult(executeDecisionContext);
159159

160-
DecisionExecutionAuditContainer decisionExecution = persistDecisionAudit(executeDecisionContext);
160+
DecisionExecutionAuditContainer decisionExecution = finalizeDecisionExecutionAudit(executeDecisionContext);
161161

162162
return decisionExecution;
163163
}
@@ -170,7 +170,7 @@ public DecisionExecutionAuditContainer executeDecisionWithAuditTrail(ExecuteDeci
170170

171171
composeDecisionResult(executeDecisionContext);
172172

173-
DecisionExecutionAuditContainer decisionExecution = persistDecisionAudit(executeDecisionContext);
173+
DecisionExecutionAuditContainer decisionExecution = finalizeDecisionExecutionAudit(executeDecisionContext);
174174

175175
return decisionExecution;
176176
}
@@ -183,7 +183,7 @@ public DecisionServiceExecutionAuditContainer executeDecisionServiceWithAuditTra
183183

184184
composeDecisionServiceResult(executeDecisionContext);
185185

186-
DecisionServiceExecutionAuditContainer decisionServiceExecutionAuditContainer = (DecisionServiceExecutionAuditContainer) persistDecisionAudit(executeDecisionContext);
186+
DecisionServiceExecutionAuditContainer decisionServiceExecutionAuditContainer = (DecisionServiceExecutionAuditContainer) finalizeDecisionExecutionAudit(executeDecisionContext);
187187

188188
return decisionServiceExecutionAuditContainer;
189189
}
@@ -236,12 +236,14 @@ protected Map<String, List<Map<String, Object>>> composeDecisionServiceResult(Ex
236236
}
237237
}
238238

239-
protected DecisionExecutionAuditContainer persistDecisionAudit(ExecuteDecisionContext executeDecisionContext) {
239+
protected DecisionExecutionAuditContainer finalizeDecisionExecutionAudit(ExecuteDecisionContext executeDecisionContext) {
240240
DecisionExecutionAuditContainer decisionExecution = executeDecisionContext.getDecisionExecution();
241241

242242
decisionExecution.stopAudit(configuration.getClock().getCurrentTime());
243243

244-
commandExecutor.execute(new PersistHistoricDecisionExecutionCmd(executeDecisionContext));
244+
if (!executeDecisionContext.isDisableHistory()) {
245+
commandExecutor.execute(new PersistHistoricDecisionExecutionCmd(executeDecisionContext));
246+
}
245247

246248
return decisionExecution;
247249
}

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/ExecuteDecisionBuilderImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class ExecuteDecisionBuilderImpl implements ExecuteDecisionBuilder {
3838
protected String tenantId;
3939
protected Map<String, Object> variables;
4040
protected boolean fallbackToDefaultTenant;
41+
protected boolean disableHistory;
4142

4243
public ExecuteDecisionBuilderImpl(DmnDecisionService decisionService) {
4344
this.decisionService = decisionService;
@@ -113,6 +114,12 @@ public ExecuteDecisionBuilder variable(String variableName, Object value) {
113114
return this;
114115
}
115116

117+
@Override
118+
public ExecuteDecisionBuilder disableHistory() {
119+
this.disableHistory = true;
120+
return this;
121+
}
122+
116123
/**
117124
* @deprecated
118125
*/
@@ -211,6 +218,7 @@ public ExecuteDecisionContext buildExecuteDecisionContext() {
211218
executeDecisionContext.setVariables(variables);
212219
executeDecisionContext.setTenantId(tenantId);
213220
executeDecisionContext.setFallbackToDefaultTenant(fallbackToDefaultTenant);
221+
executeDecisionContext.setDisableHistory(disableHistory);
214222

215223
return executeDecisionContext;
216224
}
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
/* Licensed under the Apache License, Version 2.0 (the "License");
2+
* you may not use this file except in compliance with the License.
3+
* You may obtain a copy of the License at
4+
*
5+
* http://www.apache.org/licenses/LICENSE-2.0
6+
*
7+
* Unless required by applicable law or agreed to in writing, software
8+
* distributed under the License is distributed on an "AS IS" BASIS,
9+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
* See the License for the specific language governing permissions and
11+
* limitations under the License.
12+
*/
13+
package org.flowable.dmn.engine.test.history;
14+
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.assertj.core.api.Assertions.entry;
17+
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.stream.IntStream;
21+
22+
import org.flowable.dmn.api.DecisionExecutionAuditContainer;
23+
import org.flowable.dmn.api.DecisionServiceExecutionAuditContainer;
24+
import org.flowable.dmn.engine.test.BaseFlowableDmnTest;
25+
import org.flowable.dmn.engine.test.DmnDeployment;
26+
import org.junit.jupiter.api.Test;
27+
28+
/**
29+
* @author Roman Saratz
30+
*/
31+
class HistoryDisabledTest extends BaseFlowableDmnTest {
32+
33+
@Test
34+
@DmnDeployment
35+
public void testExecuteDecision() {
36+
List<Map<String, Object>> result = ruleService.createExecuteDecisionBuilder()
37+
.decisionKey("decision1")
38+
.variable("inputVariable1", 11)
39+
.disableHistory()
40+
.executeDecision();
41+
42+
assertThat(result).hasSize(1);
43+
assertThat(result.get(0)).containsExactly(
44+
entry("outputVariable1", "gt 10"),
45+
entry("outputVariable2", "result2")
46+
);
47+
48+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
49+
}
50+
51+
@Test
52+
@DmnDeployment
53+
public void testExecuteDecisionService() {
54+
Map<String, List<Map<String, Object>>> result = ruleService.createExecuteDecisionBuilder()
55+
.decisionKey("expandedDecisionService")
56+
.variable("input1", "test1")
57+
.variable("input2", "test2")
58+
.variable("input3", "test3")
59+
.variable("input4", "test4")
60+
.disableHistory()
61+
.executeDecisionService();
62+
63+
assertThat(result).hasSize(2);
64+
List<Map<String, Object>> decision1 = result.get("decision1");
65+
assertThat(decision1).hasSize(3);
66+
IntStream.range(0, 3).forEach(i ->
67+
assertThat(decision1.get(i)).containsExactly(entry("output1", "NOT EMPTY " + (i + 1)))
68+
);
69+
70+
List<Map<String, Object>> decision2 = result.get("decision2");
71+
assertThat(decision2).hasSize(3);
72+
IntStream.range(0, 3).forEach(i ->
73+
assertThat(decision2.get(i)).containsExactly(entry("output2", "NOT EMPTY " + (i + 1)))
74+
);
75+
76+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
77+
}
78+
79+
@Test
80+
@DmnDeployment
81+
public void testExecuteWithSingleResult() {
82+
Map<String, Object> result = ruleService.createExecuteDecisionBuilder()
83+
.decisionKey("decision1")
84+
.variable("inputVariable1", 11)
85+
.disableHistory()
86+
.executeWithSingleResult();
87+
88+
assertThat(result).hasSize(2);
89+
assertThat(result).containsExactly(
90+
entry("outputVariable1", "gt 10"),
91+
entry("outputVariable2", "result2")
92+
);
93+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
94+
}
95+
96+
@Test
97+
@DmnDeployment
98+
public void testExecuteDecisionWithSingleResult() {
99+
Map<String, Object> result = ruleService.createExecuteDecisionBuilder()
100+
.decisionKey("decision1")
101+
.variable("inputVariable1", 11)
102+
.disableHistory()
103+
.executeDecisionWithSingleResult();
104+
105+
assertThat(result).hasSize(2);
106+
assertThat(result).containsExactly(
107+
entry("outputVariable1", "gt 10"),
108+
entry("outputVariable2", "result2")
109+
);
110+
111+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
112+
}
113+
114+
@Test
115+
@DmnDeployment
116+
public void testExecuteDecisionServiceWithSingleResult() {
117+
Map<String, Object> result = ruleService.createExecuteDecisionBuilder()
118+
.decisionKey("expandedDecisionService")
119+
.variable("input1", "test1")
120+
.variable("input2", "test2")
121+
.variable("input3", "test3")
122+
.variable("input4", "test4")
123+
.disableHistory()
124+
.executeDecisionServiceWithSingleResult();
125+
126+
assertThat(result).hasSize(2);
127+
assertThat(result).containsExactly(
128+
entry("output1", "NOT EMPTY 1"),
129+
entry("output2", "NOT EMPTY 1")
130+
);
131+
132+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
133+
}
134+
135+
@Test
136+
@DmnDeployment
137+
public void testExecuteWithAuditTrail() {
138+
DecisionExecutionAuditContainer auditContainer = ruleService.createExecuteDecisionBuilder()
139+
.decisionKey("decision1")
140+
.variable("inputVariable1", 11)
141+
.disableHistory()
142+
.executeWithAuditTrail();
143+
144+
assertThat(auditContainer).isNotNull();
145+
assertThat(auditContainer.getStartTime()).isNotNull();
146+
assertThat(auditContainer.getEndTime()).isNotNull();
147+
assertThat(auditContainer.getInputVariables().get("inputVariable1")).isEqualTo(11);
148+
assertThat(auditContainer.getDecisionResult()).hasSize(1);
149+
assertThat(auditContainer.getDecisionResult().get(0)).containsExactly(
150+
entry("outputVariable1", "gt 10"),
151+
entry("outputVariable2", "result2")
152+
);
153+
154+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
155+
}
156+
157+
@Test
158+
@DmnDeployment
159+
public void testExecuteDecisionWithAuditTrail() {
160+
DecisionExecutionAuditContainer auditContainer = ruleService.createExecuteDecisionBuilder()
161+
.decisionKey("decision1")
162+
.variable("inputVariable1", 11)
163+
.disableHistory()
164+
.executeDecisionWithAuditTrail();
165+
166+
assertThat(auditContainer).isNotNull();
167+
assertThat(auditContainer.getStartTime()).isNotNull();
168+
assertThat(auditContainer.getEndTime()).isNotNull();
169+
assertThat(auditContainer.getInputVariables().get("inputVariable1")).isEqualTo(11);
170+
assertThat(auditContainer.getDecisionResult()).hasSize(1);
171+
assertThat(auditContainer.getDecisionResult().get(0)).containsExactly(
172+
entry("outputVariable1", "gt 10"),
173+
entry("outputVariable2", "result2")
174+
);
175+
176+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
177+
}
178+
179+
@Test
180+
@DmnDeployment
181+
public void testExecuteDecisionServiceWithAuditTrail() {
182+
DecisionServiceExecutionAuditContainer auditContainer = ruleService.createExecuteDecisionBuilder()
183+
.decisionKey("expandedDecisionService")
184+
.variable("input1", "test1")
185+
.variable("input2", "test2")
186+
.variable("input3", "test3")
187+
.variable("input4", "test4")
188+
.disableHistory()
189+
.executeDecisionServiceWithAuditTrail();
190+
191+
assertThat(auditContainer).isNotNull();
192+
assertThat(auditContainer.getStartTime()).isNotNull();
193+
assertThat(auditContainer.getEndTime()).isNotNull();
194+
assertThat(auditContainer.getInputVariables()).containsExactlyInAnyOrderEntriesOf(
195+
Map.of("input1", "test1",
196+
"input2", "test2",
197+
"input3", "test3",
198+
"input4", "test4")
199+
);
200+
201+
Map<String, List<Map<String, Object>>> result = auditContainer.getDecisionServiceResult();
202+
assertThat(result).hasSize(2);
203+
assertThat(result).hasSize(2);
204+
List<Map<String, Object>> decision1 = result.get("decision1");
205+
assertThat(decision1).hasSize(3);
206+
IntStream.range(0, 3).forEach(i ->
207+
assertThat(decision1.get(i)).containsExactly(entry("output1", "NOT EMPTY " + (i + 1)))
208+
);
209+
210+
List<Map<String, Object>> decision2 = result.get("decision2");
211+
assertThat(decision2).hasSize(3);
212+
IntStream.range(0, 3).forEach(i ->
213+
assertThat(decision2.get(i)).containsExactly(entry("output2", "NOT EMPTY " + (i + 1)))
214+
);
215+
216+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
217+
}
218+
219+
@Test
220+
@DmnDeployment
221+
public void testExecute() {
222+
List<Map<String, Object>> result = ruleService.createExecuteDecisionBuilder()
223+
.decisionKey("decision1")
224+
.variable("inputVariable1", 11)
225+
.disableHistory()
226+
.execute();
227+
228+
assertThat(result).hasSize(1);
229+
assertThat(result.get(0)).containsExactly(
230+
entry("outputVariable1", "gt 10"),
231+
entry("outputVariable2", "result2")
232+
);
233+
234+
assertThat(historyService.createHistoricDecisionExecutionQuery().count()).isEqualTo(0);
235+
}
236+
}

0 commit comments

Comments
 (0)