mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-30 05:30:51 +00:00
58e5dad1a1
commite712f469a5
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:59:13 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit2a00282308
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:58:30 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit9e06f407c8
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:55:14 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit9581620f1e
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:54:22 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit2a8564c68c
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:47:34 2017 +0300 Less dependencies [#CLICKHOUSE-2] commitcf60632d78
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:40:09 2017 +0300 Less dependencies [#CLICKHOUSE-2] commitee3d1dc6e0
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:22:49 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit65592ef711
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:18:17 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit37972c2573
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:17:06 2017 +0300 Less dependencies [#CLICKHOUSE-2] commitdd909d1499
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:16:28 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit3cf43266ca
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:15:42 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit6731a3df96
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:13:35 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit1b5727e0d5
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:11:18 2017 +0300 Less dependencies [#CLICKHOUSE-2] commitbbcf726a55
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:09:04 2017 +0300 Less dependencies [#CLICKHOUSE-2] commitc03b477d5e
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:06:30 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit2986e2fb04
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:05:44 2017 +0300 Less dependencies [#CLICKHOUSE-2] commit5d6cdef13d
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:04:53 2017 +0300 Less dependencies [#CLICKHOUSE-2] commitf2b819b25c
Author: Alexey Milovidov <milovidov@yandex-team.ru> Date: Sat Jan 14 11:01:47 2017 +0300 Less dependencies [#CLICKHOUSE-2]
129 lines
4.8 KiB
C++
129 lines
4.8 KiB
C++
#pragma once
|
||
|
||
#include <Poco/RWLock.h>
|
||
#include <DB/Columns/ColumnArray.h>
|
||
#include <DB/Columns/ColumnConst.h>
|
||
#include <DB/DataStreams/IBlockInputStream.h>
|
||
#include <DB/Interpreters/Limits.h>
|
||
#include <DB/Interpreters/SetVariants.h>
|
||
#include <DB/Parsers/IAST.h>
|
||
#include <DB/Storages/MergeTree/BoolMask.h>
|
||
|
||
#include <common/logger_useful.h>
|
||
|
||
|
||
namespace DB
|
||
{
|
||
|
||
class Range;
|
||
|
||
|
||
/** Структура данных для реализации выражения IN.
|
||
*/
|
||
class Set
|
||
{
|
||
public:
|
||
Set(const Limits & limits) :
|
||
log(&Logger::get("Set")),
|
||
max_rows(limits.max_rows_in_set),
|
||
max_bytes(limits.max_bytes_in_set),
|
||
overflow_mode(limits.set_overflow_mode)
|
||
{
|
||
}
|
||
|
||
bool empty() const { return data.empty(); }
|
||
|
||
/** Создать множество по выражению (для перечисления в самом запросе).
|
||
* types - типы того, что стоит слева от IN.
|
||
* node - это список значений: 1, 2, 3 или список tuple-ов: (1, 2), (3, 4), (5, 6).
|
||
* create_ordered_set - создавать ли вектор упорядоченных элементов. Нужен для работы индекса
|
||
*/
|
||
void createFromAST(const DataTypes & types, ASTPtr node, const Context & context, bool create_ordered_set);
|
||
|
||
// Возвращает false, если превышено какое-нибудь ограничение, и больше не нужно вставлять.
|
||
bool insertFromBlock(const Block & block, bool create_ordered_set = false);
|
||
|
||
/** Для столбцов блока проверить принадлежность их значений множеству.
|
||
* Записать результат в столбец в позиции result.
|
||
*/
|
||
ColumnPtr execute(const Block & block, bool negative) const;
|
||
|
||
std::string describe() const;
|
||
|
||
/// проверяет есть ли в Set элементы для заданного диапазона индекса
|
||
BoolMask mayBeTrueInRange(const Range & range) const;
|
||
|
||
size_t getTotalRowCount() const { return data.getTotalRowCount(); }
|
||
size_t getTotalByteCount() const { return data.getTotalByteCount(); }
|
||
|
||
private:
|
||
Sizes key_sizes;
|
||
|
||
SetVariants data;
|
||
|
||
/** Типы данных, из которых было создано множество.
|
||
* При проверке на принадлежность множеству, типы проверяемых столбцов должны с ними совпадать.
|
||
*/
|
||
DataTypes data_types;
|
||
|
||
Logger * log;
|
||
|
||
/// Ограничения на максимальный размер множества
|
||
size_t max_rows;
|
||
size_t max_bytes;
|
||
OverflowMode overflow_mode;
|
||
|
||
/// Если в левой части IN стоит массив. Проверяем, что хоть один элемент массива лежит в множестве.
|
||
void executeArray(const ColumnArray * key_column, ColumnUInt8::Container_t & vec_res, bool negative) const;
|
||
|
||
/// Если в левой части набор столбцов тех же типов, что элементы множества.
|
||
void executeOrdinary(const ConstColumnPlainPtrs & key_columns, ColumnUInt8::Container_t & vec_res, bool negative) const;
|
||
|
||
/// Проверить не превышены ли допустимые размеры множества ключей
|
||
bool checkSetSizeLimits() const;
|
||
|
||
/// Вектор упорядоченных элементов Set.
|
||
/// Нужен для работы индекса по первичному ключу в операторе IN.
|
||
using OrderedSetElements = std::vector<Field>;
|
||
using OrderedSetElementsPtr = std::unique_ptr<OrderedSetElements>;
|
||
OrderedSetElementsPtr ordered_set_elements;
|
||
|
||
/** Защищает работу с множеством в функциях insertFromBlock и execute.
|
||
* Эти функции могут вызываться одновременно из разных потоков только при использовании StorageSet,
|
||
* и StorageSet вызывает только эти две функции.
|
||
* Поэтому остальные функции по работе с множеством, не защинены.
|
||
*/
|
||
mutable Poco::RWLock rwlock;
|
||
|
||
|
||
template <typename Method>
|
||
void insertFromBlockImpl(
|
||
Method & method,
|
||
const ConstColumnPlainPtrs & key_columns,
|
||
size_t rows,
|
||
SetVariants & variants);
|
||
|
||
template <typename Method>
|
||
void executeImpl(
|
||
Method & method,
|
||
const ConstColumnPlainPtrs & key_columns,
|
||
ColumnUInt8::Container_t & vec_res,
|
||
bool negative,
|
||
size_t rows) const;
|
||
|
||
template <typename Method>
|
||
void executeArrayImpl(
|
||
Method & method,
|
||
const ConstColumnPlainPtrs & key_columns,
|
||
const ColumnArray::Offsets_t & offsets,
|
||
ColumnUInt8::Container_t & vec_res,
|
||
bool negative,
|
||
size_t rows) const;
|
||
};
|
||
|
||
using SetPtr = std::shared_ptr<Set>;
|
||
using ConstSetPtr = std::shared_ptr<const Set>;
|
||
using Sets = std::vector<SetPtr>;
|
||
|
||
}
|