Repository: orc Updated Branches: refs/heads/master 114f10448 -> 2aa7e5248
ORC-394: Add addUserMetadata() function to C++ write Fixes #300 Signed-off-by: Deepak Majeti <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/orc/repo Commit: http://git-wip-us.apache.org/repos/asf/orc/commit/2aa7e524 Tree: http://git-wip-us.apache.org/repos/asf/orc/tree/2aa7e524 Diff: http://git-wip-us.apache.org/repos/asf/orc/diff/2aa7e524 Branch: refs/heads/master Commit: 2aa7e52484b592702b5808f08134fa5bb1b4e665 Parents: 114f104 Author: zherui cao <[email protected]> Authored: Thu Aug 9 23:54:25 2018 -0400 Committer: Deepak Majeti <[email protected]> Committed: Sun Aug 12 08:42:44 2018 -0400 ---------------------------------------------------------------------- c++/include/orc/Writer.hh | 5 +++++ c++/src/Writer.cc | 8 ++++++++ c++/test/TestWriter.cc | 11 +++++++++++ 3 files changed, 24 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/orc/blob/2aa7e524/c++/include/orc/Writer.hh ---------------------------------------------------------------------- diff --git a/c++/include/orc/Writer.hh b/c++/include/orc/Writer.hh index cdda922..1284c65 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; }; } http://git-wip-us.apache.org/repos/asf/orc/blob/2aa7e524/c++/src/Writer.cc ---------------------------------------------------------------------- diff --git a/c++/src/Writer.cc b/c++/src/Writer.cc index 3a56360..fee3318 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)); http://git-wip-us.apache.org/repos/asf/orc/blob/2aa7e524/c++/test/TestWriter.cc ---------------------------------------------------------------------- diff --git a/c++/test/TestWriter.cc b/c++/test/TestWriter.cc index c3788d2..f7597e8 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<InputStream> inStream( @@ -173,6 +175,15 @@ namespace orc { EXPECT_EQ(2000, batch->numElements); EXPECT_FALSE(rowReader->next(*batch)); + std::list<std::string> keys = reader->getMetadataKeys(); + EXPECT_EQ(keys.size(), 2); + std::list<std::string>::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<StructVectorBatch *>(batch.get()); longBatch = dynamic_cast<LongVectorBatch *>(structBatch->fields[0]);
