You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by th...@apache.org on 2011/10/12 15:26:56 UTC

svn commit: r1182355 - in /avro/trunk: CHANGES.txt lang/c++/CMakeLists.txt lang/c++/impl/avrogencpp.cc lang/c++/jsonschemas/union_conflict lang/c++/test/AvrogencppTests.cc

Author: thiru
Date: Wed Oct 12 13:26:55 2011
New Revision: 1182355

URL: http://svn.apache.org/viewvc?rev=1182355&view=rev
Log:
AVRO-840. C++ generate nullable types for optional fields int the schema

Added:
    avro/trunk/lang/c++/jsonschemas/union_conflict
Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/c++/CMakeLists.txt
    avro/trunk/lang/c++/impl/avrogencpp.cc
    avro/trunk/lang/c++/test/AvrogencppTests.cc

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1182355&r1=1182354&r2=1182355&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Oct 12 13:26:55 2011
@@ -111,6 +111,8 @@ Avro 1.6.0 (unreleased)
 
     AVRO-917. Avrogencpp does not insert avro prefix for avro headers in the generated files. (thiru)
 
+    AVRO-840. C++ generate nullable types for optional fields int the schema. (thiru)
+
   BUG FIXES
 
     AVRO-824. Java: Fix usage message of BinaryFragmentToJsonTool.

Modified: avro/trunk/lang/c++/CMakeLists.txt
URL: http://svn.apache.org/viewvc/avro/trunk/lang/c%2B%2B/CMakeLists.txt?rev=1182355&r1=1182354&r2=1182355&view=diff
==============================================================================
--- avro/trunk/lang/c++/CMakeLists.txt (original)
+++ avro/trunk/lang/c++/CMakeLists.txt Wed Oct 12 13:26:55 2011
@@ -113,6 +113,11 @@ add_custom_target (union_map_union_hh
         -o ${BUILD_DIRECTORY}/union_map_union.hh -n umu
     DEPENDS avrogencpp)
 
+add_custom_target (union_conflict_hh
+    COMMAND avrogencpp -i jsonschemas/union_conflict
+        -o ${BUILD_DIRECTORY}/union_conflict.hh -n uc -U
+    DEPENDS avrogencpp)
+
 add_custom_target (recursive_hh
     COMMAND avrogencpp -i jsonschemas/recursive
         -o ${BUILD_DIRECTORY}/recursive.hh -n rec
@@ -154,8 +159,8 @@ target_link_libraries (testgentest avroc
 
 add_executable (AvrogencppTests test/AvrogencppTests.cc)
 add_dependencies (AvrogencppTests bigrecord_hh bigrecord2_hh
-    union_array_union_hh union_map_union_hh recursive_hh reuse_hh
-    circulardep_hh)
+    union_array_union_hh union_map_union_hh union_conflict_hh
+    recursive_hh reuse_hh circulardep_hh)
 target_link_libraries (AvrogencppTests avrocpp ${BOOST_LIBRARIES})
 
 add_executable (DataFileTests test/DataFileTests.cc)

Modified: avro/trunk/lang/c++/impl/avrogencpp.cc
URL: http://svn.apache.org/viewvc/avro/trunk/lang/c%2B%2B/impl/avrogencpp.cc?rev=1182355&r1=1182354&r2=1182355&view=diff
==============================================================================
--- avro/trunk/lang/c++/impl/avrogencpp.cc (original)
+++ avro/trunk/lang/c++/impl/avrogencpp.cc Wed Oct 12 13:26:55 2011
@@ -76,6 +76,7 @@ class CodeGen {
     const std::string headerFile_;
     const std::string schemaFile_;
     const std::string includePrefix_;
+    const bool noUnion_;
     boost::mt19937 random_;
 
     vector<PendingSetterGetter> pendingGettersAndSetters;
@@ -102,10 +103,10 @@ class CodeGen {
 public:
     CodeGen(std::ostream& os, const std::string& ns,
         const std::string& schemaFile, const std::string& headerFile,
-        const std::string& includePrefix) :
+        const std::string& includePrefix, bool noUnion) :
         unionNumber_(0), os_(os), inNamespace_(false), ns_(ns),
         schemaFile_(schemaFile), headerFile_(headerFile),
-        includePrefix_(includePrefix),
+        includePrefix_(includePrefix), noUnion_(noUnion),
         random_(::time(0)) { }
     void generate(const ValidSchema& schema);
 };
@@ -208,9 +209,21 @@ string CodeGen::generateRecordType(const
     }
 
     os_ << "struct " << n->name() << " {\n";
+    if (! noUnion_) {
+        for (int i = 0; i < c; ++i) {
+            if (n->leafAt(i)->type() == avro::AVRO_UNION) {
+                os_ << "    typedef " << types[i]
+                    << ' ' << n->nameAt(i) << "_t;\n";
+            }
+        }
+    }
     for (int i = 0; i < c; ++i) {
-        os_ << "    " << types[i]
-            << " " << n->nameAt(i) << ";\n";
+        if (! noUnion_ && n->leafAt(i)->type() == avro::AVRO_UNION) {
+            os_ << "    " << n->nameAt(i) << "_t";
+        } else {
+            os_ << "    " << types[i];
+        }
+        os_ << ' ' << n->nameAt(i) << ";\n";
     }
     os_ << "};\n\n";
     return n->name();
@@ -318,7 +331,10 @@ string CodeGen::generateUnionType(const 
     for (size_t i = 0; i < c; ++i) {
         const NodePtr& nn = n->leafAt(i);
         if (nn->type() == avro::AVRO_NULL) {
-            os_ << "    void set_null() {\n"
+            os_ << "    bool is_null() const {\n"
+                << "        return (idx_ == " << i << ");\n"
+                << "    }\n"
+                << "    void set_null() {\n"
                 << "        idx_ = " << i << ";\n"
                 << "        value_ = boost::any();\n"
                 << "    }\n";
@@ -634,6 +650,7 @@ static const string NS("namespace");
 static const string OUT("output");
 static const string IN("input");
 static const string INCLUDE_PREFIX("include-prefix");
+static const string NO_UNION_TYPEDEF("no-union-typedef");
 
 int main(int argc, char** argv)
 {
@@ -642,6 +659,7 @@ int main(int argc, char** argv)
         ("help,h", "produce help message")
         ("include-prefix,p", po::value<string>()->default_value("avro"),
             "prefix for include headers, - for none, default: avro")
+        ("no-union-typedef,U", "do not generate typedefs for unions in records")
         ("namespace,n", po::value<string>(), "set namespace for generated code")
         ("input,i", po::value<string>(), "input file")
         ("output,o", po::value<string>(), "output file to generate");
@@ -660,6 +678,7 @@ int main(int argc, char** argv)
     string outf = vm.count(OUT) > 0 ? vm[OUT].as<string>() : string();
     string inf = vm.count(IN) > 0 ? vm[IN].as<string>() : string();
     string incPrefix = vm[INCLUDE_PREFIX].as<string>();
+    bool noUnion = vm.count(NO_UNION_TYPEDEF) != 0;
     if (incPrefix == "-") {
         incPrefix.clear();
     } else if (*incPrefix.rbegin() != '/') {
@@ -678,9 +697,10 @@ int main(int argc, char** argv)
 
         if (! outf.empty()) {
             ofstream out(outf.c_str());
-            CodeGen(out, ns, inf, outf, incPrefix).generate(schema);
+            CodeGen(out, ns, inf, outf, incPrefix, noUnion).generate(schema);
         } else {
-            CodeGen(std::cout, ns, inf, outf, incPrefix).generate(schema);
+            CodeGen(std::cout, ns, inf, outf, incPrefix, noUnion).
+                generate(schema);
         }
         return 0;
     } catch (std::exception &e) {

Added: avro/trunk/lang/c++/jsonschemas/union_conflict
URL: http://svn.apache.org/viewvc/avro/trunk/lang/c%2B%2B/jsonschemas/union_conflict?rev=1182355&view=auto
==============================================================================
--- avro/trunk/lang/c++/jsonschemas/union_conflict (added)
+++ avro/trunk/lang/c++/jsonschemas/union_conflict Wed Oct 12 13:26:55 2011
@@ -0,0 +1,9 @@
+{
+  "type": "record",
+  "name": "uc",
+  "fields" : [
+    {"name": "rev_t", "type": "string"},
+    {"name": "data", "type": "bytes"},
+    {"name": "rev", "type": ["string", "null"]}
+  ]
+}

Modified: avro/trunk/lang/c++/test/AvrogencppTests.cc
URL: http://svn.apache.org/viewvc/avro/trunk/lang/c%2B%2B/test/AvrogencppTests.cc?rev=1182355&r1=1182354&r2=1182355&view=diff
==============================================================================
--- avro/trunk/lang/c++/test/AvrogencppTests.cc (original)
+++ avro/trunk/lang/c++/test/AvrogencppTests.cc Wed Oct 12 13:26:55 2011
@@ -20,6 +20,7 @@
 #include "bigrecord2.hh"
 #include "union_array_union.hh"
 #include "union_map_union.hh"
+#include "union_conflict.hh"
 #include "recursive.hh"
 #include "circulardep.hh"
 #include "reuse.hh"