private void decodeDictionaryIds()

in ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedPrimitiveColumnReader.java [506:685]


  private void decodeDictionaryIds(
      int rowId,
      int num,
      ColumnVector column,
      TypeInfo columnType,
      LongColumnVector dictionaryIds) {
    System.arraycopy(dictionaryIds.isNull, rowId, column.isNull, rowId, num);
    if (column.noNulls) {
      column.noNulls = dictionaryIds.noNulls;
    }
    column.isRepeating = column.isRepeating && dictionaryIds.isRepeating;


    PrimitiveTypeInfo primitiveColumnType = (PrimitiveTypeInfo) columnType;

    switch (primitiveColumnType.getPrimitiveCategory()) {
    case INT:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((LongColumnVector) column).vector[i] =
                  dictionary.readInteger((int) dictionaryIds.vector[i]);
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            ((LongColumnVector) column).vector[i] = 0;
          }
        }
      }
      break;
    case BYTE:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((LongColumnVector) column).vector[i] =
                  dictionary.readTinyInt((int) dictionaryIds.vector[i]);
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            ((LongColumnVector) column).vector[i] = 0;
          }
        }
      }
      break;
    case SHORT:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((LongColumnVector) column).vector[i] =
                  dictionary.readSmallInt((int) dictionaryIds.vector[i]);
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            ((LongColumnVector) column).vector[i] = 0;
          }
        }
      }
      break;
    case DATE:
      DateColumnVector dc = (DateColumnVector) column;
      dc.setUsingProlepticCalendar(true);
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          dc.vector[i] =
                  skipProlepticConversion ?
                          dictionary.readLong((int) dictionaryIds.vector[i]) :
                          CalendarUtils.convertDateToProleptic((int) dictionary.readLong((int) dictionaryIds.vector[i]));
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            dc.vector[i] = 0;
          }
        }
      }
      break;
    case INTERVAL_YEAR_MONTH:
    case LONG:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((LongColumnVector) column).vector[i] =
                  dictionary.readLong((int) dictionaryIds.vector[i]);
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            ((LongColumnVector) column).vector[i] = 0;
          }
        }
      }
      break;
    case BOOLEAN:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((LongColumnVector) column).vector[i] =
                  dictionary.readBoolean((int) dictionaryIds.vector[i]) ? 1 : 0;
        }
      }
      break;
    case DOUBLE:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((DoubleColumnVector) column).vector[i] =
                  dictionary.readDouble((int) dictionaryIds.vector[i]);
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            ((DoubleColumnVector) column).vector[i] = 0;
          }
        }
      }
      break;
    case BINARY:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((BytesColumnVector) column)
                  .setVal(i, dictionary.readBytes((int) dictionaryIds.vector[i]));
        }
      }
      break;
    case STRING:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((BytesColumnVector) column)
                  .setVal(i, dictionary.readString((int) dictionaryIds.vector[i]));
        }
      }
      break;
    case VARCHAR:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((BytesColumnVector) column)
                  .setVal(i, dictionary.readVarchar((int) dictionaryIds.vector[i]));
        }
      }
      break;
    case CHAR:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((BytesColumnVector) column)
                  .setVal(i, dictionary.readChar((int) dictionaryIds.vector[i]));
        }
      }
      break;
    case FLOAT:
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          ((DoubleColumnVector) column).vector[i] =
                  dictionary.readFloat((int) dictionaryIds.vector[i]);
          if (!dictionary.isValid()) {
            setNullValue(column, i);
            ((DoubleColumnVector) column).vector[i] = 0;
          }
        }
      }
      break;
    case DECIMAL:
      DecimalLogicalTypeAnnotation decimalLogicalType = null;
      if (type.getLogicalTypeAnnotation() instanceof DecimalLogicalTypeAnnotation) {
        decimalLogicalType = (DecimalLogicalTypeAnnotation) type.getLogicalTypeAnnotation();
      }
      DecimalColumnVector decimalColumnVector = ((DecimalColumnVector) column);
      byte[] decimalData = null;

      fillDecimalPrecisionScale(decimalLogicalType, decimalColumnVector);

      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          decimalData = dictionary.readDecimal((int) dictionaryIds.vector[i]);
          if (dictionary.isValid()) {
            decimalColumnVector.vector[i].set(decimalData, decimalColumnVector.scale);
          } else {
            setNullValue(column, i);
          }
        }
      }
      break;
    case TIMESTAMP:
      TimestampColumnVector tsc = (TimestampColumnVector) column;
      tsc.setUsingProlepticCalendar(true);
      for (int i = rowId; i < rowId + num; ++i) {
        if (!column.isNull[i]) {
          tsc.set(i, dictionary.readTimestamp((int) dictionaryIds.vector[i]).toSqlTimestamp());
        }
      }
      break;
    case INTERVAL_DAY_TIME:
    default:
      throw new UnsupportedOperationException("Unsupported type: " + type);
    }
  }