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 2010/04/19 13:10:59 UTC

svn commit: r935526 - in /hadoop/avro/trunk: ./ lang/java/src/java/org/apache/avro/generic/ lang/java/src/java/org/apache/avro/io/ lang/java/src/test/java/org/apache/avro/io/

Author: thiru
Date: Mon Apr 19 11:10:58 2010
New Revision: 935526

URL: http://svn.apache.org/viewvc?rev=935526&view=rev
Log:
AVRO-517. Resolving Decoder fails in some cases

Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
    hadoop/avro/trunk/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java
    hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java

Modified: hadoop/avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=935526&r1=935525&r2=935526&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Mon Apr 19 11:10:58 2010
@@ -44,6 +44,8 @@ Avro 1.4.0 (unreleased)
 
     AVRO-518. Add link to boost filesystem library.  (John Plevyak via sbanacho)
 
+    AVRO-517. Resolving Decoder fails in some cases. (thiru) 
+
 Avro 1.3.2 (31 March 2010)
 
   IMPROVEMENTS

Modified: hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java?rev=935526&r1=935525&r2=935526&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java (original)
+++ hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java Mon Apr 19 11:10:58 2010
@@ -67,7 +67,10 @@ public class GenericDatumReader<D> imple
     if (resolver == null) {
       resolver = ResolvingDecoder.resolve(actual, expected);
     }
-    return (D) read(reuse, expected, new ResolvingDecoder(resolver, in));
+    ResolvingDecoder r = new ResolvingDecoder(resolver, in);
+    D result = (D) read(reuse, expected, r);
+    r.drain();
+    return result;
   }
   
   /** Called to read data.*/

Modified: hadoop/avro/trunk/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java?rev=935526&r1=935525&r2=935526&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java (original)
+++ hadoop/avro/trunk/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java Mon Apr 19 11:10:58 2010
@@ -121,6 +121,25 @@ public class ResolvingDecoder extends Va
     return ((Symbol.FieldOrderAction) parser.advance(Symbol.FIELD_ACTION)).
       fields;
   }
+  
+  /**
+   * Consume any more data that has been written by the writer but not
+   * needed by the reader so that the the underlying decoder is in proper
+   * shape for the next record. This situation happens when, for example,
+   * the writer writes a record with two fields and the reader needs only the
+   * first field.
+   * 
+   * This function should be called after completely decoding an object but
+   * before next object can be decoded from the same underlying decoder
+   * either directly or through another resolving decoder. If the same resolving
+   * decoder is used for the next object as well, calling this method is
+   * optional; the state of this resolving decoder ensures that any leftover
+   * portions are consumed before the next object is decoded.
+   * @throws IOException
+   */
+  public final void drain() throws IOException {
+    parser.processImplicitActions();
+  }
 
   @Override
   public long readLong() throws IOException {

Modified: hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java?rev=935526&r1=935525&r2=935526&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java (original)
+++ hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java Mon Apr 19 11:10:58 2010
@@ -79,6 +79,16 @@ public class TestResolvingIOResolving {
   private static Object[][] dataForResolvingTests() {
     // The mnemonics are the same as {@link TestValidatingIO#testSchemas}
     return new Object[][] {
+        // Projection
+        { "{\"type\":\"record\",\"name\":\"r\",\"fields\":["
+          + "{\"name\":\"f1\", \"type\":\"string\"},"
+          + "{\"name\":\"f2\", \"type\":\"string\"},"
+          + "{\"name\":\"f3\", \"type\":\"int\"}]}", "S10S10IS10S10I",
+          new Object[] { "s1", "s2", 100, "t1", "t2", 200 },
+          "{\"type\":\"record\",\"name\":\"r\",\"fields\":["
+          + "{\"name\":\"f1\", \"type\":\"string\" },"
+          + "{\"name\":\"f2\", \"type\":\"string\"}]}", "RS10S10RS10S10",
+          new Object[] { "s1", "s2", "t1", "t2" } },
         // Reordered fields
         { "{\"type\":\"record\",\"name\":\"r\",\"fields\":["
           + "{\"name\":\"f1\", \"type\":\"int\"},"