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/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new b6adddfff3 [core] Refactor LeafFunction fromJson and toJson
b6adddfff3 is described below

commit b6adddfff39a8f278422bd277cc7d8aead0c1751
Author: JingsongLi <[email protected]>
AuthorDate: Thu Feb 5 11:01:26 2026 +0800

    [core] Refactor LeafFunction fromJson and toJson
---
 .../java/org/apache/paimon/predicate/Between.java  |   5 +
 .../java/org/apache/paimon/predicate/Contains.java |   9 +-
 .../java/org/apache/paimon/predicate/EndsWith.java |  12 ++-
 .../java/org/apache/paimon/predicate/Equal.java    |   9 +-
 .../apache/paimon/predicate/GreaterOrEqual.java    |   9 +-
 .../org/apache/paimon/predicate/GreaterThan.java   |   7 +-
 .../main/java/org/apache/paimon/predicate/In.java  |   7 +-
 .../org/apache/paimon/predicate/IsNotNull.java     |   7 +-
 .../java/org/apache/paimon/predicate/IsNull.java   |   7 +-
 ...BinaryFunction.java => LeafBinaryFunction.java} |   2 +-
 .../org/apache/paimon/predicate/LeafFunction.java  | 109 +++++++--------------
 .../apache/paimon/predicate/LeafNAryFunction.java  |  25 +++++
 .../paimon/predicate/LeafTernaryFunction.java      |   2 +
 .../org/apache/paimon/predicate/LessOrEqual.java   |   9 +-
 .../java/org/apache/paimon/predicate/LessThan.java |   9 +-
 .../java/org/apache/paimon/predicate/Like.java     |  13 ++-
 .../apache/paimon/predicate/LikeOptimization.java  |   3 +-
 .../org/apache/paimon/predicate/NotBetween.java    |   5 +
 .../java/org/apache/paimon/predicate/NotEqual.java |   9 +-
 .../java/org/apache/paimon/predicate/NotIn.java    |   7 +-
 .../apache/paimon/predicate/PredicateBuilder.java  |   4 +-
 .../org/apache/paimon/predicate/StartsWith.java    |  12 ++-
 22 files changed, 172 insertions(+), 109 deletions(-)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/Between.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/Between.java
index 1829efe09e..c9124c14b4 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/Between.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/Between.java
@@ -67,4 +67,9 @@ public class Between extends LeafTernaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitBetween(fieldRef, literals.get(0), 
literals.get(1));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/Contains.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/Contains.java
index 866c738997..aa4c0d4c21 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/Contains.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/Contains.java
@@ -26,8 +26,8 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCre
 import java.util.List;
 import java.util.Optional;
 
-/** A {@link NullFalseLeafBinaryFunction} to evaluate {@code filter like 
'%abc%'}. */
-public class Contains extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to evaluate {@code filter like '%abc%'}. */
+public class Contains extends LeafBinaryFunction {
 
     public static final String NAME = "CONTAINS";
 
@@ -62,4 +62,9 @@ public class Contains extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitContains(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/EndsWith.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/EndsWith.java
index a78332ca67..2757ade2d5 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/EndsWith.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/EndsWith.java
@@ -26,11 +26,8 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCre
 import java.util.List;
 import java.util.Optional;
 
-/**
- * A {@link NullFalseLeafBinaryFunction} to evaluate {@code filter like '%abc' 
or filter like
- * '_abc'}.
- */
-public class EndsWith extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to evaluate {@code filter like '%abc' or 
filter like '_abc'}. */
+public class EndsWith extends LeafBinaryFunction {
 
     public static final String NAME = "ENDS_WITH";
 
@@ -65,4 +62,9 @@ public class EndsWith extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitEndsWith(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git a/paimon-common/src/main/java/org/apache/paimon/predicate/Equal.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/Equal.java
index 6f6462f8a7..73836e9c82 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/Equal.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/Equal.java
@@ -27,8 +27,8 @@ import java.util.Optional;
 
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval equal. */
-public class Equal extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to eval equal. */
+public class Equal extends LeafBinaryFunction {
 
     public static final String NAME = "EQUAL";
 
@@ -57,4 +57,9 @@ public class Equal extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitEqual(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterOrEqual.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterOrEqual.java
index 24202ee492..47e241857d 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterOrEqual.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterOrEqual.java
@@ -27,8 +27,8 @@ import java.util.Optional;
 
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval greater or equal. */
-public class GreaterOrEqual extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to eval greater or equal. */
+public class GreaterOrEqual extends LeafBinaryFunction {
 
     public static final String NAME = "GREATER_OR_EQUAL";
 
@@ -57,4 +57,9 @@ public class GreaterOrEqual extends 
NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitGreaterOrEqual(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterThan.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterThan.java
index 13c8e91fb6..57ed8788d3 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterThan.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/GreaterThan.java
@@ -28,7 +28,7 @@ import java.util.Optional;
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
 /** A {@link LeafFunction} to eval greater. */
-public class GreaterThan extends NullFalseLeafBinaryFunction {
+public class GreaterThan extends LeafBinaryFunction {
 
     public static final String NAME = "GREATER_THAN";
 
@@ -57,4 +57,9 @@ public class GreaterThan extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitGreaterThan(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git a/paimon-common/src/main/java/org/apache/paimon/predicate/In.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/In.java
index 0d89bff0b9..027b09ffa2 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/In.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/In.java
@@ -28,7 +28,7 @@ import java.util.Optional;
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
 /** A {@link LeafFunction} to eval in. */
-public class In extends LeafFunction {
+public class In extends LeafNAryFunction {
 
     private static final long serialVersionUID = 1L;
 
@@ -82,4 +82,9 @@ public class In extends LeafFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitIn(fieldRef, literals);
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/IsNotNull.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/IsNotNull.java
index 018d6f0fa6..54cd87d90d 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/IsNotNull.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/IsNotNull.java
@@ -25,7 +25,7 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCre
 import java.util.List;
 import java.util.Optional;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval is not null. */
+/** A {@link LeafBinaryFunction} to eval is not null. */
 public class IsNotNull extends LeafUnaryFunction {
 
     public static final String NAME = "IS_NOT_NULL";
@@ -45,6 +45,11 @@ public class IsNotNull extends LeafUnaryFunction {
         return nullCount == null || nullCount < rowCount;
     }
 
+    @Override
+    public String toJson() {
+        return NAME;
+    }
+
     @Override
     public Optional<LeafFunction> negate() {
         return Optional.of(IsNull.INSTANCE);
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/IsNull.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/IsNull.java
index a76399d53e..40c1b18370 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/IsNull.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/IsNull.java
@@ -25,7 +25,7 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCre
 import java.util.List;
 import java.util.Optional;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval is null. */
+/** A {@link LeafBinaryFunction} to eval is null. */
 public class IsNull extends LeafUnaryFunction {
 
     public static final String NAME = "IS_NULL";
@@ -54,4 +54,9 @@ public class IsNull extends LeafUnaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitIsNull(fieldRef);
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/NullFalseLeafBinaryFunction.java
 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafBinaryFunction.java
similarity index 96%
rename from 
paimon-common/src/main/java/org/apache/paimon/predicate/NullFalseLeafBinaryFunction.java
rename to 
paimon-common/src/main/java/org/apache/paimon/predicate/LeafBinaryFunction.java
index 2c8b57d0d0..a2cc054eb3 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/predicate/NullFalseLeafBinaryFunction.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafBinaryFunction.java
@@ -23,7 +23,7 @@ import org.apache.paimon.types.DataType;
 import java.util.List;
 
 /** Function to test a field with a literal. */
-public abstract class NullFalseLeafBinaryFunction extends LeafFunction {
+public abstract class LeafBinaryFunction extends LeafFunction {
 
     private static final long serialVersionUID = 1L;
 
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 3b639b1439..5d8edc1d67 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
@@ -25,93 +25,56 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonVal
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 /** Function to test a field with literals. */
 public abstract class LeafFunction implements Serializable {
 
+    private static final long serialVersionUID = 1L;
+
     @JsonCreator
     public static LeafFunction fromJson(String name) throws IOException {
-        switch (name) {
-            case Equal.NAME:
-                return Equal.INSTANCE;
-            case NotEqual.NAME:
-                return NotEqual.INSTANCE;
-            case LessThan.NAME:
-                return LessThan.INSTANCE;
-            case LessOrEqual.NAME:
-                return LessOrEqual.INSTANCE;
-            case GreaterThan.NAME:
-                return GreaterThan.INSTANCE;
-            case GreaterOrEqual.NAME:
-                return GreaterOrEqual.INSTANCE;
-            case IsNull.NAME:
-                return IsNull.INSTANCE;
-            case IsNotNull.NAME:
-                return IsNotNull.INSTANCE;
-            case StartsWith.NAME:
-                return StartsWith.INSTANCE;
-            case EndsWith.NAME:
-                return EndsWith.INSTANCE;
-            case Contains.NAME:
-                return Contains.INSTANCE;
-            case Like.NAME:
-                return Like.INSTANCE;
-            case In.NAME:
-                return In.INSTANCE;
-            case NotIn.NAME:
-                return NotIn.INSTANCE;
-            case Between.NAME:
-                return Between.INSTANCE;
-            case NotBetween.NAME:
-                return NotBetween.INSTANCE;
-            default:
-                throw new IllegalArgumentException(
-                        "Could not resolve leaf function '" + name + "'");
+        LeafFunction function = RegistryHolder.REGISTRY.get(name);
+        if (function == null) {
+            throw new IllegalArgumentException("Could not resolve leaf 
function '" + name + "'");
         }
+        return function;
     }
 
-    @JsonValue
-    public String toJson() {
-        if (this instanceof Equal) {
-            return Equal.NAME;
-        } else if (this instanceof NotEqual) {
-            return NotEqual.NAME;
-        } else if (this instanceof LessThan) {
-            return LessThan.NAME;
-        } else if (this instanceof LessOrEqual) {
-            return LessOrEqual.NAME;
-        } else if (this instanceof GreaterThan) {
-            return GreaterThan.NAME;
-        } else if (this instanceof GreaterOrEqual) {
-            return GreaterOrEqual.NAME;
-        } else if (this instanceof IsNull) {
-            return IsNull.NAME;
-        } else if (this instanceof IsNotNull) {
-            return IsNotNull.NAME;
-        } else if (this instanceof StartsWith) {
-            return StartsWith.NAME;
-        } else if (this instanceof EndsWith) {
-            return EndsWith.NAME;
-        } else if (this instanceof Contains) {
-            return Contains.NAME;
-        } else if (this instanceof Like) {
-            return Like.NAME;
-        } else if (this instanceof In) {
-            return In.NAME;
-        } else if (this instanceof NotIn) {
-            return NotIn.NAME;
-        } else if (this instanceof Between) {
-            return Between.NAME;
-        } else if (this instanceof NotBetween) {
-            return NotBetween.NAME;
-        } else {
-            throw new IllegalArgumentException(
-                    "Unknown leaf function class for JSON serialization: " + 
getClass());
+    /** Holder class for lazy initialization of the registry to avoid class 
loading deadlock. */
+    private static class RegistryHolder {
+
+        private static final Map<String, LeafFunction> REGISTRY = 
createRegistry();
+
+        private static Map<String, LeafFunction> createRegistry() {
+            Map<String, LeafFunction> registry = new HashMap<>();
+            registry.put(Equal.NAME, Equal.INSTANCE);
+            registry.put(NotEqual.NAME, NotEqual.INSTANCE);
+            registry.put(LessThan.NAME, LessThan.INSTANCE);
+            registry.put(LessOrEqual.NAME, LessOrEqual.INSTANCE);
+            registry.put(GreaterThan.NAME, GreaterThan.INSTANCE);
+            registry.put(GreaterOrEqual.NAME, GreaterOrEqual.INSTANCE);
+            registry.put(IsNull.NAME, IsNull.INSTANCE);
+            registry.put(IsNotNull.NAME, IsNotNull.INSTANCE);
+            registry.put(StartsWith.NAME, StartsWith.INSTANCE);
+            registry.put(EndsWith.NAME, EndsWith.INSTANCE);
+            registry.put(Contains.NAME, Contains.INSTANCE);
+            registry.put(Like.NAME, Like.INSTANCE);
+            registry.put(In.NAME, In.INSTANCE);
+            registry.put(NotIn.NAME, NotIn.INSTANCE);
+            registry.put(Between.NAME, Between.INSTANCE);
+            registry.put(NotBetween.NAME, NotBetween.INSTANCE);
+            return Collections.unmodifiableMap(registry);
         }
     }
 
+    @JsonValue
+    public abstract String toJson();
+
     public abstract boolean test(DataType type, Object field, List<Object> 
literals);
 
     public abstract boolean test(
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafNAryFunction.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafNAryFunction.java
new file mode 100644
index 0000000000..613e97f60f
--- /dev/null
+++ 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafNAryFunction.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.paimon.predicate;
+
+/** Abstract {@link LeafFunction} for n-ary function. */
+public abstract class LeafNAryFunction extends LeafFunction {
+
+    private static final long serialVersionUID = 1L;
+}
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafTernaryFunction.java
 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafTernaryFunction.java
index 9c027b3833..87e17b2188 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LeafTernaryFunction.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LeafTernaryFunction.java
@@ -25,6 +25,8 @@ import java.util.List;
 /** Abstract {@link LeafFunction} for ternary function. */
 public abstract class LeafTernaryFunction extends LeafFunction {
 
+    private static final long serialVersionUID = 1L;
+
     public abstract boolean test(DataType type, Object field, Object literal1, 
Object literal2);
 
     public abstract boolean test(
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LessOrEqual.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LessOrEqual.java
index a860f5bceb..9067bbdd4d 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/LessOrEqual.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/LessOrEqual.java
@@ -27,8 +27,8 @@ import java.util.Optional;
 
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval less or equal. */
-public class LessOrEqual extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to eval less or equal. */
+public class LessOrEqual extends LeafBinaryFunction {
 
     public static final String NAME = "LESS_OR_EQUAL";
 
@@ -57,4 +57,9 @@ public class LessOrEqual extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitLessOrEqual(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LessThan.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LessThan.java
index 25f7aa4011..048ed0eaca 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/LessThan.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/LessThan.java
@@ -27,8 +27,8 @@ import java.util.Optional;
 
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval less or equal. */
-public class LessThan extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to eval less or equal. */
+public class LessThan extends LeafBinaryFunction {
 
     public static final String NAME = "LESS_THAN";
 
@@ -57,4 +57,9 @@ public class LessThan extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitLessThan(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git a/paimon-common/src/main/java/org/apache/paimon/predicate/Like.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/Like.java
index 06f8ad662b..bbb54f095a 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/Like.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/Like.java
@@ -33,8 +33,8 @@ import java.util.List;
 import java.util.Optional;
 import java.util.regex.Pattern;
 
-/** A {@link NullFalseLeafBinaryFunction} to evaluate {@code filter like}. */
-public class Like extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to evaluate {@code filter like}. */
+public class Like extends LeafBinaryFunction {
 
     public static final String NAME = "LIKE";
 
@@ -62,10 +62,10 @@ public class Like extends NullFalseLeafBinaryFunction {
     }
 
     private Filter<BinaryString> createFunc(DataType type, Object 
patternLiteral) {
-        Optional<Pair<NullFalseLeafBinaryFunction, Object>> optimized =
+        Optional<Pair<LeafBinaryFunction, Object>> optimized =
                 LikeOptimization.tryOptimize(patternLiteral);
         if (optimized.isPresent()) {
-            NullFalseLeafBinaryFunction func = optimized.get().getKey();
+            LeafBinaryFunction func = optimized.get().getKey();
             Object literal = optimized.get().getValue();
             return field -> func.test(type, field, literal);
         }
@@ -153,4 +153,9 @@ public class Like extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitLike(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LikeOptimization.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LikeOptimization.java
index f6624c1f75..b17898a40f 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/predicate/LikeOptimization.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/predicate/LikeOptimization.java
@@ -39,8 +39,7 @@ public class LikeOptimization {
     /** Accepts simple LIKE patterns like "abc". */
     private static final Pattern NONE_PATTERN = Pattern.compile("[^%]+");
 
-    public static Optional<Pair<NullFalseLeafBinaryFunction, Object>> 
tryOptimize(
-            Object patternLiteral) {
+    public static Optional<Pair<LeafBinaryFunction, Object>> 
tryOptimize(Object patternLiteral) {
         if (patternLiteral == null) {
             throw new IllegalArgumentException("Pattern can not be null.");
         }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/NotBetween.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/NotBetween.java
index d92dbe0ec5..ad396a9a68 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/NotBetween.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/NotBetween.java
@@ -69,4 +69,9 @@ public class NotBetween extends LeafTernaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitNotBetween(fieldRef, literals.get(0), 
literals.get(1));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/NotEqual.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/NotEqual.java
index 1660943753..4084759bd3 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/NotEqual.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/NotEqual.java
@@ -27,8 +27,8 @@ import java.util.Optional;
 
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
-/** A {@link NullFalseLeafBinaryFunction} to eval not equal. */
-public class NotEqual extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to eval not equal. */
+public class NotEqual extends LeafBinaryFunction {
 
     public static final String NAME = "NOT_EQUAL";
 
@@ -57,4 +57,9 @@ public class NotEqual extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitNotEqual(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git a/paimon-common/src/main/java/org/apache/paimon/predicate/NotIn.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/NotIn.java
index b9181bfbb7..7068283d84 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/NotIn.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/NotIn.java
@@ -28,7 +28,7 @@ import java.util.Optional;
 import static org.apache.paimon.predicate.CompareUtils.compareLiteral;
 
 /** A {@link LeafFunction} to eval not in. */
-public class NotIn extends LeafFunction {
+public class NotIn extends LeafNAryFunction {
 
     private static final long serialVersionUID = 1L;
 
@@ -82,4 +82,9 @@ public class NotIn extends LeafFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitNotIn(fieldRef, literals);
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java
index f410551e29..c25764193d 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java
@@ -162,14 +162,14 @@ public class PredicateBuilder {
     }
 
     public Predicate like(int idx, Object patternLiteral) {
-        Pair<NullFalseLeafBinaryFunction, Object> optimized =
+        Pair<LeafBinaryFunction, Object> optimized =
                 LikeOptimization.tryOptimize(patternLiteral)
                         .orElse(Pair.of(Like.INSTANCE, patternLiteral));
         return leaf(optimized.getKey(), idx, optimized.getValue());
     }
 
     public Predicate like(Transform transform, Object patternLiteral) {
-        Pair<NullFalseLeafBinaryFunction, Object> optimized =
+        Pair<LeafBinaryFunction, Object> optimized =
                 LikeOptimization.tryOptimize(patternLiteral)
                         .orElse(Pair.of(Like.INSTANCE, patternLiteral));
         return leaf(optimized.getKey(), transform, optimized.getValue());
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/predicate/StartsWith.java 
b/paimon-common/src/main/java/org/apache/paimon/predicate/StartsWith.java
index 7fef920a71..26b9689006 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/StartsWith.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/StartsWith.java
@@ -26,11 +26,8 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCre
 import java.util.List;
 import java.util.Optional;
 
-/**
- * A {@link NullFalseLeafBinaryFunction} to evaluate {@code filter like 'abc%' 
or filter like
- * 'abc_'}.
- */
-public class StartsWith extends NullFalseLeafBinaryFunction {
+/** A {@link LeafBinaryFunction} to evaluate {@code filter like 'abc%' or 
filter like 'abc_'}. */
+public class StartsWith extends LeafBinaryFunction {
 
     public static final String NAME = "STARTS_WITH";
 
@@ -69,4 +66,9 @@ public class StartsWith extends NullFalseLeafBinaryFunction {
     public <T> T visit(FunctionVisitor<T> visitor, FieldRef fieldRef, 
List<Object> literals) {
         return visitor.visitStartsWith(fieldRef, literals.get(0));
     }
+
+    @Override
+    public String toJson() {
+        return NAME;
+    }
 }

Reply via email to