This is an automated email from the ASF dual-hosted git repository. mgrigorov pushed a commit to branch avro-3601-c++-simplify-custom-attributes-2 in repository https://gitbox.apache.org/repos/asf/avro.git
commit 49bed31807e14cbb4b040f4000af96a991101c3d Author: Martin Tzvetanov Grigorov <[email protected]> AuthorDate: Fri Aug 12 11:41:57 2022 +0300 AVRO-3601: CustomAttributes#getAttribute() now returns boost::optional Add unit tests for CustomAttributes#getAttribute(string) Signed-off-by: Martin Tzvetanov Grigorov <[email protected]> --- lang/c++/api/CustomAttributes.hh | 3 ++- lang/c++/impl/CustomAttributes.cc | 8 +++++--- lang/c++/test/unittest.cc | 12 ++++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lang/c++/api/CustomAttributes.hh b/lang/c++/api/CustomAttributes.hh index 2bd572c57..adad6f6de 100644 --- a/lang/c++/api/CustomAttributes.hh +++ b/lang/c++/api/CustomAttributes.hh @@ -19,6 +19,7 @@ #ifndef avro_CustomAttributes_hh__ #define avro_CustomAttributes_hh__ +#include <boost/optional.hpp> #include <iostream> #include <map> #include <string> @@ -33,7 +34,7 @@ class AVRO_DECL CustomAttributes { public: // Retrieves the custom attribute json entity for that attributeName, returns an // null if the attribute doesn't exist. - std::string getAttribute(const std::string &name) const; + boost::optional<std::string> getAttribute(const std::string &name) const; // Adds a custom attribute. If the attribute already exists, throw an exception. void addAttribute(const std::string &name, const std::string &value); diff --git a/lang/c++/impl/CustomAttributes.cc b/lang/c++/impl/CustomAttributes.cc index bb5643856..1186d9e26 100644 --- a/lang/c++/impl/CustomAttributes.cc +++ b/lang/c++/impl/CustomAttributes.cc @@ -23,13 +23,15 @@ namespace avro { -std::string CustomAttributes::getAttribute(const std::string &name) const { +boost::optional<std::string> CustomAttributes::getAttribute(const std::string &name) const { + boost::optional<std::string> result; std::map<std::string, std::string>::const_iterator iter = attributes_.find(name); if (iter == attributes_.end()) { - return NULL; + return result; } - return iter->second; + result = iter->second; + return result; } void CustomAttributes::addAttribute(const std::string& name, diff --git a/lang/c++/test/unittest.cc b/lang/c++/test/unittest.cc index 2a5c51786..0057e8287 100644 --- a/lang/c++/test/unittest.cc +++ b/lang/c++/test/unittest.cc @@ -467,8 +467,6 @@ struct TestSchema { concepts::MultiAttribute<NodePtr> fieldValues; std::vector<GenericDatum> defaultValues; - CustomAttributes cf; - cf.addAttribute("extra field", std::string("1")); fieldNames.add("f1"); fieldValues.add(NodePtr( new NodePrimitive(Type::AVRO_LONG))); @@ -481,6 +479,15 @@ struct TestSchema { expectedJsonWithoutCustomAttribute); } + void checkCustomAttributes_getAttribute() + { + CustomAttributes cf; + cf.addAttribute("field1", std::string("1")); + + BOOST_CHECK_EQUAL(std::string("1"), *cf.getAttribute("field1")); + BOOST_CHECK_EQUAL(false, cf.getAttribute("not_existing").is_initialized()); + } + void test() { std::cout << "Before\n"; schema_.toJson(std::cout); @@ -505,6 +512,7 @@ struct TestSchema { checkNodeRecordWithoutCustomAttribute(); checkNodeRecordWithCustomAttribute(); + checkCustomAttributes_getAttribute(); } ValidSchema schema_;
