Skip to content

Commit fe87575

Browse files
committed
AnalyzeSql annotation: in case of N+1 select suspicion, the JDBC roundtrip message is now displayed after the N+1 select message
1 parent 7e1408b commit fe87575

File tree

5 files changed

+37
-20
lines changed

5 files changed

+37
-20
lines changed

sql/sql-annotations/src/main/java/org/quickperf/sql/analyze/SqlReport.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.quickperf.sql.SqlExecutions;
1717
import org.quickperf.sql.bindparams.AllParametersAreBoundExtractor;
1818
import org.quickperf.sql.execution.SqlAnalysis;
19+
import org.quickperf.sql.framework.JdbcSuggestion;
1920
import org.quickperf.sql.like.ContainsLikeWithLeadingWildcardExtractor;
2021
import org.quickperf.sql.select.analysis.SelectAnalysis;
2122
import org.quickperf.time.ExecutionTime;
@@ -77,8 +78,12 @@ private int numberOf(SqlExecutions sqlExecutions, QueryType queryType) {
7778

7879
private String buildNPlusOneMessage(SqlAnalysis sqlAnalysis) {
7980
if (sqlAnalysis.getSelectAnalysis().getSameSelectTypesWithDifferentParamValues().evaluate()) {
80-
return this.addSeparationString() + ALERT_MESSAGE
81-
+ sqlAnalysis.getSelectAnalysis().getSameSelectTypesWithDifferentParamValues().getSuggestionToFixIt()
81+
SelectAnalysis.SameSelectTypesWithDifferentParamValues sameSelectTypesWithDifferentParamValues = sqlAnalysis.getSelectAnalysis().getSameSelectTypesWithDifferentParamValues();
82+
return addSeparationString() + ALERT_MESSAGE
83+
+ SelectAnalysis.getNPlusOneFrameworkMessage()
84+
+ System.lineSeparator()
85+
+ System.lineSeparator()
86+
+ JdbcSuggestion.SERVER_ROUND_TRIPS.getMessage()
8287
+ System.lineSeparator()
8388
+ System.lineSeparator();
8489
}

sql/sql-annotations/src/main/java/org/quickperf/sql/select/MaxOfSelectsPerfIssueVerifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ private PerfIssue buildPerfIssue(Count measuredCount, Count expectedCount, Selec
4747
, "select");
4848

4949
if (measuredCount.isGreaterThan(Count.ONE) && !selectAnalysis.hasOnlySameSelects()) {
50-
description += SelectAnalysis.getSuggestionToFIxNPlusOneSelect();
50+
description += SelectAnalysis.getNPlusOneSelectAlert();
5151
}
5252

5353
return new PerfIssue(description);

sql/sql-annotations/src/main/java/org/quickperf/sql/select/SelectNumberPerfIssueVerifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private PerfIssue buildPerfIssue(Count executedSelectNumber, Count expectedSelec
4646
&& executedSelectNumber.isGreaterThan(expectedSelectNumber)
4747
&& !selectAnalysis.hasOnlySameSelects()
4848
) {
49-
description += SelectAnalysis.getSuggestionToFIxNPlusOneSelect();
49+
description += SelectAnalysis.getNPlusOneSelectAlert();
5050
}
5151

5252
return new PerfIssue(description);

sql/sql-annotations/src/main/java/org/quickperf/sql/select/analysis/SelectAnalysis.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.quickperf.unit.Count;
2121
import org.quickperf.unit.NoUnit;
2222

23+
import static java.lang.System.*;
24+
2325
public class SelectAnalysis implements PerfMeasure {
2426

2527
private final Count selectNumber;
@@ -41,33 +43,32 @@ public boolean evaluate() {
4143
}
4244

4345
public String getSuggestionToFixIt() {
44-
return getSuggestionToFIxNPlusOneSelect();
46+
return getNPlusOneSelectAlert();
4547
}
4648

4749
}
4850

49-
public static String getSuggestionToFIxNPlusOneSelect() {
51+
public static String getNPlusOneSelectAlert() {
5052

5153
if(SystemProperties.SIMPLIFIED_SQL_DISPLAY.evaluate()) {
5254
return "";
5355
}
5456

55-
String suggestion = System.lineSeparator()
56-
+ System.lineSeparator()
57-
+ JdbcSuggestion.SERVER_ROUND_TRIPS.getMessage();
57+
return lineSeparator()
58+
+ lineSeparator()
59+
+ JdbcSuggestion.SERVER_ROUND_TRIPS.getMessage()
60+
+ getNPlusOneFrameworkMessage();
61+
62+
}
5863

64+
public static String getNPlusOneFrameworkMessage() {
5965
if(ClassPath.INSTANCE.containsHibernate()) {
60-
suggestion += System.lineSeparator()
61-
+ HibernateSuggestion.N_PLUS_ONE_SELECT.getMessage();
66+
return lineSeparator() + HibernateSuggestion.N_PLUS_ONE_SELECT.getMessage();
6267
}
63-
6468
if(ClassPath.INSTANCE.containsMicronautData()) {
65-
suggestion += System.lineSeparator()
66-
+ MicronautSuggestion.N_PLUS_ONE_SELECT.getMessage();
69+
return lineSeparator() + MicronautSuggestion.N_PLUS_ONE_SELECT.getMessage();
6770
}
68-
69-
return suggestion;
70-
71+
return "";
7172
}
7273

7374
public SelectAnalysis(int selectNumber

sql/sql-memory-test/src/test/java/AnalyzeSqlTest.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.nio.file.Paths;
2929
import java.util.stream.Collectors;
3030

31+
import static java.lang.System.*;
3132
import static org.assertj.core.api.Assertions.assertThat;
3233
import static org.junit.experimental.results.PrintableResult.testResult;
3334

@@ -51,7 +52,7 @@ private static String findTargetPath() {
5152

5253
private static String getFileContent(String filePath) throws IOException {
5354
return Files.lines(Paths.get(filePath))
54-
.collect(Collectors.joining(System.lineSeparator()));
55+
.collect(Collectors.joining(lineSeparator()));
5556
}
5657

5758
@RunWith(QuickPerfJUnitRunner.class)
@@ -423,8 +424,17 @@ public void execute_two_same_select_types_with_two_diff_param_values() {
423424
// THEN
424425
assertThat(printableResult.failureCount()).isZero();
425426
assertThat(getFileContent(DETECT_N_PLUS_ONE))
426-
.contains("JDBC roundtrips")
427-
.contains("N+1");
427+
.contains("N+1")
428+
// The JDBC roundtrip message has to be displayed after the N+1 select message
429+
// , just before displaying the queries in this test case.
430+
.contains("You may have even more select statements with production data." + lineSeparator()
431+
+ "Be careful with the cost of JDBC roundtrips: https://blog.jooq.org/2017/12/18/the-cost-of-jdbc-server-roundtrips/"
432+
+ lineSeparator()
433+
+ lineSeparator()
434+
+ " * * * * *"
435+
+ lineSeparator()
436+
+ "QUERIES"
437+
);
428438

429439
}
430440

@@ -506,4 +516,5 @@ public void should_alert_if_no_bind_parameters_where_found() throws IOException
506516
.contains("Query without bind parameters");
507517

508518
}
519+
509520
}

0 commit comments

Comments
 (0)