This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new 0f81194 [Bug] Fix the bug of #4608, support order by, where, limit in `show alter table rollup` (#4611) 0f81194 is described below commit 0f811941fe83c8d42911f078180f51cf76c37e6b Author: HappenLee <happen...@hotmail.com> AuthorDate: Sun Sep 20 20:54:43 2020 +0800 [Bug] Fix the bug of #4608, support order by, where, limit in `show alter table rollup` (#4611) support order by, where, limit in `show alter table rollup` --- .../apache/doris/common/proc/RollupProcDir.java | 115 ++++++++++++++++++++- .../java/org/apache/doris/qe/ShowExecutor.java | 4 + 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/RollupProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/RollupProcDir.java index 8e5e010..26f9526 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/RollupProcDir.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/RollupProcDir.java @@ -17,22 +17,37 @@ package org.apache.doris.common.proc; +import com.google.common.collect.Lists; import org.apache.doris.alter.AlterJobV2; import org.apache.doris.alter.MaterializedViewHandler; import org.apache.doris.alter.RollupJobV2; +import org.apache.doris.analysis.BinaryPredicate; +import org.apache.doris.analysis.DateLiteral; +import org.apache.doris.analysis.Expr; +import org.apache.doris.analysis.LimitElement; +import org.apache.doris.analysis.StringLiteral; import org.apache.doris.catalog.Database; +import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; +import org.apache.doris.common.util.ListComparator; +import org.apache.doris.common.util.OrderByPair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; public class RollupProcDir implements ProcDirInterface { + private static final Logger LOG = LogManager.getLogger(RollupProcDir.class); + public static final ImmutableList<String> TITLE_NAMES = new ImmutableList.Builder<String>() - .add("JobId").add("TableName").add("CreateTime").add("FinishedTime") + .add("JobId").add("TableName").add("CreateTime").add("FinishTime") .add("BaseIndexName").add("RollupIndexName").add("RollupId").add("TransactionId") .add("State").add("Msg").add("Progress").add("Timeout") .build(); @@ -64,6 +79,104 @@ public class RollupProcDir implements ProcDirInterface { return result; } + public ProcResult fetchResultByFilter(HashMap<String, Expr> filter, ArrayList<OrderByPair> orderByPairs, + LimitElement limitElement) throws AnalysisException { + Preconditions.checkNotNull(db); + Preconditions.checkNotNull(materializedViewHandler); + + List<List<Comparable>> rollupJobInfos = materializedViewHandler.getAlterJobInfosByDb(db); + List<List<Comparable>> jobInfos = Lists.newArrayList(); + + //where + if (filter == null || filter.size() == 0){ + jobInfos = rollupJobInfos; + } else { + jobInfos = Lists.newArrayList(); + for (List<Comparable> infoStr : rollupJobInfos) { + if (infoStr.size() != TITLE_NAMES.size()) { + LOG.warn("RollupJobInfos.size() " + rollupJobInfos.size() + + " not equal TITLE_NAMES.size() " + TITLE_NAMES.size()); + continue; + } + boolean isNeed = true; + for (int i = 0; i < infoStr.size(); i++) { + isNeed = filterResult(TITLE_NAMES.get(i), infoStr.get(i), filter); + if (!isNeed) { + break; + } + } + if (isNeed) { + jobInfos.add(infoStr); + } + } + } + + // order by + if (orderByPairs != null) { + ListComparator<List<Comparable>> comparator = null; + OrderByPair[] orderByPairArr = new OrderByPair[orderByPairs.size()]; + comparator = new ListComparator<List<Comparable>>(orderByPairs.toArray(orderByPairArr)); + Collections.sort(jobInfos, comparator); + } + + //limit + if (limitElement != null && limitElement.hasLimit()) { + int beginIndex = (int) limitElement.getOffset(); + int endIndex = (int) (beginIndex + limitElement.getLimit()); + if (endIndex > jobInfos.size()) { + endIndex = jobInfos.size(); + } + jobInfos = jobInfos.subList(beginIndex,endIndex); + } + + BaseProcResult result = new BaseProcResult(); + result.setNames(TITLE_NAMES); + for (List<Comparable> jobInfo : jobInfos) { + List<String> oneResult = new ArrayList<String>(jobInfos.size()); + for (Comparable column : jobInfo) { + oneResult.add(column.toString()); + } + result.addRow(oneResult); + } + return result; + } + + boolean filterResult(String columnName, Comparable element, HashMap<String, Expr> filter) throws AnalysisException { + if (filter == null) { + return true; + } + Expr subExpr = filter.get(columnName.toLowerCase()); + if (subExpr == null) { + return true; + } + BinaryPredicate binaryPredicate = (BinaryPredicate) subExpr; + if (subExpr.getChild(1) instanceof StringLiteral && binaryPredicate.getOp() == BinaryPredicate.Operator.EQ) { + return ((StringLiteral) subExpr.getChild(1)).getValue().equals(element); + } + if (subExpr.getChild(1) instanceof DateLiteral) { + Long leftVal = (new DateLiteral((String) element, Type.DATETIME)).getLongValue(); + Long rightVal = ((DateLiteral) subExpr.getChild(1)).getLongValue(); + switch (binaryPredicate.getOp()) { + case EQ: + case EQ_FOR_NULL: + return leftVal.equals(rightVal); + case GE: + return leftVal >= rightVal; + case GT: + return leftVal > rightVal; + case LE: + return leftVal <= rightVal; + case LT: + return leftVal < rightVal; + case NE: + return !leftVal.equals(rightVal); + default: + Preconditions.checkState(false, "No defined binary operator."); + } + } + return true; + } + @Override public boolean register(String name, ProcNodeInterface node) { return false; diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java index b41135a..1e38769 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -105,6 +105,7 @@ import org.apache.doris.common.proc.FrontendsProcNode; import org.apache.doris.common.proc.LoadProcDir; import org.apache.doris.common.proc.PartitionsProcDir; import org.apache.doris.common.proc.ProcNodeInterface; +import org.apache.doris.common.proc.RollupProcDir; import org.apache.doris.common.proc.SchemaChangeProcDir; import org.apache.doris.common.proc.TabletsProcDir; import org.apache.doris.common.util.ListComparator; @@ -1084,6 +1085,9 @@ public class ShowExecutor { if (procNodeI instanceof SchemaChangeProcDir) { rows = ((SchemaChangeProcDir) procNodeI).fetchResultByFilter(showStmt.getFilterMap(), showStmt.getOrderPairs(), showStmt.getLimitElement()).getRows(); + } else if (procNodeI instanceof RollupProcDir) { + rows = ((RollupProcDir) procNodeI).fetchResultByFilter(showStmt.getFilterMap(), + showStmt.getOrderPairs(), showStmt.getLimitElement()).getRows(); } else { rows = procNodeI.fetchResult().getRows(); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org