Skip to content

Commit 5189a33

Browse files
committed
Accept optimizations for mergeTreeAnalyzeIndexes() (non UUID version)
1 parent 166a4e0 commit 5189a33

1 file changed

Lines changed: 35 additions & 30 deletions

File tree

src/TableFunctions/TableFunctionMergeTreeAnalyzeIndexes.cpp

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class TableFunctionMergeTreeAnalyzeIndexes : public ITableFunction
108108
/// a) vector search with large vector indexes
109109
/// b) top-k using only minmax index (e.g SELECT * FROM youtube ORDER BY dislike_count LIMIT 10)
110110
/// These 2 cannot be packaged in the 'predicate'
111-
void parseArgumentsForOptimizations(const ASTs & args, ContextPtr context);
111+
void parseArgumentsForOptimizations(const ASTs & args, ContextPtr context, size_t start_index);
112112

113113
const bool resolve_by_uuid;
114114
StorageID source_table_id{StorageID::createEmpty()};
@@ -156,17 +156,21 @@ void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsUUID(const ASTs & args_
156156
parts = extractParts(args[2], context);
157157

158158
if (args.size() > 3)
159-
parseArgumentsForOptimizations(args, context);
159+
{
160+
if (args.size() < 5)
161+
throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Not enough arguments: no args_array for optimization");
162+
parseArgumentsForOptimizations(args, context, 3);
163+
}
160164

161165
source_table_id = StorageID{/*database=*/ "", /*table=*/ "", uuid};
162166
}
163167

164168
void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsDatabaseTable(const ASTs & args_func, ContextPtr context)
165169
{
166170
ASTs & args = args_func.at(0)->children;
167-
if (args.size() < 2 || args.size() > 4)
171+
if (args.size() < 2 || args.size() > 6)
168172
throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
169-
"Table function '{}' must have from 2 to 4 arguments (database, table, condition[, parts_array]), got: {}", getName(), args.size());
173+
"Table function '{}' must have from 2 to 4 or 6 arguments (database, table, condition[, parts_array], [, optimization, args_array]), got: {}", getName(), args.size());
170174

171175
args[0] = evaluateConstantExpressionForDatabaseName(args[0], context);
172176
auto database = checkAndGetLiteralArgument<String>(args[0], "database");
@@ -180,40 +184,41 @@ void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsDatabaseTable(const AST
180184
if (args.size() > 3)
181185
parts = extractParts(args[3], context);
182186

183-
if (args.size() > 3)
184-
parseArgumentsForOptimizations(args, context);
187+
if (args.size() > 4)
188+
{
189+
if (args.size() < 6)
190+
throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Not enough arguments: no args_array for optimization");
191+
parseArgumentsForOptimizations(args, context, 4);
192+
}
185193

186194
source_table_id = StorageID{database, table};
187195
}
188196

189-
void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsForOptimizations(const ASTs & args, ContextPtr context)
197+
void TableFunctionMergeTreeAnalyzeIndexes::parseArgumentsForOptimizations(const ASTs & args, ContextPtr context, size_t start_index)
190198
{
191-
if (args.size() == 5)
199+
auto optimization = checkAndGetLiteralArgument<String>(args[start_index++], "extra_optimization");
200+
if (optimization == "vector_search_index_analysis")
192201
{
193-
auto optimization = checkAndGetLiteralArgument<String>(args[3], "extra_optimization");
194-
if (optimization == "vector_search_index_analysis")
202+
auto cast_node = args[start_index++]->children.at(0);
203+
auto vector_search_args = evaluateConstantExpressionAsLiteral(cast_node->children.at(0), context)->as<ASTLiteral &>().value.safeGet<Array>();
204+
if (vector_search_args.size() != 6)
205+
throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
206+
"vector_search_index_analysis requires 6 arguments");
207+
208+
Array field_array = vector_search_args[3].safeGet<Array>();
209+
std::vector<Float64> reference_vector;
210+
for (const auto & field_array_value : field_array)
195211
{
196-
auto cast_node = args[4]->children.at(0);
197-
auto vector_search_args = evaluateConstantExpressionAsLiteral(cast_node->children.at(0), context)->as<ASTLiteral &>().value.safeGet<Array>();
198-
if (vector_search_args.size() != 6)
199-
throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
200-
"vector_search_index_analysis requires 6 arguments");
201-
202-
Array field_array = vector_search_args[3].safeGet<Array>();
203-
std::vector<Float64> reference_vector;
204-
for (const auto & field_array_value : field_array)
205-
{
206-
Float64 float64 = field_array_value.safeGet<Float64>();
207-
reference_vector.push_back(float64);
208-
}
209-
210-
vector_search_parameters = VectorSearchParameters{vector_search_args[0].safeGet<String>(), /// column
211-
vector_search_args[1].safeGet<String>(), /// distance function
212-
vector_search_args[2].safeGet<UInt64>(), /// limit
213-
reference_vector, /// search vector
214-
static_cast<bool>(vector_search_args[4].safeGet<bool>()), /// additional filters
215-
static_cast<bool>(vector_search_args[5].safeGet<bool>())}; /// return distances
212+
Float64 float64 = field_array_value.safeGet<Float64>();
213+
reference_vector.push_back(float64);
216214
}
215+
216+
vector_search_parameters = VectorSearchParameters{vector_search_args[0].safeGet<String>(), /// column
217+
vector_search_args[1].safeGet<String>(), /// distance function
218+
vector_search_args[2].safeGet<UInt64>(), /// limit
219+
reference_vector, /// search vector
220+
static_cast<bool>(vector_search_args[4].safeGet<bool>()), /// additional filters
221+
static_cast<bool>(vector_search_args[5].safeGet<bool>())}; /// return distances
217222
}
218223
}
219224

0 commit comments

Comments
 (0)