details: https://code.openbravo.com/erp/devel/pi/rev/873652fe3cd4 changeset: 32981:873652fe3cd4 user: Asier Lostalé <asier.lostale <at> openbravo.com> date: Fri Nov 10 11:49:58 2017 +0100 summary: related with bug 35838: performance issues in Alert window
Some minor code clean up: - Format SQL to make it more readable - Removed clutter + duplicity handling elements in map - Use parameterized statements instead of string concatenation to generate query - Prevent expensive debug message generation if it won't be logged diffstat: modules/org.openbravo.client.application/src/org/openbravo/client/application/ADAlertDatasourceService.java | 45 +++++---- 1 files changed, 23 insertions(+), 22 deletions(-) diffs (81 lines): diff -r 0a1c870b2e2c -r 873652fe3cd4 modules/org.openbravo.client.application/src/org/openbravo/client/application/ADAlertDatasourceService.java --- a/modules/org.openbravo.client.application/src/org/openbravo/client/application/ADAlertDatasourceService.java Fri Nov 10 10:35:18 2017 +0100 +++ b/modules/org.openbravo.client.application/src/org/openbravo/client/application/ADAlertDatasourceService.java Fri Nov 10 11:49:58 2017 +0100 @@ -27,7 +27,6 @@ import javax.servlet.ServletException; -import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.SQLQuery; import org.hibernate.exception.SQLGrammarException; @@ -95,15 +94,17 @@ private List<String> getAlertIds(String alertStatus) { // Get alert rules visible for context's the role/user. - final String sql = "SELECT arule.ad_alertrule_id, arule.filterclause" - + " FROM ad_alertrule arule " - + " WHERE (EXISTS(SELECT 1 FROM ad_alertrecipient arecipient" - + " WHERE arule.ad_alertrule_id = arecipient.ad_alertrule_id" - + " AND (arecipient.ad_user_id = :userId OR (arecipient.ad_user_id is null)" - + " AND arecipient.ad_role_id = :roleId)))"// - + " AND arule.ad_client_id " + OBDal.getInstance().getReadableClientsInClause() - + " AND ad_org_id " + OBDal.getInstance().getReadableOrganizationsInClause() - + " AND arule.isactive='Y'"; + final String sql = "SELECT ad_alertrule_id, filterclause" + + " FROM ad_alertrule arule" // + + " WHERE EXISTS (SELECT 1" // + + " FROM ad_alertrecipient arecipient" + + " WHERE arule.ad_alertrule_id = arecipient.ad_alertrule_id" + + " AND (ad_user_id = :userId" + + " OR (ad_user_id is null AND ad_role_id = :roleId)))" + + " AND ad_client_id " + OBDal.getInstance().getReadableClientsInClause() + + " AND ad_org_id " + OBDal.getInstance().getReadableOrganizationsInClause() + + " AND isactive='Y'"; + final SQLQuery alertRules = OBDal.getInstance().getSession().createSQLQuery(sql); alertRules.setParameter("userId", OBContext.getOBContext().getUser().getId()); alertRules.setParameter("roleId", OBContext.getOBContext().getRole().getId()); @@ -122,15 +123,13 @@ String alertRuleId = resultAlertRules[ALERT_RULE_ID].toString(); String alertRuleFilterClause = resultAlertRules[ALERT_RULE_FILTERCLAUSE] == null ? "" : resultAlertRules[ALERT_RULE_FILTERCLAUSE].toString(); - if (alertRulesIdGroupByFilterClauses.containsKey(alertRuleFilterClause)) { - List<String> oldIds = alertRulesIdGroupByFilterClauses.get(alertRuleFilterClause); - oldIds.add(alertRuleId); - alertRulesIdGroupByFilterClauses.put(alertRuleFilterClause, oldIds); - } else { - List<String> newFilterClause = new ArrayList<>(); - newFilterClause.add(alertRuleId); - alertRulesIdGroupByFilterClauses.put(alertRuleFilterClause, newFilterClause); + + List<String> ids = alertRulesIdGroupByFilterClauses.get(alertRuleFilterClause); + if (ids == null) { + ids = new ArrayList<>(); + alertRulesIdGroupByFilterClauses.put(alertRuleFilterClause, ids); } + ids.add(alertRuleId); } } catch (SQLGrammarException e) { log.error("An error has ocurred when trying to process the alert rules: " + e.getMessage(), e); @@ -153,14 +152,16 @@ + " AND ad_client_id " + OBDal.getInstance().getReadableClientsInClause() + " AND ad_org_id " + OBDal.getInstance().getReadableOrganizationsInClause() + " AND ad_alertrule_id IN (" + toStringList(alertRuleList.getValue()) + ")" - + filterClause + " AND coalesce(to_char(status), 'NEW') = '" - + StringEscapeUtils.escapeSql(alertStatus) + "'"; + + filterClause + " AND coalesce(to_char(status), 'NEW') = :status"; final SQLQuery sqlQuery = OBDal.getInstance().getSession().createSQLQuery(sql); + sqlQuery.setParameter("status", alertStatus); try { @SuppressWarnings("unchecked") List<String> alertsFound = sqlQuery.list(); - log.debug("Alerts ID: " + alertRuleList.getValue().toString() + ") - SQL:'" + sql - + "' - Rows: " + alertsFound.size()); + if (log.isDebugEnabled()) { + log.debug("Alert rule IDs: " + alertRuleList.getValue() + ") - SQL:'" + sql + + "' - Rows: " + alertsFound.size()); + } alertIds.addAll(alertsFound); } catch (SQLGrammarException e) { log.error("An error has ocurred when trying to process the alerts: " + e.getMessage(), e); ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Openbravo-commits mailing list Openbravo-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openbravo-commits