You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by sp...@apache.org on 2016/07/18 16:13:32 UTC

hive git commit: HIVE-14135: beeline output not formatted correctly for large column widths (Vihang Karajgaonkar, reviewed by Sergio Pena)

Repository: hive
Updated Branches:
  refs/heads/master b53794b83 -> 3e3f01c3a


HIVE-14135: beeline output not formatted correctly for large column widths (Vihang Karajgaonkar, reviewed by Sergio Pena)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/3e3f01c3
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/3e3f01c3
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/3e3f01c3

Branch: refs/heads/master
Commit: 3e3f01c3a3f84c7777b7e797bc0ad24894df5f67
Parents: b53794b
Author: Vihang Karajgaonkar <vi...@cloudera.com>
Authored: Mon Jul 18 11:12:58 2016 -0500
Committer: Sergio Pena <se...@cloudera.com>
Committed: Mon Jul 18 11:12:58 2016 -0500

----------------------------------------------------------------------
 beeline/pom.xml                                 |   5 +
 .../org/apache/hive/beeline/BeeLineOpts.java    |   3 +-
 .../org/apache/hive/beeline/BufferedRows.java   |   5 +-
 .../apache/hive/beeline/TestBufferedRows.java   | 121 +++++++++++++++++++
 4 files changed, 132 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/3e3f01c3/beeline/pom.xml
----------------------------------------------------------------------
diff --git a/beeline/pom.xml b/beeline/pom.xml
index a720d08..5503add 100644
--- a/beeline/pom.xml
+++ b/beeline/pom.xml
@@ -119,6 +119,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>postgresql</groupId>
       <artifactId>postgresql</artifactId>
       <version>9.1-901.jdbc4</version>

http://git-wip-us.apache.org/repos/asf/hive/blob/3e3f01c3/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java
----------------------------------------------------------------------
diff --git a/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java b/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java
index 5aaa385..e2bbbea 100644
--- a/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java
+++ b/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java
@@ -58,6 +58,7 @@ class BeeLineOpts implements Completer {
       PROPERTY_PREFIX + "system.exit";
   public static final String DEFAULT_NULL_STRING = "NULL";
   public static final char DEFAULT_DELIMITER_FOR_DSV = '|';
+  public static final int DEFAULT_MAX_COLUMN_WIDTH = 50;
 
   public static String URL_ENV_PREFIX = "BEELINE_URL_";
 
@@ -80,7 +81,7 @@ class BeeLineOpts implements Completer {
   private final Terminal terminal = TerminalFactory.get();
   private int maxWidth = DEFAULT_MAX_WIDTH;
   private int maxHeight = DEFAULT_MAX_HEIGHT;
-  private int maxColumnWidth = 15;
+  private int maxColumnWidth = DEFAULT_MAX_COLUMN_WIDTH;
   int timeout = -1;
   private String isolation = DEFAULT_ISOLATION_LEVEL;
   private String outputFormat = "table";

http://git-wip-us.apache.org/repos/asf/hive/blob/3e3f01c3/beeline/src/java/org/apache/hive/beeline/BufferedRows.java
----------------------------------------------------------------------
diff --git a/beeline/src/java/org/apache/hive/beeline/BufferedRows.java b/beeline/src/java/org/apache/hive/beeline/BufferedRows.java
index 962c531..5604742 100644
--- a/beeline/src/java/org/apache/hive/beeline/BufferedRows.java
+++ b/beeline/src/java/org/apache/hive/beeline/BufferedRows.java
@@ -33,6 +33,7 @@ import java.util.LinkedList;
 class BufferedRows extends Rows {
   private final LinkedList<Row> list;
   private final Iterator<Row> iterator;
+  private int maxColumnWidth;
 
   BufferedRows(BeeLine beeLine, ResultSet rs) throws SQLException {
     super(beeLine, rs);
@@ -43,6 +44,7 @@ class BufferedRows extends Rows {
       list.add(new Row(count, rs));
     }
     iterator = list.iterator();
+    maxColumnWidth = beeLine.getOpts().getMaxColumnWidth();
   }
 
   public boolean hasNext() {
@@ -66,7 +68,8 @@ class BufferedRows extends Rows {
         max = new int[row.values.length];
       }
       for (int j = 0; j < max.length; j++) {
-        max[j] = Math.max(max[j], row.sizes[j] + 1);
+        // if the max column width is too large, reset it to max allowed Column width
+        max[j] = Math.min(Math.max(max[j], row.sizes[j] + 1), maxColumnWidth);
       }
     }
     for (Row row : list) {

http://git-wip-us.apache.org/repos/asf/hive/blob/3e3f01c3/beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java
----------------------------------------------------------------------
diff --git a/beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java b/beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java
new file mode 100644
index 0000000..f3f3d3a
--- /dev/null
+++ b/beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java
@@ -0,0 +1,121 @@
+/**
+ * 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.hive.beeline;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Matchers;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class TestBufferedRows {
+  private String[][] mockRowData = {
+      { "key1", "aaa" },
+      { "key2", "bbbbb" },
+      { "key3",
+          "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+              + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+              + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+              + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+              + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+              + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+              + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" },
+      { "key4", "ddddddddddddddd" }
+  };
+  private BeeLineOpts mockBeeLineOpts;
+  private BeeLine mockBeeline;
+  private ResultSet mockResultSet;
+  private MockRow mockRow;
+
+  @Test
+  public void testNormalizeWidths() throws SQLException {
+    setupMockData();
+
+    BufferedRows bfRows = new BufferedRows(mockBeeline, mockResultSet);
+    bfRows.normalizeWidths();
+    while (bfRows.hasNext()) {
+      Rows.Row row = (Rows.Row) bfRows.next();
+      for (int colSize : row.sizes) {
+        Assert.assertTrue(colSize <= mockBeeLineOpts.getMaxColumnWidth());
+      }
+    }
+  }
+
+  private void setupMockData() throws SQLException {
+    // Mock BeeLine
+    mockBeeline = mock(BeeLine.class);
+    // Mock BeeLineOpts
+    mockBeeLineOpts = mock(BeeLineOpts.class);
+    when(mockBeeLineOpts.getMaxColumnWidth()).thenReturn(BeeLineOpts.DEFAULT_MAX_COLUMN_WIDTH);
+    when(mockBeeLineOpts.getNumberFormat()).thenReturn("default");
+    when(mockBeeLineOpts.getNullString()).thenReturn("NULL");
+    when(mockBeeline.getOpts()).thenReturn(mockBeeLineOpts);
+
+    // MockResultSet
+    mockResultSet = mock(ResultSet.class);
+
+    ResultSetMetaData mockResultSetMetaData = mock(ResultSetMetaData.class);
+    when(mockResultSetMetaData.getColumnCount()).thenReturn(2);
+    when(mockResultSetMetaData.getColumnLabel(1)).thenReturn("Key");
+    when(mockResultSetMetaData.getColumnLabel(2)).thenReturn("Value");
+    when(mockResultSet.getMetaData()).thenReturn(mockResultSetMetaData);
+
+    mockRow = new MockRow();
+    // returns true as long as there is more data in mockResultData array
+    when(mockResultSet.next()).thenAnswer(new Answer<Boolean>() {
+      private int mockRowDataIndex = 0;
+
+      public Boolean answer(InvocationOnMock invocation) {
+        if (mockRowDataIndex < mockRowData.length) {
+          mockRow.setCurrentRowData(mockRowData[mockRowDataIndex]);
+          mockRowDataIndex++;
+          return true;
+        } else {
+          return false;
+        }
+      }
+    });
+
+    when(mockResultSet.getString(Matchers.anyInt())).thenAnswer(new Answer<String>() {
+      public String answer(InvocationOnMock invocation) {
+        Object[] args = invocation.getArguments();
+        int index = ((Integer) args[0]).intValue();
+        return mockRow.getColumn(index);
+      }
+    });
+  }
+
+  static class MockRow {
+    String[] rowData;
+
+    public void setCurrentRowData(String[] rowData) {
+      this.rowData = rowData;
+    }
+
+    public String getColumn(int idx) {
+      return rowData[idx - 1];
+    }
+  }
+}
\ No newline at end of file