Github user kumarvishal09 commented on a diff in the pull request:
https://github.com/apache/carbondata/pull/2467#discussion_r201292476
--- Diff:
core/src/main/java/org/apache/carbondata/core/scan/filter/FilterUtil.java ---
@@ -251,6 +273,137 @@ private static FilterExecuter
getIncludeFilterExecuter(
}
}
+ /**
+ * check if current need to be replaced with TrueFilter expression. This
will happen in case
+ * filter column min/max is not cached in the driver
+ *
+ * @param dimColEvaluatorInfoList
+ * @param msrColEvaluatorInfoList
+ * @param segmentProperties
+ * @param minMaxCacheColumns
+ * @return
+ */
+ private static boolean
checkIfCurrentNodeToBeReplacedWithTrueFilterExpression(
+ List<DimColumnResolvedFilterInfo> dimColEvaluatorInfoList,
+ List<MeasureColumnResolvedFilterInfo> msrColEvaluatorInfoList,
+ SegmentProperties segmentProperties, List<CarbonColumn>
minMaxCacheColumns) {
+ boolean replaceCurrentNodeWithTrueFilter = false;
+ ColumnResolvedFilterInfo columnResolvedFilterInfo = null;
+ if (!msrColEvaluatorInfoList.isEmpty()) {
+ columnResolvedFilterInfo = msrColEvaluatorInfoList.get(0);
+ replaceCurrentNodeWithTrueFilter =
+ checkIfFilterColumnIsCachedInDriver(columnResolvedFilterInfo,
segmentProperties,
+ minMaxCacheColumns, true);
+ } else {
+ columnResolvedFilterInfo = dimColEvaluatorInfoList.get(0);
+ if
(!columnResolvedFilterInfo.getDimension().hasEncoding(Encoding.IMPLICIT)) {
+ replaceCurrentNodeWithTrueFilter =
+ checkIfFilterColumnIsCachedInDriver(columnResolvedFilterInfo,
segmentProperties,
+ minMaxCacheColumns, false);
+ }
+ }
+ return replaceCurrentNodeWithTrueFilter;
+ }
+
+ /**
+ * check if current need to be replaced with TrueFilter expression. This
will happen in case
+ * filter column min/max is not cached in the driver
+ *
+ * @param filterExpressionResolverTree
+ * @param segmentProperties
+ * @param minMaxCacheColumns
+ * @return
+ */
+ private static boolean
checkIfCurrentNodeToBeReplacedWithTrueFilterExpression(
+ FilterResolverIntf filterExpressionResolverTree, SegmentProperties
segmentProperties,
+ List<CarbonColumn> minMaxCacheColumns) {
+ boolean replaceCurrentNodeWithTrueFilter = false;
+ ColumnResolvedFilterInfo columnResolvedFilterInfo = null;
+ if (null !=
filterExpressionResolverTree.getMsrColResolvedFilterInfo()) {
+ columnResolvedFilterInfo =
filterExpressionResolverTree.getMsrColResolvedFilterInfo();
+ replaceCurrentNodeWithTrueFilter =
+ checkIfFilterColumnIsCachedInDriver(columnResolvedFilterInfo,
segmentProperties,
+ minMaxCacheColumns, true);
+ } else {
+ columnResolvedFilterInfo =
filterExpressionResolverTree.getDimColResolvedFilterInfo();
+ if
(!columnResolvedFilterInfo.getDimension().hasEncoding(Encoding.IMPLICIT)) {
+ replaceCurrentNodeWithTrueFilter =
+ checkIfFilterColumnIsCachedInDriver(columnResolvedFilterInfo,
segmentProperties,
+ minMaxCacheColumns, false);
+ }
+ }
+ return replaceCurrentNodeWithTrueFilter;
+ }
+
+ /**
+ * Method to check whether current node needs to be replaced with true
filter to avoid pruning
+ * for case when filter column is not cached in the min/max cached
dimension
+ *
+ * @param columnResolvedFilterInfo
+ * @param segmentProperties
+ * @param minMaxCacheColumns
+ * @param isMeasure
+ * @return
+ */
+ private static boolean checkIfFilterColumnIsCachedInDriver(
+ ColumnResolvedFilterInfo columnResolvedFilterInfo, SegmentProperties
segmentProperties,
+ List<CarbonColumn> minMaxCacheColumns, boolean isMeasure) {
+ boolean replaceCurrentNodeWithTrueFilter = false;
+ CarbonColumn columnFromCurrentBlock = null;
+ if (isMeasure) {
+ columnFromCurrentBlock = segmentProperties
+
.getMeasureFromCurrentBlock(columnResolvedFilterInfo.getMeasure().getColumnId());
+ } else {
+ columnFromCurrentBlock =
+
segmentProperties.getDimensionFromCurrentBlock(columnResolvedFilterInfo.getDimension());
+ }
+ if (null != columnFromCurrentBlock) {
+ // check for filter dimension in the cached column list
+ if (null != minMaxCacheColumns) {
+ int columnIndexInMinMaxByteArray =
+ getFilterDimensionIndexInCachedColumns(minMaxCacheColumns,
columnFromCurrentBlock);
+ if (columnIndexInMinMaxByteArray != -1) {
+
columnResolvedFilterInfo.setColumnIndexInMinMaxByteArray(columnIndexInMinMaxByteArray);
+ } else {
+ // will be true only if column caching is enabled and current
filter column is not cached
+ replaceCurrentNodeWithTrueFilter = true;
+ }
+ } else {
+ // if columns to be cached are not specified then in that case all
columns will be cached
+ // and then the ordinal of column will be its index in the
min/max byte array
+ if (isMeasure) {
+ columnResolvedFilterInfo.setColumnIndexInMinMaxByteArray(
+ segmentProperties.getLastDimensionColOrdinal() +
columnFromCurrentBlock.getOrdinal());
+ } else {
+ columnResolvedFilterInfo
+
.setColumnIndexInMinMaxByteArray(columnFromCurrentBlock.getOrdinal());
+ }
+ }
+ }
+ return replaceCurrentNodeWithTrueFilter;
+ }
+
+ /**
+ * Method to check whether the filter dimension exists in the cached
dimensions for a table
+ *
+ * @param carbonDimensionsToBeCached
+ * @param filterColumn
+ * @return
+ */
+ private static int getFilterDimensionIndexInCachedColumns(
--- End diff --
Change method name as it will be called for both dimension and measure
columns
---