Github user ravipesala commented on a diff in the pull request:
https://github.com/apache/carbondata/pull/2417#discussion_r198864334
--- Diff:
core/src/main/java/org/apache/carbondata/core/datastore/chunk/store/ColumnPageWrapper.java
---
@@ -77,14 +134,115 @@ public boolean isExplicitSorted() {
return false;
}
- @Override
- public int compareTo(int rowId, byte[] compareValue) {
- throw new UnsupportedOperationException("internal error");
+ @Override public int compareTo(int rowId, byte[] compareValue) {
+ if (columnPage.getColumnSpec().getColumnType() ==
ColumnType.DIRECT_DICTIONARY) {
+ int surrogate = columnPage.getInt(rowId);
+ int input = ByteBuffer.wrap(compareValue).getInt();
+ return surrogate - input;
+ } else {
+ byte[] data;
+ if (columnPage.getDataType() == DataTypes.INT) {
+ data = ByteUtil.toBytes(columnPage.getInt(rowId));
+ } else if (columnPage.getDataType() == DataTypes.STRING) {
+ data = columnPage.getBytes(rowId);
+ } else {
+ throw new RuntimeException("invalid data type for dimension: " +
columnPage.getDataType());
+ }
+ return ByteUtil.UnsafeComparer.INSTANCE
+ .compareTo(data, 0, data.length, compareValue, 0,
compareValue.length);
+ }
}
@Override
public void freeMemory() {
}
+ private void fillData(int[] rowMapping, ColumnVectorInfo
columnVectorInfo,
+ CarbonColumnVector vector) {
+ int offsetRowId = columnVectorInfo.offset;
+ int vectorOffset = columnVectorInfo.vectorOffset;
+ int maxRowId = offsetRowId + columnVectorInfo.size;
+ BitSet nullBitset = columnPage.getNullBits();
+ switch (columnSpec.getColumnType()) {
+ case DIRECT_DICTIONARY:
+ DirectDictionaryGenerator generator =
columnVectorInfo.directDictionaryGenerator;
+ assert (generator != null);
+ DataType dataType = generator.getReturnType();
+ for (int rowId = offsetRowId; rowId < maxRowId; rowId++) {
+ int currentRowId = (rowMapping == null) ? rowId :
rowMapping[rowId];
+ if (nullBitset.get(currentRowId)) {
+ vector.putNull(vectorOffset++);
+ } else {
+ int surrogate = columnPage.getInt(currentRowId);
+ Object valueFromSurrogate =
generator.getValueFromSurrogate(surrogate);
+ if (valueFromSurrogate == null) {
+ vector.putNull(vectorOffset++);
+ } else {
+ if (dataType == DataTypes.INT) {
+ vector.putInt(vectorOffset++, (int) valueFromSurrogate);
+ } else {
+ vector.putLong(vectorOffset++, (long) valueFromSurrogate);
+ }
+ }
+ }
+ }
+ break;
+ case GLOBAL_DICTIONARY:
+ for (int rowId = offsetRowId; rowId < maxRowId; rowId++) {
+ int currentRowId = (rowMapping == null) ? rowId :
rowMapping[rowId];
+ if (nullBitset.get(currentRowId)) {
+ vector.putNull(vectorOffset++);
+ } else {
+ int data = columnPage.getInt(currentRowId);
+ vector.putInt(vectorOffset++, data);
+ }
+ }
+ break;
+ case PLAIN_VALUE:
+ for (int rowId = offsetRowId; rowId < maxRowId; rowId++) {
+ int currentRowId = (rowMapping == null) ? rowId :
rowMapping[rowId];
+ if (nullBitset.get(currentRowId)) {
+ vector.putNull(vectorOffset++);
+ } else {
+ if (columnSpec.getSchemaDataType() == DataTypes.STRING) {
+ byte[] data = columnPage.getBytes(currentRowId);
+ if (isNullPlainValue(data)) {
+ vector.putNull(vectorOffset++);
+ } else {
+ vector.putBytes(vectorOffset++, 0, data.length, data);
+ }
+ } else if (columnSpec.getSchemaDataType() ==
DataTypes.BOOLEAN) {
+ boolean data = columnPage.getBoolean(currentRowId);
+ vector.putBoolean(vectorOffset++, (boolean) data);
+ } else if (columnSpec.getSchemaDataType() == DataTypes.INT) {
+ // TODO have to check for other dataTypes. Only INT
Specified Now.
+ int data = columnPage.getInt(currentRowId);
+ vector.putInt(vectorOffset++, (int) data);
--- End diff --
remove all typecasts, not required
---