/** * @inheritDoc As the accumulate node will always generate a resulting tuple, we must always * destroy it */ public void retractLeftTuple( final LeftTuple leftTuple, final PropagationContext context, final InternalWorkingMemory workingMemory) { final AccumulateMemory memory = (AccumulateMemory) workingMemory.getNodeMemory(this); if (leftTuple.getMemory().isStagingMemory()) { leftTuple.getMemory().remove(leftTuple); } else { ((BetaMemory) memory.getBetaMemory()).getLeftTupleMemory().remove(leftTuple); } leftTuple.setMemory(null); final AccumulateContext accctx = (AccumulateContext) leftTuple.getObject(); if (accctx.getAction() != null) { // there is a scheduled activation, we must cancel it context.removeInsertAction(accctx.getAction()); } leftTuple.setObject(null); removePreviousMatchesForLeftTuple(leftTuple, workingMemory, memory, accctx); if (accctx.propagated) { // if tuple was previously propagated, retract it and destroy result fact handle this.sink.propagateRetractLeftTupleDestroyRightTuple(leftTuple, context, workingMemory); } else { // if not propagated, just destroy the result fact handle // workingMemory.getFactHandleFactory().destroyFactHandle( accctx.result.getFactHandle() ); } }