void NewChromSweep::masterScan(RecordKeyVector &retList) { for (int i=0; i < _numDBs; i++) { if (dbFinished(i) || chromChange(i, retList, true)) { continue; } else { // scan the database cache for hits scanCache(i, retList); //skip if we hit the end of the DB // advance the db until we are ahead of the query. update hits and cache as necessary while (_currDbRecs[i] != NULL && _currQueryRec->sameChrom(_currDbRecs[i]) && !(_currDbRecs[i]->after(_currQueryRec))) { if (intersects(_currQueryRec, _currDbRecs[i])) { retList.push_back(_currDbRecs[i]); } if (_currQueryRec->after(_currDbRecs[i])) { _dbFRMs[i]->deleteRecord(_currDbRecs[i]); _currDbRecs[i] = NULL; } else { _caches[i].push_back(_currDbRecs[i]); _currDbRecs[i] = NULL; } nextRecord(false, i); } } } }
void CloseSweep::masterScan(RecordKeyVector &retList) { //first clear out everything from the previous scan if (_context->reportDistance()) { _finalDistances.clear(); } //initialize distances for (int i=0; i < _numDBs; i++) { _minUpstreamDist[i] = INT_MAX; _minDownstreamDist[i] = INT_MAX; } for (int i=0; i < _numDBs; i++) { _minUpstreamRecs[i]->clear(); _minDownstreamRecs[i]->clear(); _overlapRecs[i]->clear(); if (dbFinished(i) || chromChange(i, retList)) { continue; } else { // scan the database cache for hits scanCache(i, retList); // skip if we hit the end of the DB // advance the db until we are ahead of the query. update hits and cache as necessary bool stopScanning = false; while (_currDbRecs[i] != NULL && _currQueryRec->sameChrom(_currDbRecs[i]) && !stopScanning) { if (considerRecord(_currDbRecs[i], i, stopScanning) == DELETE) { _dbFRMs[i]->deleteRecord(_currDbRecs[i]); _currDbRecs[i] = NULL; } else { _caches[i].push_back(_currDbRecs[i]); _currDbRecs[i] = NULL; } nextRecord(false, i); } } finalizeSelections(i, retList); } checkMultiDbs(retList); }