if ( subNetworkSegmentMemory == null ) {
// we need to stop recursion here
createSegmentMemory( ( LeftTupleSource ) subnetworkLts, wm );
}
RiaNodeMemory riaMem = ( RiaNodeMemory ) wm.getNodeMemory( (MemoryFactory) riaNode );
bm.setRiaRuleMemory(riaMem.getRiaPathMemory());
if ( updateNodeBit && riaMem.getRiaPathMemory().getAllLinkedMaskTest() > 0 ) {
// only ria's with reactive subnetworks can be disabled and thus need checking
allLinkedTestMask = allLinkedTestMask | nodePosMask;
}
} else if ( updateNodeBit &&
( !(NodeTypeEnums.NotNode == tupleSource.getType() && !((NotNode)tupleSource).isEmptyBetaConstraints()) &&
NodeTypeEnums.AccumulateNode != tupleSource.getType()) ) {
// non empty not nodes and accumulates can never be disabled and thus don't need checking
allLinkedTestMask = allLinkedTestMask | nodePosMask;
}
bm.setNodePosMaskBit(nodePosMask);
if ( NodeTypeEnums.NotNode == tupleSource.getType() ) {
// not nodes start up linked in
smem.linkNodeWithoutRuleNotify(bm.getNodePosMaskBit());
}
} else if ( tupleSource.getType() == NodeTypeEnums.LeftInputAdapterNode ) {
LiaNodeMemory liaMemory = ( LiaNodeMemory ) smem.createNodeMemory( ( LeftInputAdapterNode ) tupleSource, wm );
liaMemory.setSegmentMemory( smem );
liaMemory.setNodePosMaskBit( nodePosMask );
allLinkedTestMask = allLinkedTestMask | nodePosMask;
} else if ( tupleSource.getType() == NodeTypeEnums.EvalConditionNode ) {
EvalMemory evalMem = ( EvalMemory ) smem.createNodeMemory( ( EvalConditionNode ) tupleSource, wm );
evalMem.setSegmentMemory( smem );
} else if ( tupleSource.getType() == NodeTypeEnums.ConditionalBranchNode ) {
ConditionalBranchMemory branchMem = ( ConditionalBranchMemory ) smem.createNodeMemory( ( ConditionalBranchNode ) tupleSource, wm );
branchMem.setSegmentMemory( smem );
updateNodeBit = false; // nodes after a branch CE can notify, but they cannot impact linking
} else if ( tupleSource.getType() == NodeTypeEnums.FromNode ) {
FromMemory fromMemory = ( FromMemory ) smem.createNodeMemory( ( FromNode ) tupleSource, wm );
fromMemory.getBetaMemory().setSegmentMemory( smem );
} else if ( tupleSource.getType() == NodeTypeEnums.QueryElementNode ) {
// Initialize the QueryElementNode and have it's memory reference the actual query SegmentMemory
QueryElementNode queryNode = ( QueryElementNode ) tupleSource;
LeftInputAdapterNode liaNode = getQueryLiaNode(queryNode.getQueryElement().getQueryName(), getQueryOtn(segmentRoot));
LiaNodeMemory liam = ( LiaNodeMemory ) wm.getNodeMemory( (MemoryFactory) liaNode );
SegmentMemory querySmem = liam.getSegmentMemory();
if ( querySmem == null ) {
querySmem = createSegmentMemory( liaNode, wm );
}
QueryElementNodeMemory queryNodeMem = ( QueryElementNodeMemory ) smem.createNodeMemory( queryNode, wm );
queryNodeMem.setQuerySegmentMemory( querySmem );
queryNodeMem.setSegmentMemory( smem );
}
nodePosMask = nodePosMask << 1;
if ( tupleSource.getSinkPropagator().size() == 1 ) {
LeftTupleSinkNode sink = (LeftTupleSinkNode) tupleSource.getSinkPropagator().getFirstLeftTupleSink() ;
if ( NodeTypeEnums.isLeftTupleSource( sink ) ) {
tupleSource = ( LeftTupleSource ) sink;
} else {
// rtn or rian
// While not technically in a segment, we want to be able to iterate easily from the last node memory to the ria/rtn memory
// we don't use createNodeMemory, as these may already have been created by, but not added, by the method updateRiaAndTerminalMemory
if ( sink.getType() == NodeTypeEnums.RightInputAdaterNode) {
RiaNodeMemory memory = ( RiaNodeMemory) wm.getNodeMemory( (MemoryFactory) sink );
smem.getNodeMemories().add( memory.getRiaPathMemory() );
memory.getRiaPathMemory().setSegmentMemory( smem );
} else if ( NodeTypeEnums.isTerminalNode( sink) ) {
PathMemory rmem = (PathMemory) wm.getNodeMemory( (MemoryFactory) sink );
smem.getNodeMemories().add( rmem );
rmem.setSegmentMemory( smem );
}