((ReteooRuleBase)ruleBase).invalidateSegmentPrototype(splitStartNode);
for ( InternalWorkingMemory wm : wms ) {
PathMemory removedPmem = (PathMemory) wm.getNodeMemory( (MemoryFactory) tn);
int s = getSegmentPos(splitStartNode, null);
// if a segment is going to be merged it is necessary to flush all its staged left tuples before doing any change to the network
flushSegmentIfMerge(wm, tn, splitStartNode, s);
// must be done before segments are mutated
flushStagedTuples(splitStartNode, removedPmem, wm, true);
//
if (NodeTypeEnums.LeftInputAdapterNode == splitStartNode.getType() && splitStartNode.getAssociations().size() == 1) {
// rule added with no sharing
deleteLiaFacts(splitStartNode, wm);
}
LeftTupleSink sink;
if ( splitStartNode.getAssociations().size() == 1 ) {
// there is no sharing, so get the node after the root of the only SegmentMemory
SegmentMemory sm = removedPmem.getSegmentMemories()[s];
if ( sm == null ) {
continue; // this rule has not been initialized yet
}
sink = ((LeftInputAdapterNode)sm.getRootNode()).getSinkPropagator().getFirstLeftTupleSink();
} else {
// Sharing exists, get the root of the SegmentMemory after the split
SegmentMemory sm = removedPmem.getSegmentMemories()[s+1];
if ( sm == null ) {
continue; // this rule has not been initialized yet
}
sink = (LeftTupleSink) removedPmem.getSegmentMemories()[s+1].getRootNode();
}
deleteFacts( sink, wm);
if ( splitStartNode.getAssociations().size() > 1 ) {
List<PathMemory> pathMems = new ArrayList<PathMemory>();
collectRtnPathMemories(splitStartNode, wm, pathMems, tn); // get all PathMemories, except current
List<SegmentMemory[]> previousSmems = reInitPathMemories(wm, pathMems, tn.getRule() );
if ( splitStartNode.getSinkPropagator().size() == 2 ) {
// can only be two if the removing node causes the split to be removed
int p = 0;
for ( PathMemory pmem : pathMems) {
SegmentMemory[] smems = previousSmems.get(p);
for (int i = 0; i < smems.length; i++ ) {
SegmentMemory sm = smems[i];
if ( sm == null ) {
continue; // SegmentMemory is not yet initialized
}
if ( i < s ) {
correctSegmentBeforeSplitOnRemove(wm, removedPmem, pmem, sm, p);
} else if ( i == s ) {
if (smems[i+1] != null) {
correctSegmentOnSplitOnRemove(wm, sm, smems[i+1], pmem, removedPmem, p);
i++; // increase to skip merged segment
}
} else if (i > s) {
correctSegmentAfterSplitOnRemove(wm, pmem, i, sm);
}
}
p++;
}
} else {
int p = 0;
for ( PathMemory pmem : pathMems) {
SegmentMemory[] smems = previousSmems.get(p++);
for (int i = 0; i < pmem.getSegmentMemories().length; i++) {
if ( smems[i] == null) {
continue;
}
smems[i].getPathMemories().remove(removedPmem);
pmem.getSegmentMemories()[i] = smems[i];
}
}
}
}
if ( removedPmem.getRuleAgendaItem() != null && removedPmem.getRuleAgendaItem().isQueued() ) {
removedPmem.getRuleAgendaItem().dequeue();
}
}
}