Example #1
0
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);
        }
    }
}
Example #2
0
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;
    }
}
Example #6
0
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;
    }
}