From ed107f675ad1c420aa38b8787961e2b85dfdd64f Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 4 Jan 2017 20:25:07 +0300 Subject: [PATCH] Preparations [#METR-20307]. --- dbms/include/DB/Core/Block.h | 14 ++++---------- dbms/include/DB/DataTypes/FieldToDataType.h | 14 +++++++------- dbms/src/Core/Block.cpp | 21 ++++++++++++++++++++- dbms/src/DataTypes/FieldToDataType.cpp | 12 ++++++------ 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/dbms/include/DB/Core/Block.h b/dbms/include/DB/Core/Block.h index 31a63945cd..378519f60f 100644 --- a/dbms/include/DB/Core/Block.h +++ b/dbms/include/DB/Core/Block.h @@ -29,7 +29,7 @@ class Context; class Block { private: - using Container = std::vector; + using Container = ColumnsWithTypeAndName; using IndexByName = std::map; Container data; @@ -39,15 +39,8 @@ public: BlockInfo info; Block() = default; - Block(std::initializer_list il) : data{il} - { - size_t i = 0; - for (const auto & elem : il) - { - index_by_name[elem.name] = i; - ++i; - } - } + Block(std::initializer_list il); + Block(const ColumnsWithTypeAndName & data_); /// вставить столбец в заданную позицию void insert(size_t position, const ColumnWithTypeAndName & elem); @@ -128,6 +121,7 @@ public: private: void eraseImpl(size_t position); + void initializeIndexByName(); }; using Blocks = std::vector; diff --git a/dbms/include/DB/DataTypes/FieldToDataType.h b/dbms/include/DB/DataTypes/FieldToDataType.h index 50389debfe..93da0d6688 100644 --- a/dbms/include/DB/DataTypes/FieldToDataType.h +++ b/dbms/include/DB/DataTypes/FieldToDataType.h @@ -19,12 +19,12 @@ namespace DB class FieldToDataType : public StaticVisitor { public: - DataTypePtr operator() (Null & x) const + DataTypePtr operator() (const Null & x) const { return std::make_shared(); } - DataTypePtr operator() (UInt64 & x) const + DataTypePtr operator() (const UInt64 & x) const { if (x <= std::numeric_limits::max()) return std::make_shared(); if (x <= std::numeric_limits::max()) return std::make_shared(); @@ -32,7 +32,7 @@ public: return std::make_shared(); } - DataTypePtr operator() (Int64 & x) const + DataTypePtr operator() (const Int64 & x) const { if (x <= std::numeric_limits::max() && x >= std::numeric_limits::min()) return std::make_shared(); if (x <= std::numeric_limits::max() && x >= std::numeric_limits::min()) return std::make_shared(); @@ -40,19 +40,19 @@ public: return std::make_shared(); } - DataTypePtr operator() (Float64 & x) const + DataTypePtr operator() (const Float64 & x) const { return std::make_shared(); } - DataTypePtr operator() (String & x) const + DataTypePtr operator() (const String & x) const { return std::make_shared(); } - DataTypePtr operator() (Array & x) const; + DataTypePtr operator() (const Array & x) const; - DataTypePtr operator() (Tuple & x) const; + DataTypePtr operator() (const Tuple & x) const; }; } diff --git a/dbms/src/Core/Block.cpp b/dbms/src/Core/Block.cpp index 78d9215376..1f097fdb8d 100644 --- a/dbms/src/Core/Block.cpp +++ b/dbms/src/Core/Block.cpp @@ -89,6 +89,25 @@ void Block::addDefaults(const NamesAndTypesList & required_columns) } +Block::Block(std::initializer_list il) : data{il} +{ + initializeIndexByName(); +} + + +Block::Block(const ColumnsWithTypeAndName & data_) : data{data_} +{ + initializeIndexByName(); +} + + +void Block::initializeIndexByName() +{ + for (size_t i = 0, size = data.size(); i < size; ++i) + index_by_name[data[i].name] = i; +} + + void Block::insert(size_t position, const ColumnWithTypeAndName & elem) { if (position > data.size()) @@ -359,7 +378,7 @@ Block Block::sortColumns() const ColumnsWithTypeAndName Block::getColumns() const { - return ColumnsWithTypeAndName(data.begin(), data.end()); + return data; } diff --git a/dbms/src/DataTypes/FieldToDataType.cpp b/dbms/src/DataTypes/FieldToDataType.cpp index 38af15d1b3..7e9fddeabb 100644 --- a/dbms/src/DataTypes/FieldToDataType.cpp +++ b/dbms/src/DataTypes/FieldToDataType.cpp @@ -17,9 +17,9 @@ namespace ErrorCodes template -static void convertArrayToCommonType(Array & arr) +static void convertArrayToCommonType(const Array & arr) { - for (auto & elem : arr) + for (const auto & elem : arr) { if (!elem.isNull()) elem = apply_visitor(FieldVisitorConvertToNumber(), elem); @@ -27,7 +27,7 @@ static void convertArrayToCommonType(Array & arr) } -DataTypePtr FieldToDataType::operator() (Array & x) const +DataTypePtr FieldToDataType::operator() (const Array & x) const { if (x.empty()) throw Exception("Cannot infer type of empty array", ErrorCodes::EMPTY_DATA_PASSED); @@ -207,16 +207,16 @@ DataTypePtr FieldToDataType::operator() (Array & x) const } -DataTypePtr FieldToDataType::operator() (Tuple & x) const +DataTypePtr FieldToDataType::operator() (const Tuple & x) const { - auto & tuple = static_cast(x); + const auto & tuple = static_cast(x); if (tuple.empty()) throw Exception("Cannot infer type of an empty tuple", ErrorCodes::EMPTY_DATA_PASSED); DataTypes element_types; element_types.reserve(ext::size(tuple)); - for (auto & element : tuple) + for (const auto & element : tuple) element_types.push_back(apply_visitor(FieldToDataType{}, element)); return std::make_shared(element_types); -- GitLab