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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]