From a70288197825cb746e8d6a7bea60bc55a2ff9221 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 11 Apr 2024 05:53:44 +0200 Subject: [PATCH] IDEMPIERE-6102 Performance: avoid SQL on AD_TreeNode when the table doesn't have a custom tree (#2309) --- .../src/org/compiere/model/MTable.java | 16 +++++++++++++++- .../src/org/compiere/model/PO.java | 14 +++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MTable.java b/org.adempiere.base/src/org/compiere/model/MTable.java index 15b82b74eb..291141e8d9 100644 --- a/org.adempiere.base/src/org/compiere/model/MTable.java +++ b/org.adempiere.base/src/org/compiere/model/MTable.java @@ -67,7 +67,7 @@ public class MTable extends X_AD_Table implements ImmutablePOSupport /** * */ - private static final long serialVersionUID = -167824144142429242L; + private static final long serialVersionUID = 6774131577483620665L; public final static int MAX_OFFICIAL_ID = 999999; @@ -1089,4 +1089,18 @@ public static String getUUIDIndexName(String tableName) { return indexName.toString(); } + private Boolean hasCustomTree = null; + + /** + * If the table has a custom tree defined + * @return + */ + public boolean hasCustomTree() { + if (hasCustomTree == null) { + int exists = DB.getSQLValueEx(get_TrxName(), "SELECT 1 FROM AD_Tree WHERE TreeType=? AND AD_Table_ID=? AND IsActive='Y'", MTree_Base.TREETYPE_CustomTable, getAD_Table_ID()); + hasCustomTree = Boolean.valueOf(exists == 1); + } + return hasCustomTree.booleanValue(); + } + } // MTable diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index d61301bf98..79c884fbc7 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -2649,10 +2649,10 @@ private boolean saveFinish (boolean newRecord, boolean success) // table with potential tree if (get_ColumnIndex("IsSummary") >= 0) { - if (newRecord) + if (newRecord && getTable().hasCustomTree()) insert_Tree(MTree_Base.TREETYPE_CustomTable); int idxValue = get_ColumnIndex("Value"); - if (newRecord || (idxValue >= 0 && is_ValueChanged(idxValue))) + if (getTable().hasCustomTree() && (newRecord || (idxValue >= 0 && is_ValueChanged(idxValue)))) update_Tree(MTree_Base.TREETYPE_CustomTable); } } @@ -2756,6 +2756,14 @@ else if (get_ID() > 0) return success; } // saveFinish + /** + * Get the MTable object associated to this PO + * @return MTable + */ + private MTable getTable() { + return MTable.get(getCtx(), get_TableName()); + } + /** * Update or insert new record.
* To reload call load(). @@ -4102,7 +4110,7 @@ else if (savepoint != null) { // deleteTranslations(localTrxName); - if (get_ColumnIndex("IsSummary") >= 0) { + if (get_ColumnIndex("IsSummary") >= 0 && getTable().hasCustomTree()) { delete_Tree(MTree_Base.TREETYPE_CustomTable); }