int precision = vectorInfo.measure.getMeasure().getPrecision(); for (int i = 0; i < pageSize; i++) { BigDecimal decimal = decimalConverter.getDecimal(max - pageData[i]); if (decimal.scale() < newScale) { decimal = decimal.setScale(newScale); for (int i = 0; i < size; i += DataTypes.SHORT.getSizeInBytes()) { BigDecimal decimal = decimalConverter.getDecimal(max - ByteUtil.toShortLittleEndian(pageData, i)); if (decimal.scale() < newScale) { decimal = decimal.setScale(newScale); for (int i = 0; i < pageSize; i++) { int shortInt = ByteUtil.valueOf3Bytes(pageData, i * 3); BigDecimal decimal = decimalConverter.getDecimal(max - shortInt); if (decimal.scale() < newScale) { decimal = decimal.setScale(newScale); for (int i = 0; i < size; i += DataTypes.INT.getSizeInBytes()) { BigDecimal decimal = decimalConverter.getDecimal(max - ByteUtil.toIntLittleEndian(pageData, i)); if (decimal.scale() < newScale) { decimal = decimal.setScale(newScale); for (int i = 0; i < size; i += DataTypes.LONG.getSizeInBytes()) { BigDecimal decimal = decimalConverter.getDecimal(max - ByteUtil.toLongLittleEndian(pageData, i)); if (decimal.scale() < newScale) { decimal = decimal.setScale(newScale);
@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"); } }
} else if (DataTypes.isDecimal(vectorDataType)) { DecimalConverterFactory.DecimalConverter decimalConverter = vectorInfo.decimalConverter; decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else if (vectorDataType == DataTypes.FLOAT) { for (int i = 0; i < pageSize; i++) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else if (vectorDataType == DataTypes.FLOAT) { for (int i = 0; i < size; i += DataTypes.SHORT.getSizeInBytes()) { DecimalConverterFactory.DecimalConverter decimalConverter = vectorInfo.decimalConverter; decimalConverter .fillVector(pageData, pageSize, vectorInfo, nullBits, DataTypes.SHORT_INT); } else if (vectorDataType == DataTypes.FLOAT) { for (int i = 0; i < pageSize; i++) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else { for (int i = 0; i < size; i += DataTypes.INT.getSizeInBytes()) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType);
} else if (DataTypes.isDecimal(vectorDataType)) { DecimalConverterFactory.DecimalConverter decimalConverter = vectorInfo.decimalConverter; decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else { for (int i = 0; i < pageSize; i++) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else { for (int i = 0; i < size; i += DataTypes.SHORT.getSizeInBytes()) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else { for (int i = 0; i < pageSize; i++) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType); } else { for (int i = 0; i < size; i += DataTypes.INT.getSizeInBytes()) { decimalConverter.fillVector(pageData, pageSize, vectorInfo, nullBits, pageDataType);
ColumnPage decimalColumnPage = VarLengthColumnPageBase .newDecimalColumnPage(meta, unCompressData, uncompressedLength); decimalConverter.fillVector(decimalColumnPage.getByteArrayPage(), pageSize, vectorInfo, nullBits, meta.getStoreDataType()); } else {
@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 putDecimal(int rowId, BigDecimal decimal) { switch (decimalConverter.getDecimalConverterType()) { case DECIMAL_INT: if (null == intData) { intData = new int[pageSize]; } putInt(rowId, (int) decimalConverter.convert(decimal)); break; case DECIMAL_LONG: if (null == longData) { longData = new long[pageSize]; } putLong(rowId, (long) decimalConverter.convert(decimal)); break; default: putBytes(rowId, (byte[]) decimalConverter.convert(decimal)); } }
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"); } }
/** * Create a new column page for decimal page */ public static ColumnPage newDecimalColumnPage(ColumnPageEncoderMeta meta, byte[] lvEncodedBytes, int actualDataLength) throws MemoryException { TableSpec.ColumnSpec columnSpec = meta.getColumnSpec(); DecimalConverterFactory.DecimalConverter decimalConverter = DecimalConverterFactory.INSTANCE.getDecimalConverter(columnSpec.getPrecision(), columnSpec.getScale()); int size = decimalConverter.getSize(); if (size < 0) { return getLVBytesColumnPage(columnSpec, lvEncodedBytes, DataTypes.createDecimalType(columnSpec.getPrecision(), columnSpec.getScale()), CarbonCommonConstants.INT_SIZE_IN_BYTE, meta.getCompressorName()); } else { // Here the size is always fixed. return getDecimalColumnPage(meta, lvEncodedBytes, size, actualDataLength); } }
private BigDecimal getDecimalFromDecompressData(int rowId) { long value; if (columnPageEncoderMeta.getStoreDataType() == DataTypes.BYTE) { value = getByte(rowId); } else if (columnPageEncoderMeta.getStoreDataType() == DataTypes.SHORT) { value = getShort(rowId); } else if (columnPageEncoderMeta.getStoreDataType() == DataTypes.SHORT_INT) { value = getShortInt(rowId); } else if (columnPageEncoderMeta.getStoreDataType() == DataTypes.INT) { value = getInt(rowId); } else if (columnPageEncoderMeta.getStoreDataType() == DataTypes.LONG) { value = getLong(rowId); } else { return decimalConverter.getDecimal(getBytes(rowId)); } return decimalConverter.getDecimal(value); }
private ColumnPageEncoder createEncoderForDecimalDataTypeMeasure(ColumnPage columnPage, TableSpec.ColumnSpec columnSpec) { DecimalConverterFactory.DecimalConverterType decimalConverterType = ((DecimalColumnPage) columnPage).getDecimalConverter().getDecimalConverterType(); switch (decimalConverterType) { case DECIMAL_INT: case DECIMAL_LONG: return selectCodecByAlgorithmForDecimal(columnPage.getStatistics(), decimalConverterType, columnSpec) .createEncoder(null); default: return new DirectCompressCodec(columnPage.getDataType()).createEncoder(null); } }
@Override public void putDecimal(int rowId, BigDecimal decimal) { switch (decimalConverter.getDecimalConverterType()) { case DECIMAL_INT: putInt(rowId, (int) decimalConverter.convert(decimal)); break; case DECIMAL_LONG: putLong(rowId, (long) decimalConverter.convert(decimal)); break; default: putBytes(rowId, (byte[]) decimalConverter.convert(decimal)); } }
private BigDecimal getDecimalFromRawData(int rowId) { long value; switch (decimalConverter.getDecimalConverterType()) { case DECIMAL_INT: value = getInt(rowId); break; case DECIMAL_LONG: value = getLong(rowId); break; default: value = getByte(rowId); } return decimalConverter.getDecimal(value); }