@@ -209,22 +209,15 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
209
209
case PhysicalOperation (projectList, filters : Seq [Expression ], relation : ParquetRelation ) =>
210
210
val prunePushedDownFilters =
211
211
if (sqlContext.parquetFilterPushDown) {
212
- (filters : Seq [Expression ]) => {
213
- filters.filter { filter =>
214
- // Note: filters cannot be pushed down to Parquet if they contain more complex
215
- // expressions than simple "Attribute cmp Literal" comparisons. Here we remove
216
- // all filters that have been pushed down. Note that a predicate such as
217
- // "(A AND B) OR C" can result in "A OR C" being pushed down.
218
- val recordFilter = ParquetFilters .createFilter(filter)
219
- if (! recordFilter.isDefined) {
220
- // First case: the pushdown did not result in any record filter.
221
- true
222
- } else {
223
- // Second case: a record filter was created; here we are conservative in
224
- // the sense that even if "A" was pushed and we check for "A AND B" we
225
- // still want to keep "A AND B" in the higher-level filter, not just "B".
226
- ! ParquetFilters .findExpression(recordFilter.get, filter).isDefined
227
- }
212
+ (predicates : Seq [Expression ]) => {
213
+ // Note: filters cannot be pushed down to Parquet if they contain more complex
214
+ // expressions than simple "Attribute cmp Literal" comparisons. Here we remove all
215
+ // filters that have been pushed down. Note that a predicate such as "(A AND B) OR C"
216
+ // can result in "A OR C" being pushed down. Here we are conservative in the sense
217
+ // that even if "A" was pushed and we check for "A AND B" we still want to keep
218
+ // "A AND B" in the higher-level filter, not just "B".
219
+ predicates.map(p => p -> ParquetFilters .createFilter(p)).collect {
220
+ case (predicate, None ) => predicate
228
221
}
229
222
}
230
223
} else {
0 commit comments