void migrate_block(Block* target, Migration* migration) { ca_assert(target != migration->oldBlock); if (target == migration->newBlock) return; // Store a cache of lookups that we've made in this call. TermMap cache; for (BlockIterator it(target); it; ++it) { Term* term = *it; // Iterate through each "dependency", which includes the function & inputs. for (int i=0; i < term->numDependencies(); i++) { Term* ref = term->dependency(i); Term* newRef = NULL; if (cache.contains(ref)) { newRef = cache[ref]; } else { // Lookup and save result in cache newRef = migrate_term_pointer(ref, migration); cache[ref] = newRef; } // Possibly rebind if (newRef != ref) term->setDependency(i, newRef); } } }
void update_all_code_references(Branch* target, Branch* oldBranch, Branch* newBranch) { ca_assert(target != oldBranch); ca_assert(target != newBranch); // Store a cache of lookups that we've made in this call. TermMap cache; for (BranchIterator it(target); it.unfinished(); it.advance()) { Term* term = *it; // Iterate through each "dependency", which includes the function & inputs. for (int i=0; i < term->numDependencies(); i++) { Term* ref = term->dependency(i); Term* newRef = NULL; if (cache.contains(ref)) { newRef = cache[ref]; } else { // Lookup and save result in cache newRef = translate_term_across_branches(ref, oldBranch, newBranch); cache[ref] = newRef; } // Possibly rebind if (newRef != ref) term->setDependency(i, newRef); } } }
void TextIndexMergerTestCase::checkMergedResult(TermIteratorPtr& pTermIt, TermMap& answer) { CPPUNIT_ASSERT(pTermIt); CPPUNIT_ASSERT_EQUAL((int64_t)answer.size(), pTermIt->size()); size_t termCount = 0; while (pTermIt->hasNext()) { TermIterator::TermEntry entry = pTermIt->next(); const TextTermIterator::TermType* pTerm = dynamic_cast<const TextTermIterator::TermType*>(entry.term); CPPUNIT_ASSERT(pTerm != NULL); uint64_t hash = pTerm->getValue(); FX_TRACE("Term hash: %llu", hash); TermMap::const_iterator it = answer.find(hash); CPPUNIT_ASSERT(it != answer.end()); CPPUNIT_ASSERT_EQUAL(it->first, hash); const TermMeta& termMeta = entry.postingIterator->getTermMeta(); size_t df = it->second.size(); CPPUNIT_ASSERT_EQUAL((df_t)df, termMeta.getDocFreq()); ctf_t ctf = 0; for (size_t i = 0; i < df; ++i) { docid_t docId = entry.postingIterator->skipTo(it->second[i].first); CPPUNIT_ASSERT_EQUAL(it->second[i].first, docId); tf_t tf = it->second[i].second.size(); CPPUNIT_ASSERT_EQUAL(tf, entry.postingIterator->freq()); for (size_t j = 0; j < (size_t)tf; ++j) { loc_t posExp = it->second[i].second[j]; loc_t pos = entry.postingIterator->skipToPosition(posExp); CPPUNIT_ASSERT_EQUAL(posExp, pos); } ctf += it->second[i].second.size(); } CPPUNIT_ASSERT_EQUAL(ctf, termMeta.getCTF()); termCount++; } CPPUNIT_ASSERT_EQUAL(answer.size(), termCount); }
void TextIndexMergerTestCase::makeMergedAnswer(TermMap& mergedAnswer) { for (size_t j = 0; j < m_nNumEntries; ++j) { TermMap& ans = m_mergeEntries[j]->answer; for (TermMap::const_iterator it2 = ans.begin(); it2 != ans.end(); ++it2) { for (size_t l = 0; l < it2->second.size(); ++l) { if (m_mergeEntries[j]->pDocIdRemapper) { docid_t docId = it2->second[l].first; if (!m_mergeEntries[j]->pDocFilter->test((size_t)docId)) { docId = (*(m_mergeEntries[j]->pDocIdRemapper))[docId]; TermMap::iterator it = mergedAnswer.find(it2->first); if (it == mergedAnswer.end()) { DocVector docVect; mergedAnswer.insert(make_pair(it2->first, docVect)); it = mergedAnswer.find(it2->first); } it->second.push_back(make_pair(docId + m_mergeEntries[j]->newBaseDocId, it2->second[l].second)); } } else { TermMap::iterator it = mergedAnswer.find(it2->first); if (it == mergedAnswer.end()) { DocVector docVect; mergedAnswer.insert(make_pair(it2->first, docVect)); it = mergedAnswer.find(it2->first); } it->second.push_back(make_pair(it2->second[l].first + m_mergeEntries[j]->newBaseDocId, it2->second[l].second)); } // FX_TRACE("==term: %llu, doc: %d, first pos: %d", it2->first, it2->second[l].first, // it2->second[l].second[0]); } } } }
void TextIndexMergerTestCase::printPositngAnswer(const TermMap& answer) { for (TermMap::const_iterator it = answer.begin(); it != answer.end(); ++it) { std::cout << "Anser term hash: " << it->first << std::endl; std::cout << "anser doc list: " << std::endl; for (size_t i = 0; i < it->second.size(); ++i) { std::cout << it->second[i].first << ", "; } std::cout << "end anser doc list: " << std::endl; ctf_t ctf = 0; std::cout << "anser tf list: " << std::endl; for (size_t i = 0; i < it->second.size(); ++i) { ctf += it->second[i].second.size(); std::cout << it->second[i].second.size() << ", "; } std::cout << "end anser tf list: " << std::endl; std::cout << "anser pos list: " << std::endl; for (size_t i = 0; i < it->second.size(); ++i) { for (size_t j = 0; j < it->second[i].second.size(); ++j) { std::cout << it->second[i].second[j] << ", "; } } std::cout << "end anser pos list: " << std::endl; std::cout << "Anser term meta: df: " << it->second.size() << ", ctf: " << ctf << std::endl; } }
void TermNamespace::remapPointers(TermMap const& remapping) { StringToTermMap::iterator it; for (it = _map.begin(); it != _map.end(); ) { Term* replacement = remapping.getRemapped(it->second); if (replacement != it->second) { if (replacement == NULL) { _map.erase(it++); continue; } else { _map[it->first] = replacement; } } ++it; } }