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

dbms: development.

上级 746b7fce
......@@ -6,6 +6,8 @@
#include <list>
#include <DB/Core/ColumnWithNameAndType.h>
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
namespace DB
......@@ -31,7 +33,11 @@ private:
void rebuildIndexByPosition();
public:
/// вставить столбец в заданную позицию
void insert(size_t position, const ColumnWithNameAndType & elem);
/// вставить столбец в конец
void insert(const ColumnWithNameAndType & elem);
/// удалить столбец в заданной позиции
void erase(size_t position);
ColumnWithNameAndType & getByPosition(size_t position);
......
......@@ -5,7 +5,6 @@
#include <boost/variant.hpp>
#include <boost/variant/recursive_variant.hpp>
#include <boost/variant/static_visitor.hpp>
#include <DB/Core/Types.h>
#include <DB/Core/Field.h>
......@@ -47,36 +46,6 @@ typedef boost::make_recursive_variant<
typedef std::vector<Column> TupleColumn; /// Столбец значений типа "кортеж" - несколько столбцов произвольного типа
typedef std::vector<Column> ArrayColumn; /// Столбец значений типа "массив" - столбец, значения в котором - массивы
/** Возвращает количество значений в столбце
* TODO: поправить для tuple.
*/
class ColumnVisitorSize : public boost::static_visitor<size_t>
{
public:
template <typename T> size_t operator() (const T & x) const { return x.size(); }
};
/** Возвращает n-ый элемент столбца.
* TODO: поправить для tuple.
*/
class ColumnVisitorNthElement : public boost::static_visitor<Field>
{
public:
ColumnVisitorNthElement(size_t n_) : n(n_) {}
template <typename T> Field operator() (const T & x) const
{
return x.size() == 1
? x[0] /// столбец - константа
: x[n];
}
private:
size_t n;
};
}
#endif
#ifndef DBMS_CORE_COLUMN_TYPE_TO_FIELD_TYPE_H
#define DBMS_CORE_COLUMN_TYPE_TO_FIELD_TYPE_H
#include <DB/Core/Field.h>
#include <DB/Core/Column.h>
namespace DB
{
/** Переводит типы, использующиеся в Column в типы, использующиеся в Field
*/
template <typename T> struct ColumnTypeToFieldType;
template <> struct ColumnTypeToFieldType<UInt8Column> { typedef UInt64 Type; };
template <> struct ColumnTypeToFieldType<UInt16Column> { typedef UInt64 Type; };
template <> struct ColumnTypeToFieldType<UInt32Column> { typedef UInt64 Type; };
template <> struct ColumnTypeToFieldType<UInt64Column> { typedef UInt64 Type; };
template <> struct ColumnTypeToFieldType<Int8Column> { typedef Int64 Type; };
template <> struct ColumnTypeToFieldType<Int16Column> { typedef Int64 Type; };
template <> struct ColumnTypeToFieldType<Int32Column> { typedef Int64 Type; };
template <> struct ColumnTypeToFieldType<Int64Column> { typedef Int64 Type; };
template <> struct ColumnTypeToFieldType<Float32Column> { typedef Float64 Type; };
template <> struct ColumnTypeToFieldType<Float64Column> { typedef Float64 Type; };
template <> struct ColumnTypeToFieldType<StringColumn> { typedef String Type; };
template <> struct ColumnTypeToFieldType<VariantColumn> { typedef Field Type; };
}
#endif
#ifndef DBMS_CORE_COLUMN_VISITORS_H
#define DBMS_CORE_COLUMN_VISITORS_H
#include <boost/variant/static_visitor.hpp>
#include <DB/Core/Field.h>
#include <DB/Core/Column.h>
#include <DB/Core/ColumnTypeToFieldType.h>
namespace DB
{
/** Возвращает количество значений в столбце
* TODO: поправить для tuple.
*/
class ColumnVisitorSize : public boost::static_visitor<size_t>
{
public:
template <typename T> size_t operator() (const T & x) const { return x.size(); }
};
/** Возвращает n-ый элемент столбца.
* TODO: поправить для tuple.
*/
class ColumnVisitorNthElement : public boost::static_visitor<Field>
{
public:
ColumnVisitorNthElement(size_t n_) : n(n_) {}
template <typename T> Field operator() (const T & x) const
{
return typename ColumnTypeToFieldType<T>::Type(
x.size() == 1
? x[0] /// столбец - константа
: x[n]);
}
Field operator() (const TupleColumn & x) const
{
return UInt64(0); /// заглушка
}
private:
size_t n;
};
}
#endif
......@@ -19,6 +19,7 @@ namespace ErrorCodes
SIZES_OF_COLUMNS_DOESNT_MATCH,
EMPTY_COLUMN_IN_BLOCK,
NOT_FOUND_COLUMN_IN_BLOCK,
POSITION_OUT_OF_BOUND,
};
}
......
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
#include <DB/Core/ColumnVisitors.h>
#include <DB/Core/Block.h>
......@@ -18,14 +19,28 @@ void Block::rebuildIndexByPosition()
void Block::insert(size_t position, const ColumnWithNameAndType & elem)
{
if (position >= index_by_position.size())
throw Exception("Position out of bound in Block::insert()", ErrorCodes::POSITION_OUT_OF_BOUND);
Container_t::iterator it = data.insert(index_by_position[position], elem);
rebuildIndexByPosition();
index_by_name[elem.name] = it;
}
void Block::insert(const ColumnWithNameAndType & elem)
{
Container_t::iterator it = data.insert(data.end(), elem);
rebuildIndexByPosition();
index_by_name[elem.name] = it;
}
void Block::erase(size_t position)
{
if (position >= index_by_position.size())
throw Exception("Position out of bound in Block::erase()", ErrorCodes::POSITION_OUT_OF_BOUND);
Container_t::iterator it = index_by_position[position];
index_by_name.erase(index_by_name.find(it->name));
data.erase(it);
......
#include <DB/DataStreams/RowInputStreamFromBlockInputStream.h>
#include <DB/Core/ColumnVisitors.h>
#include <DB/DataStreams/RowInputStreamFromBlockInputStream.h>
namespace DB
{
......@@ -12,19 +13,10 @@ RowInputStreamFromBlockInputStream::RowInputStreamFromBlockInputStream(IBlockInp
{
}
class TestVisitor : public boost::static_visitor<UInt64>
{
public:
template <typename T> UInt64 operator() (const T & x) const
{
return 0;
}
};
Row RowInputStreamFromBlockInputStream::read()
{
/* if (pos >= current_rows)
if (pos >= current_rows)
{
current_block = block_input.read();
current_rows = current_block.rows();
......@@ -38,13 +30,7 @@ Row RowInputStreamFromBlockInputStream::read()
for (size_t i = 0; i < columns; ++i)
row[i] = boost::apply_visitor(visitor, *current_block.getByPosition(i).column);
return row;
*/
Column column = UInt64Column(0);
Field field = boost::apply_visitor(TestVisitor(), column);
Row row;
++pos;
return row;
}
......
......@@ -20,7 +20,7 @@ NumbersBlockInputStream::NumbersBlockInputStream(size_t block_size_) : block_siz
Block NumbersBlockInputStream::read()
{
Block res;
res.insert(0, ColumnWithNameAndType());
res.insert(ColumnWithNameAndType());
ColumnWithNameAndType & column_with_name_and_type = res.getByPosition(0);
column_with_name_and_type.name = "number";
column_with_name_and_type.type = new ColumnTypeUInt64();
......
......@@ -12,18 +12,26 @@ using Poco::SharedPtr;
int main(int argc, char ** argv)
{
DB::StorageSystemNumbers table;
DB::ColumnNames column_names;
column_names.push_back("numbers");
Poco::SharedPtr<DB::ColumnTypes> column_types;
column_types->push_back(new DB::ColumnTypeUInt64);
SharedPtr<DB::IBlockInputStream> input = table.read(column_names, 0);
DB::TabSeparatedRowOutputStream output(std::cout, column_types);
DB::copyData(*input, output);
try
{
DB::StorageSystemNumbers table;
DB::ColumnNames column_names;
column_names.push_back("number");
Poco::SharedPtr<DB::ColumnTypes> column_types = new DB::ColumnTypes;
column_types->push_back(new DB::ColumnTypeUInt64);
SharedPtr<DB::IBlockInputStream> input = table.read(column_names, 0);
DB::TabSeparatedRowOutputStream output(std::cout, column_types);
DB::copyData(*input, output);
}
catch (const DB::Exception & e)
{
std::cerr << e.what() << ", " << e.message() << std::endl;
return 1;
}
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册