DATAFU-25: AliasableEvalFunc should use getInputSchema
diff --git a/datafu-pig/src/main/java/datafu/pig/util/AliasableEvalFunc.java b/datafu-pig/src/main/java/datafu/pig/util/AliasableEvalFunc.java
index c14df2c..b55ef51 100644
--- a/datafu-pig/src/main/java/datafu/pig/util/AliasableEvalFunc.java
+++ b/datafu-pig/src/main/java/datafu/pig/util/AliasableEvalFunc.java
@@ -102,9 +102,25 @@
*/
public abstract Schema getOutputSchema(Schema input);
+ /*
+ * Previously, this class worked by capturing the schema of the input tuple on the front-end and storing it into the UDFContext.,
+ * After {@link EvalFunc.getInputSchema} was introduced in Pig 0.11, the implementation was changed to use it and the
+ * UDF context is used only as a fallback.
+ */
@SuppressWarnings("unchecked")
private Map<String, Integer> getAliasMap() {
- return (Map<String, Integer>)getInstanceProperties().get(ALIAS_MAP_PROPERTY);
+ if (aliasToPosition == null) {
+ if (getInputSchema() == null) {
+ aliasToPosition = (Map<String, Integer>)getInstanceProperties().get(ALIAS_MAP_PROPERTY);
+ } else {
+ Map<String, Integer> aliasMap = new HashMap<String, Integer>();
+ constructFieldAliases(aliasMap, getInputSchema(), null);
+ log.debug("In instance: "+getInstanceName()+", creating alias map: " + aliasMap);
+ aliasToPosition = aliasMap;
+ }
+ }
+
+ return aliasToPosition;
}
private void setAliasMap(Map<String, Integer> aliases) {