All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shark.memstore2.ColumnarStructObjectInspector.scala Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 The Regents of The University California.
 * All rights reserved.
 *
 * Licensed 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 shark.memstore2

import java.util.{ArrayList => JArrayList, List => JList}

import org.apache.hadoop.hive.serde2.`lazy`.LazyFactory
import org.apache.hadoop.hive.serde2.`lazy`.LazySimpleSerDe.SerDeParameters
import org.apache.hadoop.hive.serde2.objectinspector.{ObjectInspector, ObjectInspectorUtils,
  StructField, StructObjectInspector}
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo


class ColumnarStructObjectInspector(fields: JList[StructField]) extends StructObjectInspector {

  override def getCategory: Category = Category.STRUCT

  override def getTypeName: String = ObjectInspectorUtils.getStandardStructTypeName(this)

  override def getStructFieldRef(fieldName: String): StructField =
    ObjectInspectorUtils.getStandardStructFieldRef(fieldName, fields)

  override def getAllStructFieldRefs: JList[_ <: StructField] = fields

  override def getStructFieldData(data: Object, fieldRef: StructField): Object =
    data.asInstanceOf[ColumnarStruct].getField(
        fieldRef.asInstanceOf[ColumnarStructObjectInspector.IDStructField].fieldID)

  override def getStructFieldsDataAsList(data: Object): JList[Object] =
    if (data == null) null else data.asInstanceOf[ColumnarStruct].getFieldsAsList()
}


object ColumnarStructObjectInspector {

  def apply(serDeParams: SerDeParameters): ColumnarStructObjectInspector = {

    val columnNames = serDeParams.getColumnNames()
    val columnTypes = serDeParams.getColumnTypes()
    val fields = new JArrayList[StructField]()
    for (i <- 0 until columnNames.size) {
      val typeInfo = columnTypes.get(i)
      val fieldOI = typeInfo.getCategory match {
        case Category.PRIMITIVE => 
          PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
            typeInfo.asInstanceOf[PrimitiveTypeInfo].getPrimitiveCategory)
        case _ => LazyFactory.createLazyObjectInspector(
            typeInfo, serDeParams.getSeparators(), 1, serDeParams.getNullSequence(),
            serDeParams.isEscaped(), serDeParams.getEscapeChar())
      }
      fields.add(new IDStructField(i, columnNames.get(i), fieldOI))
    }
    new ColumnarStructObjectInspector(fields)
  }

  class IDStructField(
      val fieldID: Int,
      val fieldName: String,
      val fieldObjectInspector: ObjectInspector,
      val fieldComment: String)
    extends StructField {

    def this(fieldID: Int, fieldName: String, fieldObjectInspector: ObjectInspector) =
      this(fieldID, fieldName, fieldObjectInspector, null)

    override def getFieldName: String = fieldName
    override def getFieldObjectInspector: ObjectInspector = fieldObjectInspector
    override def toString(): String = "" + fieldID + ":" + fieldName
    override def getFieldComment() : String = fieldComment
  }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy