summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-11-08 15:12:54 +0000
committerGeir Storli <geirst@yahooinc.com>2022-11-08 15:12:54 +0000
commit3a4cad98697dc69a04e6de6154b6621b2d6abb54 (patch)
tree41af765ad22eec10c63b47bb22fd17a975e3de56 /searchlib
parent8c5bd1f18639a34b52b32231c128adfe81e6a146 (diff)
Provide more attribute blueprint details in the query explain trace.
This makes it easier to understand a query trace without having the schema at hand.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp53
1 files changed, 49 insertions, 4 deletions
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)) {