Repository: carbondata
Updated Branches:
  refs/heads/master 5c058acc7 -> 9ee74fe07


[CARBONDATA-2343][DataMap]Improper filter resolver cause more filter scan on 
data that could be skipped

Currently DataMapChooser will choose and combine datamap for
expressions and it will wrap the expression in a
TrueConditionalResolverImpl. However the executor TrueFilterExecutor
will always cause scanning the blocklet which could be skipped.

This closes #2168


Project: http://git-wip-us.apache.org/repos/asf/carbondata/repo
Commit: http://git-wip-us.apache.org/repos/asf/carbondata/commit/9ee74fe0
Tree: http://git-wip-us.apache.org/repos/asf/carbondata/tree/9ee74fe0
Diff: http://git-wip-us.apache.org/repos/asf/carbondata/diff/9ee74fe0

Branch: refs/heads/master
Commit: 9ee74fe0708afead309540777c315e0d13abc010
Parents: 5c058ac
Author: xuchuanyin <xuchuan...@hust.edu.cn>
Authored: Fri Apr 13 15:14:25 2018 +0800
Committer: Jacky Li <jacky.li...@qq.com>
Committed: Fri Apr 13 23:42:23 2018 +0800

----------------------------------------------------------------------
 .../carbondata/core/datamap/DataMapChooser.java | 39 ++++++++++----------
 1 file changed, 19 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/carbondata/blob/9ee74fe0/core/src/main/java/org/apache/carbondata/core/datamap/DataMapChooser.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/carbondata/core/datamap/DataMapChooser.java 
b/core/src/main/java/org/apache/carbondata/core/datamap/DataMapChooser.java
index ac00e71..a40644a 100644
--- a/core/src/main/java/org/apache/carbondata/core/datamap/DataMapChooser.java
+++ b/core/src/main/java/org/apache/carbondata/core/datamap/DataMapChooser.java
@@ -34,7 +34,6 @@ import 
org.apache.carbondata.core.scan.expression.logical.AndExpression;
 import org.apache.carbondata.core.scan.expression.logical.OrExpression;
 import org.apache.carbondata.core.scan.filter.intf.ExpressionType;
 import org.apache.carbondata.core.scan.filter.resolver.FilterResolverIntf;
-import 
org.apache.carbondata.core.scan.filter.resolver.resolverinfo.TrueConditionalResolverImpl;
 
 /**
  * This chooser does 2 jobs.
@@ -75,12 +74,12 @@ public class DataMapChooser {
       // First check for FG datamaps if any exist
       List<TableDataMap> allDataMapFG =
           DataMapStoreManager.getInstance().getAllDataMap(carbonTable, 
DataMapLevel.FG);
-      ExpressionTuple tuple = selectDataMap(expression, allDataMapFG);
+      ExpressionTuple tuple = selectDataMap(expression, allDataMapFG, 
resolverIntf);
       if (tuple.dataMapExprWrapper == null) {
         // Check for CG datamap
         List<TableDataMap> allDataMapCG =
             DataMapStoreManager.getInstance().getAllDataMap(carbonTable, 
DataMapLevel.CG);
-        tuple = selectDataMap(expression, allDataMapCG);
+        tuple = selectDataMap(expression, allDataMapCG, resolverIntf);
       }
       if (tuple.dataMapExprWrapper != null) {
         return tuple.dataMapExprWrapper;
@@ -92,13 +91,16 @@ public class DataMapChooser {
         resolverIntf);
   }
 
-  private ExpressionTuple selectDataMap(Expression expression, 
List<TableDataMap> allDataMap) {
+  private ExpressionTuple selectDataMap(Expression expression, 
List<TableDataMap> allDataMap,
+      FilterResolverIntf filterResolverIntf) {
     switch (expression.getFilterExpressionType()) {
       case AND:
         if (expression instanceof AndExpression) {
           AndExpression andExpression = (AndExpression) expression;
-          ExpressionTuple left = selectDataMap(andExpression.getLeft(), 
allDataMap);
-          ExpressionTuple right = selectDataMap(andExpression.getRight(), 
allDataMap);
+          ExpressionTuple left = selectDataMap(andExpression.getLeft(), 
allDataMap,
+              filterResolverIntf.getLeft());
+          ExpressionTuple right = selectDataMap(andExpression.getRight(), 
allDataMap,
+              filterResolverIntf.getRight());
           Set<ExpressionType> filterExpressionTypes = new HashSet<>();
           // If both left and right has datamap then we can either merge both 
datamaps to single
           // datamap if possible. Otherwise apply AND expression.
@@ -118,16 +120,14 @@ public class DataMapChooser {
             if (dataMap != null) {
               ExpressionTuple tuple = new ExpressionTuple();
               tuple.columnExpressions = columnExpressions;
-              tuple.dataMapExprWrapper = new DataMapExprWrapperImpl(dataMap,
-                  new TrueConditionalResolverImpl(expression, false, false));
+              tuple.dataMapExprWrapper = new DataMapExprWrapperImpl(dataMap, 
filterResolverIntf);
               return tuple;
             } else {
               // Apply AND expression.
               ExpressionTuple tuple = new ExpressionTuple();
               tuple.columnExpressions = columnExpressions;
-              tuple.dataMapExprWrapper =
-                  new AndDataMapExprWrapper(left.dataMapExprWrapper, 
right.dataMapExprWrapper,
-                      new TrueConditionalResolverImpl(expression, false, 
false));
+              tuple.dataMapExprWrapper = new 
AndDataMapExprWrapper(left.dataMapExprWrapper,
+                  right.dataMapExprWrapper, filterResolverIntf);
               return tuple;
             }
           } else if (left.dataMapExprWrapper != null && 
right.dataMapExprWrapper == null) {
@@ -142,8 +142,10 @@ public class DataMapChooser {
       case OR:
         if (expression instanceof OrExpression) {
           OrExpression orExpression = (OrExpression) expression;
-          ExpressionTuple left = selectDataMap(orExpression.getLeft(), 
allDataMap);
-          ExpressionTuple right = selectDataMap(orExpression.getRight(), 
allDataMap);
+          ExpressionTuple left = selectDataMap(orExpression.getLeft(), 
allDataMap,
+              filterResolverIntf.getLeft());
+          ExpressionTuple right = selectDataMap(orExpression.getRight(), 
allDataMap,
+              filterResolverIntf.getRight());
           Set<ExpressionType> filterExpressionTypes = new HashSet<>();
           // If both left and right has datamap then we can either merge both 
datamaps to single
           // datamap if possible. Otherwise apply OR expression.
@@ -162,15 +164,13 @@ public class DataMapChooser {
             if (dataMap != null) {
               ExpressionTuple tuple = new ExpressionTuple();
               tuple.columnExpressions = columnExpressions;
-              tuple.dataMapExprWrapper = new DataMapExprWrapperImpl(dataMap,
-                  new TrueConditionalResolverImpl(expression, false, false));
+              tuple.dataMapExprWrapper = new DataMapExprWrapperImpl(dataMap, 
filterResolverIntf);
               return tuple;
             } else {
               ExpressionTuple tuple = new ExpressionTuple();
               tuple.columnExpressions = columnExpressions;
-              tuple.dataMapExprWrapper =
-                  new OrDataMapExprWrapper(left.dataMapExprWrapper, 
right.dataMapExprWrapper,
-                      new TrueConditionalResolverImpl(expression, false, 
false));
+              tuple.dataMapExprWrapper = new 
OrDataMapExprWrapper(left.dataMapExprWrapper,
+                  right.dataMapExprWrapper, filterResolverIntf);
               return tuple;
             }
           } else {
@@ -187,8 +187,7 @@ public class DataMapChooser {
         TableDataMap dataMap =
             chooseDataMap(allDataMap, tuple.columnExpressions, 
filterExpressionTypes);
         if (dataMap != null) {
-          tuple.dataMapExprWrapper = new DataMapExprWrapperImpl(dataMap,
-              new TrueConditionalResolverImpl(expression, false, false));
+          tuple.dataMapExprWrapper = new DataMapExprWrapperImpl(dataMap, 
filterResolverIntf);
         }
         return tuple;
     }

Reply via email to