Skip to content

Commit 7846862

Browse files
committed
fix
1 parent 1ab098d commit 7846862

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

paimon-common/src/main/java/org/apache/paimon/predicate/Like.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ private Filter<BinaryString> createFunc(DataType type, Object patternLiteral) {
6565
Object literal = optimized.get().getValue();
6666
return field -> func.test(type, field, literal);
6767
}
68+
// TODO optimize for chain checkers when there is no '_'
69+
// TODO for example: "abc%def%","%abc%def","%abc%def%","abc%def"
6870
String regex = sqlToRegexLike(patternLiteral.toString(), null);
6971
Pattern pattern = Pattern.compile(regex);
7072
return input -> pattern.matcher(input.toString()).matches();

paimon-common/src/test/java/org/apache/paimon/predicate/PredicateTest.java

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.paimon.data.GenericRow;
2323
import org.apache.paimon.format.SimpleColStats;
2424
import org.apache.paimon.types.CharType;
25+
import org.apache.paimon.types.DataTypes;
2526
import org.apache.paimon.types.IntType;
2627
import org.apache.paimon.types.RowType;
2728
import org.apache.paimon.types.VarCharType;
@@ -31,6 +32,7 @@
3132
import java.util.ArrayList;
3233
import java.util.Arrays;
3334
import java.util.List;
35+
import java.util.concurrent.ThreadLocalRandom;
3436

3537
import static org.apache.paimon.data.BinaryString.fromString;
3638
import static org.apache.paimon.predicate.SimpleColStatsTestUtils.test;
@@ -522,25 +524,27 @@ public void testLargeNotInNull() {
522524
}
523525

524526
@Test
525-
public void testLike() {
527+
public void executeLike() {
526528
// test eval
527-
assertThat(testLike("abc", "a.c")).isEqualTo(false);
528-
assertThat(testLike("a.c", "a.c")).isEqualTo(true);
529-
assertThat(testLike("abcd", "a.*d")).isEqualTo(false);
530-
assertThat(testLike("abcde", "%c.e")).isEqualTo(false);
531-
assertThat(testLike("a-c", "a\\_c")).isEqualTo(false);
532-
assertThat(testLike("a_c", "a\\_c")).isEqualTo(true);
533-
assertThat(testLike("startX", "start%")).isEqualTo(true);
534-
assertThat(testLike("not_startX", "start%")).isEqualTo(false);
535-
assertThat(testLike("xxmiddleyy", "%middle%")).isEqualTo(true);
536-
assertThat(testLike("xxmidxdleyy", "%middle%")).isEqualTo(false);
537-
assertThat(testLike("xxend", "%end")).isEqualTo(true);
538-
assertThat(testLike("xxendyy", "%end")).isEqualTo(false);
539-
assertThat(testLike("equal", "equal")).isEqualTo(true);
540-
assertThat(testLike("equalxx", "equal")).isEqualTo(false);
541-
assertThat(testLike("startxx", "st_rt%")).isEqualTo(true);
542-
assertThat(testLike("stbrtxx", "st_rt%")).isEqualTo(true);
543-
assertThat(testLike("xxstbrtxx", "st_rt%")).isEqualTo(false);
529+
assertThat(executeLike("abc", "a.c")).isEqualTo(false);
530+
assertThat(executeLike("a.c", "a.c")).isEqualTo(true);
531+
assertThat(executeLike("abcd", "a.*d")).isEqualTo(false);
532+
assertThat(executeLike("abcde", "%c.e")).isEqualTo(false);
533+
assertThat(executeLike("a-c", "a\\_c")).isEqualTo(false);
534+
assertThat(executeLike("a_c", "a\\_c")).isEqualTo(true);
535+
assertThat(executeLike("startX", "start%")).isEqualTo(true);
536+
assertThat(executeLike("not_startX", "start%")).isEqualTo(false);
537+
assertThat(executeLike("xxmiddleyy", "%middle%")).isEqualTo(true);
538+
assertThat(executeLike("xxmidxdleyy", "%middle%")).isEqualTo(false);
539+
assertThat(executeLike("xxend", "%end")).isEqualTo(true);
540+
assertThat(executeLike("xxendyy", "%end")).isEqualTo(false);
541+
assertThat(executeLike("equal", "equal")).isEqualTo(true);
542+
assertThat(executeLike("equalxx", "equal")).isEqualTo(false);
543+
assertThat(executeLike("startxx", "st_rt%")).isEqualTo(true);
544+
assertThat(executeLike("stbrtxx", "st_rt%")).isEqualTo(true);
545+
assertThat(executeLike("xxstbrtxx", "st_rt%")).isEqualTo(false);
546+
assertThat(executeLike("abchahadefxx", "abc%def%")).isEqualTo(true);
547+
assertThat(executeLike("abchahadafxx", "abc%def%")).isEqualTo(false);
544548

545549
// test instance
546550
assertThat(getLikeFunc("equal")).isEqualTo(Equal.INSTANCE);
@@ -550,10 +554,15 @@ public void testLike() {
550554
assertThat(getLikeFunc("a_c")).isEqualTo(Like.INSTANCE);
551555
}
552556

553-
private boolean testLike(String s, String pattern) {
554-
PredicateBuilder builder = new PredicateBuilder(RowType.of(new VarCharType()));
555-
Predicate predicate = builder.like(0, fromString(pattern));
556-
return predicate.test(GenericRow.of(fromString(s)));
557+
private boolean executeLike(String s, String pattern) {
558+
ThreadLocalRandom rnd = ThreadLocalRandom.current();
559+
if (rnd.nextBoolean()) {
560+
PredicateBuilder builder = new PredicateBuilder(RowType.of(new VarCharType()));
561+
Predicate predicate = builder.like(0, fromString(pattern));
562+
return predicate.test(GenericRow.of(fromString(s)));
563+
} else {
564+
return Like.INSTANCE.test(DataTypes.STRING(), fromString(s), fromString(pattern));
565+
}
557566
}
558567

559568
private LeafFunction getLikeFunc(String pattern) {

0 commit comments

Comments
 (0)