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;
+ }
}