in core/src/main/java/org/apache/carbondata/core/util/CarbonUtil.java [2927:3040]
public static void setLocalDictColumnsToWrapperSchema(List<ColumnSchema> columns,
Map<String, String> mainTableProperties, String isLocalDictEnabledForMainTable) {
String[] listOfDictionaryIncludeColumns = null;
String[] listOfDictionaryExcludeColumns = null;
String localDictIncludeColumns =
mainTableProperties.get(CarbonCommonConstants.LOCAL_DICTIONARY_INCLUDE);
String localDictExcludeColumns =
mainTableProperties.get(CarbonCommonConstants.LOCAL_DICTIONARY_EXCLUDE);
if (null != localDictIncludeColumns) {
listOfDictionaryIncludeColumns = localDictIncludeColumns.trim().split("\\s*,\\s*");
}
if (null != localDictExcludeColumns) {
listOfDictionaryExcludeColumns = localDictExcludeColumns.trim().split("\\s*,\\s*");
}
if (null != isLocalDictEnabledForMainTable && Boolean
.parseBoolean(isLocalDictEnabledForMainTable)) {
int ordinal = 0;
for (int i = 0; i < columns.size(); i++) {
ColumnSchema column = columns.get(i);
if (null == localDictIncludeColumns) {
// if local dictionary exclude columns is not defined, then set all the no dictionary
// string datatype column and varchar datatype columns
if (null == localDictExcludeColumns) {
// if column is complex type, call the setLocalDictForComplexColumns to set local
// dictionary for all string and varchar child columns
if (column.getDataType().isComplexType()) {
ordinal = i + 1;
ordinal = setLocalDictForComplexColumns(columns, ordinal, column.getNumberOfChild());
i = ordinal - 1;
} else {
ordinal = i;
}
if (ordinal < columns.size()) {
column = columns.get(ordinal);
} else {
continue;
}
// column should be no dictionary string datatype column or varchar datatype column
if (column.isDimensionColumn() &&
(column.getDataType().equals(DataTypes.STRING) ||
column.getDataType().equals(DataTypes.VARCHAR))) {
column.setLocalDictColumn(true);
}
// if local dictionary exclude columns is defined, then set for all no dictionary string
// datatype columns and varchar datatype columns except excluded columns
} else {
if (!Arrays.asList(listOfDictionaryExcludeColumns).contains(column.getColumnName())
&& column.getDataType().isComplexType()) {
ordinal = i + 1;
ordinal = setLocalDictForComplexColumns(columns, ordinal, column.getNumberOfChild());
i = ordinal - 1;
} else if (
// if complex column is defined in Local Dictionary Exclude, then
// unsetLocalDictForComplexColumns is mainly used to increment the ordinal value
// required for traversing
Arrays.asList(listOfDictionaryExcludeColumns).contains(column.getColumnName())
&& column.getDataType().isComplexType()) {
ordinal = i + 1;
ordinal =
unsetLocalDictForComplexColumns(columns, ordinal, column.getNumberOfChild());
i = ordinal - 1;
} else {
ordinal = i;
}
if (ordinal < columns.size()) {
column = columns.get(ordinal);
} else {
continue;
}
//if column is primitive string or varchar and no dictionary column,then set local
// dictionary if not specified as local dictionary exclude
if (column.isDimensionColumn() &&
(column.getDataType().equals(DataTypes.STRING) ||
column.getDataType().equals(DataTypes.VARCHAR))) {
if (!Arrays.asList(listOfDictionaryExcludeColumns).contains(column.getColumnName())) {
column.setLocalDictColumn(true);
}
}
}
} else {
// if column is complex type, call the setLocalDictForComplexColumns to set local
// dictionary for all string and varchar child columns which are defined in
// local dictionary include
if (localDictIncludeColumns.contains(column.getColumnName()) && column.getDataType()
.isComplexType()) {
ordinal = i + 1;
ordinal = setLocalDictForComplexColumns(columns, ordinal, column.getNumberOfChild());
i = ordinal - 1;
} else {
ordinal = i;
}
// if local dict columns are configured, set for all no dictionary string datatype or
// varchar type column
if (ordinal < columns.size()) {
column = columns.get(ordinal);
} else {
continue;
}
if (column.isDimensionColumn() &&
(column.getDataType().equals(DataTypes.STRING) ||
column.getDataType().equals(DataTypes.VARCHAR)) &&
localDictIncludeColumns.toLowerCase()
.contains(column.getColumnName().toLowerCase())) {
for (String dictColumn : listOfDictionaryIncludeColumns) {
if (dictColumn.trim().equalsIgnoreCase(column.getColumnName())) {
column.setLocalDictColumn(true);
}
}
}
}
}
}
}