This is an automated email from the ASF dual-hosted git repository.

lmccay pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 46ccd34  KNOX-2310 - Add aggregate method to KnoxShellTable (#302)
46ccd34 is described below

commit 46ccd34da21c045c0727d217c281ae0c427dbe1f
Author: lmccay <lmc...@apache.org>
AuthorDate: Thu Mar 26 22:30:45 2020 -0400

    KNOX-2310 - Add aggregate method to KnoxShellTable (#302)
    
    * KNOX-2310 - Add aggregate method to KnoxShellTable
    
    Change-Id: I60eeeaf0f8d9b2419fd95944b4f394a021a7f308
    
    * KNOX-2310 - Add aggregate method to KnoxShellTable
    
    Change-Id: If44ab0a517f8189d130f34483859187cecda3df9
---
 .../knox/gateway/shell/table/KnoxShellTable.java   |  4 ++
 .../shell/table/KnoxShellTableAggregator.java      | 74 ++++++++++++++++++++++
 .../gateway/shell/table/KnoxShellTableTest.java    | 30 +++++++++
 3 files changed, 108 insertions(+)

diff --git 
a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTable.java
 
b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTable.java
index e630118..06acd16 100644
--- 
a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTable.java
+++ 
b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTable.java
@@ -357,6 +357,10 @@ public class KnoxShellTable {
     return new KnoxShellTableFilter(this);
   }
 
+  public KnoxShellTableAggregator aggregate() {
+    return new KnoxShellTableAggregator(this);
+  }
+
   public KnoxShellTable select(String cols) {
     KnoxShellTable table = new KnoxShellTable();
     List<List<Comparable<? extends Object>>> columns = new ArrayList<>();
diff --git 
a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTableAggregator.java
 
b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTableAggregator.java
new file mode 100644
index 0000000..9173628
--- /dev/null
+++ 
b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/KnoxShellTableAggregator.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.shell.table;
+
+public class KnoxShellTableAggregator {
+  private KnoxShellTable tableToAggregate;
+  private String[] cols;
+
+  public KnoxShellTableAggregator(KnoxShellTable table) {
+    tableToAggregate = table;
+  }
+
+  public KnoxShellTableAggregator columns(String cols) {
+    this.cols = cols.split("\\s*,\\s*");
+    return this;
+  }
+
+  public KnoxShellTable functions(String funcs) {
+    String[] functions = funcs.split("\\s*,\\s*");
+
+    KnoxShellTable table = new KnoxShellTable();
+    table.header("");
+    for (String col : cols) {
+      table.header(col);
+    }
+
+    for (String func : functions) {
+      table.row();
+      table.value(func);
+      for (String col : cols) {
+        table.value(executeFunction(col, func));
+      }
+    }
+    return table;
+  }
+
+  private Double executeFunction(String col, String func) {
+    Double value = 0.0d;
+    if ("min".equalsIgnoreCase(func)) {
+      value = tableToAggregate.min(col);
+    }
+    else if ("max".equalsIgnoreCase(func)) {
+      value = tableToAggregate.max(col);
+    }
+    else if ("mean".equalsIgnoreCase(func)) {
+      value = tableToAggregate.mean(col);
+    }
+    else if ("mode".equalsIgnoreCase(func)) {
+      value = tableToAggregate.mode(col);
+    }
+    else if ("median".equalsIgnoreCase(func)) {
+      value = tableToAggregate.median(col);
+    }
+    else if ("sum".equalsIgnoreCase(func)) {
+      value = tableToAggregate.sum(col);
+    }
+    return value;
+  }
+}
diff --git 
a/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
 
b/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
index 676bef6..6831e34 100644
--- 
a/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
+++ 
b/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
@@ -674,6 +674,36 @@ public class KnoxShellTableTest {
       assertEquals(20.9998, TABLE.min(2), 0.1);
   }
 
+  /*
+knox:000> test.aggregate() columns "A,B,C" functions "min, max, mean, median, 
mode,sum"
+===> +----------+----------------------+----------+----------+
+|          |          A           |    B     |    C     |
++----------+----------------------+----------+----------+
+|   min    |        100.0         |  200.0   |  300.0   |
+|   max    |        200.0         |  400.0   |  500.0   |
+|   mean   |  166.66666666666666  |  300.0   |  400.0   |
+|  median  |        200.0         |  300.0   |  400.0   |
+|   mode   |        200.0         |  200.0   |  300.0   |
+|   sum    |        500.0         |  900.0   |  1200.0  |
++----------+----------------------+----------+----------+
+   */
+  @Test
+  public void testAggregate() throws Exception {
+
+      KnoxShellTable TABLE = new KnoxShellTable();
+      TABLE.header("A").header("B").header("C");
+      TABLE.row().value(100).value("200").value(300);
+      TABLE.row().value(200).value("300").value(400);
+      TABLE.row().value(200).value("400").value(500);
+      KnoxShellTable report = 
TABLE.aggregate().columns("A,B,C").functions("min,max,mean,median,mode,sum");
+      assertEquals(100.0, report.cell(1,0).value);
+      assertEquals(200.0, report.cell(1,1).value);
+      assertEquals(166.66666666666666, report.cell(1,2).value);
+      assertEquals(200.0, report.cell(1,3).value);
+      assertEquals(200.0, report.cell(1,4).value);
+      assertEquals(500.0, report.cell(1,5).value);
+  }
+
   @Test
   public void shouldReturnDifferentCallHistoryForDifferentTables() throws 
Exception {
     final KnoxShellTable table1 = new KnoxShellTable();

Reply via email to