You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2010/06/04 01:45:55 UTC

svn commit: r951211 - in /avro/branches/branch-1.3: ./ 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: cutting
Date: Thu Jun  3 23:45:54 2010
New Revision: 951211

URL: http://svn.apache.org/viewvc?rev=951211&view=rev
Log:
Merge r935526 from trunk to 1.3 branch.  Fixes: AVRO-517.

Modified:
    avro/branches/branch-1.3/   (props changed)
    avro/branches/branch-1.3/CHANGES.txt
    avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
    avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java
    avro/branches/branch-1.3/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java

Propchange: avro/branches/branch-1.3/
------------------------------------------------------------------------------
    svn:mergeinfo = /hadoop/avro/trunk:935526

Modified: avro/branches/branch-1.3/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.3/CHANGES.txt?rev=951211&r1=951210&r2=951211&view=diff
==============================================================================
--- avro/branches/branch-1.3/CHANGES.txt (original)
+++ avro/branches/branch-1.3/CHANGES.txt Thu Jun  3 23:45:54 2010
@@ -18,6 +18,8 @@ Avro 1.3.3 (Unreleased)
     AVRO-548. Python client should handle CLIENT handshake match status
     correctly. (hammer)
 
+    AVRO-517. Resolving Decoder fails in some cases. (thiru) 
+
 Avro 1.3.2 (31 March 2010)
 
   IMPROVEMENTS

Modified: avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java?rev=951211&r1=951210&r2=951211&view=diff
==============================================================================
--- avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java (original)
+++ avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java Thu Jun  3 23:45:54 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: avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java?rev=951211&r1=951210&r2=951211&view=diff
==============================================================================
--- avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java (original)
+++ avro/branches/branch-1.3/lang/java/src/java/org/apache/avro/io/ResolvingDecoder.java Thu Jun  3 23:45:54 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: avro/branches/branch-1.3/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.3/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java?rev=951211&r1=951210&r2=951211&view=diff
==============================================================================
--- avro/branches/branch-1.3/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java (original)
+++ avro/branches/branch-1.3/lang/java/src/test/java/org/apache/avro/io/TestResolvingIOResolving.java Thu Jun  3 23:45:54 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\"},"