absl::Status SetVectorIndexOptions()

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();
}