dbms: Moved addingDefault logic into the Block class [#METR-9001]

This commit is contained in:
Sergey Fedorov 2013-10-28 16:09:42 +00:00
parent b3ba5e4cab
commit f7a6316abd
4 changed files with 19 additions and 27 deletions

View File

@ -50,6 +50,8 @@ public:
void erase(size_t position);
/// удалить столбец с заданным именем
void erase(const String & name);
/// Добавляет в блок недостающие столбцы со значениями по-умолчанию
void addDefaults(NamesAndTypesListPtr required_columns);
ColumnWithNameAndType & getByPosition(size_t position);
const ColumnWithNameAndType & getByPosition(size_t position) const;

View File

@ -45,20 +45,7 @@ protected:
Block res = children.back()->read();
if (!res)
return res;
for (NamesAndTypesList::const_iterator it = required_columns->begin(); it != required_columns->end(); ++it)
{
if (!res.has(it->first))
{
ColumnWithNameAndType col;
col.name = it->first;
col.type = it->second;
col.column = dynamic_cast<IColumnConst &>(*it->second->createConstColumn(
res.rows(), it->second->getDefault())).convertToFullColumn();
res.insert(col);
}
}
res.addDefaults(required_columns);
return res;
}

View File

@ -28,19 +28,7 @@ public:
void write(const Block & block) {
Block res = block;
for (NamesAndTypesList::const_iterator it = required_columns->begin(); it != required_columns->end(); ++it)
{
if (!res.has(it->first))
{
ColumnWithNameAndType col;
col.name = it->first;
col.type = it->second;
col.column = dynamic_cast<IColumnConst &>(*it->second->createConstColumn(
res.rows(), it->second->getDefault())).convertToFullColumn();
res.insert(col);
}
}
output->write(res);
res.addDefaults(required_columns);
}
private:

View File

@ -19,6 +19,21 @@ Block::Block(const Block & other)
}
void Block::addDefaults(NamesAndTypesListPtr required_columns) {
for (NamesAndTypesList::const_iterator it = required_columns->begin(); it != required_columns->end(); ++it)
{
if (!this->has(it->first))
{
ColumnWithNameAndType col;
col.name = it->first;
col.type = it->second;
col.column = dynamic_cast<IColumnConst &>(*it->second->createConstColumn(
this->rows(), it->second->getDefault())).convertToFullColumn();
this->insert(col);
}
}
}
Block & Block::operator= (const Block & other)
{
data = other.data;