details: https://code.openbravo.com/erp/devel/pi/rev/a770479abfb3 changeset: 28863:a770479abfb3 user: Alvaro Ferraz <alvaro.ferraz <at> openbravo.com> date: Wed Mar 02 10:18:21 2016 +0100 summary: Fixes issue 32341: Performance problem in ResetAccounting
Modify ad_org_getperiodcontrolallow function to make it recursive and improve its query. Execute query only once in ResetAccounting.java and for every orgIds instead of for each orgId in orgIds. Query will be done in SQL instead of HQL to avoid errors when executing PostDocumentTest. details: https://code.openbravo.com/erp/devel/pi/rev/40c86fcd61ae changeset: 28864:40c86fcd61ae user: David Miguelez <david.miguelez <at> openbravo.com> date: Thu Apr 07 11:26:17 2016 +0200 summary: Related to Issue 32341: Prevents infinite loop if organization is null diffstat: src-db/database/model/functions/AD_ORG_GETPERIODCONTROLALLOW.xml | 50 +++------ src/org/openbravo/financial/ResetAccounting.java | 47 ++++++--- 2 files changed, 50 insertions(+), 47 deletions(-) diffs (154 lines): diff -r 1450b7bf6b32 -r 40c86fcd61ae src-db/database/model/functions/AD_ORG_GETPERIODCONTROLALLOW.xml --- a/src-db/database/model/functions/AD_ORG_GETPERIODCONTROLALLOW.xml Wed Apr 06 11:12:42 2016 +0200 +++ b/src-db/database/model/functions/AD_ORG_GETPERIODCONTROLALLOW.xml Thu Apr 07 11:26:17 2016 +0200 @@ -16,7 +16,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU -* All portions are Copyright (C) 2009-2014 Openbravo SLU +* All portions are Copyright (C) 2009-2016 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************/ @@ -28,43 +28,31 @@ v_isperiodcontrolallowed AD_Org.IsPeriodControlAllowed%TYPE; v_parent_id ad_treenode.parent_id%TYPE; - v_node_id ad_treenode.parent_id%TYPE; BEGIN - SELECT IsPeriodControlAllowed, AD_Org_ID - INTO v_isperiodcontrolallowed, v_parent_id + + IF (p_organization IS NULL) THEN + RETURN NULL; + END IF; + + SELECT IsPeriodControlAllowed + INTO v_isperiodcontrolallowed FROM AD_Org WHERE AD_Org_ID=p_organization; IF (v_isperiodcontrolallowed='Y') THEN - RETURN v_parent_id; + RETURN p_organization; + ELSIF (p_organization='0') THEN + RETURN NULL; ELSE - v_node_id:=p_organization; - WHILE ( v_parent_id <> '0' AND v_node_id <> '0' ) LOOP - SELECT parent_id - INTO v_parent_id - FROM ad_treenode t - WHERE node_id=v_node_id - AND EXISTS (SELECT 1 - FROM ad_tree, ad_org - WHERE ad_tree.ad_client_id = ad_org.ad_client_id - AND ad_tree.ad_client_id=t.ad_client_id - AND ad_tree.ad_table_id='155' - AND t.ad_tree_id=ad_tree.ad_tree_id - ); - - SELECT IsPeriodControlAllowed, AD_Org_ID - INTO v_isperiodcontrolallowed, v_parent_id - FROM AD_Org - WHERE AD_Org_ID=v_parent_id; - - IF (v_isperiodcontrolallowed='Y') THEN - RETURN v_parent_id; - END IF; - - v_node_id:=v_parent_id; - END LOOP; -END IF; + SELECT tn.parent_id + INTO v_parent_id + FROM ad_tree t JOIN ad_treenode tn + ON t.ad_tree_id = tn.ad_tree_id + WHERE tn.node_id=p_organization + AND t.ad_table_id='155'; + RETURN ad_org_getperiodcontrolallow(v_parent_id); + END IF; RETURN NULL; END AD_ORG_GETPERIODCONTROLALLOW ]]></body> diff -r 1450b7bf6b32 -r 40c86fcd61ae src/org/openbravo/financial/ResetAccounting.java --- a/src/org/openbravo/financial/ResetAccounting.java Wed Apr 06 11:12:42 2016 +0200 +++ b/src/org/openbravo/financial/ResetAccounting.java Thu Apr 07 11:26:17 2016 +0200 @@ -11,7 +11,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU - * All portions are Copyright (C) 2013-2015 Openbravo SLU + * All portions are Copyright (C) 2013-2016 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************* @@ -23,13 +23,14 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.hibernate.Query; +import org.hibernate.ScrollMode; +import org.hibernate.ScrollableResults; import org.hibernate.criterion.Restrictions; import org.openbravo.base.exception.OBException; import org.openbravo.base.model.ModelProvider; @@ -84,23 +85,37 @@ // period control associated Map<String, String> organizationPeriodControl = new HashMap<String, String>(); String calendarId = getCalendarId(adOrgId); - Iterator<String> iterator = orgIds.iterator(); - while (iterator.hasNext()) { - String organization = iterator.next(); - String myQuery1 = "select p.id from Organization p where ad_org_getperiodcontrolallow(:organization)=p.id"; - Query query1 = OBDal.getInstance().getSession().createQuery(myQuery1); - query1.setString("organization", organization); - query1.setMaxResults(1); - if (query1.uniqueResult() != null) { - String orgperiodcontrol = query1.uniqueResult().toString(); - organizationPeriodControl.put(organization, orgperiodcontrol); - if (!organizationPeriod.keySet().contains(orgperiodcontrol)) { - periods = getPeriodsDates(getOpenPeriods(client, dbt, orgIds, calendarId, table, - recordId, strdatefrom, strdateto, orgperiodcontrol)); - organizationPeriod.put(orgperiodcontrol, periods); + + String myQuery1 = "select ad_org_id, ad_org_getperiodcontrolallow(ad_org_id) from ad_org where ad_org_id in (:orgIds)"; + Query query1 = OBDal.getInstance().getSession().createSQLQuery(myQuery1); + query1.setParameterList("orgIds", orgIds); + ScrollableResults scroll = query1.scroll(ScrollMode.FORWARD_ONLY); + int i = 0; + try { + while (scroll.next()) { + Object[] resultSet = scroll.get(); + String organization = (String) resultSet[0]; + String orgperiodcontrol = (String) resultSet[1]; + + if (orgperiodcontrol != null) { + organizationPeriodControl.put(organization, orgperiodcontrol); + if (!organizationPeriod.keySet().contains(orgperiodcontrol)) { + periods = getPeriodsDates(getOpenPeriods(client, dbt, orgIds, calendarId, table, + recordId, strdatefrom, strdateto, orgperiodcontrol)); + organizationPeriod.put(orgperiodcontrol, periods); + } + } + + i++; + if (i % 100 == 0) { + OBDal.getInstance().flush(); + OBDal.getInstance().getSession().clear(); } } + } finally { + scroll.close(); } + int docUpdated = 0; int docDeleted = 0; for (String organization : orgIds) { ------------------------------------------------------------------------------ _______________________________________________ Openbravo-commits mailing list Openbravo-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openbravo-commits