Package org.drools.common

Examples of org.drools.common.LeftTupleSets


            RightTupleMemory rtm = bm.getRightTupleMemory();
            ContextEntry[] contextEntry = bm.getContext();
            BetaConstraints constraints = notNode.getRawConstraints();
            FastIterator it = notNode.getLeftIterator( ltm );

            LeftTupleSets stagedLeftTuples = null;
            if ( !bm.getSegmentMemory().isEmpty() ) {
                stagedLeftTuples = bm.getSegmentMemory().getFirst().getStagedLeftTuples();
            }

            unlinkNotNodeOnRightInsert( notNode,
View Full Code Here


            boolean useLeftMemory = true;
            RightTupleSets srcRightTuples = am.getBetaMemory().getStagedRightTuples();
           
            // We need to collect which leftTuple where updated, so that we can
            // add their result tuple to the real target tuples later
            LeftTupleSets tempLeftTuples = new LeftTupleSets();

            if ( srcLeftTuples.getDeleteFirst() != null ) {
                // use the real target here, as dealing direct with left tuples
                doLeftDeletes( accNode, am, wm, srcLeftTuples, trgLeftTuples );
            }
           
            if ( srcRightTuples.getDeleteFirst() != null ) {
                doRightDeletes( accNode, am, wm, srcRightTuples, tempLeftTuples );
            }           

            if ( srcLeftTuples.getUpdateFirst() != null || srcRightTuples.getUpdateFirst() != null ) {
                dpUpdatesReorderLeftMemory( am.getBetaMemory(), wm,
                                            srcRightTuples, srcLeftTuples );
                dpUpdatesReorderRightMemory( am.getBetaMemory(), wm,
                                             srcRightTuples, srcLeftTuples );               
            }
           
            if ( srcLeftTuples.getUpdateFirst() != null ) {
                doLeftUpdates( accNode, sink, am, wm, srcLeftTuples, tempLeftTuples );
            }           

            if ( srcRightTuples.getUpdateFirst() != null ) {
                doRightUpdates( accNode, sink, am, wm, srcRightTuples, tempLeftTuples );
            }

            if ( srcRightTuples.getInsertFirst() != null ) {
                doRightInserts( accNode, sink, am, wm, srcRightTuples, tempLeftTuples );
            }

            if ( srcLeftTuples.getInsertFirst() != null ) {
                doLeftInserts( accNode, sink, am, wm, srcLeftTuples, tempLeftTuples );
            }
           
            Accumulate accumulate = accNode.getAccumulate();
            // we do not need collect retracts. RightTuple retracts end up as updates for lefttuples.
            // LeftTuple retracts are already on the trgLeftTuples
            for ( LeftTuple leftTuple = tempLeftTuples.getInsertFirst(); leftTuple != null; ) {
                LeftTuple next = leftTuple.getStagedNext();
                evaluateResultConstraints( accNode, sink, accumulate, leftTuple, leftTuple.getPropagationContext(),
                                           wm, am, (AccumulateContext) leftTuple.getObject(), useLeftMemory,
                                           trgLeftTuples, stagedLeftTuples );
                leftTuple.clearStaged();
                leftTuple = next;               
            }
           
            for ( LeftTuple leftTuple = tempLeftTuples.getUpdateFirst(); leftTuple != null; ) {
                LeftTuple next = leftTuple.getStagedNext();
                evaluateResultConstraints( accNode, sink, accumulate, leftTuple, leftTuple.getPropagationContext(),
                                           wm, am, (AccumulateContext) leftTuple.getObject(), useLeftMemory,
                                           trgLeftTuples, stagedLeftTuples );
                leftTuple.clearStaged();
View Full Code Here

                                                      liaNode.getSinkPropagator() );
            }
            sm = sm.getFirst(); // repoint to the child sm
        }

        LeftTupleSets leftTuples = sm.getStagedLeftTuples();
        switch ( leftTuple.getStagedType() ) {
        // handle clash with already staged entries
            case LeftTuple.INSERT :
                leftTuples.removeInsert( leftTuple );
                break;
            case LeftTuple.UPDATE :
                leftTuples.removeUpdate( leftTuple );
                break;
        }

        if ( sm.getStagedLeftTuples().deleteSize() == 0 ) {
            // staged is empty, so notify rule, to force re-evaluation
            sm.notifyRuleLinkSegment( wm );
        }
        leftTuple.setPropagationContext( context );
        sm.getStagedLeftTuples().addDelete( leftTuple );

        if ( sm.getNext() != null) {
            // sm points to lia child sm, so iterate for all remaining children

            for ( sm = sm.getNext(); sm != null; sm = sm.getNext() ) {
                // iterate for peers segment memory
                leftTuple = leftTuple.getPeer();
                leftTuples = sm.getStagedLeftTuples();
                switch ( leftTuple.getStagedType() ) {
                // handle clash with already staged entries
                    case LeftTuple.INSERT :
                        leftTuples.removeInsert( leftTuple );
                        break;
                    case LeftTuple.UPDATE :
                        leftTuples.removeUpdate( leftTuple );
                        break;
                }
                if ( sm.getStagedLeftTuples().deleteSize() == 0 ) {
                    // staged is empty, so notify rule, to force re-evaluation
                    sm.notifyRuleLinkSegment( wm );
                }
                leftTuple.setPropagationContext( context );
                leftTuples.addDelete( leftTuple );
            }
        }

        if ( lm.getAndDecreaseCounter() == 1 ) {
            lm.unlinkNode( wm );
View Full Code Here

                SegmentUtilities.createChildSegments( wm, sm, liaNode.getSinkPropagator() );
            }
            sm = sm.getFirst(); // repoint to the child sm
        }
       
        LeftTupleSets leftTuples = sm.getStagedLeftTuples();
                      
        LeftTupleSink sink = liaNode.getSinkPropagator().getFirstLeftTupleSink()
        leftTuple.setPropagationContext( context );                     
        if ( leftTuple.getStagedType() == LeftTuple.NONE ) {
            // if LeftTuple is already staged, leave it there
            long mask = sink.getLeftInferredMask();

            if ( mask == Long.MAX_VALUE ||
                 intersect( context.getModificationMask(),  mask) ) {
                // only add to staging if masks match
               
                if ( sm.getStagedLeftTuples().updateSize() == 0 ) {
                    // staged is empty, so notify rule, to force re-evaluation
                    sm.notifyRuleLinkSegment(wm);
                }               
                leftTuples.addUpdate( leftTuple )
            }
        }

       
        if sm.getNext() != null ) {
            // sm points to lia child sm, so iterate for all remaining children
            for ( sm = sm.getNext(); sm != null; sm = sm.getNext() ) {
                // iterate for peers segment memory
                leftTuple = leftTuple.getPeer();
                leftTuples = sm.getStagedLeftTuples();
               
                leftTuple.setPropagationContext( context );
                if ( leftTuple.getStagedType() == LeftTuple.NONE ) {
                    // if LeftTuple is already staged, leave it there
                    long mask =  ((LeftTupleSink) sm.getRootNode()).getLeftInferredMask();
                    if ( mask == Long.MAX_VALUE ||
                         intersect( context.getModificationMask(),  mask) ) {
                        // only add to staging if masks match
                       
                        if ( sm.getStagedLeftTuples().updateSize() == 0 ) {
                            // staged is empty, so notify rule, to force re-evaluation
                            sm.notifyRuleLinkSegment(wm);
                        }                     
                        leftTuples.addUpdate( leftTuple )
                    }
                }              
            }
        }
    }   
View Full Code Here

        if ( leftTuples.getDeleteFirst() != null ) {
            for ( LeftTuple leftTuple = leftTuples.getDeleteFirst(); leftTuple != null; leftTuple = leftTuple.getStagedNext()) {                       
                SegmentMemory smem = firstSmem.getNext();
                if ( smem != null ) {
                    for ( LeftTuple peer = leftTuple.getPeer(); peer != null; peer = peer.getPeer() ) {
                        LeftTupleSets stagedLeftTuples = smem.getStagedLeftTuples();
                        switch ( peer.getStagedType() ) {
                            // handle clash with already staged entries
                            case LeftTuple.INSERT:
                                stagedLeftTuples.removeInsert( peer );
                                break;
                            case LeftTuple.UPDATE:
                                stagedLeftTuples.removeUpdate( peer );
                                break;
                       
                        stagedLeftTuples.addDelete( peer );
                        smem = smem.getNext();
                    }
                }
            }
            firstSmem.getStagedLeftTuples().addAllDeletes( leftTuples );
        }
       
        // Process Updates       
        if ( leftTuples.getUpdateFirst() != null ) {
            firstSmem = sourceSegment.getFirst();
            for ( LeftTuple leftTuple = leftTuples.getUpdateFirst(); leftTuple != null; leftTuple = leftTuple.getStagedNext()) {           
                SegmentMemory smem = firstSmem.getNext();
                if ( smem != null ) {               
                    for ( LeftTuple peer = leftTuple.getPeer(); peer != null; peer = peer.getPeer() ) {
                        if ( peer.getStagedType() == LeftTuple.NONE ) {
                            // only stage, if not already staged, if insert, leave as insert
                            LeftTupleSets stagedLeftTuples = smem.getStagedLeftTuples();
                            stagedLeftTuples.addUpdate( peer );
                        }
                       
                        smem = smem.getNext();
                    }
                }           
View Full Code Here

                node = firstSink;
            }  
            nodeMem = smem.getNodeMemories().getFirst().getNext(); // skip the liaNode memory
        }
       
        LeftTupleSets srcTuples = smem.getStagedLeftTuples();
       
        if ( log.isTraceEnabled() ) {
        //     log.trace( "Start Rule[name={}] {}", getRule().getName(), srcTuples.toStringSizes() );
        }
View Full Code Here

        return 0;
    }
   
    public LeftTupleSets eval( NetworkNode node, Memory nodeMem, SegmentMemory[] smems, int smemIndex, LeftTupleSets trgTuples, LeftTupleSets stagedLeftTuples, InternalWorkingMemory wm) {
        LeftTupleSets srcTuples;
       
        SegmentMemory smem = smems[smemIndex];
        while ( true ) {
//            if ( log.isTraceEnabled() ) {
//                log.trace( "Start Node[offset={}, type={}] Rule[name={}]", getRule().getName() );
//            }
            srcTuples = trgTuples; // previous target, is now the source
           
            if ( NodeTypeEnums.isTerminalNode( node ) ) {
                RuleTerminalNode rtn = rmem.getRuleTerminalNode();
                pRtnNode.doNode( rtn, wm, srcTuples );
                return null;
            } else if ( NodeTypeEnums.RightInputAdaterNode == node.getType() ) {
                return trgTuples;
            }          
           
            if ( node == smem.getTipNode() && smem.getFirst() != null) {
                // we are about to process the segment tip, allow it to merge insert/update/delete clashes
                // Can happen if the next segments have not yet been initialized
                stagedLeftTuples = smem.getFirst().getStagedLeftTuples();
            } else {
                stagedLeftTuples = null;
            }         
           
            LeftTupleSinkNode sink = ((LeftTupleSource)node).getSinkPropagator().getFirstLeftTupleSink();

            trgTuples = new LeftTupleSets();
           
            if ( NodeTypeEnums.isBetaNode( node ) ) {
                BetaNode betaNode = ( BetaNode )node;
               
                BetaMemory bm = null;
View Full Code Here

       
        if ( betaNode.getLeftTupleSource().getSinkPropagator().size() == 2 ) {
            // sub network is not part of  share split, so need to handle propagation
            // this ensures the first LeftTuple is actually the subnetwork node
            // and the main outer network now receives the peer, notice the swap at the end "srcTuples == peerTuples"
            LeftTupleSets peerTuples = new LeftTupleSets();
            SegmentPropagator.processPeers( srcTuples, peerTuples, betaNode );
            // Make sure subnetwork Segment has tuples to process
            LeftTupleSets subnetworkStaged =  subSmem.getStagedLeftTuples();
            subnetworkStaged.addAll( srcTuples )

            srcTuples.resetAll();
           
            srcTuples = peerTuples;
        }                   
       
        RightInputAdapterNode riaNode = ( RightInputAdapterNode ) betaNode.getRightInput();
        RiaNodeMemory riaNodeMemory = ( RiaNodeMemory ) wm.getNodeMemory( (MemoryFactory) betaNode.getRightInput() );                   
        LeftTupleSets riaStagedTuples = eval( ( LeftTupleSink ) subSmem.getRootNode(), subSmem.getNodeMemories().getFirst(), riaNodeMemory.getRiaRuleMemory().getSegmentMemories(), subSmem.getPos(), subSmem.getStagedLeftTuples(), null, wm );
       
        for ( LeftTuple leftTuple = riaStagedTuples.getInsertFirst(); leftTuple != null; ) {
            LeftTuple next = leftTuple.getStagedNext();
           
            InternalFactHandle handle = riaNode.createFactHandle( leftTuple, leftTuple.getPropagationContext(), wm );
            RightTuple rightTuple = new RightTuple( handle, betaNode );
            leftTuple.setObject( rightTuple );
            bm.getStagedRightTuples().addInsert( rightTuple );
           
            leftTuple.clearStaged();
            leftTuple = next;
        }
       
        for ( LeftTuple leftTuple = riaStagedTuples.getDeleteFirst(); leftTuple != null;) {
            LeftTuple next = leftTuple.getStagedNext();
           
            bm.getStagedRightTuples().addDelete( (RightTuple) leftTuple.getObject()  );
           
            leftTuple.clearStaged();
            leftTuple = next;           
        }
       
        for ( LeftTuple leftTuple = riaStagedTuples.getUpdateFirst(); leftTuple != null; ) {
            LeftTuple next = leftTuple.getStagedNext();
           
            bm.getStagedRightTuples().addUpdate( (RightTuple) leftTuple.getObject()  );
           
            leftTuple.clearStaged();
View Full Code Here

    public SegmentMemory(NetworkNode rootNode) {
        this.rootNode = rootNode;
        this.ruleMemories = new ArrayList<RuleMemory>( 1 );
        this.nodeMemories = new LinkedList<Memory>();

        this.stagedLeftTuples = new LeftTupleSets();
    }
View Full Code Here

TOP

Related Classes of org.drools.common.LeftTupleSets

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.