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 2017/02/18 03:22:03 UTC
avro git commit: Fixed AVRO-1898,
C++ library cannot parse unions with default values
Repository: avro
Updated Branches:
refs/heads/master ce36fffca -> ec8514f71
Fixed AVRO-1898, C++ library cannot parse unions with default values
Project: http://git-wip-us.apache.org/repos/asf/avro/repo
Commit: http://git-wip-us.apache.org/repos/asf/avro/commit/ec8514f7
Tree: http://git-wip-us.apache.org/repos/asf/avro/tree/ec8514f7
Diff: http://git-wip-us.apache.org/repos/asf/avro/diff/ec8514f7
Branch: refs/heads/master
Commit: ec8514f711b739307d460b23bcb6eccc784f419a
Parents: ce36fff
Author: Thiruvalluvan M. G <th...@apache.org>
Authored: Sat Feb 18 08:48:43 2017 +0530
Committer: Thiruvalluvan M G <th...@startsmartlabs.com>
Committed: Sat Feb 18 08:51:23 2017 +0530
----------------------------------------------------------------------
CHANGES.txt | 2 ++
lang/c++/impl/Compiler.cc | 37 +++++++----------------------------
lang/c++/jsonschemas/bigrecord_r | 6 ++----
lang/c++/test/AvrogencppTests.cc | 3 ++-
4 files changed, 13 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/avro/blob/ec8514f7/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index a7cfb38..83c9a4d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -139,6 +139,8 @@ Trunk (not yet released)
AVRO-1937: C++ generator for recursive structure crashes (thiru)
+ AVRO-1892. C++ library cannot parse unions with default values (Hua Zhang via thiru)
+
Avro 1.8.1 (14 May 2016)
INCOMPATIBLE CHANGES
http://git-wip-us.apache.org/repos/asf/avro/blob/ec8514f7/lang/c++/impl/Compiler.cc
----------------------------------------------------------------------
diff --git a/lang/c++/impl/Compiler.cc b/lang/c++/impl/Compiler.cc
index 9670844..be5fe3f 100644
--- a/lang/c++/impl/Compiler.cc
+++ b/lang/c++/impl/Compiler.cc
@@ -79,7 +79,7 @@ static bool isFullName(const string& s)
{
return s.find('.') != string::npos;
}
-
+
static Name getName(const string& name, const string& ns)
{
return (isFullName(name)) ? Name(name) : Name(name, ns);
@@ -143,7 +143,7 @@ const int64_t getLongField(const Entity& e, const Object& m,
ensureType<int64_t>(it->second, fieldName);
return it->second.longValue();
}
-
+
struct Field {
const string& name;
const NodePtr schema;
@@ -283,32 +283,9 @@ static GenericDatum makeGenericDatum(NodePtr n, const Entity& e,
case AVRO_UNION:
{
GenericUnion result(n);
- string name;
- Entity e2;
- if (e.type() == json::etNull) {
- name = "null";
- e2 = e;
- } else {
- assertType(e, json::etObject);
- const map<string, Entity>& v = e.objectValue();
- if (v.size() != 1) {
- throw Exception(boost::format("Default value for "
- "union has more than one field: %1%") % e.toString());
- }
- map<string, Entity>::const_iterator it = v.begin();
- name = it->first;
- e2 = it->second;
- }
- for (size_t i = 0; i < n->leaves(); ++i) {
- const NodePtr& b = n->leafAt(i);
- if (nameof(b) == name) {
- result.selectBranch(i);
- result.datum() = makeGenericDatum(b, e2, st);
- return GenericDatum(n, result);
- }
- }
- throw Exception(boost::format("Invalid default value %1%") %
- e.toString());
+ result.selectBranch(0);
+ result.datum() = makeGenericDatum(n->leafAt(0), e, st);
+ return GenericDatum(n, result);
}
case AVRO_FIXED:
assertType(e, json::etString);
@@ -334,12 +311,12 @@ static Field makeField(const Entity& e, SymbolTable& st, const string& ns)
static NodePtr makeRecordNode(const Entity& e,
const Name& name, const Object& m, SymbolTable& st, const string& ns)
-{
+{
const Array& v = getArrayField(e, m, "fields");
concepts::MultiAttribute<string> fieldNames;
concepts::MultiAttribute<NodePtr> fieldValues;
vector<GenericDatum> defaultValues;
-
+
for (Array::const_iterator it = v.begin(); it != v.end(); ++it) {
Field f = makeField(*it, st, ns);
fieldNames.add(f.name);
http://git-wip-us.apache.org/repos/asf/avro/blob/ec8514f7/lang/c++/jsonschemas/bigrecord_r
----------------------------------------------------------------------
diff --git a/lang/c++/jsonschemas/bigrecord_r b/lang/c++/jsonschemas/bigrecord_r
index f079162..7c477cd 100644
--- a/lang/c++/jsonschemas/bigrecord_r
+++ b/lang/c++/jsonschemas/bigrecord_r
@@ -70,13 +70,11 @@
{
"name": "union1WithDefaultValue",
"type": [ "string", "int" ],
- "default": {
- "string": "sval"
- }
+ "default": "sval"
},
{
"name": "union2WithDefaultValue",
- "type": [ "string", "null" ],
+ "type": [ "null", "string" ],
"default": null
},
{
http://git-wip-us.apache.org/repos/asf/avro/blob/ec8514f7/lang/c++/test/AvrogencppTests.cc
----------------------------------------------------------------------
diff --git a/lang/c++/test/AvrogencppTests.cc b/lang/c++/test/AvrogencppTests.cc
index 24c5870..add78f5 100644
--- a/lang/c++/test/AvrogencppTests.cc
+++ b/lang/c++/test/AvrogencppTests.cc
@@ -27,7 +27,8 @@
#include "recursive.hh"
#include "circulardep.hh"
#include "reuse.hh"
-#include "tree.hh"
+#include "tree1.hh"
+#include "tree2.hh"
#include "crossref.hh"
#include "Compiler.hh"