This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-paimon.git
The following commit(s) were added to refs/heads/master by this push:
new 1308150e9 [core] Add toString for Predicate (#2534)
1308150e9 is described below
commit 1308150e96d934b97972b85a98664d0a3e0c4ef7
Author: Zouxxyy <[email protected]>
AuthorDate: Tue Dec 19 19:24:39 2023 +0800
[core] Add toString for Predicate (#2534)
---
.../apache/paimon/predicate/CompoundPredicate.java | 10 +++++
.../org/apache/paimon/predicate/LeafFunction.java | 5 +++
.../org/apache/paimon/predicate/LeafPredicate.java | 15 +++++++
.../org/apache/paimon/predicate/PredicateTest.java | 51 ++++++++++++++++++++++
.../scala/org/apache/paimon/spark/PaimonScan.scala | 2 +-
.../org/apache/paimon/spark/PaimonBaseScan.scala | 6 +--
.../paimon/spark/PaimonBaseScanBuilder.scala | 4 +-
.../scala/org/apache/paimon/spark/PaimonScan.scala | 2 +-
8 files changed, 88 insertions(+), 7 deletions(-)
diff --git
a/paimon-common/src/main/java/org/apache/paimon/predicate/CompoundPredicate.java
b/paimon-common/src/main/java/org/apache/paimon/predicate/CompoundPredicate.java
index 1f13f24d2..a162d491a 100644
---
a/paimon-common/src/main/java/org/apache/paimon/predicate/CompoundPredicate.java
+++
b/paimon-common/src/main/java/org/apache/paimon/predicate/CompoundPredicate.java
@@ -87,6 +87,11 @@ public class CompoundPredicate implements Predicate {
return Objects.hash(function, children);
}
+ @Override
+ public String toString() {
+ return function + "(" + children + ")";
+ }
+
/** Evaluate the predicate result based on multiple {@link Predicate}s. */
public abstract static class Function implements Serializable {
@@ -113,5 +118,10 @@ public class CompoundPredicate implements Predicate {
}
return o != null && getClass() == o.getClass();
}
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
}
}
diff --git
a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafFunction.java
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafFunction.java
index c9c367e82..075be7112 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafFunction.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafFunction.java
@@ -50,4 +50,9 @@ public abstract class LeafFunction implements Serializable {
public abstract <T> T visit(
FunctionVisitor<T> visitor, FieldRef fieldRef, List<Object>
literals);
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
}
diff --git
a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafPredicate.java
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafPredicate.java
index 638708eaf..ed291a15e 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafPredicate.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafPredicate.java
@@ -145,6 +145,21 @@ public class LeafPredicate implements Predicate {
return Objects.hash(function, type, fieldIndex, fieldName, literals);
}
+ @Override
+ public String toString() {
+ String literalsStr;
+ if (literals == null || literals.isEmpty()) {
+ literalsStr = "";
+ } else if (literals.size() == 1) {
+ literalsStr = Objects.toString(literals.get(0));
+ } else {
+ literalsStr = literals.toString();
+ }
+ return literalsStr.isEmpty()
+ ? function + "(" + fieldName + ")"
+ : function + "(" + fieldName + ", " + literalsStr + ")";
+ }
+
private ListSerializer<Object> objectsSerializer() {
return new ListSerializer<>(
NullableSerializer.wrapIfNullIsNotSupported(InternalSerializers.create(type)));
diff --git
a/paimon-common/src/test/java/org/apache/paimon/predicate/PredicateTest.java
b/paimon-common/src/test/java/org/apache/paimon/predicate/PredicateTest.java
index 8671cd245..58cc61dd8 100644
--- a/paimon-common/src/test/java/org/apache/paimon/predicate/PredicateTest.java
+++ b/paimon-common/src/test/java/org/apache/paimon/predicate/PredicateTest.java
@@ -522,4 +522,55 @@ public class PredicateTest {
assertThat(predicate.test(3, new FieldStats[] {new FieldStats(null,
null, 4L)}))
.isEqualTo(true);
}
+
+ @Test
+ public void testPredicateToString() {
+ PredicateBuilder builder1 = new PredicateBuilder(RowType.of(new
IntType()));
+ Predicate p1 = builder1.equal(0, 5);
+ assertThat(p1.toString()).isEqualTo("Equal(f0, 5)");
+
+ PredicateBuilder builder2 = new PredicateBuilder(RowType.of(new
IntType()));
+ Predicate p2 = builder2.greaterThan(0, 5);
+ assertThat(p2.toString()).isEqualTo("GreaterThan(f0, 5)");
+
+ PredicateBuilder builder3 = new PredicateBuilder(RowType.of(new
IntType(), new IntType()));
+ Predicate p3 = PredicateBuilder.and(builder3.equal(0, 3),
builder3.equal(1, 5));
+ assertThat(p3.toString()).isEqualTo("And([Equal(f0, 3), Equal(f1,
5)])");
+
+ PredicateBuilder builder4 = new PredicateBuilder(RowType.of(new
IntType(), new IntType()));
+ Predicate p4 = PredicateBuilder.or(builder4.equal(0, 3),
builder4.equal(1, 5));
+ assertThat(p4.toString()).isEqualTo("Or([Equal(f0, 3), Equal(f1,
5)])");
+
+ PredicateBuilder builder5 = new PredicateBuilder(RowType.of(new
IntType()));
+ Predicate p5 = builder5.isNotNull(0);
+ assertThat(p5.toString()).isEqualTo("IsNotNull(f0)");
+
+ PredicateBuilder builder6 = new PredicateBuilder(RowType.of(new
IntType()));
+ Predicate p6 = builder6.in(0, Arrays.asList(1, null, 3, 4));
+ assertThat(p6.toString())
+ .isEqualTo(
+ "Or([Or([Or([Equal(f0, 1), Equal(f0, null)]),
Equal(f0, 3)]), Equal(f0, 4)])");
+
+ PredicateBuilder builder7 = new PredicateBuilder(RowType.of(new
IntType()));
+ Predicate p7 = builder7.notIn(0, Arrays.asList(1, null, 3, 4));
+ assertThat(p7.toString())
+ .isEqualTo(
+ "And([And([And([NotEqual(f0, 1), NotEqual(f0, null)]),
NotEqual(f0, 3)]), NotEqual(f0, 4)])");
+
+ PredicateBuilder builder8 = new PredicateBuilder(RowType.of(new
IntType()));
+ List<Object> literals = new ArrayList<>();
+ for (int i = 1; i <= 21; i++) {
+ literals.add(i);
+ }
+ Predicate p8 = builder8.in(0, literals);
+ assertThat(p8.toString())
+ .isEqualTo(
+ "In(f0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21])");
+
+ PredicateBuilder builder9 = new PredicateBuilder(RowType.of(new
IntType()));
+ Predicate p9 = builder9.notIn(0, literals);
+ assertThat(p9.toString())
+ .isEqualTo(
+ "NotIn(f0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21])");
+ }
}
diff --git
a/paimon-spark/paimon-spark-3.1/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
b/paimon-spark/paimon-spark-3.1/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
index 049730291..f9546c961 100644
---
a/paimon-spark/paimon-spark-3.1/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
+++
b/paimon-spark/paimon-spark-3.1/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
@@ -26,6 +26,6 @@ import org.apache.spark.sql.types.StructType
case class PaimonScan(
table: Table,
requiredSchema: StructType,
- filters: Array[(Filter, Predicate)],
+ filters: Array[Predicate],
pushDownLimit: Option[Int])
extends PaimonBaseScan(table, requiredSchema, filters, pushDownLimit)
diff --git
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScan.scala
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScan.scala
index a822ea9db..5ede8883d 100644
---
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScan.scala
+++
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScan.scala
@@ -34,7 +34,7 @@ import scala.collection.JavaConverters._
abstract class PaimonBaseScan(
table: Table,
requiredSchema: StructType,
- filters: Array[(Filter, Predicate)],
+ filters: Array[Predicate],
pushDownLimit: Option[Int])
extends Scan
with SupportsReportStatistics
@@ -56,7 +56,7 @@ abstract class PaimonBaseScan(
val projection = readSchema().fieldNames.map(field =>
tableRowType.getFieldNames.indexOf(field))
_readBuilder.withProjection(projection)
if (filters.nonEmpty) {
- val pushedPredicate = PredicateBuilder.and(filters.map(_._2): _*)
+ val pushedPredicate = PredicateBuilder.and(filters: _*)
_readBuilder.withFilter(pushedPredicate)
}
pushDownLimit.foreach(_readBuilder.withLimit)
@@ -108,7 +108,7 @@ abstract class PaimonBaseScan(
override def description(): String = {
val pushedFiltersStr = if (filters.nonEmpty) {
- ", PushedFilters: [" + filters.map(_._1).mkString(",") + "]"
+ ", PushedFilters: [" + filters.mkString(",") + "]"
} else {
""
}
diff --git
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScanBuilder.scala
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScanBuilder.scala
index 53fe78b20..e6ec87707 100644
---
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScanBuilder.scala
+++
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonBaseScanBuilder.scala
@@ -17,7 +17,7 @@
*/
package org.apache.paimon.spark
-import org.apache.paimon.predicate.{PartitionPredicateVisitor, Predicate,
PredicateBuilder}
+import org.apache.paimon.predicate.{PartitionPredicateVisitor, Predicate}
import org.apache.paimon.table.Table
import org.apache.spark.internal.Logging
@@ -40,7 +40,7 @@ abstract class PaimonBaseScanBuilder(table: Table)
protected var pushDownLimit: Option[Int] = None
override def build(): Scan = {
- PaimonScan(table, requiredSchema, pushed, pushDownLimit)
+ PaimonScan(table, requiredSchema, pushed.map(_._2), pushDownLimit)
}
/**
diff --git
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
index b05e9be35..2bb3ff0c9 100644
---
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
+++
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScan.scala
@@ -31,7 +31,7 @@ import scala.collection.JavaConverters._
case class PaimonScan(
table: Table,
requiredSchema: StructType,
- filters: Array[(Filter, Predicate)],
+ filters: Array[Predicate],
pushDownLimit: Option[Int])
extends PaimonBaseScan(table, requiredSchema, filters, pushDownLimit)
with SupportsRuntimeFiltering {