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::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::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;
    }
}