aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-11-08 17:27:21 +0100
committerGitHub <noreply@github.com>2022-11-08 17:27:21 +0100
commitfe2c27dba94ab5801cbef6fd497b1cfaf15a5120 (patch)
tree3202277fc4c15da9cd2102d0ab34ffdf61a60c68
parentc2193f43a0e289bfda4cab875c2058d9d0e21afd (diff)
parentb3bb0e09fecff8cd3ae0cd97de02ed3ae81475cb (diff)
Merge pull request #24796 from vespa-engine/geirst/attribute-blueprint-query-trace-details
Provide more attribute blueprint details in the query explain trace
-rw-r--r--searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp8
-rw-r--r--searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp53
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp2
4 files changed, 56 insertions, 11 deletions
diff --git a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
index 4b9c23ea5d3..6f4ffc31741 100644
--- a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
@@ -679,7 +679,7 @@ getExpectedBlueprint()
" estHits: 9\n"
" cost_tier: 1\n"
" tree_size: 2\n"
- " allow_termwise_eval: 0\n"
+ " allow_termwise_eval: false\n"
" }\n"
" sourceId: 4294967295\n"
" docid_limit: 0\n"
@@ -698,7 +698,7 @@ getExpectedBlueprint()
" estHits: 9\n"
" cost_tier: 1\n"
" tree_size: 1\n"
- " allow_termwise_eval: 1\n"
+ " allow_termwise_eval: true\n"
" }\n"
" sourceId: 4294967295\n"
" docid_limit: 0\n"
@@ -727,7 +727,7 @@ getExpectedSlimeBlueprint() {
" estHits: 9,"
" cost_tier: 1,"
" tree_size: 2,"
- " allow_termwise_eval: 0"
+ " allow_termwise_eval: false"
" },"
" sourceId: 4294967295,"
" docid_limit: 0,"
@@ -751,7 +751,7 @@ getExpectedSlimeBlueprint() {
" estHits: 9,"
" cost_tier: 1,"
" tree_size: 1,"
- " allow_termwise_eval: 1"
+ " allow_termwise_eval: true"
" },"
" sourceId: 4294967295,"
" docid_limit: 0"
diff --git a/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp b/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp
index 1ac91c5d8d6..55ca42f7369 100644
--- a/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp
+++ b/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp
@@ -595,7 +595,7 @@ TEST_F("require that asString() on blueprint works", BlueprintAsStringFixture)
" estHits: 2\n"
" cost_tier: 1\n"
" tree_size: 2\n"
- " allow_termwise_eval: 0\n"
+ " allow_termwise_eval: false\n"
" }\n"
" sourceId: 4294967295\n"
" docid_limit: 0\n"
@@ -617,7 +617,7 @@ TEST_F("require that asString() on blueprint works", BlueprintAsStringFixture)
" estHits: 2\n"
" cost_tier: 1\n"
" tree_size: 1\n"
- " allow_termwise_eval: 1\n"
+ " allow_termwise_eval: true\n"
" }\n"
" sourceId: 4294967295\n"
" docid_limit: 0\n"
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
index 179296ff0f9..692b86fdc75 100644
--- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
@@ -45,6 +45,8 @@
#include <vespa/log/log.h>
LOG_SETUP(".searchlib.attribute.attribute_blueprint_factory");
+using search::attribute::BasicType;
+using search::attribute::CollectionType;
using search::attribute::IAttributeVector;
using search::attribute::ISearchContext;
using search::fef::TermFieldMatchData;
@@ -52,6 +54,7 @@ using search::fef::TermFieldMatchDataArray;
using search::fef::TermFieldMatchDataPosition;
using search::query::Location;
using search::query::LocationTerm;
+using search::query::MultiTerm;
using search::query::Node;
using search::query::NumberTerm;
using search::query::PredicateQuery;
@@ -62,7 +65,6 @@ using search::query::StackDumpCreator;
using search::query::StringTerm;
using search::query::SubstringTerm;
using search::query::SuffixTerm;
-using search::query::MultiTerm;
using search::queryeval::AndBlueprint;
using search::queryeval::AndSearchStrict;
using search::queryeval::Blueprint;
@@ -84,11 +86,11 @@ using search::queryeval::SimpleLeafBlueprint;
using search::queryeval::WeightedSetTermBlueprint;
using search::tensor::DenseTensorAttribute;
using search::tensor::ITensorAttribute;
+using vespalib::Issue;
using vespalib::geo::ZCurve;
using vespalib::make_string;
using vespalib::string;
using vespalib::stringref;
-using vespalib::Issue;
namespace search {
namespace {
@@ -116,6 +118,7 @@ private:
class AttributeFieldBlueprint : public SimpleLeafBlueprint
{
private:
+ const IAttributeVector& _attr;
// Must take a copy of the query term for visitMembers()
// as only a few ISearchContext implementations exposes the query term.
vespalib::string _query_term;
@@ -126,6 +129,7 @@ private:
AttributeFieldBlueprint(const FieldSpec &field, const IAttributeVector &attribute,
QueryTermSimple::UP term, const attribute::SearchContextParams &params)
: SimpleLeafBlueprint(field),
+ _attr(attribute),
_query_term(term->getTermString()),
_search_context(attribute.createSearchContext(std::move(term), params)),
_type(OTHER)
@@ -195,11 +199,39 @@ public:
bool getRange(vespalib::string &from, vespalib::string &to) const override;
};
+namespace {
+
+vespalib::string
+get_type(const IAttributeVector& attr)
+{
+ auto coll_type = CollectionType(attr.getCollectionType());
+ auto basic_type = BasicType(attr.getBasicType());
+ if (coll_type.type() == CollectionType::SINGLE) {
+ return basic_type.asString();
+ }
+ std::ostringstream oss;
+ oss << coll_type.asString() << "<" << basic_type.asString() << ">";
+ return oss.str();
+}
+
+void
+visit_attribute(vespalib::ObjectVisitor& visitor, const IAttributeVector& attr)
+{
+ visitor.openStruct("attribute", "IAttributeVector");
+ visitor.visitString("name", attr.getName());
+ visitor.visitString("type", get_type(attr));
+ visitor.visitBool("fast_search", attr.getIsFastSearch());
+ visitor.visitBool("filter", attr.getIsFilter());
+ visitor.closeStruct();
+}
+
+}
+
void
AttributeFieldBlueprint::visitMembers(vespalib::ObjectVisitor &visitor) const
{
LeafBlueprint::visitMembers(visitor);
- visit(visitor, "attribute", _search_context->attributeName());
+ visit_attribute(visitor, _attr);
visit(visitor, "query_term", _query_term);
}
@@ -275,6 +307,11 @@ public:
search->fetchPostings(execInfo);
}
}
+
+ void visitMembers(vespalib::ObjectVisitor& visitor) const override {
+ LeafBlueprint::visitMembers(visitor);
+ visit_attribute(visitor, _attribute);
+ }
};
LocationPreFilterBlueprint::~LocationPreFilterBlueprint() = default;
@@ -325,6 +362,10 @@ public:
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override {
return create_default_filter(strict, constraint);
}
+ void visitMembers(vespalib::ObjectVisitor& visitor) const override {
+ LeafBlueprint::visitMembers(visitor);
+ visit_attribute(visitor, _attribute);
+ }
};
//-----------------------------------------------------------------------------
@@ -436,6 +477,10 @@ public:
return {};
}
}
+ void visitMembers(vespalib::ObjectVisitor& visitor) const override {
+ LeafBlueprint::visitMembers(visitor);
+ visit_attribute(visitor, _iattr);
+ }
};
template <typename SearchType>
@@ -623,7 +668,7 @@ public:
void visitMembers(vespalib::ObjectVisitor &visitor) const override {
LeafBlueprint::visitMembers(visitor);
- visit(visitor, "attribute", _attrName);
+ visit_attribute(visitor, _iattr);
}
std::unique_ptr<queryeval::MatchingElementsSearch> create_matching_elements_search(const MatchingElementsFields &fields) const override {
if (fields.has_field(_attrName)) {
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
index 9c9df6b82fe..91aa308f008 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
@@ -336,7 +336,7 @@ Blueprint::visitMembers(vespalib::ObjectVisitor &visitor) const
visitor.visitInt("estHits", state.estimate().estHits);
visitor.visitInt("cost_tier", state.cost_tier());
visitor.visitInt("tree_size", state.tree_size());
- visitor.visitInt("allow_termwise_eval", state.allow_termwise_eval());
+ visitor.visitBool("allow_termwise_eval", state.allow_termwise_eval());
visitor.closeStruct();
visitor.visitInt("sourceId", _sourceId);
visitor.visitInt("docid_limit", _docid_limit);