提交 ed107f67 编写于 作者: A Alexey Milovidov

Preparations [#METR-20307].

上级 37e1c9d1
......@@ -29,7 +29,7 @@ class Context;
class Block
{
private:
using Container = std::vector<ColumnWithTypeAndName>;
using Container = ColumnsWithTypeAndName;
using IndexByName = std::map<String, size_t>;
Container data;
......@@ -39,15 +39,8 @@ public:
BlockInfo info;
Block() = default;
Block(std::initializer_list<ColumnWithTypeAndName> il) : data{il}
{
size_t i = 0;
for (const auto & elem : il)
{
index_by_name[elem.name] = i;
++i;
}
}
Block(std::initializer_list<ColumnWithTypeAndName> 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<Block>;
......
......@@ -19,12 +19,12 @@ namespace DB
class FieldToDataType : public StaticVisitor<DataTypePtr>
{
public:
DataTypePtr operator() (Null & x) const
DataTypePtr operator() (const Null & x) const
{
return std::make_shared<DataTypeNull>();
}
DataTypePtr operator() (UInt64 & x) const
DataTypePtr operator() (const UInt64 & x) const
{
if (x <= std::numeric_limits<UInt8>::max()) return std::make_shared<DataTypeUInt8>();
if (x <= std::numeric_limits<UInt16>::max()) return std::make_shared<DataTypeUInt16>();
......@@ -32,7 +32,7 @@ public:
return std::make_shared<DataTypeUInt64>();
}
DataTypePtr operator() (Int64 & x) const
DataTypePtr operator() (const Int64 & x) const
{
if (x <= std::numeric_limits<Int8>::max() && x >= std::numeric_limits<Int8>::min()) return std::make_shared<DataTypeInt8>();
if (x <= std::numeric_limits<Int16>::max() && x >= std::numeric_limits<Int16>::min()) return std::make_shared<DataTypeInt16>();
......@@ -40,19 +40,19 @@ public:
return std::make_shared<DataTypeInt64>();
}
DataTypePtr operator() (Float64 & x) const
DataTypePtr operator() (const Float64 & x) const
{
return std::make_shared<DataTypeFloat64>();
}
DataTypePtr operator() (String & x) const
DataTypePtr operator() (const String & x) const
{
return std::make_shared<DataTypeString>();
}
DataTypePtr operator() (Array & x) const;
DataTypePtr operator() (const Array & x) const;
DataTypePtr operator() (Tuple & x) const;
DataTypePtr operator() (const Tuple & x) const;
};
}
......
......@@ -89,6 +89,25 @@ void Block::addDefaults(const NamesAndTypesList & required_columns)
}
Block::Block(std::initializer_list<ColumnWithTypeAndName> 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;
}
......
......@@ -17,9 +17,9 @@ namespace ErrorCodes
template <typename T>
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<T>(), 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<TupleBackend &>(x);
const auto & tuple = static_cast<const TupleBackend &>(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<DataTypeTuple>(element_types);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册