From f70e38b9af518f67e37cde72039b563c9edb4273 Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Thu, 20 Jul 2017 18:00:33 +0300 Subject: [PATCH] fixed ColumnVisitor; added LogColumnTypesBlockInputStream --- dbms/src/Columns/ColumnImpl.h | 16 ++++ dbms/src/Columns/ColumnVisitor.h | 63 +++++++++++++++ dbms/src/Columns/Columns.h | 58 ++++++++++++++ dbms/src/Columns/IColumn.h | 4 +- .../LogColumnTypesBlockInputStream.h | 76 +++++++++++++++++++ .../Interpreters/InterpreterSelectQuery.cpp | 2 +- 6 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 dbms/src/Columns/ColumnImpl.h create mode 100644 dbms/src/Columns/ColumnVisitor.h create mode 100644 dbms/src/Columns/Columns.h create mode 100644 dbms/src/DataStreams/LogColumnTypesBlockInputStream.h diff --git a/dbms/src/Columns/ColumnImpl.h b/dbms/src/Columns/ColumnImpl.h new file mode 100644 index 0000000000..9558c1e56c --- /dev/null +++ b/dbms/src/Columns/ColumnImpl.h @@ -0,0 +1,16 @@ +#pragma once +#include +#include + +namespace DB +{ + +template +class ColumnImpl : public IColumn +{ +public: + void accept(ColumnVisitor & visitor) override { visitor.visit(*static_cast(this)); } + void accept(ColumnVisitor & visitor) const override { visitor.visit(*static_cast(this)); } +}; + +} diff --git a/dbms/src/Columns/ColumnVisitor.h b/dbms/src/Columns/ColumnVisitor.h new file mode 100644 index 0000000000..2d428efb30 --- /dev/null +++ b/dbms/src/Columns/ColumnVisitor.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include + +namespace DB +{ + +template +class Visitor; + +template <> +class Visitor<> +{ +public: + virtual ~Visitor() {} +}; + +template +class Visitor : public Visitor<> +{ +public: + virtual void visit(const Type &) = 0; + virtual void visit(Type &) = 0; +}; + +template +class Visitor : public Visitor +{ +public: + using Visitor::visit; + + virtual void visit(const Type &) = 0; + virtual void visit(Type &) = 0; +}; + +template +class VisitorImplHelper; + +template +class VisitorImplHelper : public VisitorBase {}; + +template +class VisitorImplHelper : public VisitorImplHelper +{ +public: + virtual void visit(const Type & value) override { static_cast(this)->visitImpl(value); } + virtual void visit(Type & value) override { static_cast(this)->visitImpl(value); } + +protected: + template + void visitImpl(const Type &) { throw Exception(std::string("visitImpl(const ") + typeid(T).name() + " &) is not implemented for class" + typeid(Derived).name()); } + + template + void visitImpl(Type &) { throw Exception(std::string("visitImpl(") + typeid(T).name() + " &) is not implemented for class" + typeid(Derived).name()); } +}; + +class ColumnVisitor : public DECLARE_WITH_COLUMNS_LIST(Visitor) {}; + +template +class ColumnVisitorImpl : public VisitorImplHelper {}; + +} diff --git a/dbms/src/Columns/Columns.h b/dbms/src/Columns/Columns.h new file mode 100644 index 0000000000..26c11d5049 --- /dev/null +++ b/dbms/src/Columns/Columns.h @@ -0,0 +1,58 @@ +#pragma once +#include +#include + +namespace DB +{ + +template +class ColumnVector; + +template +class ColumnConst; + +#define GET_COLUMN_VECTOR_TYPE(TYPE, M) M(ColumnVector< TYPE >) +#define COLUMN_VECTO_TYPE_LIST(M) APPLY_FOR_NUMBERS(GET_COLUMN_VECTOR_TYPE, M) +#define APPLY_FOR_COLUMN_VECTOR(M) COLUMN_VECTO_TYPE_LIST(M) M(ColumnVector) + +#define GET_COLUMN_CONST_TYPE(TYPE, M) M(ColumnConst< TYPE >) +#define COLUMN_CONST_TYPE_LIST(M) APPLY_FOR_NUMBERS(GET_COLUMN_CONST_TYPE, M) +#define APPLY_FOR_COLUMN_CONST(M) COLUMN_CONST_TYPE_LIST(M) M(ColumnConst) + +#define APPLY_FOR_NOT_TEMPLATE_COLUMNS(M) \ + M(ColumnString) \ + M(ColumnFixedString) \ + M(ColumnAggregateFunction) \ + M(ColumnArray) \ + M(ColumnConstAggregateFunction) \ + M(ColumnExpression) \ + M(ColumnNullable) \ + M(ColumnSet) \ + M(ColumnTuple) + +#define APPLY_FOR_COLUMNS(M) \ + APPLY_FOR_COLUMN_VECTOR(M) \ + APPLY_FOR_COLUMN_CONST(M) \ + APPLY_FOR_NOT_TEMPLATE_COLUMNS(M) + +#define DECLARE_COLUMNS(COLUMN) \ + class COLUMN ; + +APPLY_FOR_NOT_TEMPLATE_COLUMNS(DECLARE_COLUMNS); + +template +class ColumnConst; + +template +class ColumnVector; + + +#define MAKE_COLUMNS_LIST(COLUMN) COLUMN, + +#define COLUMN_LIST APPLY_FOR_COLUMNS(MAKE_COLUMNS_LIST) IColumn + +class IColumn; + +#define DECLARE_WITH_COLUMNS_LIST(CLASS) CLASS < COLUMN_LIST > + +} diff --git a/dbms/src/Columns/IColumn.h b/dbms/src/Columns/IColumn.h index 06bcf9a998..1f1b916019 100644 --- a/dbms/src/Columns/IColumn.h +++ b/dbms/src/Columns/IColumn.h @@ -252,8 +252,8 @@ public: virtual size_t allocatedBytes() const = 0; /// For visitors - void accept(ColumnVisitor &) { throw Exception("Accept not implemented"); } - void accept(ColumnVisitor &) const { throw Exception("Accept not implemented"); } + virtual void accept(ColumnVisitor &) { throw Exception("Accept not implemented"); } + virtual void accept(ColumnVisitor &) const { throw Exception("Accept not implemented"); } virtual ~IColumn() {} diff --git a/dbms/src/DataStreams/LogColumnTypesBlockInputStream.h b/dbms/src/DataStreams/LogColumnTypesBlockInputStream.h new file mode 100644 index 0000000000..05648a2b3f --- /dev/null +++ b/dbms/src/DataStreams/LogColumnTypesBlockInputStream.h @@ -0,0 +1,76 @@ + +#pragma once + +#include +#include +#include +#include + + +namespace DB +{ + +/** Removes the specified columns from the block. + */ +class LogColumnTypesBlockInputStream : public IProfilingBlockInputStream, public ColumnVisitorImpl +{ +public: + LogColumnTypesBlockInputStream( + BlockInputStreamPtr input_) : log(&Poco::Logger::get("LogColumnTypesBlockInputStream")) + { + children.push_back(input_); + } + + String getName() const override { return "LogColumnTypes"; } + + String getID() const override + { + std::stringstream res; + res << "LogColumnTypes"; + return res.str(); + } + +protected: + Block readImpl() override + { + Block res = children.back()->read(); + for (const auto & it : res.getColumns()) + it.column->accept(*this); + return res; + } + +public: + template + void visitImpl(T & column) { print_log(column); } + template + void visitImpl(const T & column) { print_log(column); } + +private: + void print_log(const ColumnString & column) + { + LOG_TRACE(log, typeid(ColumnString).name()); + } + + void print_log(ColumnString & column) + { + LOG_TRACE(log, typeid(ColumnString).name()); + } + + template + void print_log(T & column) + { + LOG_TRACE(log, " other type"); + } + + template + void print_log(const T & column) + { + LOG_TRACE(log, " other type"); + } + + + Names columns_to_remove; + Poco::Logger * log; +}; + +} diff --git a/dbms/src/Interpreters/InterpreterSelectQuery.cpp b/dbms/src/Interpreters/InterpreterSelectQuery.cpp index bc7bee0987..53b80698b7 100644 --- a/dbms/src/Interpreters/InterpreterSelectQuery.cpp +++ b/dbms/src/Interpreters/InterpreterSelectQuery.cpp @@ -45,6 +45,7 @@ #include #include +#include namespace ProfileEvents { @@ -353,7 +354,6 @@ Block InterpreterSelectQuery::getSampleBlock(const ASTPtr & query_ptr_, const Co return InterpreterSelectQuery(OnlyAnalyzeTag(), query_ptr_, context_).getSampleBlock(); } -#incldue BlockIO InterpreterSelectQuery::execute() { (void) executeWithoutUnion(); -- GitLab