mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-30 05:30:51 +00:00
index condition
This commit is contained in:
parent
06d8416107
commit
68c3879d95
@ -4,6 +4,7 @@
|
|||||||
#include <Core/Block.h>
|
#include <Core/Block.h>
|
||||||
#include <Core/Types.h>
|
#include <Core/Types.h>
|
||||||
#include <Core/NamesAndTypes.h>
|
#include <Core/NamesAndTypes.h>
|
||||||
|
#include <Storages/MergeTree/MergeTreeIndexes.h>
|
||||||
#include <Storages/MergeTree/MergeTreePartInfo.h>
|
#include <Storages/MergeTree/MergeTreePartInfo.h>
|
||||||
#include <Storages/MergeTree/MergeTreePartition.h>
|
#include <Storages/MergeTree/MergeTreePartition.h>
|
||||||
#include <Storages/MergeTree/MergeTreeDataPartChecksum.h>
|
#include <Storages/MergeTree/MergeTreeDataPartChecksum.h>
|
||||||
@ -207,6 +208,8 @@ struct MergeTreeDataPart
|
|||||||
|
|
||||||
MinMaxIndex minmax_idx;
|
MinMaxIndex minmax_idx;
|
||||||
|
|
||||||
|
MergeTreeIndexParts index_parts;
|
||||||
|
|
||||||
Checksums checksums;
|
Checksums checksums;
|
||||||
|
|
||||||
/// Columns description.
|
/// Columns description.
|
||||||
|
@ -886,7 +886,8 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange(
|
|||||||
Row index_left(used_key_size);
|
Row index_left(used_key_size);
|
||||||
Row index_right(used_key_size);
|
Row index_right(used_key_size);
|
||||||
|
|
||||||
while (!ranges_stack.empty())
|
while (!ranges_stack.empty())/// In other words, it removes subranges from whole range, that definitely could not contain required keys.
|
||||||
|
|
||||||
{
|
{
|
||||||
MarkRange range = ranges_stack.back();
|
MarkRange range = ranges_stack.back();
|
||||||
ranges_stack.pop_back();
|
ranges_stack.pop_back();
|
||||||
|
@ -7,8 +7,30 @@ namespace ErrorCodes
|
|||||||
{
|
{
|
||||||
extern const int LOGICAL_ERROR;
|
extern const int LOGICAL_ERROR;
|
||||||
extern const int INCORRECT_QUERY;
|
extern const int INCORRECT_QUERY;
|
||||||
|
extern const int UNKNOWN_EXCEPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MergeTreeIndexPart::update(const Block & block, const Names & column_names) {
|
||||||
|
updateImpl(block, column_names);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MergeTreeIndexPart::merge(const MergeTreeIndexPart & other) {
|
||||||
|
if (other.indexType() != indexType()) {
|
||||||
|
throw Exception("MergeTreeIndexPart: Merging index part with another index type.",
|
||||||
|
ErrorCodes::LOGICAL_ERROR);
|
||||||
|
}
|
||||||
|
mergeImpl(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
INDEX_TYPE MergeTreeIndexPart::indexType() const {
|
||||||
|
return owner->indexType();
|
||||||
|
}
|
||||||
|
|
||||||
|
INDEX_TYPE IndexCondition::indexType() const {
|
||||||
|
return owner->indexType();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MergeTreeIndexFactory::registerIndex(const std::string &name, Creator creator) {
|
void MergeTreeIndexFactory::registerIndex(const std::string &name, Creator creator) {
|
||||||
if (!indexes.emplace(name, std::move(creator)).second)
|
if (!indexes.emplace(name, std::move(creator)).second)
|
||||||
throw Exception("MergeTreeIndexFactory: the Index creator name '" + name + "' is not unique",
|
throw Exception("MergeTreeIndexFactory: the Index creator name '" + name + "' is not unique",
|
||||||
|
@ -6,42 +6,74 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <Core/Block.h>
|
#include <Core/Block.h>
|
||||||
#include <ext/singleton.h>
|
#include <ext/singleton.h>
|
||||||
|
#include <Storages/SelectQueryInfo.h>
|
||||||
|
#include <Storages/MergeTree/MarkRange.h>
|
||||||
#include <Interpreters/ExpressionActions.h>
|
#include <Interpreters/ExpressionActions.h>
|
||||||
#include <Parsers/ASTIndexDeclaration.h>
|
#include <Parsers/ASTIndexDeclaration.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
enum class INDEX_TYPES {
|
enum class INDEX_TYPE {
|
||||||
NONE = 0
|
NONE = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class MergeTreeIndex;
|
class MergeTreeIndex;
|
||||||
|
|
||||||
|
using MergeTreeIndexPtr = std::shared_ptr<MergeTreeIndex>;
|
||||||
|
using MergeTreeIndexes = std::vector<MergeTreeIndexPtr>;
|
||||||
|
|
||||||
|
|
||||||
|
/// Data structure storing some data for each MergeTreeDataPart
|
||||||
struct MergeTreeIndexPart
|
struct MergeTreeIndexPart
|
||||||
{
|
{
|
||||||
friend MergeTreeIndex;
|
friend MergeTreeIndex;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~MergeTreeIndexPart() {};
|
virtual ~MergeTreeIndexPart() = default;
|
||||||
|
|
||||||
virtual void update(const Block & block, const Names & column_names) = 0;
|
virtual INDEX_TYPE indexType() const;
|
||||||
virtual void merge(const MergeTreeIndexPart & other) = 0;
|
|
||||||
|
|
||||||
virtual INDEX_TYPES indexType() const {
|
void update(const Block & block, const Names & column_names);
|
||||||
return INDEX_TYPES::NONE;
|
void merge(const MergeTreeIndexPart & other);
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MergeTreeIndexPart() {};
|
MergeTreeIndexPart() = default;
|
||||||
|
|
||||||
|
virtual void updateImpl(const Block & block, const Names & column_names) = 0;
|
||||||
|
virtual void mergeImpl(const MergeTreeIndexPart & other) = 0;
|
||||||
|
|
||||||
|
MergeTreeIndexPtr owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
using MergeTreeIndexPartPtr = std::unique_ptr<MergeTreeIndexPart>;
|
using MergeTreeIndexPartPtr = std::shared_ptr<MergeTreeIndexPart>;
|
||||||
using MergeTreeIndexParts = std::vector<MergeTreeIndexPartPtr>;
|
using MergeTreeIndexParts = std::vector<MergeTreeIndexPartPtr>;
|
||||||
|
|
||||||
|
|
||||||
|
/// Condition on the index.
|
||||||
|
class IndexCondition {
|
||||||
|
friend MergeTreeIndex;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~IndexCondition() = default;
|
||||||
|
|
||||||
|
virtual INDEX_TYPE indexType() const;
|
||||||
|
|
||||||
|
// methods like KeyCondition
|
||||||
|
virtual bool alwaysUnknownOrTrue() const = 0;
|
||||||
|
virtual bool maybeTrueInRange(const MarkRange & range) const = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
IndexCondition() = default;
|
||||||
|
|
||||||
|
MergeTreeIndexPtr owner;
|
||||||
|
};
|
||||||
|
|
||||||
|
using IndexConditionPtr = std::shared_ptr<IndexCondition>;
|
||||||
|
|
||||||
|
|
||||||
|
/// Structure for storing index info like columns, expression, arguments, ...
|
||||||
class MergeTreeIndex
|
class MergeTreeIndex
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -50,22 +82,19 @@ public:
|
|||||||
|
|
||||||
virtual ~MergeTreeIndex() {};
|
virtual ~MergeTreeIndex() {};
|
||||||
|
|
||||||
virtual INDEX_TYPES indexType() const {
|
virtual INDEX_TYPE indexType() const = 0;
|
||||||
return INDEX_TYPES::NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool alwaysUnknownOrTrue() const = 0;
|
|
||||||
virtual bool maybeTrueOn(MergeTreeIndexPartPtr part) const = 0;
|
|
||||||
|
|
||||||
virtual MergeTreeIndexPartPtr createEmptyIndexPart() const = 0;
|
virtual MergeTreeIndexPartPtr createEmptyIndexPart() const = 0;
|
||||||
|
virtual IndexConditionPtr createIndexCondition(const SelectQueryInfo & query_info,
|
||||||
|
const Context & context,
|
||||||
|
const Names & key_column_names,
|
||||||
|
const ExpressionActionsPtr & key_expr) const = 0;
|
||||||
|
|
||||||
String name;
|
String name;
|
||||||
ExpressionActionsPtr expr;
|
ExpressionActionsPtr expr;
|
||||||
Block sample;
|
Block sample;
|
||||||
};
|
};
|
||||||
|
|
||||||
using MergeTreeIndexPtr = std::unique_ptr<MergeTreeIndex>;
|
|
||||||
using MergeTreeIndexes = std::vector<MergeTreeIndexPtr>;
|
|
||||||
|
|
||||||
class MergeTreeIndexFactory : public ext::singleton<MergeTreeIndexFactory>
|
class MergeTreeIndexFactory : public ext::singleton<MergeTreeIndexFactory>
|
||||||
{
|
{
|
||||||
@ -83,7 +112,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MergeTreeIndexFactory() {};
|
MergeTreeIndexFactory() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using Indexes = std::unordered_map<std::string, Creator>;
|
using Indexes = std::unordered_map<std::string, Creator>;
|
||||||
|
Loading…
Reference in New Issue
Block a user