@Test public void testAlphaNode() { final PropagationContext context = pctxFactory.createPropagationContext(0, PropagationContext.INSERTION, null, null, null); final StatefulKnowledgeSessionImpl workingMemory = new StatefulKnowledgeSessionImpl(1L, kBase); final ClassFieldReader extractor = store.getReader(Cheese.class, "type"); final MvelConstraint constraint = new MvelConstraintTestUtil( "type == \"stilton\"", FieldFactory.getInstance().getFieldValue("stilton"), extractor); final List list = new ArrayList(); final Cheese cheese1 = new Cheese("cheddar", 20); final Cheese cheese2 = new Cheese("brie", 20); list.add(cheese1); list.add(cheese2); final MockDataProvider dataProvider = new MockDataProvider(list); final Pattern pattern = new Pattern(0, new ClassObjectType(Cheese.class)); From fromCe = new From(dataProvider); fromCe.setResultPattern(pattern); final FromNode from = new FromNode( 3, dataProvider, new MockTupleSource(80), new AlphaNodeFieldConstraint[] {constraint}, null, 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.setType("stilton"); 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.setType("stilton"); 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, workingMemory); assertEquals(3, asserted.size()); tuple = (Tuple) ((Object[]) asserted.get(1))[0]; assertSame(person3, tuple.toFactHandles()[0].getObject()); assertSame(cheese1, tuple.toFactHandles()[1].getObject()); tuple = (Tuple) ((Object[]) asserted.get(2))[0]; assertSame(person3, tuple.toFactHandles()[0].getObject()); assertSame(cheese2, tuple.toFactHandles()[1].getObject()); assertNotSame(cheese1, cheese2); }
@Test public void testBetaNode() { final PropagationContext context = pctxFactory.createPropagationContext(0, PropagationContext.INSERTION, null, null, null); final StatefulKnowledgeSessionImpl workingMemory = new StatefulKnowledgeSessionImpl( 1L, (InternalKnowledgeBase) KnowledgeBaseFactory.newKnowledgeBase()); final ClassFieldReader priceExtractor = store.getReader(Cheese.class, "price"); final ClassFieldReader ageExtractor = store.getReader(Person.class, "age"); 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, workingMemory); assertEquals(3, asserted.size()); tuple = (Tuple) ((Object[]) asserted.get(1))[0]; assertSame(person3, tuple.toFactHandles()[0].getObject()); assertSame(cheese1, tuple.toFactHandles()[1].getObject()); tuple = (Tuple) ((Object[]) asserted.get(2))[0]; assertSame(person3, tuple.toFactHandles()[0].getObject()); assertSame(cheese2, tuple.toFactHandles()[1].getObject()); assertNotSame(cheese1, cheese2); }