blob: c2293fecdaef076f00f5f5d010145f72eadb8b19 [file] [log] [blame]
/**
* Copyright 2011-2015 Quickstep Technologies LLC.
* Copyright 2015 Pivotal Software, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
#include "storage/SubBlockTypeRegistry.hpp"
#include <cstddef>
#include "storage/StorageBlockLayout.pb.h"
#include "utility/Macros.hpp"
namespace quickstep {
bool SubBlockTypeRegistry::LayoutDescriptionIsValid(
const CatalogRelationSchema &relation,
const StorageBlockLayoutDescription &description) {
// Check that layout is fully initialized.
if (!description.IsInitialized()) {
return false;
}
// Check that the number of slots is positive.
if (description.num_slots() == 0) {
return false;
}
// Check that the tuple_store_description is valid.
const TupleStorageSubBlockDescription &tuple_store_description = description.tuple_store_description();
if (!tuple_store_description.IsInitialized()) {
return false;
}
std::unordered_map<TupleStoreTypeIntegral,
TupleStoreDescriptionIsValidFunction>::const_iterator
it = Instance()->tuple_store_description_is_valid_functions_.find(
static_cast<TupleStoreTypeIntegral>(tuple_store_description.sub_block_type()));
if (it == Instance()->tuple_store_description_is_valid_functions_.end()) {
return false;
}
if (!(*it->second)(relation, tuple_store_description)) {
return false;
}
// Check that each index_description is valid.
for (int index_description_num = 0;
index_description_num < description.index_description_size();
++index_description_num) {
const IndexSubBlockDescription &index_description = description.index_description(index_description_num);
if (!index_description.IsInitialized()) {
return false;
}
std::unordered_map<IndexTypeIntegral,
IndexDescriptionIsValidFunction>::const_iterator
index_it = Instance()->index_description_is_valid_functions_.find(
static_cast<IndexTypeIntegral>(index_description.sub_block_type()));
if (index_it == Instance()->index_description_is_valid_functions_.end()) {
return false;
}
if (!(*index_it->second)(relation, index_description)) {
return false;
}
}
return true;
}
std::size_t SubBlockTypeRegistry::EstimateBytesPerTupleForTupleStore(
const CatalogRelationSchema &relation,
const TupleStorageSubBlockDescription &description) {
DEBUG_ASSERT(description.IsInitialized());
std::unordered_map<TupleStoreTypeIntegral,
TupleStoreEstimateBytesPerTupleFunction>::const_iterator
it = Instance()->tuple_store_estimate_bytes_per_tuple_functions_.find(
static_cast<TupleStoreTypeIntegral>(description.sub_block_type()));
DEBUG_ASSERT(it != Instance()->tuple_store_estimate_bytes_per_tuple_functions_.end());
return (*it->second)(relation, description);
}
std::size_t SubBlockTypeRegistry::EstimateBytesPerTupleForIndex(
const CatalogRelationSchema &relation,
const IndexSubBlockDescription &description) {
DEBUG_ASSERT(description.IsInitialized());
std::unordered_map<IndexTypeIntegral,
IndexEstimateBytesPerTupleFunction>::const_iterator
it = Instance()->index_estimate_bytes_per_tuple_functions_.find(
static_cast<IndexTypeIntegral>(description.sub_block_type()));
DEBUG_ASSERT(it != Instance()->index_estimate_bytes_per_tuple_functions_.end());
return (*it->second)(relation, description);
}
} // namespace quickstep