diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-12-17 04:09:47 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2016-12-17 04:09:47 +0100 |
commit | c3947c40abbdc0d12c789b794f43c5b3b85afffb (patch) | |
tree | 90a656f917c166026925661f94ab6cf8ca9ab503 /searchlib | |
parent | 8e5629fcfa8da53aed44d2778ec5efbfcea017dd (diff) |
Split the source selector out too.
Diffstat (limited to 'searchlib')
12 files changed, 79 insertions, 94 deletions
diff --git a/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp b/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp index a3595f8724d..a8d53314745 100644 --- a/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp +++ b/searchlib/src/tests/attribute/sourceselector/sourceselector_test.cpp @@ -89,13 +89,13 @@ void Test::testSourceSelector(const DocSource *docSource, size_t sz, uint8_t defaultSource, ISourceSelector &selector) { { - ISourceSelector::Iterator::UP it(selector.createIterator()); + auto it(selector.createIterator()); for (size_t i = 0; i < sz; ++i) { EXPECT_EQUAL(docSource[i].source, it->getSource(docSource[i].docId)); } } { - ISourceSelector::Iterator::UP it(selector.createIterator()); + auto it(selector.createIterator()); for (size_t i = 0, j = 0; i <= docSource[sz - 1].docId; ++i) { if (i != docSource[j].docId) { EXPECT_EQUAL(defaultSource, it->getSource(i)); @@ -122,7 +122,7 @@ Test::requireThatSelectorCanCloneAndSubtract() EXPECT_EQUAL(base_id + diff, new_selector->getBaseId()); EXPECT_EQUAL(maxDocId+1, new_selector->getDocIdLimit()); - ISourceSelector::Iterator::UP it(new_selector->createIterator()); + auto it(new_selector->createIterator()); for(size_t i = 0; i < arraysize(docs); ++i) { if (docs[i].source > diff) { EXPECT_EQUAL(docs[i].source - diff, it->getSource(docs[i].docId)); @@ -176,7 +176,7 @@ Test::requireThatCompleteSourceRangeIsHandled() for (uint32_t i = 0; i < ISourceSelector::SOURCE_LIMIT; ++i) { selector.setSource(i, i); } - ISourceSelector::Iterator::UP itr = selector.createIterator(); + auto itr = selector.createIterator(); for (uint32_t i = 0; i < ISourceSelector::SOURCE_LIMIT; ++i) { EXPECT_EQUAL((queryeval::Source)i, itr->getSource(i)); } diff --git a/searchlib/src/tests/queryeval/queryeval.cpp b/searchlib/src/tests/queryeval/queryeval.cpp index 65feb69a3e2..d0ebffb17d1 100644 --- a/searchlib/src/tests/queryeval/queryeval.cpp +++ b/searchlib/src/tests/queryeval/queryeval.cpp @@ -20,6 +20,7 @@ #include <vespa/searchlib/attribute/singlenumericattribute.hpp> #include <vespa/searchlib/attribute/singlesmallnumericattribute.h> #include <vespa/vespalib/test/insertion_operators.h> +#include <vespa/searchlib/queryeval/isourceselector.h> #include <vespa/searchlib/fef/fef.h> @@ -61,16 +62,16 @@ class ISourceSelectorDummy : public ISourceSelector static SourceStore _sourceStoreDummy; public: - static Iterator::UP + static std::unique_ptr<sourceselector::Iterator> makeDummyIterator() { - return Iterator::UP(new Iterator(_sourceStoreDummy)); + return std::make_unique<sourceselector::Iterator>(_sourceStoreDummy); } }; ISourceSelector::SourceStore ISourceSelectorDummy::_sourceStoreDummy("foo"); -ISourceSelector::Iterator::UP selector() { +std::unique_ptr<sourceselector::Iterator> selector() { return ISourceSelectorDummy::makeDummyIterator(); } diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp index 517998af50f..dc70a8c7193 100644 --- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp @@ -1,9 +1,5 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/fastos/fastos.h> -#include <vespa/log/log.h> -LOG_SETUP(".searchlib.attribute.attribute_blueprint_factory"); - #include "attribute_blueprint_factory.h" #include "attribute_weighted_set_blueprint.h" #include "i_document_weight_attribute.h" @@ -14,30 +10,25 @@ LOG_SETUP(".searchlib.attribute.attribute_blueprint_factory"); #include <vespa/searchlib/attribute/iattributemanager.h> #include <vespa/searchlib/common/location.h> #include <vespa/searchlib/common/locationiterators.h> -#include <vespa/searchlib/fef/termfieldmatchdata.h> #include <vespa/searchlib/query/tree/stackdumpcreator.h> #include <vespa/searchlib/queryeval/andsearchstrict.h> #include <vespa/searchlib/queryeval/create_blueprint_visitor_helper.h> #include <vespa/searchlib/queryeval/document_weight_search_iterator.h> -#include <vespa/searchlib/queryeval/dot_product_blueprint.h> #include <vespa/searchlib/queryeval/dot_product_search.h> #include <vespa/searchlib/queryeval/emptysearch.h> -#include <vespa/searchlib/queryeval/get_weight_from_node.h> #include <vespa/searchlib/queryeval/intermediate_blueprints.h> #include <vespa/searchlib/queryeval/leaf_blueprints.h> #include <vespa/searchlib/queryeval/orlikesearch.h> -#include <vespa/searchlib/queryeval/orsearch.h> #include <vespa/searchlib/queryeval/predicate_blueprint.h> -#include <vespa/searchlib/queryeval/searchiterator.h> -#include <vespa/searchlib/queryeval/termasstring.h> -#include <vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h> #include <vespa/searchlib/queryeval/wand/parallel_weak_and_search.h> -#include <vespa/searchlib/queryeval/wand/weak_and_heap.h> #include <vespa/searchlib/queryeval/weighted_set_term_search.h> +#include <vespa/searchlib/query/queryterm.h> #include <sstream> -#include <utility> #include <vespa/vespalib/util/regexp.h> +#include <vespa/log/log.h> +LOG_SETUP(".searchlib.attribute.attribute_blueprint_factory"); + using search::AttributeVector; using search::fef::TermFieldMatchData; using search::fef::TermFieldMatchDataArray; diff --git a/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp b/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp index ba36774bf29..ee3950aaef4 100644 --- a/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.cpp @@ -11,10 +11,9 @@ namespace { } FixedSourceSelector::Iterator::Iterator(const FixedSourceSelector & sourceSelector) : - ISourceSelector::Iterator(sourceSelector._source), + IIterator(sourceSelector._source), _attributeGuard(sourceSelector._realSource) -{ -} +{ } FixedSourceSelector::FixedSourceSelector(queryeval::Source defaultSource, const vespalib::string & attrBaseFileName, diff --git a/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.h b/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.h index 3e787523909..1aa98932adf 100644 --- a/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.h +++ b/searchlib/src/vespa/searchlib/attribute/fixedsourceselector.h @@ -16,9 +16,10 @@ private: } void reserve(uint32_t numDocs); + using IIterator = queryeval::sourceselector::Iterator; public: typedef std::unique_ptr<FixedSourceSelector> UP; - class Iterator : public ISourceSelector::Iterator { + class Iterator : public IIterator { private: AttributeGuard _attributeGuard; public: @@ -29,18 +30,18 @@ public: FixedSourceSelector(queryeval::Source defaultSource, const vespalib::string & attrBaseFileName, uint32_t initialNumDocs = 0); - virtual ~FixedSourceSelector(); + ~FixedSourceSelector(); FixedSourceSelector::UP cloneAndSubtract(const vespalib::string & attrBaseFileName, uint32_t diff); static FixedSourceSelector::UP load(const vespalib::string & baseFileName); // Inherit doc from ISourceSelector - virtual void setSource(uint32_t docId, queryeval::Source source); - virtual uint32_t getDocIdLimit() const { + void setSource(uint32_t docId, queryeval::Source source) final override; + uint32_t getDocIdLimit() const final override { return _source.getNumDocs() - 1; } - virtual ISourceSelector::Iterator::UP createIterator() const { - return ISourceSelector::Iterator::UP(new Iterator(*this)); + std::unique_ptr<IIterator> createIterator() const final override { + return std::make_unique<Iterator>(*this); } }; diff --git a/searchlib/src/vespa/searchlib/attribute/sourceselector.cpp b/searchlib/src/vespa/searchlib/attribute/sourceselector.cpp index ae76e9e27a2..fe2d48d48dc 100644 --- a/searchlib/src/vespa/searchlib/attribute/sourceselector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/sourceselector.cpp @@ -119,7 +119,7 @@ SourceSelector::extractLoadInfo(const vespalib::string & baseFileName) SourceSelector::Histogram SourceSelector::getDistribution() const { Histogram h; - ISourceSelector::Iterator::UP it = createIterator(); + auto it = createIterator(); for (size_t i(0), m(getDocIdLimit()); i < m; i++) { h.inc(it->getSource(i)); } diff --git a/searchlib/src/vespa/searchlib/attribute/sourceselector.h b/searchlib/src/vespa/searchlib/attribute/sourceselector.h index 424839c7495..8219a0903b3 100644 --- a/searchlib/src/vespa/searchlib/attribute/sourceselector.h +++ b/searchlib/src/vespa/searchlib/attribute/sourceselector.h @@ -78,7 +78,7 @@ public: // Inherit doc from ISourceSelector virtual void setSource(uint32_t docId, queryeval::Source source) = 0; - virtual ISourceSelector::Iterator::UP createIterator() const = 0; + virtual std::unique_ptr<queryeval::sourceselector::Iterator> createIterator() const = 0; }; } // namespace search diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp index 0144e09f618..8e221b33add 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp @@ -1,8 +1,5 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/fastos/fastos.h> -#include <vespa/log/log.h> -LOG_SETUP(".queryeval.intermediate_blueprints"); #include "intermediate_blueprints.h" #include "andnotsearch.h" #include "andsearch.h" @@ -13,8 +10,10 @@ LOG_SETUP(".queryeval.intermediate_blueprints"); #include "equivsearch.h" #include "termwise_blueprint_helper.h" #include "termwise_search.h" +#include "isourceselector.h" #include <vespa/searchlib/queryeval/wand/weak_and_search.h> + namespace search { namespace queryeval { diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h index b36538b55d4..bd01be98ef2 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h @@ -3,7 +3,6 @@ #pragma once #include "blueprint.h" -#include "isourceselector.h" #include "searchable.h" #include <vespa/searchlib/queryeval/multisearch.h> #include <vector> @@ -12,6 +11,8 @@ namespace search { namespace queryeval { +class ISourceSelector; + //----------------------------------------------------------------------------- class AndNotBlueprint : public IntermediateBlueprint @@ -174,8 +175,6 @@ public: bool isCompatibleWith(const SourceBlenderBlueprint &other) const; }; -//----------------------------------------------------------------------------- - -} // namespace queryeval -} // namespace search +} +} diff --git a/searchlib/src/vespa/searchlib/queryeval/isourceselector.h b/searchlib/src/vespa/searchlib/queryeval/isourceselector.h index 4d3ce3ee302..86c2d13ad8c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/isourceselector.h +++ b/searchlib/src/vespa/searchlib/queryeval/isourceselector.h @@ -10,56 +10,49 @@ namespace queryeval { typedef uint8_t Source; +namespace sourceselector { + +class Iterator { +public: + using SourceStore = SingleValueNumericAttribute<IntegerAttributeTemplate<int8_t> >; + + Iterator(const SourceStore & source) : _source(source) { } + Iterator(const Iterator &) = delete; + Iterator & operator = (const Iterator &) = delete; + virtual ~Iterator() { } + /** + * Obtain the source to be used for the given document. This + * function should always be called with increasing document + * ids. + * + * @return source id + * @param docId document id + **/ + queryeval::Source getSource(uint32_t docId) const { + return _source.getFast(docId); + } + + uint32_t getDocIdLimit(void) const { + return _source.getCommittedDocIdLimit(); + } +private: + const SourceStore & _source; +}; + +} + /** * Component used to select between sources during result blending. **/ class ISourceSelector { protected: - typedef SingleValueNumericAttribute<IntegerAttributeTemplate<int8_t> > SourceStore; + using SourceStore = sourceselector::Iterator::SourceStore; public: typedef std::unique_ptr<ISourceSelector> UP; typedef std::shared_ptr<ISourceSelector> SP; static const Source SOURCE_LIMIT = 254u; - /** - * Read-only interface to the data held by the parent source - * selector. - **/ - class Iterator { - public: - Iterator(const SourceStore & source) - : _source(source) - { - } - typedef std::unique_ptr<Iterator> UP; - - /** - * Obtain the source to be used for the given document. This - * function should always be called with increasing document - * ids. - * - * @return source id - * @param docId document id - **/ - queryeval::Source getSource(uint32_t docId) const { - return _source.getFast(docId); - } - - /** - * empty; defined for safe subclassing. - **/ - virtual ~Iterator() {} - - uint32_t - getDocIdLimit(void) const - { - return _source.getCommittedDocIdLimit(); - } - private: - const SourceStore & _source; - }; - protected: ISourceSelector(Source defaultSource); public: @@ -87,7 +80,7 @@ public: * * @return source selection iterator **/ - virtual Iterator::UP createIterator() const = 0; + virtual std::unique_ptr<sourceselector::Iterator> createIterator() const = 0; /** * empty; defined for safe subclassing. diff --git a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp index 8b49f9ea7f2..395a54cbc86 100644 --- a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "sourceblendersearch.h" +#include "isourceselector.h" #include <vespa/vespalib/objects/visit.hpp> #include <vespa/vespalib/util/array.hpp> @@ -12,7 +13,7 @@ EmptySearch SourceBlenderSearch::_emptySearch; class SourceBlenderSearchStrict : public SourceBlenderSearch { public: - SourceBlenderSearchStrict(ISourceSelector::Iterator::UP sourceSelector, const Children &children); + SourceBlenderSearchStrict(std::unique_ptr<Iterator> sourceSelector, const Children &children); private: VESPA_DLL_LOCAL void advance() __attribute__((noinline)); vespalib::Array<SearchIterator *> _nextChildren; @@ -22,7 +23,7 @@ private: }; SourceBlenderSearchStrict::SourceBlenderSearchStrict( - ISourceSelector::Iterator::UP sourceSelector, + std::unique_ptr<Iterator> sourceSelector, const Children &children) : SourceBlenderSearch(std::move(sourceSelector), children), _nextChildren() @@ -107,7 +108,7 @@ SourceBlenderSearch::doUnpack(uint32_t docid) } SourceBlenderSearch::SourceBlenderSearch( - ISourceSelector::Iterator::UP sourceSelector, + std::unique_ptr<sourceselector::Iterator> sourceSelector, const Children &children) : _matchedChild(NULL), _sourceSelector(std::move(sourceSelector)), @@ -160,10 +161,9 @@ SourceBlenderSearch::~SourceBlenderSearch() } } -SourceBlenderSearch * SourceBlenderSearch::create( - ISourceSelector::Iterator::UP sourceSelector, - const Children &children, - bool strict) +SourceBlenderSearch * +SourceBlenderSearch::create(std::unique_ptr<sourceselector::Iterator> sourceSelector, + const Children &children, bool strict) { if (strict) { return new SourceBlenderSearchStrict(std::move(sourceSelector), children); diff --git a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h index 81688184fa5..dadc4cccaa6 100644 --- a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h +++ b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h @@ -5,11 +5,11 @@ #include <vespa/vespalib/util/array.h> #include "searchiterator.h" #include "emptysearch.h" -#include "isourceselector.h" namespace search { namespace queryeval { + namespace sourceselector { class Iterator; } /** * A simple implementation of the source blender operation. This class * is used to blend results from multiple sources. Each source is @@ -41,17 +41,19 @@ private: virtual bool isSourceBlender() const { return true; } static EmptySearch _emptySearch; protected: + using Iterator = sourceselector::Iterator; + using Source = uint8_t; typedef std::vector<Source> SourceIndex; - SearchIterator * _matchedChild; - ISourceSelector::Iterator::UP _sourceSelector; - SourceIndex _children; - uint32_t _docIdLimit; - SearchIterator * _sources[256]; + SearchIterator * _matchedChild; + std::unique_ptr<Iterator> _sourceSelector; + SourceIndex _children; + uint32_t _docIdLimit; + SearchIterator * _sources[256]; void doSeek(uint32_t docid) override; void doUnpack(uint32_t docid) override; Trinary is_strict() const override { return Trinary::False; } - SourceBlenderSearch(ISourceSelector::Iterator::UP sourceSelector, const Children &children); + SourceBlenderSearch(std::unique_ptr<Iterator> sourceSelector, const Children &children); SearchIterator * getSearch(Source source) const { return _sources[source]; } public: /** @@ -67,7 +69,7 @@ public: * @param strict whether this search is strict * (a strict search will locate its next hit when seeking fails) **/ - static SourceBlenderSearch * create(ISourceSelector::Iterator::UP sourceSelector, + static SourceBlenderSearch * create(std::unique_ptr<Iterator> sourceSelector, const Children &children, bool strict); virtual ~SourceBlenderSearch(); size_t getNumChildren() const { return _children.size(); } |