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

Reply via email to