/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.compiler.phreak;
import org.drools.core.RuleBaseConfiguration;
import org.drools.core.common.InternalWorkingMemory;
import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.definitions.impl.KnowledgePackageImpl;
import org.drools.core.definitions.rule.impl.RuleImpl;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.drools.core.impl.StatefulKnowledgeSessionImpl;
import org.drools.core.phreak.PhreakNotNode;
import org.drools.core.reteoo.BetaMemory;
import org.drools.core.reteoo.JoinNode;
import org.drools.core.reteoo.LeftTupleSink;
import org.drools.core.reteoo.NodeTypeEnums;
import org.drools.core.reteoo.NotNode;
import org.drools.core.reteoo.SegmentMemory;
import org.drools.core.reteoo.builder.BuildContext;
import org.drools.core.rule.MVELDialectRuntimeData;
import org.junit.Test;
import static org.drools.compiler.phreak.A.a;
import static org.drools.compiler.phreak.B.b;
public class PhreakNotNodeTest {
BuildContext buildContext;
NotNode notNode;
JoinNode sinkNode;
InternalWorkingMemory wm;
BetaMemory bm;
private void setupNotNode(String operator) {
buildContext = createContext();
notNode = (NotNode) BetaNodeBuilder.create( NodeTypeEnums.NotNode, buildContext )
.setLeftType( A.class )
.setBinding( "object", "$object" )
.setRightType( B.class )
.setConstraint( "object", operator, "$object" ).build();
sinkNode = (JoinNode) BetaNodeBuilder.create( NodeTypeEnums.JoinNode, buildContext ).build();
notNode.addTupleSink( sinkNode );
wm = ((StatefulKnowledgeSessionImpl)buildContext.getKnowledgeBase().newStatefulKnowledgeSession());
bm =(BetaMemory) wm.getNodeMemory( notNode );
BetaMemory bm1 =(BetaMemory) wm.getNodeMemory( sinkNode );
SegmentMemory smem = new SegmentMemory( notNode ) ;
bm.setSegmentMemory( smem );
SegmentMemory childSmem = new SegmentMemory( sinkNode ) ;
bm1.setSegmentMemory( childSmem );
smem.add( childSmem );
}
A a0 = a( 0 );
A a1 = a( 1 );
A a2 = a( 2 );
A a3 = a( 3 );
A a4 = a( 4 );
B b0 = b( 0 );
B b1 = b( 1 );
B b2 = b( 2 );
B b3 = b( 3 );
B b4 = b( 4 );
@Test
public void test1() {
setupNotNode("!=");
// @formatter:off
test().left().insert( a0, a1, a2 )
.result().insert( a2,
a1,
a0 )
.left(a2, a1, a0)
.run().getActualResultLeftTuples().resetAll();
test().left().delete( a2 )
.right().insert( b1 )
.result().delete( )
.left( a1 )
.right( b1 )
.run().getActualResultLeftTuples().resetAll();
// @formatter:on
}
@Test
public void test2() {
setupNotNode("<");
// @formatter:off
test().left().insert( a0, a1, a2 )
.result().insert( a2, a1, a0 )
.left(a2, a1, a0)
.run().getActualResultLeftTuples().resetAll();
test().right().insert( b1 )
.result().delete( )
.left( a0, a1 )
.right( b1 )
.run().getActualResultLeftTuples().resetAll();
// @formatter:on
}
private Scenario test() {
return test(notNode, sinkNode,
bm, wm);
}
private Scenario test(NotNode notNode,
LeftTupleSink sinkNode,
BetaMemory bm,
InternalWorkingMemory wm) {
return new Scenario( PhreakNotNode.class, notNode, sinkNode, bm, wm ) ;
}
public BuildContext createContext() {
RuleBaseConfiguration conf = new RuleBaseConfiguration();
KnowledgeBaseImpl rbase = new KnowledgeBaseImpl( "ID",
conf );
BuildContext buildContext = new BuildContext( rbase );
RuleImpl rule = new RuleImpl( "rule1").setPackage( "org.pkg1" );
InternalKnowledgePackage pkg = new KnowledgePackageImpl( "org.pkg1" );
pkg.getDialectRuntimeRegistry().setDialectData( "mvel", new MVELDialectRuntimeData() );
pkg.addRule( rule );
buildContext.setRule( rule );
return buildContext;
}
}