From 3a4cad98697dc69a04e6de6154b6621b2d6abb54 Mon Sep 17 00:00:00 2001 From: Geir Storli Date: Tue, 8 Nov 2022 15:12:54 +0000 Subject: 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. --- .../attribute/attribute_blueprint_factory.cpp | 53 ++++++++++++++++++++-- 1 file 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 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 ¶ms) : 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 @@ -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 create_matching_elements_search(const MatchingElementsFields &fields) const override { if (fields.has_field(_attrName)) { -- cgit v1.2.3 From b3bb0e09fecff8cd3ae0cd97de02ed3ae81475cb Mon Sep 17 00:00:00 2001 From: Geir Storli Date: Tue, 8 Nov 2022 15:15:51 +0000 Subject: Fix the query trace type of allow_termwise_eval. --- searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp | 8 ++++---- .../tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp | 4 ++-- searchlib/src/vespa/searchlib/queryeval/blueprint.cpp | 2 +- 3 files changed, 7 insertions(+), 7 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/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); -- cgit v1.2.3