[ 
https://issues.apache.org/jira/browse/HIVE-26580?focusedWorklogId=820927&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-820927
 ]

ASF GitHub Bot logged work on HIVE-26580:
-----------------------------------------

                Author: ASF GitHub Bot
            Created on: 27/Oct/22 11:02
            Start Date: 27/Oct/22 11:02
    Worklog Time Spent: 10m 
      Work Description: deniskuzZ commented on code in PR #3708:
URL: https://github.com/apache/hive/pull/3708#discussion_r1006701744


##########
ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java:
##########
@@ -2388,6 +2396,65 @@ public void testShowCompactionInputValidation() throws 
Exception {
           "STATUS 'ready for clean'");//validates compaction status
   }
 
+  @Test
+  public void testShowCompactionFilterSortingAndLimit()throws Exception {
+    runStatementOnDriver("drop database if exists mydb1 cascade");
+    runStatementOnDriver("create database mydb1");
+    runStatementOnDriver("create table mydb1.tbl0 " + "(a int, b int) 
partitioned by (p string) clustered by (a) into " +
+            BUCKET_COUNT + " buckets stored as orc TBLPROPERTIES 
('transactional'='true')");
+    runStatementOnDriver("insert into mydb1.tbl0" + " PARTITION(p) " +
+            " 
values(1,2,'p1'),(3,4,'p1'),(1,2,'p2'),(3,4,'p2'),(1,2,'p3'),(3,4,'p3')");
+    runStatementOnDriver("alter table mydb1.tbl0" + " PARTITION(p='p1') 
compact 'MAJOR'");
+    TestTxnCommands2.runWorker(hiveConf);
+    runStatementOnDriver("alter table mydb1.tbl0" + " PARTITION(p='p2') 
compact 'MAJOR'");
+    TestTxnCommands2.runWorker(hiveConf);
+
+
+    runStatementOnDriver("drop database if exists mydb cascade");
+    runStatementOnDriver("create database mydb");
+    runStatementOnDriver("create table mydb.tbl " + "(a int, b int) 
partitioned by (ds string) clustered by (a) into " +
+            BUCKET_COUNT + " buckets stored as orc TBLPROPERTIES 
('transactional'='true')");
+    runStatementOnDriver("insert into mydb.tbl" + " PARTITION(ds) " +
+            " 
values(1,2,'mon'),(3,4,'tue'),(1,2,'mon'),(3,4,'tue'),(1,2,'wed'),(3,4,'wed')");
+    runStatementOnDriver("alter table mydb.tbl" + " PARTITION(ds='mon') 
compact 'MAJOR'");
+    TestTxnCommands2.runWorker(hiveConf);
+    runStatementOnDriver("alter table mydb.tbl" + " PARTITION(ds='tue') 
compact 'MAJOR'");
+    TestTxnCommands2.runWorker(hiveConf);
+
+    runStatementOnDriver("create table mydb.tbl2 " + "(a int, b int) 
partitioned by (dm string) clustered by (a) into " +
+            BUCKET_COUNT + " buckets stored as orc TBLPROPERTIES 
('transactional'='true')");
+    runStatementOnDriver("insert into mydb.tbl2" + " PARTITION(dm) " +
+            " 
values(1,2,'xxx'),(3,4,'xxx'),(1,2,'yyy'),(3,4,'yyy'),(1,2,'zzz'),(3,4,'zzz')");
+    runStatementOnDriver("alter table mydb.tbl2" + " PARTITION(dm='yyy') 
compact 'MAJOR'");
+    TestTxnCommands2.runWorker(hiveConf);
+    runStatementOnDriver("alter table mydb.tbl2" + " PARTITION(dm='zzz') 
compact 'MAJOR'");
+    TestTxnCommands2.runWorker(hiveConf);
+
+    ShowCompactResponse rsp = txnHandler.showCompact(new ShowCompactRequest());
+
+    //includes Header row
+    List<String> r = runStatementOnDriver("SHOW COMPACTIONS");
+    Assert.assertEquals(rsp.getCompacts().size() + 1, r.size());
+    r = runStatementOnDriver("SHOW COMPACTIONS LIMIT 3");
+    Assert.assertEquals(4, r.size());
+    r = runStatementOnDriver("SHOW COMPACTIONS SCHEMA mydb TYPE 'MAJOR' LIMIT 
2");
+    Assert.assertEquals(3, r.size());
+
+    r = runStatementOnDriver("SHOW COMPACTIONS SCHEMA mydb TYPE 'MAJOR' ORDER 
BY CC_TABLE DESC, CC_PARTITION ASC");

Review Comment:
   there is no `CC_` prefix in the show compactions output. That would be 
confusing



##########
ql/src/java/org/apache/hadoop/hive/ql/ddl/process/show/compactions/ShowCompactionsAnalyzer.java:
##########
@@ -50,6 +50,8 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
     String compactionType = null;
     String compactionStatus = null;
     long compactionId = 0;
+    String order = null;
+    short limit = 0;

Review Comment:
   maybe -1, meaning no limit?



##########
ql/src/java/org/apache/hadoop/hive/ql/ddl/process/show/compactions/ShowCompactionsAnalyzer.java:
##########
@@ -80,15 +82,38 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
         case HiveParser.TOK_COMPACT_ID:
           compactionId = Long.parseLong(child.getChild(0).getText());
           break;
+        case HiveParser.TOK_LIMIT:
+          limit = Short.valueOf((child.getChild(0)).getText());
+          break;
+        case HiveParser.TOK_ORDERBY:
+          order = processSortOrderSpec(child);
+          break;
         default:
           dbName = stripQuotes(child.getText());
       }
     }
     ShowCompactionsDesc desc = new ShowCompactionsDesc(ctx.getResFile(), 
compactionId, dbName, tblName, poolName, compactionType,
-      compactionStatus, partitionSpec);
+      compactionStatus, partitionSpec, limit, order);
     Task<DDLWork> task = TaskFactory.get(new DDLWork(getInputs(), 
getOutputs(), desc));
     rootTasks.add(task);
     task.setFetchSource(true);
     setFetchTask(createFetchTask(ShowCompactionsDesc.SCHEMA));
   }
+  private String processSortOrderSpec(ASTNode sortNode)
+  {
+    StringBuilder orderByExp = new StringBuilder();
+    ArrayList<PTFInvocationSpec.OrderExpression> orderExp = 
processOrderSpec(sortNode).getExpressions();
+    PTFInvocationSpec.OrderExpression exp ;
+    for (int i = 0; i < orderExp.size() - 1; i++) {

Review Comment:
   to avoid duplication, you could first collect all of the expressions into a 
list and then use StringUtils.join(" ,", list)



##########
ql/src/java/org/apache/hadoop/hive/ql/ddl/process/show/compactions/ShowCompactionsDesc.java:
##########
@@ -93,6 +97,16 @@ public String getCompactionStatus() {
     public Map<String, String> getPartSpec() {
         return partSpec;
     }
+    @Explain(displayName = "limit", explainLevels = {Level.USER, 
Level.DEFAULT, Level.EXTENDED})
+    public short getLimit() {
+        return limit;
+    }
+
+    @Explain(displayName = "order", explainLevels = {Level.USER, 
Level.DEFAULT, Level.EXTENDED})
+    public String getOrder() {

Review Comment:
   getOrderBy()



##########
ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java:
##########
@@ -1984,4 +1984,28 @@ public ParseContext getParseContext() {
     return pCtx;
   }
 
+  public PTFInvocationSpec.OrderSpec processOrderSpec(ASTNode sortNode) {
+    PTFInvocationSpec.OrderSpec oSpec = new PTFInvocationSpec.OrderSpec();
+    int exprCnt = sortNode.getChildCount();
+    for(int i=0; i < exprCnt; i++) {
+      PTFInvocationSpec.OrderExpression exprSpec = new 
PTFInvocationSpec.OrderExpression();
+      ASTNode orderSpec = (ASTNode) sortNode.getChild(i);
+      ASTNode nullOrderSpec = (ASTNode) orderSpec.getChild(0);
+      exprSpec.setExpression((ASTNode) nullOrderSpec.getChild(0));
+      if ( orderSpec.getType() == HiveParser.TOK_TABSORTCOLNAMEASC ) {
+        
exprSpec.setOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order.ASC);
+      }
+      else {
+        
exprSpec.setOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order.DESC);
+      }
+      if ( nullOrderSpec.getType() == HiveParser.TOK_NULLS_FIRST ) {

Review Comment:
   nit: remove extra space



##########
ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java:
##########
@@ -2155,6 +2155,11 @@ public void testShowCompactions() throws Exception {
     ShowCompactResponse rsp = txnHandler.showCompact(new ShowCompactRequest());
     List<String> r = runStatementOnDriver("SHOW COMPACTIONS");
     Assert.assertEquals(rsp.getCompacts().size()+1, r.size());//includes 
Header row
+    r = runStatementOnDriver("SHOW COMPACTIONS LIMIT 3");

Review Comment:
   why do we need this if we have `testShowCompactionFilterSortingAndLimit`?



##########
standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift:
##########
@@ -1351,7 +1351,9 @@ struct ShowCompactRequest {
     4: required string tablename,
     5: optional string partitionname,
     6: required CompactionType type,
-    7: required string state
+    7: required string state,
+    8: optional i64 limit,
+    9: optional string order

Review Comment:
   wouldn't it be better to have map here, Map<String (column), String (order)> 
ordeerBy?



##########
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java:
##########
@@ -4013,6 +4016,12 @@ private String 
getShowCompactFilterClause(ShowCompactRequest request) {
       " WHERE " + StringUtils.join(" AND ", params) : EMPTY;
   }
 
+  private String getShowCompactSortingOrderClause(ShowCompactRequest request){
+   String sortingOrder = request.getOrder();
+   return  isNotBlank(sortingOrder) ? 
TxnQueries.SHOW_COMPACTION_ORDERBY_CLAUSE + " , " + sortingOrder :

Review Comment:
   if custom order is provided we should use that and don't append the default 
one



##########
ql/src/java/org/apache/hadoop/hive/ql/ddl/process/show/compactions/ShowCompactionsAnalyzer.java:
##########
@@ -80,15 +82,38 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
         case HiveParser.TOK_COMPACT_ID:
           compactionId = Long.parseLong(child.getChild(0).getText());
           break;
+        case HiveParser.TOK_LIMIT:
+          limit = Short.valueOf((child.getChild(0)).getText());
+          break;
+        case HiveParser.TOK_ORDERBY:
+          order = processSortOrderSpec(child);
+          break;
         default:
           dbName = stripQuotes(child.getText());
       }
     }
     ShowCompactionsDesc desc = new ShowCompactionsDesc(ctx.getResFile(), 
compactionId, dbName, tblName, poolName, compactionType,
-      compactionStatus, partitionSpec);
+      compactionStatus, partitionSpec, limit, order);
     Task<DDLWork> task = TaskFactory.get(new DDLWork(getInputs(), 
getOutputs(), desc));
     rootTasks.add(task);
     task.setFetchSource(true);
     setFetchTask(createFetchTask(ShowCompactionsDesc.SCHEMA));
   }
+  private String processSortOrderSpec(ASTNode sortNode)
+  {

Review Comment:
   formatting



##########
ql/src/java/org/apache/hadoop/hive/ql/ddl/process/show/compactions/ShowCompactionsDesc.java:
##########
@@ -45,10 +45,12 @@ public class ShowCompactionsDesc implements DDLDesc, 
Serializable {
     private final String compactionType;
     private final String compactionStatus;
     private final Map<String, String> partSpec;
+    private final short limit;
+    private final String order;
 
 
     public ShowCompactionsDesc(Path resFile, long compactionId, String dbName, 
String tbName, String poolName, String compactionType,
-                               String compactionStatus, Map<String, String> 
partSpec) {
+                               String compactionStatus, Map<String, String> 
partSpec, short limit, String order) {

Review Comment:
   orderBy



##########
ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java:
##########
@@ -1984,4 +1984,28 @@ public ParseContext getParseContext() {
     return pCtx;
   }
 
+  public PTFInvocationSpec.OrderSpec processOrderSpec(ASTNode sortNode) {
+    PTFInvocationSpec.OrderSpec oSpec = new PTFInvocationSpec.OrderSpec();
+    int exprCnt = sortNode.getChildCount();
+    for(int i=0; i < exprCnt; i++) {
+      PTFInvocationSpec.OrderExpression exprSpec = new 
PTFInvocationSpec.OrderExpression();
+      ASTNode orderSpec = (ASTNode) sortNode.getChild(i);
+      ASTNode nullOrderSpec = (ASTNode) orderSpec.getChild(0);
+      exprSpec.setExpression((ASTNode) nullOrderSpec.getChild(0));
+      if ( orderSpec.getType() == HiveParser.TOK_TABSORTCOLNAMEASC ) {

Review Comment:
   nit: remove extra space



##########
ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java:
##########
@@ -1984,4 +1984,28 @@ public ParseContext getParseContext() {
     return pCtx;
   }
 
+  public PTFInvocationSpec.OrderSpec processOrderSpec(ASTNode sortNode) {
+    PTFInvocationSpec.OrderSpec oSpec = new PTFInvocationSpec.OrderSpec();
+    int exprCnt = sortNode.getChildCount();
+    for(int i=0; i < exprCnt; i++) {

Review Comment:
   nit: space



##########
ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java:
##########
@@ -1984,4 +1984,28 @@ public ParseContext getParseContext() {
     return pCtx;
   }
 
+  public PTFInvocationSpec.OrderSpec processOrderSpec(ASTNode sortNode) {
+    PTFInvocationSpec.OrderSpec oSpec = new PTFInvocationSpec.OrderSpec();

Review Comment:
   use static import



##########
ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java:
##########
@@ -1984,4 +1984,28 @@ public ParseContext getParseContext() {
     return pCtx;
   }
 
+  public PTFInvocationSpec.OrderSpec processOrderSpec(ASTNode sortNode) {
+    PTFInvocationSpec.OrderSpec oSpec = new PTFInvocationSpec.OrderSpec();
+    int exprCnt = sortNode.getChildCount();
+    for(int i=0; i < exprCnt; i++) {
+      PTFInvocationSpec.OrderExpression exprSpec = new 
PTFInvocationSpec.OrderExpression();
+      ASTNode orderSpec = (ASTNode) sortNode.getChild(i);
+      ASTNode nullOrderSpec = (ASTNode) orderSpec.getChild(0);
+      exprSpec.setExpression((ASTNode) nullOrderSpec.getChild(0));
+      if ( orderSpec.getType() == HiveParser.TOK_TABSORTCOLNAMEASC ) {
+        
exprSpec.setOrder(org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order.ASC);

Review Comment:
   can we use static import of 
`org.apache.hadoop.hive.ql.parse.PTFInvocationSpec`



##########
ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java:
##########
@@ -2155,6 +2155,11 @@ public void testShowCompactions() throws Exception {
     ShowCompactResponse rsp = txnHandler.showCompact(new ShowCompactRequest());
     List<String> r = runStatementOnDriver("SHOW COMPACTIONS");
     Assert.assertEquals(rsp.getCompacts().size()+1, r.size());//includes 
Header row
+    r = runStatementOnDriver("SHOW COMPACTIONS LIMIT 3");
+    Assert.assertEquals(4, r.size());
+
+    r = runStatementOnDriver("SHOW COMPACTIONS SCHEMA mydb1 TYPE 'MAJOR' ORDER 
BY CC_PARTITION ASC , CC_TABLE DESC");

Review Comment:
   why do we need this if we have `testShowCompactionFilterSortingAndLimit`?



##########
ql/src/java/org/apache/hadoop/hive/ql/ddl/process/show/compactions/ShowCompactionsAnalyzer.java:
##########
@@ -80,15 +82,38 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
         case HiveParser.TOK_COMPACT_ID:
           compactionId = Long.parseLong(child.getChild(0).getText());
           break;
+        case HiveParser.TOK_LIMIT:
+          limit = Short.valueOf((child.getChild(0)).getText());
+          break;
+        case HiveParser.TOK_ORDERBY:
+          order = processSortOrderSpec(child);
+          break;
         default:
           dbName = stripQuotes(child.getText());
       }
     }
     ShowCompactionsDesc desc = new ShowCompactionsDesc(ctx.getResFile(), 
compactionId, dbName, tblName, poolName, compactionType,
-      compactionStatus, partitionSpec);
+      compactionStatus, partitionSpec, limit, order);
     Task<DDLWork> task = TaskFactory.get(new DDLWork(getInputs(), 
getOutputs(), desc));
     rootTasks.add(task);
     task.setFetchSource(true);
     setFetchTask(createFetchTask(ShowCompactionsDesc.SCHEMA));
   }
+  private String processSortOrderSpec(ASTNode sortNode)
+  {
+    StringBuilder orderByExp = new StringBuilder();
+    ArrayList<PTFInvocationSpec.OrderExpression> orderExp = 
processOrderSpec(sortNode).getExpressions();

Review Comment:
   use List interface



##########
ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java:
##########
@@ -2187,6 +2192,9 @@ public void testShowCompactions() throws Exception {
       Assert.assertTrue(p.matcher(r.get(i)).matches());
     }
 
+    r = runStatementOnDriver("SHOW COMPACTIONS SCHEMA mydb1 TYPE 'MAJOR' LIMIT 
2");

Review Comment:
   why do we need this if we have `testShowCompactionFilterSortingAndLimit`?



##########
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java:
##########
@@ -3881,15 +3881,18 @@ public boolean submitForCleanup(CompactionRequest rqst, 
long highestWriteId, lon
   public ShowCompactResponse showCompact(ShowCompactRequest rqst) throws 
MetaException {
     try {
       ShowCompactResponse response = new ShowCompactResponse(new 
ArrayList<>());
-      String query = TxnQueries.SHOW_COMPACTION_QUERY + 
getShowCompactFilterClause(rqst) + 
-        TxnQueries.SHOW_COMPACTION_ORDERBY_CLAUSE;
+      String query = TxnQueries.SHOW_COMPACTION_QUERY +
+        getShowCompactFilterClause(rqst) +
+        getShowCompactSortingOrderClause(rqst) ;
       List<String> params = getShowCompactParamList(rqst);
-

Review Comment:
   keep the new line here



##########
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java:
##########
@@ -3881,15 +3881,18 @@ public boolean submitForCleanup(CompactionRequest rqst, 
long highestWriteId, lon
   public ShowCompactResponse showCompact(ShowCompactRequest rqst) throws 
MetaException {
     try {
       ShowCompactResponse response = new ShowCompactResponse(new 
ArrayList<>());
-      String query = TxnQueries.SHOW_COMPACTION_QUERY + 
getShowCompactFilterClause(rqst) + 
-        TxnQueries.SHOW_COMPACTION_ORDERBY_CLAUSE;
+      String query = TxnQueries.SHOW_COMPACTION_QUERY +
+        getShowCompactFilterClause(rqst) +
+        getShowCompactSortingOrderClause(rqst) ;
       List<String> params = getShowCompactParamList(rqst);
-
       try (Connection dbConn = 
getDbConn(Connection.TRANSACTION_READ_COMMITTED);
         PreparedStatement stmt = 
sqlGenerator.prepareStmtWithParameters(dbConn, query, params)) {
         if (rqst.isSetId()) {
           stmt.setLong(1, rqst.getId());
         }
+        int rowLimit = (int) rqst.getLimit();
+        if (rowLimit > 0)

Review Comment:
   wrap with braces





Issue Time Tracking
-------------------

    Worklog Id:     (was: 820927)
    Time Spent: 0.5h  (was: 20m)

> SHOW COMPACTIONS should support ordering and limiting functionality in 
> filtering options
> ----------------------------------------------------------------------------------------
>
>                 Key: HIVE-26580
>                 URL: https://issues.apache.org/jira/browse/HIVE-26580
>             Project: Hive
>          Issue Type: Improvement
>    Affects Versions: 3.0.0
>            Reporter: KIRTI RUGE
>            Assignee: KIRTI RUGE
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> SHOW COMPACTION should provide ordering by defied table . It should also 
> support limitation of fetched records



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to