aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-04-06 10:57:53 +0200
committerGitHub <noreply@github.com>2021-04-06 10:57:53 +0200
commitef1971a1deb1d79d120d2648d96188c77bc41003 (patch)
tree613d406fd01824d1898f73870111b54436d0aff1 /searchlib
parent33aca5961f4dd9c6d87fa8e155834018d05a0ebf (diff)
parent68fba70fd1d588cf0beba482141219b85a4f3b3b (diff)
Merge pull request #17264 from vespa-engine/balder/avoid-expensive-dynamic-cast
Avoid expensive dynamic_cast
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h6
4 files changed, 17 insertions, 27 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..561c532430b 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,16 +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(top != nullptr);
+ assert(blender_up->isSourceBlender());
+ auto *top = static_cast<SourceBlenderBlueprint *>(blender_up.get());
while (!sources.empty()) {
top->addChild(std::move(sources.back()));
sources.pop_back();
@@ -118,7 +118,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 +225,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 +312,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; }
};
}