I've a method which is used to build a native sql query. I've 4 String builder as input and based on different conditions, i need to build my query.
Here is the code
private void appendConditions(StringBuilder query, StringBuilder condition, StringBuilder condition2,
StringBuilder condition3) {
if (StringUtils.isNotEmpty(condition.toString())) {
query.append(ApplicationConstants.AND+"(");
query.append("( " + condition + " )");
if (StringUtils.isNotEmpty(condition2.toString())) {
query.append(ApplicationConstants.AND);
query.append("( " + condition2 + " )");
if (StringUtils.isNotEmpty(condition3.toString())) {
query.append(ApplicationConstants.AND);
query.append("( " + condition3 + " )");
}
} else {
if (StringUtils.isNotEmpty(condition3.toString())) {
query.append(ApplicationConstants.AND);
query.append("( " + condition3 + " )");
}
}
query.append(" )");
} else {
if (StringUtils.isNotEmpty(condition2.toString())) {
query.append(ApplicationConstants.AND+"(");
query.append("( " + condition2 + " )");
if (StringUtils.isNotEmpty(condition3.toString())) {
query.append(ApplicationConstants.AND);
query.append("( " + condition3 + " )");
}
query.append(" )");
} else {
if (StringUtils.isNotEmpty(condition3.toString())) {
query.append(ApplicationConstants.AND+"(");
query.append("( " + condition3 + " )");
query.append(" )");
}
}
}
}
When i run my Sonar report, it says the Cognitive complexity is higher for this method. Can i simplify this methods avoiding many if-else loops
Thanks!
The simplification can consist of a generalisation: having a vararg of conditions. And then a Stream solution is a matter of seconds.
private void appendConditions(StringBuilder query, StringBuilder... conditions) {
String ands = Stream.of(conditions)
.map(StringBuilder::toString)
.filter(StringUtils::isNotEmpty)
.map(c -> "(" + c + ")")
.collect(Collectors.joining(ApplicationConstants.AND));
if (!ands.isEmpty()) {
query.append(ApplicationConstants.AND).append(ands);
}
}
Should it be needed, you could use Stream.of(condition1, condition2, condition3)
.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments