Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@ public void analyze(Analyzer analyzer) throws AnalysisException, UserException {
valid = false;
break;
}
if (!isAccurateMatch && !label.contains("%")) {
label = "%" + label + "%";
}
} while (false);

if (!valid) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,9 @@ private void analyzeSubPredicate(Expr subExpr) throws AnalysisException {
break CHECK;
}

if (!isAccurateMatch && !value.contains("%")) {
value = "%" + value + "%";
}
if (hasLabel) {
labelValue = value;
} else if (hasState) {
Expand Down
23 changes: 16 additions & 7 deletions fe/fe-core/src/main/java/org/apache/doris/load/Load.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
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;
Expand All @@ -75,6 +76,7 @@
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;
Expand Down Expand Up @@ -1591,7 +1593,7 @@ private boolean checkMultiLabelUsed(long dbId, String label, long timestamp) thr
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) {
Expand All @@ -1609,8 +1611,9 @@ public boolean isLabelExist(String dbName, String labelValue, boolean isAccurate
loadJobs.addAll(labelToLoadJobs.get(labelValue));
}
} else {
PatternMatcher matcher = PatternMatcher.createMysqlPattern(labelValue, CaseSensibility.LABEL.getCaseSensibility());
for (Map.Entry<String, List<LoadJob>> entry : labelToLoadJobs.entrySet()) {
if (entry.getKey().contains(labelValue)) {
if (matcher.match(entry.getKey())) {
loadJobs.addAll(entry.getValue());
}
}
Expand All @@ -1627,7 +1630,7 @@ public boolean isLabelExist(String dbName, String labelValue, boolean isAccurate
}
}

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();
Expand All @@ -1653,9 +1656,10 @@ public boolean cancelLoadJob(CancelLoadStmt stmt, boolean isAccurateMatch) throw
matchLoadJobs.addAll(labelToLoadJobs.get(label));
}
} else {
PatternMatcher matcher = PatternMatcher.createMysqlPattern(label, CaseSensibility.LABEL.getCaseSensibility());
for (Map.Entry<String, List<LoadJob>> entry : labelToLoadJobs.entrySet()) {
if (entry.getKey().contains(label)) {
matchLoadJobs.addAll(entry.getValue());
if (matcher.match(entry.getKey())) {
loadJobs.addAll(entry.getValue());
}
}
}
Expand Down Expand Up @@ -1904,7 +1908,7 @@ public LoadJob getLoadJob(long jobId) {
}

public LinkedList<List<Comparable>> getLoadJobInfosByDb(long dbId, String dbName, String labelValue,
boolean accurateMatch, Set<JobState> states) {
boolean accurateMatch, Set<JobState> states) throws AnalysisException {
LinkedList<List<Comparable>> loadJobInfos = new LinkedList<List<Comparable>>();
readLock();
try {
Expand All @@ -1915,6 +1919,11 @@ public LinkedList<List<Comparable>> getLoadJobInfosByDb(long dbId, String dbName

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();
Expand All @@ -1926,7 +1935,7 @@ public LinkedList<List<Comparable>> getLoadJobInfosByDb(long dbId, String dbName
continue;
}
} else {
if (!label.contains(labelValue)) {
if (!matcher.match(label)) {
continue;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@
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;
Expand Down Expand Up @@ -294,7 +297,7 @@ public void recordFinishedLoadJob(String label, String dbName, long tableId, Etl
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());
Expand All @@ -316,8 +319,9 @@ public void cancelLoadJob(CancelLoadStmt stmt, boolean isAccurateMatch) throws D
matchLoadJobs.addAll(labelToLoadJobs.get(stmt.getLabel()));
}
} else {
PatternMatcher matcher = PatternMatcher.createMysqlPattern(stmt.getLabel(), CaseSensibility.LABEL.getCaseSensibility());
for (Map.Entry<String, List<LoadJob>> entry : labelToLoadJobs.entrySet()) {
if (entry.getKey().contains(stmt.getLabel())) {
if (matcher.match(entry.getKey())) {
matchLoadJobs.addAll(entry.getValue());
}
}
Expand Down Expand Up @@ -503,7 +507,7 @@ public void processLoadingStateJobs() {
* The result is unordered.
*/
public List<List<Comparable>> getLoadJobInfosByDb(long dbId, String labelValue,
boolean accurateMatch, Set<String> statesValue) {
boolean accurateMatch, Set<String> statesValue) throws AnalysisException {
LinkedList<List<Comparable>> loadJobInfos = new LinkedList<List<Comparable>>();
if (!dbIdToLabelToLoadJobs.containsKey(dbId)) {
return loadJobInfos;
Expand Down Expand Up @@ -538,8 +542,9 @@ public List<List<Comparable>> getLoadJobInfosByDb(long dbId, String labelValue,
loadJobList.addAll(labelToLoadJobs.get(labelValue));
} else {
// non-accurate match
PatternMatcher matcher = PatternMatcher.createMysqlPattern(labelValue, CaseSensibility.LABEL.getCaseSensibility());
for (Map.Entry<String, List<LoadJob>> entry : labelToLoadJobs.entrySet()) {
if (entry.getKey().contains(labelValue)) {
if (matcher.match(entry.getKey())) {
loadJobList.addAll(entry.getValue());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,12 @@ public void testWhere() throws UserException, AnalysisException {
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());
}
}