Details
-
Improvement
-
Status: Closed
-
Minor
-
Resolution: Done
-
Trunk
-
None
-
None
Description
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 propose to use also as non static function optimise database calling when you have multiple get to do.
Origin: On customer site we have a huge table orderItemAttributes (8M tuples) with several call. Use a local cache throw OrderReadHelper divide by nine the calling.
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.