1#pragma once
2
3#include <DataStreams/IBlockInputStream.h>
4#include <iostream>
5
6namespace DB
7{
8
9/// Removes columns other than columns_to_save_ from block,
10/// and reorders columns as in columns_to_save_.
11/// Functionality is similar to ExpressionBlockInputStream with ExpressionActions containing PROJECT action.
12class FilterColumnsBlockInputStream : public IBlockInputStream
13{
14public:
15 FilterColumnsBlockInputStream(
16 const BlockInputStreamPtr & input, const Names & columns_to_save_, bool throw_if_column_not_found_)
17 : columns_to_save(columns_to_save_), throw_if_column_not_found(throw_if_column_not_found_)
18 {
19 children.push_back(input);
20 }
21
22 String getName() const override
23 {
24 return "FilterColumns";
25 }
26
27 Block getHeader() const override;
28
29protected:
30 Block readImpl() override;
31
32private:
33 Names columns_to_save;
34 bool throw_if_column_not_found;
35};
36
37}
38