Simplifying nested if else loops Cognitive complexity in Java

jasmeet24 :

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!

Joop Eggen :

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.

edited at
0

Comments

0 comments
Login to comment

Related