ClickHouse/dbms/include/DB/Interpreters/Set.h

125 lines
4.9 KiB
C++
Raw Normal View History

2012-08-22 20:29:01 +00:00
#pragma once
#include <DB/Columns/ColumnArray.h>
#include <DB/Columns/ColumnConst.h>
2012-08-23 23:49:28 +00:00
#include <DB/DataStreams/IBlockInputStream.h>
#include <DB/Interpreters/Limits.h>
#include <DB/Interpreters/SetVariants.h>
#include <DB/Parsers/IAST.h>
2014-03-26 18:19:25 +00:00
#include <DB/Storages/MergeTree/BoolMask.h>
#include <DB/Storages/MergeTree/PKCondition.h>
2012-08-22 20:29:01 +00:00
#include <common/logger_useful.h>
namespace DB
{
2012-08-22 20:29:01 +00:00
/** Структура данных для реализации выражения IN.
*/
2012-08-23 22:40:51 +00:00
class Set
2012-08-22 20:29:01 +00:00
{
2012-08-23 22:40:51 +00:00
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(); }
2012-08-23 20:22:44 +00:00
2012-08-24 19:42:03 +00:00
/** Создать множество по выражению (для перечисления в самом запросе).
* types - типы того, что стоит слева от IN.
* node - это список значений: 1, 2, 3 или список tuple-ов: (1, 2), (3, 4), (5, 6).
2014-04-08 12:54:32 +00:00
* create_ordered_set - создавать ли вектор упорядоченных элементов. Нужен для работы индекса
2012-08-24 19:42:03 +00:00
*/
void createFromAST(const DataTypes & types, ASTPtr node, const Context & context, bool create_ordered_set);
// Возвращает false, если превышено какое-нибудь ограничение, и больше не нужно вставлять.
2015-01-27 00:52:03 +00:00
bool insertFromBlock(const Block & block, bool create_ordered_set = false);
/** Для столбцов блока проверить принадлежность их значений множеству.
2012-08-23 20:22:44 +00:00
* Записать результат в столбец в позиции result.
*/
ColumnPtr execute(const Block & block, bool negative) const;
2014-03-26 10:56:21 +00:00
std::string describe() const;
2014-04-01 10:09:22 +00:00
2014-04-08 12:54:32 +00:00
/// проверяет есть ли в Set элементы для заданного диапазона индекса
2015-03-27 03:37:46 +00:00
BoolMask mayBeTrueInRange(const Range & range) const;
size_t getTotalRowCount() const { return data.getTotalRowCount(); }
size_t getTotalByteCount() const { return data.getTotalByteCount(); }
2012-08-23 20:22:44 +00:00
private:
Sizes key_sizes;
2012-08-23 22:40:51 +00:00
SetVariants data;
2012-08-23 22:40:51 +00:00
/** Типы данных, из которых было создано множество.
* При проверке на принадлежность множеству, типы проверяемых столбцов должны с ними совпадать.
*/
DataTypes data_types;
2012-08-23 20:22:44 +00:00
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>;
2014-04-08 12:54:32 +00:00
OrderedSetElementsPtr ordered_set_elements;
2015-01-27 00:52:03 +00:00
/** Защищает работу с множеством в функциях 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;
2012-08-22 20:29:01 +00:00
};
using SetPtr = std::shared_ptr<Set>;
using ConstSetPtr = std::shared_ptr<const Set>;
using Sets = std::vector<SetPtr>;
2012-08-22 20:29:01 +00:00
}