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); }
bool NewChromSweep::next(RecordKeyList &next) { if (_currQueryRec != NULL) { _queryFRM->deleteRecord(_currQueryRec); } nextRecord(true); if (_currQueryRec == NULL) { //eof hit! return false; } if (_currDatabaseRec == NULL && _cache.empty() && !_runToQueryEnd) { return false; } _hits.clear(); _currChromName = _currQueryRec->getChrName(); // have we changed chromosomes? if (!chromChange()) { // scan the database cache for hits scanCache(); //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 (_currDatabaseRec != NULL && _currQueryRec->sameChrom(_currDatabaseRec) && !(_currDatabaseRec->after(_currQueryRec))) { if (intersects(_currQueryRec, _currDatabaseRec)) { _hits.push_back(_currDatabaseRec); } if (_currQueryRec->after(_currDatabaseRec)) { _databaseFRM->deleteRecord(_currDatabaseRec); _currDatabaseRec = NULL; } else { _cache.push_back(_currDatabaseRec); _currDatabaseRec = NULL; } nextRecord(false); } } next.setKey(_currQueryRec); next.setListNoCopy(_hits); return true; }