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:11 UTC

[avro] 01/14: Small changes to Resolver to support Advancer

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 0ec4b0c9c598ca3c4692a984b50ee539bb630b69
Author: raymie_stata <ra...@raymiestatasMBP.lan>
AuthorDate: Mon Apr 29 21:49:03 2019 -0700

    Small changes to Resolver to support Advancer
---
 .../src/main/java/org/apache/avro/Resolver.java    | 80 +++++++++++-----------
 1 file changed, 40 insertions(+), 40 deletions(-)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/Resolver.java b/lang/java/avro/src/main/java/org/apache/avro/Resolver.java
index 3dab690..7c9e2c3 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/Resolver.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/Resolver.java
@@ -163,10 +163,11 @@ public class Resolver {
   }
 
   /**
-   * In this case, there's nothing to be done for resolution: the two schemas are
-   * effectively the same. This action will be generated <em>only</em> for
-   * primitive types and fixed types, and not for any other kind of schema.
-   */
+   * In this case, there's nothing to be done for resolution: the two
+   * schemas are effectively the same. This action will be generated
+   * <em>only</em> for primitive types (incl. STRING and BYTES) and
+   * also for fixed types, and <not>not</not for any other kind of
+   * schema. */
   public static class DoNothing extends Action {
     public DoNothing(Schema w, Schema r, GenericData d) {
       super(w, r, d, Action.Type.DO_NOTHING);
@@ -249,8 +250,18 @@ public class Resolver {
    * promotion"), and whent the promotion is one allowed by the Avro spec.
    */
   public static class Promote extends Action {
-    private Promote(Schema w, Schema r, GenericData d) {
+    public static enum Promotions {
+      INT2LONG, INT2FLOAT, INT2DOUBLE,
+      LONG2FLOAT, LONG2DOUBLE, FLOAT2DOUBLE,
+      STRING2BYTES, BYTES2STRING
+    }
+
+    /** The exact promotion being represented. */
+    public final Promotions promotion;
+
+    private Promote(Schema w, Schema r, Promotions p, GenericData d) {
       super(w, r, d, Action.Type.PROMOTE);
+      this.promotion = p;
     }
 
     /**
@@ -264,62 +275,49 @@ public class Resolver {
      *                                  not different.
      */
     public static Action resolve(Schema w, Schema r, GenericData d) {
-      if (isValid(w, r))
-        return new Promote(w, r, d);
+      Promotions p = findPromotion(w, r);
+      if (p != null)
+        return new Promote(w, r, p, d);
       else
         return new ErrorAction(w, r, d, ErrorType.INCOMPATIBLE_SCHEMA_TYPES);
     }
 
     /**
-     * Returns true iff <tt>w</tt> and <tt>r</tt> are both primitive types and
-     * either they are the same type or <tt>w</tt> is promotable to <tt>r</tt>.
-     * Should
+     * Returns the {@link Promtion} that would resolve schema
+     * <code>w</code> against <code>r</code>, or null if there is no
+     * such promotion.
      */
-    public static boolean isValid(Schema w, Schema r) {
+    private static Promotions findPromotion(Schema w, Schema r) {
       if (w.getType() == r.getType())
         throw new IllegalArgumentException("Only use when reader and writer are different.");
       Schema.Type wt = w.getType();
       switch (r.getType()) {
-      case INT:
-        switch (wt) {
-        case INT:
-          return true;
-        }
-        break;
       case LONG:
         switch (wt) {
-        case INT:
-        case LONG:
-          return true;
+        case INT: return Promotions.INT2LONG;
         }
         break;
       case FLOAT:
         switch (wt) {
-        case INT:
-        case LONG:
-        case FLOAT:
-          return true;
+        case INT: return Promotions.INT2FLOAT;
+        case LONG: return Promotions.LONG2FLOAT;
         }
         break;
       case DOUBLE:
         switch (wt) {
-        case INT:
-        case LONG:
-        case FLOAT:
-        case DOUBLE:
-          return true;
+        case INT: return Promotions.INT2DOUBLE;
+        case LONG: return Promotions.LONG2DOUBLE;
+        case FLOAT: return Promotions.FLOAT2DOUBLE;
         }
         break;
       case BYTES:
+        if (wt == Schema.Type.STRING) return Promotions.STRING2BYTES;
+        break;
       case STRING:
-        switch (wt) {
-        case STRING:
-        case BYTES:
-          return true;
-        }
+        if (wt == Schema.Type.STRING) return Promotions.BYTES2STRING;
         break;
       }
-      return false;
+      return null;
     }
   }
 
@@ -424,11 +422,13 @@ public class Resolver {
     public final Action[] fieldActions;
 
     /**
-     * Contains (all of) the reader's fields. The first <i>n</i> of these are the
-     * fields that will be read from the writer: these <i>n</i> are in the order
-     * dictated by writer's schema. The remaining <i>m</i> fields will be read from
-     * default values (actions for these default values are found in
-     * {@link RecordAdjust#defaults}.
+     * Contains (all of) the reader's fields. The first {@link
+     * firstDefault} of these are the fields that will be read from
+     * the writer: these are in the order dictated by writer's
+     * schema. The remaining fields from {@link firstDefault} to the
+     * end of the array will be read from default values (actions for
+     * these default values are found in {@link defaults}.  Note that
+     * the default fields are in the order of the reader's schema.
      */
     public final Field[] readerOrder;