void intersectLifeLists(LifeList *cells1, LifeList *cells2, int transl) { /* note: destroys neighborhood values */ copyList(cells2->cellList, cells2->ncells, cells2->neighborhoods, transl); cells1->ncells=intersectLists(cells1->cellList, cells1->ncells, cells2->neighborhoods, cells2->ncells, cells1->neighborhoods); copyList(cells1->neighborhoods, cells1->ncells, cells1->cellList, 0); }
// . returns false if blocks true otherwise // 1. read all termlists for docid range // 2. intersect termlists to get the intersecting docids // 3. increment docid ranges and keep going // 4. when done return the top docids bool Msg39::controlLoop ( ) { loop: // error? if ( g_errno ) { hadError: log(LOG_LOGIC,"query: msg39: controlLoop: %s." , mstrerror(g_errno) ); sendReply ( m_slot , this , NULL , 0 , 0 , true ); return true; } if ( m_phase == 0 ) { // next phase m_phase++; // the starting docid... int64_t d0 = m_ddd; // int16_tcut int64_t delta = MAX_DOCID / (int64_t)m_r->m_numDocIdSplits; // advance to point to the exclusive endpoint m_ddd += delta; // ensure this is exclusive of ddd since it will be // inclusive in the following iteration. int64_t d1 = m_ddd; // fix rounding errors if ( d1 + 20LL > MAX_DOCID ) { d1 = MAX_DOCID; m_ddd = MAX_DOCID; } // fix it m_r->m_minDocId = d0; m_r->m_maxDocId = d1; // -1; // exclude d1 // allow posdbtable re-initialization each time to set // the msg2 termlist ptrs anew, otherwise we core in // call to PosdbTable::init() below //m_posdbTable.m_initialized = false; // reset ourselves, partially, anyway, not tmpq etc. reset2(); // debug log if ( ! m_r->m_forSectionStats && m_debug ) log("msg39: docid split phase %"INT64"-%"INT64"",d0,d1); // wtf? //if ( d0 >= d1 ) break; // load termlists for these docid ranges using msg2 from posdb if ( ! getLists() ) return false; } if ( m_phase == 1 ) { m_phase++; // intersect the lists we loaded using a thread if ( ! intersectLists() ) return false; // error? if ( g_errno ) goto hadError; } // sum up some stats if ( m_phase == 2 ) { m_phase++; if ( m_posdbTable.m_t1 ) { // . measure time to add the lists in bright green // . use darker green if rat is false (default OR) int32_t color; //char *label; color = 0x0000ff00 ; //label = "termlist_intersect"; g_stats.addStat_r ( 0 , m_posdbTable.m_t1 , m_posdbTable.m_t2 , color ); } // accumulate total hits count over each docid split m_numTotalHits += m_posdbTable.m_docIdVoteBuf.length() / 6; // minus the shit we filtered out because of gbminint/gbmaxint/ // gbmin/gbmax/gbsortby/gbrevsortby/gbsortbyint/gbrevsortbyint m_numTotalHits -= m_posdbTable.m_filtered; // error? if ( m_posdbTable.m_errno ) { // we do not need to store the intersection i guess..?? m_posdbTable.freeMem(); g_errno = m_posdbTable.m_errno; log("query: posdbtable had error = %s", mstrerror(g_errno)); sendReply ( m_slot , this , NULL , 0 , 0 ,true); return true; } // if we have more docid ranges remaining do more if ( m_ddd < m_dddEnd ) { m_phase = 0; goto loop; } } // ok, we are done, get cluster recs of the winning docids if ( m_phase == 3 ) { m_phase++; // . this loads them using msg51 from clusterdb // . if m_r->m_doSiteClustering is false it just returns true // . this sets m_gotClusterRecs to true if we get them if ( ! setClusterRecs ( ) ) return false; // error setting clusterrecs? if ( g_errno ) goto hadError; } // process the cluster recs if we got them if ( m_gotClusterRecs && ! gotClusterRecs() ) goto hadError; // . all done! set stats and send back reply // . only sends back the cluster recs if m_gotClusterRecs is true estimateHitsAndSendReply(); return true; }