From 14db74fac6ea3bff78b6e7557d621e623ebbee8e Mon Sep 17 00:00:00 2001 From: DinoZhang Date: Fri, 30 Jul 2021 09:24:06 +0800 Subject: [PATCH] [Bug] Fix show load like match (#6314) * fix show load like match * Compatible with historical issues --- .../apache/doris/analysis/CancelLoadStmt.java | 3 +++ .../apache/doris/analysis/ShowLoadStmt.java | 3 +++ .../main/java/org/apache/doris/load/Load.java | 23 +++++++++++++------ .../apache/doris/load/loadv2/LoadManager.java | 13 +++++++---- .../doris/analysis/ShowLoadStmtTest.java | 6 +++-- 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelLoadStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelLoadStmt.java index 4fda341e11..545ed9d187 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelLoadStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelLoadStmt.java @@ -115,6 +115,9 @@ public class CancelLoadStmt extends DdlStmt { valid = false; break; } + if (!isAccurateMatch && !label.contains("%")) { + label = "%" + label + "%"; + } } while (false); if (!valid) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowLoadStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowLoadStmt.java index 523d10a585..610477e4df 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowLoadStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowLoadStmt.java @@ -219,6 +219,9 @@ public class ShowLoadStmt extends ShowStmt { break CHECK; } + if (!isAccurateMatch && !value.contains("%")) { + value = "%" + value + "%"; + } if (hasLabel) { labelValue = value; } else if (hasState) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/Load.java b/fe/fe-core/src/main/java/org/apache/doris/load/Load.java index aefe73e2e5..bc78e44ba6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/Load.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/Load.java @@ -65,6 +65,7 @@ import org.apache.doris.catalog.TabletMeta; import org.apache.doris.catalog.Type; import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.CaseSensibility; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.ErrorCode; @@ -75,6 +76,7 @@ import org.apache.doris.common.LabelAlreadyUsedException; import org.apache.doris.common.LoadException; import org.apache.doris.common.MetaNotFoundException; import org.apache.doris.common.Pair; +import org.apache.doris.common.PatternMatcher; import org.apache.doris.common.UserException; import org.apache.doris.common.util.ListComparator; import org.apache.doris.common.util.MetaLockUtils; @@ -1591,7 +1593,7 @@ public class Load { return false; } - public boolean isLabelExist(String dbName, String labelValue, boolean isAccurateMatch) throws DdlException { + public boolean isLabelExist(String dbName, String labelValue, boolean isAccurateMatch) throws DdlException, AnalysisException { // get load job and check state Database db = Catalog.getCurrentCatalog().getDb(dbName); if (db == null) { @@ -1609,8 +1611,9 @@ public class Load { loadJobs.addAll(labelToLoadJobs.get(labelValue)); } } else { + PatternMatcher matcher = PatternMatcher.createMysqlPattern(labelValue, CaseSensibility.LABEL.getCaseSensibility()); for (Map.Entry> entry : labelToLoadJobs.entrySet()) { - if (entry.getKey().contains(labelValue)) { + if (matcher.match(entry.getKey())) { loadJobs.addAll(entry.getValue()); } } @@ -1627,7 +1630,7 @@ public class Load { } } - public boolean cancelLoadJob(CancelLoadStmt stmt, boolean isAccurateMatch) throws DdlException { + public boolean cancelLoadJob(CancelLoadStmt stmt, boolean isAccurateMatch) throws DdlException, AnalysisException { // get params String dbName = stmt.getDbName(); String label = stmt.getLabel(); @@ -1653,9 +1656,10 @@ public class Load { matchLoadJobs.addAll(labelToLoadJobs.get(label)); } } else { + PatternMatcher matcher = PatternMatcher.createMysqlPattern(label, CaseSensibility.LABEL.getCaseSensibility()); for (Map.Entry> entry : labelToLoadJobs.entrySet()) { - if (entry.getKey().contains(label)) { - matchLoadJobs.addAll(entry.getValue()); + if (matcher.match(entry.getKey())) { + loadJobs.addAll(entry.getValue()); } } } @@ -1904,7 +1908,7 @@ public class Load { } public LinkedList> getLoadJobInfosByDb(long dbId, String dbName, String labelValue, - boolean accurateMatch, Set states) { + boolean accurateMatch, Set states) throws AnalysisException { LinkedList> loadJobInfos = new LinkedList>(); readLock(); try { @@ -1915,6 +1919,11 @@ public class Load { long start = System.currentTimeMillis(); LOG.debug("begin to get load job info, size: {}", loadJobs.size()); + PatternMatcher matcher = null; + if (labelValue != null && !accurateMatch) { + matcher = PatternMatcher.createMysqlPattern(labelValue, CaseSensibility.LABEL.getCaseSensibility()); + } + for (LoadJob loadJob : loadJobs) { // filter first String label = loadJob.getLabel(); @@ -1926,7 +1935,7 @@ public class Load { continue; } } else { - if (!label.contains(labelValue)) { + if (!matcher.match(label)) { continue; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java index a223ae42be..b8d8cabdf8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java @@ -23,12 +23,15 @@ import org.apache.doris.catalog.Catalog; import org.apache.doris.catalog.Database; import org.apache.doris.catalog.Table; import org.apache.doris.cluster.ClusterNamespace; +import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.CaseSensibility; import org.apache.doris.common.Config; import org.apache.doris.common.DataQualityException; import org.apache.doris.common.DdlException; import org.apache.doris.common.DuplicatedRequestException; import org.apache.doris.common.LabelAlreadyUsedException; import org.apache.doris.common.MetaNotFoundException; +import org.apache.doris.common.PatternMatcher; import org.apache.doris.common.UserException; import org.apache.doris.common.io.Writable; import org.apache.doris.common.util.LogBuilder; @@ -294,7 +297,7 @@ public class LoadManager implements Writable{ Catalog.getCurrentCatalog().getEditLog().logCreateLoadJob(loadJob); } - public void cancelLoadJob(CancelLoadStmt stmt, boolean isAccurateMatch) throws DdlException { + public void cancelLoadJob(CancelLoadStmt stmt, boolean isAccurateMatch) throws DdlException, AnalysisException { Database db = Catalog.getCurrentCatalog().getDb(stmt.getDbName()); if (db == null) { throw new DdlException("Db does not exist. name: " + stmt.getDbName()); @@ -316,8 +319,9 @@ public class LoadManager implements Writable{ matchLoadJobs.addAll(labelToLoadJobs.get(stmt.getLabel())); } } else { + PatternMatcher matcher = PatternMatcher.createMysqlPattern(stmt.getLabel(), CaseSensibility.LABEL.getCaseSensibility()); for (Map.Entry> entry : labelToLoadJobs.entrySet()) { - if (entry.getKey().contains(stmt.getLabel())) { + if (matcher.match(entry.getKey())) { matchLoadJobs.addAll(entry.getValue()); } } @@ -503,7 +507,7 @@ public class LoadManager implements Writable{ * The result is unordered. */ public List> getLoadJobInfosByDb(long dbId, String labelValue, - boolean accurateMatch, Set statesValue) { + boolean accurateMatch, Set statesValue) throws AnalysisException { LinkedList> loadJobInfos = new LinkedList>(); if (!dbIdToLabelToLoadJobs.containsKey(dbId)) { return loadJobInfos; @@ -538,8 +542,9 @@ public class LoadManager implements Writable{ loadJobList.addAll(labelToLoadJobs.get(labelValue)); } else { // non-accurate match + PatternMatcher matcher = PatternMatcher.createMysqlPattern(labelValue, CaseSensibility.LABEL.getCaseSensibility()); for (Map.Entry> entry : labelToLoadJobs.entrySet()) { - if (entry.getKey().contains(labelValue)) { + if (matcher.match(entry.getKey())) { loadJobList.addAll(entry.getValue()); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowLoadStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowLoadStmtTest.java index a45687575f..b9027f360b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowLoadStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowLoadStmtTest.java @@ -108,10 +108,12 @@ public class ShowLoadStmtTest { stmt.analyze(analyzer); Assert.assertEquals("SHOW LOAD FROM `testCluster:testDb` WHERE `label` = \'abc\' LIMIT 10", stmt.toString()); + StringLiteral stringLiteralLike = new StringLiteral("ab%"); LikePredicate likePredicate = new LikePredicate(org.apache.doris.analysis.LikePredicate.Operator.LIKE, - slotRef, stringLiteral); + slotRef, stringLiteralLike); + stmt = new ShowLoadStmt(null, likePredicate, null, new LimitElement(10)); stmt.analyze(analyzer); - Assert.assertEquals("SHOW LOAD FROM `testCluster:testDb` WHERE `label` LIKE \'abc\' LIMIT 10", stmt.toString()); + Assert.assertEquals("SHOW LOAD FROM `testCluster:testDb` WHERE `label` LIKE \'ab%\' LIMIT 10", stmt.toString()); } }