From 4f2322cf06c0f4d0d11325e8e2a0aac990139142 Mon Sep 17 00:00:00 2001 From: wuwenchi Date: Thu, 21 Dec 2023 16:24:09 +0800 Subject: [PATCH 1/3] fix `like` predict --- .../paimon/PaimonPredicateConverter.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java index 9c997c03190419..cd35d1093ed084 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java @@ -17,14 +17,15 @@ package org.apache.doris.planner.external.paimon; -import org.apache.doris.analysis.BinaryPredicate; import org.apache.doris.analysis.CastExpr; import org.apache.doris.analysis.CompoundPredicate; import org.apache.doris.analysis.Expr; +import org.apache.doris.analysis.FunctionCallExpr; import org.apache.doris.analysis.LiteralExpr; import org.apache.doris.analysis.SlotRef; import org.apache.doris.thrift.TExprOpcode; +import org.apache.paimon.data.BinaryString; import org.apache.paimon.predicate.Predicate; import org.apache.paimon.predicate.PredicateBuilder; import org.apache.paimon.types.DataField; @@ -84,10 +85,9 @@ public Predicate convertToPaimonExpr(Expr dorisExpr) { private Predicate binaryExprDesc(Expr dorisExpr) { TExprOpcode opcode = dorisExpr.getOpcode(); - BinaryPredicate bp = (BinaryPredicate) dorisExpr; // Make sure the col slot is always first - SlotRef slotRef = convertDorisExprToSlotRef(bp.getChild(0)); - LiteralExpr literalExpr = convertDorisExprToLiteralExpr(bp.getChild(1)); + SlotRef slotRef = convertDorisExprToSlotRef(dorisExpr.getChild(0)); + LiteralExpr literalExpr = convertDorisExprToLiteralExpr(dorisExpr.getChild(1)); if (slotRef == null || literalExpr == null) { return null; } @@ -113,6 +113,15 @@ private Predicate binaryExprDesc(Expr dorisExpr) { return builder.lessOrEqual(idx, value); case LT: return builder.lessThan(idx, value); + case INVALID_OPCODE: + if (dorisExpr instanceof FunctionCallExpr) { + String name = dorisExpr.getExprName().toLowerCase(); + String s = value.toString(); + if (name.equals("like") && !s.startsWith("%") && s.endsWith("%")) { + return builder.startsWith(idx, BinaryString.fromString(s.substring(0, s.length() - 1))); + } + } + return null; default: return null; } From 7994f6f4f929fdfb3a0dd10c27d33ebdb8a4a60d Mon Sep 17 00:00:00 2001 From: wuwenchi Date: Fri, 22 Dec 2023 15:02:35 +0800 Subject: [PATCH 2/3] add test --- .../external_table_p0/paimon/test_paimon_catalog.groovy | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy index ee74abd7ed887c..8b235224a8f3a3 100644 --- a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy +++ b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy @@ -56,6 +56,11 @@ suite("test_paimon_catalog", "p0,external,doris,external_docker,external_docker_ if (enabled != null && enabled.equalsIgnoreCase("true")) { def all = """select * from all_table order by c1;""" def all_with_parquet = """select * from all_table_with_parquet order by c1;""" + def predict_like_1 = """select * from all_table where c13 like '%3%' order by c1""" + def predict_like_2 = """select * from all_table where c13 like '13%' order by c1""" + def predict_like_3 = """select * from all_table where c13 like '13' order by c1""" + def predict_like_4 = """select * from all_table where c13 like '130str' order by c1""" + def predict_like_5 = """select * from all_table where c13 like '130str%' order by c1""" def c1 = """select * from all_table where c1=1;""" def c2 = """select * from all_table where c2=2;""" def c3 = """select * from all_table where c3=3;""" From 1956e01e04503174c21f40140bc0ce70d7d475cb Mon Sep 17 00:00:00 2001 From: wuwenchi Date: Fri, 22 Dec 2023 16:55:05 +0800 Subject: [PATCH 3/3] add test --- .../paimon/test_paimon_catalog.out | 16 ++++++++++++++++ .../paimon/test_paimon_catalog.groovy | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out b/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out index a2e4f2752c01c1..b0c9eff5b0a7f8 100644 --- a/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out +++ b/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out @@ -7,6 +7,22 @@ 2 2 3 4 5 6 7 8 9.1 10.1 11.10 2020-02-02 13str 14varchar a true aaaa 2023-12-21T10:02:32.747 10 20 30 40 50 60 70 80 90.1 100.1 110.10 2020-03-02 130str 140varchar b false bbbb 2023-12-21T10:02:37.527 +-- !predict_like_1 -- +1 2 3 4 5 6 7 8 9.1 10.1 11.10 2020-02-02 13str 14varchar a true aaaa 2023-08-13T09:32:38.530 +10 20 30 40 50 60 70 80 90.1 100.1 110.10 2020-03-02 130str 140varchar b false bbbb 2023-08-14T08:32:52.821 + +-- !predict_like_2 -- +1 2 3 4 5 6 7 8 9.1 10.1 11.10 2020-02-02 13str 14varchar a true aaaa 2023-08-13T09:32:38.530 +10 20 30 40 50 60 70 80 90.1 100.1 110.10 2020-03-02 130str 140varchar b false bbbb 2023-08-14T08:32:52.821 + +-- !predict_like_3 -- + +-- !predict_like_4 -- +10 20 30 40 50 60 70 80 90.1 100.1 110.10 2020-03-02 130str 140varchar b false bbbb 2023-08-14T08:32:52.821 + +-- !predict_like_5 -- +10 20 30 40 50 60 70 80 90.1 100.1 110.10 2020-03-02 130str 140varchar b false bbbb 2023-08-14T08:32:52.821 + -- !c1 -- 1 2 3 4 5 6 7 8 9.1 10.1 11.10 2020-02-02 13str 14varchar a true aaaa 2023-08-13T09:32:38.530 diff --git a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy index 8b235224a8f3a3..c00ef1cf1be6a1 100644 --- a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy +++ b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy @@ -180,6 +180,11 @@ suite("test_paimon_catalog", "p0,external,doris,external_docker,external_docker_ qt_all all qt_all_with_parquet all_with_parquet + qt_predict_like_1 predict_like_1 + qt_predict_like_2 predict_like_2 + qt_predict_like_3 predict_like_3 + qt_predict_like_4 predict_like_4 + qt_predict_like_5 predict_like_5 qt_c1 c1 qt_c2 c2 qt_c3 c3