package org.drools.chance.reteoo.nodes; import org.drools.base.InternalViewChangedEventListener; import org.drools.chance.degree.simple.SimpleDegree; import org.drools.chance.evaluation.CompositeEvaluation; import org.drools.chance.evaluation.Evaluation; import org.drools.chance.evaluation.MockEvaluation; import org.drools.chance.evaluation.QueryEvaluation; import org.drools.chance.reteoo.ChanceFactHandle; import org.drools.chance.reteoo.tuples.ImperfectQueryElementNodeLeftTuple; import org.drools.chance.reteoo.tuples.ImperfectRightTuple; import org.drools.chance.reteoo.tuples.ImperfectTuple; import org.drools.common.InternalFactHandle; import org.drools.common.QueryElementFactHandle; import org.drools.reteoo.*; import org.drools.reteoo.builder.BuildContext; import org.drools.rule.QueryElement; public class ChanceQueryElementNode extends QueryElementNode { private int leftSourceId; public ChanceQueryElementNode() { } public ChanceQueryElementNode( int id, LeftTupleSource tupleSource, QueryElement queryElement, boolean tupleMemoryEnabled, boolean openQuery, BuildContext context ) { super( id, tupleSource, queryElement, tupleMemoryEnabled, openQuery, context ); } public int getLeftSourceId() { return leftSourceId; } public void setLeftSourceId(int leftSourceId) { this.leftSourceId = leftSourceId; } @Override public LeftTuple createLeftTuple(InternalFactHandle factHandle, LeftTupleSink sink, boolean leftTupleMemoryEnabled) { ImperfectQueryElementNodeLeftTuple tup = new ImperfectQueryElementNodeLeftTuple( factHandle, sink, leftTupleMemoryEnabled ); // throw new UnsupportedOperationException( "Not yet" ); int key = ( (LeftInputAdapterNode) this.getLeftTupleSource() ).getParentObjectSource().getId(); Evaluation eval = ((ChanceFactHandle) factHandle).getCachedEvaluation(key); tup.addEvaluation( eval != null ? eval : new MockEvaluation( key, SimpleDegree.TRUE ) ); return tup; } @Override public LeftTuple createLeftTuple(LeftTuple leftTuple, LeftTupleSink sink, boolean leftTupleMemoryEnabled) { ImperfectQueryElementNodeLeftTuple tup = new ImperfectQueryElementNodeLeftTuple( leftTuple, sink, leftTupleMemoryEnabled ); if ( leftTuple instanceof ImperfectTuple ) { tup.addEvaluation( ((ImperfectTuple) leftTuple).getEvaluation() ); } // throw new UnsupportedOperationException( "Not yet" ); return tup; } @Override public LeftTuple createLeftTuple(LeftTuple leftTuple, RightTuple rightTuple, LeftTupleSink sink) { ImperfectQueryElementNodeLeftTuple tup = new ImperfectQueryElementNodeLeftTuple( leftTuple, rightTuple, sink ); tup.addEvaluation( ((ImperfectTuple) leftTuple).getEvaluation() ); tup.addEvaluation( ((ImperfectTuple) rightTuple).getEvaluation() ); return tup; } @Override public LeftTuple createLeftTuple(LeftTuple leftTuple, RightTuple rightTuple, LeftTuple currentLeftChild, LeftTuple currentRightChild, LeftTupleSink sink, boolean leftTupleMemoryEnabled) { ImperfectQueryElementNodeLeftTuple tup = new ImperfectQueryElementNodeLeftTuple( leftTuple, rightTuple, currentLeftChild, currentRightChild, sink, leftTupleMemoryEnabled ); tup.addEvaluation( ((ImperfectTuple) leftTuple).getEvaluation() ); tup.addEvaluation( ((ImperfectTuple) rightTuple).getEvaluation() ); return tup; } protected UnificationNodeViewChangedEventListener createCollector( LeftTuple leftTuple, int[] varIndexes, boolean tupleMemoryEnabled ) { return new ImperfectUnificationNodeViewChangedEventListener( leftTuple, varIndexes, this, tupleMemoryEnabled ); } public static class ImperfectUnificationNodeViewChangedEventListener extends UnificationNodeViewChangedEventListener { public ImperfectUnificationNodeViewChangedEventListener(LeftTuple leftTuple, int[] variables, QueryElementNode node, boolean tupleMemoryEnabled) { super(leftTuple, variables, node, tupleMemoryEnabled); } protected RightTuple createResultRightTuple( QueryElementFactHandle resultHandle, LeftTuple resultLeftTuple, boolean open ) { Evaluation eval = ( (ImperfectTuple) resultLeftTuple ).getEvaluation(); Evaluation local = new QueryEvaluation( node.getId(), eval, node.getQueryElement().getQueryName() ); RightTuple rightTuple = new ImperfectRightTuple( resultHandle, local ); if ( open ) { rightTuple.setLeftTuple( resultLeftTuple ); resultLeftTuple.setObject( rightTuple ); } return rightTuple; } } }