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();