void CRemoteBlastDbAdapter::x_FetchData(int oid, int begin, int end) { CCachedSeqDataForRemote& cached_seqdata = m_Cache[oid]; _ASSERT( !cached_seqdata.HasSequenceData(begin, end) ); _ASSERT( cached_seqdata.GetLength() != 0 ); _ASSERT( !cached_seqdata.GetIdList().empty() ); _ASSERT( cached_seqdata.IsValid() ); const char seqtype = (GetSequenceType() == CSeqDB::eProtein) ? 'p' : 'n'; CRef<CSeq_interval> seq_int (new CSeq_interval(*cached_seqdata.GetIdList().front(), begin, end)); CBlastServices::TSeqIntervalVector seqids(1, seq_int); CBlastServices::TSeqIdVector ids; CBlastServices::TSeqDataVector seq_data; string errors, warnings; const bool kVerbose = (getenv("VERBOSE") ? true : false); CBlastServices::GetSequenceParts(seqids, m_DbName, seqtype, ids, seq_data, errors, warnings, kVerbose); if (seq_data.empty() || !errors.empty() || !warnings.empty() || ids.empty() ) { RemoteBlastDbLoader_ErrorHandler(errors, warnings); } _ASSERT(ids.size() == seq_data.size()); cached_seqdata.GetSeqDataChunk(begin, end) = seq_data.front(); _ASSERT(cached_seqdata.HasSequenceData(begin, end)); }
void CRemoteBlastDbAdapter::x_FetchDataByBatch(const vector<int>& oids, const vector<TSeqRange>& ranges) { const char seqtype = (GetSequenceType() == CSeqDB::eProtein) ? 'p' : 'n'; if (oids.empty()) { return; } CBlastServices::TSeqIntervalVector seqids; seqids.reserve(oids.size()); for (vector<int>::size_type i = 0; i < oids.size(); i++) { CCachedSeqDataForRemote& cached_seqdata = m_Cache[oids[i]]; _ASSERT( !cached_seqdata.HasSequenceData(ranges[i].GetFrom(), ranges[i].GetToOpen()) ); _ASSERT( cached_seqdata.GetLength() != 0 ); _ASSERT( !cached_seqdata.GetIdList().empty() ); _ASSERT( cached_seqdata.IsValid() ); CRef<CSeq_interval> seq_int (new CSeq_interval(*cached_seqdata.GetIdList().front(), ranges[i].GetFrom(), ranges[i].GetToOpen())); seqids.push_back(seq_int); } CBlastServices::TSeqIdVector ids; CBlastServices::TSeqDataVector seq_data; string errors, warnings; const bool kVerbose = (getenv("VERBOSE") ? true : false); CBlastServices::GetSequenceParts(seqids, m_DbName, seqtype, ids, seq_data, errors, warnings, kVerbose); if (seq_data.empty() || !errors.empty() || !warnings.empty() || ids.empty() ) { RemoteBlastDbLoader_ErrorHandler(errors, warnings); } _ASSERT(seqids.size() == ids.size()); _ASSERT(ids.size() == seq_data.size()); for (vector<int>::size_type i = 0; i < oids.size(); i++) { CCachedSeqDataForRemote& cached_seqdata = m_Cache[oids[i]]; cached_seqdata.GetSeqDataChunk(ranges[i].GetFrom(), ranges[i].GetToOpen()) = seq_data[i]; _ASSERT(cached_seqdata.HasSequenceData(ranges[i].GetFrom(), ranges[i].GetToOpen())); } }
// very specific "set_diff" for integers SEXP set_diff(SEXP x, int n) { SEXP ans, xmatch; int i, j = 0, *buf; if (TYPEOF(x) != INTSXP) error("'x' must be an integer"); if (n <= 0) error("'n' must be a positive integer"); xmatch = match(x, seq_int(n, 1), 0); // took a while to realise: matches vec against x - thanks to comment from Matthew in assign.c! buf = (int *) R_alloc(n, sizeof(int)); for (i=0; i<n; i++) { if (INTEGER(xmatch)[i] == 0) { buf[j++] = i+1; } } n = j; PROTECT(ans = allocVector(INTSXP, n)); memcpy(INTEGER(ans), buf, sizeof(int) * n); // sizeof is of type size_t - no integer overflow issues UNPROTECT(1); return(ans); }