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/flink-table-store.git
The following commit(s) were added to refs/heads/master by this push:
new ff81dcab [FLINK-27835] Introduce LeafPredicate interface and children
method in Predicate
ff81dcab is described below
commit ff81dcab14c2e1345c35b08ed443c1eeb465a298
Author: tsreaper <[email protected]>
AuthorDate: Wed Jun 1 15:04:04 2022 +0800
[FLINK-27835] Introduce LeafPredicate interface and children method in
Predicate
This closes #143
---
.../store/file/operation/FileStoreScanImpl.java | 3 +-
.../flink/table/store/file/predicate/And.java | 65 +++++++--------
.../{GreaterThan.java => CompoundPredicate.java} | 59 ++++++++------
.../flink/table/store/file/predicate/Equal.java | 43 ++--------
.../table/store/file/predicate/GreaterOrEqual.java | 43 ++--------
.../table/store/file/predicate/GreaterThan.java | 43 ++--------
.../table/store/file/predicate/IsNotNull.java | 38 ++-------
.../flink/table/store/file/predicate/IsNull.java | 38 ++-------
.../{GreaterThan.java => LeafPredicate.java} | 61 ++++++++------
.../table/store/file/predicate/LessOrEqual.java | 43 ++--------
.../flink/table/store/file/predicate/LessThan.java | 43 ++--------
.../flink/table/store/file/predicate/NotEqual.java | 43 ++--------
.../flink/table/store/file/predicate/Or.java | 65 +++++++--------
.../store/file/predicate/PredicateBuilder.java | 66 +++++++++++++--
.../store/file/predicate/PredicateConverter.java | 31 ++++---
.../table/store/file/predicate/StartsWith.java | 23 ++----
.../store/file/operation/FileStoreScanTest.java | 8 +-
.../file/predicate/PredicateConverterTest.java | 24 +++---
.../table/store/file/predicate/PredicateTest.java | 44 ++++++----
.../store/SearchArgumentToPredicateConverter.java | 12 +--
.../SearchArgumentToPredicateConverterTest.java | 95 +++++++++-------------
21 files changed, 370 insertions(+), 520 deletions(-)
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/operation/FileStoreScanImpl.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/operation/FileStoreScanImpl.java
index 172b82fa..6599fe1f 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/operation/FileStoreScanImpl.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/operation/FileStoreScanImpl.java
@@ -25,7 +25,6 @@ import
org.apache.flink.table.store.file.manifest.ManifestEntry;
import org.apache.flink.table.store.file.manifest.ManifestFile;
import org.apache.flink.table.store.file.manifest.ManifestFileMeta;
import org.apache.flink.table.store.file.manifest.ManifestList;
-import org.apache.flink.table.store.file.predicate.Equal;
import org.apache.flink.table.store.file.predicate.Literal;
import org.apache.flink.table.store.file.predicate.Predicate;
import org.apache.flink.table.store.file.predicate.PredicateBuilder;
@@ -125,7 +124,7 @@ public class FileStoreScanImpl implements FileStoreScan {
new Literal(
partitionConverter.rowType().getTypeAt(i),
partitionObjects[i]);
- fieldPredicates.add(new Equal(i, l));
+ fieldPredicates.add(PredicateBuilder.equal(i, l));
}
return PredicateBuilder.and(fieldPredicates);
};
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/And.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/And.java
index cc62b10c..313ffe77 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/And.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/And.java
@@ -20,57 +20,50 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
-/** A {@link Predicate} to eval and. */
-public class And implements Predicate {
+/** A {@link CompoundPredicate.Function} to eval and. */
+public class And implements CompoundPredicate.Function {
private static final long serialVersionUID = 1L;
- private final Predicate predicate1;
- private final Predicate predicate2;
+ public static final And INSTANCE = new And();
- public And(Predicate predicate1, Predicate predicate2) {
- this.predicate1 = predicate1;
- this.predicate2 = predicate2;
- }
+ private And() {}
@Override
- public boolean test(Object[] values) {
- return predicate1.test(values) && predicate2.test(values);
- }
-
- @Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
- return predicate1.test(rowCount, fieldStats) &&
predicate2.test(rowCount, fieldStats);
- }
-
- @Override
- public Optional<Predicate> negate() {
- Optional<Predicate> negate1 = predicate1.negate();
- Optional<Predicate> negate2 = predicate2.negate();
- if (negate1.isPresent() && negate2.isPresent()) {
- return Optional.of(new Or(negate1.get(), negate2.get()));
- } else {
- return Optional.empty();
+ public boolean test(Object[] values, List<Predicate> children) {
+ for (Predicate child : children) {
+ if (!child.test(values)) {
+ return false;
+ }
}
+ return true;
}
@Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
+ public boolean test(long rowCount, FieldStats[] fieldStats,
List<Predicate> children) {
+ for (Predicate child : children) {
+ if (!child.test(rowCount, fieldStats)) {
+ return false;
+ }
}
- if (!(o instanceof And)) {
- return false;
- }
- And and = (And) o;
- return predicate1.equals(and.predicate1) &&
predicate2.equals(and.predicate2);
+ return true;
}
@Override
- public int hashCode() {
- return Objects.hash(predicate1, predicate2);
+ public Optional<Predicate> negate(List<Predicate> children) {
+ List<Predicate> negatedChildren = new ArrayList<>();
+ for (Predicate child : children) {
+ Optional<Predicate> negatedChild = child.negate();
+ if (negatedChild.isPresent()) {
+ negatedChildren.add(negatedChild.get());
+ } else {
+ return Optional.empty();
+ }
+ }
+ return Optional.of(new CompoundPredicate(Or.INSTANCE,
negatedChildren));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/CompoundPredicate.java
similarity index 50%
copy from
flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
copy to
flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/CompoundPredicate.java
index 4029c186..4be05b2a 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/CompoundPredicate.java
@@ -20,59 +20,64 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
+import java.io.Serializable;
+import java.util.List;
import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
-
-/** A {@link Predicate} to eval greater. */
-public class GreaterThan implements Predicate {
+/**
+ * Non-leaf node in a {@link Predicate} tree. Its evaluation result depends on
the results of its
+ * children.
+ */
+public class CompoundPredicate implements Predicate {
- private static final long serialVersionUID = 1L;
+ private final Function function;
+ private final List<Predicate> children;
- private final int index;
+ public CompoundPredicate(Function function, List<Predicate> children) {
+ this.function = function;
+ this.children = children;
+ }
- private final Literal literal;
+ public Function function() {
+ return function;
+ }
- public GreaterThan(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
+ public List<Predicate> children() {
+ return children;
}
@Override
public boolean test(Object[] values) {
- Object field = values[index];
- return field != null && literal.compareValueTo(field) < 0;
+ return function.test(values, children);
}
@Override
public boolean test(long rowCount, FieldStats[] fieldStats) {
- FieldStats stats = fieldStats[index];
- if (rowCount == stats.nullCount()) {
- return false;
- }
- return literal.compareValueTo(stats.maxValue()) < 0;
+ return function.test(rowCount, fieldStats, children);
}
@Override
public Optional<Predicate> negate() {
- return Optional.of(new LessOrEqual(index, literal));
+ return function.negate(children);
}
@Override
public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof GreaterThan)) {
+ if (!(o instanceof CompoundPredicate)) {
return false;
}
- GreaterThan that = (GreaterThan) o;
- return index == that.index && literal.equals(that.literal);
+ CompoundPredicate that = (CompoundPredicate) o;
+ return Objects.equals(function, that.function) &&
Objects.equals(children, that.children);
}
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ /** Evaluate the predicate result based on multiple {@link Predicate}s. */
+ public interface Function extends Serializable {
+
+ boolean test(Object[] values, List<Predicate> children);
+
+ boolean test(long rowCount, FieldStats[] fieldStats, List<Predicate>
children);
+
+ Optional<Predicate> negate(List<Predicate> children);
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Equal.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Equal.java
index 2ca1c05d..074acf19 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Equal.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Equal.java
@@ -20,33 +20,23 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
+/** A {@link LeafPredicate.Function} to eval equal. */
+public class Equal implements LeafPredicate.Function {
-/** A {@link Predicate} to eval equal. */
-public class Equal implements Predicate {
+ public static final Equal INSTANCE = new Equal();
- private static final long serialVersionUID = 1L;
-
- private final int index;
-
- private final Literal literal;
-
- public Equal(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
- }
+ private Equal() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
Object field = values[index];
return field != null && literal.compareValueTo(field) == 0;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -56,24 +46,7 @@ public class Equal implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new NotEqual(index, literal));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof Equal)) {
- return false;
- }
- Equal equal = (Equal) o;
- return index == equal.index && literal.equals(equal.literal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(NotEqual.INSTANCE, index,
literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterOrEqual.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterOrEqual.java
index 22bc54ab..9527d3bf 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterOrEqual.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterOrEqual.java
@@ -20,33 +20,23 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
+/** A {@link LeafPredicate.Function} to eval greater or equal. */
+public class GreaterOrEqual implements LeafPredicate.Function {
-/** A {@link Predicate} to eval greater or equal. */
-public class GreaterOrEqual implements Predicate {
+ public static final GreaterOrEqual INSTANCE = new GreaterOrEqual();
- private static final long serialVersionUID = 1L;
-
- private final int index;
-
- private final Literal literal;
-
- public GreaterOrEqual(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
- }
+ private GreaterOrEqual() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
Object field = values[index];
return field != null && literal.compareValueTo(field) <= 0;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -55,24 +45,7 @@ public class GreaterOrEqual implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new LessThan(index, literal));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof GreaterOrEqual)) {
- return false;
- }
- GreaterOrEqual that = (GreaterOrEqual) o;
- return index == that.index && literal.equals(that.literal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(LessThan.INSTANCE, index,
literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
index 4029c186..d097f888 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
@@ -20,33 +20,23 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
+/** A {@link LeafPredicate.Function} to eval greater. */
+public class GreaterThan implements LeafPredicate.Function {
-/** A {@link Predicate} to eval greater. */
-public class GreaterThan implements Predicate {
+ public static final GreaterThan INSTANCE = new GreaterThan();
- private static final long serialVersionUID = 1L;
-
- private final int index;
-
- private final Literal literal;
-
- public GreaterThan(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
- }
+ private GreaterThan() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
Object field = values[index];
return field != null && literal.compareValueTo(field) < 0;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -55,24 +45,7 @@ public class GreaterThan implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new LessOrEqual(index, literal));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof GreaterThan)) {
- return false;
- }
- GreaterThan that = (GreaterThan) o;
- return index == that.index && literal.equals(that.literal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(LessOrEqual.INSTANCE, index,
literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNotNull.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNotNull.java
index 149a89b2..e4e19c5e 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNotNull.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNotNull.java
@@ -20,49 +20,27 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-/** A {@link Predicate} to eval is not null. */
-public class IsNotNull implements Predicate {
+/** A {@link LeafPredicate.Function} to eval is not null. */
+public class IsNotNull implements LeafPredicate.Function {
- private static final long serialVersionUID = 1L;
+ public static final IsNotNull INSTANCE = new IsNotNull();
- private final int index;
-
- public IsNotNull(int index) {
- this.index = index;
- }
+ private IsNotNull() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
return values[index] != null;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
return fieldStats[index].nullCount() < rowCount;
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new IsNull(index));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof IsNotNull)) {
- return false;
- }
- IsNotNull isNotNull = (IsNotNull) o;
- return index == isNotNull.index;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(IsNull.INSTANCE, index, literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNull.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNull.java
index cd85d9f6..a2279722 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNull.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/IsNull.java
@@ -20,49 +20,27 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-/** A {@link Predicate} to eval is null. */
-public class IsNull implements Predicate {
+/** A {@link LeafPredicate.Function} to eval is null. */
+public class IsNull implements LeafPredicate.Function {
- private static final long serialVersionUID = 1L;
+ public static final IsNull INSTANCE = new IsNull();
- private final int index;
-
- public IsNull(int index) {
- this.index = index;
- }
+ private IsNull() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
return values[index] == null;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
return fieldStats[index].nullCount() > 0;
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new IsNotNull(index));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof IsNull)) {
- return false;
- }
- IsNull isNull = (IsNull) o;
- return index == isNull.index;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(IsNotNull.INSTANCE, index,
literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LeafPredicate.java
similarity index 51%
copy from
flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
copy to
flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LeafPredicate.java
index 4029c186..244058e7 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/GreaterThan.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LeafPredicate.java
@@ -20,59 +20,68 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
+import java.io.Serializable;
import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
-
-/** A {@link Predicate} to eval greater. */
-public class GreaterThan implements Predicate {
-
- private static final long serialVersionUID = 1L;
+/** Leaf node of a {@link Predicate} tree. Compares a field in the row with an
{@link Literal}. */
+public class LeafPredicate implements Predicate {
+ private final Function function;
private final int index;
-
private final Literal literal;
- public GreaterThan(int index, Literal literal) {
+ public LeafPredicate(Function function, int index, Literal literal) {
+ this.function = function;
this.index = index;
- this.literal = checkNotNull(literal);
+ this.literal = literal;
+ }
+
+ public Function function() {
+ return function;
+ }
+
+ public int index() {
+ return index;
+ }
+
+ public Literal literal() {
+ return literal;
}
@Override
public boolean test(Object[] values) {
- Object field = values[index];
- return field != null && literal.compareValueTo(field) < 0;
+ return function.test(values, index, literal);
}
@Override
public boolean test(long rowCount, FieldStats[] fieldStats) {
- FieldStats stats = fieldStats[index];
- if (rowCount == stats.nullCount()) {
- return false;
- }
- return literal.compareValueTo(stats.maxValue()) < 0;
+ return function.test(rowCount, fieldStats, index, literal);
}
@Override
public Optional<Predicate> negate() {
- return Optional.of(new LessOrEqual(index, literal));
+ return function.negate(index, literal);
}
@Override
public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof GreaterThan)) {
+ if (!(o instanceof LeafPredicate)) {
return false;
}
- GreaterThan that = (GreaterThan) o;
- return index == that.index && literal.equals(that.literal);
+ LeafPredicate that = (LeafPredicate) o;
+ return Objects.equals(function, that.function)
+ && index == that.index
+ && Objects.equals(literal, that.literal);
}
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ /** Function to compare a field in the row with an {@link Literal}. */
+ public interface Function extends Serializable {
+
+ boolean test(Object[] values, int index, Literal literal);
+
+ boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal);
+
+ Optional<Predicate> negate(int index, Literal literal);
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessOrEqual.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessOrEqual.java
index c09a53f2..5b544eab 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessOrEqual.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessOrEqual.java
@@ -20,33 +20,23 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
+/** A {@link LeafPredicate.Function} to eval less or equal. */
+public class LessOrEqual implements LeafPredicate.Function {
-/** A {@link Predicate} to eval less or equal. */
-public class LessOrEqual implements Predicate {
+ public static final LessOrEqual INSTANCE = new LessOrEqual();
- private static final long serialVersionUID = 1L;
-
- private final int index;
-
- private final Literal literal;
-
- public LessOrEqual(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
- }
+ private LessOrEqual() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
Object field = values[index];
return field != null && literal.compareValueTo(field) >= 0;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -55,24 +45,7 @@ public class LessOrEqual implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new GreaterThan(index, literal));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof LessOrEqual)) {
- return false;
- }
- LessOrEqual that = (LessOrEqual) o;
- return index == that.index && literal.equals(that.literal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(GreaterThan.INSTANCE, index,
literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessThan.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessThan.java
index 71f06d70..7fc3f2cd 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessThan.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/LessThan.java
@@ -20,33 +20,23 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
+/** A {@link LeafPredicate.Function} to eval less. */
+public class LessThan implements LeafPredicate.Function {
-/** A {@link Predicate} to eval less. */
-public class LessThan implements Predicate {
+ public static final LessThan INSTANCE = new LessThan();
- private static final long serialVersionUID = 1L;
-
- private final int index;
-
- private final Literal literal;
-
- public LessThan(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
- }
+ private LessThan() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
Object field = values[index];
return field != null && literal.compareValueTo(field) > 0;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -55,24 +45,7 @@ public class LessThan implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new GreaterOrEqual(index, literal));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof LessThan)) {
- return false;
- }
- LessThan lessThan = (LessThan) o;
- return index == lessThan.index && literal.equals(lessThan.literal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(GreaterOrEqual.INSTANCE, index,
literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/NotEqual.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/NotEqual.java
index 404ab837..f3e90662 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/NotEqual.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/NotEqual.java
@@ -20,33 +20,23 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
import java.util.Optional;
-import static org.apache.flink.util.Preconditions.checkNotNull;
+/** A {@link LeafPredicate.Function} to eval not equal. */
+public class NotEqual implements LeafPredicate.Function {
-/** A {@link Predicate} to eval not equal. */
-public class NotEqual implements Predicate {
+ public static final NotEqual INSTANCE = new NotEqual();
- private static final long serialVersionUID = 1L;
-
- private final int index;
-
- private final Literal literal;
-
- public NotEqual(int index, Literal literal) {
- this.index = index;
- this.literal = checkNotNull(literal);
- }
+ private NotEqual() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal literal) {
Object field = values[index];
return field != null && literal.compareValueTo(field) != 0;
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal literal) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -56,24 +46,7 @@ public class NotEqual implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
- return Optional.of(new Equal(index, literal));
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof NotEqual)) {
- return false;
- }
- NotEqual notEqual = (NotEqual) o;
- return index == notEqual.index && literal.equals(notEqual.literal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(index, literal);
+ public Optional<Predicate> negate(int index, Literal literal) {
+ return Optional.of(new LeafPredicate(Equal.INSTANCE, index, literal));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Or.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Or.java
index 13234278..5a74bd6a 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Or.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/Or.java
@@ -20,57 +20,50 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.table.store.file.stats.FieldStats;
-import java.util.Objects;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
-/** A {@link Predicate} to eval or. */
-public class Or implements Predicate {
+/** A {@link CompoundPredicate.Function} to eval or. */
+public class Or implements CompoundPredicate.Function {
private static final long serialVersionUID = 1L;
- private final Predicate predicate1;
- private final Predicate predicate2;
+ public static final Or INSTANCE = new Or();
- public Or(Predicate predicate1, Predicate predicate2) {
- this.predicate1 = predicate1;
- this.predicate2 = predicate2;
- }
+ private Or() {}
@Override
- public boolean test(Object[] values) {
- return predicate1.test(values) || predicate2.test(values);
- }
-
- @Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
- return predicate1.test(rowCount, fieldStats) ||
predicate2.test(rowCount, fieldStats);
- }
-
- @Override
- public Optional<Predicate> negate() {
- Optional<Predicate> negate1 = predicate1.negate();
- Optional<Predicate> negate2 = predicate2.negate();
- if (negate1.isPresent() && negate2.isPresent()) {
- return Optional.of(new And(negate1.get(), negate2.get()));
- } else {
- return Optional.empty();
+ public boolean test(Object[] values, List<Predicate> children) {
+ for (Predicate child : children) {
+ if (child.test(values)) {
+ return true;
+ }
}
+ return false;
}
@Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
+ public boolean test(long rowCount, FieldStats[] fieldStats,
List<Predicate> children) {
+ for (Predicate child : children) {
+ if (child.test(rowCount, fieldStats)) {
+ return true;
+ }
}
- if (!(o instanceof Or)) {
- return false;
- }
- Or or = (Or) o;
- return predicate1.equals(or.predicate1) &&
predicate2.equals(or.predicate2);
+ return false;
}
@Override
- public int hashCode() {
- return Objects.hash(predicate1, predicate2);
+ public Optional<Predicate> negate(List<Predicate> children) {
+ List<Predicate> negatedChildren = new ArrayList<>();
+ for (Predicate child : children) {
+ Optional<Predicate> negatedChild = child.negate();
+ if (negatedChild.isPresent()) {
+ negatedChildren.add(negatedChild.get());
+ } else {
+ return Optional.empty();
+ }
+ }
+ return Optional.of(new CompoundPredicate(And.INSTANCE,
negatedChildren));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateBuilder.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateBuilder.java
index 262dc549..b431d81e 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateBuilder.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateBuilder.java
@@ -20,36 +20,90 @@ package org.apache.flink.table.store.file.predicate;
import org.apache.flink.util.Preconditions;
+import java.util.Arrays;
import java.util.List;
/** A utility class to create {@link Predicate} object for common filter
conditions. */
public class PredicateBuilder {
+ public static Predicate equal(int idx, Literal literal) {
+ return new LeafPredicate(Equal.INSTANCE, idx, literal);
+ }
+
+ public static Predicate notEqual(int idx, Literal literal) {
+ return new LeafPredicate(NotEqual.INSTANCE, idx, literal);
+ }
+
+ public static Predicate lessThan(int idx, Literal literal) {
+ return new LeafPredicate(LessThan.INSTANCE, idx, literal);
+ }
+
+ public static Predicate lessOrEqual(int idx, Literal literal) {
+ return new LeafPredicate(LessOrEqual.INSTANCE, idx, literal);
+ }
+
+ public static Predicate greaterThan(int idx, Literal literal) {
+ return new LeafPredicate(GreaterThan.INSTANCE, idx, literal);
+ }
+
+ public static Predicate greaterOrEqual(int idx, Literal literal) {
+ return new LeafPredicate(GreaterOrEqual.INSTANCE, idx, literal);
+ }
+
+ public static Predicate isNull(int idx) {
+ return new LeafPredicate(IsNull.INSTANCE, idx, null);
+ }
+
+ public static Predicate isNotNull(int idx) {
+ return new LeafPredicate(IsNotNull.INSTANCE, idx, null);
+ }
+
+ public static Predicate startsWith(int idx, Literal patternLiteral) {
+ return new LeafPredicate(StartsWith.INSTANCE, idx, patternLiteral);
+ }
+
+ public static Predicate and(Predicate... predicates) {
+ return and(Arrays.asList(predicates));
+ }
+
public static Predicate and(List<Predicate> predicates) {
Preconditions.checkArgument(
predicates.size() > 0,
"There must be at least 1 inner predicate to construct an AND
predicate");
- return predicates.stream().reduce(And::new).get();
+ return predicates.stream()
+ .reduce((a, b) -> new CompoundPredicate(And.INSTANCE,
Arrays.asList(a, b)))
+ .get();
+ }
+
+ public static Predicate or(Predicate... predicates) {
+ return or(Arrays.asList(predicates));
}
public static Predicate or(List<Predicate> predicates) {
Preconditions.checkArgument(
predicates.size() > 0,
"There must be at least 1 inner predicate to construct an OR
predicate");
- return predicates.stream().reduce(Or::new).get();
+ return predicates.stream()
+ .reduce((a, b) -> new CompoundPredicate(Or.INSTANCE,
Arrays.asList(a, b)))
+ .get();
}
public static Predicate in(int idx, List<Literal> literals) {
Preconditions.checkArgument(
literals.size() > 0,
"There must be at least 1 literal to construct an IN
predicate");
- return literals.stream().map(l -> (Predicate) new Equal(idx,
l)).reduce(Or::new).get();
+ return literals.stream()
+ .map(l -> equal(idx, l))
+ .reduce((a, b) -> new CompoundPredicate(Or.INSTANCE,
Arrays.asList(a, b)))
+ .get();
}
public static Predicate between(
int idx, Literal includedLowerBound, Literal includedUpperBound) {
- return new And(
- new GreaterOrEqual(idx, includedLowerBound),
- new LessOrEqual(idx, includedUpperBound));
+ return new CompoundPredicate(
+ And.INSTANCE,
+ Arrays.asList(
+ greaterOrEqual(idx, includedLowerBound),
+ lessOrEqual(idx, includedUpperBound)));
}
}
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateConverter.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateConverter.java
index a01b2613..0656e2f6 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateConverter.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/PredicateConverter.java
@@ -65,9 +65,9 @@ public class PredicateConverter implements
ExpressionVisitor<Predicate> {
LogicalType type = rowType.getTypeAt(idx);
Literal literal = new Literal(type,
TypeUtils.castFromString(entry.getValue(), type));
if (predicate == null) {
- predicate = new Equal(idx, literal);
+ predicate = PredicateBuilder.equal(idx, literal);
} else {
- predicate = new And(predicate, new Equal(idx, literal));
+ predicate = PredicateBuilder.and(predicate,
PredicateBuilder.equal(idx, literal));
}
}
return predicate;
@@ -79,30 +79,35 @@ public class PredicateConverter implements
ExpressionVisitor<Predicate> {
List<Expression> children = call.getChildren();
if (func == BuiltInFunctionDefinitions.AND) {
- return new And(children.get(0).accept(this),
children.get(1).accept(this));
+ return PredicateBuilder.and(children.get(0).accept(this),
children.get(1).accept(this));
} else if (func == BuiltInFunctionDefinitions.OR) {
- return new Or(children.get(0).accept(this),
children.get(1).accept(this));
+ return PredicateBuilder.or(children.get(0).accept(this),
children.get(1).accept(this));
} else if (func == BuiltInFunctionDefinitions.EQUALS) {
- return visitBiFunction(children, Equal::new, Equal::new);
+ return visitBiFunction(children, PredicateBuilder::equal,
PredicateBuilder::equal);
} else if (func == BuiltInFunctionDefinitions.NOT_EQUALS) {
- return visitBiFunction(children, NotEqual::new, NotEqual::new);
+ return visitBiFunction(
+ children, PredicateBuilder::notEqual,
PredicateBuilder::notEqual);
} else if (func == BuiltInFunctionDefinitions.GREATER_THAN) {
- return visitBiFunction(children, GreaterThan::new, LessThan::new);
+ return visitBiFunction(
+ children, PredicateBuilder::greaterThan,
PredicateBuilder::lessThan);
} else if (func == BuiltInFunctionDefinitions.GREATER_THAN_OR_EQUAL) {
- return visitBiFunction(children, GreaterOrEqual::new,
LessOrEqual::new);
+ return visitBiFunction(
+ children, PredicateBuilder::greaterOrEqual,
PredicateBuilder::lessOrEqual);
} else if (func == BuiltInFunctionDefinitions.LESS_THAN) {
- return visitBiFunction(children, LessThan::new, GreaterThan::new);
+ return visitBiFunction(
+ children, PredicateBuilder::lessThan,
PredicateBuilder::greaterThan);
} else if (func == BuiltInFunctionDefinitions.LESS_THAN_OR_EQUAL) {
- return visitBiFunction(children, LessOrEqual::new,
GreaterOrEqual::new);
+ return visitBiFunction(
+ children, PredicateBuilder::lessOrEqual,
PredicateBuilder::greaterOrEqual);
} else if (func == BuiltInFunctionDefinitions.IS_NULL) {
return extractFieldReference(children.get(0))
.map(FieldReferenceExpression::getFieldIndex)
- .map(IsNull::new)
+ .map(PredicateBuilder::isNull)
.orElseThrow(UnsupportedExpression::new);
} else if (func == BuiltInFunctionDefinitions.IS_NOT_NULL) {
return extractFieldReference(children.get(0))
.map(FieldReferenceExpression::getFieldIndex)
- .map(IsNotNull::new)
+ .map(PredicateBuilder::isNotNull)
.orElseThrow(UnsupportedExpression::new);
} else if (func == BuiltInFunctionDefinitions.LIKE) {
FieldReferenceExpression fieldRefExpr =
@@ -165,7 +170,7 @@ public class PredicateConverter implements
ExpressionVisitor<Predicate> {
if (allowQuick) {
Matcher beginMatcher =
BEGIN_PATTERN.matcher(escapedSqlPattern);
if (beginMatcher.matches()) {
- return new StartsWith(
+ return PredicateBuilder.startsWith(
fieldRefExpr.getFieldIndex(),
new Literal(
VarCharType.STRING_TYPE,
diff --git
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/StartsWith.java
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/StartsWith.java
index 5d8f8d77..af031633 100644
---
a/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/StartsWith.java
+++
b/flink-table-store-core/src/main/java/org/apache/flink/table/store/file/predicate/StartsWith.java
@@ -23,28 +23,23 @@ import org.apache.flink.table.store.file.stats.FieldStats;
import java.util.Optional;
-/** A {@link Predicate} to evaluate {@code filter like 'abc%' or filter like
'abc_'}. */
-public class StartsWith implements Predicate {
-
- private static final long serialVersionUID = 1L;
-
- private final int index;
+/**
+ * A {@link LeafPredicate.Function} to evaluate {@code filter like 'abc%' or
filter like 'abc_'}.
+ */
+public class StartsWith implements LeafPredicate.Function {
- private final Literal patternLiteral;
+ public static final StartsWith INSTANCE = new StartsWith();
- public StartsWith(int index, Literal patternLiteral) {
- this.index = index;
- this.patternLiteral = patternLiteral;
- }
+ private StartsWith() {}
@Override
- public boolean test(Object[] values) {
+ public boolean test(Object[] values, int index, Literal patternLiteral) {
BinaryStringData field = (BinaryStringData) values[index];
return field != null && field.startsWith((BinaryStringData)
patternLiteral.value());
}
@Override
- public boolean test(long rowCount, FieldStats[] fieldStats) {
+ public boolean test(long rowCount, FieldStats[] fieldStats, int index,
Literal patternLiteral) {
FieldStats stats = fieldStats[index];
if (rowCount == stats.nullCount()) {
return false;
@@ -57,7 +52,7 @@ public class StartsWith implements Predicate {
}
@Override
- public Optional<Predicate> negate() {
+ public Optional<Predicate> negate(int index, Literal literal) {
return Optional.empty();
}
}
diff --git
a/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/operation/FileStoreScanTest.java
b/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/operation/FileStoreScanTest.java
index 3e62b351..e590b76b 100644
---
a/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/operation/FileStoreScanTest.java
+++
b/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/operation/FileStoreScanTest.java
@@ -26,8 +26,8 @@ import
org.apache.flink.table.store.file.TestKeyValueGenerator;
import org.apache.flink.table.store.file.manifest.ManifestFileMeta;
import org.apache.flink.table.store.file.manifest.ManifestList;
import
org.apache.flink.table.store.file.mergetree.compact.DeduplicateMergeFunction;
-import org.apache.flink.table.store.file.predicate.Equal;
import org.apache.flink.table.store.file.predicate.Literal;
+import org.apache.flink.table.store.file.predicate.PredicateBuilder;
import org.apache.flink.table.store.file.utils.FileStorePathFactory;
import org.apache.flink.table.types.logical.IntType;
@@ -115,7 +115,8 @@ public class FileStoreScanTest {
FileStoreScan scan = store.newScan();
scan.withSnapshot(snapshot.id());
- scan.withKeyFilter(new Equal(0, new Literal(new IntType(false),
wantedShopId)));
+ scan.withKeyFilter(
+ PredicateBuilder.equal(0, new Literal(new IntType(false),
wantedShopId)));
Map<BinaryRowData, BinaryRowData> expected =
store.toKvMap(
@@ -135,7 +136,8 @@ public class FileStoreScanTest {
FileStoreScan scan = store.newScan();
scan.withSnapshot(snapshot.id());
- scan.withValueFilter(new Equal(2, new Literal(new IntType(false),
wantedShopId)));
+ scan.withValueFilter(
+ PredicateBuilder.equal(2, new Literal(new IntType(false),
wantedShopId)));
Map<BinaryRowData, BinaryRowData> expected =
store.toKvMap(
diff --git
a/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateConverterTest.java
b/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateConverterTest.java
index 8cd57179..c138d2ba 100644
---
a/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateConverterTest.java
+++
b/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateConverterTest.java
@@ -72,50 +72,50 @@ public class PredicateConverterTest {
BuiltInFunctionDefinitions.IS_NULL,
Collections.singletonList(longRefExpr),
DataTypes.BOOLEAN()),
- new IsNull(0)),
+ PredicateBuilder.isNull(0)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.IS_NOT_NULL,
Collections.singletonList(doubleRefExpr),
DataTypes.BOOLEAN()),
- new IsNotNull(1)),
+ PredicateBuilder.isNotNull(1)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.EQUALS,
// test literal on left
Arrays.asList(intLitExpr, longRefExpr),
DataTypes.BOOLEAN()),
- new Equal(0, longLit)),
+ PredicateBuilder.equal(0, longLit)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.NOT_EQUALS,
Arrays.asList(longRefExpr, intLitExpr),
DataTypes.BOOLEAN()),
- new NotEqual(0, longLit)),
+ PredicateBuilder.notEqual(0, longLit)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.GREATER_THAN,
Arrays.asList(longRefExpr, intLitExpr),
DataTypes.BOOLEAN()),
- new GreaterThan(0, longLit)),
+ PredicateBuilder.greaterThan(0, longLit)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.GREATER_THAN_OR_EQUAL,
Arrays.asList(longRefExpr, intLitExpr),
DataTypes.BOOLEAN()),
- new GreaterOrEqual(0, longLit)),
+ PredicateBuilder.greaterOrEqual(0, longLit)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.LESS_THAN,
Arrays.asList(longRefExpr, intLitExpr),
DataTypes.BOOLEAN()),
- new LessThan(0, longLit)),
+ PredicateBuilder.lessThan(0, longLit)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.LESS_THAN_OR_EQUAL,
Arrays.asList(longRefExpr, intLitExpr),
DataTypes.BOOLEAN()),
- new LessOrEqual(0, longLit)),
+ PredicateBuilder.lessOrEqual(0, longLit)),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.AND,
@@ -129,7 +129,9 @@ public class PredicateConverterTest {
Arrays.asList(doubleRefExpr,
floatLitExpr),
DataTypes.BOOLEAN())),
DataTypes.BOOLEAN()),
- new And(new LessOrEqual(0, longLit), new Equal(1,
doubleLit))),
+ PredicateBuilder.and(
+ PredicateBuilder.lessOrEqual(0, longLit),
+ PredicateBuilder.equal(1, doubleLit))),
Arguments.of(
CallExpression.permanent(
BuiltInFunctionDefinitions.OR,
@@ -143,6 +145,8 @@ public class PredicateConverterTest {
Arrays.asList(doubleRefExpr,
floatLitExpr),
DataTypes.BOOLEAN())),
DataTypes.BOOLEAN()),
- new Or(new NotEqual(0, longLit), new Equal(1,
doubleLit))));
+ PredicateBuilder.or(
+ PredicateBuilder.notEqual(0, longLit),
+ PredicateBuilder.equal(1, doubleLit))));
}
}
diff --git
a/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateTest.java
b/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateTest.java
index 8eeee3cf..744127f8 100644
---
a/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateTest.java
+++
b/flink-table-store-core/src/test/java/org/apache/flink/table/store/file/predicate/PredicateTest.java
@@ -82,7 +82,9 @@ public class PredicateTest {
.isEqualTo(false);
assertThat(predicate.negate().orElse(null))
- .isEqualTo(new NotEqual(0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
+ .isEqualTo(
+ PredicateBuilder.notEqual(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
}
@Test
@@ -103,7 +105,9 @@ public class PredicateTest {
.isEqualTo(false);
assertThat(predicate.negate().orElse(null))
- .isEqualTo(new Equal(0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
+ .isEqualTo(
+ PredicateBuilder.equal(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
}
@Test
@@ -128,7 +132,9 @@ public class PredicateTest {
.isEqualTo(false);
assertThat(predicate.negate().orElse(null))
- .isEqualTo(new LessOrEqual(0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
+ .isEqualTo(
+ PredicateBuilder.lessOrEqual(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
}
@Test
@@ -153,7 +159,9 @@ public class PredicateTest {
.isEqualTo(false);
assertThat(predicate.negate().orElse(null))
- .isEqualTo(new LessThan(0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
+ .isEqualTo(
+ PredicateBuilder.lessThan(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
}
@Test
@@ -174,7 +182,9 @@ public class PredicateTest {
.isEqualTo(false);
assertThat(predicate.negate().orElse(null))
- .isEqualTo(new GreaterOrEqual(0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
+ .isEqualTo(
+ PredicateBuilder.greaterOrEqual(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
}
@Test
@@ -198,7 +208,9 @@ public class PredicateTest {
.isEqualTo(false);
assertThat(predicate.negate().orElse(null))
- .isEqualTo(new GreaterThan(0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
+ .isEqualTo(
+ PredicateBuilder.greaterThan(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 5)));
}
@Test
@@ -216,7 +228,7 @@ public class PredicateTest {
assertThat(predicate.test(3, new FieldStats[] {new FieldStats(6, 7,
0)})).isEqualTo(false);
assertThat(predicate.test(3, new FieldStats[] {new FieldStats(5, 7,
1)})).isEqualTo(true);
- assertThat(predicate.negate().orElse(null)).isEqualTo(new
IsNotNull(0));
+
assertThat(predicate.negate().orElse(null)).isEqualTo(PredicateBuilder.isNotNull(0));
}
@Test
@@ -236,7 +248,7 @@ public class PredicateTest {
assertThat(predicate.test(3, new FieldStats[] {new FieldStats(null,
null, 3)}))
.isEqualTo(false);
- assertThat(predicate.negate().orElse(null)).isEqualTo(new IsNull(0));
+
assertThat(predicate.negate().orElse(null)).isEqualTo(PredicateBuilder.isNull(0));
}
@Test
@@ -283,9 +295,11 @@ public class PredicateTest {
assertThat(predicate.negate().orElse(null))
.isEqualTo(
- new Or(
- new NotEqual(0, new
Literal(DataTypes.INT().getLogicalType(), 3)),
- new NotEqual(1, new
Literal(DataTypes.INT().getLogicalType(), 5))));
+ PredicateBuilder.or(
+ PredicateBuilder.notEqual(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 3)),
+ PredicateBuilder.notEqual(
+ 1, new
Literal(DataTypes.INT().getLogicalType(), 5))));
}
@Test
@@ -332,9 +346,11 @@ public class PredicateTest {
assertThat(predicate.negate().orElse(null))
.isEqualTo(
- new And(
- new NotEqual(0, new
Literal(DataTypes.INT().getLogicalType(), 3)),
- new NotEqual(1, new
Literal(DataTypes.INT().getLogicalType(), 5))));
+ PredicateBuilder.and(
+ PredicateBuilder.notEqual(
+ 0, new
Literal(DataTypes.INT().getLogicalType(), 3)),
+ PredicateBuilder.notEqual(
+ 1, new
Literal(DataTypes.INT().getLogicalType(), 5))));
}
@MethodSource("provideLikeExpressions")
diff --git
a/flink-table-store-hive/src/main/java/org/apache/flink/table/store/SearchArgumentToPredicateConverter.java
b/flink-table-store-hive/src/main/java/org/apache/flink/table/store/SearchArgumentToPredicateConverter.java
index b8058969..997447f1 100644
---
a/flink-table-store-hive/src/main/java/org/apache/flink/table/store/SearchArgumentToPredicateConverter.java
+++
b/flink-table-store-hive/src/main/java/org/apache/flink/table/store/SearchArgumentToPredicateConverter.java
@@ -21,10 +21,6 @@ package org.apache.flink.table.store;
import org.apache.flink.table.data.DecimalData;
import org.apache.flink.table.data.StringData;
import org.apache.flink.table.data.TimestampData;
-import org.apache.flink.table.store.file.predicate.Equal;
-import org.apache.flink.table.store.file.predicate.IsNull;
-import org.apache.flink.table.store.file.predicate.LessOrEqual;
-import org.apache.flink.table.store.file.predicate.LessThan;
import org.apache.flink.table.store.file.predicate.Literal;
import org.apache.flink.table.store.file.predicate.Predicate;
import org.apache.flink.table.store.file.predicate.PredicateBuilder;
@@ -112,11 +108,11 @@ public class SearchArgumentToPredicateConverter {
LogicalType columnType = columnTypes.get(idx);
switch (leaf.getOperator()) {
case EQUALS:
- return new Equal(idx, toLiteral(columnType,
leaf.getLiteral()));
+ return PredicateBuilder.equal(idx, toLiteral(columnType,
leaf.getLiteral()));
case LESS_THAN:
- return new LessThan(idx, toLiteral(columnType,
leaf.getLiteral()));
+ return PredicateBuilder.lessThan(idx, toLiteral(columnType,
leaf.getLiteral()));
case LESS_THAN_EQUALS:
- return new LessOrEqual(idx, toLiteral(columnType,
leaf.getLiteral()));
+ return PredicateBuilder.lessOrEqual(idx, toLiteral(columnType,
leaf.getLiteral()));
case IN:
return PredicateBuilder.in(
idx,
@@ -130,7 +126,7 @@ public class SearchArgumentToPredicateConverter {
toLiteral(columnType, literalList.get(0)),
toLiteral(columnType, literalList.get(1)));
case IS_NULL:
- return new IsNull(idx);
+ return PredicateBuilder.isNull(idx);
default:
throw new UnsupportedOperationException(
"Unsupported operator " + leaf.getOperator());
diff --git
a/flink-table-store-hive/src/test/java/org/apache/flink/table/store/SearchArgumentToPredicateConverterTest.java
b/flink-table-store-hive/src/test/java/org/apache/flink/table/store/SearchArgumentToPredicateConverterTest.java
index 32213603..54583ae5 100644
---
a/flink-table-store-hive/src/test/java/org/apache/flink/table/store/SearchArgumentToPredicateConverterTest.java
+++
b/flink-table-store-hive/src/test/java/org/apache/flink/table/store/SearchArgumentToPredicateConverterTest.java
@@ -22,18 +22,9 @@ import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.data.DecimalData;
import org.apache.flink.table.data.StringData;
import org.apache.flink.table.data.TimestampData;
-import org.apache.flink.table.store.file.predicate.And;
-import org.apache.flink.table.store.file.predicate.Equal;
-import org.apache.flink.table.store.file.predicate.GreaterOrEqual;
-import org.apache.flink.table.store.file.predicate.GreaterThan;
-import org.apache.flink.table.store.file.predicate.IsNotNull;
-import org.apache.flink.table.store.file.predicate.IsNull;
-import org.apache.flink.table.store.file.predicate.LessOrEqual;
-import org.apache.flink.table.store.file.predicate.LessThan;
import org.apache.flink.table.store.file.predicate.Literal;
-import org.apache.flink.table.store.file.predicate.NotEqual;
-import org.apache.flink.table.store.file.predicate.Or;
import org.apache.flink.table.store.file.predicate.Predicate;
+import org.apache.flink.table.store.file.predicate.PredicateBuilder;
import org.apache.flink.table.types.logical.LogicalType;
import org.apache.hadoop.hive.common.type.HiveDecimal;
@@ -103,7 +94,7 @@ public class SearchArgumentToPredicateConverterTest {
new SearchArgumentToPredicateConverter(
sarg, Collections.singletonList("a"),
Collections.singletonList(flinkType));
- Predicate expected = new Equal(0, new Literal(flinkType,
flinkLiteral));
+ Predicate expected = PredicateBuilder.equal(0, new Literal(flinkType,
flinkLiteral));
Predicate actual = converter.convert().orElse(null);
assertThat(actual).isEqualTo(expected);
}
@@ -120,7 +111,7 @@ public class SearchArgumentToPredicateConverterTest {
public void testEqual() {
SearchArgument.Builder builder = SearchArgumentFactory.newBuilder();
SearchArgument sarg = builder.equals("f_bigint",
PredicateLeaf.Type.LONG, 100L).build();
- Predicate expected = new Equal(1, new Literal(BIGINT_TYPE, 100L));
+ Predicate expected = PredicateBuilder.equal(1, new
Literal(BIGINT_TYPE, 100L));
assertExpected(sarg, expected);
}
@@ -129,7 +120,7 @@ public class SearchArgumentToPredicateConverterTest {
SearchArgument.Builder builder = SearchArgumentFactory.newBuilder();
SearchArgument sarg =
builder.startNot().equals("f_bigint", PredicateLeaf.Type.LONG,
100L).end().build();
- Predicate expected = new NotEqual(1, new Literal(BIGINT_TYPE, 100L));
+ Predicate expected = PredicateBuilder.notEqual(1, new
Literal(BIGINT_TYPE, 100L));
assertExpected(sarg, expected);
}
@@ -137,7 +128,7 @@ public class SearchArgumentToPredicateConverterTest {
public void testLessThan() {
SearchArgument.Builder builder = SearchArgumentFactory.newBuilder();
SearchArgument sarg = builder.lessThan("f_bigint",
PredicateLeaf.Type.LONG, 100L).build();
- Predicate expected = new LessThan(1, new Literal(BIGINT_TYPE, 100L));
+ Predicate expected = PredicateBuilder.lessThan(1, new
Literal(BIGINT_TYPE, 100L));
assertExpected(sarg, expected);
}
@@ -149,7 +140,7 @@ public class SearchArgumentToPredicateConverterTest {
.lessThan("f_bigint", PredicateLeaf.Type.LONG, 100L)
.end()
.build();
- Predicate expected = new GreaterOrEqual(1, new Literal(BIGINT_TYPE,
100L));
+ Predicate expected = PredicateBuilder.greaterOrEqual(1, new
Literal(BIGINT_TYPE, 100L));
assertExpected(sarg, expected);
}
@@ -158,7 +149,7 @@ public class SearchArgumentToPredicateConverterTest {
SearchArgument.Builder builder = SearchArgumentFactory.newBuilder();
SearchArgument sarg =
builder.lessThanEquals("f_bigint", PredicateLeaf.Type.LONG,
100L).build();
- Predicate expected = new LessOrEqual(1, new Literal(BIGINT_TYPE,
100L));
+ Predicate expected = PredicateBuilder.lessOrEqual(1, new
Literal(BIGINT_TYPE, 100L));
assertExpected(sarg, expected);
}
@@ -170,7 +161,7 @@ public class SearchArgumentToPredicateConverterTest {
.lessThanEquals("f_bigint", PredicateLeaf.Type.LONG,
100L)
.end()
.build();
- Predicate expected = new GreaterThan(1, new Literal(BIGINT_TYPE,
100L));
+ Predicate expected = PredicateBuilder.greaterThan(1, new
Literal(BIGINT_TYPE, 100L));
assertExpected(sarg, expected);
}
@@ -180,11 +171,10 @@ public class SearchArgumentToPredicateConverterTest {
SearchArgument sarg =
builder.in("f_bigint", PredicateLeaf.Type.LONG, 100L, 200L,
300L).build();
Predicate expected =
- new Or(
- new Or(
- new Equal(1, new Literal(BIGINT_TYPE, 100L)),
- new Equal(1, new Literal(BIGINT_TYPE, 200L))),
- new Equal(1, new Literal(BIGINT_TYPE, 300L)));
+ PredicateBuilder.or(
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
200L)),
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
300L)));
assertExpected(sarg, expected);
}
@@ -197,11 +187,10 @@ public class SearchArgumentToPredicateConverterTest {
.end()
.build();
Predicate expected =
- new And(
- new And(
- new NotEqual(1, new Literal(BIGINT_TYPE,
100L)),
- new NotEqual(1, new Literal(BIGINT_TYPE,
200L))),
- new NotEqual(1, new Literal(BIGINT_TYPE, 300L)));
+ PredicateBuilder.and(
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
200L)),
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
300L)));
assertExpected(sarg, expected);
}
@@ -211,9 +200,9 @@ public class SearchArgumentToPredicateConverterTest {
SearchArgument sarg =
builder.between("f_bigint", PredicateLeaf.Type.LONG, 100L,
200L).build();
Predicate expected =
- new And(
- new GreaterOrEqual(1, new Literal(BIGINT_TYPE, 100L)),
- new LessOrEqual(1, new Literal(BIGINT_TYPE, 200L)));
+ PredicateBuilder.and(
+ PredicateBuilder.greaterOrEqual(1, new
Literal(BIGINT_TYPE, 100L)),
+ PredicateBuilder.lessOrEqual(1, new
Literal(BIGINT_TYPE, 200L)));
assertExpected(sarg, expected);
}
@@ -226,9 +215,9 @@ public class SearchArgumentToPredicateConverterTest {
.end()
.build();
Predicate expected =
- new Or(
- new LessThan(1, new Literal(BIGINT_TYPE, 100L)),
- new GreaterThan(1, new Literal(BIGINT_TYPE, 200L)));
+ PredicateBuilder.or(
+ PredicateBuilder.lessThan(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.greaterThan(1, new
Literal(BIGINT_TYPE, 200L)));
assertExpected(sarg, expected);
}
@@ -236,7 +225,7 @@ public class SearchArgumentToPredicateConverterTest {
public void testIsNull() {
SearchArgument.Builder builder = SearchArgumentFactory.newBuilder();
SearchArgument sarg = builder.isNull("f_bigint",
PredicateLeaf.Type.LONG).build();
- Predicate expected = new IsNull(1);
+ Predicate expected = PredicateBuilder.isNull(1);
assertExpected(sarg, expected);
}
@@ -245,7 +234,7 @@ public class SearchArgumentToPredicateConverterTest {
SearchArgument.Builder builder = SearchArgumentFactory.newBuilder();
SearchArgument sarg =
builder.startNot().isNull("f_bigint",
PredicateLeaf.Type.LONG).end().build();
- Predicate expected = new IsNotNull(1);
+ Predicate expected = PredicateBuilder.isNotNull(1);
assertExpected(sarg, expected);
}
@@ -260,11 +249,10 @@ public class SearchArgumentToPredicateConverterTest {
.end()
.build();
Predicate expected =
- new Or(
- new Or(
- new Equal(1, new Literal(BIGINT_TYPE, 100L)),
- new Equal(1, new Literal(BIGINT_TYPE, 200L))),
- new Equal(1, new Literal(BIGINT_TYPE, 300L)));
+ PredicateBuilder.or(
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
200L)),
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
300L)));
assertExpected(sarg, expected);
}
@@ -281,11 +269,10 @@ public class SearchArgumentToPredicateConverterTest {
.end()
.build();
Predicate expected =
- new And(
- new And(
- new NotEqual(1, new Literal(BIGINT_TYPE,
100L)),
- new NotEqual(1, new Literal(BIGINT_TYPE,
200L))),
- new NotEqual(1, new Literal(BIGINT_TYPE, 300L)));
+ PredicateBuilder.and(
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
200L)),
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
300L)));
assertExpected(sarg, expected);
}
@@ -306,11 +293,10 @@ public class SearchArgumentToPredicateConverterTest {
.end()
.build();
Predicate expected =
- new And(
- new And(
- new NotEqual(1, new Literal(BIGINT_TYPE,
100L)),
- new NotEqual(1, new Literal(BIGINT_TYPE,
200L))),
- new NotEqual(1, new Literal(BIGINT_TYPE, 300L)));
+ PredicateBuilder.and(
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
200L)),
+ PredicateBuilder.notEqual(1, new Literal(BIGINT_TYPE,
300L)));
assertExpected(sarg, expected);
}
@@ -333,11 +319,10 @@ public class SearchArgumentToPredicateConverterTest {
.end()
.build();
Predicate expected =
- new Or(
- new Or(
- new Equal(1, new Literal(BIGINT_TYPE, 100L)),
- new Equal(1, new Literal(BIGINT_TYPE, 200L))),
- new Equal(1, new Literal(BIGINT_TYPE, 300L)));
+ PredicateBuilder.or(
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
100L)),
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
200L)),
+ PredicateBuilder.equal(1, new Literal(BIGINT_TYPE,
300L)));
assertExpected(sarg, expected);
}