Repository: incubator-carbondata
Updated Branches:
  refs/heads/master f88ab66a9 -> 0e82b6501


[CARBONDATA-278] IS NULL and IS NOT NULL shall be push down to carbon layer 
since carbon layer can process these filters faster using block/block-let 
pruning ,
 also while processing filters in executors carbon is applying binary search 
for applying filter values.


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

Branch: refs/heads/master
Commit: e5f1a99ba3c02655d769352474a4b85c66821a0a
Parents: f88ab66
Author: sujith71955 <sujithchacko.2...@gmail.com>
Authored: Tue Sep 27 16:51:03 2016 +0530
Committer: jackylk <jacky.li...@huawei.com>
Committed: Mon Oct 24 20:42:24 2016 +0800

----------------------------------------------------------------------
 .../conditional/BinaryConditionalExpression.java          |  2 +-
 .../scan/expression/conditional/EqualToExpression.java    |  1 -
 .../carbondata/scan/filter/FilterExpressionProcessor.java |  3 ++-
 .../filter/resolver/ConditionalFilterResolverImpl.java    |  3 ++-
 .../scala/org/apache/carbondata/spark/CarbonFilters.scala | 10 ++++++++--
 5 files changed, 13 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/e5f1a99b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java
 
b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java
index 3d7e15e..9db6953 100644
--- 
a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java
+++ 
b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java
@@ -29,7 +29,7 @@ public abstract class BinaryConditionalExpression extends 
BinaryLogicalExpressio
    *
    */
   private static final long serialVersionUID = 1L;
-
+  public boolean isNull;
   public BinaryConditionalExpression(Expression left, Expression right) {
     super(left, right);
   }

http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/e5f1a99b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java
 
b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java
index 8f7fa0a..ddb0456 100644
--- 
a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java
+++ 
b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java
@@ -31,7 +31,6 @@ import org.apache.carbondata.scan.filter.intf.RowIntf;
 public class EqualToExpression extends BinaryConditionalExpression {
 
   private static final long serialVersionUID = 1L;
-  private boolean isNull;
 
   public EqualToExpression(Expression left, Expression right) {
     super(left, right);

http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/e5f1a99b/core/src/main/java/org/apache/carbondata/scan/filter/FilterExpressionProcessor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/carbondata/scan/filter/FilterExpressionProcessor.java
 
b/core/src/main/java/org/apache/carbondata/scan/filter/FilterExpressionProcessor.java
index b50e6e6..1541867 100644
--- 
a/core/src/main/java/org/apache/carbondata/scan/filter/FilterExpressionProcessor.java
+++ 
b/core/src/main/java/org/apache/carbondata/scan/filter/FilterExpressionProcessor.java
@@ -232,7 +232,8 @@ public class FilterExpressionProcessor implements 
FilterProcessor {
                 currentExpression), currentExpression);
       case EQUALS:
       case IN:
-        return getFilterResolverBasedOnExpressionType(ExpressionType.EQUALS, 
false, expressionTree,
+        return getFilterResolverBasedOnExpressionType(ExpressionType.EQUALS,
+            ((BinaryConditionalExpression) expressionTree).isNull, 
expressionTree,
             tableIdentifier, expressionTree);
       case GREATERTHAN:
       case GREATERTHAN_EQUALTO:

http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/e5f1a99b/core/src/main/java/org/apache/carbondata/scan/filter/resolver/ConditionalFilterResolverImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/carbondata/scan/filter/resolver/ConditionalFilterResolverImpl.java
 
b/core/src/main/java/org/apache/carbondata/scan/filter/resolver/ConditionalFilterResolverImpl.java
index bcb0a1b..612ea6f 100644
--- 
a/core/src/main/java/org/apache/carbondata/scan/filter/resolver/ConditionalFilterResolverImpl.java
+++ 
b/core/src/main/java/org/apache/carbondata/scan/filter/resolver/ConditionalFilterResolverImpl.java
@@ -132,7 +132,8 @@ public class ConditionalFilterResolverImpl implements 
FilterResolverIntf {
       metadata.setColumnExpression(columnList.get(0));
       metadata.setExpression(exp);
       metadata.setIncludeFilter(isIncludeFilter);
-      if (!columnList.get(0).getDimension().hasEncoding(Encoding.DICTIONARY)) {
+      if (!columnList.get(0).getDimension().hasEncoding(Encoding.DICTIONARY)
+              || 
columnList.get(0).getDimension().hasEncoding(Encoding.DIRECT_DICTIONARY)) {
         dimColResolvedFilterInfo.populateFilterInfoBasedOnColumnType(
             
FilterInfoTypeVisitorFactory.getResolvedFilterInfoVisitor(columnList.get(0)), 
metadata);
 

http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/e5f1a99b/integration/spark/src/main/scala/org/apache/carbondata/spark/CarbonFilters.scala
----------------------------------------------------------------------
diff --git 
a/integration/spark/src/main/scala/org/apache/carbondata/spark/CarbonFilters.scala
 
b/integration/spark/src/main/scala/org/apache/carbondata/spark/CarbonFilters.scala
index 5fb0051..03c6053 100644
--- 
a/integration/spark/src/main/scala/org/apache/carbondata/spark/CarbonFilters.scala
+++ 
b/integration/spark/src/main/scala/org/apache/carbondata/spark/CarbonFilters.scala
@@ -153,7 +153,8 @@ object CarbonFilters {
             Some(sources.Not(sources.EqualTo(a.name, v)))
         case Not(EqualTo(Literal(v, t), Cast(a: Attribute, _))) => new
             Some(sources.Not(sources.EqualTo(a.name, v)))
-
+        case IsNotNull(a: Attribute) => Some(sources.IsNotNull(a.name))
+        case IsNull(a: Attribute) => Some(sources.IsNull(a.name))
         case Not(In(a: Attribute, list)) if 
!list.exists(!_.isInstanceOf[Literal]) =>
           val hSet = list.map(e => e.eval(EmptyRow))
           Some(sources.Not(sources.In(a.name, hSet.toArray)))
@@ -257,7 +258,12 @@ object CarbonFilters {
             Some(new NotEqualsExpression(transformExpression(a).get, 
transformExpression(l).get))
         case Not(EqualTo(l@Literal(v, t), Cast(a: Attribute, _))) => new
             Some(new NotEqualsExpression(transformExpression(a).get, 
transformExpression(l).get))
-
+        case IsNotNull(child) =>
+            Some(new NotEqualsExpression(transformExpression(child).get,
+             transformExpression(Literal(null)).get, true))
+        case IsNull(child) =>
+            Some(new EqualToExpression(transformExpression(child).get,
+             transformExpression(Literal(null)).get, true))
         case Not(In(a: Attribute, list))
          if !list.exists(!_.isInstanceOf[Literal]) =>
          if (list.exists(x => (isNullLiteral(x.asInstanceOf[Literal])))) {

Reply via email to