aboutsummaryrefslogtreecommitdiffstats
path: root/storage/src/vespa/storage/storageserver/configurable_bucket_resolver.cpp
blob: fd01210ae9eeedced92ddb8183ad5480a20d5b41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include <vespa/document/base/documentid.h>
#include <vespa/document/bucket/fixed_bucket_spaces.h>
#include <vespa/vespalib/util/exceptions.h>
#include "configurable_bucket_resolver.h"

using namespace document;

namespace storage {

ConfigurableBucketResolver::ConfigurableBucketResolver(BucketSpaceMapping type_to_space) noexcept
    : _type_to_space(std::move(type_to_space))
{}
ConfigurableBucketResolver::~ConfigurableBucketResolver() = default;

document::Bucket ConfigurableBucketResolver::bucketFromId(const DocumentId& id) const {
    if (!id.hasDocType()) {
        // Legacy document ids without document type maps to default bucket space
        return Bucket(FixedBucketSpaces::default_space(), BucketId(0));
    }
    auto iter = _type_to_space.find(id.getDocType());
    if (iter != _type_to_space.end()) {
        return Bucket(iter->second, BucketId(0));
    }
    throw UnknownBucketSpaceException("Unknown bucket space mapping for document type '"
                                      + id.getDocType() + "' in id: '" + id.toString() + "'", VESPA_STRLOC);
}

BucketSpace ConfigurableBucketResolver::bucketSpaceFromName(const vespalib::string& name) const {
    return FixedBucketSpaces::from_string(name);
}

vespalib::string ConfigurableBucketResolver::nameFromBucketSpace(const BucketSpace& space) const {
    return FixedBucketSpaces::to_string(space);
}

std::shared_ptr<ConfigurableBucketResolver> ConfigurableBucketResolver::from_config(
        const vespa::config::content::core::BucketspacesConfig& config) {
    ConfigurableBucketResolver::BucketSpaceMapping type_to_space;
    for (auto& mapping : config.documenttype) {
        type_to_space.emplace(mapping.name, FixedBucketSpaces::from_string(mapping.bucketspace));
    }
    return std::make_shared<ConfigurableBucketResolver>(std::move(type_to_space));
}

}