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:16 UTC
[avro] 06/14: More tweaks
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 cc71ce4abd087254403706b4c348b9169e92e3b4
Author: rstata <rs...@yahoo.com>
AuthorDate: Tue Apr 30 01:17:40 2019 -0700
More tweaks
---
.../java/org/apache/avro/generic/Advancer.java | 40 ++++++++++------------
1 file changed, 19 insertions(+), 21 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 9064a39..d75e9ee 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
@@ -470,9 +470,6 @@ abstract class Advancer {
public Advancer getBranchAdvancer(Decoder in, int branch) throws IOException {
return branches[branch];
}
- public Object next(Decoder in) throws IOException {
- return branches[in.readIndex()].next(in);
- }
}
private static class ReaderUnion extends Advancer {
@@ -485,9 +482,6 @@ abstract class Advancer {
throw new IllegalArgumentException("Branch much be " + branch + ", got " + b);
return advancer;
}
- public Object next(Decoder in) throws IOException {
- return advancer.next(in);
- }
}
@@ -503,27 +497,29 @@ abstract class Advancer {
* reader's fields. Thus, the following is how to read a record:
* <pre>
* for (int i = 0; i < a.advancers.length; i++) {
- * dataum.set(a.readerOrder[i], a.advancers[i].next());
+ * dataum.set(a.readerOrder[i].pos(), a.advancers[i].next(in));
* }
- * a.done();
+ * a.done(in);
* </pre>
* Note that a decoder <em>must</em> call {@link done} after interpreting
* all the elemnts in {@link advancers}.
*
* As a convenience, {@link inOrder} is set to true iff the reader
- * and writer order agrees (i.e., iff <code>readerOrder[i] ==
+ * and writer order agrees (i.e., iff <code>readerOrder[i].pos() ==
* i</code> for all i). Generated code can use this to optimize this
* common case. */
public static class Record extends Advancer {
public final Advancer[] advancers;
private Schema[] finalSkips;
- public final int[] readerOrder;
+ public final Schema.Field[] readerOrder;
public final boolean inOrder;
- private Record(Advancer[] advancers, Schema[] finalSkips, int[] order, boolean inOrder) {
+ private Record(Advancer[] advancers, Schema[] finalSkips,
+ Schema.Field[] readerOrder, boolean inOrder)
+ {
this.advancers = advancers;
this.finalSkips = finalSkips;
- this.readerOrder = order;
+ this.readerOrder = readerOrder;
this.inOrder = inOrder;
}
@@ -540,8 +536,7 @@ abstract class Advancer {
/** Special subclasses of Advance will encapsulate skipping. */
// Compute the "readerOrder" argument to Advancer.Record constructor
- int[] readOrder = new int[ra.readerOrder.length];
- for (int i = 0; i < readOrder.length; i++) readOrder[i] = ra.readerOrder[i].pos();
+ Schema.Field[] readOrder = ra.readerOrder;
// Compute the "advancers" argument to Advancer.Record constructor
Advancer[] fieldAdvs = new Advancer[readOrder.length];
@@ -573,15 +568,21 @@ abstract class Advancer {
// record's field order not changing.
boolean inOrder = true;
for (int k = 0; k < ra.firstDefault-1; k++)
- inOrder &= (readOrder[k] < readOrder[k+1]);
+ inOrder &= (readOrder[k].pos() < readOrder[k+1].pos());
if (inOrder) {
Advancer[] newAdvancers = new Advancer[fieldAdvs.length];
+ Schema.Field[] newReadOrder = new Schema.Field[fieldAdvs.length];
for (int k = 0, rf2 = 0, df = ra.firstDefault; k < readOrder.length; k++) {
- if (readOrder[rf2] < readOrder[df]) newAdvancers[k] = fieldAdvs[rf2++];
- else newAdvancers[k] = fieldAdvs[df++];
+ if (readOrder[rf2].pos() < readOrder[df].pos()) {
+ newAdvancers[k] = fieldAdvs[rf2];
+ newReadOrder[k] = readOrder[rf2++];
+ } else {
+ newAdvancers[k] = fieldAdvs[df];
+ newReadOrder[k] = readOrder[df++];
+ }
}
- for (int k = 0; k < readOrder.length; k++) readOrder[k] = k;
fieldAdvs = newAdvancers;
+ readOrder = newReadOrder;
}
return new Record(fieldAdvs, finalSkips, readOrder, inOrder);
@@ -596,9 +597,6 @@ abstract class Advancer {
this.field = field;
}
- public Object next(Decoder in) throws IOException
- { ignore(toSkip, in); return field.next(in); }
-
public Object nextNull(Decoder in) throws IOException
{ ignore(toSkip, in); return field.nextNull(in); }