dbms: in refactoring [#METR-10498]

This commit is contained in:
Pavel Kartavyy 2014-04-10 12:57:01 +04:00
parent 076db911e8
commit 3974dd8e1d
6 changed files with 16 additions and 14 deletions

View File

@ -103,8 +103,7 @@ public:
Tables external_tables;
/// Создаем какие сможем Set из секции In для использования индекса по ним
/// ordered_set нужен если в In используется индекс
void makeExplicitSetsForIndex(bool create_ordered_set);
void makeSetsForIndex();
private:
typedef std::set<String> NamesSet;
@ -319,7 +318,7 @@ private:
void assertArrayJoin();
void makeExplicitSet(ASTFunction * node, const Block & sample_block, bool create_ordered_set);
void makeExplicitSetsRecursively(ASTPtr & node, const Block & sample_block, bool create_ordered_set);
void makeSetsForIndexRecursively(ASTPtr & node, const Block & sample_block);
};
}

View File

@ -260,6 +260,9 @@ public:
bool is_dropped;
/// Поддерживается ли индекс в секции In
virtual bool supportIndexforIn() { return false; };
protected:
IStorage() : is_dropped(false) {}

View File

@ -77,6 +77,8 @@ public:
void prepareAlterModify(const ASTAlterQuery::Parameters & params);
void commitAlterModify(const ASTAlterQuery::Parameters & params);
bool supportIndexforIn() { return true; }
private:
String path;
String name;

View File

@ -64,6 +64,8 @@ public:
*/
void drop() override;
bool supportIndexforIn() { return true; }
private:
friend class ReplicatedMergeTreeBlockOutputStream;

View File

@ -499,19 +499,16 @@ void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_as
finished_asts[initial_ast] = ast;
}
void ExpressionAnalyzer::makeExplicitSetsForIndex(bool create_ordered_set)
void ExpressionAnalyzer::makeSetsForIndex()
{
/// Для Remote, Distributed таблиц Set создавать не надо. Так как для передачи его все равно придется приобразовывать в текст
/// в formatAST, а использоваться он не будет
if (storage && ast &&
(dynamic_cast<StorageMergeTree *>(storage.get()) || dynamic_cast<StorageReplicatedMergeTree *>(storage.get())))
makeExplicitSetsRecursively(ast, storage->getSampleBlock(), create_ordered_set);
if (storage && ast && storage->supportIndexforIn())
makeSetsForIndexRecursively(ast, storage->getSampleBlock());
}
void ExpressionAnalyzer::makeExplicitSetsRecursively(ASTPtr & node, const Block & sample_block, bool create_ordered_set)
void ExpressionAnalyzer::makeSetsForIndexRecursively(ASTPtr & node, const Block & sample_block)
{
for (auto & child : node->children)
makeExplicitSetsRecursively(child, sample_block, create_ordered_set);
makeSetsForIndexRecursively(child, sample_block);
ASTFunction * func = dynamic_cast<ASTFunction *>(node.get());
if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
@ -523,7 +520,7 @@ void ExpressionAnalyzer::makeExplicitSetsRecursively(ASTPtr & node, const Block
{
try
{
makeExplicitSet(func, sample_block, create_ordered_set);
makeExplicitSet(func, sample_block, true);
}
catch (const DB::Exception & e)
{

View File

@ -501,8 +501,7 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns(BlockInpu
QueryProcessingStage::Enum from_stage = QueryProcessingStage::FetchColumns;
/// Создаем какие сможем In для использования в индексе. Внутри In создаем дополнительно сортированный вектор значений
query_analyzer->makeExplicitSetsForIndex(true);
query_analyzer->makeSetsForIndex();
/// Инициализируем изначальные потоки данных, на которые накладываются преобразования запроса. Таблица или подзапрос?
if (!interpreter_subquery)
{