You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by ma...@apache.org on 2010/01/23 01:07:18 UTC

svn commit: r902315 - in /hadoop/avro/trunk: CHANGES.txt lang/c/src/avro.h lang/c/src/datum.c lang/c/src/datum_equal.c lang/c/src/datum_read.c lang/c/src/datum_write.c lang/c/tests/test_avro_data.c lang/c/version.sh

Author: massie
Date: Sat Jan 23 00:07:16 2010
New Revision: 902315

URL: http://svn.apache.org/viewvc?rev=902315&view=rev
Log:
AVRO-371.  Add support for encoding/decoding unions

Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/c/src/avro.h
    hadoop/avro/trunk/lang/c/src/datum.c
    hadoop/avro/trunk/lang/c/src/datum_equal.c
    hadoop/avro/trunk/lang/c/src/datum_read.c
    hadoop/avro/trunk/lang/c/src/datum_write.c
    hadoop/avro/trunk/lang/c/tests/test_avro_data.c
    hadoop/avro/trunk/lang/c/version.sh

Modified: hadoop/avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Sat Jan 23 00:07:16 2010
@@ -250,6 +250,8 @@
 
     AVRO-370. Add support for encoding/decoding fixed data (massie)
 
+    AVRO-371. Add support for encoding/decoding unions (massie)
+
   OPTIMIZATIONS
 
     AVRO-172. More efficient schema processing (massie)

Modified: hadoop/avro/trunk/lang/c/src/avro.h
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/avro.h?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/avro.h (original)
+++ hadoop/avro/trunk/lang/c/src/avro.h Sat Jan 23 00:07:16 2010
@@ -203,8 +203,7 @@
 int avro_array_append_datum(const avro_datum_t array_datum,
 			    const avro_datum_t datum);
 
-avro_datum_t avro_union(void);
-int avro_union_append(const avro_datum_t union_value, const avro_datum_t value);
+avro_datum_t avro_union(const avro_schema_t schema, const avro_datum_t datum);
 
 avro_datum_t avro_datum_incref(avro_datum_t value);
 void avro_datum_decref(avro_datum_t value);

Modified: hadoop/avro/trunk/lang/c/src/datum.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.c?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum.c Sat Jan 23 00:07:16 2010
@@ -479,9 +479,7 @@
 				free(array);
 			}
 			break;
-		case AVRO_UNION:{
-				/* TODO */
-			}
+		case AVRO_UNION:
 			break;
 		case AVRO_LINK:{
 				/* TODO */

Modified: hadoop/avro/trunk/lang/c/src/datum_equal.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_equal.c?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_equal.c Sat Jan 23 00:07:16 2010
@@ -144,6 +144,7 @@
 				   avro_datum_to_fixed(b));
 
 	case AVRO_UNION:
+		break;
 	case AVRO_LINK:
 		/*
 		 * TODO 

Modified: hadoop/avro/trunk/lang/c/src/datum_read.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_read.c?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_read.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_read.c Sat Jan 23 00:07:16 2010
@@ -225,10 +225,26 @@
 
 static int
 read_union(avro_reader_t reader, const avro_encoding_t * enc,
-	   avro_schema_t writers_schema, avro_schema_t readers_schema,
-	   avro_datum_t * datum)
+	   struct avro_union_schema_t *writers_schema,
+	   struct avro_union_schema_t *readers_schema, avro_datum_t * datum)
 {
-	return 1;
+	int rval;
+	int64_t i, index;
+	struct avro_union_branch_t *branch;
+
+	rval = enc->read_long(reader, &index);
+	if (rval) {
+		return rval;
+	}
+
+	branch = STAILQ_FIRST(&writers_schema->branches);
+	for (i = 0; i != index && branch != NULL;
+	     branch = STAILQ_NEXT(branch, branches)) {
+	}
+	if (!branch) {
+		return EILSEQ;
+	}
+	return avro_read_data(reader, branch->schema, NULL, datum);
 }
 
 /* TODO: handle default values in fields */
@@ -427,8 +443,9 @@
 
 	case AVRO_UNION:
 		rval =
-		    read_union(reader, enc, writers_schema, readers_schema,
-			       datum);
+		    read_union(reader, enc,
+			       avro_schema_to_union(writers_schema),
+			       avro_schema_to_union(readers_schema), datum);
 		break;
 
 	case AVRO_RECORD:

Modified: hadoop/avro/trunk/lang/c/src/datum_write.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_write.c?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_write.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_write.c Sat Jan 23 00:07:16 2010
@@ -128,6 +128,29 @@
 	return enc->write_long(writer, 0);
 }
 
+static int
+write_union(avro_writer_t writer, const avro_encoding_t * enc,
+	    struct avro_union_schema_t *schema, avro_datum_t datum)
+{
+	int rval;
+	int64_t index;
+	struct avro_union_branch_t *branch = STAILQ_FIRST(&schema->branches);
+	for (index = 0; branch != NULL;
+	     branch = STAILQ_NEXT(branch, branches), index++) {
+		if (avro_schema_datum_validate(branch->schema, datum)) {
+			break;
+		}
+	}
+	if (!branch) {
+		return EINVAL;
+	}
+	rval = enc->write_long(writer, index);
+	if (rval) {
+		return rval;
+	}
+	return avro_write_data(writer, branch->schema, datum);
+}
+
 int
 avro_write_data(avro_writer_t writer, avro_schema_t writer_schema,
 		avro_datum_t datum)
@@ -242,9 +265,9 @@
 		break;
 
 	case AVRO_UNION:
-		{
-			assert(0 && "Bug in schema validation code");
-		}
+		rval =
+		    write_union(writer, enc,
+				avro_schema_to_union(writer_schema), datum);
 		break;
 
 	case AVRO_LINK:

Modified: hadoop/avro/trunk/lang/c/tests/test_avro_data.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/test_avro_data.c?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/test_avro_data.c (original)
+++ hadoop/avro/trunk/lang/c/tests/test_avro_data.c Sat Jan 23 00:07:16 2010
@@ -229,9 +229,18 @@
 
 static int test_union(void)
 {
-	/*
-	 * TODO 
-	 */
+	avro_schema_t schema = avro_schema_union();
+	avro_datum_t datum;
+
+	avro_schema_union_append(schema, avro_schema_string());
+	avro_schema_union_append(schema, avro_schema_int());
+	avro_schema_union_append(schema, avro_schema_null());
+
+	datum = avro_wrapstring("Follow your bliss.");
+
+	write_read_check(schema, NULL, datum, "union");
+	avro_datum_decref(datum);
+	avro_schema_decref(schema);
 	return 0;
 }
 
@@ -266,7 +275,8 @@
 		"enum", test_enum}, {
 		"array", test_array}, {
 		"map", test_map}, {
-		"fixed", test_fixed}
+		"fixed", test_fixed}, {
+		"union", test_union}
 	};
 
 	srandom(time(NULL));

Modified: hadoop/avro/trunk/lang/c/version.sh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/version.sh?rev=902315&r1=902314&r2=902315&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/version.sh (original)
+++ hadoop/avro/trunk/lang/c/version.sh Sat Jan 23 00:07:16 2010
@@ -18,7 +18,7 @@
 #         libavro_binary_age = 0
 #         libavro_interface_age = 0
 #
-libavro_micro_version=10
+libavro_micro_version=11
 libavro_interface_age=0
 libavro_binary_age=0