mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-19 16:20:50 +00:00
dbms: development.
This commit is contained in:
parent
746b7fce5e
commit
d741d53889
@ -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
|
||||
|
33
dbms/include/DB/Core/ColumnTypeToFieldType.h
Normal file
33
dbms/include/DB/Core/ColumnTypeToFieldType.h
Normal file
@ -0,0 +1,33 @@
|
||||
#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
|
53
dbms/include/DB/Core/ColumnVisitors.h
Normal file
53
dbms/include/DB/Core/ColumnVisitors.h
Normal file
@ -0,0 +1,53 @@
|
||||
#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,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#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);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#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;
|
||||
try
|
||||
{
|
||||
DB::StorageSystemNumbers table;
|
||||
|
||||
DB::ColumnNames column_names;
|
||||
column_names.push_back("numbers");
|
||||
DB::ColumnNames column_names;
|
||||
column_names.push_back("number");
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user