11package org .neo4j .shell .prettyprint ;
22
3+ import java .util .ArrayList ;
4+ import java .util .Collections ;
5+ import java .util .EnumSet ;
6+ import java .util .Iterator ;
7+ import java .util .List ;
8+ import java .util .Map ;
9+ import java .util .Set ;
10+ import javax .annotation .Nonnull ;
11+ import javax .annotation .Nullable ;
12+
313import org .neo4j .driver .internal .InternalRecord ;
14+ import org .neo4j .driver .internal .value .NumberValueAdapter ;
415import org .neo4j .driver .Record ;
516import org .neo4j .driver .Value ;
617import org .neo4j .driver .summary .ResultSummary ;
718import org .neo4j .shell .state .BoltResult ;
819
9- import javax .annotation .Nonnull ;
10- import javax .annotation .Nullable ;
11- import java .util .*;
12-
1320import static java .util .Arrays .asList ;
1421import static java .util .concurrent .TimeUnit .MILLISECONDS ;
1522
@@ -55,7 +62,7 @@ private int formatResultAndCountRows(String[] columns,
5562 }
5663
5764 StringBuilder builder = new StringBuilder (totalWidth );
58- String headerLine = formatRow (builder , columnSizes , columns );
65+ String headerLine = formatRow (builder , columnSizes , columns , new boolean [ columnSizes . length ] );
5966 int lineWidth = totalWidth - 2 ;
6067 String dashes = "+" + OutputFormatter .repeat ('-' , lineWidth ) + "+" ;
6168
@@ -83,7 +90,7 @@ private int[] calculateColumnSizes(@Nonnull String[] columns, @Nonnull List<Reco
8390 }
8491 for (Record record : data ) {
8592 for (int i = 0 ; i < columns .length ; i ++) {
86- int len = formatValue (record .get (i )). length ( );
93+ int len = columnLengthForValue (record .get (i ));
8794 if (columnSizes [i ] < len ) {
8895 columnSizes [i ] = len ;
8996 }
@@ -92,9 +99,20 @@ private int[] calculateColumnSizes(@Nonnull String[] columns, @Nonnull List<Reco
9299 return columnSizes ;
93100 }
94101
102+ /**
103+ * The length of a column, where Numbers are always getting enough space to fit the highest number possible.
104+ */
105+ private int columnLengthForValue (Value value ) {
106+ if (value instanceof NumberValueAdapter ) {
107+ return 19 ; // The number of digits of Long.Max
108+ } else {
109+ return formatValue (value ).length ();
110+ }
111+ }
112+
95113 private String formatRecord (StringBuilder sb , int [] columnSizes , Record record ) {
96114 sb .setLength (0 );
97- return formatRow (sb , columnSizes , formatValues (record ));
115+ return formatRow (sb , columnSizes , formatValues (record ), new boolean [ columnSizes . length ] );
98116 }
99117
100118 private String [] formatValues (Record record ) {
@@ -105,8 +123,21 @@ private String[] formatValues(Record record) {
105123 return row ;
106124 }
107125
108- private String formatRow (StringBuilder sb , int [] columnSizes , String [] row ) {
109- sb .append ("|" );
126+ /**
127+ * Format one row of data.
128+ *
129+ * @param sb the StringBuilder to use
130+ * @param columnSizes the size of all columns
131+ * @param row the data
132+ * @param continuation for each column whether it holds the remainder of data that did not fit in the column
133+ * @return the String result
134+ */
135+ private String formatRow (StringBuilder sb , int [] columnSizes , String [] row , boolean [] continuation ) {
136+ if (!continuation [0 ]) {
137+ sb .append ("|" );
138+ } else {
139+ sb .append ("\\ " );
140+ }
110141 boolean remainder = false ;
111142 for (int i = 0 ; i < row .length ; i ++) {
112143 sb .append (" " );
@@ -117,6 +148,7 @@ private String formatRow(StringBuilder sb, int[] columnSizes, String[] row) {
117148 if (wrap ) {
118149 sb .append (txt , 0 , length );
119150 row [i ] = txt .substring (length );
151+ continuation [i ] = true ;
120152 remainder = true ;
121153 } else {
122154 sb .append (txt , 0 , length - 1 );
@@ -129,11 +161,15 @@ private String formatRow(StringBuilder sb, int[] columnSizes, String[] row) {
129161 } else {
130162 sb .append (OutputFormatter .repeat (' ' , length ));
131163 }
132- sb .append (" |" );
164+ if (i == row .length -1 || !continuation [i +1 ]) {
165+ sb .append (" |" );
166+ } else {
167+ sb .append (" \\ " );
168+ }
133169 }
134170 if (wrap && remainder ) {
135171 sb .append (OutputFormatter .NEWLINE );
136- formatRow (sb , columnSizes , row );
172+ formatRow (sb , columnSizes , row , continuation );
137173 }
138174 return sb .toString ();
139175 }
0 commit comments