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

Commit 580b890

Browse files
committed
Fix bug where the number of rows wasn't being counted
Since we are now streaming the result the old way of assuming all records had been eagerly pulled is no longer working.
1 parent 91c2fbc commit 580b890

File tree

6 files changed

+43
-37
lines changed

6 files changed

+43
-37
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,14 @@ 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+
}
221231
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ enum Capabilities {INFO, PLAN, RESULT, FOOTER, STATISTICS}
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 Capabilities {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,7 +182,7 @@ 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

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ public PrettyPrinter(@Nonnull PrettyConfig prettyConfig) {
2323
public void format(@Nonnull final BoltResult result, LinePrinter linePrinter) {
2424
Set<OutputFormatter.Capabilities> capabilities = outputFormatter.capabilities();
2525

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

2831
if (capabilities.contains(INFO)) linePrinter.printOut(outputFormatter.formatInfo(result.getSummary()));
2932
if (capabilities.contains(PLAN)) linePrinter.printOut(outputFormatter.formatPlan(result.getSummary()));
30-
if (capabilities.contains(FOOTER)) linePrinter.printOut(outputFormatter.formatFooter(result));
33+
if (capabilities.contains(FOOTER)) linePrinter.printOut(outputFormatter.formatFooter(result, numberOfRows));
3134
if (capabilities.contains(STATISTICS)) linePrinter.printOut(statisticsCollector.collect(result.getSummary()));
3235
}
3336

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,20 @@
1717
public class SimpleOutputFormatter implements OutputFormatter {
1818

1919
@Override
20-
public void format(@Nonnull BoltResult result, @Nonnull LinePrinter output) {
20+
public int formatAndCount(@Nonnull BoltResult result, @Nonnull LinePrinter output) {
2121
Iterator<Record> records = result.iterate();
22+
int numberOfRows = 0;
2223
if (records.hasNext()) {
2324
Record firstRow = records.next();
2425
output.printOut(String.join(COMMA_SEPARATOR, firstRow.keys()));
2526
output.printOut(formatRecord(firstRow));
27+
numberOfRows++;
2628
while (records.hasNext()) {
2729
output.printOut(formatRecord(records.next()));
30+
numberOfRows++;
2831
}
2932
}
33+
return numberOfRows;
3034
}
3135

3236
@Nonnull

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

Lines changed: 13 additions & 10 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
}
7275
output.printOut(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

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

Lines changed: 6 additions & 20 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,
@@ -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,
@@ -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)