in backend/schema/updater/schema_updater.cc [3504:3567]
absl::Status SetVectorIndexOptions(
std::string_view sdl_name,
const ::google::protobuf::RepeatedPtrField<ddl::SetOption>& set_options,
Index::Builder* modifier) {
std::string error;
ddl::VectorIndexOptionsProto vector_index_options;
if (!ApplyOptions("Vector Index", sdl_name, set_options,
&vector_index_options, &error)) {
return error::OptionsError(error);
}
int tree_depth = vector_index_options.tree_depth();
if (tree_depth != 2 && tree_depth != 3) {
return error::OptionsError("vector index tree depth must be 2 or 3.");
}
if (vector_index_options.has_num_leaves() &&
vector_index_options.num_leaves() <= 0) {
return error::OptionsError("vector index num_leaves must be > 0.");
}
if (vector_index_options.has_num_branches() &&
vector_index_options.num_branches() <= 0) {
return error::OptionsError("vector index num_branches must be > 0.");
}
if (vector_index_options.has_num_branches() &&
vector_index_options.has_num_leaves()) {
if (vector_index_options.num_branches() >
vector_index_options.num_leaves()) {
return error::OptionsError(
"num_leaves cannot be fewer than num_branches.");
}
}
if (vector_index_options.has_distance_type()) {
ddl::VectorIndexOptionsProto::DistanceType distance_type;
if (!ddl::VectorIndexOptionsProto::DistanceType_Parse(
vector_index_options.distance_type(), &distance_type) ||
distance_type ==
ddl::VectorIndexOptionsProto::DISTANCE_TYPE_UNSPECIFIED) {
return error::OptionsError(
absl::StrCat("The distance_type of ", sdl_name, " is invalid."));
}
}
if (vector_index_options.has_leaf_scatter_factor()) {
if (vector_index_options.leaf_scatter_factor() < 0) {
return error::OptionsError(
"vector index leaf_scatter_factor must be >= 0.");
}
if (vector_index_options.leaf_scatter_factor() > 32) {
return error::OptionsError(
"vector index leaf_scatter_factor must be <= 32.");
}
}
if (vector_index_options.has_min_branch_splits()) {
if (vector_index_options.min_branch_splits() <= 0) {
return error::OptionsError("vector index min_branch_splits must be > 0.");
}
}
if (vector_index_options.has_min_leaf_splits()) {
if (vector_index_options.min_leaf_splits() <= 0) {
return error::OptionsError("vector index min_leaf_splits must be > 0.");
}
}
modifier->set_vector_index_options(vector_index_options);
return absl::OkStatus();
}