Github user ravipesala commented on a diff in the pull request:
https://github.com/apache/carbondata/pull/2375#discussion_r196307015
--- 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())) {
--- End diff --
You should not check string contains as partial string also can match, do
proper split and then match
---