summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-03-25 18:00:28 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-03-25 18:00:28 +0000
commitbc176ca582e95f731071f46c9bb26aa1538fbdeb (patch)
tree25f490413d0107f15faa4167816d760e6a9d7c76
parent7dcb1520105b85473909d081d1ce0e139dfd38c8 (diff)
Avoid frequent dynamic_cast to check if a node is an intermediate.
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/query.cpp7
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/intermediate.h1
-rw-r--r--searchlib/src/vespa/searchlib/query/tree/node.h4
3 files changed, 8 insertions, 4 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/matching/query.cpp b/searchcore/src/vespa/searchcore/proton/matching/query.cpp
index 52274b1be94..1bb521a693e 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/query.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/query.cpp
@@ -64,11 +64,14 @@ find_location_terms(Node *tree) {
std::vector<ProtonLocationTerm *> retval;
std::vector<Node *> nodes;
nodes.push_back(tree);
+ // Note the nodes vector being iterated over is appended in the loop
for (size_t i = 0; i < nodes.size(); ++i) {
- if (auto loc = dynamic_cast<ProtonLocationTerm *>(nodes[i])) {
+ Node * node = nodes[i];
+ if (auto loc = dynamic_cast<ProtonLocationTerm *>(node)) {
retval.push_back(loc);
}
- if (auto parent = dynamic_cast<const search::query::Intermediate *>(nodes[i])) {
+ if (node->isIntermediate()) {
+ auto parent = static_cast<const search::query::Intermediate *>(node);
for (Node * child : parent->getChildren()) {
nodes.push_back(child);
}
diff --git a/searchlib/src/vespa/searchlib/query/tree/intermediate.h b/searchlib/src/vespa/searchlib/query/tree/intermediate.h
index 2f4323f8e87..2bdc0104927 100644
--- a/searchlib/src/vespa/searchlib/query/tree/intermediate.h
+++ b/searchlib/src/vespa/searchlib/query/tree/intermediate.h
@@ -17,6 +17,7 @@ class Intermediate : public Node
Intermediate() = default;
virtual ~Intermediate() = 0;
+ bool isIntermediate() const override { return true; }
const std::vector<Node *> &getChildren() const { return _children; }
Intermediate &reserve(size_t sz) { _children.reserve(sz); return *this; }
diff --git a/searchlib/src/vespa/searchlib/query/tree/node.h b/searchlib/src/vespa/searchlib/query/tree/node.h
index 4ef0d3b6fc8..a5d0479866f 100644
--- a/searchlib/src/vespa/searchlib/query/tree/node.h
+++ b/searchlib/src/vespa/searchlib/query/tree/node.h
@@ -15,9 +15,9 @@ class Node {
public:
typedef std::unique_ptr<Node> UP;
- virtual ~Node() {}
-
+ virtual ~Node() = default;
virtual void accept(QueryVisitor &visitor) = 0;
+ virtual bool isIntermediate() const { return false; }
};
}