package org.apache.hadoop.hive.mastiff; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; /** * * LazyMastiffRowObjectInspector works on data that is stored in * LazyMastiffRow * <p> * The names of the struct fields and the internal structure of the struct fields are specified in * the {@link #fields} of the LazyMastiffRowObjectInspector. <br/> * * Adapted from {@link ColumnarSturctObjectInspector} * */ public class LazyMastiffRowObjectInspector extends StructObjectInspector { public static final Log LOG = LogFactory .getLog(LazyMastiffRowObjectInspector.class.getName()); protected static class MyField implements StructField { protected int fieldID; protected String fieldName; protected ObjectInspector fieldObjectInspector; protected String fieldComment; public MyField(int fieldID, String fieldName, ObjectInspector fieldObjectInspector) { this.fieldID = fieldID; this.fieldName = fieldName.toLowerCase(); this.fieldObjectInspector = fieldObjectInspector; } public MyField(int fieldID, String fieldName, ObjectInspector fieldObjectInspector, String fieldComment) { this(fieldID, fieldName, fieldObjectInspector); this.fieldComment = fieldComment; } public int getFieldID() { return fieldID; } public String getFieldName() { return fieldName; } public ObjectInspector getFieldObjectInspector() { return fieldObjectInspector; } public String getFieldComment() { return fieldComment; } @Override public String toString() { return "" + fieldID + ":" + fieldName; } } protected List<MyField> fields; @Override public String getTypeName() { return ObjectInspectorUtils.getStandardStructTypeName(this); } /** * */ public LazyMastiffRowObjectInspector(List<String> structFieldNames, List<ObjectInspector> structFieldObjectInspectors) { init(structFieldNames, structFieldObjectInspectors, null); } public LazyMastiffRowObjectInspector(List<String> structFieldNames, List<ObjectInspector> structFieldObjectInspectors, List<String> structFieldComments) { init(structFieldNames, structFieldObjectInspectors, structFieldComments); } protected void init(List<String> structFieldNames, List<ObjectInspector> structFieldObjectInspectors, List<String> structFieldComments) { assert (structFieldNames.size() == structFieldObjectInspectors.size()); assert (structFieldComments == null || (structFieldNames.size() == structFieldComments.size())); fields = new ArrayList<MyField>(structFieldNames.size()); for (int i = 0; i < structFieldNames.size(); i++) { fields.add(new MyField(i, structFieldNames.get(i), structFieldObjectInspectors.get(i), structFieldComments == null ? null : structFieldComments.get(i))); } } protected LazyMastiffRowObjectInspector(List<StructField> fields) { init(fields); } protected void init(List<StructField> fields) { this.fields = new ArrayList<MyField>(fields.size()); for (int i = 0; i < fields.size(); i++) { this.fields.add(new MyField(i, fields.get(i).getFieldName(), fields .get(i).getFieldObjectInspector(), fields.get(i).getFieldComment())); } } @Override public final Category getCategory() { return Category.STRUCT; } // Without Data @Override public StructField getStructFieldRef(String fieldName) { return ObjectInspectorUtils.getStandardStructFieldRef(fieldName, fields); } @Override public List<? extends StructField> getAllStructFieldRefs() { return fields; } // With Data @Override public Object getStructFieldData(Object data, StructField fieldRef) { if (data == null) { return null; } LazyMastiffRow struct = (LazyMastiffRow) data; MyField f = (MyField) fieldRef; int fieldID = f.getFieldID(); assert (fieldID >= 0 && fieldID < fields.size()); return struct.getField(fieldID); } @Override public List<Object> getStructFieldsDataAsList(Object data) { if (data == null) { return null; } LazyMastiffRow struct = (LazyMastiffRow) data; return struct.getFieldsAsList(); } }