# HG changeset patch
# User Víctor Martínez Romanos <victor.martinez@openbravo.com>
# Date 1454256332 -3600
#      Sun Jan 31 17:05:32 2016 +0100
# Node ID 5539754e1f10bf4cf388d14374486663e4036f73
# Parent  b6f6e3509b632b71b1bd4398a02ae12f03cc6d0b
Fixed bug 31977: Performance problem in ReturnMaterialShipmentPickEdit

The "HQL where" and "HQL order by" clauses in RM Shipment Pick and Edit | Pick Edit Lines tab created a non-optimal SQL query with important performance issues in high volume environments, specially in the ones with many order lines and order headers. In particular, the query included unnecessary:
* Left join to m_product
* Cross join to c_orderline
* Cross join to c_order

The solution:
* Add the c_bpartner_id column to the M_RM_SHIPMENT_PICK_EDIT view and filter by this column in the tab's HQL where clause, so we avoid the need to cross join over c_orderline and c_order tables.
* The "HQL order by" orders by lineNo (instead of product), so we avoid the need to left join over m_product and we show a better default order (selected, RM Order No. and Line No.)

With these changes, the SQL cost calculated by the planner has been reduced a 88% in our internal testing (from 5100 to 609)

diff --git a/src-db/database/model/views/M_RM_SHIPMENT_PICK_EDIT.xml b/src-db/database/model/views/M_RM_SHIPMENT_PICK_EDIT.xml
--- a/src-db/database/model/views/M_RM_SHIPMENT_PICK_EDIT.xml
+++ b/src-db/database/model/views/M_RM_SHIPMENT_PICK_EDIT.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0"?>
   <database name="VIEW M_RM_SHIPMENT_PICK_EDIT">
-    <view name="M_RM_SHIPMENT_PICK_EDIT"><![CDATA[SELECT COALESCE(sd.m_storage_detail_id, '') || ol.c_orderline_id AS m_rm_shipment_pick_edit_id, ol.ad_client_id, COALESCE(iol.ad_org_id, ol.ad_org_id) AS ad_org_id, ol.isactive, ol.createdby, ol.created, ol.updatedby, ol.updated, o.documentno AS returnorderno, ol.m_product_id, ol.m_attributesetinstance_id, ol.c_uom_id, (-1) * ol.qtyordered AS returned, (-1) * iol.movementqty AS movementqty, sd.m_locator_id, CASE WHEN sd.m_locator_id IS NULL THEN (-1) * ol.qtyordered ELSE COALESCE(sd.qtyonhand, 0) END AS availableqty, (-1) * (ol.qtyordered - to_number(COALESCE((SELECT to_char(sum(COALESCE(iol3.movementqty, 0))) AS sum FROM m_inoutline iol3 JOIN m_inout io3 ON iol3.m_inout_id = io3.m_inout_id AND io3.processed = 'Y' WHERE iol3.c_orderline_id = ol.c_orderline_id), '0'))) AS pendingqty, iol.m_inout_id, CASE WHEN iol.m_inout_id IS NOT NULL THEN 'Y' ELSE 'N' END AS ob_selected, ol.c_orderline_id, ol.line, iol.m_inoutline_id, p.isstocked FROM c_orderline ol JOIN c_order o ON o.c_order_id = ol.c_order_id AND o.processed = 'Y' AND o.issotrx = 'N' LEFT JOIN m_storage_detail sd ON sd.m_product_id = ol.m_product_id AND COALESCE(sd.m_attributesetinstance_id, '0') = COALESCE(ol.m_attributesetinstance_id, '0') AND sd.qtyonhand > 0 LEFT JOIN m_locator l ON sd.m_locator_id = l.m_locator_id JOIN m_product p ON p.m_product_id = ol.m_product_id JOIN c_doctype dt ON o.c_doctypetarget_id = dt.c_doctype_id AND dt.isreturn = 'Y' LEFT JOIN (SELECT iol2.m_inoutline_id, iol2.m_inout_id, iol2.movementqty, iol2.c_orderline_id, iol2.ad_org_id, iol2.m_locator_id FROM m_inoutline iol2 JOIN m_inout io2 ON iol2.m_inout_id = io2.m_inout_id AND io2.processed = 'N') iol ON iol.c_orderline_id = ol.c_orderline_id AND iol.m_locator_id = sd.m_locator_id WHERE o.docstatus = 'CO']]></view>
+    <view name="M_RM_SHIPMENT_PICK_EDIT"><![CDATA[SELECT COALESCE(sd.m_storage_detail_id, '') || ol.c_orderline_id AS m_rm_shipment_pick_edit_id, ol.ad_client_id, COALESCE(iol.ad_org_id, ol.ad_org_id) AS ad_org_id, ol.isactive, ol.createdby, ol.created, ol.updatedby, ol.updated, o.documentno AS returnorderno, ol.m_product_id, ol.m_attributesetinstance_id, ol.c_uom_id, (-1) * ol.qtyordered AS returned, (-1) * iol.movementqty AS movementqty, sd.m_locator_id, CASE WHEN sd.m_locator_id IS NULL THEN (-1) * ol.qtyordered ELSE COALESCE(sd.qtyonhand, 0) END AS availableqty, (-1) * (ol.qtyordered - to_number(COALESCE((SELECT to_char(sum(COALESCE(iol3.movementqty, 0))) AS sum FROM m_inoutline iol3 JOIN m_inout io3 ON iol3.m_inout_id = io3.m_inout_id AND io3.processed = 'Y' WHERE iol3.c_orderline_id = ol.c_orderline_id), '0'))) AS pendingqty, iol.m_inout_id, CASE WHEN iol.m_inout_id IS NOT NULL THEN 'Y' ELSE 'N' END AS ob_selected, ol.c_orderline_id, ol.line, iol.m_inoutline_id, p.isstocked, o.c_bpartner_id FROM c_orderline ol JOIN c_order o ON o.c_order_id = ol.c_order_id AND o.processed = 'Y' AND o.issotrx = 'N' LEFT JOIN m_storage_detail sd ON sd.m_product_id = ol.m_product_id AND COALESCE(sd.m_attributesetinstance_id, '0') = COALESCE(ol.m_attributesetinstance_id, '0') AND sd.qtyonhand > 0 LEFT JOIN m_locator l ON sd.m_locator_id = l.m_locator_id JOIN m_product p ON p.m_product_id = ol.m_product_id JOIN c_doctype dt ON o.c_doctypetarget_id = dt.c_doctype_id AND dt.isreturn = 'Y' LEFT JOIN (SELECT iol2.m_inoutline_id, iol2.m_inout_id, iol2.movementqty, iol2.c_orderline_id, iol2.ad_org_id, iol2.m_locator_id FROM m_inoutline iol2 JOIN m_inout io2 ON iol2.m_inout_id = io2.m_inout_id AND io2.processed = 'N') iol ON iol.c_orderline_id = ol.c_orderline_id AND iol.m_locator_id = sd.m_locator_id WHERE o.docstatus = 'CO']]></view>
   </database>
diff --git a/src-db/database/sourcedata/AD_COLUMN.xml b/src-db/database/sourcedata/AD_COLUMN.xml
--- a/src-db/database/sourcedata/AD_COLUMN.xml
+++ b/src-db/database/sourcedata/AD_COLUMN.xml
@@ -251363,6 +251363,44 @@
 <!--3585B480A13011DD9CA97FE6868E2BF3-->  <ALLOWFILTERING><![CDATA[Y]]></ALLOWFILTERING>
 <!--3585B480A13011DD9CA97FE6868E2BF3--></AD_COLUMN>
 
+<!--35913A1C7B8740AA98B72349580C0268--><AD_COLUMN>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_COLUMN_ID><![CDATA[35913A1C7B8740AA98B72349580C0268]]></AD_COLUMN_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--35913A1C7B8740AA98B72349580C0268-->  <NAME><![CDATA[Business Partner]]></NAME>
+<!--35913A1C7B8740AA98B72349580C0268-->  <DESCRIPTION><![CDATA[Anyone who takes part in daily business operations by acting as a customer, employee, etc.]]></DESCRIPTION>
+<!--35913A1C7B8740AA98B72349580C0268-->  <HELP><![CDATA[A Business Partner is anyone with whom you transact.  This can include a customer, vendor, employee or any combination of these.]]></HELP>
+<!--35913A1C7B8740AA98B72349580C0268-->  <COLUMNNAME><![CDATA[C_Bpartner_ID]]></COLUMNNAME>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_TABLE_ID><![CDATA[347B0AA5C3CD4D18910D2FE4990B790E]]></AD_TABLE_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_REFERENCE_ID><![CDATA[30]]></AD_REFERENCE_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_REFERENCE_VALUE_ID><![CDATA[800057]]></AD_REFERENCE_VALUE_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <FIELDLENGTH><![CDATA[32]]></FIELDLENGTH>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISKEY><![CDATA[N]]></ISKEY>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISPARENT><![CDATA[N]]></ISPARENT>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISMANDATORY><![CDATA[N]]></ISMANDATORY>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISUPDATEABLE><![CDATA[Y]]></ISUPDATEABLE>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISIDENTIFIER><![CDATA[N]]></ISIDENTIFIER>
+<!--35913A1C7B8740AA98B72349580C0268-->  <SEQNO><![CDATA[240]]></SEQNO>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISTRANSLATED><![CDATA[N]]></ISTRANSLATED>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISSELECTIONCOLUMN><![CDATA[N]]></ISSELECTIONCOLUMN>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_ELEMENT_ID><![CDATA[187]]></AD_ELEMENT_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISSESSIONATTR><![CDATA[N]]></ISSESSIONATTR>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISSECONDARYKEY><![CDATA[N]]></ISSECONDARYKEY>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
+<!--35913A1C7B8740AA98B72349580C0268-->  <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
+<!--35913A1C7B8740AA98B72349580C0268-->  <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--35913A1C7B8740AA98B72349580C0268-->  <POSITION><![CDATA[24]]></POSITION>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISAUTOSAVE><![CDATA[Y]]></ISAUTOSAVE>
+<!--35913A1C7B8740AA98B72349580C0268-->  <VALIDATEONNEW><![CDATA[Y]]></VALIDATEONNEW>
+<!--35913A1C7B8740AA98B72349580C0268-->  <IMAGESIZEVALUESACTION><![CDATA[N]]></IMAGESIZEVALUESACTION>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ISUSEDSEQUENCE><![CDATA[N]]></ISUSEDSEQUENCE>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ALLOWSORTING><![CDATA[Y]]></ALLOWSORTING>
+<!--35913A1C7B8740AA98B72349580C0268-->  <ALLOWFILTERING><![CDATA[Y]]></ALLOWFILTERING>
+<!--35913A1C7B8740AA98B72349580C0268--></AD_COLUMN>
+
 <!--35AFD634B5AF4661937238C63AB1E683--><AD_COLUMN>
 <!--35AFD634B5AF4661937238C63AB1E683-->  <AD_COLUMN_ID><![CDATA[35AFD634B5AF4661937238C63AB1E683]]></AD_COLUMN_ID>
 <!--35AFD634B5AF4661937238C63AB1E683-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -341074,6 +341112,7 @@
 <!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
 <!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
 <!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <POSITION><![CDATA[23]]></POSITION>
 <!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
 <!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <ISAUTOSAVE><![CDATA[Y]]></ISAUTOSAVE>
 <!--C0D9A7D1D5B043A4B8AE9F6AC683FD50-->  <VALIDATEONNEW><![CDATA[Y]]></VALIDATEONNEW>
diff --git a/src-db/database/sourcedata/AD_TAB.xml b/src-db/database/sourcedata/AD_TAB.xml
--- a/src-db/database/sourcedata/AD_TAB.xml
+++ b/src-db/database/sourcedata/AD_TAB.xml
@@ -17355,9 +17355,9 @@
 <!--9195CC43B5A4419195030A4DB17D8737-->  <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
 <!--9195CC43B5A4419195030A4DB17D8737-->  <UIPATTERN><![CDATA[STD]]></UIPATTERN>
 <!--9195CC43B5A4419195030A4DB17D8737-->  <HQLWHERECLAUSE><![CDATA[COALESCE(e.goodsShipment.id, @MaterialMgmtShipmentInOut.id@) = @MaterialMgmtShipmentInOut.id@
-AND @MaterialMgmtShipmentInOut.businessPartner@ = e.orderLine.salesOrder.businessPartner.id
+AND @MaterialMgmtShipmentInOut.businessPartner@ = e.businessPartner.id
 AND e.pending <> 0 AND (e.storageBin is null OR ad_org_isinnaturaltree(@MaterialMgmtShipmentInOut.organization@, (select organization.id from Locator a where a.id = e.storageBin.id), @MaterialMgmtShipmentInOut.client@) = 'Y')]]></HQLWHERECLAUSE>
-<!--9195CC43B5A4419195030A4DB17D8737-->  <HQLORDERBYCLAUSE><![CDATA[obSelected DESC, rMOrderNo, product]]></HQLORDERBYCLAUSE>
+<!--9195CC43B5A4419195030A4DB17D8737-->  <HQLORDERBYCLAUSE><![CDATA[obSelected DESC, rMOrderNo, lineNo]]></HQLORDERBYCLAUSE>
 <!--9195CC43B5A4419195030A4DB17D8737-->  <SHOWPARENTBUTTONS><![CDATA[Y]]></SHOWPARENTBUTTONS>
 <!--9195CC43B5A4419195030A4DB17D8737-->  <DISABLE_PARENT_KEY_PROPERTY><![CDATA[N]]></DISABLE_PARENT_KEY_PROPERTY>
 <!--9195CC43B5A4419195030A4DB17D8737-->  <ISREADONLYTREE><![CDATA[N]]></ISREADONLYTREE>
