Author: nmalin
Date: Thu Sep 26 16:23:50 2019 New Revision: 1867590 URL: http://svn.apache.org/viewvc?rev=1867590&view=rev Log: Improved: OrderReadHelper.getOrderItemAttributes as non static function (OFBIZ-11208) Currenlty if we use the java helper class OrderReadHelper to resolve the orderItemAttributes, it didn't use the a local cache and call each time the delegator throw a static function. I added a non static function to optimise database calling when you have multiple get to do. public String getOrderItemAttribute(String orderItemSeqId, String attributeName) { GenericValue orderItemAttribute = null; if (orderHeader != null) { if (orderItemAttributes == null) { try{ orderItemAttributes = EntityQuery.use(orderHeader.getDelegator()) .from("OrderItemAttribute") .where("orderId", getOrderId()) .queryList(); } catch (GenericEntityException e) { Debug.logError(e, module); } } orderItemAttribute = EntityUtil.getFirst( EntityUtil.filterByAnd(orderItemAttributes, UtilMisc.toMap("orderItemSeqId", orderItemSeqId, "attrName", attributeName))); } return orderItemAttribute != null ? orderItemAttribute.getString("attrValue"): null; } At the first call, we populate the OrderReadHelper with all orderItemAttributes liked to an order, and after just filter with the orderItemSeqId and the attribute name wanted Example: OrderReadHelper orh = new OrderReadHelper(orderHeader) ... for (GenericValue orderItem : orh.getOrderItems()) { listAttr << [startValue : orh.getOrderItemAttribute(orderItem.orderItemSeqId, "MyStartValue"), endValue : orh.getOrderItemAttribute(orderItem.orderItemSeqId, "MyEndValue")] } We request only for the first passage, after for all other line we use the local OrderReadHelper cache. Added also the same logical for OrderReadHelper.getOrderAttributes Modified: ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderReadHelper.java Modified: ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderReadHelper.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderReadHelper.java?rev=1867590&r1=1867589&r2=1867590&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderReadHelper.java (original) +++ ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderReadHelper.java Thu Sep 26 16:23:50 2019 @@ -84,6 +84,8 @@ public class OrderReadHelper { protected List<GenericValue> orderItemShipGrpInvResList = null; protected List<GenericValue> orderItemIssuances = null; protected List<GenericValue> orderReturnItems = null; + protected Map<String, GenericValue> orderAttributeMap = null; + protected List<GenericValue> orderItemAttributes = null; protected BigDecimal totalPrice = null; protected OrderReadHelper() {} @@ -2844,6 +2846,35 @@ public class OrderReadHelper { return EntityUtil.orderBy(EntityUtil.filterByAnd(newOrderStatuses, contraints2), UtilMisc.toList("-statusDatetime")); } + /** + * When you call this function after a OrderReadHelper instantiation + * all OrderItemAttributes related to the orderHeader are load on local cache + * to optimize database call, after we just filter the cache with attributeName and + * orderItemSeqId wanted. + * @param orderItemSeqId + * @param attributeName + * @return + */ + public String getOrderItemAttribute(String orderItemSeqId, String attributeName) { + GenericValue orderItemAttribute = null; + if (orderHeader != null) { + if (orderItemAttributes == null) { + try { + orderItemAttributes = EntityQuery.use(orderHeader.getDelegator()) + .from("OrderItemAttribute") + .where("orderId", getOrderId()) + .queryList(); + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + } + orderItemAttribute = EntityUtil.getFirst( + EntityUtil.filterByAnd(orderItemAttributes, + UtilMisc.toMap("orderItemSeqId", orderItemSeqId, "attrName", attributeName))); + } + return orderItemAttribute != null ? orderItemAttribute.getString("attrValue"): null; + } + public static String getOrderItemAttribute(GenericValue orderItem, String attributeName) { String attributeValue = null; if (orderItem != null) { @@ -2859,19 +2890,36 @@ public class OrderReadHelper { return attributeValue; } + /** + * When you call this function after a OrderReadHelper instantiation + * all OrderAttributes related to the orderHeader are load on local cache + * to optimize database call, after we just filter the cache with attributeName wanted. + * @param attributeName + * @return + */ public String getOrderAttribute(String attributeName) { - String attributeValue = null; + GenericValue orderAttribute = null; if (orderHeader != null) { - try { - GenericValue orderAttribute = EntityUtil.getFirst(orderHeader.getRelated("OrderAttribute", UtilMisc.toMap("attrName", attributeName), null, false)); - if (orderAttribute != null) { - attributeValue = orderAttribute.getString("attrValue"); + if (orderAttributeMap == null) { + orderAttributeMap = new HashMap<>(); + } + if (!orderAttributeMap.containsKey(attributeName)) { + try { + orderAttribute = EntityQuery.use(orderHeader.getDelegator()) + .from("OrderAttribute") + .where("orderId", getOrderId(), "attrName", attributeName) + .queryFirst(); + if (orderAttribute != null) { + orderAttributeMap.put(attributeName, orderAttribute); + } + } catch (GenericEntityException e) { + Debug.logError(e, module); } - } catch (GenericEntityException e) { - Debug.logError(e, module); + } else { + orderAttribute = orderAttributeMap.get(attributeName); } } - return attributeValue; + return orderAttribute != null ? orderAttribute.getString("attrValue"): null; } public static Map<String, Object> getOrderTaxByTaxAuthGeoAndParty(List<GenericValue> orderAdjustments) { |
Free forum by Nabble | Edit this page |