public static boolean useLeftMemory(LeftTupleSource tupleSource, Tuple leftTuple) { boolean useLeftMemory = true; if (!tupleSource.isLeftTupleMemoryEnabled()) { // This is a hack, to not add closed DroolsQuery objects Object object = leftTuple.getRootTuple().getFactHandle().getObject(); if (!(object instanceof DroolsQuery) || !((DroolsQuery) object).isOpen()) { useLeftMemory = false; } } return useLeftMemory; }
@Override public Iterator getResults( Tuple leftTuple, InternalWorkingMemory wm, PropagationContext ctx, Object providerContext) { InternalFactHandle fh = leftTuple.getFactHandle(); Object obj = fh.getObject(); if (obj instanceof DroolsQuery) { obj = ((DroolsQuery) obj).getElements()[declaration.getPattern().getOffset()]; } return xpathEvaluator.evaluate(wm, leftTuple, obj).iterator(); }
@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 ReteFromNode from = new ReteFromNode( 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.getObject(0)); assertSame(cheese1, tuple.getObject(1)); 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.getObject(0)); assertSame(cheese1, tuple.getObject(1)); tuple = (Tuple) ((Object[]) asserted.get(2))[0]; assertSame(person3, tuple.getObject(0)); assertSame(cheese2, tuple.getObject(1)); 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 ReteFromNode from = new ReteFromNode( 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.getObject(0)); assertSame(cheese1, tuple.getObject(1)); 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.getObject(0)); assertSame(cheese1, tuple.getObject(1)); tuple = (Tuple) ((Object[]) asserted.get(2))[0]; assertSame(person3, tuple.getObject(0)); assertSame(cheese2, tuple.getObject(1)); assertNotSame(cheese1, cheese2); }