public static void createChildSegments(final InternalWorkingMemory wm,
SegmentMemory smem,
LeftTupleSinkPropagator sinkProp) {
for ( LeftTupleSinkNode sink = ( LeftTupleSinkNode ) sinkProp.getFirstLeftTupleSink(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
Memory memory = wm.getNodeMemory( (MemoryFactory ) sink );
if ( !( NodeTypeEnums.isTerminalNode( sink ) || sink.getType() == NodeTypeEnums.RightInputAdaterNode ) ) {
if ( memory.getSegmentMemory() == null ) {
SegmentUtilities.createSegmentMemory( (LeftTupleSource ) sink, wm );
}
} else {
// RTNS and RiaNode's have their own segment, if they are the child of a split.
if ( memory.getSegmentMemory() == null ) {
SegmentMemory childSmem = new SegmentMemory(sink);
RuleMemory rmem;
if ( NodeTypeEnums.isTerminalNode( sink ) ) {
rmem = ( RuleMemory ) memory;
} else {
rmem = ((RiaNodeMemory) memory ).getRiaRuleMemory();
}
rmem.getSegmentMemories()[ rmem.getSegmentMemories().length -1 ] = childSmem;
rmem.setSegmentMemory( childSmem );
childSmem.setTipNode( sink );
childSmem.setSinkFactory( sink );
}
}
smem.add( memory.getSegmentMemory() );
}
}