Range-specific hash schemas example: Using Kudu C++ client API

Review an example of using Kudu C++ client API to create a table with a range partition having range-specific hash schema and then alter the table, adding one more range with custom hash schema.

 // Define the column schema for the table.
  KuduSchema schema;
  {
    KuduSchemaBuilder b;
    b.AddColumn("key")->Type(KuduColumnSchema::INT32)->NotNull()->PrimaryKey();
    b.AddColumn("int_col")->Type(KuduColumnSchema::INT32)->NotNull();
    b.AddColumn("string_col")->Type(KuduColumnSchema::STRING);
    RETURN_NOT_OK(b.Build(&schema));
  }

  unique_ptr<KuduTableCreator> tc(client->NewTableCreator());
  // The table is range-partitioned by the ‘key’ column and has table-wide hash schema:
  // one-dimensional hash bucketing into two buckets by the ‘key’ column.
  table_creator->table_name("test")
      .schema(&schema)
      .add_hash_partitions({ "key" }, 2)
      .set_range_partition_columns({ "key" });

  // Add [0, 100) range partition with custom hash schema:
  // 5 buckets with hash based on the "key" column with hash seed 8.
  {
    unique_ptr<KuduPartialRow> lower(schema.NewRow());
    RETURN_NOT_OK(lower->SetInt32("key", 0));

    unique_ptr<KuduPartialRow> upper(schema.NewRow());
    RETURN_NOT_OK(upper->SetInt32("key", 100));

    unique_ptr<KuduRangePartition> p(
        new KuduRangePartition(lower.release(), upper.release()));
    RETURN_NOT_OK(p->add_hash_partitions({ "key" }, 5, 8));
    tc->add_custom_range_partition(p.release());
  }

  // Create the ‘test’ table with the specified column schema
  // and one range partition.
  RETURN_NOT_OK(tc->Create());

  // Open the table and work with it.
  shared_ptr<KuduTable> table;
  RETURN_NOT_OK(client->OpenTable("test", &table));
  . . .

  // Alter the table, adding a new range [100, 200) with range-specific hash
  // schema: 3 buckets with hash based on the "key" column with hash seed 1.
  {
    unique_ptr<KuduPartialRow> lower(schema.NewRow());
    RETURN_NOT_OK(lower->SetInt32("key", 222));

    unique_ptr<KuduPartialRow> upper(schema.NewRow());
    RETURN_NOT_OK(upper->SetInt32("key", 333));

    unique_ptr<KuduRangePartition> p(
        new KuduRangePartition(lower.release(), upper.release()));
    RETURN_NOT_OK(p->add_hash_partitions({ "key" }, 3, 1));

    unique_ptr<KuduTableAlterer> ta(client->NewTableAlterer(kTableName));
    ta->AddRangePartition(p.release());
    RETURN_NOT_OK(ta->Alter());
  }

  // NOTE: after adding or dropping a range with custom hash schemas
  //       it’s necessary to refresh the KuduTable handle
  RETURN_NOT_OK(client->OpenTable("test", &table));

  // Continue working with the table.
  . . .