You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by da...@apache.org on 2024/01/19 02:27:43 UTC
(hudi) branch master updated: [HUDI-7309] Disable constructing AND & OR filter predicates when filter pushing down for any of its operand's logical type for is unsupported in ExpressionPredicates::toParquetPredicate (#10524)
This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new e85f8f43547 [HUDI-7309] Disable constructing AND & OR filter predicates when filter pushing down for any of its operand's logical type for is unsupported in ExpressionPredicates::toParquetPredicate (#10524)
e85f8f43547 is described below
commit e85f8f43547cf107ce4dedf737eede74e2c811e7
Author: Paul Zhang <xz...@126.com>
AuthorDate: Fri Jan 19 10:27:36 2024 +0800
[HUDI-7309] Disable constructing AND & OR filter predicates when filter pushing down for any of its operand's logical type for is unsupported in ExpressionPredicates::toParquetPredicate (#10524)
---
.../org/apache/hudi/source/ExpressionPredicates.java | 6 ++++++
.../apache/hudi/source/TestExpressionPredicates.java | 17 +++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java b/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
index 046e4b739ad..34bb58f6c8e 100644
--- a/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
+++ b/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
@@ -548,6 +548,9 @@ public class ExpressionPredicates {
@Override
public FilterPredicate filter() {
+ if (null == predicates[0].filter() || null == predicates[1].filter()) {
+ return null;
+ }
return and(predicates[0].filter(), predicates[1].filter());
}
@@ -586,6 +589,9 @@ public class ExpressionPredicates {
@Override
public FilterPredicate filter() {
+ if (null == predicates[0].filter() || null == predicates[1].filter()) {
+ return null;
+ }
return or(predicates[0].filter(), predicates[1].filter());
}
diff --git a/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java b/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
index 97b06644266..b8c4b1caf2e 100644
--- a/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
+++ b/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
@@ -42,6 +42,7 @@ import org.apache.parquet.filter2.predicate.Operators.IntColumn;
import org.apache.parquet.filter2.predicate.Operators.Lt;
import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -58,6 +59,7 @@ import static org.apache.parquet.filter2.predicate.FilterApi.not;
import static org.apache.parquet.filter2.predicate.FilterApi.notEq;
import static org.apache.parquet.filter2.predicate.FilterApi.or;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
/**
* Test cases for {@link ExpressionPredicates}.
@@ -164,4 +166,19 @@ public class TestExpressionPredicates {
assertEquals(predicate19.toString(), predicate20.toString());
assertEquals(or(lt, gt), predicate20.filter());
}
+
+ @Test
+ public void testDisablePredicatesPushDownForUnsupportedType() {
+ FieldReferenceExpression fieldReference = new FieldReferenceExpression("f_decimal", DataTypes.DECIMAL(7, 2), 0, 0);
+ ValueLiteralExpression valueLiteral = new ValueLiteralExpression(BigDecimal.valueOf(100.00));
+ List<ResolvedExpression> expressions = Arrays.asList(fieldReference, valueLiteral);
+
+ CallExpression greaterThanExpression = new CallExpression(BuiltInFunctionDefinitions.GREATER_THAN, expressions, DataTypes.DECIMAL(7, 2));
+ Predicate greaterThanPredicate = fromExpression(greaterThanExpression);
+ CallExpression lessThanExpression = new CallExpression(BuiltInFunctionDefinitions.LESS_THAN, expressions, DataTypes.DECIMAL(7, 2));
+ Predicate lessThanPredicate = fromExpression(lessThanExpression);
+
+ assertNull(And.getInstance().bindPredicates(greaterThanPredicate, lessThanPredicate).filter(), "Decimal type push down is unsupported, so we expect null");
+ assertNull(Or.getInstance().bindPredicates(greaterThanPredicate, lessThanPredicate).filter(), "Decimal type push down is unsupported, so we expect null");
+ }
}