void KeywordIndexTestCase::testPosting() { const size_t NUM_DOCS = 100; vector<HashAndDoc> hashVec; stringstream ss; size_t i; for (i = 0; i < NUM_DOCS; ++i) { stringstream ss1; ss1 << "abc" << i; ss << ss1.str() << ", " << "abc" << ";"; HashAndDoc hd; hd.nHash = Hash::hashString64(ss1.str().c_str()); hd.docId = (docid_t)i; hashVec.push_back(hd); } GLOBAL_CONF().Build.buildThreadCount = 1; buildKeywordIndex(ss.str()); Index index; index.open(getIndexPath(), Index::READ, NULL); IndexReaderPtr pReader = index.acquireReader(); TermReaderPtr pTermReader = pReader->termReader(); TermIteratorPtr pIterator = pTermReader->termIterator("Keyword1"); CPPUNIT_ASSERT(!pIterator.isNull()); sort(hashVec.begin(), hashVec.end(), hashLess); int32_t j = 0; while (pIterator->hasNext()) { TermIterator::TermEntry entry = pIterator->next(); const Term* pTerm = entry.term; const UInt64Term* pTermX = pTerm->cast<uint64_t>(); uint64_t nCurTerm = pTermX->getValue(); uint64_t nExpTerm = hashVec[j].nHash; CPPUNIT_ASSERT_EQUAL(nExpTerm, nCurTerm); TermPostingIteratorPtr pPostingIter = entry.postingIterator; CPPUNIT_ASSERT(pPostingIter != NULL); docid_t docId = pPostingIter->skipTo(0); CPPUNIT_ASSERT_EQUAL(hashVec[j].docId, docId); docId = pPostingIter->skipTo(docId + 1); CPPUNIT_ASSERT_EQUAL((docid_t)INVALID_DOCID, docId); j++; } //test abc term TermIteratorPtr pIterator2 = pTermReader->termIterator("Keyword2"); CPPUNIT_ASSERT(!pIterator2.isNull()); i = 0; while (pIterator2->hasNext()) { TermIterator::TermEntry entry = pIterator2->next(); const Term* pTerm = entry.term; const UInt64Term* pTermX = pTerm->cast<uint64_t>(); uint64_t nCurTerm = pTermX->getValue(); uint64_t nExpTerm = Hash::hashString64("abc"); CPPUNIT_ASSERT_EQUAL(nExpTerm, nCurTerm); TermPostingIteratorPtr pPostingIter = entry.postingIterator; CPPUNIT_ASSERT(pPostingIter != NULL); docid_t docId = 0; docid_t docIdRet = 0; while ((docIdRet = pPostingIter->skipTo(docId)) != INVALID_DOCID) { CPPUNIT_ASSERT_EQUAL(docId++, docIdRet); } CPPUNIT_ASSERT_EQUAL((docid_t)100, docId); i++; } CPPUNIT_ASSERT_EQUAL((size_t)1, i); }