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 {

Reply via email to