@@ -770,10 +770,10 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
770770          sources.GreaterThan (" c" 1.5D )))
771771    }
772772
773-     //  Testing when `canRemoveOneSideInAnd  == true`
773+     //  Testing when `canPartialPushDownConjuncts  == true`
774774    //  case sources.And(lhs, rhs) =>
775775    //    ...
776-     //      case (Some(lhsFilter), None) if canRemoveOneSideInAnd  => Some(lhsFilter)
776+     //      case (Some(lhsFilter), None) if canPartialPushDownConjuncts  => Some(lhsFilter)
777777    assertResult(Some (lt(intColumn(" a" 10 :  Integer ))) {
778778      parquetFilters.createFilter(
779779        parquetSchema,
@@ -782,10 +782,10 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
782782          sources.StringContains (" b" " prefix" 
783783    }
784784
785-     //  Testing when `canRemoveOneSideInAnd  == true`
785+     //  Testing when `canPartialPushDownConjuncts  == true`
786786    //  case sources.And(lhs, rhs) =>
787787    //    ...
788-     //      case (None, Some(rhsFilter)) if canRemoveOneSideInAnd  => Some(rhsFilter)
788+     //      case (None, Some(rhsFilter)) if canPartialPushDownConjuncts  => Some(rhsFilter)
789789    assertResult(Some (lt(intColumn(" a" 10 :  Integer ))) {
790790      parquetFilters.createFilter(
791791        parquetSchema,
@@ -819,11 +819,39 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
819819            sources.LessThan (" a" 10 )
820820          )))
821821    }
822+   }
823+ 
824+   test(" Converting disjunctions into Parquet filter predicates" 
825+     val  schema  =  StructType (Seq (
826+       StructField (" a" IntegerType , nullable =  false ),
827+       StructField (" b" StringType , nullable =  true )
828+     ))
829+ 
830+     val  parquetSchema  =  new  SparkToParquetSchemaConverter (conf).convert(schema)
831+ 
832+     //  Testing
833+     //  case sources.Or(lhs, rhs) =>
834+     //    ...
835+     //      lhsFilter <- createFilterHelper(nameToParquetField, lhs, false)
836+     assertResult(Some (
837+       FilterApi .or(gt(intColumn(" a" 2 :  Integer ), lt(intColumn(" a" 1 :  Integer )))) {
838+       parquetFilters.createFilter(
839+         parquetSchema,
840+         sources.Or (
841+           sources.GreaterThan (" a" 2 ),
842+           sources.LessThan (" a" 1 )))
843+     }
822844
823845    //  Testing
824846    //  case sources.Or(lhs, rhs) =>
825847    //    ...
826-     //      lhsFilter <- createFilterHelper(nameToParquetField, lhs, canRemoveOneSideInAnd = false)
848+     //      lhsFilter <- createFilterHelper(nameToParquetField, lhs, false)
849+     // 
850+     //  and
851+     // 
852+     //  case sources.And(lhs, rhs) =>
853+     //    ...
854+     //      case _ => None
827855    assertResult(None ) {
828856      parquetFilters.createFilter(
829857        parquetSchema,
@@ -834,10 +862,6 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
834862          sources.GreaterThan (" a" 2 )))
835863    }
836864
837-     //  Testing
838-     //  case sources.Or(lhs, rhs) =>
839-     //    ...
840-     //      rhsFilter <- createFilterHelper(nameToParquetField, rhs, canRemoveOneSideInAnd = false)
841865    assertResult(None ) {
842866      parquetFilters.createFilter(
843867        parquetSchema,
@@ -847,38 +871,94 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
847871            sources.GreaterThan (" a" 1 ),
848872            sources.StringContains (" b" " prefix" 
849873    }
874+   }
875+ 
876+   test(" Converting complements into Parquet filter predicates" 
877+     val  schema  =  StructType (Seq (
878+       StructField (" a" IntegerType , nullable =  false ),
879+       StructField (" b" StringType , nullable =  true )
880+     ))
881+ 
882+     val  parquetSchema  =  new  SparkToParquetSchemaConverter (conf).convert(schema)
850883
851884    //  Testing
852-     //  case sources.Not(pred) =>
853-     //    createFilterHelper(nameToParquetField, pred, canRemoveOneSideInAnd = false)
854-     //      .map(FilterApi.not)
885+     //  case sources.Not(sources.Or(lhs, rhs)) if canPartialPushDownConjuncts =>
886+     //   createFilterHelper(nameToParquetField,
887+     //     sources.And(sources.Not(lhs), sources.Not(rhs)), true)
888+     assertResult(Some (FilterApi .not(gt(intColumn(" a" 5 :  Integer )))) {
889+       parquetFilters.createFilter(
890+         parquetSchema,
891+         sources.Not (
892+           sources.Or (
893+             sources.GreaterThan (" a" 5 ),
894+             sources.StringContains (" b" " prefix" 
895+           )
896+         )
897+       )
898+     }
899+ 
900+     assertResult(Some (FilterApi .and(FilterApi .not(gt(intColumn(" a" 5 :  Integer )),
901+       FilterApi .not(lt(intColumn(" a" 10 :  Integer ))))) {
902+       parquetFilters.createFilter(
903+         parquetSchema,
904+         sources.Not (
905+           sources.Or (
906+             sources.Or (
907+               sources.GreaterThan (" a" 5 ),
908+               sources.StringContains (" b" " prefix" 
909+             ),
910+             sources.LessThan (" a" 10 )
911+           )
912+         )
913+       )
914+     }
915+ 
916+     //  Testing
917+     //  case sources.Not(sources.Or(lhs, rhs)) if canPartialPushDownConjuncts =>
918+     //   createFilterHelper(nameToParquetField,
919+     //     sources.And(sources.Not(lhs), sources.Not(rhs)), true)
855920    // 
856921    //  and
857922    // 
858-     //  Testing when `canRemoveOneSideInAnd == false`
859923    //  case sources.And(lhs, rhs) =>
860924    //    ...
861-     //      case (Some(lhsFilter), None) if canRemoveOneSideInAnd => Some(lhsFilter)
862-     assertResult(None ) {
925+     //      case _ => None
926+ 
927+     assertResult(Some (FilterApi .not(lt(intColumn(" a" 10 :  Integer )))) {
863928      parquetFilters.createFilter(
864929        parquetSchema,
865930        sources.Not (
866-           sources.And (
867-             sources.GreaterThan (" a" 1 ),
868-             sources.StringContains (" b" " prefix" 
931+           sources.Or (
932+             sources.And (
933+               sources.GreaterThan (" a" 5 ),
934+               sources.StringContains (" b" " prefix" 
935+             ),
936+             sources.LessThan (" a" 10 )
937+           )
938+         )
939+       )
869940    }
870941
871942    //  Testing
872943    //  case sources.Not(pred) =>
873-     //    createFilterHelper(nameToParquetField, pred, canRemoveOneSideInAnd  = false)
944+     //    createFilterHelper(nameToParquetField, pred, canPartialPushDownConjuncts  = false)
874945    //      .map(FilterApi.not)
875946    // 
876947    //  and
877948    // 
878-     //  Testing when `canRemoveOneSideInAnd  == false`
949+     //  Testing when `canPartialPushDownConjuncts  == false`
879950    //  case sources.And(lhs, rhs) =>
880951    //    ...
881-     //      case (None, Some(rhsFilter)) if canRemoveOneSideInAnd => Some(rhsFilter)
952+     //      case (Some(lhsFilter), None) if canPartialPushDownConjuncts => Some(lhsFilter)
953+     assertResult(None ) {
954+       parquetFilters.createFilter(
955+         parquetSchema,
956+         sources.Not (
957+           sources.And (
958+             sources.GreaterThan (" a" 1 ),
959+             sources.StringContains (" b" " prefix" 
960+     }
961+ 
882962    assertResult(None ) {
883963      parquetFilters.createFilter(
884964        parquetSchema,
@@ -888,16 +968,6 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
888968            sources.GreaterThan (" a" 1 ))))
889969    }
890970
891-     //  Testing
892-     //  case sources.Not(pred) =>
893-     //    createFilterHelper(nameToParquetField, pred, canRemoveOneSideInAnd = false)
894-     //      .map(FilterApi.not)
895-     // 
896-     //  and
897-     // 
898-     //  Testing passing `canRemoveOneSideInAnd = false` into
899-     //  case sources.And(lhs, rhs) =>
900-     //    val lhsFilterOption = createFilterHelper(nameToParquetField, lhs, canRemoveOneSideInAnd)
901971    assertResult(None ) {
902972      parquetFilters.createFilter(
903973        parquetSchema,
@@ -909,16 +979,6 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
909979            sources.GreaterThan (" a" 2 ))))
910980    }
911981
912-     //  Testing
913-     //  case sources.Not(pred) =>
914-     //    createFilterHelper(nameToParquetField, pred, canRemoveOneSideInAnd = false)
915-     //      .map(FilterApi.not)
916-     // 
917-     //  and
918-     // 
919-     //  Testing passing `canRemoveOneSideInAnd = false` into
920-     //  case sources.And(lhs, rhs) =>
921-     //    val rhsFilterOption = createFilterHelper(nameToParquetField, rhs, canRemoveOneSideInAnd)
922982    assertResult(None ) {
923983      parquetFilters.createFilter(
924984        parquetSchema,
@@ -929,6 +989,19 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
929989              sources.GreaterThan (" a" 1 ),
930990              sources.StringContains (" b" " prefix" 
931991    }
992+ 
993+     //  Testing
994+     //  case sources.Not(sources.Not(pred)) if canPartialPushDownConjuncts =>
995+     //   createFilterHelper(nameToParquetField, pred, canPartialPushDownConjuncts = true)
996+     assertResult(Some (lt(intColumn(" a" 10 :  Integer ))) {
997+       parquetFilters.createFilter(
998+         parquetSchema,
999+         sources.Not (
1000+           sources.Not (
1001+             sources.And (
1002+               sources.StringContains (" b" " prefix" 
1003+                 sources.LessThan (" a" 10 )))))
1004+     }
9321005  }
9331006
9341007  test(" SPARK-16371 Do not push down filters when inner name and outer name are the same" 
0 commit comments