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

    https://github.com/apache/carbondata/pull/2559#discussion_r205975814
  
    --- Diff: 
core/src/main/java/org/apache/carbondata/core/scan/collector/impl/DictionaryBasedResultCollector.java
 ---
    @@ -141,22 +141,50 @@ public 
DictionaryBasedResultCollector(BlockExecutionInfo blockExecutionInfos) {
           }
           fillMeasureData(scannedResult, row);
           if 
(scannedResult.complexParentIndexToQueryMap.toString().contains("StructQueryType"))
 {
    -        // If a : <b,c> and d : <e,f> are two struct and if a.b,a.c,d.e is 
given in the
    -        // projection list,then object array will contain a,null,d as 
result, because for a.b,
    -        // a will be filled and for a.c null will be placed.
    -        // Instead place null in the end of object array and send a,d,null 
as result.
    -        int count = 0;
    -        for (int j = 0; j < row.length; j++) {
    -          if (row[j] != null) row[count++] = row[j];
    +        boolean[] isComplexChildColumn = new 
boolean[queryDimensions.length + queryMeasures.length];
    +        for (ProjectionDimension dimension : queryDimensions) {
    +          if (null != 
dimension.getDimension().getComplexParentDimension()) {
    +            isComplexChildColumn[dimension.getOrdinal()] = true;
    +          }
             }
    -        while (count < row.length) row[count++] = null;
    +        shiftNullForStruct(row, isComplexChildColumn);
           }
           listBasedResult.add(row);
           rowCounter++;
         }
         return listBasedResult;
       }
     
    +  /**
    +   * shift the complex column null to the end
    +   *
    +   * @param row
    +   * @param isComplexChildColumn
    +   */
    +  private void shiftNullForStruct(Object[] row, boolean[] 
isComplexChildColumn) {
    +    int count = 0;
    +    int dataTypeCount = 0;
    +    // If a : <b,c> and d : <e,f> are two struct and if a.b,a.c,d.e is 
given in the
    +    // projection list,then object array will contain a,null,d as result, 
because for a.b,
    +    // a will be filled and for a.c null will be placed.
    +    // Instead place null in the end of object array and send a,d,null as 
result.
    +    for (int j = 0; j < row.length; j++) {
    +      if (null == row[j] && !isComplexChildColumn[j]) {
    +        // if it is a primitive column, don't shift the null to the end.
    +        row[count++] = null;
    +        isComplexChildColumn[dataTypeCount++] = false;
    +      } else if (null != row[j]) {
    +        row[count++] = row[j];
    +        isComplexChildColumn[dataTypeCount++] = isComplexChildColumn[j];
    +      }
    +    }
    +    // fill the skipped content
    +    while (count < row.length) row[count++] = null;
    +    while (dataTypeCount < isComplexChildColumn.length) {
    +      isComplexChildColumn[dataTypeCount++] = true;
    --- End diff --
    
    Why this filling of array is required here? are you using this array in 
caller.


---

Reply via email to