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

Reply via email to