diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-07-26 11:03:39 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-07-28 02:47:15 +0000 |
commit | 9603d4f58cf9bd327ac640f9270e5be66c4fe421 (patch) | |
tree | be974fdb3a12bc1e7f7382965bd1579867ec7d37 | |
parent | fbfca70e193c80417ea7a5ab3d92cd44c60507f4 (diff) |
Avoid createing the FieldSpec on the fly.
7 files changed, 43 insertions, 55 deletions
diff --git a/searchcore/src/tests/proton/matching/querynodes_test.cpp b/searchcore/src/tests/proton/matching/querynodes_test.cpp index 3c9220bcdb8..0fa1edc2455 100644 --- a/searchcore/src/tests/proton/matching/querynodes_test.cpp +++ b/searchcore/src/tests/proton/matching/querynodes_test.cpp @@ -519,10 +519,11 @@ TEST("requireThatSimpleIntermediatesGetProperBlending") { } TEST("control query nodes size") { + EXPECT_EQUAL(128u, sizeof(ProtonTermData)); EXPECT_EQUAL(160u, sizeof(search::query::NumberTerm)); - EXPECT_EQUAL(280u, sizeof(ProtonNodeTypes::NumberTerm)); + EXPECT_EQUAL(288u, sizeof(ProtonNodeTypes::NumberTerm)); EXPECT_EQUAL(160u, sizeof(search::query::StringTerm)); - EXPECT_EQUAL(280u, sizeof(ProtonNodeTypes::StringTerm)); + EXPECT_EQUAL(288u, sizeof(ProtonNodeTypes::StringTerm)); } } // namespace diff --git a/searchcore/src/tests/proton/matching/resolveviewvisitor_test.cpp b/searchcore/src/tests/proton/matching/resolveviewvisitor_test.cpp index a47531c5575..9b2284a2e0d 100644 --- a/searchcore/src/tests/proton/matching/resolveviewvisitor_test.cpp +++ b/searchcore/src/tests/proton/matching/resolveviewvisitor_test.cpp @@ -43,10 +43,8 @@ struct Fixture { IndexEnvironment index_environment; Fixture() { - index_environment.getFields().push_back(FieldInfo( - FieldType::INDEX, CollectionType::SINGLE, field1, 0)); - index_environment.getFields().push_back(FieldInfo( - FieldType::INDEX, CollectionType::SINGLE, field2, 1)); + index_environment.getFields().emplace_back(FieldType::INDEX, CollectionType::SINGLE, field1, 0); + index_environment.getFields().emplace_back(FieldType::INDEX, CollectionType::SINGLE, field2, 1); } }; @@ -61,11 +59,10 @@ TEST_F("requireThatFieldsResolveToThemselves", Fixture) { node->accept(visitor); EXPECT_EQUAL(1u, base.numFields()); - EXPECT_EQUAL(field1, base.field(0).field_name); + EXPECT_EQUAL(field1, base.field(0).getName()); } -void checkResolveAlias(const string &view_name, const string &alias, - const Fixture &f) { +void checkResolveAlias(const string &view_name, const string &alias, const Fixture &f) { ViewResolver resolver = getResolver(view_name); QueryBuilder<ProtonNodeTypes> builder; @@ -76,8 +73,8 @@ void checkResolveAlias(const string &view_name, const string &alias, node->accept(visitor); ASSERT_EQUAL(2u, base.numFields()); - EXPECT_EQUAL(field1, base.field(0).field_name); - EXPECT_EQUAL(field2, base.field(1).field_name); + EXPECT_EQUAL(field1, base.field(0).getName()); + EXPECT_EQUAL(field2, base.field(1).getName()); } TEST_F("requireThatViewsCanResolveToMultipleFields", Fixture) { @@ -97,24 +94,22 @@ TEST_F("requireThatWeCanForceFilterField", Fixture) { { // use filter field settings from index environment QueryBuilder<ProtonNodeTypes> builder; - ProtonStringTerm &sterm = - builder.addStringTerm(term, view, id, weight); + ProtonStringTerm &sterm = builder.addStringTerm(term, view, id, weight); Node::UP node = builder.build(); node->accept(visitor); ASSERT_EQUAL(2u, sterm.numFields()); - EXPECT_TRUE(!sterm.field(0).filter_field); - EXPECT_TRUE(sterm.field(1).filter_field); + EXPECT_TRUE(!sterm.field(0).is_filter()); + EXPECT_TRUE(sterm.field(1).is_filter()); } { // force filter on all fields QueryBuilder<ProtonNodeTypes> builder; - ProtonStringTerm &sterm = - builder.addStringTerm(term, view, id, weight); + ProtonStringTerm &sterm = builder.addStringTerm(term, view, id, weight); sterm.setPositionData(false); // force filter Node::UP node = builder.build(); node->accept(visitor); ASSERT_EQUAL(2u, sterm.numFields()); - EXPECT_TRUE(sterm.field(0).filter_field); - EXPECT_TRUE(sterm.field(1).filter_field); + EXPECT_TRUE(sterm.field(0).is_filter()); + EXPECT_TRUE(sterm.field(1).is_filter()); } } @@ -132,8 +127,8 @@ TEST_F("require that equiv nodes resolve view from children", Fixture) { node->accept(visitor); ASSERT_EQUAL(2u, base.numFields()); - EXPECT_EQUAL(field1, base.field(0).field_name); - EXPECT_EQUAL(field2, base.field(1).field_name); + EXPECT_EQUAL(field1, base.field(0).getName()); + EXPECT_EQUAL(field2, base.field(1).getName()); } TEST_F("require that view is resolved for SameElement and its children", Fixture) { @@ -151,10 +146,10 @@ TEST_F("require that view is resolved for SameElement and its children", Fixture node->accept(visitor); ASSERT_EQUAL(1u, same_elem.numFields()); - EXPECT_EQUAL(field2, same_elem.field(0).field_name); + EXPECT_EQUAL(field2, same_elem.field(0).getName()); ASSERT_EQUAL(1u, my_term.numFields()); - EXPECT_EQUAL(field1, my_term.field(0).field_name); + EXPECT_EQUAL(field1, my_term.field(0).getName()); } } // namespace diff --git a/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp b/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp index f1fffc69938..008bb585ab5 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp @@ -4,8 +4,6 @@ #include "termdatafromnode.h" #include "viewresolver.h" #include "handlerecorder.h" -#include <vespa/searchlib/query/tree/templatetermvisitor.h> -#include <vespa/searchlib/queryeval/orsearch.h> #include <vespa/vespalib/util/issue.h> #include <vespa/log/log.h> @@ -15,7 +13,6 @@ using search::fef::FieldInfo; using search::fef::FieldType; using search::fef::IIndexEnvironment; using search::fef::MatchData; -using search::fef::MatchDataDetails; using search::fef::MatchDataLayout; using search::fef::TermFieldHandle; using search::query::Node; @@ -55,10 +52,9 @@ ProtonTermData::resolve(const ViewResolver &resolver, const IIndexEnvironment &i for (size_t i = 0; i < fields.size(); ++i) { const FieldInfo *info = idxEnv.getFieldByName(fields[i]); if (info != nullptr) { - _fields.emplace_back(fields[i], info->id()); + _fields.emplace_back(fields[i], info->id(), forceFilter || info->isFilter()); FieldEntry & field = _fields.back(); field.attribute_field = is_attribute(info->type()); - field.filter_field = forceFilter || info->isFilter(); } else { LOG(debug, "ignoring undefined field: '%s'", fields[i].c_str()); } @@ -79,7 +75,7 @@ ProtonTermData::resolveFromChildren(const std::vector<Node *> &subterms) if (lookupField(subSpec.getFieldId()) == nullptr) { // this must happen before handles are reserved LOG_ASSERT(subSpec.getHandle() == search::fef::IllegalHandle); - _fields.emplace_back(subSpec.field_name, subSpec.getFieldId()); + _fields.emplace_back(subSpec._field_spec.getName(), subSpec.getFieldId(), false); } } } @@ -89,7 +85,7 @@ void ProtonTermData::allocateTerms(MatchDataLayout &mdl) { for (size_t i = 0; i < _fields.size(); ++i) { - _fields[i].setHandle(mdl.allocTermField(_fields[i].getFieldId())); + _fields[i]._field_spec.setHandle(mdl.allocTermField(_fields[i].getFieldId())); } } @@ -117,7 +113,7 @@ ProtonTermData::lookupField(uint32_t fieldId) const TermFieldHandle ProtonTermData::FieldEntry::getHandle(MatchDataDetails requested_details) const { - TermFieldHandle handle(search::fef::SimpleTermFieldData::getHandle(requested_details)); + TermFieldHandle handle(_field_spec.getHandle()); HandleRecorder::register_handle(handle, requested_details); return handle; } diff --git a/searchcore/src/vespa/searchcore/proton/matching/querynodes.h b/searchcore/src/vespa/searchcore/proton/matching/querynodes.h index cc09d4e9e7d..f89c42e3e62 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/querynodes.h +++ b/searchcore/src/vespa/searchcore/proton/matching/querynodes.h @@ -5,8 +5,6 @@ #include <vespa/searchlib/queryeval/field_spec.h> #include <vespa/searchlib/fef/iindexenvironment.h> #include <vespa/searchlib/fef/itermdata.h> -#include <vespa/searchlib/fef/simpletermdata.h> -#include <vespa/searchlib/fef/simpletermfielddata.h> #include <vespa/searchlib/fef/matchdatalayout.h> #include <vespa/searchlib/query/tree/intermediatenodes.h> #include <vespa/searchlib/query/tree/termnodes.h> @@ -24,23 +22,27 @@ class ProtonTermData : public search::fef::ITermData { public: using FieldSpec = search::queryeval::FieldSpec; + using ITermFieldData = search::fef::ITermFieldData; + using TermFieldHandle = search::fef::TermFieldHandle; + using MatchDataDetails = search::fef::MatchDataDetails; - struct FieldEntry final : search::fef::SimpleTermFieldData { - vespalib::string field_name; + struct FieldEntry final : ITermFieldData { + FieldSpec _field_spec; bool attribute_field; - bool filter_field; - FieldEntry(const vespalib::string &name, uint32_t fieldId) noexcept - : SimpleTermFieldData(fieldId), - field_name(name), - attribute_field(false), - filter_field(false) {} + FieldEntry(const vespalib::string &name, uint32_t fieldId, bool is_filter) noexcept + : ITermFieldData(fieldId), + _field_spec(name, fieldId, search::fef::IllegalHandle, is_filter), + attribute_field(false) + {} - [[nodiscard]] FieldSpec fieldSpec() const noexcept { - return {field_name, getFieldId(), getHandle(), filter_field}; + [[nodiscard]] const FieldSpec & fieldSpec() const noexcept { + return _field_spec; } - using SimpleTermFieldData::getHandle; - [[nodiscard]] search::fef::TermFieldHandle getHandle(search::fef::MatchDataDetails requested_details) const override; + [[nodiscard]] TermFieldHandle getHandle() const { return getHandle(MatchDataDetails::Normal); } + [[nodiscard]] TermFieldHandle getHandle(MatchDataDetails requested_details) const override; + [[nodiscard]] const vespalib::string & getName() const noexcept { return _field_spec.getName(); } + [[nodiscard]] bool is_filter() const noexcept { return _field_spec.isFilter(); } }; private: @@ -49,10 +51,8 @@ private: void propagate_document_frequency(uint32_t matching_count_doc, uint32_t total_doc_count); protected: - void resolve(const ViewResolver &resolver, - const search::fef::IIndexEnvironment &idxEnv, - const vespalib::string &view, - bool forceFilter); + void resolve(const ViewResolver &resolver, const search::fef::IIndexEnvironment &idxEnv, + const vespalib::string &view, bool forceFilter); public: ProtonTermData() noexcept; diff --git a/searchcore/src/vespa/searchcore/proton/matching/same_element_builder.cpp b/searchcore/src/vespa/searchcore/proton/matching/same_element_builder.cpp index 5f77cfefcdf..d86ca316fe3 100644 --- a/searchcore/src/vespa/searchcore/proton/matching/same_element_builder.cpp +++ b/searchcore/src/vespa/searchcore/proton/matching/same_element_builder.cpp @@ -37,7 +37,7 @@ public: assert(field.getFieldId() != search::fef::IllegalFieldId); assert(field.getHandle() == search::fef::IllegalHandle); FieldSpecList field_spec; - field_spec.add(_result.getNextChildField(field.field_name, field.getFieldId())); + field_spec.add(_result.getNextChildField(field.getName(), field.getFieldId())); Searchable &searchable = field.attribute_field ? _context.getAttributes() : _context.getIndexes(); _result.addTerm(searchable.createBlueprint(_requestContext, field_spec, n)); } diff --git a/searchlib/src/vespa/searchlib/queryeval/field_spec.cpp b/searchlib/src/vespa/searchlib/queryeval/field_spec.cpp index 0d060f6de6b..a2599ef38b6 100644 --- a/searchlib/src/vespa/searchlib/queryeval/field_spec.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/field_spec.cpp @@ -16,10 +16,6 @@ FieldSpec::FieldSpec(const vespalib::string & name, uint32_t fieldId, { assert(fieldId < 0x1000000); // Can be represented by 24 bits } -FieldSpec::FieldSpec(const vespalib::string & name, FieldSpecBase base) noexcept - : FieldSpecBase(base), - _name(name) -{} FieldSpecBaseList::~FieldSpecBaseList() = default; diff --git a/searchlib/src/vespa/searchlib/queryeval/field_spec.h b/searchlib/src/vespa/searchlib/queryeval/field_spec.h index 6f21ca1e0f0..2074a542672 100644 --- a/searchlib/src/vespa/searchlib/queryeval/field_spec.h +++ b/searchlib/src/vespa/searchlib/queryeval/field_spec.h @@ -32,6 +32,7 @@ public: const fef::TermFieldMatchData *resolve(const fef::MatchData &md) const; uint32_t getFieldId() const noexcept { return _fieldId & 0xffffff; } fef::TermFieldHandle getHandle() const noexcept { return _handle; } + void setHandle(fef::TermFieldHandle handle) { _handle = handle; } /// a filter produces less detailed match data bool isFilter() const noexcept { return _fieldId & 0x1000000; } private: @@ -48,7 +49,6 @@ public: FieldSpec(const vespalib::string & name, uint32_t fieldId, fef::TermFieldHandle handle) noexcept; FieldSpec(const vespalib::string & name, uint32_t fieldId, fef::TermFieldHandle handle, bool isFilter_) noexcept; - FieldSpec(const vespalib::string & name, FieldSpecBase base) noexcept; ~FieldSpec(); void setBase(FieldSpecBase base) noexcept { |