public void crossJoin(){
        
        Iterator BindingVectorIt = queue.keySet().iterator();
        
//        System.err.println(" === DEBUG (RETEQueue::crossJoin) : queue contains " + queue.size() + " triples, sibling contains "+ sibling.queue.size() + " triples.");
        
        while(BindingVectorIt.hasNext()){
            BindingVector env = (BindingVector) BindingVectorIt.next();
            
            // No sibling is defined. There is only one condition in the rule. No need
            // to perform cross join.
            if(sibling == null || continuation == null){
//                System.err.println("!!!!!!!!!!!! sibling or continuation can not be null while crossjoining !!!!!!!!!!!!!!!!!");
                return;
            }

            // Cross match the entry in this queue against the entries in the sibling queue
            for (Iterator i = sibling.queue.keySet().iterator(); i.hasNext(); ) {
                Node[] candidate = ((BindingVector)i.next()).getEnvironment();
                Node[] envNodes = env.getEnvironment();
                boolean matchOK = true;
//                Coror.NoJ_All++;
                for (int j = 0; j < matchIndices.length; j++) {
                    int index = matchIndices[j];
                    if ( ! candidate[index].sameValueAs(envNodes[index])) {
                        matchOK = false;
                        break;
                    }
                }
                // Comment by Wei
                // If the matchIndices.length == 0, namely no common variable was found for
                // two adjacent clauses, all possible combinations will be constructed and 
                // propagated to the continuation using continuation.fire(newEnv, isAdd).
                if (matchOK) {
//                    Coror.NoSJ_All++;
                    // Instantiate a new extended environment
                    Node[] newNodes = new Node[candidate.length];
                    for (int j = 0; j < candidate.length; j++) {
                        Node n = candidate[j];
                        newNodes[j] = (n == null) ? envNodes[j] : n;
                    }
                    BindingVector newEnv = new BindingVector(newNodes);
                    // Fire the successor processing
                    continuation.fire(newEnv, true);
                }
            }
        }
    }