Author: jacopoc
Date: Wed Apr 23 00:02:34 2008
New Revision: 650764
URL: http://svn.apache.org/viewvc?rev=650764&view=rev
Log:
Improved performance (plus other small cleanups) for the reserve algorithm: no
functional changes.
Modified:
ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryReserveServices.xml
Modified:
ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryReserveServices.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryReserveServices.xml?rev=650764&r1=650763&r2=650764&view=diff
==============================================================================
---
ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryReserveServices.xml
(original)
+++
ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryReserveServices.xml
Wed Apr 23 00:02:34 2008
@@ -34,9 +34,6 @@
-->
<log level="verbose" message="Parameters : ${parameters}"/>
- <set from-field="parameters.productId"
field="lookupFieldMap.productId"/>
- <set from-field="parameters.facilityId"
field="lookupFieldMap.facilityId"/>
- <set from-field="parameters.containerId"
field="lookupFieldMap.containerId"/>
<now-timestamp-to-env env-name="nowTimestamp"/>
<!-- check the product; make sure its a physical item -->
@@ -53,22 +50,22 @@
LIFO=last in first out, so it means order by DESCending
receive or expire date
-->
<if-compare value="INVRO_GUNIT_COST" operator="equals"
field-name="reserveOrderEnumId" map-name="parameters">
- <set value="unitCost DESC" field="orderByString"/>
+ <set value="-unitCost" field="orderByString"/>
<else>
<if-compare value="INVRO_LUNIT_COST" operator="equals"
field-name="reserveOrderEnumId" map-name="parameters">
- <set value="unitCost ASC" field="orderByString"/>
+ <set value="+unitCost" field="orderByString"/>
<else>
<if-compare value="INVRO_FIFO_EXP" operator="equals"
field-name="reserveOrderEnumId" map-name="parameters">
- <set value="expireDate ASC" field="orderByString"/>
+ <set value="+expireDate" field="orderByString"/>
<else>
<if-compare value="INVRO_LIFO_EXP"
operator="equals" field-name="reserveOrderEnumId" map-name="parameters">
- <set value="expireDate DESC"
field="orderByString"/>
+ <set value="-expireDate"
field="orderByString"/>
<else>
<if-compare value="INVRO_LIFO_REC"
operator="equals" field-name="reserveOrderEnumId" map-name="parameters">
- <set value="datetimeReceived DESC"
field="orderByString"/>
+ <set value="-datetimeReceived"
field="orderByString"/>
<else>
<!-- the default reserveOrderEnumId is
INVRO_FIFO_REC, ie FIFO based on date received -->
- <set value="datetimeReceived ASC"
field="orderByString"/>
+ <set value="+datetimeReceived"
field="orderByString"/>
<set value="INVRO_FIFO_REC"
field="parameters.reserveOrderEnumId"/>
</else>
</if-compare>
@@ -80,12 +77,20 @@
</if-compare>
</else>
</if-compare>
- <set field="orderByList[]" from-field="orderByString"/>
<set from-field="parameters.quantity"
field="parameters.quantityNotReserved"/>
<!-- first reserve against InventoryItems in FLT_PICKLOC type
locations, then FLT_BULK locations, then InventoryItems with no locations -->
- <find-by-and entity-name="InventoryItemAndLocation"
map-name="lookupFieldMap" list-name="inventoryItemAndLocations"
use-iterator="true" order-by-list-name="orderByList"/>
+ <entity-condition entity-name="InventoryItemAndLocation"
list-name="inventoryItemAndLocations">
+ <condition-list combine="and">
+ <condition-expr field-name="productId"
env-name="parameters.productId"/>
+ <condition-expr field-name="facilityId"
env-name="parameters.facilityId" ignore-if-null="true"/>
+ <condition-expr field-name="containerId"
env-name="parameters.containerId" ignore-if-null="true"/>
+ <condition-expr field-name="quantityOnHandTotal"
operator="greater" value="0.0"/>
+ <condition-expr field-name="locationTypeEnumId"
operator="equals" value="FLT_PICKLOC"/>
+ </condition-list>
+ <order-by field-name="${orderByString}"/>
+ </entity-condition>
<iterate entry-name="inventoryItemAndLocation"
list-name="inventoryItemAndLocations">
<if-compare
field-name="inventoryItemAndLocation.locationTypeEnumId" operator="equals"
value="FLT_PICKLOC">
<!-- this is a little trick to get the InventoryItem
value object without doing a query, possible since all fields on InventoryItem
are also on InventoryItemAndLocation with the same names -->
@@ -96,7 +101,16 @@
<!-- still some left? try the FLT_BULK locations -->
<if-compare field-name="parameters.quantityNotReserved"
operator="greater" value="0" type="Double">
- <find-by-and entity-name="InventoryItemAndLocation"
map-name="lookupFieldMap" list-name="inventoryItemAndLocations"
use-iterator="true" order-by-list-name="orderByList"/>
+ <entity-condition entity-name="InventoryItemAndLocation"
list-name="inventoryItemAndLocations">
+ <condition-list combine="and">
+ <condition-expr field-name="productId"
env-name="parameters.productId"/>
+ <condition-expr field-name="facilityId"
env-name="parameters.facilityId" ignore-if-null="true"/>
+ <condition-expr field-name="containerId"
env-name="parameters.containerId" ignore-if-null="true"/>
+ <condition-expr field-name="quantityOnHandTotal"
operator="greater" value="0.0"/>
+ <condition-expr field-name="locationTypeEnumId"
operator="equals" value="FLT_BULK"/>
+ </condition-list>
+ <order-by field-name="${orderByString}"/>
+ </entity-condition>
<iterate entry-name="inventoryItemAndLocation"
list-name="inventoryItemAndLocations">
<if-compare
field-name="inventoryItemAndLocation.locationTypeEnumId" operator="equals"
value="FLT_BULK">
<!-- this is a little trick to get the
InventoryItem value object without doing a query, possible since all fields on
InventoryItem are also on InventoryItemAndLocation with the same names -->
@@ -108,7 +122,16 @@
<!-- last of all try reserving in InventoryItems that have no
locationSeqId, ie are not in any particular location -->
<if-compare field-name="parameters.quantityNotReserved"
operator="greater" value="0" type="Double">
- <find-by-and entity-name="InventoryItem"
map-name="lookupFieldMap" list-name="inventoryItems" use-iterator="true"
order-by-list-name="orderByList"/>
+ <entity-condition entity-name="InventoryItem"
list-name="inventoryItems">
+ <condition-list combine="and">
+ <condition-expr field-name="productId"
env-name="parameters.productId"/>
+ <condition-expr field-name="facilityId"
env-name="parameters.facilityId" ignore-if-null="true"/>
+ <condition-expr field-name="containerId"
env-name="parameters.containerId" ignore-if-null="true"/>
+ <condition-expr field-name="quantityOnHandTotal"
operator="greater" value="0.0"/>
+ <condition-expr field-name="locationSeqId"
operator="equals" env-name="nullField"/>
+ </condition-list>
+ <order-by field-name="${orderByString}"/>
+ </entity-condition>
<iterate entry-name="inventoryItem"
list-name="inventoryItems">
<if-empty field-name="inventoryItem.locationSeqId">
<call-simple-method
method-name="reserveForInventoryItemInline"/>