summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-08-13 15:14:29 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-08-13 15:38:58 +0000
commit7bf5c4d363334993135f9edf77d9bbed306d03e4 (patch)
treefff4671819427a68568239479b0c86e2630a699a /searchcore
parenteb7242e20b41625bf5416897ab28ffcf06a68487 (diff)
Use a vector backed set for speed.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp4
-rw-r--r--searchcore/src/tests/proton/server/documentretriever_test.cpp16
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp12
3 files changed, 14 insertions, 18 deletions
diff --git a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp
index ed4c8938aa1..d941a9f35b7 100644
--- a/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp
+++ b/searchcore/src/tests/proton/document_iterator/document_iterator_test.cpp
@@ -757,9 +757,7 @@ TEST("require that document selection and timestamp range works together") {
}
TEST("require that fieldset limits fields returned") {
- document::Field::Set fields;
- fields.insert(&getDocType().getField("header"));
- document::FieldCollection limited(getDocType(), std::move(fields));
+ document::FieldCollection limited(getDocType(), document::Field::Set::Builder().insert(&getDocType().getField("header")).build());
DocumentIterator itr(bucket(5), limited, selectAll(), newestV(), -1, false);
itr.add(doc_with_fields("id:ns:foo::xxx1", Timestamp(1), bucket(5)));
IterateResult res = itr.iterate(largeNum);
diff --git a/searchcore/src/tests/proton/server/documentretriever_test.cpp b/searchcore/src/tests/proton/server/documentretriever_test.cpp
index c9fece26655..a6f98719da2 100644
--- a/searchcore/src/tests/proton/server/documentretriever_test.cpp
+++ b/searchcore/src/tests/proton/server/documentretriever_test.cpp
@@ -583,7 +583,7 @@ struct Lookup : public IFieldInfo
Lookup() : _count(0) {}
bool isFieldAttribute(const document::Field & field) const override {
_count++;
- return (field.getName()[0] == 'a');
+ return ((field.getName()[0] % 2) == 1); // a, c, e... are attributes
}
mutable unsigned _count;
};
@@ -592,29 +592,27 @@ TEST("require that fieldset can figure out their attributeness and rember it") {
Lookup lookup;
FieldSetAttributeDB fsDB(lookup);
document::Field attr1("attr1", 1, *document::DataType::LONG);
- document::Field attr2("attr2", 2, *document::DataType::LONG);
- document::Field not_attr1("not_attr1", 3, *document::DataType::LONG);
- document::Field::Set allAttr;
- allAttr.insert(&attr1);
+ document::Field attr2("cttr2", 2, *document::DataType::LONG);
+ document::Field not_attr1("b_not_attr1", 3, *document::DataType::LONG);
+ document::Field::Set allAttr = document::Field::Set::Builder().insert(&attr1).build();
EXPECT_TRUE(fsDB.areAllFieldsAttributes(13, allAttr));
EXPECT_EQUAL(1u, lookup._count);
EXPECT_TRUE(fsDB.areAllFieldsAttributes(13, allAttr));
EXPECT_EQUAL(1u, lookup._count);
- allAttr.insert(&attr2);
+ allAttr = document::Field::Set::Builder().insert(&attr1).insert(&attr2).build();
EXPECT_TRUE(fsDB.areAllFieldsAttributes(17, allAttr));
EXPECT_EQUAL(3u, lookup._count);
EXPECT_TRUE(fsDB.areAllFieldsAttributes(17, allAttr));
EXPECT_EQUAL(3u, lookup._count);
- document::Field::Set notAllAttr;
- notAllAttr.insert(&not_attr1);
+ document::Field::Set notAllAttr = document::Field::Set::Builder().insert(&not_attr1).build();
EXPECT_FALSE(fsDB.areAllFieldsAttributes(33, notAllAttr));
EXPECT_EQUAL(4u, lookup._count);
EXPECT_FALSE(fsDB.areAllFieldsAttributes(33, notAllAttr));
EXPECT_EQUAL(4u, lookup._count);
- notAllAttr.insert(&attr1);
+ notAllAttr = document::Field::Set::Builder().insert(&attr1).insert(&not_attr1).insert(&attr2).build();
EXPECT_FALSE(fsDB.areAllFieldsAttributes(39, notAllAttr));
EXPECT_EQUAL(6u, lookup._count);
EXPECT_FALSE(fsDB.areAllFieldsAttributes(39, notAllAttr));
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
index 4484338ddfd..cd0a0fcc971 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentretriever.cpp
@@ -82,7 +82,7 @@ DocumentRetriever
_attr_manager(attr_manager),
_doc_store(doc_store),
_possiblePositionFields(),
- _attributeFields(),
+ _attributeFields(document::Field::Set::Builder().build()),
_areAllFieldsAttributes(true),
_fieldSetAttributeInfo(*this)
{
@@ -90,6 +90,7 @@ DocumentRetriever
document::Field::Set fields = documentType->getFieldSet();
int32_t positionDataTypeId = PositionDataType::getInstance().getId();
LOG(debug, "checking document type '%s' for position fields", docTypeName.getName().c_str());
+ document::Field::Set::Builder attrBuilder;
for (const document::Field * field : fields) {
if ((field->getDataType().getId() == positionDataTypeId) || is_array_of_position_type(field->getDataType())) {
LOG(debug, "Field '%s' is a position field", field->getName().data());
@@ -109,12 +110,13 @@ DocumentRetriever
&& ((*attr)->getBasicType() != BasicType::PREDICATE)
&& ((*attr)->getBasicType() != BasicType::REFERENCE))
{
- _attributeFields.insert(field);
+ attrBuilder.insert(field);
} else {
_areAllFieldsAttributes = false;
}
}
}
+ _attributeFields = attrBuilder.build();
}
bool
@@ -139,7 +141,7 @@ DocumentRetriever::needFetchFromDocStore(const document::FieldSet & fieldSet) co
bool
DocumentRetriever::isFieldAttribute(const document::Field & field) const {
- return _attributeFields.find(&field) != _attributeFields.end();
+ return _attributeFields.contains(field);
}
DocumentRetriever::~DocumentRetriever() = default;
@@ -245,9 +247,7 @@ DocumentRetriever::getPartialDocument(search::DocumentIdT lid, const document::D
break;
case document::FieldSet::Type::FIELD: {
const auto & field = static_cast<const document::Field &>(fieldSet);
- document::Field::Set attributes;
- attributes.insert(&field);
- populate(lid, *doc, attributes);
+ populate(lid, *doc, document::Field::Set::Builder().insert(&field).build());
break;
}
case document::FieldSet::Type::SET: {