Skip to content
This repository was archived by the owner on Jul 6, 2023. It is now read-only.

Commit 3d79d5b

Browse files
authored
Merge pull request #144 from pontusmelke/1.1-format-bugs
Fix formatting bugs after recent change
2 parents a38a6b1 + 061bf14 commit 3d79d5b

File tree

6 files changed

+89
-54
lines changed

6 files changed

+89
-54
lines changed

cypher-shell/src/integration-test/java/org/neo4j/shell/commands/CypherShellVerboseIntegrationTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,34 @@ public void cypherWithExplainAndRulePlanner() throws CommandException {
218218
assertThat(actual, containsString("\"RULE\""));
219219
assertThat(actual, containsString("\"INTERPRETED\""));
220220
}
221+
222+
@Test
223+
public void shouldShowTheNumberOfRows() throws CommandException {
224+
//when
225+
shell.execute("UNWIND [1,2,3] AS row RETURN row");
226+
227+
//then
228+
String actual = linePrinter.output();
229+
assertThat(actual, containsString("3 rows available"));
230+
}
231+
232+
@Test
233+
public void shouldNotContainUnnecessaryNewLines() throws CommandException {
234+
//when
235+
shell.execute("UNWIND [1,2,3] AS row RETURN row");
236+
237+
//then
238+
String actual = linePrinter.output();
239+
assertThat(actual,
240+
containsString( String.format(
241+
"+-----+%n" +
242+
"| row |%n" +
243+
"+-----+%n" +
244+
"| 1 |%n" +
245+
"| 2 |%n" +
246+
"| 3 |%n" +
247+
"+-----+%n" +
248+
"%n" +
249+
"3 rows available after")));
250+
}
221251
}

cypher-shell/src/main/java/org/neo4j/shell/prettyprint/OutputFormatter.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@
2222

2323
public interface OutputFormatter {
2424

25-
enum Capablities {info, plan, result, footer, statistics}
25+
enum Capabilities {INFO, PLAN, RESULT, FOOTER, STATISTICS}
2626

2727
String COMMA_SEPARATOR = ", ";
2828
String COLON_SEPARATOR = ": ";
2929
String COLON = ":";
3030
String SPACE = " ";
3131
String NEWLINE = System.getProperty("line.separator");
3232

33-
void format(@Nonnull BoltResult result, @Nonnull LinePrinter linePrinter);
33+
int formatAndCount(@Nonnull BoltResult result, @Nonnull LinePrinter linePrinter);
3434

3535
@Nonnull default String formatValue(final Value value) {
3636
if (value == null) return "";
@@ -70,10 +70,10 @@ enum Capablities {info, plan, result, footer, statistics}
7070
@Nonnull
7171
default String pointAsString(Point point) {
7272
StringBuilder stringBuilder = new StringBuilder("point({");
73-
stringBuilder.append("srid:" + point.srid() + ",");
73+
stringBuilder.append("srid:").append(point.srid()).append(",");
7474
stringBuilder.append(" x:").append(point.x()).append(",");
7575
stringBuilder.append(" y:").append(point.y());
76-
Double z = point.z();
76+
double z = point.z();
7777
if (!Double.isNaN(z)) {
7878
stringBuilder.append(", z:").append(z);
7979
}
@@ -182,13 +182,13 @@ static boolean isNotBlank(String string) {
182182
@Nonnull default String formatInfo(@Nonnull ResultSummary summary) {
183183
return "";
184184
}
185-
@Nonnull default String formatFooter(@Nonnull BoltResult result) {
185+
@Nonnull default String formatFooter(@Nonnull BoltResult result, int numberOfRows) {
186186
return "";
187187
}
188188

189-
Set<Capablities> capabilities();
189+
Set<Capabilities> capabilities();
190190

191-
List<String> INFO = asList("Version", "Planner", "Runtime");
191+
List<String> INFO_SUMMARY = asList("Version", "Planner", "Runtime");
192192

193193
@Nonnull
194194
static Map<String, Value> info(@Nonnull ResultSummary summary) {
@@ -201,7 +201,7 @@ static Map<String, Value> info(@Nonnull ResultSummary summary) {
201201
Map<String, Value> arguments = plan.arguments();
202202
Value defaultValue = Values.value("");
203203

204-
for (String key : INFO) {
204+
for (String key : INFO_SUMMARY) {
205205
Value value = arguments.getOrDefault(key, arguments.getOrDefault(key.toLowerCase(), defaultValue));
206206
result.put(key, value);
207207
}
@@ -213,7 +213,7 @@ static Map<String, Value> info(@Nonnull ResultSummary summary) {
213213

214214
static long collectHits(@Nonnull ProfiledPlan operator ) {
215215
long hits = operator.dbHits();
216-
hits = operator.children().stream().map( OutputFormatter::collectHits ).reduce(hits, (acc, subHits) -> acc + subHits );
216+
hits = operator.children().stream().map( OutputFormatter::collectHits ).reduce(hits, Long::sum);
217217
return hits;
218218
}
219219

cypher-shell/src/main/java/org/neo4j/shell/prettyprint/PrettyPrinter.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
import org.neo4j.shell.state.BoltResult;
55

66
import javax.annotation.Nonnull;
7-
87
import java.util.Set;
98

9+
import static org.neo4j.shell.prettyprint.OutputFormatter.Capabilities.*;
10+
1011
/**
1112
* Print the result from neo4j in a intelligible fashion.
1213
*/
@@ -20,14 +21,17 @@ public PrettyPrinter(@Nonnull PrettyConfig prettyConfig) {
2021
}
2122

2223
public void format(@Nonnull final BoltResult result, LinePrinter linePrinter) {
23-
Set<OutputFormatter.Capablities> capabilities = outputFormatter.capabilities();
24+
Set<OutputFormatter.Capabilities> capabilities = outputFormatter.capabilities();
2425

25-
if (capabilities.contains(OutputFormatter.Capablities.result)) outputFormatter.format(result, linePrinter);
26+
int numberOfRows = 0;
27+
if (capabilities.contains(RESULT)) {
28+
numberOfRows = outputFormatter.formatAndCount(result, linePrinter);
29+
}
2630

27-
if (capabilities.contains(OutputFormatter.Capablities.info)) linePrinter.printOut(outputFormatter.formatInfo(result.getSummary()));
28-
if (capabilities.contains(OutputFormatter.Capablities.plan)) linePrinter.printOut(outputFormatter.formatPlan(result.getSummary()));
29-
if (capabilities.contains(OutputFormatter.Capablities.footer)) linePrinter.printOut(outputFormatter.formatFooter(result));
30-
if (capabilities.contains(OutputFormatter.Capablities.statistics)) linePrinter.printOut(statisticsCollector.collect(result.getSummary()));
31+
if (capabilities.contains(INFO)) printIfNotEmpty(outputFormatter.formatInfo(result.getSummary()), linePrinter);
32+
if (capabilities.contains(PLAN)) printIfNotEmpty(outputFormatter.formatPlan(result.getSummary()), linePrinter);
33+
if (capabilities.contains(FOOTER)) printIfNotEmpty(outputFormatter.formatFooter(result, numberOfRows), linePrinter);
34+
if (capabilities.contains(STATISTICS)) printIfNotEmpty(statisticsCollector.collect(result.getSummary()), linePrinter);
3135
}
3236

3337
// Helper for testing
@@ -37,6 +41,12 @@ String format(@Nonnull final BoltResult result) {
3741
return sb.toString();
3842
}
3943

44+
private void printIfNotEmpty( String s, LinePrinter linePrinter ) {
45+
if (!s.isEmpty()) {
46+
linePrinter.printOut( s );
47+
}
48+
}
49+
4050
private OutputFormatter selectFormatter(PrettyConfig prettyConfig) {
4151
if (prettyConfig.format == Format.VERBOSE) {
4252
return new TableOutputFormatter(prettyConfig.wrap, prettyConfig.numSampleRows);

cypher-shell/src/main/java/org/neo4j/shell/prettyprint/SimpleOutputFormatter.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,25 @@
1212
import java.util.Set;
1313
import java.util.stream.Collectors;
1414

15+
import static org.neo4j.shell.prettyprint.OutputFormatter.Capabilities.*;
16+
1517
public class SimpleOutputFormatter implements OutputFormatter {
1618

1719
@Override
18-
public void format(@Nonnull BoltResult result, @Nonnull LinePrinter output) {
20+
public int formatAndCount(@Nonnull BoltResult result, @Nonnull LinePrinter output) {
1921
Iterator<Record> records = result.iterate();
22+
int numberOfRows = 0;
2023
if (records.hasNext()) {
2124
Record firstRow = records.next();
2225
output.printOut(String.join(COMMA_SEPARATOR, firstRow.keys()));
2326
output.printOut(formatRecord(firstRow));
27+
numberOfRows++;
2428
while (records.hasNext()) {
2529
output.printOut(formatRecord(records.next()));
30+
numberOfRows++;
2631
}
2732
}
33+
return numberOfRows;
2834
}
2935

3036
@Nonnull
@@ -44,7 +50,7 @@ public String formatInfo(@Nonnull ResultSummary summary) {
4450
}
4551

4652
@Override
47-
public Set<Capablities> capabilities() {
48-
return EnumSet.of(Capablities.info, Capablities.statistics, Capablities.result);
53+
public Set<Capabilities> capabilities() {
54+
return EnumSet.of(INFO, STATISTICS, RESULT);
4955
}
5056
}

cypher-shell/src/main/java/org/neo4j/shell/prettyprint/TableOutputFormatter.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ public TableOutputFormatter(boolean wrap, int numSampleRows) {
2424
}
2525

2626
@Override
27-
public void format(@Nonnull BoltResult result, @Nonnull LinePrinter output) {
27+
public int formatAndCount(@Nonnull BoltResult result, @Nonnull LinePrinter output) {
2828
String[] columns = result.getKeys().toArray(new String[0]);
2929
if (columns.length == 0) {
30-
return;
30+
return 0;
3131
}
3232

3333
Iterator<Record> records = result.iterate();
34-
formatResult(columns, records, output);
34+
return formatResultAndCountRows(columns, records, output);
3535
}
3636

3737
private List<Record> take(Iterator<Record> records, int count) {
@@ -42,9 +42,9 @@ private List<Record> take(Iterator<Record> records, int count) {
4242
return topRecords;
4343
}
4444

45-
private void formatResult(String[] columns,
46-
Iterator<Record> records,
47-
LinePrinter output) {
45+
private int formatResultAndCountRows(String[] columns,
46+
Iterator<Record> records,
47+
LinePrinter output) {
4848

4949
List<Record> topRecords = take(records, numSampleRows);
5050
int[] columnSizes = calculateColumnSizes(columns, topRecords);
@@ -63,13 +63,17 @@ private void formatResult(String[] columns,
6363
output.printOut(headerLine);
6464
output.printOut(dashes);
6565

66+
int numberOfRows = 0;
6667
for (Record record : topRecords) {
6768
output.printOut(formatRecord(builder, columnSizes, record));
69+
numberOfRows++;
6870
}
6971
while (records.hasNext()) {
7072
output.printOut(formatRecord(builder, columnSizes, records.next()));
73+
numberOfRows++;
7174
}
72-
output.printOut(dashes);
75+
output.printOut(String.format("%s%n", dashes));
76+
return numberOfRows;
7377
}
7478

7579
private int[] calculateColumnSizes(@Nonnull String[] columns, @Nonnull List<Record> data) {
@@ -136,11 +140,10 @@ private String formatRow(StringBuilder sb, int[] columnSizes, String[] row) {
136140

137141
@Override
138142
@Nonnull
139-
public String formatFooter(@Nonnull BoltResult result) {
140-
int rows = result.getRecords().size();
143+
public String formatFooter(@Nonnull BoltResult result, int numberOfRows) {
141144
ResultSummary summary = result.getSummary();
142145
return String.format("%d row%s available after %d ms, " +
143-
"consumed after another %d ms", rows, rows != 1 ? "s" : "",
146+
"consumed after another %d ms", numberOfRows, numberOfRows != 1 ? "s" : "",
144147
summary.resultAvailableAfter(MILLISECONDS),
145148
summary.resultConsumedAfter(MILLISECONDS));
146149
}
@@ -155,7 +158,7 @@ public String formatInfo(@Nonnull ResultSummary summary) {
155158
String[] columns = info.keySet().toArray(new String[0]);
156159
StringBuilder sb = new StringBuilder();
157160
Record record = new InternalRecord(asList(columns), info.values().toArray(new Value[0]));
158-
formatResult(columns, Collections.singletonList(record).iterator(), sb::append);
161+
formatResultAndCountRows(columns, Collections.singletonList(record).iterator(), sb::append);
159162
return sb.toString();
160163
}
161164

@@ -169,7 +172,7 @@ public String formatPlan(@Nullable ResultSummary summary) {
169172
}
170173

171174
@Override
172-
public Set<Capablities> capabilities() {
173-
return EnumSet.allOf(Capablities.class);
175+
public Set<Capabilities> capabilities() {
176+
return EnumSet.allOf(Capabilities.class);
174177
}
175178
}

cypher-shell/src/test/java/org/neo4j/shell/prettyprint/TableOutputFormatterTest.java

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,9 @@
22

33
import org.hamcrest.CoreMatchers;
44
import org.junit.Test;
5-
import org.neo4j.driver.internal.InternalIsoDuration;
6-
import org.neo4j.driver.internal.InternalNode;
7-
import org.neo4j.driver.internal.InternalPath;
8-
import org.neo4j.driver.internal.InternalPoint2D;
9-
import org.neo4j.driver.internal.InternalPoint3D;
10-
import org.neo4j.driver.internal.InternalRecord;
11-
import org.neo4j.driver.internal.InternalRelationship;
12-
import org.neo4j.driver.internal.value.DurationValue;
13-
import org.neo4j.driver.internal.value.NodeValue;
14-
import org.neo4j.driver.internal.value.PathValue;
15-
import org.neo4j.driver.internal.value.PointValue;
16-
import org.neo4j.driver.internal.value.RelationshipValue;
17-
import org.neo4j.driver.v1.Record;
18-
import org.neo4j.driver.v1.Statement;
19-
import org.neo4j.driver.v1.StatementResult;
20-
import org.neo4j.driver.v1.Value;
21-
import org.neo4j.driver.v1.Values;
5+
import org.neo4j.driver.internal.*;
6+
import org.neo4j.driver.internal.value.*;
7+
import org.neo4j.driver.v1.*;
228
import org.neo4j.driver.v1.summary.ProfiledPlan;
239
import org.neo4j.driver.v1.summary.ResultSummary;
2410
import org.neo4j.driver.v1.summary.StatementType;
@@ -288,7 +274,7 @@ public void wrapContent()
288274
StatementResult result = mockResult( asList( "c1"), "a", "bb","ccc","dddd","eeeee" );
289275
// WHEN
290276
ToStringLinePrinter printer = new ToStringLinePrinter();
291-
new TableOutputFormatter(true, 2).format(new ListBoltResult(result.list(), result.summary()), printer);
277+
new TableOutputFormatter(true, 2).formatAndCount(new ListBoltResult(result.list(), result.summary()), printer);
292278
String table = printer.result();
293279
// THEN
294280
assertThat(table, is(String.join(NEWLINE,
@@ -304,7 +290,7 @@ public void wrapContent()
304290
"| \"eee |",
305291
"| ee\" |",
306292
"+------+",
307-
"")));
293+
NEWLINE)));
308294
}
309295

310296
@Test
@@ -314,7 +300,7 @@ public void truncateContent()
314300
StatementResult result = mockResult( asList( "c1"), "a", "bb","ccc","dddd","eeeee" );
315301
// WHEN
316302
ToStringLinePrinter printer = new ToStringLinePrinter();
317-
new TableOutputFormatter(false, 2).format(new ListBoltResult(result.list(), result.summary()), printer);
303+
new TableOutputFormatter(false, 2).formatAndCount(new ListBoltResult(result.list(), result.summary()), printer);
318304
String table = printer.result();
319305
// THEN
320306
assertThat(table, is(String.join(NEWLINE,
@@ -327,7 +313,7 @@ public void truncateContent()
327313
"| \"dd… |",
328314
"| \"ee… |",
329315
"+------+",
330-
"")));
316+
NEWLINE)));
331317
}
332318

333319
@Test
@@ -360,7 +346,7 @@ public void formatEntities() {
360346

361347
private String formatResult(StatementResult result) {
362348
ToStringLinePrinter printer = new ToStringLinePrinter();
363-
new TableOutputFormatter(true, 1000).format(new ListBoltResult(result.list(), result.summary()), printer);
349+
new TableOutputFormatter(true, 1000).formatAndCount(new ListBoltResult(result.list(), result.summary()), printer);
364350
return printer.result();
365351
}
366352

0 commit comments

Comments
 (0)