Github user ravipesala commented on a diff in the pull request: https://github.com/apache/carbondata/pull/2375#discussion_r196307346 --- Diff: core/src/main/java/org/apache/carbondata/core/util/CarbonUtil.java --- @@ -3000,5 +3019,95 @@ public static String getBlockId(AbsoluteTableIdentifier identifier, String fileP } return blockId; } + + /** + * sets the local dictionary columns to wrapper schema, if the table property local_dict_include + * is defined, then those columns will be set as local dictionary columns, if not, all the no + * dictionary string datatype columns are set as local dictionary columns. + * Handling for complexTypes:: + * Since the column structure will be flat + * if the parent column is configured as local Dictionary column, then it gets the child column + * count and then sets the primitive child column as local dictionary column if it is string + * datatype column + * Handling for both localDictionary Include and exclude columns: + * There will be basically four scenarios which are + * ------------------------------------------------------- + * | Local_Dictionary_include | Local_Dictionary_Exclude | + * ------------------------------------------------------- + * | Not Defined | Not Defined | + * | Not Defined | Defined | + * | Defined | Not Defined | + * | Defined | Defined | + * ------------------------------------------------------- + * 1. when the both local dictionary include and exclude is not defined, then set all the no + * dictionary string datatype columns as local dictionary generate columns + * 2. set all the no dictionary string datatype columns as local dictionary columns except the + * columns present in local dictionary exclude + * 3. & 4. when local dictionary include is defined, no need to check dictionary exclude columns + * configured or not, we just need to set only the columns present in local dictionary include as + * local dictionary columns + * @param columns + * @param mainTableProperties + */ + public static void setLocalDictColumnsToWrapperSchema(List<ColumnSchema> columns, + Map<String, String> mainTableProperties) { + String isLocalDictEnabledForMainTable = + mainTableProperties.get(CarbonCommonConstants.LOCAL_DICT_ENABLE); + String localDictIncludeColumnsOfMainTable = + mainTableProperties.get(CarbonCommonConstants.LOCAL_DICT_INCLUDE); + String localDictExcludeColumnsOfMainTable = + mainTableProperties.get(CarbonCommonConstants.LOCAL_DICT_EXCLUDE); + if (null != isLocalDictEnabledForMainTable && Boolean + .parseBoolean(isLocalDictEnabledForMainTable)) { + int childColumnCount = 0; + for (ColumnSchema column : columns) { + // for complex type columns, user gives the parent column as local dictionary column and + // only the string primitive type child column will be set as local dictionary column in the + // schema + if (childColumnCount > 0) { + if (column.getDataType().equals(DataTypes.STRING)) { + column.setLocalDictColumn(true); + childColumnCount -= 1; + } else { + childColumnCount -= 1; + } + } + // if complex column is defined in local dictionary include column, then get the child + // columns and set the string datatype child type as local dictionary column + if (column.getNumberOfChild() > 0 && null != localDictIncludeColumnsOfMainTable + && localDictIncludeColumnsOfMainTable.toLowerCase() + .contains(column.getColumnName().toLowerCase())) { + childColumnCount = column.getNumberOfChild(); + } + if (null == localDictIncludeColumnsOfMainTable) { + // if local dictionary exclude columns is not defined, then set all the no dictionary + // string datatype column + if (null == localDictExcludeColumnsOfMainTable) { + // column should be no dictionary string datatype column + if (column.isDimensionColumn() && column.getDataType().equals(DataTypes.STRING) + && !column.hasEncoding(Encoding.DICTIONARY)) { + column.setLocalDictColumn(true); + } + // if local dictionary exclude columns is defined, then set for all no dictionary string + // datatype columns except excluded columns + } else { + if (column.isDimensionColumn() && column.getDataType().equals(DataTypes.STRING) + && !column.hasEncoding(Encoding.DICTIONARY) && !localDictExcludeColumnsOfMainTable + .toLowerCase().contains(column.getColumnName().toLowerCase())) { + column.setLocalDictColumn(true); + } + } + } else { + // if local dict columns alre not configured, set for all no dictionary string datatype + // column + if (column.isDimensionColumn() && column.getDataType().equals(DataTypes.STRING) && !column + .hasEncoding(Encoding.DICTIONARY) && localDictIncludeColumnsOfMainTable.toLowerCase() --- End diff -- same as above comment
---