From a7450fc77163ca9f6e631cd99609dd85608aace0 Mon Sep 17 00:00:00 2001 From: zherui cao Date: Thu, 9 Aug 2018 23:54:25 -0400 Subject: [PATCH] addusermetadata --- c++/include/orc/Writer.hh | 5 +++++ c++/src/Writer.cc | 8 ++++++++ c++/test/TestWriter.cc | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/c++/include/orc/Writer.hh b/c++/include/orc/Writer.hh index cdda922008..1284c65d87 100644 --- a/c++/include/orc/Writer.hh +++ b/c++/include/orc/Writer.hh @@ -209,6 +209,11 @@ namespace orc { * Close the write and flush any pending data to the output stream. */ virtual void close() = 0; + + /** + * Add user metadata to the writer. + */ + virtual void addUserMetadata(const std::string name, const std::string value) = 0; }; } diff --git a/c++/src/Writer.cc b/c++/src/Writer.cc index 3a563604a6..fee3318db7 100644 --- a/c++/src/Writer.cc +++ b/c++/src/Writer.cc @@ -232,6 +232,8 @@ namespace orc { void close() override; + void addUserMetadata(const std::string name, const std::string value) override; + private: void init(); void initStripe(); @@ -323,6 +325,12 @@ namespace orc { outStream->close(); } + void WriterImpl::addUserMetadata(const std::string name, const std::string value){ + proto::UserMetadataItem* userMetadataItem = fileFooter.add_metadata(); + userMetadataItem->set_name(name); + userMetadataItem->set_value(value); + } + void WriterImpl::init() { // Write file header outStream->write(WriterImpl::magicId, strlen(WriterImpl::magicId)); diff --git a/c++/test/TestWriter.cc b/c++/test/TestWriter.cc index c3788d2eee..437730a0d6 100644 --- a/c++/test/TestWriter.cc +++ b/c++/test/TestWriter.cc @@ -158,6 +158,8 @@ namespace orc { longBatch->numElements = 2000 - 1024; writer->add(*batch); + writer->addUserMetadata("name0","value0"); + writer->addUserMetadata("name1","value1"); writer->close(); std::unique_ptr inStream( @@ -172,6 +174,15 @@ namespace orc { EXPECT_TRUE(rowReader->next(*batch)); EXPECT_EQ(2000, batch->numElements); EXPECT_FALSE(rowReader->next(*batch)); + + std::list keys = reader->getMetadataKeys(); + EXPECT_EQ(keys.size(), 2); + std::list::const_iterator itr = keys.begin(); + EXPECT_EQ(*itr, "name0"); + EXPECT_EQ(reader->getMetadataValue(*itr), "value0"); + itr++; + EXPECT_EQ(*itr, "name1"); + EXPECT_EQ(reader->getMetadataValue(*itr), "value1"); for (uint64_t i = 0; i < 2000; ++i) { structBatch = dynamic_cast(batch.get());