diff options
author | Geir Storli <geirstorli@yahoo.no> | 2017-04-20 14:57:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-20 14:57:15 +0200 |
commit | 386413e2452d17bc2c65a6b302a9a55b9725551e (patch) | |
tree | ed0d7ededc1a5a1565843cb2af9788b0756b8d6f | |
parent | 4077f420c5fb5f6d2dcbd42bbd6bc2bf6c40094b (diff) | |
parent | 4d6a3cafce3cd2a40e3437d80a4c5d35f66394d4 (diff) |
Merge pull request #2206 from yahoo/toregge/rename-attribute-specs-builder-to-attribute-aspect-delayer
Toregge/rename attribute specs builder to attribute aspect delayer
37 files changed, 116 insertions, 346 deletions
diff --git a/searchcore/CMakeLists.txt b/searchcore/CMakeLists.txt index 8b2025462ed..3e7dfc1f45c 100644 --- a/searchcore/CMakeLists.txt +++ b/searchcore/CMakeLists.txt @@ -61,11 +61,11 @@ vespa_define_module( src/tests/fdispatch/search_path src/tests/grouping src/tests/proton/attribute + src/tests/proton/attribute/attribute_aspect_delayer src/tests/proton/attribute/attribute_directory src/tests/proton/attribute/attribute_initializer src/tests/proton/attribute/attribute_manager src/tests/proton/attribute/attribute_populator - src/tests/proton/attribute/attribute_specs_builder src/tests/proton/attribute/attribute_usage_filter src/tests/proton/attribute/attributes_state_explorer src/tests/proton/attribute/document_field_populator diff --git a/searchcore/src/apps/tests/persistenceconformance_test.cpp b/searchcore/src/apps/tests/persistenceconformance_test.cpp index 18a51115089..75c37394e83 100644 --- a/searchcore/src/apps/tests/persistenceconformance_test.cpp +++ b/searchcore/src/apps/tests/persistenceconformance_test.cpp @@ -27,7 +27,6 @@ LOG_SETUP("persistenceconformance_test"); #include <tests/proton/common/dummydbowner.h> #include <vespa/vespalib/io/fileutil.h> #include <vespa/searchcore/proton/common/hw_info.h> -#include <vespa/searchcore/proton/attribute/attribute_specs_builder.h> using namespace config; @@ -113,17 +112,14 @@ public: SchemaBuilder::build(*indexschema, *schema); SchemaBuilder::build(*attributes, *schema); SchemaBuilder::build(*summary, *schema); - AttributeSpecsBuilder attributeSpecsBuilder; - attributeSpecsBuilder.setup(*attributes, SummarymapConfig()); return DocumentDBConfig::SP(new DocumentDBConfig( 1, std::make_shared<RankProfilesConfig>(), std::make_shared<matching::RankingConstants>(), indexschema, - attributeSpecsBuilder.getAttributesConfig(), - attributeSpecsBuilder.getAttributeSpecs(), + attributes, summary, - attributeSpecsBuilder.getSummarymapConfig(), + std::make_shared<SummarymapConfig>(), std::make_shared<JuniperrcConfig>(), _typeCfg, _repo, diff --git a/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/CMakeLists.txt b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/CMakeLists.txt new file mode 100644 index 00000000000..72842d6a59a --- /dev/null +++ b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchcore_attribute_aspect_delayer_test_app TEST + SOURCES + attribute_aspect_delayer_test.cpp + DEPENDS + searchcore_attribute + searchcore_pcommon +) +vespa_add_test(NAME searchcore_attribute_aspect_delayer_test_app COMMAND searchcore_attribute_aspect_delayer_test_app) diff --git a/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/DESC b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/DESC new file mode 100644 index 00000000000..0ad2e46da02 --- /dev/null +++ b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/DESC @@ -0,0 +1 @@ +attribute aspect delayer test. Take a look at attribute_aspect_delayer_test.cpp for details. diff --git a/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/FILES b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/FILES new file mode 100644 index 00000000000..459c36ca3b4 --- /dev/null +++ b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/FILES @@ -0,0 +1 @@ +attribute_aspect_delayer_test.cpp diff --git a/searchcore/src/tests/proton/attribute/attribute_specs_builder/attribute_specs_builder_test.cpp b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/attribute_aspect_delayer_test.cpp index 585ffc88414..d8407355e41 100644 --- a/searchcore/src/tests/proton/attribute/attribute_specs_builder/attribute_specs_builder_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_aspect_delayer/attribute_aspect_delayer_test.cpp @@ -1,12 +1,9 @@ // Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/fastos/fastos.h> -#include <vespa/log/log.h> -LOG_SETUP("attribute_specs_builder_test"); #include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/stllike/string.h> #include <vespa/searchcore/proton/test/attribute_utils.h> -#include <vespa/searchcore/proton/attribute/attribute_specs_builder.h> -#include <vespa/searchcore/proton/attribute/attribute_specs.h> +#include <vespa/searchcore/proton/attribute/attribute_aspect_delayer.h> #include <vespa/searchcore/proton/common/i_document_type_inspector.h> #include <vespa/searchcore/proton/common/indexschema_inspector.h> #include <vespa/vespalib/test/insertion_operators.h> @@ -24,36 +21,9 @@ using search::attribute::Config; using search::attribute::BasicType; using search::attribute::CollectionType; -namespace { - -const char *boolStr(bool val) { - return val ? "true" : "false"; -} - -} - namespace std { -ostream &operator<<(ostream &os, const Config &cfg) -{ - os << "{basicType=" << cfg.basicType().asString(); - os << ", collectionType=" << cfg.collectionType().asString(); - os << ", fastAccess=" << boolStr(cfg.fastAccess()); - os << "}"; - return os; -} - -ostream &operator<<(ostream &os, const proton::AttributeSpec &spec) -{ - os << "{name=" << spec.getName(); - os << ", hideFromReading=" << boolStr(spec.getHideFromReading()); - os << ", hideFromWriting=" << boolStr(spec.getHideFromWriting()); - os << ", " << spec.getConfig(); - os << "}"; - return os; -} - ostream &operator<<(ostream &os, const SummarymapConfig::Override &override) { os << "{field=" << override.field << ", command=" << override.command << ", arguments=" << override.arguments << "}"; @@ -117,23 +87,6 @@ AttributesConfig::Attribute make_fa(const AttributesConfig::Attribute &cfg) return attr; } -Config make_fa(const Config &cfg) -{ - Config modCfg(cfg); - modCfg.setFastAccess(true); - return modCfg; -} - -const Config int32_sv(BasicType::Type::INT32); -const Config string_sv(BasicType::Type::STRING); - -Config getTensor(const vespalib::string &spec) -{ - Config ret(BasicType::Type::TENSOR); - ret.setTensorType(vespalib::eval::ValueType::from_spec(spec)); - return ret; -} - SummarymapConfig::Override make_attribute_override(const vespalib::string &name) { SummarymapConfig::Override override; @@ -184,12 +137,12 @@ class Fixture { MyInspector _inspector; IndexschemaConfigBuilder _oldIndexSchema; - AttributeSpecsBuilder _builder; + AttributeAspectDelayer _delayer; public: Fixture() : _inspector(), - _builder() + _delayer() { } ~Fixture() { } @@ -201,44 +154,35 @@ public: field.name = name; _oldIndexSchema.indexfield.emplace_back(field); } - void setup(const AttributesConfig &newAttributesConfig, const SummarymapConfig &newSummarymapConfig) { - _builder.setup(newAttributesConfig, newSummarymapConfig); - } void setup(const AttributesConfig &oldAttributesConfig, const SummarymapConfig &oldSummarymapConfig, const AttributesConfig &newAttributesConfig, const SummarymapConfig &newSummarymapConfig) { IndexschemaInspector indexschemaInspector(_oldIndexSchema); - _builder.setup(oldAttributesConfig, oldSummarymapConfig, + _delayer.setup(oldAttributesConfig, oldSummarymapConfig, newAttributesConfig, newSummarymapConfig, indexschemaInspector, _inspector); } - void assertSpecs(const std::vector<AttributeSpec> &expSpecs) - { - const auto &actSpecs = _builder.getAttributeSpecs(); - EXPECT_EQUAL(expSpecs, actSpecs->getSpecs()); - } void assertAttributeConfig(const std::vector<AttributesConfig::Attribute> &exp) { - auto actConfig = _builder.getAttributesConfig(); + auto actConfig = _delayer.getAttributesConfig(); EXPECT_TRUE(exp == actConfig->attribute); } void assertSummarymapConfig(const std::vector<SummarymapConfig::Override> &exp) { - auto summarymapConfig = _builder.getSummarymapConfig(); + auto summarymapConfig = _delayer.getSummarymapConfig(); EXPECT_EQUAL(exp, summarymapConfig->override); } }; -TEST_F("require that empty specs is OK", Fixture) +TEST_F("require that empty config is OK", Fixture) { - f.setup(attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({})); + f.setup(attrCfg({}), smCfg({}), attrCfg({}), smCfg({})); TEST_DO(f.assertAttributeConfig({})); + TEST_DO(f.assertSummarymapConfig({})); } -TEST_F("require that simple attribute specs is OK", Fixture) +TEST_F("require that simple attribute config is OK", Fixture) { - f.setup(attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv, false, false)})); + f.setup(attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")}), attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")})); TEST_DO(f.assertAttributeConfig({make_int32_sv_cfg()})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -247,7 +191,6 @@ TEST_F("require that adding attribute aspect is delayed if field type is unchang { f.addFields({"a"}); f.setup(attrCfg({}), smCfg({}), attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv, false, true)})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({})); } @@ -256,7 +199,6 @@ TEST_F("require that adding attribute aspect is delayed if field type is unchang { f.addFields({"a"}); f.setup(attrCfg({}), smCfg({}), attrCfg({make_int32_sv_cfg()}), smCfg({make_geopos_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv, false, true)})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({make_geopos_override("a")})); } @@ -264,7 +206,6 @@ TEST_F("require that adding attribute aspect is delayed if field type is unchang TEST_F("require that adding attribute is not delayed if field type changed", Fixture) { f.setup(attrCfg({}), smCfg({}), attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv, false, false)})); TEST_DO(f.assertAttributeConfig({make_int32_sv_cfg()})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -273,7 +214,6 @@ TEST_F("require that removing attribute aspect is delayed if field type is uncha { f.addFields({"a"}); f.setup(attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv, true, false)})); TEST_DO(f.assertAttributeConfig({make_int32_sv_cfg()})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -282,7 +222,6 @@ TEST_F("require that removing attribute aspect is delayed if field type is uncha { f.addFields({"a"}); f.setup(attrCfg({make_int32_sv_cfg()}), smCfg({make_geopos_override("a")}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv, true, false)})); TEST_DO(f.assertAttributeConfig({make_int32_sv_cfg()})); TEST_DO(f.assertSummarymapConfig({})); } @@ -290,7 +229,6 @@ TEST_F("require that removing attribute aspect is delayed if field type is uncha TEST_F("require that removing attribute aspect is not delayed if field type changed", Fixture) { f.setup(attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({})); } @@ -300,7 +238,6 @@ TEST_F("require that removing attribute aspect is not delayed if also indexed", f.addFields({"a"}); f.addOldIndexField("a"); f.setup(attrCfg({make_string_sv_cfg()}), smCfg({make_attribute_override("a")}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({})); } @@ -309,7 +246,6 @@ TEST_F("require that removing attribute aspect is not delayed for tensor", Fixtu { f.addFields({"a"}); f.setup(attrCfg({make_tensor_cfg("tensor(x[10])")}), smCfg({make_attribute_override("a")}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({})); } @@ -318,7 +254,6 @@ TEST_F("require that removing attribute aspect is not delayed for predicate", Fi { f.addFields({"a"}); f.setup(attrCfg({make_predicate_cfg(4)}), smCfg({}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({})); } @@ -327,7 +262,6 @@ TEST_F("require that removing attribute aspect is not delayed for reference", Fi { f.addFields({"a"}); f.setup(attrCfg({make_reference_cfg()}), smCfg({}), attrCfg({}), smCfg({})); - TEST_DO(f.assertSpecs({})); TEST_DO(f.assertAttributeConfig({})); TEST_DO(f.assertSummarymapConfig({})); } @@ -336,7 +270,6 @@ TEST_F("require that fast access flag change is delayed, false->true edge", Fixt { f.addFields({"a"}); f.setup(attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")}), attrCfg({make_fa(make_int32_sv_cfg())}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", int32_sv)})); TEST_DO(f.assertAttributeConfig({make_int32_sv_cfg()})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -345,7 +278,6 @@ TEST_F("require that fast access flag change is delayed, true->false edge", Fixt { f.addFields({"a"}); f.setup(attrCfg({make_fa(make_int32_sv_cfg())}), smCfg({make_attribute_override("a")}), attrCfg({make_int32_sv_cfg()}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", make_fa(int32_sv))})); TEST_DO(f.assertAttributeConfig({make_fa(make_int32_sv_cfg())})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -354,7 +286,6 @@ TEST_F("require that fast access flag change is delayed, false->true edge, tenso { f.addFields({"a"}); f.setup(attrCfg({make_tensor_cfg("tensor(x[10])")}), smCfg({make_attribute_override("a")}), attrCfg({make_fa(make_tensor_cfg("tensor(x[10])"))}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", getTensor("tensor(x[10])"))})); TEST_DO(f.assertAttributeConfig({make_tensor_cfg("tensor(x[10])")})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -363,7 +294,6 @@ TEST_F("require that fast access flag change is not delayed, true->false edge, t { f.addFields({"a"}); f.setup(attrCfg({make_fa(make_tensor_cfg("tensor(x[10])"))}), smCfg({make_attribute_override("a")}), attrCfg({make_tensor_cfg("tensor(x[10])")}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", getTensor("tensor(x[10])"))})); TEST_DO(f.assertAttributeConfig({make_tensor_cfg("tensor(x[10])")})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } @@ -373,7 +303,6 @@ TEST_F("require that fast access flag change is not delayed, true->false edge, s f.addFields({"a"}); f.addOldIndexField("a"); f.setup(attrCfg({make_fa(make_string_sv_cfg())}), smCfg({make_attribute_override("a")}), attrCfg({make_string_sv_cfg()}), smCfg({make_attribute_override("a")})); - TEST_DO(f.assertSpecs({AttributeSpec("a", string_sv, false, false)})); TEST_DO(f.assertAttributeConfig({make_string_sv_cfg()})); TEST_DO(f.assertSummarymapConfig({make_attribute_override("a")})); } diff --git a/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp b/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp index 4e33a433655..2036c6e1145 100644 --- a/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_manager/attribute_manager_test.cpp @@ -225,12 +225,12 @@ struct ParallelAttributeManager AttributeManagerInitializer::SP initializer; ParallelAttributeManager(search::SerialNum configSerialNum, AttributeManager::SP baseAttrMgr, - const AttributeSpecs &attrSpecs, uint32_t docIdLimit); + const AttributesConfig &attrCfg, uint32_t docIdLimit); ~ParallelAttributeManager(); }; ParallelAttributeManager::ParallelAttributeManager(search::SerialNum configSerialNum, AttributeManager::SP baseAttrMgr, - const AttributeSpecs &attrSpecs, uint32_t docIdLimit) + const AttributesConfig &attrCfg, uint32_t docIdLimit) : documentMetaStoreInitTask(std::make_shared<DummyInitializerTask>()), bucketDbOwner(std::make_shared<BucketDBOwner>()), documentMetaStore(std::make_shared<DocumentMetaStore>(bucketDbOwner)), @@ -239,7 +239,7 @@ ParallelAttributeManager::ParallelAttributeManager(search::SerialNum configSeria fastAccessAttributesOnly(false), mgr(std::make_shared<AttributeManager::SP>()), initializer(std::make_shared<AttributeManagerInitializer>(configSerialNum, documentMetaStoreInitTask, - documentMetaStore, baseAttrMgr, attrSpecs, + documentMetaStore, baseAttrMgr, attrCfg, attributeGrow, attributeGrowNumDocs, fastAccessAttributesOnly, mgr)) { @@ -670,6 +670,16 @@ TEST_F("require that attributes can be initialized and loaded in sequence", Base } } +AttributesConfigBuilder::Attribute +createAttributeConfig(const vespalib::string &name) +{ + AttributesConfigBuilder::Attribute result; + result.name = name; + result.datatype = AttributesConfigBuilder::Attribute::Datatype::INT32; + result.collectiontype = AttributesConfigBuilder::Attribute::Collectiontype::SINGLE; + return result; +} + TEST_F("require that attributes can be initialized and loaded in parallel", BaseFixture) { { @@ -679,12 +689,12 @@ TEST_F("require that attributes can be initialized and loaded in parallel", Base { AttributeManagerFixture amf(f); - AttributeSpecs attrSpecs; - attrSpecs.emplace_back("a1", INT32_SINGLE); - attrSpecs.emplace_back("a2", INT32_SINGLE); - attrSpecs.emplace_back("a3", INT32_SINGLE); + AttributesConfigBuilder attrCfg; + attrCfg.attribute.push_back(createAttributeConfig("a1")); + attrCfg.attribute.push_back(createAttributeConfig("a2")); + attrCfg.attribute.push_back(createAttributeConfig("a3")); - ParallelAttributeManager newMgr(createSerialNum + 5, amf._msp, attrSpecs, 10); + ParallelAttributeManager newMgr(createSerialNum + 5, amf._msp, attrCfg, 10); AttributeGuard::UP a1 = newMgr.mgr->get()->getAttribute("a1"); TEST_DO(validateAttribute(*a1->get())); diff --git a/searchcore/src/tests/proton/attribute/attribute_specs_builder/CMakeLists.txt b/searchcore/src/tests/proton/attribute/attribute_specs_builder/CMakeLists.txt deleted file mode 100644 index b676722c504..00000000000 --- a/searchcore/src/tests/proton/attribute/attribute_specs_builder/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -vespa_add_executable(searchcore_attribute_specs_builder_test_app TEST - SOURCES - attribute_specs_builder_test.cpp - DEPENDS - searchcore_attribute - searchcore_pcommon -) -vespa_add_test(NAME searchcore_attribute_specs_builder_test_app COMMAND searchcore_attribute_specs_builder_test_app) diff --git a/searchcore/src/tests/proton/attribute/attribute_specs_builder/DESC b/searchcore/src/tests/proton/attribute/attribute_specs_builder/DESC deleted file mode 100644 index 5cfe2ba2167..00000000000 --- a/searchcore/src/tests/proton/attribute/attribute_specs_builder/DESC +++ /dev/null @@ -1 +0,0 @@ -attribute specs builder test. Take a look at attribute_specs_builder_test.cpp for details. diff --git a/searchcore/src/tests/proton/attribute/attribute_specs_builder/FILES b/searchcore/src/tests/proton/attribute/attribute_specs_builder/FILES deleted file mode 100644 index 0c648bd92f6..00000000000 --- a/searchcore/src/tests/proton/attribute/attribute_specs_builder/FILES +++ /dev/null @@ -1 +0,0 @@ -attribute_specs_builder_test.cpp diff --git a/searchcore/src/tests/proton/attribute/attribute_test.cpp b/searchcore/src/tests/proton/attribute/attribute_test.cpp index 3eb69b045f9..114fd3b43bd 100644 --- a/searchcore/src/tests/proton/attribute/attribute_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_test.cpp @@ -9,7 +9,6 @@ LOG_SETUP("attribute_test"); #include <vespa/document/update/arithmeticvalueupdate.h> #include <vespa/searchcommon/attribute/attributecontent.h> #include <vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h> -#include <vespa/searchcore/proton/attribute/attribute_specs.h> #include <vespa/searchcore/proton/attribute/attribute_writer.h> #include <vespa/searchcore/proton/attribute/attributemanager.h> #include <vespa/searchcore/proton/attribute/filter_attribute_manager.h> @@ -449,23 +448,24 @@ TEST_F("require that attribute adapter handles predicate update", Fixture) struct AttributeCollectionSpecFixture { - AttributeSpecs _specs; + AttributesConfigBuilder _builder; AttributeCollectionSpecFactory _factory; AttributeCollectionSpecFixture(bool fastAccessOnly) - : _specs(), + : _builder(), _factory(search::GrowStrategy(), 100, fastAccessOnly) { addAttribute("a1", false); addAttribute("a2", true); } void addAttribute(const vespalib::string &name, bool fastAccess) { - AVConfig cfg; - cfg.setFastAccess(fastAccess); - _specs.emplace_back(name, cfg); + AttributesConfigBuilder::Attribute attr; + attr.name = name; + attr.fastaccess = fastAccess; + _builder.attribute.push_back(attr); } AttributeCollectionSpec::UP create(uint32_t docIdLimit, search::SerialNum serialNum) { - return _factory.create(_specs, docIdLimit, serialNum); + return _factory.create(_builder, docIdLimit, serialNum); } }; diff --git a/searchcore/src/tests/proton/documentdb/documentdbconfig/documentdbconfig_test.cpp b/searchcore/src/tests/proton/documentdb/documentdbconfig/documentdbconfig_test.cpp index 90532670e74..a1f5b606415 100644 --- a/searchcore/src/tests/proton/documentdb/documentdbconfig/documentdbconfig_test.cpp +++ b/searchcore/src/tests/proton/documentdb/documentdbconfig/documentdbconfig_test.cpp @@ -3,7 +3,6 @@ #include <vespa/config-attributes.h> #include <vespa/config-imported-fields.h> #include <vespa/config-rank-profiles.h> -#include <vespa/searchcore/proton/attribute/attribute_specs.h> #include <vespa/searchcore/proton/server/documentdbconfig.h> #include <vespa/searchcore/proton/test/documentdb_config_builder.h> #include <vespa/vespalib/testkit/testapp.h> @@ -114,11 +113,4 @@ TEST_F("require that makeReplayConfig() drops unneeded configs", Fixture) EXPECT_TRUE(DDBC::preferOriginalConfig(f.nullCfg).get() == nullptr); } -TEST_F("require that attribute spec is setup", Fixture) -{ - const auto &attributeSpecs = f.fullCfg->getAttributeSpecs().getSpecs(); - EXPECT_EQUAL(1, attributeSpecs.size()); - EXPECT_EQUAL("my_attribute", attributeSpecs[0].getName()); -} - TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchcore/src/tests/proton/proton_config_fetcher/proton_config_fetcher_test.cpp b/searchcore/src/tests/proton/proton_config_fetcher/proton_config_fetcher_test.cpp index d5c556c2db4..b9d8a55b302 100644 --- a/searchcore/src/tests/proton/proton_config_fetcher/proton_config_fetcher_test.cpp +++ b/searchcore/src/tests/proton/proton_config_fetcher/proton_config_fetcher_test.cpp @@ -14,7 +14,6 @@ #include <vespa/searchcore/proton/server/proton_config_fetcher.h> #include <vespa/searchcore/proton/server/proton_config_snapshot.h> #include <vespa/searchcore/proton/server/i_proton_configurer.h> -#include <vespa/searchcore/proton/attribute/attribute_specs.h> #include <vespa/searchsummary/config/config-juniperrc.h> #include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/util/varholder.h> @@ -250,22 +249,6 @@ TEST_FF("require that documentdb config manager builds schema with imported attr EXPECT_EQUAL("imported", schema->getImportedAttributeFields()[0].getName()); } -TEST_FF("require that documentdb config manager builds attribute specs", - ConfigTestFixture("search"), - DocumentDBConfigManager(f1.configId + "/typea", "typea")) -{ - auto *docType = f1.addDocType("typea"); - docType->attributesBuilder.attribute.resize(1); - docType->attributesBuilder.attribute[0].name = "attrname"; - - ConfigRetriever retriever(f2.createConfigKeySet(), f1.context); - f2.forwardConfig(f1.getBootstrapConfig(1)); - f2.update(retriever.getBootstrapConfigs()); // Cheating, but we only need the configs - const auto &attrSpecs = f2.getConfig()->getAttributeSpecs().getSpecs(); - EXPECT_EQUAL(1u, attrSpecs.size()); - EXPECT_EQUAL("attrname", attrSpecs[0].getName()); -} - TEST_FFF("require that proton config fetcher follows changes to bootstrap", ConfigTestFixture("search"), ProtonConfigOwner(), diff --git a/searchcore/src/tests/proton/proton_configurer/proton_configurer_test.cpp b/searchcore/src/tests/proton/proton_configurer/proton_configurer_test.cpp index 19abad7ed03..7a8247c8944 100644 --- a/searchcore/src/tests/proton/proton_configurer/proton_configurer_test.cpp +++ b/searchcore/src/tests/proton/proton_configurer/proton_configurer_test.cpp @@ -20,7 +20,6 @@ #include <vespa/searchcommon/common/schemaconfigurer.h> #include <vespa/vespalib/util/threadstackexecutor.h> #include <vespa/vespalib/test/insertion_operators.h> -#include <vespa/searchcore/proton/attribute/attribute_specs_builder.h> using namespace config; using namespace proton; @@ -72,17 +71,14 @@ struct DBConfigFixture { const vespalib::string &configId, const vespalib::string &docTypeName) { - AttributeSpecsBuilder attributeSpecsBuilder; - attributeSpecsBuilder.setup(_attributesBuilder, _summarymapBuilder); return std::make_shared<DocumentDBConfig> (generation, std::make_shared<RankProfilesConfig>(_rankProfilesBuilder), buildRankingConstants(), std::make_shared<IndexschemaConfig>(_indexschemaBuilder), - attributeSpecsBuilder.getAttributesConfig(), - attributeSpecsBuilder.getAttributeSpecs(), + std::make_shared<AttributesConfig>(_attributesBuilder), std::make_shared<SummaryConfig>(_summaryBuilder), - attributeSpecsBuilder.getSummarymapConfig(), + std::make_shared<SummarymapConfig>(_summarymapBuilder), std::make_shared<JuniperrcConfig>(_juniperrcBuilder), documentTypes, repo, diff --git a/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt b/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt index c4e9e4f2969..cdb7b01254e 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt +++ b/searchcore/src/vespa/searchcore/proton/attribute/CMakeLists.txt @@ -2,6 +2,7 @@ vespa_add_library(searchcore_attribute STATIC SOURCES address_space_usage_stats.cpp + attribute_aspect_delayer.cpp attribute_collection_spec_factory.cpp attribute_collection_spec.cpp attribute_directory.cpp @@ -12,7 +13,6 @@ vespa_add_library(searchcore_attribute STATIC attribute_manager_initializer.cpp attribute_populator.cpp attribute_spec.cpp - attribute_specs_builder.cpp attribute_usage_filter.cpp attribute_usage_sampler_context.cpp attribute_usage_sampler_functor.cpp diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs_builder.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_aspect_delayer.cpp index 9abb02cf2f7..f69036ba316 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs_builder.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_aspect_delayer.cpp @@ -1,6 +1,6 @@ // Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include "attribute_specs_builder.h" +#include "attribute_aspect_delayer.h" #include <vespa/searchlib/attribute/configconverter.h> #include <vespa/searchcore/proton/common/i_document_type_inspector.h> #include <vespa/searchcore/proton/common/i_indexschema_inspector.h> @@ -8,7 +8,6 @@ #include <vespa/vespalib/stllike/hash_set.hpp> #include <vespa/config-attributes.h> #include <vespa/config-summarymap.h> -#include "attribute_specs.h" using search::attribute::ConfigConverter; using vespa::config::search::AttributesConfig; @@ -40,46 +39,28 @@ bool willTriggerReprocessOnAttributeAspectRemoval(const search::attribute::Confi } -AttributeSpecsBuilder::AttributeSpecsBuilder() - : _specs(std::make_shared<AttributeSpecs>()), - _attributesConfig(std::make_shared<AttributesConfigBuilder>()), +AttributeAspectDelayer::AttributeAspectDelayer() + : _attributesConfig(std::make_shared<AttributesConfigBuilder>()), _summarymapConfig(std::make_shared<SummarymapConfigBuilder>()) { } -AttributeSpecsBuilder::~AttributeSpecsBuilder() +AttributeAspectDelayer::~AttributeAspectDelayer() { } -std::shared_ptr<const AttributeSpecs> -AttributeSpecsBuilder::getAttributeSpecs() const -{ - return _specs; -} - -std::shared_ptr<AttributeSpecsBuilder::AttributesConfig> -AttributeSpecsBuilder::getAttributesConfig() const +std::shared_ptr<AttributeAspectDelayer::AttributesConfig> +AttributeAspectDelayer::getAttributesConfig() const { return _attributesConfig; } -std::shared_ptr<AttributeSpecsBuilder::SummarymapConfig> -AttributeSpecsBuilder::getSummarymapConfig() const +std::shared_ptr<AttributeAspectDelayer::SummarymapConfig> +AttributeAspectDelayer::getSummarymapConfig() const { return _summarymapConfig; } -void -AttributeSpecsBuilder::setup(const AttributesConfig &newAttributesConfig, const SummarymapConfig &newSummarymapConfig) -{ - for (const auto &attr : newAttributesConfig.attribute) { - search::attribute::Config cfg = ConfigConverter::convert(attr); - _specs->emplace_back(attr.name, cfg); - } - _attributesConfig = std::make_shared<AttributesConfigBuilder>(newAttributesConfig); - _summarymapConfig = std::make_shared<SummarymapConfigBuilder>(newSummarymapConfig); -} - namespace { void @@ -88,7 +69,6 @@ handleNewAttributes(const AttributesConfig &oldAttributesConfig, const SummarymapConfig &newSummarymapConfig, const IIndexschemaInspector &oldIndexschemaInspector, const IDocumentTypeInspector &inspector, - AttributeSpecs &specs, AttributesConfigBuilder &attributesConfig, SummarymapConfigBuilder &summarymapConfig) { @@ -98,7 +78,6 @@ handleNewAttributes(const AttributesConfig &oldAttributesConfig, search::attribute::Config newCfg = ConfigConverter::convert(newAttr); if (!inspector.hasUnchangedField(newAttr.name)) { // No reprocessing due to field type change, just use new config - specs.emplace_back(newAttr.name, newCfg); attributesConfig.attribute.emplace_back(newAttr); } else { auto oldAttr = oldAttrs.lookup(newAttr.name); @@ -107,7 +86,6 @@ handleNewAttributes(const AttributesConfig &oldAttributesConfig, if (willTriggerReprocessOnAttributeAspectRemoval(oldCfg, oldIndexschemaInspector, newAttr.name) || !oldAttr->fastaccess) { // Delay change of fast access flag newCfg.setFastAccess(oldAttr->fastaccess); - specs.emplace_back(newAttr.name, newCfg); auto modNewAttr = newAttr; modNewAttr.fastaccess = oldAttr->fastaccess; attributesConfig.attribute.emplace_back(modNewAttr); @@ -119,12 +97,10 @@ handleNewAttributes(const AttributesConfig &oldAttributesConfig, // Don't delay change of fast access flag from true to // false when removing attribute aspect in a way that // doesn't trigger reprocessing. - specs.emplace_back(newAttr.name, newCfg); attributesConfig.attribute.emplace_back(newAttr); } } else { // Delay addition of attribute aspect - specs.emplace_back(newAttr.name, newCfg, false, true); delayed.insert(newAttr.name); } } @@ -147,7 +123,6 @@ handleOldAttributes(const AttributesConfig &oldAttributesConfig, const SummarymapConfig &oldSummarymapConfig, const IIndexschemaInspector &oldIndexschemaInspector, const IDocumentTypeInspector &inspector, - AttributeSpecs &specs, AttributesConfigBuilder &attributesConfig, SummarymapConfigBuilder &summarymapConfig) { @@ -161,7 +136,6 @@ handleOldAttributes(const AttributesConfig &oldAttributesConfig, // Delay removal of attribute aspect if it would trigger // reprocessing. if (willTriggerReprocessOnAttributeAspectRemoval(oldCfg, oldIndexschemaInspector, oldAttr.name)) { - specs.emplace_back(oldAttr.name, oldCfg, true, false); attributesConfig.attribute.emplace_back(oldAttr); delayed.insert(oldAttr.name); } @@ -181,7 +155,7 @@ handleOldAttributes(const AttributesConfig &oldAttributesConfig, } void -AttributeSpecsBuilder::setup(const AttributesConfig &oldAttributesConfig, +AttributeAspectDelayer::setup(const AttributesConfig &oldAttributesConfig, const SummarymapConfig &oldSummarymapConfig, const AttributesConfig &newAttributesConfig, const SummarymapConfig &newSummarymapConfig, @@ -190,11 +164,11 @@ AttributeSpecsBuilder::setup(const AttributesConfig &oldAttributesConfig, { handleNewAttributes(oldAttributesConfig, newAttributesConfig, newSummarymapConfig, - oldIndexschemaInspector, inspector, *_specs, + oldIndexschemaInspector, inspector, *_attributesConfig, *_summarymapConfig); handleOldAttributes(oldAttributesConfig, newAttributesConfig, oldSummarymapConfig, - oldIndexschemaInspector, inspector, *_specs, + oldIndexschemaInspector, inspector, *_attributesConfig, *_summarymapConfig); } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs_builder.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_aspect_delayer.h index f937c0e72a8..b9d387a9e30 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs_builder.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_aspect_delayer.h @@ -15,13 +15,12 @@ namespace proton { class IDocumentTypeInspector; class IIndexschemaInspector; -class AttributeSpecs; /* - * Class to build adjusted attribute config and vector of attribute specs + * Class to build adjusted attributes config and summary map config * to eliminate need for reprocessing when system is online. */ -class AttributeSpecsBuilder +class AttributeAspectDelayer { using AttributesConfigBuilder = vespa::config::search::internal::InternalAttributesType; using AttributesConfig = const vespa::config::search::internal::InternalAttributesType; @@ -30,20 +29,14 @@ class AttributeSpecsBuilder using SummarymapConfigBuilder = vespa::config::search::internal::InternalSummarymapType; using SummarymapConfig = const vespa::config::search::internal::InternalSummarymapType; - std::shared_ptr<AttributeSpecs> _specs; std::shared_ptr<AttributesConfigBuilder> _attributesConfig; std::shared_ptr<SummarymapConfigBuilder> _summarymapConfig; public: - AttributeSpecsBuilder(); - ~AttributeSpecsBuilder(); + AttributeAspectDelayer(); + ~AttributeAspectDelayer(); /* - * Setup called from document db config manager and document db - * config scout. No adjustments. - */ - void setup(const AttributesConfig &newAttributesConfig, const SummarymapConfig &newSummarymapConfig); - /* * Setup to avoid reprocessing, used to create adjusted document db * config before applying new config when system is online. */ @@ -54,7 +47,6 @@ public: const IIndexschemaInspector &oldIndexschemaInspector, const IDocumentTypeInspector &inspector); - std::shared_ptr<const AttributeSpecs> getAttributeSpecs() const; std::shared_ptr<AttributesConfig> getAttributesConfig() const; std::shared_ptr<SummarymapConfig> getSummarymapConfig() const; }; diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp index e619d232f0c..b83680dc3f7 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.cpp @@ -5,7 +5,6 @@ LOG_SETUP(".proton.attribute.attribute_collection_spec_factory"); #include "attribute_collection_spec_factory.h" #include <vespa/searchlib/attribute/configconverter.h> -#include "attribute_specs.h" using search::attribute::ConfigConverter; using search::GrowStrategy; @@ -23,24 +22,24 @@ AttributeCollectionSpecFactory::AttributeCollectionSpecFactory( } AttributeCollectionSpec::UP -AttributeCollectionSpecFactory::create(const AttributeSpecs &attrSpecs, +AttributeCollectionSpecFactory::create(const AttributesConfig &attrCfg, uint32_t docIdLimit, search::SerialNum serialNum) const { AttributeCollectionSpec::AttributeList attrs; // Amortize memory spike cost over N docs - const size_t skew = _growNumDocs/(attrSpecs.getSpecs().size()+1); + const size_t skew = _growNumDocs/(attrCfg.attribute.size()+1); GrowStrategy grow = _growStrategy; grow.setDocsInitialCapacity(std::max(grow.getDocsInitialCapacity(), docIdLimit)); - for (const auto &attr : attrSpecs.getSpecs()) { - auto cfg = attr.getConfig(); + for (const auto &attr : attrCfg.attribute) { + search::attribute::Config cfg = ConfigConverter::convert(attr); if (_fastAccessOnly && !cfg.fastAccess()) { continue; } grow.setDocsGrowDelta(grow.getDocsGrowDelta() + skew); cfg.setGrowStrategy(grow); - attrs.push_back(AttributeSpec(attr.getName(), cfg)); + attrs.push_back(AttributeSpec(attr.name, cfg)); } return AttributeCollectionSpec::UP(new AttributeCollectionSpec(attrs, docIdLimit, diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h index 23ae550478d..dc3dfcbd8d4 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_collection_spec_factory.h @@ -6,11 +6,10 @@ #include <vespa/searchcommon/attribute/config.h> #include <vespa/searchcommon/common/growstrategy.h> #include <vespa/searchlib/common/serialnum.h> +#include <vespa/config-attributes.h> namespace proton { -class AttributeSpecs; - /** * A factory for generating an AttributeCollectionSpec based on AttributesConfig * from the config server. @@ -18,6 +17,8 @@ class AttributeSpecs; class AttributeCollectionSpecFactory { private: + typedef vespa::config::search::AttributesConfig AttributesConfig; + const search::GrowStrategy _growStrategy; const size_t _growNumDocs; const bool _fastAccessOnly; @@ -27,7 +28,7 @@ public: size_t growNumDocs, bool fastAccessOnly); - AttributeCollectionSpec::UP create(const AttributeSpecs &attrSpecs, + AttributeCollectionSpec::UP create(const AttributesConfig &attrCfg, uint32_t docIdLimit, search::SerialNum serialNum) const; }; diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp index 7b009ef4b77..a4eae3ac1ff 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer.cpp @@ -253,9 +253,9 @@ AttributeInitializerResult AttributeInitializer::init() const { if (!_attrDir->empty()) { - return AttributeInitializerResult(tryLoadAttribute(), _spec.getHideFromReading(), _spec.getHideFromWriting()); + return AttributeInitializerResult(tryLoadAttribute()); } else { - return AttributeInitializerResult(createAndSetupEmptyAttribute(), _spec.getHideFromReading(), _spec.getHideFromWriting()); + return AttributeInitializerResult(createAndSetupEmptyAttribute()); } } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.cpp index 21b88f33f21..29eae463497 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.cpp @@ -5,12 +5,8 @@ namespace proton { -AttributeInitializerResult::AttributeInitializerResult(const AttributeVectorSP &attr, - bool hideFromReading, - bool hideFromWriting) - : _attr(attr), - _hideFromReading(hideFromReading), - _hideFromWriting(hideFromWriting) +AttributeInitializerResult::AttributeInitializerResult(const AttributeVectorSP &attr) + : _attr(attr) { } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.h index 0a6b6e607d7..6332ed2939c 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_initializer_result.h @@ -17,15 +17,9 @@ class AttributeInitializerResult { using AttributeVectorSP = std::shared_ptr<search::AttributeVector>; AttributeVectorSP _attr; - bool _hideFromReading; // Delayed removal of attribute aspect - bool _hideFromWriting; // Delayed addition of attribute aspect public: - AttributeInitializerResult(const AttributeVectorSP &attr, - bool hideFromReading, - bool hideFromWriting); + AttributeInitializerResult(const AttributeVectorSP &attr); ~AttributeInitializerResult(); - bool getHideFromReading() const { return _hideFromReading; } - bool getHideFromWriting() const { return _hideFromWriting; } const AttributeVectorSP &getAttribute() const { return _attr; } operator bool() const { return static_cast<bool>(_attr); } }; diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp index 640171a39b0..0570020e760 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.cpp @@ -9,6 +9,7 @@ using search::AttributeVector; using search::GrowStrategy; using search::SerialNum; +using vespa::config::search::AttributesConfig; namespace proton { @@ -89,14 +90,14 @@ AttributeManagerInitializer::createAttributeSpec() const { uint32_t docIdLimit = 1; // The real docIdLimit is used after attributes are loaded to pad them AttributeCollectionSpecFactory factory(_attributeGrow, _attributeGrowNumDocs, _fastAccessAttributesOnly); - return factory.create(_attrSpecs, docIdLimit, _configSerialNum); + return factory.create(_attrCfg, docIdLimit, _configSerialNum); } AttributeManagerInitializer::AttributeManagerInitializer(SerialNum configSerialNum, initializer::InitializerTask::SP documentMetaStoreInitTask, DocumentMetaStore::SP documentMetaStore, AttributeManager::SP baseAttrMgr, - const AttributeSpecs &attrSpecs, + const AttributesConfig &attrCfg, const GrowStrategy &attributeGrow, size_t attributeGrowNumDocs, bool fastAccessAttributesOnly, @@ -104,7 +105,7 @@ AttributeManagerInitializer::AttributeManagerInitializer(SerialNum configSerialN : _configSerialNum(configSerialNum), _documentMetaStore(documentMetaStore), _attrMgr(), - _attrSpecs(attrSpecs), + _attrCfg(attrCfg), _attributeGrow(attributeGrow), _attributeGrowNumDocs(attributeGrowNumDocs), _fastAccessAttributesOnly(fastAccessAttributesOnly), diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.h index 16bd5217774..9e1857d5f00 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_manager_initializer.h @@ -8,7 +8,7 @@ #include <vespa/searchcore/proton/documentmetastore/documentmetastore.h> #include <vespa/searchcore/proton/initializer/initializer_task.h> #include <vespa/searchlib/common/serialnum.h> -#include "attribute_specs.h" +#include <vespa/config-attributes.h> namespace proton { @@ -21,7 +21,7 @@ private: search::SerialNum _configSerialNum; DocumentMetaStore::SP _documentMetaStore; AttributeManager::SP _attrMgr; - AttributeSpecs _attrSpecs; + vespa::config::search::AttributesConfig _attrCfg; search::GrowStrategy _attributeGrow; size_t _attributeGrowNumDocs; bool _fastAccessAttributesOnly; @@ -35,7 +35,7 @@ public: initializer::InitializerTask::SP documentMetaStoreInitTask, DocumentMetaStore::SP documentMetaStore, AttributeManager::SP baseAttrMgr, - const AttributeSpecs &attrSpecs, + const vespa::config::search::AttributesConfig &attrCfg, const search::GrowStrategy &attributeGrow, size_t attributeGrowNumDocs, bool fastAccessAttributesOnly, diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.cpp index 6cd76182659..550e7b1606a 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.cpp @@ -6,18 +6,8 @@ namespace proton { AttributeSpec::AttributeSpec(const vespalib::string &name, const search::attribute::Config &cfg) - : AttributeSpec(name, cfg, false, false) -{ -} - -AttributeSpec::AttributeSpec(const vespalib::string &name, - const search::attribute::Config &cfg, - bool hideFromReading, - bool hideFromWriting) : _name(name), - _cfg(cfg), - _hideFromReading(hideFromReading), - _hideFromWriting(hideFromWriting) + _cfg(cfg) { } @@ -37,9 +27,7 @@ bool AttributeSpec::operator==(const AttributeSpec &rhs) const { return ((_name == rhs._name) && - (_cfg == rhs._cfg) && - (_hideFromReading == rhs._hideFromReading) && - (_hideFromWriting == rhs._hideFromWriting)); + (_cfg == rhs._cfg)); } } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.h index f8c8834894a..78fe94053b4 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_spec.h @@ -15,15 +15,9 @@ class AttributeSpec private: vespalib::string _name; search::attribute::Config _cfg; - bool _hideFromReading; - bool _hideFromWriting; public: AttributeSpec(const vespalib::string &name, const search::attribute::Config &cfg); - AttributeSpec(const vespalib::string &name, - const search::attribute::Config &cfg, - bool hideFromReading, - bool hideFromWriting); AttributeSpec(const AttributeSpec &); AttributeSpec & operator=(const AttributeSpec &); AttributeSpec(AttributeSpec &&); @@ -31,8 +25,6 @@ public: ~AttributeSpec(); const vespalib::string &getName() const { return _name; } const search::attribute::Config &getConfig() const { return _cfg; } - bool getHideFromReading() const { return _hideFromReading; } - bool getHideFromWriting() const { return _hideFromWriting; } bool operator==(const AttributeSpec &rhs) const; }; diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs.h deleted file mode 100644 index 7c231b4f917..00000000000 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_specs.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#pragma once - -#include "attribute_spec.h" -#include <vector> - -namespace proton { - -/** - * A specification of attribute vectors an attribute manager should - * instantiate and manage. - */ -class AttributeSpecs -{ -private: - std::vector<AttributeSpec> _specs; -public: - AttributeSpecs() - : _specs() - { - } - ~AttributeSpecs() { } - const std::vector<AttributeSpec> &getSpecs() const { return _specs; } - bool operator==(const AttributeSpecs &rhs) const { return _specs == rhs._specs; } - template <typename ...Args> - void emplace_back(Args && ... args) { _specs.emplace_back(std::forward<Args>(args)...); } -}; - -} // namespace proton - diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp index c8ae63bf0ec..a7183178e91 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.cpp @@ -63,21 +63,15 @@ bool matchingTypes(const AttributeVector::SP &av, const search::attribute::Confi } AttributeManager::AttributeWrap::AttributeWrap(const AttributeVectorSP & a, - bool isExtra_, - bool hideFromReading, - bool hideFromWriting) + bool isExtra_) : _attr(a), - _isExtra(isExtra_), - _hideFromReading(hideFromReading), - _hideFromWriting(hideFromWriting) + _isExtra(isExtra_) { } AttributeManager::AttributeWrap::AttributeWrap() : _attr(), - _isExtra(false), - _hideFromReading(false), - _hideFromWriting(false) + _isExtra(false) { } @@ -88,13 +82,13 @@ AttributeManager::AttributeWrap::~AttributeWrap() AttributeManager::AttributeWrap AttributeManager::AttributeWrap::extraAttribute(const AttributeVectorSP &a) { - return AttributeWrap(a, true, false, false); + return AttributeWrap(a, true); } AttributeManager::AttributeWrap -AttributeManager::AttributeWrap::normalAttribute(const AttributeVectorSP &a, bool hideFromReading, bool hideFromWriting) +AttributeManager::AttributeWrap::normalAttribute(const AttributeVectorSP &a) { - return AttributeWrap(a, false, hideFromReading, hideFromWriting); + return AttributeWrap(a, false); } @@ -107,9 +101,7 @@ AttributeManager::internalAddAttribute(const AttributeSpec &spec, AttributeInitializerResult result = initializer.init(); if (result) { result.getAttribute()->setInterlock(_interlock); - assert(result.getHideFromReading() == spec.getHideFromReading()); - assert(result.getHideFromWriting() == spec.getHideFromWriting()); - addAttribute(AttributeWrap::normalAttribute(result.getAttribute(), result.getHideFromReading(), result.getHideFromWriting())); + addAttribute(AttributeWrap::normalAttribute(result.getAttribute())); } return result.getAttribute(); } @@ -158,7 +150,7 @@ AttributeManager::transferExistingAttributes(const AttributeManager &currMgr, if (matchingTypes(av, aspec.getConfig())) { // transfer attribute LOG(debug, "Transferring attribute vector '%s' with %u docs and serial number %lu from current manager", av->getName().c_str(), av->getNumDocs(), av->getStatus().getLastSyncToken()); - addAttribute(AttributeWrap::normalAttribute(av, aspec.getHideFromReading(), aspec.getHideFromWriting())); + addAttribute(AttributeWrap::normalAttribute(av)); } else { toBeAdded.push_back(aspec); } @@ -288,7 +280,7 @@ AttributeManager::addInitializedAttributes(const std::vector<AttributeInitialize for (const auto &result : attributes) { assert(result); result.getAttribute()->setInterlock(_interlock); - addAttribute(AttributeWrap::normalAttribute(result.getAttribute(), result.getHideFromReading(), result.getHideFromWriting())); + addAttribute(AttributeWrap::normalAttribute(result.getAttribute())); } } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h index f8fae2730f1..7d6f7d1233b 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attributemanager.h @@ -54,18 +54,14 @@ private: private: AttributeVectorSP _attr; bool _isExtra; - bool _hideFromReading; - bool _hideFromWriting; - AttributeWrap(const AttributeVectorSP & a, bool isExtra_, bool hideFromReading, bool hideFromWriting); + AttributeWrap(const AttributeVectorSP & a, bool isExtra_); public: AttributeWrap(); ~AttributeWrap(); static AttributeWrap extraAttribute(const AttributeVectorSP &a); - static AttributeWrap normalAttribute(const AttributeVectorSP &a, bool hideFromReading, bool hideFromWriting); + static AttributeWrap normalAttribute(const AttributeVectorSP &a); bool isExtra() const { return _isExtra; } const AttributeVectorSP getAttribute() const { return _attr; } - bool getHideFromReading() const { return _hideFromReading; } - bool getHideFromWriting() const { return _hideFromWriting; } }; typedef vespalib::hash_map<vespalib::string, AttributeWrap> AttributeMap; diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.cpp b/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.cpp index 200402b5d82..dc1379ee316 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.cpp @@ -9,7 +9,6 @@ #include <vespa/config-summarymap.h> #include <vespa/searchsummary/config/config-juniperrc.h> #include <vespa/document/config/config-documenttypes.h> -#include <vespa/searchcore/proton/attribute/attribute_specs.h> using namespace config; using namespace vespa::config::search::summary; @@ -46,7 +45,6 @@ DocumentDBConfig::DocumentDBConfig( const RankingConstants::SP &rankingConstants, const IndexschemaConfigSP &indexschema, const AttributesConfigSP &attributes, - const std::shared_ptr<const AttributeSpecs> &attributeSpecs, const SummaryConfigSP &summary, const SummarymapConfigSP &summarymap, const JuniperrcConfigSP &juniperrc, @@ -66,7 +64,6 @@ DocumentDBConfig::DocumentDBConfig( _rankingConstants(rankingConstants), _indexschema(indexschema), _attributes(attributes), - _attributeSpecs(attributeSpecs), _summary(summary), _summarymap(summarymap), _juniperrc(juniperrc), @@ -90,7 +87,6 @@ DocumentDBConfig(const DocumentDBConfig &cfg) _rankingConstants(cfg._rankingConstants), _indexschema(cfg._indexschema), _attributes(cfg._attributes), - _attributeSpecs(cfg._attributeSpecs), _summary(cfg._summary), _summarymap(cfg._summarymap), _juniperrc(cfg._juniperrc), @@ -117,8 +113,6 @@ DocumentDBConfig::operator==(const DocumentDBConfig & rhs) const rhs._indexschema.get()) && equals<AttributesConfig>(_attributes.get(), rhs._attributes.get()) && - equals<AttributeSpecs>(_attributeSpecs.get(), - rhs._attributeSpecs.get()) && equals<SummaryConfig>(_summary.get(), rhs._summary.get()) && equals<SummarymapConfig>(_summarymap.get(), @@ -150,8 +144,7 @@ DocumentDBConfig::compare(const DocumentDBConfig &rhs) const retval.indexschemaChanged = !equals<IndexschemaConfig>(_indexschema.get(), rhs._indexschema.get()); retval.attributesChanged = - !equals<AttributesConfig>(_attributes.get(), rhs._attributes.get()) || - !equals<AttributeSpecs>(_attributeSpecs.get(), rhs._attributeSpecs.get()); + !equals<AttributesConfig>(_attributes.get(), rhs._attributes.get()); retval.summaryChanged = !equals<SummaryConfig>(_summary.get(), rhs._summary.get()); retval.summarymapChanged = @@ -183,7 +176,6 @@ DocumentDBConfig::valid() const (_rankingConstants.get() != NULL) && (_indexschema.get() != NULL) && (_attributes.get() != NULL) && - _attributeSpecs && (_summary.get() != NULL) && (_summarymap.get() != NULL) && (_juniperrc.get() != NULL) && @@ -224,7 +216,6 @@ DocumentDBConfig::makeReplayConfig(const SP & orig) std::make_shared<RankingConstants>(), o._indexschema, o._attributes, - o._attributeSpecs, o._summary, std::make_shared<SummarymapConfig>(), o._juniperrc, @@ -257,8 +248,7 @@ DocumentDBConfig::preferOriginalConfig(const SP & self) DocumentDBConfig::SP -DocumentDBConfig::newFromAttributesConfig(const AttributesConfigSP &attributes, - const std::shared_ptr<const AttributeSpecs> &attributeSpecs) const +DocumentDBConfig::newFromAttributesConfig(const AttributesConfigSP &attributes) const { return std::make_shared<DocumentDBConfig>( _generation, @@ -266,7 +256,6 @@ DocumentDBConfig::newFromAttributesConfig(const AttributesConfigSP &attributes, _rankingConstants, _indexschema, attributes, - attributeSpecs, _summary, _summarymap, _juniperrc, diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.h b/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.h index 51de714ee30..b581655330d 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.h +++ b/searchcore/src/vespa/searchcore/proton/server/documentdbconfig.h @@ -31,8 +31,6 @@ namespace document { namespace internal { class InternalDocumenttypesType; } } namespace proton { -class AttributeSpecs; - class DocumentDBConfig { public: @@ -84,7 +82,6 @@ private: RankingConstants::SP _rankingConstants; IndexschemaConfigSP _indexschema; AttributesConfigSP _attributes; - std::shared_ptr<const AttributeSpecs> _attributeSpecs; SummaryConfigSP _summary; SummarymapConfigSP _summarymap; JuniperrcConfigSP _juniperrc; @@ -112,7 +109,6 @@ public: const RankingConstants::SP &rankingConstants, const IndexschemaConfigSP &indexschema, const AttributesConfigSP &attributes, - const std::shared_ptr<const AttributeSpecs> &attributeSpecs, const SummaryConfigSP &summary, const SummarymapConfigSP &summarymap, const JuniperrcConfigSP &juniperrc, @@ -159,8 +155,6 @@ public: const search::index::Schema::SP &getSchemaSP() const { return _schema; } const MaintenanceConfigSP &getMaintenanceConfigSP() const { return _maintenance; } const search::TuneFileDocumentDB::SP &getTuneFileDocumentDBSP() const { return _tuneFileDocumentDB; } - const AttributeSpecs &getAttributeSpecs() const { return *_attributeSpecs; } - const std::shared_ptr<const AttributeSpecs> &getAttributeSpecsSP() const { return _attributeSpecs; } bool operator==(const DocumentDBConfig &rhs) const; @@ -194,8 +188,7 @@ public: /** * Create modified attributes config. */ - SP newFromAttributesConfig(const AttributesConfigSP &attributes, - const std::shared_ptr<const AttributeSpecs> &attributeSpecs) const; + SP newFromAttributesConfig(const AttributesConfigSP &attributes) const; }; } // namespace proton diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdbconfigmanager.cpp b/searchcore/src/vespa/searchcore/proton/server/documentdbconfigmanager.cpp index da17ca3fdf6..a258a282f81 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentdbconfigmanager.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentdbconfigmanager.cpp @@ -12,7 +12,6 @@ #include <vespa/searchlib/index/schemautil.h> #include <vespa/searchsummary/config/config-juniperrc.h> #include <vespa/vespalib/time/time_box.h> -#include <vespa/searchcore/proton/attribute/attribute_specs_builder.h> LOG_SETUP(".proton.server.documentdbconfigmanager"); @@ -269,17 +268,14 @@ DocumentDBConfigManager::update(const ConfigSnapshot &snapshot) newMaintenanceConfig = oldMaintenanceConfig; } ConfigSnapshot extraConfigs(snapshot.subset(_extraConfigKeys)); - AttributeSpecsBuilder attributeSpecsBuilder; - attributeSpecsBuilder.setup(*newAttributesConfig, *newSummarymapConfig); DocumentDBConfig::SP newSnapshot( new DocumentDBConfig(generation, newRankProfilesConfig, newRankingConstants, newIndexschemaConfig, - attributeSpecsBuilder.getAttributesConfig(), - attributeSpecsBuilder.getAttributeSpecs(), + newAttributesConfig, newSummaryConfig, - attributeSpecsBuilder.getSummarymapConfig(), + newSummarymapConfig, newJuniperrcConfig, _bootstrapConfig->getDocumenttypesConfigSP(), _bootstrapConfig->getDocumentTypeRepoSP(), diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdbconfigscout.cpp b/searchcore/src/vespa/searchcore/proton/server/documentdbconfigscout.cpp index c9329f893dc..2ebadce7e38 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentdbconfigscout.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentdbconfigscout.cpp @@ -3,7 +3,6 @@ #include <vespa/fastos/fastos.h> #include "documentdbconfigscout.h" #include <vespa/searchcore/proton/attribute/attributesconfigscout.h> -#include <vespa/searchcore/proton/attribute/attribute_specs_builder.h> using vespa::config::search::AttributesConfig; @@ -20,10 +19,7 @@ DocumentDBConfigScout::scout(const DocumentDBConfig::SP &config, ac(acScout.adjust(config->getAttributesConfig())); if (*ac == config->getAttributesConfig()) return config; // no change - AttributeSpecsBuilder attributeSpecsBuilder; - attributeSpecsBuilder.setup(*ac, config->getSummarymapConfig()); - return config->newFromAttributesConfig(attributeSpecsBuilder.getAttributesConfig(), - attributeSpecsBuilder.getAttributeSpecs()); + return config->newFromAttributesConfig(ac); } diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp index 0337673b9da..e51ceebdbce 100644 --- a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.cpp @@ -78,7 +78,7 @@ FastAccessDocSubDB::createAttributeManagerInitializer(const DocumentDBConfig &co documentMetaStoreInitTask, documentMetaStore, baseAttrMgr, - (_hasAttributes ? configSnapshot.getAttributeSpecs() : AttributeSpecs()), + (_hasAttributes ? configSnapshot.getAttributesConfig() : AttributesConfig()), _attributeGrow, _attributeGrowNumDocs, _fastAccessAttributesOnly, @@ -103,13 +103,13 @@ FastAccessDocSubDB::setupAttributeManager(AttributeManager::SP attrMgrResult) AttributeCollectionSpec::UP -FastAccessDocSubDB::createAttributeSpec(const AttributeSpecs &attrSpecs, +FastAccessDocSubDB::createAttributeSpec(const AttributesConfig &attrCfg, SerialNum serialNum) const { uint32_t docIdLimit(_dms->getCommittedDocIdLimit()); AttributeCollectionSpecFactory factory(_attributeGrow, _attributeGrowNumDocs, _fastAccessAttributesOnly); - return factory.create(attrSpecs, docIdLimit, serialNum); + return factory.create(attrCfg, docIdLimit, serialNum); } void @@ -268,7 +268,7 @@ FastAccessDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, std::make_unique<AttributeWriterFactory>(), getSubDbName()); proton::IAttributeManager::SP oldMgr = extractAttributeManager(_fastAccessFeedView.get()); AttributeCollectionSpec::UP attrSpec = - createAttributeSpec(newConfigSnapshot.getAttributeSpecs(), serialNum); + createAttributeSpec(newConfigSnapshot.getAttributesConfig(), serialNum); IReprocessingInitializer::UP initializer = configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, *attrSpec); if (initializer->hasReprocessors()) { diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h index 4fff4be5a75..cd35d9204b1 100644 --- a/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h +++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_doc_subdb.h @@ -87,7 +87,7 @@ protected: MetricsWireService &_metricsWireService; DocIdLimit _docIdLimit; - AttributeCollectionSpec::UP createAttributeSpec(const AttributeSpecs &attrCfg, SerialNum serialNum) const; + AttributeCollectionSpec::UP createAttributeSpec(const AttributesConfig &attrCfg, SerialNum serialNum) const; AttributeManager::SP getAndResetInitAttributeManager(); virtual IFlushTargetList getFlushTargetsInternal() override; void reconfigureAttributeMetrics(const IAttributeManager &newMgr, const IAttributeManager &oldMgr); diff --git a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp index aedd0678ae0..6c3de875e22 100644 --- a/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/searchabledocsubdb.cpp @@ -175,7 +175,7 @@ SearchableDocSubDB::applyConfig(const DocumentDBConfig &newConfigSnapshot, if (params.shouldAttributeManagerChange()) { proton::IAttributeManager::SP oldMgr = getAttributeManager(); AttributeCollectionSpec::UP attrSpec = - createAttributeSpec(newConfigSnapshot.getAttributeSpecs(), serialNum); + createAttributeSpec(newConfigSnapshot.getAttributesConfig(), serialNum); IReprocessingInitializer::UP initializer = _configurer.reconfigure(newConfigSnapshot, oldConfigSnapshot, *attrSpec, params, resolver); if (initializer.get() != nullptr && initializer->hasReprocessors()) { diff --git a/searchcore/src/vespa/searchcore/proton/test/documentdb_config_builder.cpp b/searchcore/src/vespa/searchcore/proton/test/documentdb_config_builder.cpp index 47955993ffd..14ed502cdc1 100644 --- a/searchcore/src/vespa/searchcore/proton/test/documentdb_config_builder.cpp +++ b/searchcore/src/vespa/searchcore/proton/test/documentdb_config_builder.cpp @@ -9,7 +9,6 @@ #include <vespa/searchsummary/config/config-juniperrc.h> #include <vespa/document/config/config-documenttypes.h> #include <vespa/config-imported-fields.h> -#include <vespa/searchcore/proton/attribute/attribute_specs_builder.h> using document::DocumenttypesConfig; using search::TuneFileDocumentDB; @@ -74,17 +73,14 @@ DocumentDBConfigBuilder::DocumentDBConfigBuilder(const DocumentDBConfig &cfg) DocumentDBConfig::SP DocumentDBConfigBuilder::build() { - AttributeSpecsBuilder attributeSpecsBuilder; - attributeSpecsBuilder.setup(*_attributes, *_summarymap); return std::make_shared<DocumentDBConfig>( _generation, _rankProfiles, _rankingConstants, _indexschema, - attributeSpecsBuilder.getAttributesConfig(), - attributeSpecsBuilder.getAttributeSpecs(), + _attributes, _summary, - attributeSpecsBuilder.getSummarymapConfig(), + _summarymap, _juniperrc, _documenttypes, _repo, |