summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--persistence/src/vespa/persistence/spi/docentry.cpp1
-rw-r--r--persistencetypes/src/persistence/spi/types.h8
-rw-r--r--storage/src/vespa/storage/visiting/visitor.h8
-rw-r--r--streamingvisitors/src/tests/hitcollector/hitcollector.cpp4
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp23
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.h12
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp238
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.h28
-rw-r--r--vsm/src/tests/docsum/docsum.cpp30
-rw-r--r--vsm/src/tests/document/document.cpp9
-rw-r--r--vsm/src/tests/searcher/searcher.cpp4
-rw-r--r--vsm/src/vespa/vsm/common/CMakeLists.txt1
-rw-r--r--vsm/src/vespa/vsm/common/docsum.cpp47
-rw-r--r--vsm/src/vespa/vsm/common/docsum.h21
-rw-r--r--vsm/src/vespa/vsm/common/document.cpp18
-rw-r--r--vsm/src/vespa/vsm/common/document.h8
-rw-r--r--vsm/src/vespa/vsm/common/storagedocument.cpp39
-rw-r--r--vsm/src/vespa/vsm/common/storagedocument.h87
18 files changed, 198 insertions, 388 deletions
diff --git a/persistence/src/vespa/persistence/spi/docentry.cpp b/persistence/src/vespa/persistence/spi/docentry.cpp
index a4b297ffb69..c9ceda982e0 100644
--- a/persistence/src/vespa/persistence/spi/docentry.cpp
+++ b/persistence/src/vespa/persistence/spi/docentry.cpp
@@ -2,7 +2,6 @@
#include "docentry.h"
#include <vespa/document/fieldvalue/document.h>
-#include <vespa/document/base/documentid.h>
#include <sstream>
namespace storage {
diff --git a/persistencetypes/src/persistence/spi/types.h b/persistencetypes/src/persistence/spi/types.h
index 5f93935dc2b..d88fc5eb5ae 100644
--- a/persistencetypes/src/persistence/spi/types.h
+++ b/persistencetypes/src/persistence/spi/types.h
@@ -95,10 +95,10 @@ using DocumentId = document::DocumentId;
using GlobalId = document::GlobalId;
using TimestampList = std::vector<Timestamp>;
using string = vespalib::string;
-using DocumentUP = std::unique_ptr<Document>;
-using DocumentIdUP = std::unique_ptr<DocumentId>;
-using DocumentSP = std::shared_ptr<Document>;
-using DocumentUpdateSP = std::shared_ptr<DocumentUpdate>;
+using DocumentUP = std::unique_ptr<document::Document>;
+using DocumentIdUP = std::unique_ptr<document::DocumentId>;
+using DocumentSP = std::shared_ptr<document::Document>;
+using DocumentUpdateSP = std::shared_ptr<document::DocumentUpdate>;
enum IncludedVersions {
NEWEST_DOCUMENT_ONLY,
diff --git a/storage/src/vespa/storage/visiting/visitor.h b/storage/src/vespa/storage/visiting/visitor.h
index cea4a590f3f..bdf301a0d94 100644
--- a/storage/src/vespa/storage/visiting/visitor.h
+++ b/storage/src/vespa/storage/visiting/visitor.h
@@ -11,20 +11,20 @@
#pragma once
-#include <list>
-#include <deque>
+#include "visitormessagesession.h"
+#include "memory_bounded_trace.h"
#include <vespa/storageapi/messageapi/storagemessage.h>
#include <vespa/storageapi/message/visitor.h>
#include <vespa/document/select/orderingspecification.h>
#include <vespa/storage/common/storagecomponent.h>
#include <vespa/storage/common/visitorfactory.h>
-#include <vespa/storage/visiting/visitormessagesession.h>
-#include <vespa/storage/visiting/memory_bounded_trace.h>
#include <vespa/documentapi/messagebus/messages/documentmessage.h>
#include <vespa/persistence/spi/docentry.h>
#include <vespa/persistence/spi/selection.h>
#include <vespa/persistence/spi/read_consistency.h>
#include <vespa/storageframework/storageframework.h>
+#include <list>
+#include <deque>
namespace document {
class Document;
diff --git a/streamingvisitors/src/tests/hitcollector/hitcollector.cpp b/streamingvisitors/src/tests/hitcollector/hitcollector.cpp
index 3875122d9e8..8c0d2f5ac35 100644
--- a/streamingvisitors/src/tests/hitcollector/hitcollector.cpp
+++ b/streamingvisitors/src/tests/hitcollector/hitcollector.cpp
@@ -5,8 +5,6 @@
#include <vespa/searchlib/fef/matchdata.h>
#include <vespa/searchlib/fef/feature_resolver.h>
#include <vespa/searchvisitor/hitcollector.h>
-#include <vespa/vdslib/container/searchresult.h>
-#include <vespa/vsm/common/storagedocument.h>
using namespace document;
using namespace search::fef;
@@ -64,7 +62,7 @@ void
HitCollectorTest::addHit(HitCollector &hc, uint32_t docId, double score, const char *sortData, size_t sortDataSize)
{
document::Document::UP doc(new document::Document(_docType, DocumentId("doc::")));
- StorageDocument::SP sdoc(new StorageDocument(std::move(doc)));
+ StorageDocument::LP sdoc(new StorageDocument(std::move(doc), SharedFieldPathMap(), 0));
ASSERT_TRUE(sdoc->valid());
MatchData md(MatchData::params());
hc.addHit(sdoc, docId, md, score, sortData, sortDataSize);
diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
index e583fe55a51..f65d4a1d100 100644
--- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
@@ -2,7 +2,6 @@
#include "hitcollector.h"
#include <vespa/searchlib/fef/feature_resolver.h>
-#include <stdexcept>
#include <vespa/log/log.h>
LOG_SETUP(".searchvisitor.hitcollector");
@@ -32,14 +31,14 @@ HitCollector::getDocSum(const search::DocumentIdT & docId) const
}
bool
-HitCollector::addHit(const vsm::StorageDocument::SP & doc, uint32_t docId, const search::fef::MatchData & data, double score)
+HitCollector::addHit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & data, double score)
{
Hit h(doc, docId, data, score);
return addHit(h);
}
bool
-HitCollector::addHit(const vsm::StorageDocument::SP & doc, uint32_t docId, const search::fef::MatchData & data,
+HitCollector::addHit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & data,
double score, const void * sortData, size_t sortDataLen)
{
Hit h(doc, docId, data, score, sortData, sortDataLen);
@@ -109,17 +108,17 @@ void
HitCollector::fillSearchResult(vdslib::SearchResult & searchResult)
{
sortByDocId();
- for (HitVector::const_iterator it(_hits.begin()), mt(_hits.end()); it != mt; it++) {
- vespalib::string documentId(it->getDocument()->docDoc().getId().toString());
- search::DocumentIdT docId = it->getDocId();
- SearchResult::RankType rank = it->getRankScore();
+ for (const Hit & hit : _hits) {
+ vespalib::string documentId(hit.getDocument()->docDoc().getId().toString());
+ search::DocumentIdT docId = hit.getDocId();
+ SearchResult::RankType rank = hit.getRankScore();
LOG(debug, "fillSearchResult: gDocId(%s), lDocId(%u), rank(%f)", documentId.c_str(), docId, (float)rank);
- if (it->getSortBlob().empty()) {
+ if (hit.getSortBlob().empty()) {
searchResult.addHit(docId, documentId.c_str(), rank);
} else {
- searchResult.addHit(docId, documentId.c_str(), rank, it->getSortBlob().c_str(), it->getSortBlob().size());
+ searchResult.addHit(docId, documentId.c_str(), rank, hit.getSortBlob().c_str(), hit.getSortBlob().size());
}
}
}
@@ -138,9 +137,9 @@ HitCollector::getFeatureSet(IRankProgram &rankProgram,
names.emplace_back(resolver.name_of(i));
}
FeatureSet::SP retval = FeatureSet::SP(new FeatureSet(names, _hits.size()));
- for (HitVector::iterator it(_hits.begin()), mt(_hits.end()); it != mt; ++it) {
- rankProgram.run(it->getDocId(), it->getMatchData());
- uint32_t docId = it->getDocId();
+ for (const Hit & hit : _hits) {
+ rankProgram.run(hit.getDocId(), hit.getMatchData());
+ uint32_t docId = hit.getDocId();
search::feature_t * f = retval->getFeaturesByIndex(retval->addDocId(docId));
for (uint32_t j = 0; j < names.size(); ++j) {
f[j] = *resolver.resolve_number(j);
diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.h b/streamingvisitors/src/vespa/searchvisitor/hitcollector.h
index ea4a20c187b..5f9d1d4a4bb 100644
--- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.h
+++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.h
@@ -22,7 +22,7 @@ private:
class Hit
{
public:
- Hit(const vsm::StorageDocument::SP & doc, uint32_t docId, const search::fef::MatchData & matchData,
+ Hit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & matchData,
double score, const void * sortData, size_t sortDataLen) :
_docid(docId),
_score(score),
@@ -35,10 +35,10 @@ private:
_matchData.emplace_back(*matchData.resolveTermField(handle));
}
}
- Hit(const vsm::StorageDocument::SP & doc, uint32_t docId, const search::fef::MatchData & matchData, double score)
+ Hit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & matchData, double score)
: Hit(doc, docId, matchData, score, nullptr, 0) {}
search::DocumentIdT getDocId() const { return _docid; }
- const vsm::StorageDocument::SP & getDocument() const { return _document; }
+ const vsm::StorageDocument::LP & getDocument() const { return _document; }
const std::vector<search::fef::TermFieldMatchData> &getMatchData() const { return _matchData; }
search::feature_t getRankScore() const { return _score; }
const vespalib::string & getSortBlob() const { return _sortBlob; }
@@ -70,7 +70,7 @@ private:
private:
uint32_t _docid;
double _score;
- vsm::StorageDocument::SP _document;
+ vsm::StorageDocument::LP _document;
std::vector<search::fef::TermFieldMatchData> _matchData;
vespalib::string _sortBlob;
};
@@ -104,7 +104,7 @@ public:
* @param data The match data for the hit.
* @return true if the document was added to the heap
**/
- bool addHit(const vsm::StorageDocument::SP & doc, uint32_t docId, const search::fef::MatchData & data, double score);
+ bool addHit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & data, double score);
/**
* Adds a hit to this hit collector.
@@ -118,7 +118,7 @@ public:
* @param sortDataLen The length of the sortdata.
* @return true if the document was added to the heap
**/
- bool addHit(const vsm::StorageDocument::SP & doc, uint32_t docId, const search::fef::MatchData & data,
+ bool addHit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & data,
double score, const void * sortData, size_t sortDataLen);
/**
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
index 061194ec99f..40c1d1f46db 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
@@ -4,27 +4,12 @@
#include "searchenvironment.h"
#include "searchvisitor.h"
#include <vespa/document/datatype/positiondatatype.h>
-#include <vespa/document/fieldvalue/arrayfieldvalue.h>
-#include <vespa/document/fieldvalue/bytefieldvalue.h>
-#include <vespa/document/fieldvalue/document.h>
-#include <vespa/document/fieldvalue/doublefieldvalue.h>
-#include <vespa/document/fieldvalue/floatfieldvalue.h>
-#include <vespa/document/fieldvalue/longfieldvalue.h>
-#include <vespa/document/fieldvalue/weightedsetfieldvalue.h>
-#include <vespa/searchlib/attribute/attributeguard.h>
-#include <vespa/searchlib/attribute/extendableattributes.h>
#include <vespa/searchlib/aggregation/modifiers.h>
#include <vespa/searchlib/common/packets.h>
-#include <vespa/searchlib/common/sortspec.h>
#include <vespa/searchlib/uca/ucaconverter.h>
#include <vespa/searchlib/features/setup.h>
#include <vespa/searchlib/fef/fef.h>
-#include <vespa/fastlib/text/wordfolder.h>
-#include <vespa/vdslib/container/documentlist.h>
-#include <vespa/vsm/config/vsm-cfif.h>
#include <vespa/vespalib/geo/zcurve.h>
-#include <vespa/vsm/vsm/docsumfilter.h>
-#include <vespa/vsm/vsm/vsm-adapter.h>
#include <vespa/vespalib/objects/nbostream.h>
#include <vespa/vespalib/util/exceptions.h>
@@ -33,37 +18,16 @@ LOG_SETUP(".visitor.instance.searchvisitor");
namespace storage {
-using vsm::VSMAdapter;
using vsm::DocsumFilter;
-using vsm::DocsumTools;
-using vsm::DocsumToolsPtr;
-using vsm::DocSumCache;
-using vsm::FieldIdTSearcherMap;
-using vsm::FieldPathMapT;
-using vsm::FieldSearcher;
-using vsm::FieldSearchSpecMap;
-using vsm::VsmfieldsHandle;
using vsm::FieldPath;
using vsm::StorageDocument;
using vsm::StringFieldIdTMap;
-using search::IAttributeManager;
using search::AttributeGuard;
-using search::AttributeManager;
using search::AttributeVector;
using search::attribute::IAttributeVector;
-using search::EmptyQueryNodeResult;
-using search::Query;
-using search::QueryPacketT;
-using search::FeatureSet;
-using search::fs4transport::FS4Packet_DOCSUM;
-using search::fs4transport::FS4Packet_EOL;
-using search::fs4transport::PacketArray;
-using namespace search::docsummary;
-using namespace search::aggregation;
-using namespace search::expression;
+using search::aggregation::HitsAggregationResult;
+using search::expression::ConfigureStaticParams;
using vdslib::Parameters;
-using vdslib::DocumentList;
-
class ForceWordfolderInit
{
@@ -87,8 +51,7 @@ createMultiValueAttribute(const vespalib::string & name, const document::FieldVa
{
const document::DataType * ndt = fv.getDataType();
if (ndt->inherits(document::CollectionDataType::classId)) {
- ndt = &(static_cast<const document::CollectionDataType *>(ndt))
- ->getNestedType();
+ ndt = &(static_cast<const document::CollectionDataType *>(ndt))->getNestedType();
}
LOG(debug, "Create %s attribute '%s' with data type '%s' (%s)",
arrayType ? "array" : "weighted set", name.c_str(), ndt->getName().c_str(), fv.getClass().name());
@@ -133,7 +96,7 @@ createAttribute(const vespalib::string & name, const document::FieldValue & fv)
}
SearchVisitor::SummaryGenerator::SummaryGenerator() :
- search::aggregation::HitsAggregationResult::SummaryGenerator(),
+ HitsAggregationResult::SummaryGenerator(),
_callback(),
_docsumState(_callback),
_docsumFilter(),
@@ -142,7 +105,7 @@ SearchVisitor::SummaryGenerator::SummaryGenerator() :
{
}
-vespalib::ConstBufferRef SearchVisitor::SummaryGenerator::fillSummary(search::AttributeVector::DocId lid, const search::aggregation::HitsAggregationResult::SummaryClassType & summaryClass)
+vespalib::ConstBufferRef SearchVisitor::SummaryGenerator::fillSummary(AttributeVector::DocId lid, const HitsAggregationResult::SummaryClassType & summaryClass)
{
if (_docsumWriter != NULL) {
_rawBuf.reset();
@@ -155,14 +118,14 @@ vespalib::ConstBufferRef SearchVisitor::SummaryGenerator::fillSummary(search::At
void SearchVisitor::HitsResultPreparator::execute(vespalib::Identifiable & obj)
{
- search::aggregation::HitsAggregationResult & hitsAggr(static_cast<search::aggregation::HitsAggregationResult &>(obj));
+ HitsAggregationResult & hitsAggr(static_cast<HitsAggregationResult &>(obj));
hitsAggr.setSummaryGenerator(_summaryGenerator);
_numHitsAggregators++;
}
bool SearchVisitor::HitsResultPreparator::check(const vespalib::Identifiable & obj) const
{
- return obj.getClass().inherits(search::aggregation::HitsAggregationResult::classId);
+ return obj.getClass().inherits(HitsAggregationResult::classId);
}
SearchVisitor::GroupingEntry::GroupingEntry(Grouping * grouping) :
@@ -320,7 +283,7 @@ void SearchVisitor::init(const Parameters & params)
if ( params.get("query", queryBlob) ) {
LOG(spam, "Received query blob of %zd bytes", queryBlob.size());
QueryTermData resultAddOn;
- _query = Query(resultAddOn, QueryPacketT(static_cast<const char *>(queryBlob.data()), queryBlob.size()));
+ _query = search::Query(resultAddOn, search::QueryPacketT(queryBlob.data(), queryBlob.size()));
LOG(debug, "Query tree: '%s'", _query.asString().c_str());
_searchBuffer->reserve(0x10000);
@@ -464,7 +427,7 @@ SearchVisitor::RankController::processHintedAttributes(const IndexEnvironment &
found = (attributeFields[j]._field == fid);
}
if (!found) {
- search::AttributeGuard::UP attr(attrMan.getAttribute(name));
+ AttributeGuard::UP attr(attrMan.getAttribute(name));
if (attr->valid()) {
LOG(debug, "Add attribute '%s' with field id '%u' to the list of needed attributes", name.c_str(), fid);
attributeFields.push_back(AttrInfo(fid, std::move(attr)));
@@ -558,23 +521,24 @@ bool
SearchVisitor::RankController::collectMatchedDocument(bool hasSorting,
SearchVisitor & visitor,
const std::vector<char> & tmpSortBuffer,
- const vsm::StorageDocument::SP & document)
+ const StorageDocument::LP & document)
{
bool amongTheBest(false);
uint32_t docId = _rankProcessor->getDocId();
if (!hasSorting) {
- amongTheBest = _rankProcessor->getHitCollector().addHit(document, docId, _rankProcessor->getMatchData(), _rankProcessor->getRankScore());
+ amongTheBest = _rankProcessor->getHitCollector().addHit(document, docId, _rankProcessor->getMatchData(),
+ _rankProcessor->getRankScore());
if (amongTheBest && _dumpFeatures) {
- _dumpProcessor->getHitCollector().addHit(vsm::StorageDocument::SP(NULL), docId, _dumpProcessor->getMatchData(), _dumpProcessor->getRankScore());
+ _dumpProcessor->getHitCollector().addHit(StorageDocument::LP(NULL), docId, _dumpProcessor->getMatchData(), _dumpProcessor->getRankScore());
}
} else {
size_t pos = visitor.fillSortBuffer();
LOG(spam, "SortBlob is %ld bytes", pos);
- amongTheBest = _rankProcessor->getHitCollector().addHit(document, docId, _rankProcessor->getMatchData(), _rankProcessor->getRankScore(),
- &tmpSortBuffer[0], pos);
+ amongTheBest = _rankProcessor->getHitCollector().addHit(document, docId, _rankProcessor->getMatchData(),
+ _rankProcessor->getRankScore(), &tmpSortBuffer[0], pos);
if (amongTheBest && _dumpFeatures) {
- _dumpProcessor->getHitCollector().addHit(vsm::StorageDocument::SP(NULL), docId, _dumpProcessor->getMatchData(), _dumpProcessor->getRankScore(),
- &tmpSortBuffer[0], pos);
+ _dumpProcessor->getHitCollector().addHit(StorageDocument::LP(NULL), docId, _dumpProcessor->getMatchData(),
+ _dumpProcessor->getRankScore(), &tmpSortBuffer[0], pos);
}
}
return amongTheBest;
@@ -617,13 +581,13 @@ SearchVisitor::SyntheticFieldsController::setup(const StringFieldIdTMap & fieldR
}
void
-SearchVisitor::SyntheticFieldsController::onDocument(vsm::StorageDocument & document)
+SearchVisitor::SyntheticFieldsController::onDocument(StorageDocument & document)
{
(void) document;
}
void
-SearchVisitor::SyntheticFieldsController::onDocumentMatch(vsm::StorageDocument & document,
+SearchVisitor::SyntheticFieldsController::onDocumentMatch(StorageDocument & document,
const vespalib::string & documentId)
{
document.setField(_documentIdFId, document::FieldValue::UP(new document::StringFieldValue(documentId)));
@@ -633,9 +597,9 @@ void
SearchVisitor::registerAdditionalFields(const std::vector<vsm::DocsumTools::FieldSpec> & docsumSpec,
std::vector<vespalib::string> & fieldList)
{
- for (size_t i = 0; i < docsumSpec.size(); ++i) {
- fieldList.push_back(docsumSpec[i].getOutputName());
- const std::vector<vespalib::string> & inputNames = docsumSpec[i].getInputNames();
+ for (const vsm::DocsumTools::FieldSpec & spec : docsumSpec) {
+ fieldList.push_back(spec.getOutputName());
+ const std::vector<vespalib::string> & inputNames = spec.getInputNames();
for (size_t j = 0; j < inputNames.size(); ++j) {
fieldList.push_back(inputNames[j]);
if (document::PositionDataType::isZCurveFieldName(inputNames[j])) {
@@ -691,11 +655,10 @@ SearchVisitor::setupScratchDocument(const StringFieldIdTMap & fieldsInQuery)
_fieldSearchSpecMap.documentTypeMap().size());
}
_fieldsUnion = fieldsInQuery.map();
- for(vsm::StringFieldIdTMapT::const_iterator it(_fieldSearchSpecMap.nameIdMap().map().begin()),
- mt(_fieldSearchSpecMap.nameIdMap().map().end()); it != mt; it++) {
- if (_fieldsUnion.find(it->first) == _fieldsUnion.end()) {
- LOG(debug, "Adding field '%s' from _fieldSearchSpecMap", it->first.c_str());
- _fieldsUnion[it->first] = it->second;
+ for(const auto & entry :_fieldSearchSpecMap.nameIdMap().map()) {
+ if (_fieldsUnion.find(entry.first) == _fieldsUnion.end()) {
+ LOG(debug, "Adding field '%s' from _fieldSearchSpecMap", entry.first.c_str());
+ _fieldsUnion[entry.first] = entry.second;
}
}
// Init based on default document type and mapping from field name to field id
@@ -707,7 +670,8 @@ SearchVisitor::setupScratchDocument(const StringFieldIdTMap & fieldsInQuery)
void
SearchVisitor::setupDocsumObjects()
{
- std::unique_ptr<DocsumFilter> docsumFilter(new DocsumFilter(_vsmAdapter->getDocsumTools(), _rankController.getRankProcessor()->getHitCollector()));
+ std::unique_ptr<DocsumFilter> docsumFilter(new DocsumFilter(_vsmAdapter->getDocsumTools(),
+ _rankController.getRankProcessor()->getHitCollector()));
docsumFilter->init(_fieldSearchSpecMap.nameIdMap(), *_fieldPathMap);
docsumFilter->setSnippetModifiers(_snippetModifierManager.getModifiers());
_summaryGenerator.setFilter(std::move(docsumFilter));
@@ -747,53 +711,52 @@ SearchVisitor::setupDocsumObjects()
void
SearchVisitor::setupAttributeVectors()
{
- const FieldPathMapT & fm = *_fieldPathMap;
- for (FieldPathMapT::const_iterator it(fm.begin()), mt(fm.end()); it != mt; it++) {
- if ( ! it->empty() ) {
- vespalib::string attrName(it->front().getName());
- for (FieldPath::const_iterator ft(it->begin()+1), fmt(it->end()); ft != fmt; ft++) {
- attrName.append(".");
- attrName.append(ft->getName());
- }
+ for (const FieldPath & fieldPath : *_fieldPathMap) {
+ if ( ! fieldPath.empty() ) {
+ setupAttributeVector(fieldPath);
+ }
+ }
+}
- enum FieldDataType {
- OTHER = 0,
- ARRAY,
- WSET
- };
- FieldDataType typeSeen = OTHER;
- for (FieldPath::const_iterator ft(it->begin()), fmt(it->end()); ft != fmt; ft++) {
- int dataTypeId(ft->getDataType().getClass().id());
- if (dataTypeId == document::ArrayDataType::classId) {
- typeSeen = ARRAY;
- } else if (dataTypeId == document::MapDataType::classId) {
- typeSeen = ARRAY;
- } else if (dataTypeId == document::WeightedSetDataType::classId) {
- typeSeen = WSET;
- }
- }
- const document::FieldValue & fv = it->back().getFieldValueToSet();
- AttributeVector::SP attr;
- if (typeSeen == ARRAY) {
- attr = createMultiValueAttribute(attrName, fv, true);
- } else if (typeSeen == WSET) {
- attr = createMultiValueAttribute (attrName, fv, false);
- } else {
- attr = createAttribute(attrName, fv);
- }
+void SearchVisitor::setupAttributeVector(const FieldPath &fieldPath) {
+ vespalib::string attrName(fieldPath.front().getName());
+ for (FieldPath::const_iterator ft(fieldPath.begin() + 1), fmt(fieldPath.end()); ft != fmt; ft++) {
+ attrName.append(".");
+ attrName.append(ft->getName());
+ }
- if (attr.get()) {
- LOG(debug, "Adding attribute '%s' for field '%s' with data type '%s' (%s)",
- attr->getName().c_str(), attrName.c_str(), fv.getDataType()->getName().c_str(), fv.getClass().name());
- if ( ! _attrMan.add(attr) ) {
- LOG(warning, "Failed adding attribute '%s' for field '%s' with data type '%s' (%s)",
- attr->getName().c_str(), attrName.c_str(), fv.getDataType()->getName().c_str(), fv.getClass().name());
- }
- } else {
- LOG(debug, "Cannot setup attribute for field '%s' with data type '%s' (%s). Aggregation and sorting will not work for this field",
- attrName.c_str(), fv.getDataType()->getName().c_str(), fv.getClass().name());
- }
+ enum FieldDataType { OTHER = 0, ARRAY, WSET };
+ FieldDataType typeSeen = OTHER;
+ for (const document::FieldPathEntry & entry : fieldPath) {
+ int dataTypeId(entry.getDataType().getClass().id());
+ if (dataTypeId == document::ArrayDataType::classId) {
+ typeSeen = ARRAY;
+ } else if (dataTypeId == document::MapDataType::classId) {
+ typeSeen = ARRAY;
+ } else if (dataTypeId == document::WeightedSetDataType::classId) {
+ typeSeen = WSET;
+ }
+ }
+ const document::FieldValue & fv = fieldPath.back().getFieldValueToSet();
+ AttributeVector::SP attr;
+ if (typeSeen == ARRAY) {
+ attr = createMultiValueAttribute(attrName, fv, true);
+ } else if (typeSeen == WSET) {
+ attr = createMultiValueAttribute (attrName, fv, false);
+ } else {
+ attr = createAttribute(attrName, fv);
+ }
+
+ if (attr.get()) {
+ LOG(debug, "Adding attribute '%s' for field '%s' with data type '%s' (%s)",
+ attr->getName().c_str(), attrName.c_str(), fv.getDataType()->getName().c_str(), fv.getClass().name());
+ if ( ! _attrMan.add(attr) ) {
+ LOG(warning, "Failed adding attribute '%s' for field '%s' with data type '%s' (%s)",
+ attr->getName().c_str(), attrName.c_str(), fv.getDataType()->getName().c_str(), fv.getClass().name());
}
+ } else {
+ LOG(debug, "Cannot setup attribute for field '%s' with data type '%s' (%s). Aggregation and sorting will not work for this field",
+ attrName.c_str(), fv.getDataType()->getName().c_str(), fv.getClass().name());
}
}
@@ -801,8 +764,7 @@ void
SearchVisitor::setupAttributeVectorsForSorting(const search::common::SortSpec & sortList)
{
if ( ! sortList.empty() ) {
- for (size_t i(0), m(sortList.size()); i < m; i++) {
- const search::common::SortInfo & sInfo(sortList[i]);
+ for (const search::common::SortInfo & sInfo : sortList) {
vsm::FieldIdT fid = _fieldSearchSpecMap.nameIdMap().fieldNo(sInfo._field);
if ( fid != StringFieldIdTMap::npos ) {
AttributeGuard::UP attr(_attrMan.getAttribute(sInfo._field));
@@ -851,7 +813,7 @@ SearchVisitor::setupGrouping(const std::vector<char> & groupingBlob)
grouping.select(attr2Doc, attr2Doc);
LOG(debug, "Grouping # %ld with id(%d)", i, grouping.getId());
try {
- search::expression::ConfigureStaticParams stuff(_attrCtx.get(), &_docTypeMapping.getCurrentDocumentType());
+ ConfigureStaticParams stuff(_attrCtx.get(), &_docTypeMapping.getCurrentDocumentType());
grouping.configureStaticStuff(stuff);
HitsResultPreparator preparator(_summaryGenerator);
grouping.select(preparator, preparator);
@@ -870,13 +832,13 @@ SearchVisitor::setupGrouping(const std::vector<char> & groupingBlob)
class SingleDocumentStore : public vsm::IDocSumCache
{
public:
- SingleDocumentStore(const vsm::StorageDocument & doc) : _doc(doc) { }
+ SingleDocumentStore(const StorageDocument & doc) : _doc(doc) { }
virtual const vsm::Document & getDocSum(const search::DocumentIdT & docId) const {
(void) docId;
return _doc;
}
private:
- const vsm::StorageDocument & _doc;
+ const StorageDocument & _doc;
};
bool
@@ -904,30 +866,20 @@ SearchVisitor::handleDocuments(const document::BucketId&,
return;
}
document::DocumentId emptyId;
- LOG(debug, "SearchVisitor '%s' handling block of %zu documents",
- _id.c_str(), entries.size());
+ LOG(debug, "SearchVisitor '%s' handling block of %zu documents", _id.c_str(), entries.size());
size_t highestFieldNo(_fieldSearchSpecMap.nameIdMap().highestFieldNo());
- const document::DocumentType* defaultDocType =
- _docTypeMapping.getDefaultDocumentType();
+ const document::DocumentType* defaultDocType = _docTypeMapping.getDefaultDocumentType();
assert(defaultDocType);
- for (size_t i = 0; i< entries.size(); ++i) {
- spi::DocEntry& entry(*entries[i]);
- vsm::StorageDocument::SP document(
- new StorageDocument(entry.releaseDocument()));
- document->fieldPathMap(_fieldPathMap);
- document->setFieldCount(highestFieldNo);
+ for (const auto & entry : entries) {
+ StorageDocument::LP document(new StorageDocument(entry->releaseDocument(), _fieldPathMap, highestFieldNo));
try {
- document->init();
if (defaultDocType != NULL
- && !compatibleDocumentTypes(*defaultDocType,
- document->docDoc().getType()))
+ && !compatibleDocumentTypes(*defaultDocType, document->docDoc().getType()))
{
- LOG(debug, "Skipping document of type '%s' when "
- "handling only documents of type '%s'",
- document->docDoc().getType().getName().c_str(),
- defaultDocType->getName().c_str());
+ LOG(debug, "Skipping document of type '%s' when handling only documents of type '%s'",
+ document->docDoc().getType().getName().c_str(), defaultDocType->getName().c_str());
} else {
if (handleDocument(document)) {
_backingDocuments.push_back(document);
@@ -935,14 +887,13 @@ SearchVisitor::handleDocuments(const document::BucketId&,
}
} catch (const std::exception & e) {
LOG(warning, "Caught exception handling document '%s'. Exception='%s'",
- document->docDoc().getId().getScheme().toString().c_str(),
- e.what());
+ document->docDoc().getId().getScheme().toString().c_str(), e.what());
}
}
}
bool
-SearchVisitor::handleDocument(const vsm::StorageDocument::SP & document)
+SearchVisitor::handleDocument(const StorageDocument::LP & document)
{
bool needToKeepDocument(false);
_syntheticFieldsController.onDocument(*document);
@@ -994,8 +945,7 @@ void
SearchVisitor::group(const document::Document & doc, search::HitRank rank, bool all)
{
LOG(spam, "Group all: %s", all ? "true" : "false");
- for(GroupingList::iterator it(_groupingList.begin()), mt(_groupingList.end()); it != mt; it++) {
- GroupingEntry & grouping(*it);
+ for(GroupingEntry & grouping : _groupingList) {
if (all == grouping->getAll()) {
grouping.aggregate(doc, rank);
LOG(spam, "Actually group document with id '%s'", doc.getId().getScheme().toString().c_str());
@@ -1004,11 +954,10 @@ SearchVisitor::group(const document::Document & doc, search::HitRank rank, bool
}
bool
-SearchVisitor::match(const vsm::StorageDocument & doc)
+SearchVisitor::match(const StorageDocument & doc)
{
- for (FieldIdTSearcherMap::iterator it = _fieldSearcherMap.begin(), mt = _fieldSearcherMap.end(); it != mt; it++) {
- FieldSearcher & fSearch = *(*it);
- fSearch.search(doc);
+ for (vsm::FieldSearcherContainer & fSearch : _fieldSearcherMap) {
+ fSearch->search(doc);
}
bool hit(_query.evaluate());
if (hit) {
@@ -1025,8 +974,7 @@ SearchVisitor::match(const vsm::StorageDocument & doc)
void
SearchVisitor::fillAttributeVectors(const vespalib::string & documentId, const StorageDocument & document)
{
- for (size_t i(0), im(_attributeFields.size()); i < im; i++) {
- const AttrInfo & finfo = _attributeFields[i];
+ for (const AttrInfo & finfo : _attributeFields) {
const AttributeGuard &finfoGuard(*finfo._attr);
bool isPosition = finfoGuard->getClass().inherits(search::IntegerAttribute::classId) && document::PositionDataType::isZCurveFieldName(finfoGuard->getName());
LOG(debug, "Filling attribute '%s', isPosition='%s'", finfoGuard->getName().c_str(), isPosition ? "true" : "false");
@@ -1062,9 +1010,9 @@ size_t
SearchVisitor::fillSortBuffer()
{
size_t pos(0);
- for(size_t i(0), m(_sortList.size()); i != m; i++) {
+ for (size_t index : _sortList) {
+ const AttrInfo & finfo = _attributeFields[index];
int written(0);
- const AttrInfo & finfo = _attributeFields[_sortList[i]];
const AttributeGuard &finfoGuard(*finfo._attr);
LOG(debug, "Adding sortdata for document %d for attribute '%s'",
finfoGuard->getNumDocs() - 1, finfoGuard->getName().c_str());
@@ -1132,8 +1080,8 @@ void
SearchVisitor::generateGroupingResults()
{
vdslib::SearchResult & searchResult(_queryResult->getSearchResult());
- for (GroupingList::iterator it(_groupingList.begin()), mt(_groupingList.end()); it != mt; it++) {
- Grouping & grouping(**it);
+ for (auto & groupingPtr : _groupingList) {
+ Grouping & grouping(*groupingPtr);
LOG(debug, "grouping before postAggregate: %s", grouping.asString().c_str());
grouping.postAggregate();
grouping.postMerge();
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
index bc8d72c4177..f2025e8c161 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
@@ -2,6 +2,12 @@
#pragma once
+#include "hitcollector.h"
+#include "indexenvironment.h"
+#include "queryenvironment.h"
+#include "rankmanager.h"
+#include "rankprocessor.h"
+#include "searchenvironment.h"
#include <vespa/vsm/common/docsum.h>
#include <vespa/vsm/common/documenttypemapping.h>
#include <vespa/vsm/common/storagedocument.h>
@@ -20,12 +26,6 @@
#include <vespa/searchlib/common/sortspec.h>
#include <vespa/storage/visiting/visitor.h>
#include <vespa/documentapi/messagebus/messages/queryresultmessage.h>
-#include "hitcollector.h"
-#include "indexenvironment.h"
-#include "queryenvironment.h"
-#include "rankmanager.h"
-#include "rankprocessor.h"
-#include "searchenvironment.h"
using namespace search::aggregation;
@@ -60,8 +60,7 @@ private:
_ascending(true),
_converter(NULL),
_attr(std::move(attr))
- {
- }
+ { }
/**
* Construct a new object.
*
@@ -75,8 +74,7 @@ private:
_ascending(ascending),
_converter(converter),
_attr(std::move(attr))
- {
- }
+ { }
vsm::FieldIdT _field;
bool _ascending;
const search::common::BlobConverter * _converter;
@@ -189,7 +187,7 @@ private:
bool collectMatchedDocument(bool hasSorting,
SearchVisitor & visitor,
const std::vector<char> & tmpSortBuffer,
- const vsm::StorageDocument::SP & documentId);
+ const vsm::StorageDocument::LP & documentId);
/**
* Callback function that is called when visiting is completed.
* Perform second phase ranking and calculate summary features / rank features if asked for.
@@ -308,7 +306,7 @@ private:
* @param document Document to process.
* @return true if the underlying buffer is needed later on, then it must be kept.
*/
- bool handleDocument(const vsm::StorageDocument::SP & document);
+ bool handleDocument(const vsm::StorageDocument::LP & document);
/**
* Collect the given document for grouping.
@@ -379,7 +377,7 @@ private:
size_t _limit;
};
typedef std::vector< GroupingEntry > GroupingList;
- typedef std::vector<vsm::StorageDocument::SP> DocumentVector;
+ typedef std::vector<vsm::StorageDocument::LP> DocumentVector;
class SummaryGenerator : public HitsAggregationResult::SummaryGenerator
{
@@ -394,7 +392,7 @@ private:
private:
vsm::GetDocsumsStateCallback _callback;
GetDocsumsState _docsumState;
- std::unique_ptr<vsm::DocsumFilter> _docsumFilter;
+ std::unique_ptr<vsm::DocsumFilter> _docsumFilter;
search::docsummary::IDocsumWriter * _docsumWriter;
search::RawBuf _rawBuf;
};
@@ -448,6 +446,8 @@ private:
RankController _rankController;
DocumentVector _backingDocuments;
vsm::StringFieldIdTMapT _fieldsUnion;
+
+ void setupAttributeVector(const vsm::FieldPath &fieldPath);
};
class SearchVisitorFactory : public VisitorFactory {
diff --git a/vsm/src/tests/docsum/docsum.cpp b/vsm/src/tests/docsum/docsum.cpp
index c084bd5593f..4ebd7061b69 100644
--- a/vsm/src/tests/docsum/docsum.cpp
+++ b/vsm/src/tests/docsum/docsum.cpp
@@ -245,35 +245,6 @@ DocsumTest::requireThatJSONDocsumWriterHandlesMap()
}
}
-void
-DocsumTest::testDocSumCache()
-{
- Document::SP d1(new TestDocument(0, 1));
- d1->setField(0, FieldValue::UP(new StringFieldValue("aa")));
- Document::SP d2(new TestDocument(1, 2));
- d2->setField(0, FieldValue::UP(new StringFieldValue("bbb")));
- d2->setField(1, FieldValue::UP(new StringFieldValue("cccc")));
- DocSumCache cac1;
- cac1.push_back(d1);
- cac1.push_back(d2);
- EXPECT_EQUAL(cac1.cache().size(), 2u);
-
- Document::SP d3(new TestDocument(2, 1));
- d3->setField(0, FieldValue::UP(new StringFieldValue("ddddd")));
- DocSumCache cac2;
- cac2.push_back(d3);
- cac1.insert(cac2);
- EXPECT_EQUAL(cac1.cache().size(), 3u);
-
- Document::SP d4(new TestDocument(2, 1));
- d4->setField(0, FieldValue::UP(new StringFieldValue("eeeeee")));
- DocSumCache cac3;
- cac3.push_back(d4);
- cac1.insert(cac3);
- EXPECT_EQUAL(cac1.cache().size(), 3u);
- EXPECT_EQUAL(2u, cac1.getDocSum(2).getDocId());
-}
-
int
DocsumTest::Main()
{
@@ -282,7 +253,6 @@ DocsumTest::Main()
testFlattenDocsumWriter();
testJSONDocsumWriter();
requireThatJSONDocsumWriterHandlesMap();
- testDocSumCache();
TEST_DONE();
}
diff --git a/vsm/src/tests/document/document.cpp b/vsm/src/tests/document/document.cpp
index a824d59a788..f13d4020054 100644
--- a/vsm/src/tests/document/document.cpp
+++ b/vsm/src/tests/document/document.cpp
@@ -41,11 +41,8 @@ DocumentTest::testStorageDocument()
ASSERT_TRUE((*fpmap)[1].size() == 1);
ASSERT_TRUE((*fpmap)[2].size() == 0);
- StorageDocument sdoc(std::move(doc));
+ StorageDocument sdoc(std::move(doc), fpmap, 3);
ASSERT_TRUE(sdoc.valid());
- sdoc.setFieldCount(3);
- sdoc.fieldPathMap(fpmap);
- sdoc.init();
EXPECT_EQUAL(std::string("foo"), sdoc.getField(0)->getAsString());
EXPECT_EQUAL(std::string("bar"), sdoc.getField(1)->getAsString());
@@ -69,8 +66,6 @@ DocumentTest::testStorageDocument()
EXPECT_EQUAL(std::string("qux"), sdoc.getField(1)->getAsString());
EXPECT_EQUAL(std::string("quux"), sdoc.getField(2)->getAsString());
- // reset cached field values
- sdoc.init();
EXPECT_EQUAL(std::string("foo"), sdoc.getField(0)->getAsString());
EXPECT_EQUAL(std::string("bar"), sdoc.getField(1)->getAsString());
EXPECT_TRUE(sdoc.getField(2) == NULL);
@@ -78,7 +73,7 @@ DocumentTest::testStorageDocument()
EXPECT_TRUE(!sdoc.setField(3, FieldValue::UP(new StringFieldValue("thud"))));
SharedFieldPathMap fim;
- StorageDocument s2(fim);
+ StorageDocument s2(std::make_unique<document::Document>(), fim, 0);
EXPECT_EQUAL(vespalib::string("null::"), s2.docDoc().getId().toString());
}
diff --git a/vsm/src/tests/searcher/searcher.cpp b/vsm/src/tests/searcher/searcher.cpp
index 28e97f5e726..5bb47b7d2ae 100644
--- a/vsm/src/tests/searcher/searcher.cpp
+++ b/vsm/src/tests/searcher/searcher.cpp
@@ -300,9 +300,7 @@ performSearch(FieldSearcher & fs, const StringList & query, const FieldValue & f
// setup document
SharedFieldPathMap sfim(new FieldPathMapT());
sfim->push_back(FieldPath());
- StorageDocument doc(sfim);
- doc.setFieldCount(1);
- doc.init();
+ StorageDocument doc(std::make_unique<document::Document>(), sfim, 1);
doc.setField(0, document::FieldValue::UP(fv.clone()));
fs.search(doc);
diff --git a/vsm/src/vespa/vsm/common/CMakeLists.txt b/vsm/src/vespa/vsm/common/CMakeLists.txt
index 7f3618ac12c..9be6703eba9 100644
--- a/vsm/src/vespa/vsm/common/CMakeLists.txt
+++ b/vsm/src/vespa/vsm/common/CMakeLists.txt
@@ -2,7 +2,6 @@
vespa_add_library(vsm_vsmcommon OBJECT
SOURCES
charbuffer.cpp
- docsum.cpp
document.cpp
documenttypemapping.cpp
fieldmodifier.cpp
diff --git a/vsm/src/vespa/vsm/common/docsum.cpp b/vsm/src/vespa/vsm/common/docsum.cpp
deleted file mode 100644
index 3d32f30aa87..00000000000
--- a/vsm/src/vespa/vsm/common/docsum.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#include "docsum.h"
-#include <vespa/document/fieldvalue/fieldvalue.h>
-#include <vespa/document/fieldvalue/intfieldvalue.h>
-#include <vespa/document/fieldvalue/longfieldvalue.h>
-#include <vespa/document/fieldvalue/bytefieldvalue.h>
-#include <vespa/vespalib/stllike/hash_map.hpp>
-
-#define DEBUGMASK 0x00
-
-using search::DocumentIdT;
-
-namespace vsm {
-
-using document::FieldValue;
-using document::StringFieldValue;
-
-IMPLEMENT_DUPLICATE(DocSumCache);
-
-DocSumCache::DocSumCache() :
- _list()
-{ }
-
-DocSumCache::~DocSumCache() { }
-
-const Document & DocSumCache::getDocSum(const DocumentIdT & docId) const
-{
- DocSumCacheT::const_iterator found = _list.find(docId);
- return *found->second;
-}
-
-void DocSumCache::push_back(const Document::SP & docSum)
-{
- _list[docSum->getDocId()] = docSum;
-}
-
-void DocSumCache::insert(const DocSumCache & dc)
-{
- for (DocSumCacheT::const_iterator itr = dc._list.begin(); itr != dc._list.end(); ++itr) {
- if (_list.find(itr->first) == _list.end()) {
- _list[itr->first] = itr->second;
- }
- }
-}
-
-}
diff --git a/vsm/src/vespa/vsm/common/docsum.h b/vsm/src/vespa/vsm/common/docsum.h
index bde2625f7a8..9bfaf7eac05 100644
--- a/vsm/src/vespa/vsm/common/docsum.h
+++ b/vsm/src/vespa/vsm/common/docsum.h
@@ -1,11 +1,9 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
-#include <vespa/vsm/common/document.h>
-#include <vespa/document/fieldvalue/stringfieldvalue.h>
+#include "document.h"
-namespace vsm
-{
+namespace vsm {
/**
Will represent a cache of the document summaries. -> Actual docsums will be
@@ -20,20 +18,5 @@ public:
virtual ~IDocSumCache() { }
};
-class DocSumCache : public search::Object, public IDocSumCache
-{
- public:
- typedef vespalib::hash_map<search::DocumentIdT, Document::SP> DocSumCacheT;
- DUPLICATE(DocSumCache);
- DocSumCache();
- virtual ~DocSumCache();
- virtual const Document & getDocSum(const search::DocumentIdT & docId) const;
- void push_back(const Document::SP & doc);
- void insert(const DocSumCache & dc);
- const DocSumCacheT & cache() const { return _list; }
- private:
- DocSumCacheT _list;
-};
-
}
diff --git a/vsm/src/vespa/vsm/common/document.cpp b/vsm/src/vespa/vsm/common/document.cpp
index cc7414b8107..7939391a503 100644
--- a/vsm/src/vespa/vsm/common/document.cpp
+++ b/vsm/src/vespa/vsm/common/document.cpp
@@ -57,24 +57,14 @@ FieldIdT StringFieldIdTMap::fieldNo(const vespalib::string & fName) const
size_t StringFieldIdTMap::highestFieldNo() const
{
size_t maxFNo(0);
- for (StringFieldIdTMapT::const_iterator it = _map.begin(), mt = _map.end(); it != mt; it++) {
- if (it->second >= maxFNo) {
- maxFNo = it->second + 1;
+ for (const auto & field : _map) {
+ if (field.second > maxFNo) {
+ maxFNo = field.second;
}
}
- return maxFNo;
+ return maxFNo+1;
}
-Document::Document(const DocumentIdT & doc, size_t maxField) :
- _docId(doc),
- _fieldCount(maxField)
-{ }
-
-Document::Document() :
- _docId(0),
- _fieldCount(0)
-{ }
-
Document::~Document() { }
}
diff --git a/vsm/src/vespa/vsm/common/document.h b/vsm/src/vespa/vsm/common/document.h
index b4fc7c86d8e..a0341aaf7c0 100644
--- a/vsm/src/vespa/vsm/common/document.h
+++ b/vsm/src/vespa/vsm/common/document.h
@@ -47,14 +47,12 @@ typedef vespalib::stringref FieldRef;
class Document
{
public:
- typedef std::shared_ptr<Document> SP;
- Document();
- Document(const search::DocumentIdT & doc, size_t maxFieldCount);
+ Document(size_t maxFieldCount) : _docId(0), _fieldCount(maxFieldCount) { }
+ Document(search::DocumentIdT doc, size_t maxFieldCount) : _docId(doc), _fieldCount(maxFieldCount) { }
virtual ~Document();
const search::DocumentIdT & getDocId() const { return _docId; }
size_t getFieldCount() const { return _fieldCount; }
void setDocId(const search::DocumentIdT & v) { _docId = v; }
- void setFieldCount(size_t v) { _fieldCount = v; }
virtual const document::FieldValue * getField(FieldIdT fId) const = 0;
/**
Returns true, if not possible to set.
@@ -62,7 +60,7 @@ class Document
virtual bool setField(FieldIdT fId, document::FieldValue::UP fv) = 0;
private:
search::DocumentIdT _docId;
- size_t _fieldCount;
+ const size_t _fieldCount;
};
}
diff --git a/vsm/src/vespa/vsm/common/storagedocument.cpp b/vsm/src/vespa/vsm/common/storagedocument.cpp
index 4963e1661f0..1cb636a80c7 100644
--- a/vsm/src/vespa/vsm/common/storagedocument.cpp
+++ b/vsm/src/vespa/vsm/common/storagedocument.cpp
@@ -2,51 +2,29 @@
#include "storagedocument.h"
#include <vespa/document/fieldvalue/arrayfieldvalue.h>
#include <vespa/document/fieldvalue/weightedsetfieldvalue.h>
-#include <vespa/document/datatype/datatype.h>
#include <vespa/log/log.h>
LOG_SETUP(".vsm.storagedocument");
namespace vsm {
-StorageDocument::StorageDocument(const SharedFieldPathMap & fim) :
- Document(),
- _doc(new document::Document()),
+StorageDocument::StorageDocument(document::Document::UP doc, const SharedFieldPathMap & fim, size_t fieldNoLimit) :
+ Document(fieldNoLimit),
+ _doc(std::move(doc)),
_fieldMap(fim),
- _cachedFields(),
- _backedFields()
-{ }
-
-StorageDocument::StorageDocument(document::Document::UP doc) :
- Document(),
- _doc(doc.release()),
- _fieldMap(),
- _cachedFields(),
+ _cachedFields(getFieldCount()),
_backedFields()
{ }
StorageDocument::~StorageDocument() { }
-void StorageDocument::init()
-{
- _cachedFields.clear();
- _cachedFields.resize(getFieldCount());
-}
-
namespace {
FieldPath _emptyFieldPath;
StorageDocument::SubDocument _empySubDocument(NULL, _emptyFieldPath.begin(), _emptyFieldPath.end());
}
-void StorageDocument::SubDocument::swap(SubDocument & rhs)
-{
- std::swap(_fieldValue, rhs._fieldValue);
- std::swap(_it, rhs._it);
- std::swap(_mt, rhs._mt);
-}
-
-
-const StorageDocument::SubDocument & StorageDocument::getComplexField(FieldIdT fId) const
+const StorageDocument::SubDocument &
+StorageDocument::getComplexField(FieldIdT fId) const
{
if (_cachedFields[fId].getFieldValue() == NULL) {
const FieldPath & fp = (*_fieldMap)[fId];
@@ -68,7 +46,7 @@ const StorageDocument::SubDocument & StorageDocument::getComplexField(FieldIdT f
return _cachedFields[fId];
}
-void StorageDocument::saveCachedFields()
+void StorageDocument::saveCachedFields() const
{
size_t m(_cachedFields.size());
_backedFields.reserve(m);
@@ -80,7 +58,8 @@ void StorageDocument::saveCachedFields()
}
}
-const document::FieldValue * StorageDocument::getField(FieldIdT fId) const
+const document::FieldValue *
+StorageDocument::getField(FieldIdT fId) const
{
return getComplexField(fId).getFieldValue();
}
diff --git a/vsm/src/vespa/vsm/common/storagedocument.h b/vsm/src/vespa/vsm/common/storagedocument.h
index cf0638cb3c3..3c1f2ddc375 100644
--- a/vsm/src/vespa/vsm/common/storagedocument.h
+++ b/vsm/src/vespa/vsm/common/storagedocument.h
@@ -11,49 +11,50 @@ typedef document::FieldPath FieldPath; // field path to navigate a field value
typedef std::vector<FieldPath> FieldPathMapT; // map from field id to field path
typedef std::shared_ptr<FieldPathMapT> SharedFieldPathMap;
-class StorageDocument : public Document
-{
- public:
- typedef vespalib::LinkedPtr<StorageDocument> SP;
- class SubDocument {
- public:
- SubDocument() :
- _fieldValue(NULL)
- { }
- SubDocument(document::FieldValue * fv, FieldPath::const_iterator it, FieldPath::const_iterator mt) :
- _fieldValue(fv),
- _it(it),
- _mt(mt)
- { }
- const document::FieldValue * getFieldValue() const { return _fieldValue; }
- void setFieldValue(document::FieldValue * fv) { _fieldValue = fv; }
- FieldPath::const_iterator begin() const { return _it; }
- FieldPath::const_iterator end() const { return _mt; }
- void swap(SubDocument & rhs);
- private:
- document::FieldValue * _fieldValue;
- FieldPath::const_iterator _it;
- FieldPath::const_iterator _mt;
- };
- StorageDocument(const SharedFieldPathMap & fim);
- StorageDocument(const document::Document & doc);
- StorageDocument(document::Document::UP doc);
- virtual ~StorageDocument();
- void init();
- const document::Document & docDoc() const { return *_doc; }
- void fieldPathMap(const SharedFieldPathMap & fim) { _fieldMap = fim; }
- const SharedFieldPathMap & fieldPathMap() const { return _fieldMap; }
- bool valid() const { return _doc.get() != NULL; }
- const SubDocument & getComplexField(FieldIdT fId) const;
- virtual const document::FieldValue * getField(FieldIdT fId) const;
- virtual bool setField(FieldIdT fId, document::FieldValue::UP fv);
- void saveCachedFields();
- private:
- typedef vespalib::CloneablePtr<document::Document> DocumentContainer;
- DocumentContainer _doc;
- SharedFieldPathMap _fieldMap;
- mutable std::vector<SubDocument> _cachedFields;
- mutable std::vector<document::FieldValue::UP> _backedFields;
+class StorageDocument : public Document {
+public:
+ typedef vespalib::LinkedPtr<StorageDocument> LP;
+
+ class SubDocument {
+ public:
+ SubDocument() : _fieldValue(NULL) {}
+ SubDocument(document::FieldValue *fv, FieldPath::const_iterator it, FieldPath::const_iterator mt) :
+ _fieldValue(fv),
+ _it(it),
+ _mt(mt)
+ { }
+
+ const document::FieldValue *getFieldValue() const { return _fieldValue; }
+ void setFieldValue(document::FieldValue *fv) { _fieldValue = fv; }
+ FieldPath::const_iterator begin() const { return _it; }
+ FieldPath::const_iterator end() const { return _mt; }
+ void swap(SubDocument &rhs) {
+ std::swap(_fieldValue, rhs._fieldValue);
+ std::swap(_it, rhs._it);
+ std::swap(_mt, rhs._mt);
+ }
+ private:
+ document::FieldValue *_fieldValue;
+ FieldPath::const_iterator _it;
+ FieldPath::const_iterator _mt;
+ };
+public:
+ StorageDocument(document::Document::UP doc, const SharedFieldPathMap &fim, size_t fieldNoLimit);
+ StorageDocument(const StorageDocument &) = delete;
+ StorageDocument & operator = (const StorageDocument &) = delete;
+ ~StorageDocument();
+
+ const document::Document &docDoc() const { return *_doc; }
+ bool valid() const { return _doc.get() != NULL; }
+ const SubDocument &getComplexField(FieldIdT fId) const;
+ const document::FieldValue *getField(FieldIdT fId) const override;
+ bool setField(FieldIdT fId, document::FieldValue::UP fv) override ;
+ void saveCachedFields() const;
+private:
+ document::Document::UP _doc;
+ SharedFieldPathMap _fieldMap;
+ mutable std::vector<SubDocument> _cachedFields;
+ mutable std::vector<document::FieldValue::UP> _backedFields;
};
}