This is an automated email from the ASF dual-hosted git repository. alexey pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kudu.git
commit 95abb8d6525d093b5961a7b9f2dc8c6193a47c33 Author: Alexey Serbin <[email protected]> AuthorDate: Fri Sep 19 11:48:47 2025 -0700 KUDU-1261 update C++ client example with array column Updated the Kudu C++ client application in examples/cpp/example.cc, adding ARRAY<INT64> column into the test table and populating it with data along with other already existing columns. Also, added an example of using KuduArrayCellView to access an array cell's data. Change-Id: I0769b2ff2ddb3b6d551091ae498e9ddeb00bd881 Reviewed-on: http://gerrit.cloudera.org:8080/23445 Tested-by: Alexey Serbin <[email protected]> Reviewed-by: Alexey Serbin <[email protected]> --- examples/cpp/example.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/examples/cpp/example.cc b/examples/cpp/example.cc index 84511cbea..22b7cb303 100644 --- a/examples/cpp/example.cc +++ b/examples/cpp/example.cc @@ -19,6 +19,7 @@ #include <iostream> #include <sstream> +#include "kudu/client/array_cell.h" #include "kudu/client/callbacks.h" #include "kudu/client/client.h" #include "kudu/client/row_result.h" @@ -28,6 +29,7 @@ #include "kudu/common/partial_row.h" #include "kudu/util/monotime.h" +using kudu::client::KuduArrayCellView; using kudu::client::KuduClient; using kudu::client::KuduClientBuilder; using kudu::client::KuduColumnSchema; @@ -62,13 +64,23 @@ static Status CreateClient(const vector<string>& master_addrs, } static KuduSchema CreateSchema() { - KuduSchema schema; KuduSchemaBuilder b; b.AddColumn("key")->Type(KuduColumnSchema::INT32)->NotNull()->PrimaryKey(); b.AddColumn("int_val")->Type(KuduColumnSchema::INT32)->NotNull(); b.AddColumn("string_val")->Type(KuduColumnSchema::STRING)->NotNull(); - b.AddColumn("non_null_with_default")->Type(KuduColumnSchema::INT32)->NotNull() - ->Default(KuduValue::FromInt(12345)); + b.AddColumn("non_null_with_default")-> + Type(KuduColumnSchema::INT32)-> + NotNull()-> + Default(KuduValue::FromInt(12345)); + + // In addition to scalar type columns, add one nullable nested type column + // to contain one-dimensional ararys of INT64 values. + const KuduColumnSchema::KuduArrayTypeDescriptor desc(KuduColumnSchema::INT64); + b.AddColumn("arr_int64")-> + Type(KuduColumnSchema::NESTED)-> + NestedType(KuduColumnSchema::KuduNestedTypeDescriptor(desc)); + + KuduSchema schema; KUDU_CHECK_OK(b.Build(&schema)); return schema; } @@ -140,6 +152,16 @@ static Status InsertRows(const shared_ptr<KuduTable>& table, int num_rows) { KUDU_CHECK_OK(row->SetInt32("key", i)); KUDU_CHECK_OK(row->SetInt32("integer_val", i * 2)); KUDU_CHECK_OK(row->SetInt32("non_null_with_default", i * 5)); + { + // An array with three values, two non-nulls and one null in the middle. + vector<int64_t> values(3, 0); + values[0] = i * 6; + values[2] = i * 7; + vector<bool> validity(3, false); + validity[0] = true; + validity[2] = true; + KUDU_CHECK_OK(row->SetArrayInt64("arr_int64", values, validity)); + } KUDU_CHECK_OK(session->Apply(insert)); } Status s = session->Flush(); @@ -208,6 +230,35 @@ static Status ScanRows(const shared_ptr<KuduTable>& table) { << next_row << " but got " << val; return Status::IOError(out.str()); } + + // An example of accessing a column by index in a row scan projection. + vector<int64_t> arr; + vector<bool> arr_notnull; + KUDU_RETURN_NOT_OK(row.GetArrayInt64(3, &arr, &arr_notnull)); + KUDU_CHECK(arr.size() == arr_notnull.size()); + + // An example of accessing raw cell data in an array column. + const void* cell_ptr = row.cell(3); + KuduArrayCellView view(cell_ptr); + KUDU_RETURN_NOT_OK(view.Init()); + KUDU_CHECK(view.elem_num() == arr.size()); + const uint8_t* arr_raw_notnull_bitmap = view.not_null_bitmap(); + KUDU_CHECK(arr_raw_notnull_bitmap); + const int64_t* arr_raw = reinterpret_cast<const int64_t*>( + view.data(KuduColumnSchema::INT64)); + KUDU_CHECK(arr_raw); + for (size_t i = 0; i < arr_notnull.size(); ++i) { + if (arr_notnull[i]) { + // That's the same data for non-null array elements regardless + // of the way accessing it. + KUDU_CHECK(arr[i] == *(arr_raw + i)); + } + // Check the validity bit: it should correspond to the boolean value + // at the same position in the 'arr_notnull' non-nullness array. + const bool arr_raw_elem_validity = + *(arr_raw_notnull_bitmap + (i >> 3)) & (1 << (i & 7)); + KUDU_CHECK(arr_notnull[i] == arr_raw_elem_validity); + } } } @@ -299,7 +350,7 @@ int main(int argc, char* argv[]) { bool exists; KUDU_CHECK_OK(DoesTableExist(client, kTableName, &exists)); if (exists) { - client->DeleteTable(kTableName); + KUDU_CHECK_OK(client->DeleteTable(kTableName)); KUDU_LOG(INFO) << "Deleting old table before creating new one"; } KUDU_CHECK_OK(CreateTable(client, kTableName, schema, 10));
