This is an automated email from the ASF dual-hosted git repository.

apitrou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 85ea78de2b GH-48337: [C++][Parquet] Improve column encryption API 
(#48338)
85ea78de2b is described below

commit 85ea78de2b29f0833f36f16f37f08d1836dad548
Author: Antoine Pitrou <[email protected]>
AuthorDate: Mon Dec 8 08:41:57 2025 +0100

    GH-48337: [C++][Parquet] Improve column encryption API (#48338)
    
    ### Rationale for this change
    
    While working on PR #48336 I quickly got irritated by the clumsiness of the 
Parquet encryption configuration API. This issue attempts to reduce the 
verbosity of `ColumnEncryptionProperties` construction.
    
    ### What changes are included in this PR?
    
    1. Remove unused `column_path` member in `ColumnEncryptionProperties`
    2. Add convenience `ColumnEncryptionProperties` factory functions to avoid 
going through the clumsy `Builder` API
    
    ### Are these changes tested?
    
    Yes
    
    ### Are there any user-facing changes?
    
    Two deprecated constructors and a removed accessor for an useless property.
    
    **This PR includes breaking changes to public APIs.** (If there are any 
breaking changes to public APIs, please explain which changes are breaking. If 
not, you can remove this.)
    
    * GitHub Issue: #48337
    
    Authored-by: Antoine Pitrou <[email protected]>
    Signed-off-by: Antoine Pitrou <[email protected]>
---
 .../low_level_api/encryption_reader_writer.cc      |  11 +--
 .../encryption_reader_writer_all_crypto_options.cc |  51 ++++------
 cpp/src/parquet/encryption/crypto_factory.cc       |   2 +-
 cpp/src/parquet/encryption/encryption.cc           |  24 +++--
 cpp/src/parquet/encryption/encryption.h            |  29 +++---
 cpp/src/parquet/encryption/properties_test.cc      |  59 ++++++------
 .../encryption/write_configurations_test.cc        | 107 +++++++--------------
 7 files changed, 125 insertions(+), 158 deletions(-)

diff --git a/cpp/examples/parquet/low_level_api/encryption_reader_writer.cc 
b/cpp/examples/parquet/low_level_api/encryption_reader_writer.cc
index 8e39ca100f..bb7e953ca0 100644
--- a/cpp/examples/parquet/low_level_api/encryption_reader_writer.cc
+++ b/cpp/examples/parquet/low_level_api/encryption_reader_writer.cc
@@ -68,13 +68,10 @@ int main(int argc, char** argv) {
     auto column_path1 = schema_desc.Column(5)->path()->ToDotString();
     auto column_path2 = schema_desc.Column(4)->path()->ToDotString();
 
-    parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder0(column_path1);
-    parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder1(column_path2);
-    encryption_col_builder0.key(kColumnEncryptionKey1)->key_id("kc1");
-    encryption_col_builder1.key(kColumnEncryptionKey2)->key_id("kc2");
-
-    encryption_cols[column_path1] = encryption_col_builder0.build();
-    encryption_cols[column_path2] = encryption_col_builder1.build();
+    encryption_cols[column_path1] =
+        
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc1");
+    encryption_cols[column_path2] =
+        
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2, 
"kc2");
 
     parquet::FileEncryptionProperties::Builder file_encryption_builder(
         kFooterEncryptionKey);
diff --git 
a/cpp/examples/parquet/low_level_api/encryption_reader_writer_all_crypto_options.cc
 
b/cpp/examples/parquet/low_level_api/encryption_reader_writer_all_crypto_options.cc
index 435443098f..3bd5f8e67b 100644
--- 
a/cpp/examples/parquet/low_level_api/encryption_reader_writer_all_crypto_options.cc
+++ 
b/cpp/examples/parquet/low_level_api/encryption_reader_writer_all_crypto_options.cc
@@ -173,13 +173,10 @@ void InteropTestWriteEncryptedParquetFiles(std::string 
root_path) {
       encryption_cols2;
   std::string path1 = "double_field";
   std::string path2 = "float_field";
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_20(path1);
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_21(path2);
-  encryption_col_builder_20.key(kColumnEncryptionKey1)->key_id("kc1");
-  encryption_col_builder_21.key(kColumnEncryptionKey2)->key_id("kc2");
-
-  encryption_cols2[path1] = encryption_col_builder_20.build();
-  encryption_cols2[path2] = encryption_col_builder_21.build();
+  encryption_cols2[path1] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc1");
+  encryption_cols2[path2] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc2");
 
   parquet::FileEncryptionProperties::Builder file_encryption_builder_2(
       kFooterEncryptionKey);
@@ -194,13 +191,11 @@ void InteropTestWriteEncryptedParquetFiles(std::string 
root_path) {
   // (plaintext footer mode, readable by legacy readers)
   std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
       encryption_cols3;
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_30(path1);
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_31(path2);
-  encryption_col_builder_30.key(kColumnEncryptionKey1)->key_id("kc1");
-  encryption_col_builder_31.key(kColumnEncryptionKey2)->key_id("kc2");
+  encryption_cols3[path1] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc1");
+  encryption_cols3[path2] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc2");
 
-  encryption_cols3[path1] = encryption_col_builder_30.build();
-  encryption_cols3[path2] = encryption_col_builder_31.build();
   parquet::FileEncryptionProperties::Builder file_encryption_builder_3(
       kFooterEncryptionKey);
 
@@ -214,13 +209,11 @@ void InteropTestWriteEncryptedParquetFiles(std::string 
root_path) {
   // Use aad_prefix.
   std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
       encryption_cols4;
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_40(path1);
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_41(path2);
-  encryption_col_builder_40.key(kColumnEncryptionKey1)->key_id("kc1");
-  encryption_col_builder_41.key(kColumnEncryptionKey2)->key_id("kc2");
+  encryption_cols4[path1] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc1");
+  encryption_cols4[path2] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc2");
 
-  encryption_cols4[path1] = encryption_col_builder_40.build();
-  encryption_cols4[path2] = encryption_col_builder_41.build();
   parquet::FileEncryptionProperties::Builder file_encryption_builder_4(
       kFooterEncryptionKey);
 
@@ -234,13 +227,11 @@ void InteropTestWriteEncryptedParquetFiles(std::string 
root_path) {
   // Use aad_prefix and disable_aad_prefix_storage.
   std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
       encryption_cols5;
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_50(path1);
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_51(path2);
-  encryption_col_builder_50.key(kColumnEncryptionKey1)->key_id("kc1");
-  encryption_col_builder_51.key(kColumnEncryptionKey2)->key_id("kc2");
+  encryption_cols5[path1] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc1");
+  encryption_cols5[path2] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc2");
 
-  encryption_cols5[path1] = encryption_col_builder_50.build();
-  encryption_cols5[path2] = encryption_col_builder_51.build();
   parquet::FileEncryptionProperties::Builder file_encryption_builder_5(
       kFooterEncryptionKey);
 
@@ -255,13 +246,11 @@ void InteropTestWriteEncryptedParquetFiles(std::string 
root_path) {
   // Use AES_GCM_CTR_V1 algorithm.
   std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
       encryption_cols6;
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_60(path1);
-  parquet::ColumnEncryptionProperties::Builder 
encryption_col_builder_61(path2);
-  encryption_col_builder_60.key(kColumnEncryptionKey1)->key_id("kc1");
-  encryption_col_builder_61.key(kColumnEncryptionKey2)->key_id("kc2");
+  encryption_cols6[path1] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc1");
+  encryption_cols6[path2] =
+      
parquet::ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, 
"kc2");
 
-  encryption_cols6[path1] = encryption_col_builder_60.build();
-  encryption_cols6[path2] = encryption_col_builder_61.build();
   parquet::FileEncryptionProperties::Builder file_encryption_builder_6(
       kFooterEncryptionKey);
 
diff --git a/cpp/src/parquet/encryption/crypto_factory.cc 
b/cpp/src/parquet/encryption/crypto_factory.cc
index 50b0745378..dbfd20a1b7 100644
--- a/cpp/src/parquet/encryption/crypto_factory.cc
+++ b/cpp/src/parquet/encryption/crypto_factory.cc
@@ -156,7 +156,7 @@ ColumnPathToEncryptionPropertiesMap 
CryptoFactory::GetColumnEncryptionProperties
           key_wrapper->GetEncryptionKeyMetadata(column_key, column_key_id, 
false);
 
       std::shared_ptr<ColumnEncryptionProperties> cmd =
-          ColumnEncryptionProperties::Builder(column_name)
+          ColumnEncryptionProperties::Builder()
               .key(column_key)
               ->key_metadata(column_key_key_metadata)
               ->build();
diff --git a/cpp/src/parquet/encryption/encryption.cc 
b/cpp/src/parquet/encryption/encryption.cc
index 52c809aa2f..2f55176058 100644
--- a/cpp/src/parquet/encryption/encryption.cc
+++ b/cpp/src/parquet/encryption/encryption.cc
@@ -179,16 +179,12 @@ 
FileEncryptionProperties::Builder::disable_aad_prefix_storage() {
   return this;
 }
 
-ColumnEncryptionProperties::ColumnEncryptionProperties(bool encrypted,
-                                                       std::string column_path,
-                                                       SecureString key,
+ColumnEncryptionProperties::ColumnEncryptionProperties(bool encrypted, 
SecureString key,
                                                        std::string 
key_metadata)
-    : column_path_(std::move(column_path)),
-      encrypted_(encrypted),
+    : encrypted_(encrypted),
       encrypted_with_footer_key_(encrypted && key.empty()),
       key_(std::move(key)),
       key_metadata_(std::move(key_metadata)) {
-  DCHECK(!column_path_.empty());
   if (!encrypted) {
     DCHECK(key_.empty() && key_metadata_.empty());
   }
@@ -200,6 +196,22 @@ 
ColumnEncryptionProperties::ColumnEncryptionProperties(bool encrypted,
   }
 }
 
+std::shared_ptr<ColumnEncryptionProperties> 
ColumnEncryptionProperties::Unencrypted() {
+  return std::shared_ptr<ColumnEncryptionProperties>(
+      new ColumnEncryptionProperties(/*encrypted=*/false, {}, {}));
+}
+
+std::shared_ptr<ColumnEncryptionProperties> 
ColumnEncryptionProperties::WithFooterKey() {
+  return std::shared_ptr<ColumnEncryptionProperties>(
+      new ColumnEncryptionProperties(/*encrypted=*/true, {}, {}));
+}
+
+std::shared_ptr<ColumnEncryptionProperties> 
ColumnEncryptionProperties::WithColumnKey(
+    ::arrow::util::SecureString key, std::string key_metadata) {
+  return std::shared_ptr<ColumnEncryptionProperties>(new 
ColumnEncryptionProperties(
+      /*encrypted=*/true, std::move(key), std::move(key_metadata)));
+}
+
 ColumnDecryptionProperties::ColumnDecryptionProperties(std::string column_path,
                                                        SecureString key)
     : column_path_(std::move(column_path)), key_(std::move(key)) {
diff --git a/cpp/src/parquet/encryption/encryption.h 
b/cpp/src/parquet/encryption/encryption.h
index d822cc3c18..0828c20164 100644
--- a/cpp/src/parquet/encryption/encryption.h
+++ b/cpp/src/parquet/encryption/encryption.h
@@ -114,12 +114,13 @@ class PARQUET_EXPORT ColumnEncryptionProperties {
  public:
   class PARQUET_EXPORT Builder {
    public:
-    /// Convenience builder for encrypted columns.
-    explicit Builder(std::string name) : Builder(std::move(name), true) {}
+    PARQUET_DEPRECATED("name argument is ignored, use default constructor 
instead")
+    explicit Builder(const std::string& name) : encrypted_(true) {}
 
-    /// Convenience builder for encrypted columns.
-    explicit Builder(const schema::ColumnPath& path)
-        : Builder(path.ToDotString(), true) {}
+    PARQUET_DEPRECATED("path argument is ignored, use default constructor 
instead")
+    explicit Builder(const schema::ColumnPath& path) : encrypted_(true) {}
+
+    Builder() = default;
 
     /// Set a column-specific key.
     /// If key is not set on an encrypted column, the column will
@@ -140,33 +141,31 @@ class PARQUET_EXPORT ColumnEncryptionProperties {
 
     std::shared_ptr<ColumnEncryptionProperties> build() {
       return std::shared_ptr<ColumnEncryptionProperties>(
-          new ColumnEncryptionProperties(encrypted_, column_path_, key_, 
key_metadata_));
+          new ColumnEncryptionProperties(encrypted_, key_, key_metadata_));
     }
 
    private:
-    std::string column_path_;
-    bool encrypted_;
+    bool encrypted_ = true;
     ::arrow::util::SecureString key_;
     std::string key_metadata_;
-
-    Builder(std::string path, bool encrypted)
-        : column_path_(std::move(path)), encrypted_(encrypted) {}
   };
 
-  const std::string& column_path() const { return column_path_; }
   bool is_encrypted() const { return encrypted_; }
   bool is_encrypted_with_footer_key() const { return 
encrypted_with_footer_key_; }
   const ::arrow::util::SecureString& key() const { return key_; }
   const std::string& key_metadata() const { return key_metadata_; }
 
+  static std::shared_ptr<ColumnEncryptionProperties> Unencrypted();
+  static std::shared_ptr<ColumnEncryptionProperties> WithFooterKey();
+  static std::shared_ptr<ColumnEncryptionProperties> WithColumnKey(
+      ::arrow::util::SecureString key, std::string key_metadata = "");
+
  private:
-  std::string column_path_;
   bool encrypted_;
   bool encrypted_with_footer_key_;
   ::arrow::util::SecureString key_;
   std::string key_metadata_;
-  explicit ColumnEncryptionProperties(bool encrypted, std::string column_path,
-                                      ::arrow::util::SecureString key,
+  explicit ColumnEncryptionProperties(bool encrypted, 
::arrow::util::SecureString key,
                                       std::string key_metadata);
 };
 
diff --git a/cpp/src/parquet/encryption/properties_test.cc 
b/cpp/src/parquet/encryption/properties_test.cc
index 1ceda7ac03..262aa87904 100644
--- a/cpp/src/parquet/encryption/properties_test.cc
+++ b/cpp/src/parquet/encryption/properties_test.cc
@@ -25,13 +25,19 @@
 namespace parquet::encryption::test {
 
 TEST(TestColumnEncryptionProperties, ColumnEncryptedWithOwnKey) {
-  std::string column_path_1 = "column_1";
-  ColumnEncryptionProperties::Builder column_builder_1(column_path_1);
+  ColumnEncryptionProperties::Builder column_builder_1;
   column_builder_1.key(kColumnEncryptionKey1);
   column_builder_1.key_id("kc1");
   std::shared_ptr<ColumnEncryptionProperties> column_props_1 = 
column_builder_1.build();
 
-  ASSERT_EQ(column_path_1, column_props_1->column_path());
+  ASSERT_EQ(true, column_props_1->is_encrypted());
+  ASSERT_EQ(false, column_props_1->is_encrypted_with_footer_key());
+  ASSERT_EQ(kColumnEncryptionKey1, column_props_1->key());
+  ASSERT_EQ("kc1", column_props_1->key_metadata());
+
+  // Same with shorthand API
+  column_props_1 =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, "kc1");
   ASSERT_EQ(true, column_props_1->is_encrypted());
   ASSERT_EQ(false, column_props_1->is_encrypted_with_footer_key());
   ASSERT_EQ(kColumnEncryptionKey1, column_props_1->key());
@@ -39,15 +45,26 @@ TEST(TestColumnEncryptionProperties, 
ColumnEncryptedWithOwnKey) {
 }
 
 TEST(TestColumnEncryptionProperties, ColumnEncryptedWithFooterKey) {
-  std::string column_path_1 = "column_1";
-  ColumnEncryptionProperties::Builder column_builder_1(column_path_1);
+  ColumnEncryptionProperties::Builder column_builder_1;
   std::shared_ptr<ColumnEncryptionProperties> column_props_1 = 
column_builder_1.build();
 
-  ASSERT_EQ(column_path_1, column_props_1->column_path());
+  ASSERT_EQ(true, column_props_1->is_encrypted());
+  ASSERT_EQ(true, column_props_1->is_encrypted_with_footer_key());
+
+  // Same with shorthand API
+  column_props_1 = ColumnEncryptionProperties::WithFooterKey();
   ASSERT_EQ(true, column_props_1->is_encrypted());
   ASSERT_EQ(true, column_props_1->is_encrypted_with_footer_key());
 }
 
+TEST(TestColumnEncryptionProperties, UnencryptedColumn) {
+  ColumnEncryptionProperties::Builder column_builder_1;
+
+  auto column_props_1 = ColumnEncryptionProperties::Unencrypted();
+  ASSERT_EQ(false, column_props_1->is_encrypted());
+  ASSERT_EQ(false, column_props_1->is_encrypted_with_footer_key());
+}
+
 // Encrypt all columns and the footer with the same key.
 // (uniform encryption)
 TEST(TestEncryptionProperties, UniformEncryption) {
@@ -74,19 +91,14 @@ TEST(TestEncryptionProperties, UniformEncryption) {
 TEST(TestEncryptionProperties, EncryptFooterAndTwoColumns) {
   std::shared_ptr<parquet::schema::ColumnPath> column_path_1 =
       parquet::schema::ColumnPath::FromDotString("column_1");
-  ColumnEncryptionProperties::Builder 
column_builder_1(column_path_1->ToDotString());
-  column_builder_1.key(kColumnEncryptionKey1);
-  column_builder_1.key_id("kc1");
-
   std::shared_ptr<parquet::schema::ColumnPath> column_path_2 =
       parquet::schema::ColumnPath::FromDotString("column_2");
-  ColumnEncryptionProperties::Builder 
column_builder_2(column_path_2->ToDotString());
-  column_builder_2.key(kColumnEncryptionKey2);
-  column_builder_2.key_id("kc2");
 
   std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encrypted_columns;
-  encrypted_columns[column_path_1->ToDotString()] = column_builder_1.build();
-  encrypted_columns[column_path_2->ToDotString()] = column_builder_2.build();
+  encrypted_columns[column_path_1->ToDotString()] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, "kc1");
+  encrypted_columns[column_path_2->ToDotString()] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2, "kc2");
 
   FileEncryptionProperties::Builder builder(kFooterEncryptionKey);
   builder.footer_key_metadata("kf");
@@ -100,7 +112,6 @@ TEST(TestEncryptionProperties, EncryptFooterAndTwoColumns) {
   std::shared_ptr<ColumnEncryptionProperties> out_col_props_1 =
       props->column_encryption_properties(column_path_1->ToDotString());
 
-  ASSERT_EQ(column_path_1->ToDotString(), out_col_props_1->column_path());
   ASSERT_EQ(true, out_col_props_1->is_encrypted());
   ASSERT_EQ(false, out_col_props_1->is_encrypted_with_footer_key());
   ASSERT_EQ(kColumnEncryptionKey1, out_col_props_1->key());
@@ -109,7 +120,6 @@ TEST(TestEncryptionProperties, EncryptFooterAndTwoColumns) {
   std::shared_ptr<ColumnEncryptionProperties> out_col_props_2 =
       props->column_encryption_properties(column_path_2->ToDotString());
 
-  ASSERT_EQ(column_path_2->ToDotString(), out_col_props_2->column_path());
   ASSERT_EQ(true, out_col_props_2->is_encrypted());
   ASSERT_EQ(false, out_col_props_2->is_encrypted_with_footer_key());
   ASSERT_EQ(kColumnEncryptionKey2, out_col_props_2->key());
@@ -128,19 +138,14 @@ TEST(TestEncryptionProperties, 
EncryptFooterAndTwoColumns) {
 TEST(TestEncryptionProperties, EncryptTwoColumnsNotFooter) {
   std::shared_ptr<parquet::schema::ColumnPath> column_path_1 =
       parquet::schema::ColumnPath::FromDotString("column_1");
-  ColumnEncryptionProperties::Builder column_builder_1(*column_path_1);
-  column_builder_1.key(kColumnEncryptionKey1);
-  column_builder_1.key_id("kc1");
-
   std::shared_ptr<parquet::schema::ColumnPath> column_path_2 =
       parquet::schema::ColumnPath::FromDotString("column_2");
-  ColumnEncryptionProperties::Builder column_builder_2(*column_path_2);
-  column_builder_2.key(kColumnEncryptionKey2);
-  column_builder_2.key_id("kc2");
 
   std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encrypted_columns;
-  encrypted_columns[column_path_1->ToDotString()] = column_builder_1.build();
-  encrypted_columns[column_path_2->ToDotString()] = column_builder_2.build();
+  encrypted_columns[column_path_1->ToDotString()] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1, "kc1");
+  encrypted_columns[column_path_2->ToDotString()] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2, "kc2");
 
   FileEncryptionProperties::Builder builder(kFooterEncryptionKey);
   builder.footer_key_metadata("kf");
@@ -155,7 +160,6 @@ TEST(TestEncryptionProperties, EncryptTwoColumnsNotFooter) {
   std::shared_ptr<ColumnEncryptionProperties> out_col_props_1 =
       props->column_encryption_properties(column_path_1->ToDotString());
 
-  ASSERT_EQ(column_path_1->ToDotString(), out_col_props_1->column_path());
   ASSERT_EQ(true, out_col_props_1->is_encrypted());
   ASSERT_EQ(false, out_col_props_1->is_encrypted_with_footer_key());
   ASSERT_EQ(kColumnEncryptionKey1, out_col_props_1->key());
@@ -164,7 +168,6 @@ TEST(TestEncryptionProperties, EncryptTwoColumnsNotFooter) {
   std::shared_ptr<ColumnEncryptionProperties> out_col_props_2 =
       props->column_encryption_properties(column_path_2->ToDotString());
 
-  ASSERT_EQ(column_path_2->ToDotString(), out_col_props_2->column_path());
   ASSERT_EQ(true, out_col_props_2->is_encrypted());
   ASSERT_EQ(false, out_col_props_2->is_encrypted_with_footer_key());
   ASSERT_EQ(kColumnEncryptionKey2, out_col_props_2->key());
diff --git a/cpp/src/parquet/encryption/write_configurations_test.cc 
b/cpp/src/parquet/encryption/write_configurations_test.cc
index ae86b51242..5b22c49612 100644
--- a/cpp/src/parquet/encryption/write_configurations_test.cc
+++ b/cpp/src/parquet/encryption/write_configurations_test.cc
@@ -81,9 +81,8 @@ class TestEncryptionConfiguration : public ::testing::Test {
   SecureString kColumnEncryptionKey2_ = kColumnEncryptionKey2;
   std::string kFileName_ = std::string(kFileName);
 
-  void EncryptFile(
-      std::shared_ptr<parquet::FileEncryptionProperties> 
encryption_configurations,
-      std::string file_name) {
+  void EncryptFile(std::shared_ptr<FileEncryptionProperties> 
encryption_configurations,
+                   std::string file_name) {
     std::string file = temp_dir->path().ToString() + file_name;
     encryptor_.EncryptFile(file, encryption_configurations);
   }
@@ -92,8 +91,7 @@ class TestEncryptionConfiguration : public ::testing::Test {
 // Encryption configuration 1: Encrypt all columns and the footer with the 
same key.
 // (uniform encryption)
 TEST_F(TestEncryptionConfiguration, UniformEncryption) {
-  parquet::FileEncryptionProperties::Builder file_encryption_builder_1(
-      kFooterEncryptionKey_);
+  FileEncryptionProperties::Builder 
file_encryption_builder_1(kFooterEncryptionKey_);
 
   
this->EncryptFile(file_encryption_builder_1.footer_key_metadata("kf")->build(),
                     "tmp_uniform_encryption.parquet.encrypted");
@@ -101,20 +99,13 @@ TEST_F(TestEncryptionConfiguration, UniformEncryption) {
 
 // Encryption configuration 2: Encrypt two columns and the footer, with 
different keys.
 TEST_F(TestEncryptionConfiguration, EncryptTwoColumnsAndTheFooter) {
-  std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
-      encryption_cols2;
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_20(
-      path_to_double_field_);
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_21(
-      path_to_float_field_);
-  encryption_col_builder_20.key(kColumnEncryptionKey1_)->key_id("kc1");
-  encryption_col_builder_21.key(kColumnEncryptionKey2_)->key_id("kc2");
+  std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encryption_cols2;
+  encryption_cols2[path_to_double_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1_, "kc1");
+  encryption_cols2[path_to_float_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2_, "kc2");
 
-  encryption_cols2[path_to_double_field_] = encryption_col_builder_20.build();
-  encryption_cols2[path_to_float_field_] = encryption_col_builder_21.build();
-
-  parquet::FileEncryptionProperties::Builder file_encryption_builder_2(
-      kFooterEncryptionKey_);
+  FileEncryptionProperties::Builder 
file_encryption_builder_2(kFooterEncryptionKey_);
 
   this->EncryptFile(file_encryption_builder_2.footer_key_metadata("kf")
                         ->encrypted_columns(std::move(encryption_cols2))
@@ -126,19 +117,13 @@ TEST_F(TestEncryptionConfiguration, 
EncryptTwoColumnsAndTheFooter) {
 // Don’t encrypt footer.
 // (plaintext footer mode, readable by legacy readers)
 TEST_F(TestEncryptionConfiguration, EncryptTwoColumnsWithPlaintextFooter) {
-  std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
-      encryption_cols3;
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_30(
-      path_to_double_field_);
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_31(
-      path_to_float_field_);
-  encryption_col_builder_30.key(kColumnEncryptionKey1_)->key_id("kc1");
-  encryption_col_builder_31.key(kColumnEncryptionKey2_)->key_id("kc2");
-
-  encryption_cols3[path_to_double_field_] = encryption_col_builder_30.build();
-  encryption_cols3[path_to_float_field_] = encryption_col_builder_31.build();
-  parquet::FileEncryptionProperties::Builder file_encryption_builder_3(
-      kFooterEncryptionKey_);
+  std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encryption_cols3;
+  encryption_cols3[path_to_double_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1_, "kc1");
+  encryption_cols3[path_to_float_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2_, "kc2");
+
+  FileEncryptionProperties::Builder 
file_encryption_builder_3(kFooterEncryptionKey_);
 
   this->EncryptFile(file_encryption_builder_3.footer_key_metadata("kf")
                         ->encrypted_columns(std::move(encryption_cols3))
@@ -150,19 +135,13 @@ TEST_F(TestEncryptionConfiguration, 
EncryptTwoColumnsWithPlaintextFooter) {
 // Encryption configuration 4: Encrypt two columns and the footer, with 
different keys.
 // Use aad_prefix.
 TEST_F(TestEncryptionConfiguration, EncryptTwoColumnsAndFooterWithAadPrefix) {
-  std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
-      encryption_cols4;
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_40(
-      path_to_double_field_);
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_41(
-      path_to_float_field_);
-  encryption_col_builder_40.key(kColumnEncryptionKey1_)->key_id("kc1");
-  encryption_col_builder_41.key(kColumnEncryptionKey2_)->key_id("kc2");
-
-  encryption_cols4[path_to_double_field_] = encryption_col_builder_40.build();
-  encryption_cols4[path_to_float_field_] = encryption_col_builder_41.build();
-  parquet::FileEncryptionProperties::Builder file_encryption_builder_4(
-      kFooterEncryptionKey_);
+  std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encryption_cols4;
+  encryption_cols4[path_to_double_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1_, "kc1");
+  encryption_cols4[path_to_float_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2_, "kc2");
+
+  FileEncryptionProperties::Builder 
file_encryption_builder_4(kFooterEncryptionKey_);
 
   this->EncryptFile(file_encryption_builder_4.footer_key_metadata("kf")
                         ->encrypted_columns(std::move(encryption_cols4))
@@ -175,19 +154,13 @@ TEST_F(TestEncryptionConfiguration, 
EncryptTwoColumnsAndFooterWithAadPrefix) {
 // Use aad_prefix and disable_aad_prefix_storage.
 TEST_F(TestEncryptionConfiguration,
        EncryptTwoColumnsAndFooterWithAadPrefixDisable_aad_prefix_storage) {
-  std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
-      encryption_cols5;
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_50(
-      path_to_double_field_);
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_51(
-      path_to_float_field_);
-  encryption_col_builder_50.key(kColumnEncryptionKey1_)->key_id("kc1");
-  encryption_col_builder_51.key(kColumnEncryptionKey2_)->key_id("kc2");
-
-  encryption_cols5[path_to_double_field_] = encryption_col_builder_50.build();
-  encryption_cols5[path_to_float_field_] = encryption_col_builder_51.build();
-  parquet::FileEncryptionProperties::Builder file_encryption_builder_5(
-      kFooterEncryptionKey_);
+  std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encryption_cols5;
+  encryption_cols5[path_to_double_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1_, "kc1");
+  encryption_cols5[path_to_float_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2_, "kc2");
+
+  FileEncryptionProperties::Builder 
file_encryption_builder_5(kFooterEncryptionKey_);
 
   this->EncryptFile(
       file_encryption_builder_5.encrypted_columns(std::move(encryption_cols5))
@@ -201,19 +174,13 @@ TEST_F(TestEncryptionConfiguration,
 // Encryption configuration 6: Encrypt two columns and the footer, with 
different keys.
 // Use AES_GCM_CTR_V1 algorithm.
 TEST_F(TestEncryptionConfiguration, EncryptTwoColumnsAndFooterUseAES_GCM_CTR) {
-  std::map<std::string, std::shared_ptr<parquet::ColumnEncryptionProperties>>
-      encryption_cols6;
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_60(
-      path_to_double_field_);
-  parquet::ColumnEncryptionProperties::Builder encryption_col_builder_61(
-      path_to_float_field_);
-  encryption_col_builder_60.key(kColumnEncryptionKey1_)->key_id("kc1");
-  encryption_col_builder_61.key(kColumnEncryptionKey2_)->key_id("kc2");
-
-  encryption_cols6[path_to_double_field_] = encryption_col_builder_60.build();
-  encryption_cols6[path_to_float_field_] = encryption_col_builder_61.build();
-  parquet::FileEncryptionProperties::Builder file_encryption_builder_6(
-      kFooterEncryptionKey_);
+  std::map<std::string, std::shared_ptr<ColumnEncryptionProperties>> 
encryption_cols6;
+  encryption_cols6[path_to_double_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey1_, "kc1");
+  encryption_cols6[path_to_float_field_] =
+      ColumnEncryptionProperties::WithColumnKey(kColumnEncryptionKey2_, "kc2");
+
+  FileEncryptionProperties::Builder 
file_encryption_builder_6(kFooterEncryptionKey_);
 
   EXPECT_NO_THROW(
       this->EncryptFile(file_encryption_builder_6.footer_key_metadata("kf")

Reply via email to