diff options
Diffstat (limited to 'searchlib/src/tests/queryeval/queryeval.cpp')
-rw-r--r-- | searchlib/src/tests/queryeval/queryeval.cpp | 186 |
1 files changed, 80 insertions, 106 deletions
diff --git a/searchlib/src/tests/queryeval/queryeval.cpp b/searchlib/src/tests/queryeval/queryeval.cpp index 29cdd6a4b84..48b91607ab1 100644 --- a/searchlib/src/tests/queryeval/queryeval.cpp +++ b/searchlib/src/tests/queryeval/queryeval.cpp @@ -56,11 +56,13 @@ SearchIterator *simple(const std::string &tag) { return &((new SimpleSearch(SimpleResult()))->tag(tag)); } -Collect<SearchIterator*, MultiSearch::Children> search2(const std::string &t1, const std::string &t2) { - return Collect<SearchIterator*, MultiSearch::Children>().add(simple(t1)).add(simple(t2)); +MultiSearch::Children search2(const std::string &t1, const std::string &t2) { + MultiSearch::Children children; + children.emplace_back(simple(t1)); + children.emplace_back(simple(t2)); + return children; } - class ISourceSelectorDummy : public ISourceSelector { static SourceStore _sourceStoreDummy; @@ -95,9 +97,9 @@ void testMultiSearch(SearchIterator & search) { TEST("test that OR.andWith is a NOOP") { TermFieldMatchData tfmd; MultiSearch::Children ch; - ch.push_back(new TrueSearch(tfmd)); - ch.push_back(new TrueSearch(tfmd)); - SearchIterator::UP search(OrSearch::create(ch, true)); + ch.emplace_back(new TrueSearch(tfmd)); + ch.emplace_back(new TrueSearch(tfmd)); + SearchIterator::UP search(OrSearch::create(std::move(ch), true)); auto filter = std::make_unique<TrueSearch>(tfmd); EXPECT_TRUE(search->andWith(std::move(filter), 1)); @@ -106,9 +108,9 @@ TEST("test that OR.andWith is a NOOP") { TEST("test that non-strict AND.andWith is a NOOP") { TermFieldMatchData tfmd; MultiSearch::Children ch; - ch.push_back(new TrueSearch(tfmd)); - ch.push_back(new TrueSearch(tfmd)); - SearchIterator::UP search(AndSearch::create(ch, false)); + ch.emplace_back(new TrueSearch(tfmd)); + ch.emplace_back(new TrueSearch(tfmd)); + SearchIterator::UP search(AndSearch::create(std::move(ch), false)); SearchIterator::UP filter = std::make_unique<TrueSearch>(tfmd); filter = search->andWith(std::move(filter), 8); EXPECT_TRUE(filter); @@ -116,10 +118,10 @@ TEST("test that non-strict AND.andWith is a NOOP") { TEST("test that strict AND.andWith steals filter and places it correctly based on estimate") { TermFieldMatchData tfmd; - MultiSearch::Children ch; - ch.push_back(new TrueSearch(tfmd)); - ch.push_back(new TrueSearch(tfmd)); - SearchIterator::UP search(AndSearch::create(ch, true)); + std::vector<SearchIterator *> ch; + ch.emplace_back(new TrueSearch(tfmd)); + ch.emplace_back(new TrueSearch(tfmd)); + SearchIterator::UP search(AndSearch::create({ch[0], ch[1]}, true)); static_cast<AndSearch &>(*search).estimate(7); auto filter = std::make_unique<TrueSearch>(tfmd); SearchIterator * filterP = filter.get(); @@ -127,18 +129,18 @@ TEST("test that strict AND.andWith steals filter and places it correctly based o EXPECT_TRUE(nullptr == search->andWith(std::move(filter), 8).get()); const MultiSearch::Children & andChildren = static_cast<MultiSearch &>(*search).getChildren(); EXPECT_EQUAL(3u, andChildren.size()); - EXPECT_EQUAL(ch[0], andChildren[0]); - EXPECT_EQUAL(filterP, andChildren[1]); - EXPECT_EQUAL(ch[1], andChildren[2]); + EXPECT_EQUAL(ch[0], andChildren[0].get()); + EXPECT_EQUAL(filterP, andChildren[1].get()); + EXPECT_EQUAL(ch[1], andChildren[2].get()); auto filter2 = std::make_unique<TrueSearch>(tfmd); SearchIterator * filter2P = filter2.get(); EXPECT_TRUE(nullptr == search->andWith(std::move(filter2), 6).get()); EXPECT_EQUAL(4u, andChildren.size()); - EXPECT_EQUAL(filter2P, andChildren[0]); - EXPECT_EQUAL(ch[0], andChildren[1]); - EXPECT_EQUAL(filterP, andChildren[2]); - EXPECT_EQUAL(ch[1], andChildren[3]); + EXPECT_EQUAL(filter2P, andChildren[0].get()); + EXPECT_EQUAL(ch[0], andChildren[1].get()); + EXPECT_EQUAL(filterP, andChildren[2].get()); + EXPECT_EQUAL(ch[1], andChildren[3].get()); } class NonStrictTrueSearch : public TrueSearch @@ -150,69 +152,45 @@ public: TEST("test that strict AND.andWith does not place non-strict iterator first") { TermFieldMatchData tfmd; - MultiSearch::Children ch; - ch.push_back(new TrueSearch(tfmd)); - ch.push_back(new TrueSearch(tfmd)); - SearchIterator::UP search(AndSearch::create(ch, true)); + std::vector<SearchIterator *> ch; + ch.emplace_back(new TrueSearch(tfmd)); + ch.emplace_back(new TrueSearch(tfmd)); + SearchIterator::UP search(AndSearch::create({ch[0], ch[1]}, true)); static_cast<AndSearch &>(*search).estimate(7); auto filter = std::make_unique<NonStrictTrueSearch>(tfmd); SearchIterator * filterP = filter.get(); EXPECT_TRUE(nullptr == search->andWith(std::move(filter), 6).get()); const MultiSearch::Children & andChildren = static_cast<MultiSearch &>(*search).getChildren(); EXPECT_EQUAL(3u, andChildren.size()); - EXPECT_EQUAL(ch[0], andChildren[0]); - EXPECT_EQUAL(filterP, andChildren[1]); - EXPECT_EQUAL(ch[1], andChildren[2]); + EXPECT_EQUAL(ch[0], andChildren[0].get()); + EXPECT_EQUAL(filterP, andChildren[1].get()); + EXPECT_EQUAL(ch[1], andChildren[2].get()); } TEST("test that strict rank search forwards to its greedy first child") { TermFieldMatchData tfmd; - SearchIterator::UP search( - RankSearch::create( - Collect<SearchIterator*, MultiSearch::Children>() - .add(AndSearch::create(search2("a", "b"), true)) - .add(new TrueSearch(tfmd)), - true) - ); + SearchIterator::UP search = RankSearch::create({ AndSearch::create(search2("a", "b"), true), new TrueSearch(tfmd) }, true); auto filter = std::make_unique<TrueSearch>(tfmd); EXPECT_TRUE(nullptr == search->andWith(std::move(filter), 8).get()); } TEST("test that non-strict rank search does NOT forward to its greedy first child") { TermFieldMatchData tfmd; - SearchIterator::UP search( - RankSearch::create( - Collect<SearchIterator*, MultiSearch::Children>() - .add(AndSearch::create(search2("a", "b"), true)) - .add(new TrueSearch(tfmd)), - false) - ); + SearchIterator::UP search = RankSearch::create({ AndSearch::create(search2("a", "b"), true), new TrueSearch(tfmd) }, false); auto filter = std::make_unique<TrueSearch>(tfmd); EXPECT_TRUE(nullptr != search->andWith(std::move(filter), 8).get()); } TEST("test that strict andnot search forwards to its greedy first child") { TermFieldMatchData tfmd; - SearchIterator::UP search( - AndNotSearch::create( - Collect<SearchIterator*, MultiSearch::Children>() - .add(AndSearch::create(search2("a", "b"), true)) - .add(new TrueSearch(tfmd)), - true) - ); + SearchIterator::UP search = AndNotSearch::create({ AndSearch::create(search2("a", "b"), true), new TrueSearch(tfmd) }, true); auto filter = std::make_unique<TrueSearch>(tfmd); EXPECT_TRUE(nullptr == search->andWith(std::move(filter), 8).get()); } TEST("test that non-strict andnot search does NOT forward to its greedy first child") { TermFieldMatchData tfmd; - SearchIterator::UP search( - AndNotSearch::create( - Collect<SearchIterator*, MultiSearch::Children>() - .add(AndSearch::create(search2("a", "b"), true)) - .add(new TrueSearch(tfmd)), - false) - ); + SearchIterator::UP search = AndNotSearch::create({ AndSearch::create(search2("a", "b"), true), new TrueSearch(tfmd) }, false); auto filter = std::make_unique<TrueSearch>(tfmd); EXPECT_TRUE(nullptr != search->andWith(std::move(filter), 8).get()); } @@ -298,10 +276,10 @@ TEST("testOr") { { TermFieldMatchData tfmd; MultiSearch::Children ch; - ch.push_back(new TrueSearch(tfmd)); - ch.push_back(new TrueSearch(tfmd)); - ch.push_back(new TrueSearch(tfmd)); - SearchIterator::UP orSearch(OrSearch::create(ch, true)); + ch.emplace_back(new TrueSearch(tfmd)); + ch.emplace_back(new TrueSearch(tfmd)); + ch.emplace_back(new TrueSearch(tfmd)); + SearchIterator::UP orSearch(OrSearch::create(std::move(ch), true)); testMultiSearch(*orSearch); } } @@ -309,8 +287,8 @@ TEST("testOr") { class TestInsertRemoveSearch : public MultiSearch { public: - TestInsertRemoveSearch(const MultiSearch::Children & children) : - MultiSearch(children), + TestInsertRemoveSearch(ChildrenIterators children) : + MultiSearch(std::move(children)), _accumRemove(0), _accumInsert(0) { } @@ -327,31 +305,31 @@ struct MultiSearchRemoveTest { }; TEST("testMultiSearch") { - MultiSearch::Children children; - children.push_back(new EmptySearch()); - children.push_back(new EmptySearch()); - children.push_back(new EmptySearch()); - TestInsertRemoveSearch ms(children); + std::vector<SearchIterator *> orig; + orig.emplace_back(new EmptySearch()); + orig.emplace_back(new EmptySearch()); + orig.emplace_back(new EmptySearch()); + TestInsertRemoveSearch ms({orig[0], orig[1], orig[2]}); EXPECT_EQUAL(3u, ms.getChildren().size()); - EXPECT_EQUAL(children[0], ms.getChildren()[0]); - EXPECT_EQUAL(children[1], ms.getChildren()[1]); - EXPECT_EQUAL(children[2], ms.getChildren()[2]); + EXPECT_EQUAL(orig[0], ms.getChildren()[0].get()); + EXPECT_EQUAL(orig[1], ms.getChildren()[1].get()); + EXPECT_EQUAL(orig[2], ms.getChildren()[2].get()); EXPECT_EQUAL(0u, ms._accumInsert); EXPECT_EQUAL(0u, ms._accumRemove); - EXPECT_EQUAL(children[1], MultiSearchRemoveTest::remove(ms, 1).get()); + EXPECT_EQUAL(orig[1], MultiSearchRemoveTest::remove(ms, 1).get()); EXPECT_EQUAL(2u, ms.getChildren().size()); - EXPECT_EQUAL(children[0], ms.getChildren()[0]); - EXPECT_EQUAL(children[2], ms.getChildren()[1]); + EXPECT_EQUAL(orig[0], ms.getChildren()[0].get()); + EXPECT_EQUAL(orig[2], ms.getChildren()[1].get()); EXPECT_EQUAL(0u, ms._accumInsert); EXPECT_EQUAL(1u, ms._accumRemove); - children.push_back(new EmptySearch()); - ms.insert(1, SearchIterator::UP(children.back())); + orig.emplace_back(new EmptySearch()); + ms.insert(1, SearchIterator::UP(orig.back())); EXPECT_EQUAL(3u, ms.getChildren().size()); - EXPECT_EQUAL(children[0], ms.getChildren()[0]); - EXPECT_EQUAL(children[3], ms.getChildren()[1]); - EXPECT_EQUAL(children[2], ms.getChildren()[2]); + EXPECT_EQUAL(orig[0], ms.getChildren()[0].get()); + EXPECT_EQUAL(orig[3], ms.getChildren()[1].get()); + EXPECT_EQUAL(orig[2], ms.getChildren()[2].get()); EXPECT_EQUAL(1u, ms._accumInsert); EXPECT_EQUAL(1u, ms._accumRemove); } @@ -627,23 +605,19 @@ TEST("testDump") { #ifdef __clang__ #pragma clang diagnostic pop #endif - SearchIterator::UP search( - AndSearch::create( - Collect<SearchIterator*, MultiSearch::Children>() - .add(AndNotSearch::create(search2("+", "-"), true)) - .add(AndSearch::create(search2("and_a", "and_b"), true)) - .add(new BooleanMatchIteratorWrapper(SearchIterator::UP(simple("wrapped")), TermFieldMatchDataArray())) - .add(new NearSearch(search2("near_a", "near_b"), - TermFieldMatchDataArray(), - 5u, true)) - .add(new ONearSearch(search2("onear_a", "onear_b"), - TermFieldMatchDataArray(), 10, true)) - .add(OrSearch::create(search2("or_a", "or_b"), false)) - .add(RankSearch::create(search2("rank_a", "rank_b"),false)) - .add(SourceBlenderSearch::create(selector(), Collect<Source, SourceBlenderSearch::Children>() - .add(Source(simple("blend_a"), 2)) - .add(Source(simple("blend_b"), 4)), true)) - , true)); + + SearchIterator::UP search = AndSearch::create( { + AndNotSearch::create(search2("+", "-"), true), + AndSearch::create(search2("and_a", "and_b"), true), + new BooleanMatchIteratorWrapper(SearchIterator::UP(simple("wrapped")), TermFieldMatchDataArray()), + new NearSearch(search2("near_a", "near_b"), TermFieldMatchDataArray(), 5u, true), + new ONearSearch(search2("onear_a", "onear_b"), TermFieldMatchDataArray(), 10, true), + OrSearch::create(search2("or_a", "or_b"), false), + RankSearch::create(search2("rank_a", "rank_b"),false), + SourceBlenderSearch::create(selector(), Collect<Source, SourceBlenderSearch::Children>() + .add(Source(simple("blend_a"), 2)) + .add(Source(simple("blend_b"), 4)), + true) }, true); vespalib::string sas = search->asString(); EXPECT_TRUE(sas.size() > 50); vespalib::Slime slime; @@ -846,26 +820,26 @@ TEST("test InitRangeVerifier") { TEST("Test multisearch and andsearchstrict iterators adheres to initRange") { InitRangeVerifier ir; - ir.verify( AndSearch::create({ ir.createIterator(ir.getExpectedDocIds(), false).release(), - ir.createFullIterator().release() }, false)); + ir.verify( AndSearch::create({ ir.createIterator(ir.getExpectedDocIds(), false), + ir.createFullIterator() }, false)); - ir.verify( AndSearch::create({ ir.createIterator(ir.getExpectedDocIds(), true).release(), - ir.createFullIterator().release() }, true)); + ir.verify( AndSearch::create({ ir.createIterator(ir.getExpectedDocIds(), true), + ir.createFullIterator() }, true)); } TEST("Test andnotsearchstrict iterators adheres to initRange") { InitRangeVerifier ir; - TEST_DO(ir.verify( AndNotSearch::create({ir.createIterator(ir.getExpectedDocIds(), false).release(), - ir.createEmptyIterator().release() }, false))); - TEST_DO(ir.verify( AndNotSearch::create({ir.createIterator(ir.getExpectedDocIds(), true).release(), - ir.createEmptyIterator().release() }, true))); + TEST_DO(ir.verify( AndNotSearch::create({ir.createIterator(ir.getExpectedDocIds(), false), + ir.createEmptyIterator() }, false))); + TEST_DO(ir.verify( AndNotSearch::create({ir.createIterator(ir.getExpectedDocIds(), true), + ir.createEmptyIterator() }, true))); auto inverted = InitRangeVerifier::invert(ir.getExpectedDocIds(), ir.getDocIdLimit()); - TEST_DO(ir.verify( AndNotSearch::create({ir.createFullIterator().release(), - ir.createIterator(inverted, false).release() }, false))); - TEST_DO(ir.verify( AndNotSearch::create({ir.createFullIterator().release(), - ir.createIterator(inverted, false).release() }, true))); + TEST_DO(ir.verify( AndNotSearch::create({ir.createFullIterator(), + ir.createIterator(inverted, false) }, false))); + TEST_DO(ir.verify( AndNotSearch::create({ir.createFullIterator(), + ir.createIterator(inverted, false) }, true))); } |