diff --git a/test/unit/PosdbTest.cpp b/test/unit/PosdbTest.cpp index 09e9f874..6af8207c 100644 --- a/test/unit/PosdbTest.cpp +++ b/test/unit/PosdbTest.cpp @@ -24,6 +24,11 @@ static void dumpPosdb() { g_posdb.getRdb()->getBase(0)->generateGlobalIndex(); } +static void mergePosdb() { + g_posdb.getRdb()->getBase(0)->attemptMerge(0, true); + g_posdb.getRdb()->getBase(0)->attemptMerge(0, true); +} + class PosdbNoMergeTest : public ::testing::Test { protected: void SetUp() { @@ -485,3 +490,53 @@ TEST_F(PosdbNoMergeTest, SingleDocSpiderDumpDeleteDumpSpider) { EXPECT_TRUE(list.isExhausted()); } + +TEST_F(PosdbNoMergeTest, SingleDocSpiderDumpDeleteDumpSpiderMerging) { + static const int64_t docId = 1; + + // first round + // doc contains 3 words (a, b, c) + GbTest::addPosdbKey(m_rdb, 'a', docId, 0); + GbTest::addPosdbKey(m_rdb, 'b', docId, 0); + GbTest::addPosdbKey(m_rdb, 'c', docId, 0); + GbTest::addPosdbKey(m_rdb, 'z', docId, 0, false, true); + dumpPosdb(); + + // second round + // doc deleted + GbTest::addPosdbKey(m_rdb, 'a', docId, 0, true); + GbTest::addPosdbKey(m_rdb, 'b', docId, 0, true); + GbTest::addPosdbKey(m_rdb, 'c', docId, 0, true); + GbTest::addPosdbKey(m_rdb, 'z', docId, 0, true, true); + GbTest::addPosdbKey(m_rdb, POSDB_DELETEDOC_TERMID, docId, 0, true); + dumpPosdb(); + + // third round + // doc contains 3 words (d, e, f) + GbTest::addPosdbKey(m_rdb, 'd', docId, 0); + GbTest::addPosdbKey(m_rdb, 'e', docId, 0); + GbTest::addPosdbKey(m_rdb, 'f', docId, 0); + GbTest::addPosdbKey(m_rdb, 'y', docId, 0, false, true); + GbTest::addPosdbKey(m_rdb, POSDB_DELETEDOC_TERMID, docId, 0, false); + + saveAndReloadPosdbBucket(); + + mergePosdb(); + + // use extremes + const char *startKey = KEYMIN(); + const char *endKey = KEYMAX(); + + Msg5 msg5; + RdbList list; + ASSERT_TRUE(msg5.getList(RDB_POSDB, 0, &list, startKey, endKey, -1, true, 0, -1, NULL, NULL, 0, false, 0, false)); + list.resetListPtr(); + + // verify that data returned is the same as data inserted above + expectRecord(&list, 'd', docId); + expectRecord(&list, 'e', docId); + expectRecord(&list, 'f', docId); + expectRecord(&list, 'y', docId, false, true); + + EXPECT_TRUE(list.isExhausted()); +} \ No newline at end of file