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 2019/05/01 19:11:19 UTC

[avro] 09/14: Advancer and GenericDatumeReader2 now compile

This is an automated email from the ASF dual-hosted git repository.

thiru pushed a commit to branch fast-decoder-thiru
in repository https://gitbox.apache.org/repos/asf/avro.git

commit 3fe8df68990f145380c3acee237c5d7539a21a0f
Author: rstata <rs...@yahoo.com>
AuthorDate: Tue Apr 30 12:24:47 2019 -0700

    Advancer and GenericDatumeReader2 now compile
---
 .../java/org/apache/avro/generic/Advancer.java     |  8 +++----
 .../apache/avro/generic/GenericDatumReader2.java   | 28 ++++++++++++++++++----
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/generic/Advancer.java b/lang/java/avro/src/main/java/org/apache/avro/generic/Advancer.java
index 4fe3d7b..8f2b010 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/generic/Advancer.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/generic/Advancer.java
@@ -223,7 +223,7 @@ abstract class Advancer {
     * to use to read an array of int:
     *
     * <pre>
-    *   Advancer.Container c = advancer.getContainerAdvancer(in);
+    *   Advancer c = advancer.getContainerAdvancer(in);
     *   Advancer.Container ec = c.getElementAdvancer(in);
     *   for(long i = c.firstChunk(in); i != 0; i = c.nextChunk(in)) {
     *     for (long j = 0; j < i; j++) {
@@ -244,8 +244,7 @@ abstract class Advancer {
   }
 
   private static class ArrayContainer extends Container {
-    private final Advancer elementAdvancer;
-    public ArrayContainer(Advancer elementAdvancer) { super(elementAdvancer); }
+    public ArrayContainer(Advancer ea) { super(ea); }
     public long firstChunk(Decoder in) throws IOException
       { return in.readArrayStart(); }
     public long nextChunk(Decoder in) throws IOException
@@ -253,8 +252,7 @@ abstract class Advancer {
   }
 
   private static class MapContainer extends Container {
-    private final Advancer elementAdvancer;
-    public MapContainer(Advancer elementAdvancer) { super(elementAdvancer); }
+    public MapContainer(Advancer ea) { super(ea); }
     public long firstChunk(Decoder in) throws IOException
       { return in.readMapStart(); }
     public long nextChunk(Decoder in) throws IOException
diff --git a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader2.java b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader2.java
index d86b038..46506c2 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader2.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader2.java
@@ -19,17 +19,21 @@ package org.apache.avro.generic;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.List;
 
 import org.apache.avro.Resolver;
 import org.apache.avro.Schema;
 import org.apache.avro.io.DatumReader;
 import org.apache.avro.io.Decoder;
 
-public class GenericDatumReader2<D> implements DatumReader<D> {
+public class GenericDatumReader2<D extends IndexedRecord> implements DatumReader<D> {
+  private final Schema reader, writer;
   private final Advancer.Record advancer;
   private final GenericData data;
 
-  private GenericDatumReader2(Advancer.Record a, GenericData d) {
+  private GenericDatumReader2(Schema writer, Schema reader, Advancer.Record a, GenericData d) {
+    this.writer = writer;
+    this.reader = reader;
     advancer = a;
     data = d;
   }
@@ -38,15 +42,18 @@ public class GenericDatumReader2<D> implements DatumReader<D> {
     // TODO: add caching
     Resolver.Action a = Resolver.resolve(writer, reader, data);
     Advancer.Record r = (Advancer.Record)Advancer.from(a);
-    return new GenericDatumReader2(r, data);
+    return new GenericDatumReader2(writer, reader, r, data);
   }
 
   public D read(D reuse, Decoder in) throws IOException {
+    List<Schema.Field> wf = writer.getFields();
+    if (reuse == null) reuse = null; // FIXME
     for (int i = 0; i < advancer.advancers.length; i++) {
       int p = advancer.readerOrder[i].pos();
-      reuse.set(p, read(in, null, advancer.advancers[i]));
+      reuse.put(p, read(null, wf.get(i).schema(), advancer.advancers[i], in));
     }
     advancer.done(in);
+    return reuse;
   }
 
   public Object read(Object reuse, Schema expected, Advancer a, Decoder in)
@@ -62,7 +69,18 @@ public class GenericDatumReader2<D> implements DatumReader<D> {
     case STRING: return (String) a.nextString(in);
     case BYTES: return a.nextBytes(in, (ByteBuffer)reuse);
     case FIXED:
-    case ARRAY:
+    case ARRAY: {
+      List result = null; // FIXME -- use GenericData methods here...
+      Advancer.Container c = advancer.getContainerAdvancer(in);
+      Advancer ec = c.getElementAdvancer(in);
+      Schema es = expected.getElementType();
+      for(long i = c.firstChunk(in); i != 0; i = c.nextChunk(in)) {
+        for (long j = 0; j < i; j++) {
+          result.add(read(null, es, ec, in));
+        }
+      }
+    }
+        
     case MAP:
     case RECORD:
     case UNION: