details:   https://code.openbravo.com/erp/devel/pi/rev/ca36991325a4
changeset: 28623:ca36991325a4
user:      Alvaro Ferraz <alvaro.ferraz <at> openbravo.com>
date:      Mon Feb 15 19:53:12 2016 +0100
summary:   Fixes issue 32023 & Fixes issue 32190: Improve PriceDifference 
performance

Some improvements have been done in CostingUtils.getCurrentValuedStock, 
CostAdjustmentUtils.getValuedStockOnMovementDateByAttrAndLocator, 
CostAdjustmentUtils.getValuedStockOnTransactionDate and 
CostingMigrationProcess.getCurrentValuedStock methods:
- Use TransactionCost.PROPERTY_ACCOUNTINGDATE field instead of 
coalesce(ShipmentInOut.PROPERTY_ACCOUNTINGDATE, 
MaterialTransaction.PROPERTY_MOVEMENTDATE) to avoid join with ShipmentInOutLine 
and ShipmentInOut tables.
- Use a scroll instead of looping through a list.
- Loop can not be avoid due to the need of calculate conversion rate 
recursively.
- Clear every 100 loops will not be done as DAL objects will not be loaded in 
memory and to avoid session cleared errors.
Retrieve only one or two results in some queries where more results were not 
needed.
Use isEmpty() instead of size().
Retrieve only lineno field instead of full object in 
CostAdjustmentUtils.getNewLineNo method.
Improve CostAdjustmentUtils.getTrxCost method.
Do a clear every 100 loops in PriceDifferenceProcess.processPriceDifference 
method to improve performance.

diffstat:

 src/org/openbravo/costing/AverageAlgorithm.java        |   14 +-
 src/org/openbravo/costing/AverageCostAdjustment.java   |   13 +-
 src/org/openbravo/costing/CostAdjustmentUtils.java     |  134 ++++++++++------
 src/org/openbravo/costing/CostingMigrationProcess.java |   33 ++--
 src/org/openbravo/costing/CostingUtils.java            |   64 ++++---
 src/org/openbravo/costing/PriceDifferenceProcess.java  |    9 +-
 6 files changed, 156 insertions(+), 111 deletions(-)

diffs (truncated from 560 to 300 lines):

diff -r 815ba738d4dc -r ca36991325a4 
src/org/openbravo/costing/AverageAlgorithm.java
--- a/src/org/openbravo/costing/AverageAlgorithm.java   Fri Feb 19 11:31:51 
2016 +0100
+++ b/src/org/openbravo/costing/AverageAlgorithm.java   Mon Feb 15 19:53:12 
2016 +0100
@@ -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) 2012-2015 Openbravo SLU
+ * All portions are Copyright (C) 2012-2016 Openbravo SLU
  * All Rights Reserved.
  * Contributor(s):  ______________________________________.
  *************************************************************************
@@ -187,13 +187,15 @@
     } else {
       costQry.setNamedParameter("org", costOrg.getId());
     }
+    costQry.setMaxResult(2);
 
     List<Costing> costList = costQry.list();
+    int size = costList.size();
     // If no average cost is found return null.
-    if (costList.size() == 0) {
+    if (size == 0) {
       return null;
     }
-    if (costList.size() > 1) {
+    if (size > 1) {
       log4j.warn("More than one cost found for same date: " + 
OBDateUtils.formatDate(date)
           + " for product: " + product.getName() + " (" + product.getId() + 
")");
     }
@@ -239,13 +241,15 @@
     } else {
       costQry.setNamedParameter("org", costOrg.getId());
     }
+    costQry.setMaxResult(2);
 
     List<Costing> costList = costQry.list();
+    int size = costList.size();
     // If no average cost is found return null.
-    if (costList.size() == 0) {
+    if (size == 0) {
       return null;
     }
-    if (costList.size() > 1) {
+    if (size > 1) {
       log4j.warn("More than one cost found for same date: " + 
OBDateUtils.formatDate(date)
           + " for product: " + product.getName() + " (" + product.getId() + 
")");
     }
diff -r 815ba738d4dc -r ca36991325a4 
src/org/openbravo/costing/AverageCostAdjustment.java
--- a/src/org/openbravo/costing/AverageCostAdjustment.java      Fri Feb 19 
11:31:51 2016 +0100
+++ b/src/org/openbravo/costing/AverageCostAdjustment.java      Mon Feb 15 
19:53:12 2016 +0100
@@ -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) 2014-2015 Openbravo SLU
+ * All portions are Copyright (C) 2014-2016 Openbravo SLU
  * All Rights Reserved.
  * Contributor(s):  ______________________________________.
  *************************************************************************
@@ -172,7 +172,7 @@
         log.debug("Negative stock correction. Amount: {}, new cost {}", 
negCorrAmt.toPlainString(),
             cost.toPlainString());
       }
-      if (basetrx.getMaterialMgmtCostingList().size() == 0) {
+      if (basetrx.getMaterialMgmtCostingList().isEmpty()) {
         Date newDate = new Date();
         Date dateTo = costing.getEndingDate();
         costing.setEndingDate(newDate);
@@ -388,7 +388,7 @@
                   .toPlainString());
             }
           }
-          if (trx.getMaterialMgmtCostingList().size() != 0) {
+          if (!trx.getMaterialMgmtCostingList().isEmpty()) {
             Costing curCosting = trx.getMaterialMgmtCostingList().get(0);
             if (currentStock.signum() != 0) {
               cost = 
currentValueAmt.add(adjustmentBalance).divide(currentStock, costCurPrecission,
@@ -943,10 +943,7 @@
         CostAdjustmentLine.class);
     
critLines.add(Restrictions.eq(CostAdjustmentLine.PROPERTY_INVENTORYTRANSACTION, 
trx));
     critLines.add(Restrictions.eq(CostAdjustmentLine.PROPERTY_ISBACKDATEDTRX, 
true));
-    final List<CostAdjustmentLine> critLinesList = critLines.list();
-    if (critLinesList.size() > 0) {
-      return true;
-    }
-    return false;
+    critLines.setMaxResults(1);
+    return critLines.uniqueResult() != null;
   }
 }
diff -r 815ba738d4dc -r ca36991325a4 
src/org/openbravo/costing/CostAdjustmentUtils.java
--- a/src/org/openbravo/costing/CostAdjustmentUtils.java        Fri Feb 19 
11:31:51 2016 +0100
+++ b/src/org/openbravo/costing/CostAdjustmentUtils.java        Mon Feb 15 
19:53:12 2016 +0100
@@ -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) 2014-2015 Openbravo SLU
+ * All portions are Copyright (C) 2014-2016 Openbravo SLU
  * All Rights Reserved.
  * Contributor(s):  ______________________________________.
  *************************************************************************
@@ -22,10 +22,12 @@
 import java.math.RoundingMode;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.lang.StringUtils;
 import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
 import org.hibernate.criterion.Restrictions;
 import org.openbravo.advpaymentmngt.utility.FIN_Utility;
 import org.openbravo.base.exception.OBException;
@@ -52,8 +54,6 @@
 import org.openbravo.model.materialmgmt.transaction.InventoryCount;
 import org.openbravo.model.materialmgmt.transaction.InventoryCountLine;
 import org.openbravo.model.materialmgmt.transaction.MaterialTransaction;
-import org.openbravo.model.materialmgmt.transaction.ShipmentInOut;
-import org.openbravo.model.materialmgmt.transaction.ShipmentInOutLine;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -202,17 +202,18 @@
 
   private static Long getNewLineNo(CostAdjustment cadj) {
     StringBuffer where = new StringBuffer();
-    where.append(" as cal");
+    where.append(" select " + CostAdjustmentLine.PROPERTY_LINENO);
+    where.append(" from " + CostAdjustmentLine.ENTITY_NAME + " as cal");
     where.append(" where cal." + CostAdjustmentLine.PROPERTY_COSTADJUSTMENT
         + ".id = :costAdjustment");
     where.append(" order by cal." + CostAdjustmentLine.PROPERTY_LINENO + " 
desc");
-    OBQuery<CostAdjustmentLine> calQry = 
OBDal.getInstance().createQuery(CostAdjustmentLine.class,
-        where.toString());
-    calQry.setNamedParameter("costAdjustment", cadj.getId());
-    calQry.setMaxResult(1);
+    Query calQry = 
OBDal.getInstance().getSession().createQuery(where.toString());
+    calQry.setParameter("costAdjustment", cadj.getId());
+    calQry.setMaxResults(1);
 
-    if (calQry.uniqueResult() != null) {
-      return calQry.uniqueResult().getLineNo() + 10L;
+    Long lineNo = (Long) calQry.uniqueResult();
+    if (lineNo != null) {
+      return lineNo + 10L;
     }
     return 10L;
   }
@@ -225,17 +226,41 @@
           trx.getId());
       throw new OBException("@NoCostFoundForTrxOnDate@ @Transaction@: " + 
trx.getIdentifier());
     }
+
+    StringBuffer select = new StringBuffer();
+    select.append(" select sum(tc." + TransactionCost.PROPERTY_COST + ") as 
cost");
+    select.append(" , tc." + TransactionCost.PROPERTY_CURRENCY + ".id as 
currency");
+    select.append(" , tc." + TransactionCost.PROPERTY_COSTDATE + " as date");
+    select.append(" from " + TransactionCost.ENTITY_NAME + " as tc");
+    select.append(" where tc." + TransactionCost.PROPERTY_INVENTORYTRANSACTION 
+ ".id = :trxId");
+    if (justUnitCost) {
+      select.append(" and tc." + TransactionCost.PROPERTY_UNITCOST + " = 
true");
+    }
+    select.append(" group by tc." + TransactionCost.PROPERTY_CURRENCY);
+    select.append(" , tc." + TransactionCost.PROPERTY_COSTDATE);
+
+    Query qry = 
OBDal.getInstance().getSession().createQuery(select.toString());
+    qry.setParameter("trxId", trx.getId());
+    ScrollableResults scroll = qry.scroll(ScrollMode.FORWARD_ONLY);
+
     BigDecimal cost = BigDecimal.ZERO;
-    for (TransactionCost trxCost : trx.getTransactionCostList()) {
-      if (!justUnitCost || trxCost.isUnitCost()) {
-        if (trxCost.getCurrency().getId().equals(currency.getId())) {
-          cost = cost.add(trxCost.getCost());
+    try {
+      while (scroll.next()) {
+        Object[] resultSet = scroll.get();
+        BigDecimal costAmt = (BigDecimal) resultSet[0];
+        String origCurId = (String) resultSet[1];
+
+        if (StringUtils.equals(origCurId, currency.getId())) {
+          cost = cost.add(costAmt);
         } else {
-          cost = cost.add(FinancialUtils.getConvertedAmount(trxCost.getCost(),
-              trxCost.getCurrency(), currency, trxCost.getCostDate(), 
trxCost.getOrganization(),
-              FinancialUtils.PRECISION_COSTING));
+          Currency origCur = OBDal.getInstance().get(Currency.class, 
origCurId);
+          Date convDate = (Date) resultSet[2];
+          cost = cost.add(FinancialUtils.getConvertedAmount(costAmt, origCur, 
currency, convDate,
+              trx.getOrganization(), FinancialUtils.PRECISION_COSTING));
         }
       }
+    } finally {
+      scroll.close();
     }
     return cost;
   }
@@ -504,15 +529,12 @@
         + " < 0 then -tc." + TransactionCost.PROPERTY_COST);
     select.append("     else tc." + TransactionCost.PROPERTY_COST + " end ) as 
cost");
     select.append(" , tc." + TransactionCost.PROPERTY_CURRENCY + ".id as 
currency");
-    select.append(" , coalesce(sr." + ShipmentInOut.PROPERTY_ACCOUNTINGDATE + 
", trx."
-        + MaterialTransaction.PROPERTY_MOVEMENTDATE + ") as mdate");
+    select.append(" , tc." + TransactionCost.PROPERTY_ACCOUNTINGDATE + " as 
mdate");
     select.append(" , sum(trx." + 
MaterialTransaction.PROPERTY_MOVEMENTQUANTITY + ") as stock");
 
     select.append(" from " + TransactionCost.ENTITY_NAME + " as tc");
     select.append("  join tc." + TransactionCost.PROPERTY_INVENTORYTRANSACTION 
+ " as trx");
     select.append("  join trx." + MaterialTransaction.PROPERTY_STORAGEBIN + " 
as locator");
-    select.append("  left join trx." + 
MaterialTransaction.PROPERTY_GOODSSHIPMENTLINE + " as line");
-    select.append("  left join line." + 
ShipmentInOutLine.PROPERTY_SHIPMENTRECEIPT + " as sr");
 
     Date backdatedTrxFrom = null;
     if (backdatedTransactionsFixed) {
@@ -549,8 +571,7 @@
     select.append("   and trx." + MaterialTransaction.PROPERTY_ORGANIZATION + 
".id in (:orgs)");
 
     select.append(" group by tc." + TransactionCost.PROPERTY_CURRENCY);
-    select.append("   , coalesce(sr." + ShipmentInOut.PROPERTY_ACCOUNTINGDATE 
+ ", trx."
-        + MaterialTransaction.PROPERTY_MOVEMENTDATE + ")");
+    select.append("   , tc." + TransactionCost.PROPERTY_ACCOUNTINGDATE);
 
     Query trxQry = 
OBDal.getInstance().getSession().createQuery(select.toString());
     trxQry.setParameter("product", product);
@@ -565,22 +586,28 @@
       trxQry.setParameter("asi", asi);
     }
     trxQry.setParameterList("orgs", orgs);
-    @SuppressWarnings("unchecked")
-    List<Object[]> o = trxQry.list();
-    BigDecimal costsum = BigDecimal.ZERO;
-    for (Object[] resultSet : o) {
-      BigDecimal origAmt = (BigDecimal) resultSet[0];
-      Currency origCur = OBDal.getInstance().get(Currency.class, resultSet[1]);
-      Date convDate = (Date) resultSet[2];
 
-      if (origCur != currency) {
-        costsum = costsum.add(FinancialUtils.getConvertedAmount(origAmt, 
origCur, currency,
-            convDate, org, FinancialUtils.PRECISION_COSTING));
-      } else {
-        costsum = costsum.add(origAmt);
+    ScrollableResults scroll = trxQry.scroll(ScrollMode.FORWARD_ONLY);
+    BigDecimal sum = BigDecimal.ZERO;
+    try {
+      while (scroll.next()) {
+        Object[] resultSet = scroll.get();
+        BigDecimal origAmt = (BigDecimal) resultSet[0];
+        String origCurId = (String) resultSet[1];
+
+        if (StringUtils.equals(origCurId, currency.getId())) {
+          sum = sum.add(origAmt);
+        } else {
+          Currency origCur = OBDal.getInstance().get(Currency.class, 
origCurId);
+          Date convDate = (Date) resultSet[2];
+          sum = sum.add(FinancialUtils.getConvertedAmount(origAmt, origCur, 
currency, convDate,
+              org, FinancialUtils.PRECISION_COSTING));
+        }
       }
+    } finally {
+      scroll.close();
     }
-    return costsum;
+    return sum;
   }
 
   /**
@@ -698,24 +725,29 @@
       trxQry.setParameter("mvtdate", trx.getMovementDate());
       trxQry.setParameter("fixbdt", 
CostingUtils.getCostingRuleFixBackdatedFrom(costingRule));
     }
+    trxQry.setParameterList("orgs", orgs);
 
-    trxQry.setParameterList("orgs", orgs);
-    @SuppressWarnings("unchecked")
-    List<Object[]> o = trxQry.list();
-    BigDecimal costsum = BigDecimal.ZERO;
-    for (Object[] resultSet : o) {
-      BigDecimal origAmt = (BigDecimal) resultSet[0];
-      Currency origCur = OBDal.getInstance().get(Currency.class, resultSet[1]);
-      Date convDate = (Date) resultSet[2];
+    ScrollableResults scroll = trxQry.scroll(ScrollMode.FORWARD_ONLY);
+    BigDecimal sum = BigDecimal.ZERO;
+    try {
+      while (scroll.next()) {
+        Object[] resultSet = scroll.get();
+        BigDecimal origAmt = (BigDecimal) resultSet[0];
+        String origCurId = (String) resultSet[1];
 
-      if (origCur != currency) {
-        costsum = costsum.add(FinancialUtils.getConvertedAmount(origAmt, 
origCur, currency,
-            convDate, costorg, FinancialUtils.PRECISION_COSTING));
-      } else {
-        costsum = costsum.add(origAmt);
+        if (StringUtils.equals(origCurId, currency.getId())) {
+          sum = sum.add(origAmt);
+        } else {

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to