summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-07-26 11:03:39 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-07-28 02:47:15 +0000
commit9603d4f58cf9bd327ac640f9270e5be66c4fe421 (patch)
treebe974fdb3a12bc1e7f7382965bd1579867ec7d37
parentfbfca70e193c80417ea7a5ab3d92cd44c60507f4 (diff)
Avoid createing the FieldSpec on the fly.
-rw-r--r--searchcore/src/tests/proton/matching/querynodes_test.cpp5
-rw-r--r--searchcore/src/tests/proton/matching/resolveviewvisitor_test.cpp37
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/querynodes.cpp12
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/querynodes.h36
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/same_element_builder.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/field_spec.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/field_spec.h2
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 {