Github user ravipesala commented on a diff in the pull request:

    https://github.com/apache/carbondata/pull/2417#discussion_r198865395
  
    --- 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);
    +            } else if (columnSpec.getSchemaDataType() == DataTypes.LONG) {
    +              long data = columnPage.getLong(currentRowId);
    +              vector.putLong(vectorOffset++, (long) data);
    +            } else if (columnSpec.getSchemaDataType() == 
DataTypes.TIMESTAMP) {
    +              long data = columnPage.getLong(currentRowId);
    +              vector.putLong(vectorOffset++, (long) data);
    +            } else if (columnSpec.getSchemaDataType() == DataTypes.FLOAT) {
    +              float data = columnPage.getFloat(currentRowId);
    +              vector.putFloat(vectorOffset++, (float) data);
    +            } else if (columnSpec.getSchemaDataType() == DataTypes.DOUBLE) 
{
    +              double data = columnPage.getDouble(currentRowId);
    +              vector.putDouble(vectorOffset++, (double) data);
    +            }
    --- End diff --
    
    Try to implement for decimal also later. Please raise jira for it


---

Reply via email to