diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-04-02 22:18:19 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-04-02 22:49:17 +0000 |
commit | 303112666db243e5544c26120181c409ec12a94f (patch) | |
tree | f1d202d3166debdd61b47625a315c1d0b328d174 /searchlib | |
parent | f1ddec4ce4a9aeb5679c2a8fadba2bfb32d358e5 (diff) |
Avoid expensive dynamic_cast
Diffstat (limited to 'searchlib')
4 files changed, 17 insertions, 26 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp index f600673b179..897d36150d9 100644 --- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp @@ -449,20 +449,6 @@ IntermediateBlueprint::createSearch(fef::MatchData &md, bool strict) const IntermediateBlueprint::IntermediateBlueprint() = default; -const Blueprint & -IntermediateBlueprint::getChild(size_t n) const -{ - assert(n < _children.size()); - return *_children[n]; -} - -Blueprint & -IntermediateBlueprint::getChild(size_t n) -{ - assert(n < _children.size()); - return *_children[n]; -} - IntermediateBlueprint & IntermediateBlueprint::addChild(Blueprint::UP child) { diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h index bf89fe85891..b75c903234f 100644 --- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h @@ -223,6 +223,8 @@ public: virtual bool isAnd() const { return false; } virtual bool isAndNot() const { return false; } virtual bool isOr() const { return false; } + virtual bool isSourceBlender() const { return false; } + virtual bool isRank() const { return false; } virtual const attribute::ISearchContext *get_attribute_search_context() const { return nullptr; } // For document summaries with matched-elements-only set. @@ -298,8 +300,8 @@ public: IndexList find(const IPredicate & check) const; size_t childCnt() const { return _children.size(); } - const Blueprint &getChild(size_t n) const; - Blueprint &getChild(size_t n); + const Blueprint &getChild(size_t n) const { return *_children[n]; } + Blueprint &getChild(size_t n) { return *_children[n]; } IntermediateBlueprint & insertChild(size_t n, Blueprint::UP child); IntermediateBlueprint &addChild(Blueprint::UP child); Blueprint::UP removeChild(size_t n); diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp index b61836c2fd3..14c3034184a 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp @@ -35,8 +35,8 @@ void optimize_source_blenders(IntermediateBlueprint &self, size_t begin_idx) { std::vector<size_t> source_blenders; SourceBlenderBlueprint *reference = nullptr; for (size_t i = begin_idx; i < self.childCnt(); ++i) { - SourceBlenderBlueprint *child = dynamic_cast<SourceBlenderBlueprint *>(&self.getChild(i)); - if (child != nullptr) { + if (self.getChild(i).isSourceBlender()) { + auto *child = static_cast<SourceBlenderBlueprint *>(&self.getChild(i)); if (reference == nullptr || reference->isCompatibleWith(*child)) { source_blenders.push_back(i); reference = child; @@ -49,15 +49,16 @@ void optimize_source_blenders(IntermediateBlueprint &self, size_t begin_idx) { while (!source_blenders.empty()) { blender_up = self.removeChild(source_blenders.back()); source_blenders.pop_back(); - SourceBlenderBlueprint *blender = dynamic_cast<SourceBlenderBlueprint *>(blender_up.get()); - assert(blender != nullptr); + assert(blender_up->isSourceBlender()); + auto *blender = static_cast<SourceBlenderBlueprint *>(blender_up.get()); while (blender->childCnt() > 0) { Blueprint::UP child_up = blender->removeChild(blender->childCnt() - 1); size_t source_idx = lookup_create_source(sources, child_up->getSourceId()); sources[source_idx]->addChild(std::move(child_up)); } } - SourceBlenderBlueprint *top = dynamic_cast<SourceBlenderBlueprint *>(blender_up.get()); + assert(blender_up->isSourceBlender()); + auto *top = static_cast<SourceBlenderBlueprint *>(blender_up.get()); assert(top != nullptr); while (!sources.empty()) { top->addChild(std::move(sources.back())); @@ -118,7 +119,7 @@ AndNotBlueprint::optimize_self() return; } if (getChild(0).isAndNot()) { - AndNotBlueprint *child = static_cast<AndNotBlueprint *>(&getChild(0)); + auto *child = static_cast<AndNotBlueprint *>(&getChild(0)); while (child->childCnt() > 1) { addChild(child->removeChild(1)); } @@ -225,7 +226,7 @@ AndBlueprint::optimize_self() { for (size_t i = 0; i < childCnt(); ++i) { if (getChild(i).isAnd()) { - AndBlueprint *child = static_cast<AndBlueprint *>(&getChild(i)); + auto *child = static_cast<AndBlueprint *>(&getChild(i)); while (child->childCnt() > 0) { addChild(child->removeChild(0)); } @@ -312,7 +313,7 @@ OrBlueprint::optimize_self() { for (size_t i = 0; (childCnt() > 1) && (i < childCnt()); ++i) { if (getChild(i).isOr()) { - OrBlueprint *child = static_cast<OrBlueprint *>(&getChild(i)); + auto *child = static_cast<OrBlueprint *>(&getChild(i)); while (child->childCnt() > 0) { addChild(child->removeChild(0)); } diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h index 3dd4ccbb60f..9e9d715e45d 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h @@ -150,7 +150,7 @@ public: //----------------------------------------------------------------------------- -class RankBlueprint : public IntermediateBlueprint +class RankBlueprint final : public IntermediateBlueprint { public: HitEstimate combine(const std::vector<HitEstimate> &data) const override; @@ -159,6 +159,7 @@ public: Blueprint::UP get_replacement() override; void sort(std::vector<Blueprint*> &children) const override; bool inheritStrict(size_t i) const override; + bool isRank() const override { return true; } SearchIterator::UP createIntermediateSearch(MultiSearch::Children subSearches, bool strict, fef::MatchData &md) const override; @@ -168,7 +169,7 @@ public: //----------------------------------------------------------------------------- -class SourceBlenderBlueprint : public IntermediateBlueprint +class SourceBlenderBlueprint final : public IntermediateBlueprint { private: const ISourceSelector &_selector; @@ -193,6 +194,7 @@ public: /** check if this blueprint has the same source selector as the other */ bool isCompatibleWith(const SourceBlenderBlueprint &other) const; + bool isSourceBlender() const override { return true; } }; } |