summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-07-26 11:26:35 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-07-31 17:04:18 +0200
commit50a275ebd8774a958418bbda4d127df1f420f1ad (patch)
tree65b36bac662cd02d4b4422fb913f8d8072935ddd /document
parentc4f93e038fcebf234b9a77e39cf929fe5e1887c2 (diff)
Carry the Field directly instead of in a shared_ptr.
Diffstat (limited to 'document')
-rw-r--r--document/src/vespa/document/base/field.cpp4
-rw-r--r--document/src/vespa/document/base/field.h14
-rw-r--r--document/src/vespa/document/base/fieldpath.cpp18
-rw-r--r--document/src/vespa/document/base/fieldpath.h21
-rw-r--r--document/src/vespa/document/fieldset/fieldsets.h2
-rw-r--r--document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp5
-rw-r--r--document/src/vespa/document/update/fieldpathupdate.cpp1
7 files changed, 34 insertions, 31 deletions
diff --git a/document/src/vespa/document/base/field.cpp b/document/src/vespa/document/base/field.cpp
index 99d7b5782ae..5a3fe6c1935 100644
--- a/document/src/vespa/document/base/field.cpp
+++ b/document/src/vespa/document/base/field.cpp
@@ -2,13 +2,15 @@
#include "field.h"
#include <vespa/document/fieldvalue/fieldvalue.h>
+#include <vespa/document/datatype/datatype.h>
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/vespalib/stllike/asciistream.h>
-#include <vespa/vespalib/util/stringfmt.h>
#include <vespa/vespalib/util/bobhash.h>
namespace document {
+Field::Field() : Field("", 0, *DataType::INT, false) { }
+
Field::Field(const vespalib::stringref & name, int fieldId,
const DataType& dataType, bool headerField)
: FieldBase(name),
diff --git a/document/src/vespa/document/base/field.h b/document/src/vespa/document/base/field.h
index ed4cf9ed677..47ee61c9fc0 100644
--- a/document/src/vespa/document/base/field.h
+++ b/document/src/vespa/document/base/field.h
@@ -11,21 +11,22 @@
*/
#pragma once
-#include <memory>
-#include <vespa/document/datatype/datatype.h>
#include <vespa/document/fieldset/fieldset.h>
+#include <vespa/vespalib/objects/identifiable.h>
+#include <vespa/vespalib/objects/fieldbase.h>
#include <set>
namespace document {
class FieldValue;
+class DataType;
class Field final : public vespalib::FieldBase,
public vespalib::Identifiable,
public FieldSet
{
const DataType *_dataType;
- int _fieldId;
+ int _fieldId;
bool _isHeaderField;
public:
typedef std::shared_ptr<const Field> CSP;
@@ -37,7 +38,7 @@ public:
}
};
- typedef std::set<const Field*, FieldPtrComparator> Set;
+ using Set = std::set<const Field*, FieldPtrComparator>;
/**
* Creates a completely specified field instance.
@@ -50,7 +51,7 @@ public:
Field(const vespalib::stringref & name, int fieldId,
const DataType &type, bool headerField);
- Field() : Field("", 0, *DataType::INT, false) { }
+ Field();
/**
* Creates a completely specified field instance. Field ids are generated
@@ -62,7 +63,7 @@ public:
*/
Field(const vespalib::stringref & name, const DataType &dataType, bool headerField);
- FieldSet* clone() const override { return new Field(*this); }
+ Field* clone() const override { return new Field(*this); }
std::unique_ptr<FieldValue> createValue() const;
// Note that only id is checked for equality.
@@ -78,6 +79,7 @@ public:
vespalib::string toString(bool verbose=false) const;
bool contains(const FieldSet& fields) const override;
Type getType() const override { return FIELD; }
+ bool valid() const { return _fieldId != 0; }
private:
int calculateIdV7();
diff --git a/document/src/vespa/document/base/fieldpath.cpp b/document/src/vespa/document/base/fieldpath.cpp
index 4911f910f1e..c7aa55caab4 100644
--- a/document/src/vespa/document/base/fieldpath.cpp
+++ b/document/src/vespa/document/base/fieldpath.cpp
@@ -1,7 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "fieldpath.h"
-#include "field.h"
#include <vespa/document/datatype/arraydatatype.h>
#include <vespa/document/datatype/mapdatatype.h>
#include <vespa/document/datatype/weightedsetdatatype.h>
@@ -22,7 +21,7 @@ FieldPathEntry::~FieldPathEntry() { }
FieldPathEntry::FieldPathEntry() :
_type(NONE),
_name(""),
- _fieldRef(),
+ _field(),
_dataType(0),
_lookupIndex(0),
_lookupKey(),
@@ -33,7 +32,7 @@ FieldPathEntry::FieldPathEntry() :
FieldPathEntry::FieldPathEntry(const DataType & dataType, uint32_t arrayIndex) :
_type(ARRAY_INDEX),
_name(""),
- _fieldRef(),
+ _field(),
_dataType(&dataType),
_lookupIndex(arrayIndex),
_lookupKey(),
@@ -46,7 +45,7 @@ FieldPathEntry::FieldPathEntry(const DataType & dataType, uint32_t arrayIndex) :
FieldPathEntry::FieldPathEntry(const Field &fieldRef) :
_type(STRUCT_FIELD),
_name(fieldRef.getName()),
- _fieldRef(new Field(fieldRef)),
+ _field(fieldRef),
_dataType(&fieldRef.getDataType()),
_lookupIndex(0),
_lookupKey(),
@@ -58,7 +57,7 @@ FieldPathEntry::FieldPathEntry(const DataType & dataType, const DataType& fillTy
const FieldValueCP & lookupKey) :
_type(MAP_KEY),
_name("value"),
- _fieldRef(),
+ _field(),
_dataType(&dataType),
_lookupIndex(0),
_lookupKey(lookupKey),
@@ -85,7 +84,7 @@ FieldPathEntry::FieldPathEntry(const DataType&, const DataType& keyType,
const DataType& valueType, bool keysOnly, bool valuesOnly) :
_type(keysOnly ? MAP_ALL_KEYS : MAP_ALL_VALUES),
_name(keysOnly ? "key" : "value"),
- _fieldRef(),
+ _field(),
_dataType(keysOnly ? &keyType : &valueType),
_lookupIndex(0),
_lookupKey(),
@@ -99,7 +98,7 @@ FieldPathEntry::FieldPathEntry(const DataType&, const DataType& keyType,
FieldPathEntry::FieldPathEntry(const DataType & dataType, const vespalib::stringref & variableName) :
_type(VARIABLE),
_name(""),
- _fieldRef(),
+ _field(),
_dataType(&dataType),
_lookupIndex(0),
_lookupKey(),
@@ -111,8 +110,7 @@ FieldPathEntry::FieldPathEntry(const DataType & dataType, const vespalib::string
const DataType &FieldPathEntry::getDataType() const
{
- return _fieldRef ? _fieldRef->getDataType()
- : *_dataType;
+ return _field.valid() ? _field.getDataType() : *_dataType;
}
FieldValue::UP FieldPathEntry::stealFieldValueToSet() const
@@ -125,7 +123,7 @@ FieldPathEntry::visitMembers(vespalib::ObjectVisitor &visitor) const
{
visit(visitor, "type", _type);
visit(visitor, "name", _name);
- visit(visitor, "fieldRef", _fieldRef);
+ visit(visitor, "fieldRef", _field);
visit(visitor, "dataType", _dataType);
visit(visitor, "lookupIndex", _lookupIndex);
visit(visitor, "lookupKey", _lookupKey);
diff --git a/document/src/vespa/document/base/fieldpath.h b/document/src/vespa/document/base/fieldpath.h
index a1681177780..822c6971435 100644
--- a/document/src/vespa/document/base/fieldpath.h
+++ b/document/src/vespa/document/base/fieldpath.h
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
+#include "field.h"
#include <vespa/vespalib/objects/cloneable.h>
#include <vespa/document/util/identifiableid.h>
#include <memory>
@@ -15,7 +16,6 @@ class DataType;
class MapDataType;
class WeightedSetDataType;
class ArrayDataType;
-class Field;
class FieldPathEntry : public vespalib::Identifiable {
public:
@@ -29,7 +29,6 @@ public:
VARIABLE,
NONE
};
- using FieldSP = std::shared_ptr<const Field>;
using FieldValueCP = vespalib::CloneablePtr<FieldValue>;
/**
@@ -69,8 +68,8 @@ public:
const DataType& getDataType() const;
- bool hasField() const { return _fieldRef.get(); }
- const Field & getFieldRef() const { return *_fieldRef; }
+ bool hasField() const { return _field.valid(); }
+ const Field & getFieldRef() const { return _field; }
uint32_t getIndex() const { return _lookupIndex; }
@@ -90,13 +89,13 @@ public:
static vespalib::string parseKey(vespalib::string & key);
private:
void setFillValue(const DataType & dataType);
- Type _type;
- vespalib::string _name;
- FieldSP _fieldRef;
- const DataType * _dataType;
- uint32_t _lookupIndex;
- FieldValueCP _lookupKey;
- vespalib::string _variableName;
+ Type _type;
+ vespalib::string _name;
+ Field _field;
+ const DataType * _dataType;
+ uint32_t _lookupIndex;
+ FieldValueCP _lookupKey;
+ vespalib::string _variableName;
mutable FieldValueCP _fillInVal;
};
diff --git a/document/src/vespa/document/fieldset/fieldsets.h b/document/src/vespa/document/fieldset/fieldsets.h
index fa0c7b7721f..1ff34e2d882 100644
--- a/document/src/vespa/document/fieldset/fieldsets.h
+++ b/document/src/vespa/document/fieldset/fieldsets.h
@@ -5,6 +5,8 @@
namespace document {
+class DocumentType;
+
class AllFields final : public FieldSet
{
public:
diff --git a/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp b/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp
index d2204a9ebbe..3e23619be60 100644
--- a/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp
+++ b/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp
@@ -3,6 +3,7 @@
#pragma once
#include "structuredfieldvalue.h"
+#include <vespa/document/datatype/datatype.h>
#include <vespa/vespalib/util/exceptions.h>
namespace document {
@@ -13,8 +14,7 @@ StructuredFieldValue::getAs(const Field &field) const {
FieldValue::UP val = getValue(field);
T *t = Identifiable::cast<T *>(val.get());
if (val.get() && !t) {
- throw vespalib::IllegalStateException("Field " + field.toString()
- + " has unexpected type.", VESPA_STRLOC);
+ throw vespalib::IllegalStateException("Field " + field.toString() + " has unexpected type.", VESPA_STRLOC);
}
val.release();
return std::unique_ptr<T>(t);
@@ -37,4 +37,3 @@ StructuredFieldValue::set(const vespalib::stringref & fieldName, PrimitiveType v
}
} // document
-
diff --git a/document/src/vespa/document/update/fieldpathupdate.cpp b/document/src/vespa/document/update/fieldpathupdate.cpp
index c6f597f74e3..bbe38aaeac0 100644
--- a/document/src/vespa/document/update/fieldpathupdate.cpp
+++ b/document/src/vespa/document/update/fieldpathupdate.cpp
@@ -1,5 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "fieldpathupdates.h"
+#include <vespa/document/datatype/datatype.h>
#include <vespa/document/fieldvalue/document.h>
#include <vespa/document/fieldvalue/iteratorhandler.h>
#include <vespa/document/select/parser.h>