blob: a607c83f036ffeb549352502e231eb2e77f8beb8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.carbondata.hive;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.SettableStructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructField;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableHiveVarcharObjectInspector;
import org.apache.hadoop.hive.serde2.typeinfo.CharTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.MapTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.StructTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeInfo;
import org.apache.hadoop.io.ArrayWritable;
class CarbonObjectInspector extends SettableStructObjectInspector {
private final TypeInfo typeInfo;
private final List<StructField> fields;
private final HashMap<String, StructFieldImpl> fieldsByName;
public CarbonObjectInspector(final StructTypeInfo rowTypeInfo) {
typeInfo = rowTypeInfo;
List<String> fieldNames = rowTypeInfo.getAllStructFieldNames();
List<TypeInfo> fieldInfos = rowTypeInfo.getAllStructFieldTypeInfos();
fields = new ArrayList<StructField>(fieldNames.size());
fieldsByName = new HashMap<String, StructFieldImpl>();
for (int i = 0; i < fieldNames.size(); ++i) {
final String name = fieldNames.get(i);
final TypeInfo fieldInfo = fieldInfos.get(i);
final StructFieldImpl field = new StructFieldImpl(name, getObjectInspector(fieldInfo), i);
fields.add(field);
fieldsByName.put(name, field);
}
}
private ObjectInspector getObjectInspector(final TypeInfo typeInfo) {
if (typeInfo.equals(TypeInfoFactory.stringTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
} else if (typeInfo instanceof CharTypeInfo) {
return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.doubleTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.floatTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableFloatObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.floatTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableFloatObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.intTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableIntObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.longTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableLongObjectInspector;
} else if (typeInfo instanceof DecimalTypeInfo) {
return PrimitiveObjectInspectorFactory
.getPrimitiveWritableObjectInspector((DecimalTypeInfo) typeInfo);
} else if (typeInfo.getCategory().equals(Category.STRUCT)) {
return new CarbonObjectInspector((StructTypeInfo) typeInfo);
} else if (typeInfo.getCategory().equals(Category.LIST)) {
final TypeInfo subTypeInfo = ((ListTypeInfo) typeInfo).getListElementTypeInfo();
return new CarbonArrayInspector(getObjectInspector(subTypeInfo));
} else if (typeInfo.equals(TypeInfoFactory.shortTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableShortObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.timestampTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableTimestampObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.dateTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableDateObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.charTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.booleanTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
} else if (typeInfo.equals(TypeInfoFactory.byteTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableByteObjectInspector;
} else if (typeInfo instanceof VarcharTypeInfo) {
return new WritableHiveVarcharObjectInspector((VarcharTypeInfo) typeInfo);
} else if (typeInfo.equals(TypeInfoFactory.binaryTypeInfo)) {
return PrimitiveObjectInspectorFactory.writableBinaryObjectInspector;
} else if (typeInfo instanceof MapTypeInfo) {
MapTypeInfo mapTypeInfo = (MapTypeInfo) typeInfo;
ObjectInspector mapKeyObjectIns = getObjectInspector(mapTypeInfo.getMapKeyTypeInfo());
ObjectInspector mapValObjectIns = getObjectInspector(mapTypeInfo.getMapValueTypeInfo());
return new CarbonMapInspector(mapKeyObjectIns, mapValObjectIns);
} else {
throw new UnsupportedOperationException("Unknown field type: " + typeInfo);
}
}
@Override
public Category getCategory() {
return Category.STRUCT;
}
@Override
public String getTypeName() {
return typeInfo.getTypeName();
}
@Override
public List<? extends StructField> getAllStructFieldRefs() {
return fields;
}
@Override
public Object getStructFieldData(final Object data, final StructField fieldRef) {
if (data == null) {
return null;
}
if (data instanceof ArrayWritable) {
final ArrayWritable arr = (ArrayWritable) data;
return arr.get()[((StructFieldImpl) fieldRef).getIndex()];
}
boolean isArray = !(data instanceof List);
int listSize = isArray ? ((Object[]) data).length : ((List) data).size();
int fieldID = fieldRef.getFieldID();
return fieldID >= listSize ?
null :
(isArray ? ((Object[]) data)[fieldID] : ((List) data).get(fieldID));
}
@Override
public StructField getStructFieldRef(final String name) {
return fieldsByName.get(name);
}
@Override
public List<Object> getStructFieldsDataAsList(final Object data) {
if (data == null) {
return null;
}
if (data instanceof ArrayWritable) {
final ArrayWritable arr = (ArrayWritable) data;
final Object[] arrWritable = arr.get();
return new ArrayList<Object>(Arrays.asList(arrWritable));
}
throw new UnsupportedOperationException("Cannot inspect " + data.getClass().getCanonicalName());
}
@Override
public Object create() {
final ArrayList<Object> list = new ArrayList<Object>(fields.size());
for (int i = 0; i < fields.size(); ++i) {
list.add(null);
}
return list;
}
@Override
public Object setStructFieldData(Object struct, StructField field, Object fieldValue) {
final ArrayList<Object> list = (ArrayList<Object>) struct;
list.set(((StructFieldImpl) field).getIndex(), fieldValue);
return list;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final CarbonObjectInspector other = (CarbonObjectInspector) obj;
return !(!Objects.equals(this.typeInfo, other.typeInfo));
}
@Override
public int hashCode() {
int hash = 5;
hash = 29 * hash + (this.typeInfo != null ? this.typeInfo.hashCode() : 0);
return hash;
}
private static class StructFieldImpl implements StructField {
private final String name;
private final ObjectInspector inspector;
private final int index;
public StructFieldImpl(final String name, final ObjectInspector inspector, final int index) {
this.name = name;
this.inspector = inspector;
this.index = index;
}
@Override
public String getFieldComment() {
return "";
}
@Override
public String getFieldName() {
return name;
}
public int getIndex() {
return index;
}
@Override
public ObjectInspector getFieldObjectInspector() {
return inspector;
}
@Override
public int getFieldID() {
return index;
}
}
}