Skip to content

Commit

Permalink
[BZ-1089285] fix evals when used inside subnetworks
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Apr 22, 2014
1 parent 1f8dc32 commit ec835d8
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

package org.drools.compiler.integrationtests;

import org.junit.Assert;
import org.drools.compiler.Address;
import org.drools.compiler.Cheese;
import org.drools.compiler.CommonTestMethodBase;
Expand All @@ -35,20 +34,21 @@
import org.drools.core.common.LeftTupleSets;
import org.drools.core.common.RightTupleSets;
import org.drools.core.conflict.SalienceConflictResolver;
import org.drools.core.impl.StatefulKnowledgeSessionImpl;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.drools.core.io.impl.ByteArrayResource;
import org.drools.core.reteoo.AlphaNode;
import org.drools.core.reteoo.BetaMemory;
import org.drools.core.reteoo.JoinNode;
import org.drools.core.reteoo.LeftInputAdapterNode;
import org.drools.core.reteoo.Rete;
import org.drools.core.util.FileManager;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.drools.core.reteoo.LeftTuple;
import org.drools.core.reteoo.ObjectTypeNode;
import org.drools.core.reteoo.Rete;
import org.drools.core.util.FileManager;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
Expand All @@ -58,16 +58,23 @@
import org.kie.api.conf.DeclarativeAgendaOption;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.definition.type.FactType;
import org.kie.api.definition.type.Modifies;
import org.kie.api.definition.type.Position;
import org.kie.api.definition.type.PropertyReactive;
import org.kie.api.event.kiebase.DefaultKieBaseEventListener;
import org.kie.api.event.kiebase.KieBaseEventListener;
import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.AgendaEventListener;
import org.kie.api.event.rule.DebugAgendaEventListener;
import org.kie.api.event.rule.DefaultAgendaEventListener;
import org.kie.api.event.rule.MatchCancelledEvent;
import org.kie.api.event.rule.MatchCreatedEvent;
import org.kie.api.io.ResourceType;
import org.kie.api.marshalling.Marshaller;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.api.runtime.rule.FactHandle;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
Expand All @@ -79,17 +86,9 @@
import org.kie.internal.builder.conf.LanguageLevelOption;
import org.kie.internal.builder.conf.RuleEngineOption;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.api.definition.type.Modifies;
import org.kie.api.definition.type.PropertyReactive;
import org.kie.api.event.kiebase.DefaultKieBaseEventListener;
import org.kie.api.event.kiebase.KieBaseEventListener;
import org.kie.api.event.rule.AgendaEventListener;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.marshalling.MarshallerFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import org.kie.api.io.ResourceType;
import org.kie.api.marshalling.Marshaller;
import org.kie.api.runtime.rule.FactHandle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -114,7 +113,6 @@
import java.util.concurrent.atomic.AtomicInteger;

import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;

/**
* Run all the tests with the ReteOO engine implementation
Expand Down Expand Up @@ -5626,4 +5624,42 @@ public void setDescription(final String desc) {
this.description = desc;
}
}

@Test
public void testEvalInSubnetwork() {
// DROOLS-460
String str = "global java.util.List list;\n" +
"\n" +
"declare StatusEvent\n" +
"@role(event)\n" +
"timestamp : int\n" +
"end\n" +
"\n" +
"rule R when\n" +
"$i : Integer()\n" +
"eval(true)\n" +
"exists(\n" +
"Integer(intValue > $i.intValue)\n" +
"and eval(true)\n" +
")\n" +
"then\n" +
"list.add($i.intValue());\n" +
"end";

KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().write( "src/main/resources/r1.drl", str );
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()).newKieSession();

List<Integer> list = new ArrayList<Integer>();
ksession.setGlobal("list", list);

ksession.insert(0);
ksession.fireAllRules();
ksession.insert(1);
ksession.fireAllRules();

assertEquals(1, list.size());
assertEquals(0, (int)list.get(0));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.drools.core.common;

import org.drools.core.phreak.RightTupleEntry;
import org.drools.core.phreak.TupleEntry;

public class TupleEntryQueueImpl implements TupleEntryQueue {
Expand All @@ -11,11 +10,6 @@ public class TupleEntryQueueImpl implements TupleEntryQueue {
private TupleEntry tail;

public synchronized boolean add(TupleEntry entry) {
/*
if (entry.toString().contains("SynthEvent")) {
new RuntimeException("" + size).printStackTrace();
}
*/
if (head == null) {
head = entry;
tail = entry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@

package org.drools.core.common;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

import org.drools.core.reteoo.LeftTuple;
import org.drools.core.rule.ContextEntry;
import org.drools.core.rule.Declaration;
import org.drools.core.spi.BetaNodeFieldConstraint;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

/**
* Checks if one tuple is the start subtuple of other tuple.
* For instance, if we have two tuples:
Expand Down Expand Up @@ -96,7 +96,7 @@ public boolean isAllowedCachedLeft(final ContextEntry context,

public boolean isAllowedCachedRight(final LeftTuple tuple,
final ContextEntry context) {
return tuple.equals( ((TupleStartEqualsConstraintContextEntry) context).right.getSubTuple( tuple.size() ) );
return tuple.skipEmptyHandles().equals( ((TupleStartEqualsConstraintContextEntry) context).right.getSubTuple( tuple.size() ) );
}

public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,14 @@ public LeftTuple getSubTuple(final int elements) {
return entry;
}

public LeftTuple skipEmptyHandles() {
LeftTuple entry = this;
while ( entry != null && entry.getLastHandle() == null ) {
entry = entry.getParent();
}
return entry;
}

/* (non-Javadoc)
* @see org.kie.reteoo.LeftTuple#toObjectArray()
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ public interface LeftTuple
*/
LeftTuple getSubTuple(final int elements);

LeftTuple skipEmptyHandles();

Object[] toObjectArray();

LeftTuple getParent();
Expand Down

0 comments on commit ec835d8

Please sign in to comment.