@Override public double getDouble(int rowId) { DataType dataType = columnPage.getDataType(); if (dataType == DataTypes.BOOLEAN || dataType == DataTypes.BYTE) { return converter.decodeDouble(columnPage.getByte(rowId)); } else if (dataType == DataTypes.SHORT) { return converter.decodeDouble(columnPage.getShort(rowId)); } else if (dataType == DataTypes.SHORT_INT) { return converter.decodeDouble(columnPage.getShortInt(rowId)); } else if (dataType == DataTypes.INT) { return converter.decodeDouble(columnPage.getInt(rowId)); } else if (dataType == DataTypes.LONG) { return converter.decodeDouble(columnPage.getLong(rowId)); } else if (dataType == DataTypes.FLOAT) { return converter.decodeDouble(columnPage.getFloat(rowId)); } else if (dataType == DataTypes.DOUBLE) { return columnPage.getDouble(rowId); } else { throw new RuntimeException("internal error: " + this.toString()); } }
@Override public long getLong(int rowId) { DataType dataType = columnPage.getDataType(); if (dataType == DataTypes.BOOLEAN || dataType == DataTypes.BYTE) { return converter.decodeLong(columnPage.getByte(rowId)); } else if (dataType == DataTypes.SHORT) { return converter.decodeLong(columnPage.getShort(rowId)); } else if (dataType == DataTypes.SHORT_INT) { return converter.decodeLong(columnPage.getShortInt(rowId)); } else if (dataType == DataTypes.INT) { return converter.decodeLong(columnPage.getInt(rowId)); } else if (dataType == DataTypes.LONG) { return columnPage.getLong(rowId); } else { throw new RuntimeException("internal error: " + this.toString()); } }
@Override public void convertValue(ColumnPageValueConverter codec) { switch (decimalConverter.getDecimalConverterType()) { case DECIMAL_INT: for (int i = 0; i < pageSize; i++) { codec.encode(i, intData[i]); } break; case DECIMAL_LONG: for (int i = 0; i < pageSize; i++) { codec.encode(i, longData[i]); } break; default: throw new UnsupportedOperationException("not support value conversion on " + columnPageEncoderMeta.getStoreDataType() + " page"); } }
@Override public void decodeAndFillVector(byte[] input, int offset, int length, ColumnVectorInfo vectorInfo, BitSet nullBits, boolean isLVEncoded, int pageSize, ReusableDataBuffer reusableDataBuffer) throws MemoryException, IOException { Compressor compressor = CompressorFactory.getInstance().getCompressor(meta.getCompressorName()); byte[] unCompressData; if (null != reusableDataBuffer && compressor.supportReusableBuffer()) { int uncompressedLength = compressor.unCompressedLength(input, offset, length); unCompressData = reusableDataBuffer.getDataBuffer(uncompressedLength); compressor.rawUncompress(input, offset, length, unCompressData); } else { unCompressData = compressor.unCompressByte(input, offset, length); } converter.decodeAndFillVector(unCompressData, vectorInfo, nullBits, meta.getStoreDataType(), pageSize); }
@Override public void decodeAndFillVector(byte[] input, int offset, int length, ColumnVectorInfo vectorInfo, BitSet nullBits, boolean isLVEncoded, int pageSize, ReusableDataBuffer reusableDataBuffer) throws MemoryException, IOException { Compressor compressor = CompressorFactory.getInstance().getCompressor(meta.getCompressorName()); byte[] unCompressData; if (null != reusableDataBuffer && compressor.supportReusableBuffer()) { int uncompressedLength = compressor.unCompressedLength(input, offset, length); unCompressData = reusableDataBuffer.getDataBuffer(uncompressedLength); compressor.rawUncompress(input, offset, length, unCompressData); } else { unCompressData = compressor.unCompressByte(input, offset, length); } converter.decodeAndFillVector(unCompressData, vectorInfo, nullBits, meta.getStoreDataType(), pageSize); }
} else { converter .decodeAndFillVector(unCompressData, vectorInfo, nullBits, meta.getStoreDataType(), pageSize); .decodeAndFillVector(unCompressData, vectorInfo, nullBits, meta.getStoreDataType(), pageSize);
private void convertValueForDecimalType(ColumnPageValueConverter codec) { switch (decimalConverter.getDecimalConverterType()) { case DECIMAL_INT: for (int i = 0; i < pageSize; i++) { long offset = (long)i << intBits; codec.encode(i, CarbonUnsafe.getUnsafe().getInt(baseAddress, baseOffset + offset)); } break; case DECIMAL_LONG: for (int i = 0; i < pageSize; i++) { long offset = (long)i << longBits; codec.encode(i, CarbonUnsafe.getUnsafe().getLong(baseAddress, baseOffset + offset)); } break; default: throw new UnsupportedOperationException("not support value conversion on " + columnPageEncoderMeta.getStoreDataType() + " page"); } }
@Override public BigDecimal getDecimal(int rowId) { DecimalConverterFactory.DecimalConverter decimalConverter = ((DecimalColumnPage) columnPage).getDecimalConverter(); DataType dataType = columnPage.getDataType(); if (dataType == DataTypes.BYTE) { return decimalConverter.getDecimal(converter.decodeLong(columnPage.getByte(rowId))); } else if (dataType == DataTypes.SHORT) { return decimalConverter.getDecimal(converter.decodeLong(columnPage.getShort(rowId))); } else if (dataType == DataTypes.SHORT_INT) { return decimalConverter.getDecimal(converter.decodeLong(columnPage.getShortInt(rowId))); } else if (dataType == DataTypes.INT) { return decimalConverter.getDecimal(converter.decodeLong(columnPage.getInt(rowId))); } else if (dataType == DataTypes.LONG || DataTypes.isDecimal(dataType)) { return columnPage.getDecimal(rowId); } else { throw new RuntimeException("internal error: " + this.toString()); } }
@Override public void decodeAndFillVector(byte[] input, int offset, int length, ColumnVectorInfo vectorInfo, BitSet nullBits, boolean isLVEncoded, int pageSize, ReusableDataBuffer reusableDataBuffer) throws MemoryException, IOException { Compressor compressor = CompressorFactory.getInstance().getCompressor(meta.getCompressorName()); byte[] unCompressData; if (null != reusableDataBuffer && compressor.supportReusableBuffer()) { int uncompressedLength = compressor.unCompressedLength(input, offset, length); unCompressData = reusableDataBuffer.getDataBuffer(uncompressedLength); compressor.rawUncompress(input, offset, length, unCompressData); } else { unCompressData = compressor.unCompressByte(input, offset, length); } if (DataTypes.isDecimal(meta.getSchemaDataType())) { TableSpec.ColumnSpec columnSpec = meta.getColumnSpec(); DecimalConverterFactory.DecimalConverter decimalConverter = DecimalConverterFactory.INSTANCE .getDecimalConverter(columnSpec.getPrecision(), columnSpec.getScale()); vectorInfo.decimalConverter = decimalConverter; } converter.decodeAndFillVector(unCompressData, vectorInfo, nullBits, meta.getStoreDataType(), pageSize); }
@Override public void decodeAndFillVector(byte[] input, int offset, int length, ColumnVectorInfo vectorInfo, BitSet nullBits, boolean isLVEncoded, int pageSize, ReusableDataBuffer reusableDataBuffer) throws MemoryException, IOException { Compressor compressor = CompressorFactory.getInstance().getCompressor(meta.getCompressorName()); byte[] unCompressData; if (null != reusableDataBuffer && compressor.supportReusableBuffer()) { int uncompressedLength = compressor.unCompressedLength(input, offset, length); unCompressData = reusableDataBuffer.getDataBuffer(uncompressedLength); compressor.rawUncompress(input, offset, length, unCompressData); } else { unCompressData = compressor.unCompressByte(input, offset, length); } if (DataTypes.isDecimal(meta.getSchemaDataType())) { TableSpec.ColumnSpec columnSpec = meta.getColumnSpec(); DecimalConverterFactory.DecimalConverter decimalConverter = DecimalConverterFactory.INSTANCE .getDecimalConverter(columnSpec.getPrecision(), columnSpec.getScale()); vectorInfo.decimalConverter = decimalConverter; } converter.decodeAndFillVector(unCompressData, vectorInfo, nullBits, meta.getStoreDataType(), pageSize); }
for (long i = 0; i < endLoop; i++) { long offset = i << byteBits; codec.encode((int) i, CarbonUnsafe.getUnsafe().getByte(baseAddress, baseOffset + offset)); codec.encode((int) i, CarbonUnsafe.getUnsafe().getShort(baseAddress, baseOffset + offset)); codec.encode((int) i, CarbonUnsafe.getUnsafe().getInt(baseAddress, baseOffset + offset)); codec.encode((int) i, CarbonUnsafe.getUnsafe().getLong(baseAddress, baseOffset + offset)); codec.encode((int) i, CarbonUnsafe.getUnsafe().getFloat(baseAddress, baseOffset + offset)); codec.encode((int) i, CarbonUnsafe.getUnsafe().getDouble(baseAddress, baseOffset + offset));