@@ -750,7 +750,7 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
750
750
}
751
751
}
752
752
753
- test(" SPARK-12218 Converting conjunctions into Parquet filter predicates" ) {
753
+ test(" SPARK-12218 and SPARK-25559 Converting conjunctions into Parquet filter predicates" ) {
754
754
val schema = StructType (Seq (
755
755
StructField (" a" , IntegerType , nullable = false ),
756
756
StructField (" b" , StringType , nullable = true ),
@@ -770,14 +770,95 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
770
770
sources.GreaterThan (" c" , 1.5D )))
771
771
}
772
772
773
- assertResult(None ) {
773
+ // Testing when `canRemoveOneSideInAnd == true`
774
+ // case sources.And(lhs, rhs) =>
775
+ // ...
776
+ // case (Some(lhsFilter), None) if canRemoveOneSideInAnd => Some(lhsFilter)
777
+ assertResult(Some (lt(intColumn(" a" ), 10 : Integer ))) {
774
778
parquetFilters.createFilter(
775
779
parquetSchema,
776
780
sources.And (
777
781
sources.LessThan (" a" , 10 ),
778
782
sources.StringContains (" b" , " prefix" )))
779
783
}
780
784
785
+ // Testing when `canRemoveOneSideInAnd == true`
786
+ // case sources.And(lhs, rhs) =>
787
+ // ...
788
+ // case (None, Some(rhsFilter)) if canRemoveOneSideInAnd => Some(rhsFilter)
789
+ assertResult(Some (lt(intColumn(" a" ), 10 : Integer ))) {
790
+ parquetFilters.createFilter(
791
+ parquetSchema,
792
+ sources.And (
793
+ sources.StringContains (" b" , " prefix" ),
794
+ sources.LessThan (" a" , 10 )))
795
+ }
796
+
797
+ // Testing complex And conditions
798
+ assertResult(Some (
799
+ FilterApi .and(lt(intColumn(" a" ), 10 : Integer ), gt(intColumn(" a" ), 5 : Integer )))) {
800
+ parquetFilters.createFilter(
801
+ parquetSchema,
802
+ sources.And (
803
+ sources.And (
804
+ sources.LessThan (" a" , 10 ),
805
+ sources.StringContains (" b" , " prefix" )
806
+ ),
807
+ sources.GreaterThan (" a" , 5 )))
808
+ }
809
+
810
+ // Testing complex And conditions
811
+ assertResult(Some (
812
+ FilterApi .and(gt(intColumn(" a" ), 5 : Integer ), lt(intColumn(" a" ), 10 : Integer )))) {
813
+ parquetFilters.createFilter(
814
+ parquetSchema,
815
+ sources.And (
816
+ sources.GreaterThan (" a" , 5 ),
817
+ sources.And (
818
+ sources.StringContains (" b" , " prefix" ),
819
+ sources.LessThan (" a" , 10 )
820
+ )))
821
+ }
822
+
823
+ // Testing
824
+ // case sources.Or(lhs, rhs) =>
825
+ // ...
826
+ // lhsFilter <- createFilterHelper(nameToParquetField, lhs, canRemoveOneSideInAnd = false)
827
+ assertResult(None ) {
828
+ parquetFilters.createFilter(
829
+ parquetSchema,
830
+ sources.Or (
831
+ sources.And (
832
+ sources.GreaterThan (" a" , 1 ),
833
+ sources.StringContains (" b" , " prefix" )),
834
+ sources.GreaterThan (" a" , 2 )))
835
+ }
836
+
837
+ // Testing
838
+ // case sources.Or(lhs, rhs) =>
839
+ // ...
840
+ // rhsFilter <- createFilterHelper(nameToParquetField, rhs, canRemoveOneSideInAnd = false)
841
+ assertResult(None ) {
842
+ parquetFilters.createFilter(
843
+ parquetSchema,
844
+ sources.Or (
845
+ sources.GreaterThan (" a" , 2 ),
846
+ sources.And (
847
+ sources.GreaterThan (" a" , 1 ),
848
+ sources.StringContains (" b" , " prefix" ))))
849
+ }
850
+
851
+ // Testing
852
+ // case sources.Not(pred) =>
853
+ // createFilterHelper(nameToParquetField, pred, canRemoveOneSideInAnd = false)
854
+ // .map(FilterApi.not)
855
+ //
856
+ // and
857
+ //
858
+ // Testing when `canRemoveOneSideInAnd == false`
859
+ // case sources.And(lhs, rhs) =>
860
+ // ...
861
+ // case (Some(lhsFilter), None) if canRemoveOneSideInAnd => Some(lhsFilter)
781
862
assertResult(None ) {
782
863
parquetFilters.createFilter(
783
864
parquetSchema,
@@ -786,6 +867,68 @@ class ParquetFilterSuite extends QueryTest with ParquetTest with SharedSQLContex
786
867
sources.GreaterThan (" a" , 1 ),
787
868
sources.StringContains (" b" , " prefix" ))))
788
869
}
870
+
871
+ // Testing
872
+ // case sources.Not(pred) =>
873
+ // createFilterHelper(nameToParquetField, pred, canRemoveOneSideInAnd = false)
874
+ // .map(FilterApi.not)
875
+ //
876
+ // and
877
+ //
878
+ // Testing when `canRemoveOneSideInAnd == false`
879
+ // case sources.And(lhs, rhs) =>
880
+ // ...
881
+ // case (None, Some(rhsFilter)) if canRemoveOneSideInAnd => Some(rhsFilter)
882
+ assertResult(None ) {
883
+ parquetFilters.createFilter(
884
+ parquetSchema,
885
+ sources.Not (
886
+ sources.And (
887
+ sources.StringContains (" b" , " prefix" ),
888
+ sources.GreaterThan (" a" , 1 ))))
889
+ }
890
+
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)
901
+ assertResult(None ) {
902
+ parquetFilters.createFilter(
903
+ parquetSchema,
904
+ sources.Not (
905
+ sources.And (
906
+ sources.And (
907
+ sources.GreaterThan (" a" , 1 ),
908
+ sources.StringContains (" b" , " prefix" )),
909
+ sources.GreaterThan (" a" , 2 ))))
910
+ }
911
+
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)
922
+ assertResult(None ) {
923
+ parquetFilters.createFilter(
924
+ parquetSchema,
925
+ sources.Not (
926
+ sources.And (
927
+ sources.GreaterThan (" a" , 2 ),
928
+ sources.And (
929
+ sources.GreaterThan (" a" , 1 ),
930
+ sources.StringContains (" b" , " prefix" )))))
931
+ }
789
932
}
790
933
791
934
test(" SPARK-16371 Do not push down filters when inner name and outer name are the same" ) {
0 commit comments