diff --git a/drools-compiler/src/test/java/org/drools/compiler/integrationtests/ExpirationTest.java b/drools-compiler/src/test/java/org/drools/compiler/integrationtests/ExpirationTest.java index 6946bbb62a7..87a728a6a88 100644 --- a/drools-compiler/src/test/java/org/drools/compiler/integrationtests/ExpirationTest.java +++ b/drools-compiler/src/test/java/org/drools/compiler/integrationtests/ExpirationTest.java @@ -637,4 +637,46 @@ public String toString() { return "DummyEvent{" + "id=" + id + ", eventTimestamp=" + eventTimestamp + ", state=" + state + '}'; } } + + @Test + public void testEventSameContraint() throws InterruptedException { + // DROOLS-4580 + final String drl = + " package org.drools.compiler.integrationtests;\n" + + " import " + DummyEvent.class.getCanonicalName() + ";\n" + + " declare DummyEvent\n" + + " @role( event )\n" + + " @timestamp( eventTimestamp )\n" + + " end\n" + + " \n" + + " rule R1 when\n" + + " $dummyEvent : DummyEvent(state != \"release\")\n" + + " $otherDummyEvent : DummyEvent(this != $dummyEvent, this before $dummyEvent, idA == $dummyEvent.idA)\n" + + " then \n" + + " System.out.println(\"R1\");\n" + + " end\n" + + " rule R2 when\n" + + " $dummyEvent : DummyEvent(state != \"release\")\n" + + " $otherDummyEvent : DummyEvent(this != $dummyEvent, this before $dummyEvent, idA == $dummyEvent.idA)\n" + + " then \n" + + " System.out.println(\"R2\");\n" + + " end\n"; + + final KieSessionConfiguration sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); + sessionConfig.setOption( ClockTypeOption.get( ClockType.PSEUDO_CLOCK.getId() ) ); + + final KieHelper helper = new KieHelper(); + helper.addContent( drl, ResourceType.DRL ); + final KieBase kieBase = helper.build( EventProcessingOption.STREAM ); + final KieSession kieSession = kieBase.newKieSession( sessionConfig, null ); + + PseudoClockScheduler clock = kieSession.getSessionClock(); + final long currentTime = System.currentTimeMillis(); + clock.setStartupTime(currentTime - 1); + + kieSession.insert(new DummyEvent(1, currentTime)); + kieSession.insert(new DummyEvent(2, currentTime - Duration.ofHours(8).toMillis())); + + Assertions.assertThat(kieSession.fireAllRules()).isEqualTo(2); + } } diff --git a/drools-core/src/main/java/org/drools/core/reteoo/builder/BuildUtils.java b/drools-core/src/main/java/org/drools/core/reteoo/builder/BuildUtils.java index d548a521f55..1e47339ea23 100755 --- a/drools-core/src/main/java/org/drools/core/reteoo/builder/BuildUtils.java +++ b/drools-core/src/main/java/org/drools/core/reteoo/builder/BuildUtils.java @@ -173,8 +173,9 @@ private void mergeNodes(BaseNode node, BaseNode duplicate) { int i = 0; for (BetaNodeFieldConstraint betaConstraint : betaConstraints) { if (betaConstraint instanceof MvelConstraint) { - ((MvelConstraint) betaConstraint).addPackageNames(((MvelConstraint) ((BetaNode) duplicate).getConstraints()[i++]).getPackageNames()); + ((MvelConstraint) betaConstraint).addPackageNames(((MvelConstraint) ((BetaNode) duplicate).getConstraints()[i]).getPackageNames()); } + i++; } } }