@Test
public void testBetaNode() {
final PropagationContext context = pctxFactory.createPropagationContext(0, PropagationContext.INSERTION, null, null, null);
final AbstractWorkingMemory workingMemory = new AbstractWorkingMemory( 1,
(ReteooRuleBase) RuleBaseFactory.newRuleBase() );
final ClassFieldReader priceExtractor = store.getReader( Cheese.class,
"price",
getClass().getClassLoader() );
final ClassFieldReader ageExtractor = store.getReader( Person.class,
"age",
getClass().getClassLoader() );
final Pattern pattern = new Pattern( 0,
new ClassObjectType( Person.class ) );
final Declaration declaration = new Declaration( "age",
ageExtractor,
pattern );
MvelConstraint variableConstraint = new MvelConstraintTestUtil("price == age", declaration, priceExtractor);
final RuleBaseConfiguration configuration = new RuleBaseConfiguration();
configuration.setIndexRightBetaMemory( false );
configuration.setIndexLeftBetaMemory( false );
final BetaConstraints betaConstraints = new SingleBetaConstraints( variableConstraint,
configuration );
final List list = new ArrayList();
final Cheese cheese1 = new Cheese( "cheddar",
18 );
final Cheese cheese2 = new Cheese( "brie",
12 );
list.add( cheese1 );
list.add( cheese2 );
final MockDataProvider dataProvider = new MockDataProvider( list );
From fromCe = new From(dataProvider);
fromCe.setResultPattern( new Pattern( 0,
new ClassObjectType( Cheese.class ) ) );
final FromNode from = new FromNode( 3,
dataProvider,
new MockTupleSource( 40 ),
new AlphaNodeFieldConstraint[0],
betaConstraints,
true,
buildContext,
fromCe );
final MockLeftTupleSink sink = new MockLeftTupleSink( 5 );
from.addTupleSink( sink );
final Person person1 = new Person( "xxx1",
30 );
final FactHandle person1Handle = workingMemory.insert( person1 );
final LeftTuple tuple1 = new LeftTupleImpl( (DefaultFactHandle) person1Handle,
from,
true );
from.assertLeftTuple( tuple1,
context,
workingMemory );
// nothing should be asserted, as cheese1 is cheddar and we are filtering on stilton
assertEquals( 0,
sink.getAsserted().size() );
//Set cheese1 to stilton and it should now propagate
cheese1.setPrice( 30 );
final Person person2 = new Person( "xxx2",
30 );
final FactHandle person2Handle = workingMemory.insert( person2 );
final LeftTuple tuple2 = new LeftTupleImpl( (DefaultFactHandle) person2Handle,
from,
true );
from.assertLeftTuple( tuple2,
context,
workingMemory );
final List asserted = sink.getAsserted();
assertEquals( 1,
asserted.size() );
Tuple tuple = (Tuple) ((Object[]) asserted.get( 0 ))[0];
assertSame( person2,
tuple.toFactHandles()[0].getObject() );
assertSame( cheese1,
tuple.toFactHandles()[1].getObject() );
cheese2.setPrice( 30 );
final Person person3 = new Person( "xxx2",
30 );
final FactHandle person3Handle = workingMemory.insert( person3 );
final LeftTuple tuple3 = new LeftTupleImpl( (DefaultFactHandle) person3Handle,
from,
true );
from.assertLeftTuple( tuple3,
context,