[
https://issues.apache.org/jira/browse/AVRO-2152?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16386792#comment-16386792
]
ASF GitHub Bot commented on AVRO-2152:
--
phaas closed pull request #291: AVRO-2152: Fix JsonDecoder handling of aliases
in unions.
URL: https://github.com/apache/avro/pull/291
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
index 7c5da1169..226c5030a 100644
---
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
+++
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
@@ -24,6 +24,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.avro.AvroTypeException;
import org.apache.avro.Schema;
@@ -195,6 +196,7 @@ private Symbol resolveUnion(Schema writer, Schema reader,
final int size = alts.size();
Symbol[] symbols = new Symbol[size];
String[] labels = new String[size];
+Set[] aliases = new Set[size];
/**
* We construct a symbol without filling the arrays. Please see
@@ -204,9 +206,10 @@ private Symbol resolveUnion(Schema writer, Schema reader,
for (Schema w : alts) {
symbols[i] = generate(w, reader, seen);
labels[i] = w.getFullName();
+ aliases[i] = generateAliases(w);
i++;
}
-return Symbol.seq(Symbol.alt(symbols, labels),
+return Symbol.seq(Symbol.alt(symbols, labels, aliases),
Symbol.writerUnionAction());
}
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/Symbol.java
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/Symbol.java
index 187942400..dab275e12 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/Symbol.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/Symbol.java
@@ -111,8 +111,8 @@ static Symbol repeat(Symbol endSymbol, Symbol...
symsToRepeat) {
/**
* A convenience method to construct a union.
*/
- static Symbol alt(Symbol[] symbols, String[] labels) {
-return new Alternative(symbols, labels);
+ static Symbol alt(Symbol[] symbols, String[] labels, Set[] aliases) {
+return new Alternative(symbols, labels, aliases);
}
/**
@@ -426,10 +426,13 @@ private static boolean hasErrors(Symbol root, Symbol[]
symbols, Set visi
public static class Alternative extends Symbol {
public final Symbol[] symbols;
public final String[] labels;
-private Alternative(Symbol[] symbols, String[] labels) {
+public final Set[] aliases;
+
+private Alternative(Symbol[] symbols, String[] labels, Set[]
aliases) {
super(Kind.ALTERNATIVE);
this.symbols = symbols;
this.labels = labels;
+ this.aliases = aliases;
}
public Symbol getSymbol(int index) {
@@ -450,6 +453,9 @@ public int findLabel(String label) {
if (label.equals(labels[i])) {
return i;
}
+ if (aliases[i].contains(label)) {
+return i;
+ }
}
}
return -1;
@@ -462,7 +468,7 @@ public Alternative flatten(Map map,
for (int i = 0; i < ss.length; i++) {
ss[i] = symbols[i].flatten(map, map2);
}
- return new Alternative(ss, labels);
+ return new Alternative(ss, labels, aliases);
}
}
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ValidatingGrammarGenerator.java
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ValidatingGrammarGenerator.java
index 6e1a55eae..33e30 100644
---
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ValidatingGrammarGenerator.java
+++
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ValidatingGrammarGenerator.java
@@ -17,9 +17,11 @@
*/
package org.apache.avro.io.parsing;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.avro.Schema;
import org.apache.avro.Schema.Field;
@@ -101,21 +103,43 @@ public Symbol generate(Schema sc, Map seen)
{
List subs = sc.getTypes();
Symbol[] symbols = new Symbol[subs.size()];
String[] labels = new String[subs.size()];
+ Set[] aliases = new Set[subs.size()];
int i = 0;
for (Schema b : sc.getTypes()) {
symbols[i] = generate(b, seen);
labels[i] = b.getFullName();
+aliases[i] = generateAliases(b);
i++;
}
- return